commit e983346ffc4e744aacefd7cbdc620850be4b6aad Author: Mahdi Dibaiee Date: Tue Dec 25 17:29:22 2018 +0330 initial commit diff --git a/assets/textures/fire-sprite-small.png b/assets/textures/fire-sprite-small.png new file mode 100644 index 0000000..6a1395e Binary files /dev/null and b/assets/textures/fire-sprite-small.png differ diff --git a/assets/textures/fire-sprite.png b/assets/textures/fire-sprite.png new file mode 100644 index 0000000..c5b4d82 Binary files /dev/null and b/assets/textures/fire-sprite.png differ diff --git a/assets/textures/fire.jpg b/assets/textures/fire.jpg new file mode 100644 index 0000000..0610163 Binary files /dev/null and b/assets/textures/fire.jpg differ diff --git a/assets/textures/grass-long.jpg b/assets/textures/grass-long.jpg new file mode 100644 index 0000000..de28f61 Binary files /dev/null and b/assets/textures/grass-long.jpg differ diff --git a/assets/textures/grass.jpg b/assets/textures/grass.jpg new file mode 100644 index 0000000..2304efd Binary files /dev/null and b/assets/textures/grass.jpg differ diff --git a/assets/textures/grassdead.jpg b/assets/textures/grassdead.jpg new file mode 100644 index 0000000..23ba8bd Binary files /dev/null and b/assets/textures/grassdead.jpg differ diff --git a/assets/textures/lava.jpg b/assets/textures/lava.jpg new file mode 100644 index 0000000..f05efd0 Binary files /dev/null and b/assets/textures/lava.jpg differ diff --git a/assets/textures/metal.png b/assets/textures/metal.png new file mode 100644 index 0000000..4d511d0 Binary files /dev/null and b/assets/textures/metal.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..e9f65f8 --- /dev/null +++ b/index.html @@ -0,0 +1,62 @@ + + + + + Fire Ball + + + + + + + + + + + + + +
+

+ Time: 00:00:000 +

+

+ Speed: 000 +

+

+ Score: 000 +

+
+ + + + + + + + + + + + + + + diff --git a/lib/Three.Legacy.js b/lib/Three.Legacy.js new file mode 100644 index 0000000..1784cfa --- /dev/null +++ b/lib/Three.Legacy.js @@ -0,0 +1,1924 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Audio } from './audio/Audio.js'; +import { AudioAnalyser } from './audio/AudioAnalyser.js'; +import { PerspectiveCamera } from './cameras/PerspectiveCamera.js'; +import { FlatShading } from './constants.js'; +import { + Float64BufferAttribute, + Float32BufferAttribute, + Uint32BufferAttribute, + Int32BufferAttribute, + Uint16BufferAttribute, + Int16BufferAttribute, + Uint8ClampedBufferAttribute, + Uint8BufferAttribute, + Int8BufferAttribute, + BufferAttribute +} from './core/BufferAttribute.js'; +import { BufferGeometry } from './core/BufferGeometry.js'; +import { Face3 } from './core/Face3.js'; +import { Geometry } from './core/Geometry.js'; +import { Object3D } from './core/Object3D.js'; +import { Uniform } from './core/Uniform.js'; +import { Curve } from './extras/core/Curve.js'; +import { CurvePath } from './extras/core/CurvePath.js'; +import { Path } from './extras/core/Path.js'; +import { CatmullRomCurve3 } from './extras/curves/CatmullRomCurve3.js'; +import { AxesHelper } from './helpers/AxesHelper.js'; +import { BoxHelper } from './helpers/BoxHelper.js'; +import { GridHelper } from './helpers/GridHelper.js'; +import { SkeletonHelper } from './helpers/SkeletonHelper.js'; +import { BoxGeometry } from './geometries/BoxGeometry.js'; +import { EdgesGeometry } from './geometries/EdgesGeometry.js'; +import { ExtrudeGeometry } from './geometries/ExtrudeGeometry.js'; +import { ExtrudeBufferGeometry } from './geometries/ExtrudeGeometry.js'; +import { ShapeGeometry } from './geometries/ShapeGeometry.js'; +import { WireframeGeometry } from './geometries/WireframeGeometry.js'; +import { Light } from './lights/Light.js'; +import { Loader } from './loaders/Loader.js'; +import { LoaderUtils } from './loaders/LoaderUtils.js'; +import { FileLoader } from './loaders/FileLoader.js'; +import { AudioLoader } from './loaders/AudioLoader.js'; +import { CubeTextureLoader } from './loaders/CubeTextureLoader.js'; +import { DataTextureLoader } from './loaders/DataTextureLoader.js'; +import { JSONLoader } from './loaders/JSONLoader.js'; +import { ObjectLoader } from './loaders/ObjectLoader.js'; +import { TextureLoader } from './loaders/TextureLoader.js'; +import { Material } from './materials/Material.js'; +import { LineBasicMaterial } from './materials/LineBasicMaterial.js'; +import { MeshPhongMaterial } from './materials/MeshPhongMaterial.js'; +import { PointsMaterial } from './materials/PointsMaterial.js'; +import { ShaderMaterial } from './materials/ShaderMaterial.js'; +import { Box2 } from './math/Box2.js'; +import { Box3 } from './math/Box3.js'; +import { Color } from './math/Color.js'; +import { Line3 } from './math/Line3.js'; +import { _Math } from './math/Math.js'; +import { Matrix3 } from './math/Matrix3.js'; +import { Matrix4 } from './math/Matrix4.js'; +import { Plane } from './math/Plane.js'; +import { Quaternion } from './math/Quaternion.js'; +import { Ray } from './math/Ray.js'; +import { Triangle } from './math/Triangle.js'; +import { Vector2 } from './math/Vector2.js'; +import { Vector3 } from './math/Vector3.js'; +import { Vector4 } from './math/Vector4.js'; +import { LineSegments } from './objects/LineSegments.js'; +import { LOD } from './objects/LOD.js'; +import { Points } from './objects/Points.js'; +import { Sprite } from './objects/Sprite.js'; +import { Skeleton } from './objects/Skeleton.js'; +import { WebGLRenderer } from './renderers/WebGLRenderer.js'; +import { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js'; +import { WebGLShadowMap } from './renderers/webgl/WebGLShadowMap.js'; +import { WebVRManager } from './renderers/webvr/WebVRManager.js'; +import { ImageUtils } from './extras/ImageUtils.js'; +import { Shape } from './extras/core/Shape.js'; +import { CubeCamera } from './cameras/CubeCamera.js'; + +export { BoxGeometry as CubeGeometry }; + +export function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + +} + +export var LineStrip = 0; + +export var LinePieces = 1; + +export function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + +} + +export function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; + +} + +export function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + +} + +export function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + +} + +export function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + +} + +export function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +export function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +export function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +export function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + +} + +// + +export function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + +} + +export function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + +} + +export function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + +} + +export function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + +} + +export function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + +} + +export function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + +} + +export function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + +} + +export function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + +} + +export function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + +} + +export function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + +} + +// + +Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + +}; + +// + +Object.assign( CurvePath.prototype, { + + createPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from path points (for Line or Points objects) + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createSpacedPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from equidistant sampling along the path + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + +} ); + +// + +Object.assign( Path.prototype, { + + fromPoints: function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + this.setFromPoints( points ); + + } + +} ); + +// + +export function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + +} + +ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + +// + +export function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + +} + +SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + +// + +export function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + +} + +Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + +Object.assign( Spline.prototype, { + + initFromArray: function ( /* a */ ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( /* optionalTarget */ ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( /* samplingCoef */ ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + +} ); + +// + +export function AxisHelper( size ) { + + console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' ); + return new AxesHelper( size ); + +} + +export function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + +} + +export function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + +} + +GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + +}; + +SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + +}; + +export function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + +} + +// + +Object.assign( Loader.prototype, { + + extractUrlBase: function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + + } + +} ); + +export function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + +} + +export function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + +} + +Object.assign( JSONLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.JSONLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + +} ); + +Object.assign( ObjectLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + +} ); + +// + +Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } +} ); + +Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } +} ); + +Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + +}; + +Object.assign( _Math, { + + random16: function () { + + console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + nearestPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' ); + return _Math.floorPowerOfTwo( value ); + + }, + + nextPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' ); + return _Math.ceilPowerOfTwo( value ); + + } + +} ); + +Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + +} ); + +Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + +} ); + +Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + +}; + +Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + +}; + +Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + +} ); + +Object.assign( Triangle.prototype, { + + area: function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + + }, + barycoordFromPoint: function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + + }, + midpoint: function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + + }, + normal: function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + + }, + plane: function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + + } + +} ); + +Object.assign( Triangle, { + + barycoordFromPoint: function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + + }, + normal: function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + + } + +} ); + +Object.assign( Shape.prototype, { + + extractAllPoints: function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + + }, + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + +} ); + +Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + +} ); + +Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + +} ); + +Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + +} ); + +// + +Object.assign( Geometry.prototype, { + + computeTangents: function () { + + console.error( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + computeLineDistances: function () { + + console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' ); + + } + +} ); + +Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + getWorldRotation: function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + + } + +} ); + +Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + +} ); + +Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + +} ); + +Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + +} ); + +Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + +} ); + +// + +PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + +}; + +// + +Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } +} ); + +// + +Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + copyIndicesArray: function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + + } + +} ); + +Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + +} ); + +Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + +} ); + +// + +Object.assign( ExtrudeBufferGeometry.prototype, { + + getArrays: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' ); + + }, + + addShapeList: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' ); + + }, + + addShape: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' ); + + } + +} ); + +// + +Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + +} ); + +// + +Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + + overdraw: { + get: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + } + }, + + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + } + +} ); + +Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + +} ); + +Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + +} ); + +// + +Object.assign( WebGLRenderer.prototype, { + + clearTarget: function ( renderTarget, color, depth, stencil ) { + + console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ); + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }, + + animate: function ( callback ) { + + console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ); + this.setAnimationLoop( callback ); + + }, + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + getMaxAnisotropy: function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + + }, + + getPrecision: function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + + }, + + resetGLState: function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }, + setFaceCulling: function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + + } + +} ); + +Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + } +} ); + +Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + +} ); + +// + +Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + +} ); + +// + +Object.defineProperties( WebVRManager.prototype, { + + standing: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .standing has been removed.' ); + + } + }, + userHeight: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .userHeight has been removed.' ); + + } + } + +} ); + +// + +Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + +}; + +AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + +}; + +// + +CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + +}; + +// + +export var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + +}; + +ImageUtils.crossOrigin = undefined; + +ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + +}; + +ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + +}; + +ImageUtils.loadCompressedTexture = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + +}; + +ImageUtils.loadCompressedTextureCube = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + +}; + +// + +export function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + +} + +// + +export function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been removed' ); + +} + +// + +export var SceneUtils = { + + createMultiMaterialObject: function ( /* geometry, materials */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + detach: function ( /* child, parent, scene */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + attach: function ( /* child, scene, parent */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + } + +}; + +// + +export function LensFlare() { + + console.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' ); + +} diff --git a/lib/Three.js b/lib/Three.js new file mode 100644 index 0000000..365a901 --- /dev/null +++ b/lib/Three.js @@ -0,0 +1,154 @@ +import './polyfills.js'; + +export { WebGLRenderTargetCube } from './renderers/WebGLRenderTargetCube.js'; +export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js'; +export { WebGLRenderer } from './renderers/WebGLRenderer.js'; +// export { WebGL2Renderer } from './renderers/WebGL2Renderer.js'; +export { ShaderLib } from './renderers/shaders/ShaderLib.js'; +export { UniformsLib } from './renderers/shaders/UniformsLib.js'; +export { UniformsUtils } from './renderers/shaders/UniformsUtils.js'; +export { ShaderChunk } from './renderers/shaders/ShaderChunk.js'; +export { FogExp2 } from './scenes/FogExp2.js'; +export { Fog } from './scenes/Fog.js'; +export { Scene } from './scenes/Scene.js'; +export { Sprite } from './objects/Sprite.js'; +export { LOD } from './objects/LOD.js'; +export { SkinnedMesh } from './objects/SkinnedMesh.js'; +export { Skeleton } from './objects/Skeleton.js'; +export { Bone } from './objects/Bone.js'; +export { Mesh } from './objects/Mesh.js'; +export { LineSegments } from './objects/LineSegments.js'; +export { LineLoop } from './objects/LineLoop.js'; +export { Line } from './objects/Line.js'; +export { Points } from './objects/Points.js'; +export { Group } from './objects/Group.js'; +export { VideoTexture } from './textures/VideoTexture.js'; +export { DataTexture } from './textures/DataTexture.js'; +export { DataTexture3D } from './textures/DataTexture3D.js'; +export { CompressedTexture } from './textures/CompressedTexture.js'; +export { CubeTexture } from './textures/CubeTexture.js'; +export { CanvasTexture } from './textures/CanvasTexture.js'; +export { DepthTexture } from './textures/DepthTexture.js'; +export { Texture } from './textures/Texture.js'; +export * from './geometries/Geometries.js'; +export * from './materials/Materials.js'; +export { AnimationLoader } from './loaders/AnimationLoader.js'; +export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js'; +export { DataTextureLoader } from './loaders/DataTextureLoader.js'; +export { CubeTextureLoader } from './loaders/CubeTextureLoader.js'; +export { TextureLoader } from './loaders/TextureLoader.js'; +export { ObjectLoader } from './loaders/ObjectLoader.js'; +export { MaterialLoader } from './loaders/MaterialLoader.js'; +export { BufferGeometryLoader } from './loaders/BufferGeometryLoader.js'; +export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js'; +export { JSONLoader } from './loaders/JSONLoader.js'; +export { ImageLoader } from './loaders/ImageLoader.js'; +export { ImageBitmapLoader } from './loaders/ImageBitmapLoader.js'; +export { FontLoader } from './loaders/FontLoader.js'; +export { FileLoader } from './loaders/FileLoader.js'; +export { Loader } from './loaders/Loader.js'; +export { LoaderUtils } from './loaders/LoaderUtils.js'; +export { Cache } from './loaders/Cache.js'; +export { AudioLoader } from './loaders/AudioLoader.js'; +export { SpotLightShadow } from './lights/SpotLightShadow.js'; +export { SpotLight } from './lights/SpotLight.js'; +export { PointLight } from './lights/PointLight.js'; +export { RectAreaLight } from './lights/RectAreaLight.js'; +export { HemisphereLight } from './lights/HemisphereLight.js'; +export { DirectionalLightShadow } from './lights/DirectionalLightShadow.js'; +export { DirectionalLight } from './lights/DirectionalLight.js'; +export { AmbientLight } from './lights/AmbientLight.js'; +export { LightShadow } from './lights/LightShadow.js'; +export { Light } from './lights/Light.js'; +export { StereoCamera } from './cameras/StereoCamera.js'; +export { PerspectiveCamera } from './cameras/PerspectiveCamera.js'; +export { OrthographicCamera } from './cameras/OrthographicCamera.js'; +export { CubeCamera } from './cameras/CubeCamera.js'; +export { ArrayCamera } from './cameras/ArrayCamera.js'; +export { Camera } from './cameras/Camera.js'; +export { AudioListener } from './audio/AudioListener.js'; +export { PositionalAudio } from './audio/PositionalAudio.js'; +export { AudioContext } from './audio/AudioContext.js'; +export { AudioAnalyser } from './audio/AudioAnalyser.js'; +export { Audio } from './audio/Audio.js'; +export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js'; +export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js'; +export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js'; +export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js'; +export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js'; +export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js'; +export { PropertyMixer } from './animation/PropertyMixer.js'; +export { PropertyBinding } from './animation/PropertyBinding.js'; +export { KeyframeTrack } from './animation/KeyframeTrack.js'; +export { AnimationUtils } from './animation/AnimationUtils.js'; +export { AnimationObjectGroup } from './animation/AnimationObjectGroup.js'; +export { AnimationMixer } from './animation/AnimationMixer.js'; +export { AnimationClip } from './animation/AnimationClip.js'; +export { Uniform } from './core/Uniform.js'; +export { InstancedBufferGeometry } from './core/InstancedBufferGeometry.js'; +export { BufferGeometry } from './core/BufferGeometry.js'; +export { Geometry } from './core/Geometry.js'; +export { InterleavedBufferAttribute } from './core/InterleavedBufferAttribute.js'; +export { InstancedInterleavedBuffer } from './core/InstancedInterleavedBuffer.js'; +export { InterleavedBuffer } from './core/InterleavedBuffer.js'; +export { InstancedBufferAttribute } from './core/InstancedBufferAttribute.js'; +export * from './core/BufferAttribute.js'; +export { Face3 } from './core/Face3.js'; +export { Object3D } from './core/Object3D.js'; +export { Raycaster } from './core/Raycaster.js'; +export { Layers } from './core/Layers.js'; +export { EventDispatcher } from './core/EventDispatcher.js'; +export { Clock } from './core/Clock.js'; +export { QuaternionLinearInterpolant } from './math/interpolants/QuaternionLinearInterpolant.js'; +export { LinearInterpolant } from './math/interpolants/LinearInterpolant.js'; +export { DiscreteInterpolant } from './math/interpolants/DiscreteInterpolant.js'; +export { CubicInterpolant } from './math/interpolants/CubicInterpolant.js'; +export { Interpolant } from './math/Interpolant.js'; +export { Triangle } from './math/Triangle.js'; +export { _Math as Math } from './math/Math.js'; +export { Spherical } from './math/Spherical.js'; +export { Cylindrical } from './math/Cylindrical.js'; +export { Plane } from './math/Plane.js'; +export { Frustum } from './math/Frustum.js'; +export { Sphere } from './math/Sphere.js'; +export { Ray } from './math/Ray.js'; +export { Matrix4 } from './math/Matrix4.js'; +export { Matrix3 } from './math/Matrix3.js'; +export { Box3 } from './math/Box3.js'; +export { Box2 } from './math/Box2.js'; +export { Line3 } from './math/Line3.js'; +export { Euler } from './math/Euler.js'; +export { Vector4 } from './math/Vector4.js'; +export { Vector3 } from './math/Vector3.js'; +export { Vector2 } from './math/Vector2.js'; +export { Quaternion } from './math/Quaternion.js'; +export { Color } from './math/Color.js'; +export { ImmediateRenderObject } from './extras/objects/ImmediateRenderObject.js'; +export { VertexNormalsHelper } from './helpers/VertexNormalsHelper.js'; +export { SpotLightHelper } from './helpers/SpotLightHelper.js'; +export { SkeletonHelper } from './helpers/SkeletonHelper.js'; +export { PointLightHelper } from './helpers/PointLightHelper.js'; +export { RectAreaLightHelper } from './helpers/RectAreaLightHelper.js'; +export { HemisphereLightHelper } from './helpers/HemisphereLightHelper.js'; +export { GridHelper } from './helpers/GridHelper.js'; +export { PolarGridHelper } from './helpers/PolarGridHelper.js'; +export { FaceNormalsHelper } from './helpers/FaceNormalsHelper.js'; +export { DirectionalLightHelper } from './helpers/DirectionalLightHelper.js'; +export { CameraHelper } from './helpers/CameraHelper.js'; +export { BoxHelper } from './helpers/BoxHelper.js'; +export { Box3Helper } from './helpers/Box3Helper.js'; +export { PlaneHelper } from './helpers/PlaneHelper.js'; +export { ArrowHelper } from './helpers/ArrowHelper.js'; +export { AxesHelper } from './helpers/AxesHelper.js'; +export * from './extras/curves/Curves.js'; +export { Shape } from './extras/core/Shape.js'; +export { Path } from './extras/core/Path.js'; +export { ShapePath } from './extras/core/ShapePath.js'; +export { Font } from './extras/core/Font.js'; +export { CurvePath } from './extras/core/CurvePath.js'; +export { Curve } from './extras/core/Curve.js'; +export { ImageUtils } from './extras/ImageUtils.js'; +export { ShapeUtils } from './extras/ShapeUtils.js'; +export { WebGLUtils } from './renderers/webgl/WebGLUtils.js'; +export * from './constants.js'; +export * from './Three.Legacy.js'; diff --git a/lib/Tween.js b/lib/Tween.js new file mode 100644 index 0000000..57a1be3 --- /dev/null +++ b/lib/Tween.js @@ -0,0 +1,917 @@ +/** + * Tween.js - Licensed under the MIT license + * https://github.com/tweenjs/tween.js + * ---------------------------------------------- + * + * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. + * Thank you all, you're awesome! + */ + + +var _Group = function () { + this._tweens = {}; + this._tweensAddedDuringUpdate = {}; +}; + +_Group.prototype = { + getAll: function () { + + return Object.keys(this._tweens).map(function (tweenId) { + return this._tweens[tweenId]; + }.bind(this)); + + }, + + removeAll: function () { + + this._tweens = {}; + + }, + + add: function (tween) { + + this._tweens[tween.getId()] = tween; + this._tweensAddedDuringUpdate[tween.getId()] = tween; + + }, + + remove: function (tween) { + + delete this._tweens[tween.getId()]; + delete this._tweensAddedDuringUpdate[tween.getId()]; + + }, + + update: function (time, preserve) { + + var tweenIds = Object.keys(this._tweens); + + if (tweenIds.length === 0) { + return false; + } + + time = time !== undefined ? time : TWEEN.now(); + + // Tweens are updated in "batches". If you add a new tween during an update, then the + // new tween will be updated in the next batch. + // If you remove a tween during an update, it may or may not be updated. However, + // if the removed tween was added during the current batch, then it will not be updated. + while (tweenIds.length > 0) { + this._tweensAddedDuringUpdate = {}; + + for (var i = 0; i < tweenIds.length; i++) { + + var tween = this._tweens[tweenIds[i]]; + + if (tween && tween.update(time) === false) { + tween._isPlaying = false; + + if (!preserve) { + delete this._tweens[tweenIds[i]]; + } + } + } + + tweenIds = Object.keys(this._tweensAddedDuringUpdate); + } + + return true; + + } +}; + +var TWEEN = new _Group(); + +TWEEN.Group = _Group; +TWEEN._nextId = 0; +TWEEN.nextId = function () { + return TWEEN._nextId++; +}; + + +// Include a performance.now polyfill. +// In node.js, use process.hrtime. +if (typeof (window) === 'undefined' && typeof (process) !== 'undefined') { + TWEEN.now = function () { + var time = process.hrtime(); + + // Convert [seconds, nanoseconds] to milliseconds. + return time[0] * 1000 + time[1] / 1000000; + }; +} +// In a browser, use window.performance.now if it is available. +else if (typeof (window) !== 'undefined' && + window.performance !== undefined && + window.performance.now !== undefined) { + // This must be bound, because directly assigning this function + // leads to an invocation exception in Chrome. + TWEEN.now = window.performance.now.bind(window.performance); +} +// Use Date.now if it is available. +else if (Date.now !== undefined) { + TWEEN.now = Date.now; +} +// Otherwise, use 'new Date().getTime()'. +else { + TWEEN.now = function () { + return new Date().getTime(); + }; +} + + +TWEEN.Tween = function (object, group) { + this._object = object; + this._valuesStart = {}; + this._valuesEnd = {}; + this._valuesStartRepeat = {}; + this._duration = 1000; + this._repeat = 0; + this._repeatDelayTime = undefined; + this._yoyo = false; + this._isPlaying = false; + this._reversed = false; + this._delayTime = 0; + this._startTime = null; + this._easingFunction = TWEEN.Easing.Linear.None; + this._interpolationFunction = TWEEN.Interpolation.Linear; + this._chainedTweens = []; + this._onStartCallback = null; + this._onStartCallbackFired = false; + this._onUpdateCallback = null; + this._onCompleteCallback = null; + this._onStopCallback = null; + this._group = group || TWEEN; + this._id = TWEEN.nextId(); + +}; + +TWEEN.Tween.prototype = { + getId: function getId() { + return this._id; + }, + + isPlaying: function isPlaying() { + return this._isPlaying; + }, + + to: function to(properties, duration) { + + this._valuesEnd = properties; + + if (duration !== undefined) { + this._duration = duration; + } + + return this; + + }, + + start: function start(time) { + + this._group.add(this); + + this._isPlaying = true; + + this._onStartCallbackFired = false; + + this._startTime = time !== undefined ? typeof time === 'string' ? TWEEN.now() + parseFloat(time) : time : TWEEN.now(); + this._startTime += this._delayTime; + + for (var property in this._valuesEnd) { + + // Check if an Array was provided as property value + if (this._valuesEnd[property] instanceof Array) { + + if (this._valuesEnd[property].length === 0) { + continue; + } + + // Create a local copy of the Array with the start value at the front + this._valuesEnd[property] = [this._object[property]].concat(this._valuesEnd[property]); + + } + + // If `to()` specifies a property that doesn't exist in the source object, + // we should not set that property in the object + if (this._object[property] === undefined) { + continue; + } + + // Save the starting value. + this._valuesStart[property] = this._object[property]; + + if ((this._valuesStart[property] instanceof Array) === false) { + this._valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings + } + + this._valuesStartRepeat[property] = this._valuesStart[property] || 0; + + } + + return this; + + }, + + stop: function stop() { + + if (!this._isPlaying) { + return this; + } + + this._group.remove(this); + this._isPlaying = false; + + if (this._onStopCallback !== null) { + this._onStopCallback(this._object); + } + + this.stopChainedTweens(); + return this; + + }, + + end: function end() { + + this.update(this._startTime + this._duration); + return this; + + }, + + stopChainedTweens: function stopChainedTweens() { + + for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { + this._chainedTweens[i].stop(); + } + + }, + + group: function group(group) { + this._group = group; + return this; + }, + + delay: function delay(amount) { + + this._delayTime = amount; + return this; + + }, + + repeat: function repeat(times) { + + this._repeat = times; + return this; + + }, + + repeatDelay: function repeatDelay(amount) { + + this._repeatDelayTime = amount; + return this; + + }, + + yoyo: function yoyo(yy) { + + this._yoyo = yy; + return this; + + }, + + easing: function easing(eas) { + + this._easingFunction = eas; + return this; + + }, + + interpolation: function interpolation(inter) { + + this._interpolationFunction = inter; + return this; + + }, + + chain: function chain() { + + this._chainedTweens = arguments; + return this; + + }, + + onStart: function onStart(callback) { + + this._onStartCallback = callback; + return this; + + }, + + onUpdate: function onUpdate(callback) { + + this._onUpdateCallback = callback; + return this; + + }, + + onComplete: function onComplete(callback) { + + this._onCompleteCallback = callback; + return this; + + }, + + onStop: function onStop(callback) { + + this._onStopCallback = callback; + return this; + + }, + + update: function update(time) { + + var property; + var elapsed; + var value; + + if (time < this._startTime) { + return true; + } + + if (this._onStartCallbackFired === false) { + + if (this._onStartCallback !== null) { + this._onStartCallback(this._object); + } + + this._onStartCallbackFired = true; + } + + elapsed = (time - this._startTime) / this._duration; + elapsed = (this._duration === 0 || elapsed > 1) ? 1 : elapsed; + + value = this._easingFunction(elapsed); + + for (property in this._valuesEnd) { + + // Don't update properties that do not exist in the source object + if (this._valuesStart[property] === undefined) { + continue; + } + + var start = this._valuesStart[property] || 0; + var end = this._valuesEnd[property]; + + if (end instanceof Array) { + + this._object[property] = this._interpolationFunction(end, value); + + } else { + + // Parses relative end values with start as base (e.g.: +10, -3) + if (typeof (end) === 'string') { + + if (end.charAt(0) === '+' || end.charAt(0) === '-') { + end = start + parseFloat(end); + } else { + end = parseFloat(end); + } + } + + // Protect against non numeric properties. + if (typeof (end) === 'number') { + this._object[property] = start + (end - start) * value; + } + + } + + } + + if (this._onUpdateCallback !== null) { + this._onUpdateCallback(this._object); + } + + if (elapsed === 1) { + + if (this._repeat > 0) { + + if (isFinite(this._repeat)) { + this._repeat--; + } + + // Reassign starting values, restart by making startTime = now + for (property in this._valuesStartRepeat) { + + if (typeof (this._valuesEnd[property]) === 'string') { + this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]); + } + + if (this._yoyo) { + var tmp = this._valuesStartRepeat[property]; + + this._valuesStartRepeat[property] = this._valuesEnd[property]; + this._valuesEnd[property] = tmp; + } + + this._valuesStart[property] = this._valuesStartRepeat[property]; + + } + + if (this._yoyo) { + this._reversed = !this._reversed; + } + + if (this._repeatDelayTime !== undefined) { + this._startTime = time + this._repeatDelayTime; + } else { + this._startTime = time + this._delayTime; + } + + return true; + + } else { + + if (this._onCompleteCallback !== null) { + + this._onCompleteCallback(this._object); + } + + for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { + // Make the chained tweens start exactly at the time they should, + // even if the `update()` method was called way past the duration of the tween + this._chainedTweens[i].start(this._startTime + this._duration); + } + + return false; + + } + + } + + return true; + + } +}; + + +TWEEN.Easing = { + + Linear: { + + None: function (k) { + + return k; + + } + + }, + + Quadratic: { + + In: function (k) { + + return k * k; + + }, + + Out: function (k) { + + return k * (2 - k); + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + + return - 0.5 * (--k * (k - 2) - 1); + + } + + }, + + Cubic: { + + In: function (k) { + + return k * k * k; + + }, + + Out: function (k) { + + return --k * k * k + 1; + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + + return 0.5 * ((k -= 2) * k * k + 2); + + } + + }, + + Quartic: { + + In: function (k) { + + return k * k * k * k; + + }, + + Out: function (k) { + + return 1 - (--k * k * k * k); + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + + return - 0.5 * ((k -= 2) * k * k * k - 2); + + } + + }, + + Quintic: { + + In: function (k) { + + return k * k * k * k * k; + + }, + + Out: function (k) { + + return --k * k * k * k * k + 1; + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + + return 0.5 * ((k -= 2) * k * k * k * k + 2); + + } + + }, + + Sinusoidal: { + + In: function (k) { + + return 1 - Math.cos(k * Math.PI / 2); + + }, + + Out: function (k) { + + return Math.sin(k * Math.PI / 2); + + }, + + InOut: function (k) { + + return 0.5 * (1 - Math.cos(Math.PI * k)); + + } + + }, + + Exponential: { + + In: function (k) { + + return k === 0 ? 0 : Math.pow(1024, k - 1); + + }, + + Out: function (k) { + + return k === 1 ? 1 : 1 - Math.pow(2, - 10 * k); + + }, + + InOut: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + + return 0.5 * (- Math.pow(2, - 10 * (k - 1)) + 2); + + } + + }, + + Circular: { + + In: function (k) { + + return 1 - Math.sqrt(1 - k * k); + + }, + + Out: function (k) { + + return Math.sqrt(1 - (--k * k)); + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return - 0.5 * (Math.sqrt(1 - k * k) - 1); + } + + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + + } + + }, + + Elastic: { + + In: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + return -Math.pow(2, 10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI); + + }, + + Out: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + return Math.pow(2, -10 * k) * Math.sin((k - 0.1) * 5 * Math.PI) + 1; + + }, + + InOut: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + k *= 2; + + if (k < 1) { + return -0.5 * Math.pow(2, 10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI); + } + + return 0.5 * Math.pow(2, -10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI) + 1; + + } + + }, + + Back: { + + In: function (k) { + + var s = 1.70158; + + return k * k * ((s + 1) * k - s); + + }, + + Out: function (k) { + + var s = 1.70158; + + return --k * k * ((s + 1) * k + s) + 1; + + }, + + InOut: function (k) { + + var s = 1.70158 * 1.525; + + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + + } + + }, + + Bounce: { + + In: function (k) { + + return 1 - TWEEN.Easing.Bounce.Out(1 - k); + + }, + + Out: function (k) { + + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + + }, + + InOut: function (k) { + + if (k < 0.5) { + return TWEEN.Easing.Bounce.In(k * 2) * 0.5; + } + + return TWEEN.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; + + } + + } + +}; + +TWEEN.Interpolation = { + + Linear: function (v, k) { + + var m = v.length - 1; + var f = m * k; + var i = Math.floor(f); + var fn = TWEEN.Interpolation.Utils.Linear; + + if (k < 0) { + return fn(v[0], v[1], f); + } + + if (k > 1) { + return fn(v[m], v[m - 1], m - f); + } + + return fn(v[i], v[i + 1 > m ? m : i + 1], f - i); + + }, + + Bezier: function (v, k) { + + var b = 0; + var n = v.length - 1; + var pw = Math.pow; + var bn = TWEEN.Interpolation.Utils.Bernstein; + + for (var i = 0; i <= n; i++) { + b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i); + } + + return b; + + }, + + CatmullRom: function (v, k) { + + var m = v.length - 1; + var f = m * k; + var i = Math.floor(f); + var fn = TWEEN.Interpolation.Utils.CatmullRom; + + if (v[0] === v[m]) { + + if (k < 0) { + i = Math.floor(f = m * (1 + k)); + } + + return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i); + + } else { + + if (k < 0) { + return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]); + } + + if (k > 1) { + return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]); + } + + return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i); + + } + + }, + + Utils: { + + Linear: function (p0, p1, t) { + + return (p1 - p0) * t + p0; + + }, + + Bernstein: function (n, i) { + + var fc = TWEEN.Interpolation.Utils.Factorial; + + return fc(n) / fc(i) / fc(n - i); + + }, + + Factorial: (function () { + + var a = [1]; + + return function (n) { + + var s = 1; + + if (a[n]) { + return a[n]; + } + + for (var i = n; i > 1; i--) { + s *= i; + } + + a[n] = s; + return s; + + }; + + })(), + + CatmullRom: function (p0, p1, p2, p3, t) { + + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + var t2 = t * t; + var t3 = t * t2; + + return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (- 3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; + + } + + } + +}; + +// UMD (Universal Module Definition) +(function (root) { + + if (typeof define === 'function' && define.amd) { + + // AMD + define([], function () { + return TWEEN; + }); + + } else if (typeof module !== 'undefined' && typeof exports === 'object') { + + // Node.js + module.exports = TWEEN; + + } else if (root !== undefined) { + + // Global variable + root.TWEEN = TWEEN; + + } + +})(this); diff --git a/lib/ammo.js b/lib/ammo.js new file mode 100644 index 0000000..a9a7f8d --- /dev/null +++ b/lib/ammo.js @@ -0,0 +1,33 @@ + + // This is ammo.js, a port of Bullet Physics to JavaScript. zlib licensed. + var Ammo = function(Ammo) { + Ammo = Ammo || {}; + +var Module=typeof Ammo!=="undefined"?Ammo:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}else{Module["read"]=function shell_read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw new Error("Unknown runtime environment. Where are we?")}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var ASM_CONSTS=[(function($0,$1,$2,$3,$4,$5,$6,$7){var self=Module["getCache"](Module["ConcreteContactResultCallback"])[$0];if(!self.hasOwnProperty("addSingleResult"))throw"a JSImplementation must implement all functions, you forgot ConcreteContactResultCallback::addSingleResult.";return self["addSingleResult"]($1,$2,$3,$4,$5,$6,$7)})];function _emscripten_asm_const_diiiiiiii(code,a0,a1,a2,a3,a4,a5,a6,a7){return ASM_CONSTS[code](a0,a1,a2,a3,a4,a5,a6,a7)}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+28576;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_btConeTwistConstraint_cpp()})},{func:(function(){__GLOBAL__sub_I_btQuickprof_cpp()})});memoryInitializer="data:application/octet-stream;base64,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6AoAAAMBAAAEAQAABQEAAAYBAAAnAAAABAAAABIAAABHAAAAAAAAABALAAADAQAABwEAAAUBAAAGAQAAJwAAAAUAAAATAAAASAAAAAAAAABACwAAAwEAAAgBAAAFAQAABgEAACcAAAAGAAAAFAAAAEkAAAB7IHZhciBzZWxmID0gTW9kdWxlWydnZXRDYWNoZSddKE1vZHVsZVsnQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2snXSlbJDBdOyBpZiAoIXNlbGYuaGFzT3duUHJvcGVydHkoJ2FkZFNpbmdsZVJlc3VsdCcpKSB0aHJvdyAnYSBKU0ltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50IGFsbCBmdW5jdGlvbnMsIHlvdSBmb3Jnb3QgQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2s6OmFkZFNpbmdsZVJlc3VsdC4nOyByZXR1cm4gc2VsZlsnYWRkU2luZ2xlUmVzdWx0J10oJDEsJDIsJDMsJDQsJDUsJDYsJDcpOyB9ADI5Q29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2sATjE2YnRDb2xsaXNpb25Xb3JsZDIxQ29udGFjdFJlc3VsdENhbGxiYWNrRQBOMTZidENvbGxpc2lvbldvcmxkMjRDbG9zZXN0UmF5UmVzdWx0Q2FsbGJhY2tFAE4xNmJ0Q29sbGlzaW9uV29ybGQxN1JheVJlc3VsdENhbGxiYWNrRQAxOWJ0R2hvc3RQYWlyQ2FsbGJhY2sAMjVidE92ZXJsYXBwaW5nUGFpckNhbGxiYWNrADIwYnREZWZhdWx0TW90aW9uU3RhdGUAMTNidE1vdGlvblN0YXRlADE4YnRWZWhpY2xlUmF5Y2FzdGVyAE4xNmJ0Q29sbGlzaW9uV29ybGQyN0Nsb3Nlc3RDb252ZXhSZXN1bHRDYWxsYmFja0UATjE2YnRDb2xsaXNpb25Xb3JsZDIwQ29udmV4UmVzdWx0Q2FsbGJhY2tFADIzYnREZWZhdWx0U29mdEJvZHlTb2x2ZXIAMTZidFNvZnRCb2R5U29sdmVyADQxYnRTb2Z0Qm9keVJpZ2lkQm9keUNvbGxpc2lvbkNvbmZpZ3VyYXRpb24ATjM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0xN1N3YXBwZWRDcmVhdGVGdW5jRQAzMGJ0Q29sbGlzaW9uQWxnb3JpdGhtQ3JlYXRlRnVuYwBOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yOGJ0U29mdFNvZnRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAFNvZnRCb2R5TWF0ZXJpYWxEYXRhAFNvZnRCb2R5Tm9kZURhdGEAU29mdEJvZHlMaW5rRGF0YQBTb2Z0Qm9keUZhY2VEYXRhAFNvZnRCb2R5VGV0cmFEYXRhAFNvZnRSaWdpZEFuY2hvckRhdGEAZmxvYXQAU29mdEJvZHlQb3NlRGF0YQBTb2Z0Qm9keUNsdXN0ZXJEYXRhAGludABidFNvZnRCb2R5Sm9pbnREYXRhAGJ0U29mdEJvZHlGbG9hdERhdGEAMTBidFNvZnRCb2R5AE4xMGJ0U29mdEJvZHkxNVJheUZyb21Ub0Nhc3RlckUATjZidERidnQ4SUNvbGxpZGVFAE4xMGJ0U29mdEJvZHk1Sm9pbnRFAE4xMGJ0U29mdEJvZHk2Q0pvaW50RQBOMTBidFNvZnRCb2R5NkxKb2ludEUAU29mdEJvZHkAMjRidFNvZnRCb2R5Q29sbGlzaW9uU2hhcGUAYnRDb252ZXhJbnRlcm5hbFNoYXBlRGF0YQBTT0ZUQ0xVU1RFUgAyN2J0U29mdENsdXN0ZXJDb2xsaXNpb25TaGFwZQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVDTF9SU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTFDbHVzdGVyQmFzZUUATjE1YnRTb2Z0Q29sbGlkZXJzMTNDb2xsaWRlU0RGX1JTRQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVWRl9TU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTJDb2xsaWRlQ0xfU1NFADI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0AMjBidENvbGxpc2lvbkFsZ29yaXRobQBUcmlhbmdsZQAxNWJ0VHJpYW5nbGVTaGFwZQBOMTJidENvbnZleENhc3QxMENhc3RSZXN1bHRFAFpOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTIxY2FsY3VsYXRlVGltZU9mSW1wYWN0RVAxN2J0Q29sbGlzaW9uT2JqZWN0UzFfUksxNmJ0RGlzcGF0Y2hlckluZm9QMTZidE1hbmlmb2xkUmVzdWx0RTMxTG9jYWxUcmlhbmdsZVNwaGVyZUNhc3RDYWxsYmFjawAyNmJ0U29mdEJvZHlUcmlhbmdsZUNhbGxiYWNrADM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjNidFNvZnRTaW5nbGVSYXlDYWxsYmFjawAyM2J0QnJvYWRwaGFzZVJheUNhbGxiYWNrADI0YnRCcm9hZHBoYXNlQWFiYkNhbGxiYWNrADI0YnRTb2Z0UmlnaWREeW5hbWljc1dvcmxkADI4YnRTb2Z0U29mdENvbGxpc2lvbkFsZ29yaXRobQBidFJpZ2lkQm9keUZsb2F0RGF0YQAxMWJ0UmlnaWRCb2R5ADM0YnRDbG9zZXN0Tm90TWVDb252ZXhSZXN1bHRDYWxsYmFjawBidER5bmFtaWNzV29ybGRGbG9hdERhdGEAMjNidERpc2NyZXRlRHluYW1pY3NXb3JsZAAxNWJ0RHluYW1pY3NXb3JsZAAyN0lucGxhY2VTb2x2ZXJJc2xhbmRDYWxsYmFjawBOMjVidFNpbXVsYXRpb25Jc2xhbmRNYW5hZ2VyMTRJc2xhbmRDYWxsYmFja0UAYnRHZW5lcmljNkRvZlNwcmluZzJDb25zdHJhaW50RGF0YQAxN2J0VHlwZWRDb25zdHJhaW50ADEzYnRUeXBlZE9iamVjdAAxN2J0Rml4ZWRDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZDb25zdHJhaW50RGF0YQAyM2J0R2VuZXJpYzZEb2ZDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50RGF0YQAyOWJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50AGJ0UG9pbnQyUG9pbnRDb25zdHJhaW50RmxvYXREYXRhADIzYnRQb2ludDJQb2ludENvbnN0cmFpbnQAYnRUeXBlZENvbnN0cmFpbnRGbG9hdERhdGEAYnRTbGlkZXJDb25zdHJhaW50RGF0YQAxOGJ0U2xpZGVyQ29uc3RyYWludABidENvbmVUd2lzdENvbnN0cmFpbnREYXRhADIxYnRDb25lVHdpc3RDb25zdHJhaW50AGJ0SGluZ2VDb25zdHJhaW50RmxvYXREYXRhADE3YnRIaW5nZUNvbnN0cmFpbnQAMzVidFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcgAxOGJ0Q29uc3RyYWludFNvbHZlcgAxNmJ0UmF5Y2FzdFZlaGljbGUAMTdidEFjdGlvbkludGVyZmFjZQAyNWJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIANDNidEtpbmVtYXRpY0Nsb3Nlc3ROb3RNZUNvbnZleFJlc3VsdENhbGxiYWNrADMwYnRLaW5lbWF0aWNDaGFyYWN0ZXJDb250cm9sbGVyADMwYnRDaGFyYWN0ZXJDb250cm9sbGVySW50ZXJmYWNlADIyYnRTdWJzaW1wbGV4Q29udmV4Q2FzdAAxMmJ0Q29udmV4Q2FzdABidENvbGxpc2lvbk9iamVjdEZsb2F0RGF0YQAxN2J0Q29sbGlzaW9uT2JqZWN0ADEzYnRHaG9zdE9iamVjdAAyNGJ0UGFpckNhY2hpbmdHaG9zdE9iamVjdAAyM2J0Q29sbGlzaW9uUGFpckNhbGxiYWNrADE3YnRPdmVybGFwQ2FsbGJhY2sAMjFidENvbGxpc2lvbkRpc3BhdGNoZXIAMzFidERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uADI0YnRDb2xsaXNpb25Db25maWd1cmF0aW9uAE4zMWJ0Q29udmV4UGxhbmVDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yNmJ0Qm94Qm94Q29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzRidFNwaGVyZVRyaWFuZ2xlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzJidFNwaGVyZVNwaGVyZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjE2YnRFbXB0eUFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTE3U3dhcHBlZENyZWF0ZUZ1bmNFAE4zNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTdTd2FwcGVkQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQAyNWJ0U2ltdWxhdGlvbklzbGFuZE1hbmFnZXIAMzFidENvbnZleFBsYW5lQ29sbGlzaW9uQWxnb3JpdGhtAFpOMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0yMWNhbGN1bGF0ZVRpbWVPZkltcGFjdEVQMTdidENvbGxpc2lvbk9iamVjdFMxX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUzMUxvY2FsVHJpYW5nbGVTcGhlcmVDYXN0Q2FsbGJhY2sAMjRidENvbnZleFRyaWFuZ2xlQ2FsbGJhY2sAMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjZidEJveEJveENvbGxpc2lvbkFsZ29yaXRobQAxNmJ0TWFuaWZvbGRSZXN1bHQATjM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlNlJlc3VsdEUAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTE1TG9jYWxJbmZvQWRkZXIyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUU5UmF5VGVzdGVyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUUyOUJyaWRnZVRyaWFuZ2xlUmF5Y2FzdENhbGxiYWNrXzAAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTI5QnJpZGdlVHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMTlidFNpbmdsZVJheUNhbGxiYWNrADE3RGVidWdEcmF3Y2FsbGJhY2sAAU92ZXJmbG93IGluIEFBQkIsIG9iamVjdCByZW1vdmVkIGZyb20gc2ltdWxhdGlvbgBJZiB5b3UgY2FuIHJlcHJvZHVjZSB0aGlzLCBwbGVhc2UgZW1haWwgYnVnc0Bjb250aW51b3VzcGh5c2ljcy5jb20KAFBsZWFzZSBpbmNsdWRlIGFib3ZlIGluZm9ybWF0aW9uLCB5b3VyIFBsYXRmb3JtLCB2ZXJzaW9uIG9mIE9TLgoAVGhhbmtzLgoAMTZidENvbGxpc2lvbldvcmxkAFpaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRU4yMmJ0Q29tcG91bmRMZWFmQ2FsbGJhY2sxMlByb2Nlc3NDaGlsZEVpUzVfUEsxNmJ0Q29sbGlzaW9uU2hhcGVFMTRMb2NhbEluZm9BZGRlcgBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTIyYnRDb21wb3VuZExlYWZDYWxsYmFjawBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2tfMABaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2sAMjFidFNpbmdsZVN3ZWVwQ2FsbGJhY2sAMjNidEJyaWRnZWRNYW5pZm9sZFJlc3VsdAAyM2J0U2luZ2xlQ29udGFjdENhbGxiYWNrADM0YnRTcGhlcmVUcmlhbmdsZUNvbGxpc2lvbkFsZ29yaXRobQAyNGJ0UGVydHVyYmVkQ29udGFjdFJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUyMWJ0V2l0aG91dE1hcmdpblJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUxM2J0RHVtbXlSZXN1bHQAMjNidENvbnZleENvbnZleEFsZ29yaXRobQBOMjNidENvbnZleENvbnZleEFsZ29yaXRobTEwQ3JlYXRlRnVuY0UAMjJidENvbXBvdW5kTGVhZkNhbGxiYWNrADI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQAzMGJ0Q29tcG91bmRDb21wb3VuZExlYWZDYWxsYmFjawAzNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQBidENvbXBvdW5kU2hhcGVDaGlsZERhdGEAYnRDb21wb3VuZFNoYXBlRGF0YQBDb21wb3VuZAAxNWJ0Q29tcG91bmRTaGFwZQBidENvbmVTaGFwZURhdGEAQ29uZQAxMWJ0Q29uZVNoYXBlAENvbmVaADEyYnRDb25lU2hhcGVaAENvbmVYADEyYnRDb25lU2hhcGVYAFNQSEVSRQAxM2J0U3BoZXJlU2hhcGUAWk5LMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTlwcm9jZXNzQWxsVHJpYW5nbGVzRVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMWJ0Tm9kZU92ZXJsYXBDYWxsYmFjawBidFRyaWFuZ2xlTWVzaFNoYXBlRGF0YQBCVkhUUklBTkdMRU1FU0gAMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlAFpOMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTRwZXJmb3JtUmF5Y2FzdEVQMThidFRyaWFuZ2xlQ2FsbGJhY2tSSzlidFZlY3RvcjNTNF9FMjFNeU5vZGVPdmVybGFwQ2FsbGJhY2sAWk4yMmJ0QnZoVHJpYW5nbGVNZXNoU2hhcGUxN3BlcmZvcm1Db252ZXhjYXN0RVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X1M0X1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMVN1cHBvcnRWZXJ0ZXhDYWxsYmFjawBaTksxOWJ0VHJpYW5nbGVNZXNoU2hhcGUxOXByb2Nlc3NBbGxUcmlhbmdsZXNFUDE4YnRUcmlhbmdsZUNhbGxiYWNrUks5YnRWZWN0b3IzUzRfRTE2RmlsdGVyZWRDYWxsYmFjawBUUklBTkdMRU1FU0gAMTlidFRyaWFuZ2xlTWVzaFNoYXBlAGJ0U3RhdGljUGxhbmVTaGFwZURhdGEAU1RBVElDUExBTkUAMThidFN0YXRpY1BsYW5lU2hhcGUAMjNidFBvbHloZWRyYWxDb252ZXhTaGFwZQAzNGJ0UG9seWhlZHJhbENvbnZleEFhYmJDYWNoaW5nU2hhcGUAYnRDb2xsaXNpb25TaGFwZURhdGEAMTZidENvbGxpc2lvblNoYXBlADEzYnRDb252ZXhTaGFwZQAyMWJ0Q29udmV4SW50ZXJuYWxTaGFwZQBidENvbnZleEh1bGxTaGFwZURhdGEAQ29udmV4ADE3YnRDb252ZXhIdWxsU2hhcGUAMThidFRyaWFuZ2xlQ2FsbGJhY2sAMzFidEludGVybmFsVHJpYW5nbGVJbmRleENhbGxiYWNrAGJ0Q2Fwc3VsZVNoYXBlRGF0YQBDYXBzdWxlU2hhcGUAMTRidENhcHN1bGVTaGFwZQBDYXBzdWxlWAAxNWJ0Q2Fwc3VsZVNoYXBlWABDYXBzdWxlWgAxNWJ0Q2Fwc3VsZVNoYXBlWgAyNkxvY2FsU3VwcG9ydFZlcnRleENhbGxiYWNrAENvbnZleFRyaW1lc2gAMjVidENvbnZleFRyaWFuZ2xlTWVzaFNoYXBlADE0YnRDb25jYXZlU2hhcGUAQm94ADEwYnRCb3hTaGFwZQAxNGJ0T3B0aW1pemVkQnZoAFpOMTRidE9wdGltaXplZEJ2aDVidWlsZEVQMjNidFN0cmlkaW5nTWVzaEludGVyZmFjZWJSSzlidFZlY3RvcjNTNF9FMjBOb2RlVHJpYW5nbGVDYWxsYmFjawBaTjE0YnRPcHRpbWl6ZWRCdmg1YnVpbGRFUDIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2ViUks5YnRWZWN0b3IzUzRfRTI5UXVhbnRpemVkTm9kZVRyaWFuZ2xlQ2FsbGJhY2sASEVJR0hURklFTEQAMjVidEhlaWdodGZpZWxkVGVycmFpblNoYXBlAGJ0Q3lsaW5kZXJTaGFwZURhdGEAQ3lsaW5kZXJZADE1YnRDeWxpbmRlclNoYXBlAEN5bGluZGVyWAAxNmJ0Q3lsaW5kZXJTaGFwZVgAQ3lsaW5kZXJaADE2YnRDeWxpbmRlclNoYXBlWgAxNGJ0VHJpYW5nbGVNZXNoADIwYnRBeGlzU3dlZXAzSW50ZXJuYWxJdEUAMjFidEJyb2FkcGhhc2VJbnRlcmZhY2UAMTJidEF4aXNTd2VlcDMAMTVidE51bGxQYWlyQ2FjaGUAMjJidE92ZXJsYXBwaW5nUGFpckNhY2hlAFpOMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlMTljbGVhblByb3h5RnJvbVBhaXJzRVAxN2J0QnJvYWRwaGFzZVByb3h5UDEyYnREaXNwYXRjaGVyRTE3Q2xlYW5QYWlyQ2FsbGJhY2sAWk4yOGJ0SGFzaGVkT3ZlcmxhcHBpbmdQYWlyQ2FjaGUzN3JlbW92ZU92ZXJsYXBwaW5nUGFpcnNDb250YWluaW5nUHJveHlFUDE3YnRCcm9hZHBoYXNlUHJveHlQMTJidERpc3BhdGNoZXJFMThSZW1vdmVQYWlyQ2FsbGJhY2sAMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlADE4YnREYnZ0VHJlZUNvbGxpZGVyADIwQnJvYWRwaGFzZUFhYmJUZXN0ZXIAMTlCcm9hZHBoYXNlUmF5VGVzdGVyADE2YnREYnZ0QnJvYWRwaGFzZQAxMmJ0RGlzcGF0Y2hlcgBidE9wdGltaXplZEJ2aE5vZGVEYXRhAGJ0UXVhbnRpemVkQnZoTm9kZURhdGEAYnRCdmhTdWJ0cmVlSW5mb0RhdGEAYnRRdWFudGl6ZWRCdmhGbG9hdERhdGEAMTRidFF1YW50aXplZEJ2aAAyNWJ0VHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMjhidFRyaWFuZ2xlQ29udmV4Y2FzdENhbGxiYWNrAFpOMzNidE1pbmtvd3NraVBlbmV0cmF0aW9uRGVwdGhTb2x2ZXIxMmNhbGNQZW5EZXB0aEVSMjJidFZvcm9ub2lTaW1wbGV4U29sdmVyUEsxM2J0Q29udmV4U2hhcGVTNF9SSzExYnRUcmFuc2Zvcm1TN19SOWJ0VmVjdG9yM1M5X1M5X1AxMmJ0SURlYnVnRHJhd0UyMGJ0SW50ZXJtZWRpYXRlUmVzdWx0ADMzYnRNaW5rb3dza2lQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRDb252ZXhQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRHamtFcGFQZW5ldHJhdGlvbkRlcHRoU29sdmVyADE2YnRQb2ludENvbGxlY3RvcgAxNWJ0R2prQ29udmV4Q2FzdAAyN2J0Q29udGludW91c0NvbnZleENvbGxpc2lvbgAxN2J0R2prUGFpckRldGVjdG9yADM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlADMwYnRBY3RpdmF0aW5nQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRFbXB0eUFsZ29yaXRobQAzMmJ0U3BoZXJlU3BoZXJlQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRCb3hCb3hEZXRlY3RvcgAyMlNwaGVyZVRyaWFuZ2xlRGV0ZWN0b3IAMjNidEhhc2hlZFNpbXBsZVBhaXJDYWNoZQAxOGJ0Q29udmV4UG9seWhlZHJvbgAyNmJ0VHJpYW5nbGVJbmRleFZlcnRleEFycmF5AGJ0SW50SW5kZXhEYXRhAGJ0U2hvcnRJbnRJbmRleFRyaXBsZXREYXRhAGJ0Q2hhckluZGV4VHJpcGxldERhdGEAYnRWZWN0b3IzRmxvYXREYXRhAGJ0VmVjdG9yM0RvdWJsZURhdGEAYnRNZXNoUGFydERhdGEAYnRTdHJpZGluZ01lc2hJbnRlcmZhY2VEYXRhADIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2UAUm9vdAARAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABEADwoREREDCgcAARMJCwsAAAkGCwAACwAGEQAAABEREQAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAARAAoKERERAAoAAAIACQsAAAAJAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA0AAAAEDQAAAAAJDgAAAAAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAPAAAAAA8AAAAACRAAAAAAABAAABAAABIAAAASEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAABISEgAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAoAAAAACgAAAAAJCwAAAAAACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAC0rICAgMFgweAAobnVsbCkALTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAwMTIzNDU2Nzg5QUJDREVGLgBUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXM6ICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXMAdGVybWluYXRpbmcgd2l0aCAlcyBmb3JlaWduIGV4Y2VwdGlvbgB0ZXJtaW5hdGluZwB1bmNhdWdodABTdDlleGNlcHRpb24ATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAU3Q5dHlwZV9pbmZvAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAcHRocmVhZF9vbmNlIGZhaWx1cmUgaW4gX19jeGFfZ2V0X2dsb2JhbHNfZmFzdCgpAGNhbm5vdCBjcmVhdGUgcHRocmVhZCBrZXkgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAY2Fubm90IHplcm8gb3V0IHRocmVhZCB2YWx1ZSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQB0ZXJtaW5hdGVfaGFuZGxlciB1bmV4cGVjdGVkbHkgcmV0dXJuZWQATjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTE3X19wYmFzZV90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0U=";var tempDoublePtr=STATICTOP;STATICTOP+=16;function __ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8setParamEifi(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8setParamEifi");abort(-1)}function __ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder");abort(-1)}function __ZNK30btGeneric6DofSpring2Constraint8getParamEii(){Module["printErr"]("missing function: _ZNK30btGeneric6DofSpring2Constraint8getParamEii");abort(-1)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___gxx_personality_v0(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var _llvm_pow_f32=Math_pow;function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function __ZTI30btGeneric6DofSpring2Constraint(){Module["printErr"]("missing function: _ZTI30btGeneric6DofSpring2Constraint");abort(-1)}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i>2]=c[a+4>>2];c[b+20>>2]=c[a+8>>2];c[b+24>>2]=c[a+12>>2];c[b+28>>2]=c[a+16>>2];c[b+32>>2]=c[a+20>>2];c[b+36>>2]=c[a+24>>2];c[b+40>>2]=c[a+28>>2];c[b+44>>2]=c[a+32>>2];c[b+48>>2]=c[a+36>>2];c[b+52>>2]=c[a+40>>2];c[b+56>>2]=c[a+44>>2];c[b+60>>2]=c[a+48>>2];c[b+64>>2]=c[a+52>>2];c[b+68>>2]=c[a+56>>2];c[b+72>>2]=c[a+60>>2];c[b+76>>2]=c[a+64>>2];c[b+80>>2]=c[a+68>>2];c[b+84>>2]=c[a+72>>2];c[b+88>>2]=c[a+76>>2];c[b+92>>2]=c[a+80>>2];c[b+96>>2]=c[a+84>>2];c[b+100>>2]=c[a+88>>2];c[b+104>>2]=c[a+92>>2];c[b+108>>2]=c[a+96>>2];c[b+112>>2]=c[a+100>>2];c[b+116>>2]=c[a+104>>2];c[b+120>>2]=c[a+108>>2];c[b+124>>2]=c[a+112>>2];c[b+128>>2]=c[a+116>>2];c[b+132>>2]=c[a+120>>2];c[b+136>>2]=c[a+124>>2];c[b+140>>2]=c[a+128>>2];c[b+144>>2]=c[a+132>>2];c[b+148>>2]=c[a+136>>2];c[b+152>>2]=c[a+140>>2];c[b+156>>2]=c[a+144>>2];c[b+160>>2]=c[a+148>>2];c[b+164>>2]=c[a+152>>2];c[b+168>>2]=c[a+156>>2];c[b+172>>2]=c[a+160>>2];c[b+176>>2]=c[a+164>>2];c[b+180>>2]=c[a+168>>2];c[b+184>>2]=c[a+172>>2];c[b+188>>2]=c[a+176>>2];c[b+232>>2]=c[a+180>>2];c[b+192>>2]=c[a+184>>2];c[b>>2]=0;c[b+4>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+192>>2]|0)|0;c[b+8>>2]=0;c[b+236>>2]=c[a+204>>2];c[b+240>>2]=c[a+208>>2];c[b+244>>2]=c[a+212>>2];c[b+248>>2]=c[a+220>>2];c[b+196>>2]=c[a+224>>2];c[b+200>>2]=c[a+228>>2];c[b+204>>2]=c[a+236>>2];c[b+208>>2]=c[a+244>>2];c[b+212>>2]=c[a+248>>2];c[b+216>>2]=c[a+232>>2];c[b+252>>2]=c[a+252>>2];e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b+12>>2]=f;if(!f){f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}function cf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0;v=a[h+16>>0]&-16;a[h+16>>0]=v;w=+g[e>>2];x=+g[d>>2];n=+g[e+4>>2];o=+g[d+4>>2];p=+g[e+8>>2];q=+g[d+8>>2];r=+g[f>>2];s=+g[f+4>>2];t=+g[f+8>>2];l=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];y=(w-x)*(l-x)+(n-o)*(m-o)+(p-q)*(i-q);z=(r-x)*(l-x)+(s-o)*(m-o)+(t-q)*(i-q);do if(y<=0.0&z<=0.0){c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];a[h+16>>0]=v|1;j=0.0;k=0.0;i=1.0}else{u=(w-x)*(l-w)+(n-o)*(m-n)+(p-q)*(i-p);k=(r-x)*(l-w)+(s-o)*(m-n)+(t-q)*(i-p);if(!(!(u>=0.0)|!(k<=u))){c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];a[h+16>>0]=v|2;j=0.0;k=1.0;i=0.0;break}if(u<=0.0&(y>=0.0?y*k-u*z<=0.0:0)){g[h>>2]=x+(w-x)*(y/(y-u));g[h+4>>2]=o+(n-o)*(y/(y-u));g[h+8>>2]=q+(p-q)*(y/(y-u));g[h+12>>2]=0.0;a[h+16>>0]=v|3;j=0.0;k=y/(y-u);i=1.0-y/(y-u);break}j=(w-x)*(l-r)+(n-o)*(m-s)+(p-q)*(i-t);i=(r-x)*(l-r)+(s-o)*(m-s)+(t-q)*(i-t);if(!(!(i>=0.0)|!(j<=i))){c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];a[h+16>>0]=v|4;j=1.0;k=0.0;i=0.0;break}if(i<=0.0&(z>=0.0?j*z-y*i<=0.0:0)){g[h>>2]=x+(r-x)*(z/(z-i));g[h+4>>2]=o+(s-o)*(z/(z-i));g[h+8>>2]=q+(t-q)*(z/(z-i));g[h+12>>2]=0.0;a[h+16>>0]=v|5;j=z/(z-i);k=0.0;i=1.0-z/(z-i);break}if((u*i-j*k<=0.0?k-u>=0.0:0)?j-i>=0.0:0){k=(k-u)/(k-u+(j-i));g[h>>2]=w+(r-w)*k;g[h+4>>2]=n+(s-n)*k;g[h+8>>2]=p+(t-p)*k;g[h+12>>2]=0.0;a[h+16>>0]=v|6;j=k;k=1.0-k;i=0.0;break}l=1.0/(y*k-u*z+(u*i-j*k+(j*z-y*i)));m=(j*z-y*i)*l;i=(y*k-u*z)*l;g[h>>2]=(r-x)*i+((w-x)*m+x);g[h+4>>2]=(s-o)*i+((n-o)*m+o);g[h+8>>2]=(t-q)*i+((p-q)*m+q);g[h+12>>2]=0.0;a[h+16>>0]=v|7;j=i;k=m;i=1.0-m-i}while(0);g[h+20>>2]=i;g[h+24>>2]=k;g[h+28>>2]=j;g[h+32>>2]=0.0;return}function df(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;h=c[c[b+1120>>2]>>2]|0;f=c[c[e+1120>>2]>>2]|0;c[6995]=(c[6995]|0)+1;e=sc(207)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}y=e+4|0;i=e+28|0;Yk(i|0,0,160)|0;c[e>>2]=3464;c[y>>2]=h;c[e+8>>2]=0;c[e+12>>2]=0;h=e+16|0;c[h>>2]=f;c[e+20>>2]=0;c[e+24>>2]=0;f=ui(y)|0;j=+g[f>>2];l=+g[f+16>>2];n=+g[f+32>>2];p=+g[f+4>>2];q=+g[f+20>>2];r=+g[f+36>>2];s=+g[f+8>>2];u=+g[f+24>>2];w=+g[f+40>>2];k=-+g[f+48>>2];m=-+g[f+52>>2];o=-+g[f+56>>2];t=+g[d+12>>2];v=+g[d+16>>2];x=+g[d+20>>2];g[i>>2]=j*k+l*m+n*o+(j*t+l*v+n*x);g[e+32>>2]=p*k+q*m+r*o+(p*t+q*v+r*x);g[e+36>>2]=s*k+u*m+w*o+(s*t+u*v+w*x);g[e+40>>2]=0.0;h=ui(h)|0;x=+g[h>>2];w=+g[h+16>>2];v=+g[h+32>>2];u=+g[h+4>>2];t=+g[h+20>>2];s=+g[h+36>>2];o=+g[h+8>>2];m=+g[h+24>>2];k=+g[h+40>>2];r=-+g[h+48>>2];q=-+g[h+52>>2];p=-+g[h+56>>2];n=+g[d+12>>2];l=+g[d+16>>2];j=+g[d+20>>2];g[e+44>>2]=x*r+w*q+v*p+(x*n+w*l+v*j);g[e+48>>2]=u*r+t*q+s*p+(u*n+t*l+s*j);g[e+52>>2]=o*r+m*q+k*p+(o*n+m*l+k*j);g[e+56>>2]=0.0;c[e+60>>2]=c[d+4>>2];c[e+64>>2]=c[d>>2];c[e+68>>2]=c[d+8>>2];h=e;f=c[b+912>>2]|0;if((f|0)!=(c[b+916>>2]|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}i=f|0?f<<1:1;if((f|0)>=(i|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+912>>2]|0}if((f|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+920>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+920>>2]|0;if(d){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+912>>2]|0}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=e;c[b+916>>2]=i;y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}function ef(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;var i=0;i=l;l=l+144|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=4324;a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;g[i>>2]=d;c[i+4>>2]=e;c[i+72>>2]=f;c[i+76>>2]=c[h>>2];c[i+76+4>>2]=c[h+4>>2];c[i+76+8>>2]=c[h+8>>2];c[i+76+12>>2]=c[h+12>>2];g[i+92>>2]=0.0;g[i+96>>2]=0.0;g[i+100>>2]=.5;g[i+104>>2]=0.0;g[i+108>>2]=0.0;g[i+112>>2]=0.0;g[i+116>>2]=.800000011920929;g[i+120>>2]=1.0;a[i+124>>0]=0;g[i+128>>2]=.004999999888241291;g[i+132>>2]=.009999999776482582;g[i+136>>2]=.009999999776482582;g[i+140>>2]=.009999999776482582;c[i+8>>2]=1065353216;c[i+12>>2]=0;c[i+12+4>>2]=0;c[i+12+8>>2]=0;c[i+12+12>>2]=0;c[i+28>>2]=1065353216;c[i+32>>2]=0;c[i+32+4>>2]=0;c[i+32+8>>2]=0;c[i+32+12>>2]=0;c[i+48>>2]=1065353216;c[i+52>>2]=0;c[i+52+4>>2]=0;c[i+52+8>>2]=0;c[i+52+12>>2]=0;c[i+52+16>>2]=0;Id(b,i);l=i;return}function ff(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+548>>2]|0;a:do if((e|0)>0){g=c[b+556>>2]|0;f=0;while(1){if((c[g+(f<<2)>>2]|0)==(d|0))break;f=f+1|0;if((f|0)>=(e|0))break a}if((f|0)!=(e|0))return}while(0);if((e|0)==(c[b+552>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+548>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+556>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+556>>2]|0;if(f){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+548>>2]|0}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=g;c[b+552>>2]=h}c[(c[b+556>>2]|0)+(e<<2)>>2]=d;c[b+548>>2]=e+1;g=c[d+28>>2]|0;h=c[d+32>>2]|0;if((g|0)==(b|0)){e=c[b+288>>2]|0;if((e|0)==(c[b+292>>2]|0)?(j=e|0?e<<1:1,(e|0)<(j|0)):0){if(!j)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+288>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+296>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+296>>2]|0;if(f){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+288>>2]|0}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=g;c[b+292>>2]=j}c[(c[b+296>>2]|0)+(e<<2)>>2]=h;e=e+1|0;c[b+288>>2]=e}else{b=c[h+288>>2]|0;if((b|0)==(c[h+292>>2]|0)?(i=b|0?b<<1:1,(b|0)<(i|0)):0){if(!i)f=0;else{c[6995]=(c[6995]|0)+1;b=sc((i<<2|3)+16|0)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;b=c[h+288>>2]|0}if((b|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+296>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(b|0))}e=c[h+296>>2]|0;if(e){if(a[h+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);b=c[h+288>>2]|0}c[h+296>>2]=0}a[h+300>>0]=1;c[h+296>>2]=f;c[h+292>>2]=i}c[(c[h+296>>2]|0)+(b<<2)>>2]=g;e=b+1|0;c[h+288>>2]=e;b=h}c[b+280>>2]=(e|0)>0&1;return}function gf(a,b,f){a=a|0;b=b|0;f=f|0;var i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;t=l;l=l+32|0;c[a+60>>2]=(c[a+60>>2]|0)+1;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,t+28|0,t+24|0,t+20|0,t+16|0,t+12|0,t+8|0,t+4|0,t,b);n=(c[t+12>>2]|0)+(P(c[t+8>>2]|0,f)|0)|0;r=c[a+4>>2]|0;o=c[t>>2]|0;switch(o|0){case 3:{i=e[n+4>>1]|0;break}case 2:{i=c[n+8>>2]|0;break}default:i=d[n+2>>0]|0}s=(c[t+20>>2]|0)==0;p=c[t+16>>2]|0;q=c[t+28>>2]|0;i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+44>>2]=m;g[a+48>>2]=k;g[a+52>>2]=j;g[a+56>>2]=0.0;switch(o|0){case 3:{i=e[n+2>>1]|0;break}case 2:{i=c[n+4>>2]|0;break}default:i=d[n+1>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+28>>2]=m;g[a+32>>2]=k;g[a+36>>2]=j;g[a+40>>2]=0.0;switch(o|0){case 3:{i=e[n>>1]|0;break}case 2:{i=c[n>>2]|0;break}default:i=d[n>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];j=+g[i>>2]*+g[r+4>>2];u=+g[i+8>>2];m=+g[r+12>>2];m=u*m;r=a+12|0;g[r>>2]=j;r=a+16|0;g[r>>2]=k;r=a+20|0;g[r>>2]=m;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}else{m=+h[i+8>>3]*+g[r+8>>2];k=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3];u=+g[r+12>>2];u=j*u;r=a+12|0;g[r>>2]=k;r=a+16|0;g[r>>2]=m;r=a+20|0;g[r>>2]=u;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}}function hf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){i=c[b+12>>2]|0;uo(b+16|0,d,e,f,g);if((i|0)<=1)break;h=c[b+8>>2]|0;if((h&2|0)==0?(c[d+36>>2]|0)!=1:0){if(!(h&1)){h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==1:0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;j=b+16+(c[b+12>>2]<<3)|0;h=0;i=b+16|0;k=0;b:while(1){if(i>>>0>=j>>>0){f=18;break}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,e,1,g);if(a[d+54>>0]|0){f=18;break}do if(a[d+53>>0]|0){if(!(a[d+52>>0]|0))if(!(c[b+8>>2]&1)){h=1;f=18;break b}else{h=1;f=k;break}if((c[d+24>>2]|0)==1){f=23;break b}if(!(c[b+8>>2]&2)){f=23;break b}else{h=1;f=1}}else f=k;while(0);i=i+8|0;k=f}do if((f|0)==18){if((!k?(c[d+20>>2]=e,c[d+40>>2]=(c[d+40>>2]|0)+1,(c[d+36>>2]|0)==1):0)?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(h){f=23;break}else{h=4;break}}if(h)f=23;else h=4}while(0);if((f|0)==23)h=3;c[d+44>>2]=h;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function jf(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+164>>2];t=+g[f+340>>2];p=+g[b+160>>2];n=+g[b+156>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+164>>2];p=+g[f+396>>2];q=+g[b+160>>2];n=+g[b+156>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}r=k+d;q=o+j;p=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){n=0.0;o=0.0;d=0.0;j=0.0;k=0.0;m=0.0}else{t=+g[f+336>>2];k=+g[b+180>>2];w=+g[f+340>>2];v=+g[b+176>>2];m=+g[b+172>>2];u=+g[f+332>>2];n=+g[f+316>>2];o=+g[f+320>>2];d=+g[f+324>>2];j=t*k-w*v;k=w*m-k*u;m=v*u-t*m}}else{w=+g[f+392>>2];k=+g[b+180>>2];t=+g[f+396>>2];u=+g[b+176>>2];m=+g[b+172>>2];v=+g[f+388>>2];n=+g[f+372>>2];o=+g[f+376>>2];d=+g[f+380>>2];j=w*k-t*u;k=t*m-k*v;m=u*v-w*m}c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;a[s+36+32>>0]=1;u=+g[b+60>>2];r=+g[b+72>>2]+(r-(n+j))*u;t=(q-(o+k))*u+ +g[b+76>>2];u=(p-(d+m))*u+ +g[b+80>>2];v=(r*+g[b+120>>2]+t*+g[b+124>>2]+u*+g[b+128>>2])*e;w=(r*+g[b+136>>2]+t*+g[b+140>>2]+u*+g[b+144>>2])*e;g[s+36>>2]=(r*+g[b+104>>2]+t*+g[b+108>>2]+u*+g[b+112>>2])*e;g[s+36+4>>2]=v;g[s+36+8>>2]=w;g[s+36+12>>2]=0.0;f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+156|0);Nh(b+16|0,s+36|0,b+172|0);l=s;return}function kf(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0;d=c[a+780>>2]|0;if((d|0)!=4){c[a+780>>2]=d+1;x=d;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}y=+g[b+80>>2];v=+g[a+84>>2];u=v>2];s=t>2];w=+g[a+660>>2]<(r>31;y=+g[b>>2];if(d){e=+g[a+196>>2];k=+g[b+4>>2];l=+g[a+200>>2];h=+g[b+8>>2];f=+g[a+204>>2];m=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];i=((y-e)*(q-p)-(k-l)*(m-u))*((y-e)*(q-p)-(k-l)*(m-u))+(((k-l)*(s-n)-(h-f)*(q-p))*((k-l)*(s-n)-(h-f)*(q-p))+((h-f)*(m-u)-(y-e)*(s-n))*((h-f)*(m-u)-(y-e)*(s-n)));if((d|0)==1){j=+g[a+8>>2];t=h;o=+g[a+12>>2];r=m;v=e;h=0.0;m=+g[a+4>>2];x=7}else{t=h;r=m;x=6}}else{e=+g[a+196>>2];l=+g[a+200>>2];f=+g[a+204>>2];i=0.0;k=+g[b+4>>2];t=+g[b+8>>2];r=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];x=6}if((x|0)==6){m=+g[a+4>>2];j=+g[a+8>>2];B=k-j;o=+g[a+12>>2];z=t-o;v=r-u;A=q-p;h=s-n;h=((y-m)*A-B*v)*((y-m)*A-B*v)+((B*h-z*A)*(B*h-z*A)+(z*v-(y-m)*h)*(z*v-(y-m)*h));if((d|0)==2){r=u;q=e;e=0.0;x=8}else{v=e;x=7}}if((x|0)==7){B=y-m;D=k-j;z=t-o;A=r-v;r=q-l;e=s-f;e=(B*r-D*A)*(B*r-D*A)+((D*e-z*r)*(D*e-z*r)+(z*A-B*e)*(z*A-B*e));if(w)f=0.0;else{r=u;q=v;x=8}}if((x|0)==8){D=y-m;y=k-j;A=t-o;B=r-q;z=p-l;f=n-f;f=(D*z-y*B)*(D*z-y*B)+((y*f-A*z)*(y*f-A*z)+(A*B-D*f)*(A*B-D*f))}D=+C(+i);A=+C(+h);y=+C(+e);v=+C(+f);B=D>-999999984306749440.0?D:-999999984306749440.0;z=A>B?A:B;x=v>(y>z?y:z)?3:y>z?2:A>B?1:(D>-999999984306749440.0^1)<<31>>31;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}function lf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;q=c[b+18504>>2]|0;if(!q){c[b>>2]=5;q=0;return q|0}i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18504>>2]|0)==(q|0))c[b+18504>>2]=c[q+48>>2];c[b+18508>>2]=(c[b+18508>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18496>>2];i=c[b+18496>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18496>>2]=q;c[b+18500>>2]=(c[b+18500>>2]|0)+1;a[q+55>>0]=0;c[q+20>>2]=d;c[q+24>>2]=e;c[q+28>>2]=f;m=+g[d+16>>2];j=+g[e+16>>2]-m;n=+g[d+20>>2];k=+g[e+20>>2]-n;o=+g[d+24>>2];l=+g[e+24>>2]-o;m=+g[f+16>>2]-m;n=+g[f+20>>2]-n;o=+g[f+24>>2]-o;g[q>>2]=k*o-l*n;g[q+4>>2]=l*m-j*o;g[q+8>>2]=j*n-k*m;g[q+12>>2]=0.0;p=+D(+((k*o-l*n)*(k*o-l*n)+(l*m-j*o)*(l*m-j*o)+(j*n-k*m)*(j*n-k*m)));if(p>9.999999747378752e-05){if((!(Zk(k*o-l*n,l*m-j*o,j*n-k*m,+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],q+16|0)|0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],q+16|0)|0):0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],q+16|0)|0):0)g[q+16>>2]=(+g[d+16>>2]*+g[q>>2]+ +g[d+20>>2]*+g[q+4>>2]+ +g[d+24>>2]*+g[q+8>>2])/p;g[q>>2]=1.0/p*+g[q>>2];g[q+4>>2]=1.0/p*+g[q+4>>2];g[q+8>>2]=1.0/p*+g[q+8>>2];if(h)return q|0;if(!(+g[q+16>>2]>=-9.999999747378752e-06))i=3;else return q|0}else i=2;c[b>>2]=i;i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18496>>2]|0)==(q|0))c[b+18496>>2]=c[q+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18504>>2]=q;c[b+18508>>2]=(c[b+18508>>2]|0)+1;q=0;return q|0}function mf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0;h=c[d+8>>2]|0;if((h|0)>0){i=c[d+16>>2]|0;f=0;e=0;do{j=c[i+(f<<2)>>2]|0;if(!(c[j+204>>2]&3)){c[j+208>>2]=e;e=e+1|0}c[j+212>>2]=-1;g[j+268>>2]=1.0;f=f+1|0}while((f|0)!=(h|0));j=e}else j=0;i=c[b+8>>2]|0;if((i|0)<(j|0)){if((c[b+12>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<3|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+8>>2]|0}if((h|0)>0){f=0;do{m=(c[b+16>>2]|0)+(f<<3)|0;k=c[m+4>>2]|0;l=e+(f<<3)|0;c[l>>2]=c[m>>2];c[l+4>>2]=k;f=f+1|0}while((f|0)!=(h|0))}f=c[b+16>>2]|0;if(f|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=e;c[b+12>>2]=j;f=b+16|0}else f=b+16|0;e=i;do{m=(c[f>>2]|0)+(e<<3)|0;c[m>>2]=0;c[m+4>>2]=0;e=e+1|0}while((e|0)!=(j|0))}c[b+8>>2]=j;if((j|0)>0){f=c[b+16>>2]|0;e=0;do{c[f+(e<<3)>>2]=e;c[f+(e<<3)+4>>2]=1;e=e+1|0}while((e|0)!=(j|0))}e=c[d+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;l=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;if(!l)return;k=xb[c[(c[e>>2]|0)+20>>2]&127](e)|0;if((l|0)<=0)return;d=0;do{e=c[c[k+(d<<4)>>2]>>2]|0;f=c[c[k+(d<<4)+4>>2]>>2]|0;if((e|0?(f|0?(c[e+204>>2]&7|0)==0:0):0)?(c[f+204>>2]&7|0)==0:0){i=c[e+208>>2]|0;e=c[f+208>>2]|0;j=c[b+16>>2]|0;f=c[j+(i<<3)>>2]|0;if((f|0)!=(i|0)){h=j+(i<<3)|0;do{i=j+(f<<3)|0;c[h>>2]=c[i>>2];i=c[i>>2]|0;h=j+(i<<3)|0;f=c[h>>2]|0}while((i|0)!=(f|0))}f=c[j+(e<<3)>>2]|0;if((f|0)!=(e|0)){h=j+(e<<3)|0;do{e=j+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=j+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}if((i|0)!=(e|0)){c[j+(i<<3)>>2]=e;m=j+(e<<3)+4|0;c[m>>2]=(c[m>>2]|0)+(c[j+(i<<3)+4>>2]|0)}}d=d+1|0}while((d|0)!=(l|0));return}function nf(b){b=b|0;var d=0,e=0;c[b>>2]=5536;if(a[b+20>>0]|0){d=c[b+16>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+16>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}if(a[b+12>>0]|0){d=c[b+8>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+28>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+28>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+32>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+32>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+36>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+36>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+40>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+40>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+44>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+44>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+48>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+48>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+52>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+52>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+72>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+72>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+76>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+76>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+68>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+68>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+24>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+24>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function of(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;u=+g[b>>2];t=+g[b+4>>2];s=+g[b+8>>2];r=1.0/+D(+(u*u+t*t+s*s));y=+g[d>>2];x=+g[d+4>>2];w=+g[d+8>>2];v=1.0/+D(+(y*y+x*x+w*w));B=s*r*x*v-t*r*w*v;A=u*r*w*v-s*r*y*v;z=t*r*y*v-u*r*x*v;d=c[a+28>>2]|0;e=+g[d+4>>2];h=+g[d+20>>2];j=+g[d+36>>2];f=+g[d+8>>2];i=+g[d+24>>2];k=+g[d+40>>2];l=+g[d+12>>2];n=+g[d+28>>2];p=+g[d+44>>2];m=-+g[d+52>>2];o=-+g[d+56>>2];q=-+g[d+60>>2];g[a+48>>2]=z*j+(e*B+h*A);g[a+52>>2]=e*y*v+x*v*h+w*v*j;g[a+56>>2]=u*r*e+t*r*h+s*r*j;g[a+60>>2]=0.0;g[a+64>>2]=B*f+A*i+z*k;g[a+68>>2]=y*v*f+x*v*i+w*v*k;g[a+72>>2]=u*r*f+t*r*i+s*r*k;g[a+76>>2]=0.0;g[a+80>>2]=B*l+A*n+z*p;g[a+84>>2]=y*v*l+x*v*n+w*v*p;g[a+88>>2]=u*r*l+t*r*n+s*r*p;g[a+92>>2]=0.0;g[a+96>>2]=e*0.0+h*0.0+j*0.0+(e*m+h*o+j*q);g[a+100>>2]=f*0.0+i*0.0+k*0.0+(f*m+i*o+k*q);g[a+104>>2]=l*0.0+n*0.0+p*0.0+(l*m+n*o+p*q);g[a+108>>2]=0.0;d=c[a+32>>2]|0;q=+g[d+4>>2];p=+g[d+20>>2];o=+g[d+36>>2];n=+g[d+8>>2];m=+g[d+24>>2];l=+g[d+40>>2];k=+g[d+12>>2];i=+g[d+28>>2];f=+g[d+44>>2];j=-+g[d+52>>2];h=-+g[d+56>>2];e=-+g[d+60>>2];g[a+112>>2]=B*q+A*p+z*o;g[a+116>>2]=y*v*q+x*v*p+w*v*o;g[a+120>>2]=u*r*q+t*r*p+s*r*o;g[a+124>>2]=0.0;g[a+128>>2]=B*n+A*m+z*l;g[a+132>>2]=y*v*n+x*v*m+w*v*l;g[a+136>>2]=u*r*n+t*r*m+s*r*l;g[a+140>>2]=0.0;g[a+144>>2]=B*k+A*i+z*f;g[a+148>>2]=y*v*k+x*v*i+w*v*f;g[a+152>>2]=u*r*k+t*r*i+s*r*f;g[a+156>>2]=0.0;g[a+160>>2]=q*0.0+p*0.0+o*0.0+(q*j+p*h+o*e);g[a+164>>2]=n*0.0+m*0.0+l*0.0+(n*j+m*h+l*e);g[a+168>>2]=k*0.0+i*0.0+f*0.0+(k*j+i*h+f*e);g[a+172>>2]=0.0;jd(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0);return}function pf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c[6158]=(c[6158]|0)+1;f=c[b+24>>2]|0;if(!f){if(!(c[e+8>>2]&c[d+4>>2])){b=0;return b|0}if(!(c[d+8>>2]&c[e+4>>2])){b=0;return b|0}}else if(!(Bb[c[(c[f>>2]|0)+8>>2]&63](f,d,e)|0)){b=0;return b|0}k=(c[d+12>>2]|0)>(c[e+12>>2]|0);l=k?e:d;g=c[l+12>>2]|0;k=k?d:e;d=c[k+12>>2]|0;i=(((d<<16|g)+~((d<<16|g)<<15)|0)>>>10^(d<<16|g)+~((d<<16|g)<<15))*9|0;i=((i>>>6^i)+~((i>>>6^i)<<11)|0)>>>16^(i>>>6^i)+~((i>>>6^i)<<11);j=c[b+12>>2]|0;f=c[(c[b+40>>2]|0)+((i&j+-1)<<2)>>2]|0;a:do if((f|0)!=-1){e=c[b+16>>2]|0;while(1){if((c[(c[e+(f<<4)>>2]|0)+12>>2]|0)==(g|0)?(c[(c[e+(f<<4)+4>>2]|0)+12>>2]|0)==(d|0):0)break;f=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}f=e+(f<<4)|0;if(f|0){b=f;return b|0}}while(0);h=c[b+8>>2]|0;if((h|0)==(j|0)){g=j|0?j<<1:1;if((j|0)<(g|0)){if(!g){f=0;d=j}else{c[6995]=(c[6995]|0)+1;f=sc((g<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=c[b+8>>2]|0}if((d|0)>0){e=0;do{m=c[b+16>>2]|0;c[f+(e<<4)>>2]=c[m+(e<<4)>>2];c[f+(e<<4)+4>>2]=c[m+(e<<4)+4>>2];c[f+(e<<4)+8>>2]=c[m+(e<<4)+8>>2];c[f+(e<<4)+12>>2]=c[m+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+16>>2]|0;if(e){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=g;f=g}else{d=j;f=j}}else{d=h;f=j}c[b+8>>2]=d+1;e=c[b+16>>2]|0;d=c[b+68>>2]|0;if(d){Bb[c[(c[d>>2]|0)+8>>2]&63](d,l,k)|0;f=c[b+12>>2]|0}if((j|0)<(f|0)){Kf(b);f=(c[b+12>>2]|0)+-1&i}else f=i&j+-1;m=(c[l+12>>2]|0)<(c[k+12>>2]|0);c[e+(h<<4)>>2]=m?l:k;c[e+(h<<4)+4>>2]=m?k:l;c[e+(h<<4)+8>>2]=0;c[e+(h<<4)+8+4>>2]=0;m=(c[b+40>>2]|0)+(f<<2)|0;c[(c[b+60>>2]|0)+(h<<2)>>2]=c[m>>2];c[m>>2]=h;m=e+(h<<4)|0;return m|0}function qf(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=c[a+108>>2]|0;if(g|0)Sb[c[(c[g>>2]|0)+12>>2]&127](g,c[d+60>>2]|0,f);o=c[d+12>>2]|0;p=c[a+60>>2]|0;n=c[a+92>>2]|0;if(!(xb[c[(c[n>>2]|0)+56>>2]&127](n)|0)){n=c[a+92>>2]|0;Sb[c[(c[n>>2]|0)+16>>2]&127](n,p+((o&65535)<<6)|0,f)}m=e[a+56>>1]|0;l=c[a+60>>2]|0;b[l+54>>1]=(e[l+54>>1]|0)+65534;b[l+56>>1]=(e[l+56>>1]|0)+65534;b[l+58>>1]=(e[l+58>>1]|0)+65534;l=0;d=b[a+6>>1]|0;do{k=a+68+(l<<2)|0;n=c[k>>2]|0;g=e[p+((o&65535)<<6)+54+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;f=b[n+(g<<2)+6>>1]|0;if(!(f<<16>>16))f=n;else{j=(c[a+60>>2]|0)+((e[n+(g<<2)+2>>1]|0)<<6)+54+(l<<1)|0;i=n+(g<<2)|0;while(1){h=i;i=i+4|0;g=b[i>>1]|0;if((d&65535)<(g&65535))break;q=c[a+60>>2]|0;d=f&65535;d=(g&1)==0?q+(d<<6)+48+(l<<1)|0:q+(d<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[j>>1]=(b[j>>1]|0)+1<<16>>16;d=e[h>>1]|e[h+2>>1]<<16;g=e[i>>1]|e[i+2>>1]<<16;b[h>>1]=g;b[h+2>>1]=g>>>16;b[i>>1]=d;b[i+2>>1]=d>>>16;f=b[h+10>>1]|0;if(!(f<<16>>16))break;else d=d&65535}d=b[a+6>>1]|0;f=c[k>>2]|0}g=e[p+((o&65535)<<6)+48+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;i=f+(g<<2)|0;h=b[i+6>>1]|0;if(h<<16>>16){k=(c[a+60>>2]|0)+((e[f+(g<<2)+2>>1]|0)<<6)+48+(l<<1)|0;j=i;f=b[i>>1]|0;while(1){g=j;j=j+4|0;d=b[j>>1]|0;if((f&65535)<(d&65535))break;i=c[a+60>>2]|0;q=h&65535;d=(d&1)==0?i+(q<<6)+48+(l<<1)|0:i+(q<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[k>>1]=(b[k>>1]|0)+1<<16>>16;d=e[g>>1]|e[g+2>>1]<<16;q=e[j>>1]|e[j+2>>1]<<16;b[g>>1]=q;b[g+2>>1]=q>>>16;b[j>>1]=d;b[j+2>>1]=d>>>16;h=b[g+10>>1]|0;if(!(h<<16>>16))break;else f=d&65535}d=b[a+6>>1]|0}b[n+((m<<1)+-1<<2)+2>>1]=0;b[n+((m<<1)+-1<<2)>>1]=d;l=l+1|0}while((l|0)!=3);b[(c[a+60>>2]|0)+((o&65535)<<6)+48>>1]=b[a+64>>1]|0;b[a+64>>1]=o;b[a+56>>1]=(b[a+56>>1]|0)+-1<<16>>16;return}function rf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0;w=l;l=l+32|0;q=c[a+12>>2]|0;r=+g[q+(((e+d|0)/2|0)*24|0)>>2];t=+g[q+(((e+d|0)/2|0)*24|0)+4>>2];u=+g[q+(((e+d|0)/2|0)*24|0)+8>>2];v=+g[q+(((e+d|0)/2|0)*24|0)+16>>2];s=c[q+(((e+d|0)/2|0)*24|0)+20>>2]|0;f=e;h=d;while(1){m=+g[b>>2];n=+g[b+4>>2];o=+g[b+8>>2];p=(r-m)*(r-m)+(t-n)*(t-n)+(u-o)*(u-o);a:while(1){i=+g[q+(h*24|0)+16>>2];do if(i!=v){if(!(i>2]-m;j=+g[q+(h*24|0)+4>>2]-n;k=+g[q+(h*24|0)+8>>2]-o;if(i*i+j*j+k*k!=p)if(i*i+j*j+k*k>2]|0)<(s|0))break;else break a}while(0);h=h+1|0}b:while(1){i=+g[q+(f*24|0)+16>>2];do if(v!=i){if(!(v>2]-m;j=+g[q+(f*24|0)+4>>2]-n;k=+g[q+(f*24|0)+8>>2]-o;if(p!=i*i+j*j+k*k)if(p>2]|0))break;else break b}while(0);f=f+-1|0}if((h|0)<=(f|0)){x=q+(h*24|0)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];q=q+(f*24|0)|0;c[x>>2]=c[q>>2];c[x+4>>2]=c[q+4>>2];c[x+8>>2]=c[q+8>>2];c[x+12>>2]=c[q+12>>2];c[x+16>>2]=c[q+16>>2];c[x+20>>2]=c[q+20>>2];q=(c[a+12>>2]|0)+(f*24|0)|0;c[q>>2]=c[w>>2];c[q+4>>2]=c[w+4>>2];c[q+8>>2]=c[w+8>>2];c[q+12>>2]=c[w+12>>2];c[q+16>>2]=c[w+16>>2];c[q+20>>2]=c[w+20>>2];f=f+-1|0;h=h+1|0}if((h|0)>(f|0))break;q=c[a+12>>2]|0}if((f|0)>(d|0))rf(a,b,d,f);if((h|0)>=(e|0)){l=w;return}rf(a,b,h,e);l=w;return}function sf(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;j=c[a+28>>2]|0;k=c[a+32>>2]|0;e=c[b+8>>2]|0;g[e>>2]=1.0;h=c[b+24>>2]|0;g[e+(h+1<<2)>>2]=1.0;g[e+((h<<1)+2<<2)>>2]=1.0;l=+g[a+300>>2];q=+g[a+304>>2];f=+g[a+308>>2];o=+g[j+4>>2]*l+ +g[j+8>>2]*q+ +g[j+12>>2]*f;m=l*+g[j+20>>2]+q*+g[j+24>>2]+f*+g[j+28>>2];f=l*+g[j+36>>2]+q*+g[j+40>>2]+f*+g[j+44>>2];e=c[b+12>>2]|0;c[e>>2]=0;g[e+4>>2]=f;g[e+8>>2]=-m;g[e+12>>2]=0.0;g[e+(h<<2)>>2]=-f;c[e+(h<<2)+4>>2]=0;g[e+(h<<2)+8>>2]=o;g[e+(h<<2)+12>>2]=0.0;g[e+(h<<1<<2)>>2]=m;g[e+(h<<1<<2)+4>>2]=-o;c[e+(h<<1<<2)+8>>2]=0;g[e+(h<<1<<2)+12>>2]=0.0;e=c[b+16>>2]|0;g[e>>2]=-1.0;g[e+(h+1<<2)>>2]=-1.0;g[e+((h<<1)+2<<2)>>2]=-1.0;q=+g[a+316>>2];l=+g[a+320>>2];d=+g[a+324>>2];p=+g[k+4>>2]*q+ +g[k+8>>2]*l+ +g[k+12>>2]*d;n=q*+g[k+20>>2]+l*+g[k+24>>2]+d*+g[k+28>>2];d=q*+g[k+36>>2]+l*+g[k+40>>2]+d*+g[k+44>>2];h=c[b+20>>2]|0;e=c[b+24>>2]|0;c[h>>2]=0;g[h+4>>2]=-d;g[h+8>>2]=n;g[h+12>>2]=0.0;g[h+(e<<2)>>2]=d;c[h+(e<<2)+4>>2]=0;g[h+(e<<2)+8>>2]=-p;g[h+(e<<2)+12>>2]=0.0;g[h+(e<<1<<2)>>2]=-n;g[h+(e<<1<<2)+4>>2]=p;c[h+(e<<1<<2)+8>>2]=0;g[h+(e<<1<<2)+12>>2]=0.0;h=c[a+332>>2]|0;l=+g[(h&1|0?a+336|0:b+4|0)>>2]*+g[b>>2];i=c[b+28>>2]|0;g[i>>2]=l*(p+ +g[k+52>>2]-o-+g[j+52>>2]);g[i+(e<<2)>>2]=l*(n+ +g[k+56>>2]-m-+g[j+56>>2]);g[i+(e<<1<<2)>>2]=l*(d+ +g[k+60>>2]-f-+g[j+60>>2]);if(h&2|0){k=c[b+32>>2]|0;c[k>>2]=c[a+340>>2];c[k+(e<<2)>>2]=c[a+340>>2];c[k+(e<<1<<2)>>2]=c[a+340>>2]}f=+g[a+356>>2];if(f>0.0){g[c[b+36>>2]>>2]=-f;g[c[b+40>>2]>>2]=f;d=+g[a+356>>2]}else d=f;if(d>0.0){g[(c[b+36>>2]|0)+(e<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<2)>>2]=f;d=+g[a+356>>2]}if(!(d>0.0)){j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}g[(c[b+36>>2]|0)+(e<<1<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<1<<2)>>2]=f;j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}function tf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;a[q+16>>0]=1;c[q+12>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;e=c[b+8>>2]|0;if((e|0)>0){o=0;i=0;h=0;g=0;f=0;while(1){m=c[b+16>>2]|0;n=m+(o<<4)|0;if((g|0)==(f|0)){j=f|0?f<<1:1;if((f|0)<(j|0)){if(j){c[6995]=(c[6995]|0)+1;e=sc((j<<4|3)+16|0)|0;if(!e){i=0;f=g}else{c[(e+4+15&-16)+-4>>2]=e;i=e+4+15&-16;f=g}}else i=0;if((f|0)>0){e=0;do{k=c[q+12>>2]|0;c[i+(e<<4)>>2]=c[k+(e<<4)>>2];c[i+(e<<4)+4>>2]=c[k+(e<<4)+4>>2];c[i+(e<<4)+8>>2]=c[k+(e<<4)+8>>2];c[i+(e<<4)+12>>2]=c[k+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[q+12>>2]|0;if(!e)g=f;else{c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0}c[q+12>>2]=i;k=j;h=j;j=g;f=i;e=c[b+8>>2]|0}else{k=f;j=f;f=i}}else{k=f;j=g;f=i}c[f+(j<<4)>>2]=c[n>>2];c[f+(j<<4)+4>>2]=c[m+(o<<4)+4>>2];c[f+(j<<4)+8>>2]=c[m+(o<<4)+8>>2];c[f+(j<<4)+12>>2]=c[m+(o<<4)+12>>2];g=j+1|0;o=o+1|0;if((o|0)>=(e|0))break;else{i=f;f=k}}c[q+4>>2]=g;a[q+16>>0]=1;c[q+8>>2]=h;if((j|0)>-1){f=c[q+12>>2]|0;e=0;while(1){Cb[c[(c[b>>2]|0)+12>>2]&31](b,c[f+(e<<4)>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;if((e|0)<(j|0))e=e+1|0;else break}}}else g=0;if((c[b+52>>2]|0)>0){f=c[b+60>>2]|0;e=0;do{c[f+(e<<2)>>2]=-1;e=e+1|0}while((e|0)<(c[b+52>>2]|0))}if((g|0)<=1)if((g|0)<=0){e=c[q+12>>2]|0;if(!e){l=q;return}}else p=23;else{te(q,0,g+-1|0);p=23}if((p|0)==23){e=c[q+12>>2]|0;f=0;do{Bb[c[(c[b>>2]|0)+8>>2]&63](b,c[e+(f<<4)>>2]|0,c[e+(f<<4)+4>>2]|0)|0;f=f+1|0}while((f|0)<(g|0))}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0;l=q;return}function uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;B=(a[b+68>>0]|0)!=0;C=B?e:d;B=B?d:e;z=c[b+52>>2]|0;if((z|0)<=0){x=1.0;return +x}A=(c[C+192>>2]|0)+28|0;j=+g[C+4>>2];u=+g[C+8>>2];v=+g[C+12>>2];w=c[C+16>>2]|0;x=+g[C+20>>2];k=+g[C+24>>2];l=+g[C+28>>2];e=c[C+32>>2]|0;m=+g[C+36>>2];n=+g[C+40>>2];o=+g[C+44>>2];p=c[C+48>>2]|0;q=+g[C+52>>2];r=+g[C+56>>2];s=+g[C+60>>2];t=c[C+64>>2]|0;i=1.0;d=0;y=c[C+304>>2]|0;do{E=c[A>>2]|0;P=+g[E+(d*80|0)>>2];O=+g[E+(d*80|0)+16>>2];N=+g[E+(d*80|0)+32>>2];M=+g[E+(d*80|0)+4>>2];L=+g[E+(d*80|0)+20>>2];K=+g[E+(d*80|0)+36>>2];J=+g[E+(d*80|0)+8>>2];I=+g[E+(d*80|0)+24>>2];H=+g[E+(d*80|0)+40>>2];G=+g[E+(d*80|0)+48>>2];F=+g[E+(d*80|0)+52>>2];D=+g[E+(d*80|0)+56>>2];c[C+304>>2]=y+1;g[C+4>>2]=j*P+u*O+v*N;g[C+8>>2]=j*M+u*L+v*K;g[C+12>>2]=j*J+u*I+v*H;g[C+16>>2]=0.0;g[C+20>>2]=x*P+k*O+l*N;g[C+24>>2]=x*M+k*L+l*K;g[C+28>>2]=x*J+k*I+l*H;g[C+32>>2]=0.0;g[C+36>>2]=m*P+n*O+o*N;g[C+40>>2]=m*M+n*L+o*K;g[C+44>>2]=m*J+n*I+o*H;g[C+48>>2]=0.0;g[C+52>>2]=q+(j*G+u*F+v*D);g[C+56>>2]=r+(x*G+k*F+l*D);g[C+60>>2]=s+(m*G+n*F+o*D);g[C+64>>2]=0.0;E=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;D=+tb[c[(c[E>>2]|0)+12>>2]&15](E,C,B,f,h);i=D>2]|0)+1|0;c[C+304>>2]=y;g[C+4>>2]=j;g[C+8>>2]=u;g[C+12>>2]=v;c[C+16>>2]=w;g[C+20>>2]=x;g[C+24>>2]=k;g[C+28>>2]=l;c[C+32>>2]=e;g[C+36>>2]=m;g[C+40>>2]=n;g[C+44>>2]=o;c[C+48>>2]=p;g[C+52>>2]=q;g[C+56>>2]=r;g[C+60>>2]=s;c[C+64>>2]=t;d=d+1|0}while((d|0)!=(z|0));return +i}function vf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=lt()|0;c[i+4>>2]=7;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4884;a[i+48>>0]=0;c[i+52>>2]=c[e>>2];c[i+52+4>>2]=c[e+4>>2];c[i+52+8>>2]=c[e+8>>2];c[i+52+12>>2]=c[e+12>>2];c[i+68>>2]=c[e+16>>2];c[i+68+4>>2]=c[e+16+4>>2];c[i+68+8>>2]=c[e+16+8>>2];c[i+68+12>>2]=c[e+16+12>>2];c[i+84>>2]=c[e+32>>2];c[i+84+4>>2]=c[e+32+4>>2];c[i+84+8>>2]=c[e+32+8>>2];c[i+84+12>>2]=c[e+32+12>>2];c[i+100>>2]=c[e+48>>2];c[i+100+4>>2]=c[e+48+4>>2];c[i+100+8>>2]=c[e+48+8>>2];c[i+100+12>>2]=c[e+48+12>>2];c[i+116>>2]=c[f>>2];c[i+116+4>>2]=c[f+4>>2];c[i+116+8>>2]=c[f+8>>2];c[i+116+12>>2]=c[f+12>>2];c[i+132>>2]=c[f+16>>2];c[i+132+4>>2]=c[f+16+4>>2];c[i+132+8>>2]=c[f+16+8>>2];c[i+132+12>>2]=c[f+16+12>>2];c[i+148>>2]=c[f+32>>2];c[i+148+4>>2]=c[f+32+4>>2];c[i+148+8>>2]=c[f+32+8>>2];c[i+148+12>>2]=c[f+32+12>>2];c[i+164>>2]=c[f+48>>2];c[i+164+4>>2]=c[f+48+4>>2];c[i+164+8>>2]=c[f+48+8>>2];c[i+164+12>>2]=c[f+48+12>>2];a[i+180>>0]=h&1;g[i+184>>2]=1.0;g[i+188>>2]=-1.0;g[i+192>>2]=0.0;g[i+196>>2]=0.0;g[i+200>>2]=1.0;g[i+204>>2]=.699999988079071;g[i+208>>2]=0.0;g[i+212>>2]=0.0;g[i+216>>2]=1.0;g[i+220>>2]=.699999988079071;g[i+224>>2]=0.0;g[i+228>>2]=0.0;g[i+264>>2]=1.0;g[i+268>>2]=.699999988079071;g[i+272>>2]=1.0;g[i+276>>2]=0.0;g[i+280>>2]=1.0;g[i+284>>2]=.699999988079071;g[i+288>>2]=1.0;g[i+292>>2]=0.0;g[i+232>>2]=1.0;g[i+236>>2]=.699999988079071;g[i+240>>2]=1.0;g[i+244>>2]=0.0;g[i+248>>2]=1.0;g[i+252>>2]=.699999988079071;g[i+256>>2]=1.0;g[i+260>>2]=0.0;a[i+1096>>0]=0;g[i+1116>>2]=0.0;g[i+1120>>2]=0.0;g[i+1124>>2]=0.0;c[i+300>>2]=0;c[i+1100>>2]=0;c[i+1100+4>>2]=0;c[i+1100+8>>2]=0;a[i+1100+12>>0]=0;a[i+49>>0]=1;Zc(i,(c[i+28>>2]|0)+4|0,(c[i+32>>2]|0)+4|0);return i|0}function wf(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+64|0;Tg(c[b+108>>2]|0,d,0);e=+g[d+204>>2]+ +g[d+212>>2];h=e*+g[d+56>>2]+ +g[d+40>>2];i=e*+g[d+60>>2]+ +g[d+44>>2];g[d+16>>2]=+g[d+52>>2]*e+ +g[d+36>>2];g[d+20>>2]=h;g[d+24>>2]=i;g[d+28>>2]=0.0;g[j+32>>2]=-1.0;k=c[b+92>>2]|0;k=Cb[c[(c[k>>2]|0)+8>>2]&31](k,d+36|0,d+16|0,j)|0;c[d+88>>2]=0;if(!k){c[d+32>>2]=c[d+204>>2];g[d+272>>2]=0.0;h=-+g[d+56>>2];i=-+g[d+60>>2];g[d>>2]=-+g[d+52>>2];g[d+4>>2]=h;g[d+8>>2]=i;g[d+12>>2]=0.0;i=-1.0;h=1.0;k=d+268|0;g[k>>2]=h;l=j;return +i}f=e*+g[j+32>>2];c[d>>2]=c[j+16>>2];c[d+4>>2]=c[j+16+4>>2];c[d+8>>2]=c[j+16+8>>2];c[d+12>>2]=c[j+16+12>>2];a[d+84>>0]=1;if((a[22488]|0)==0?Uz(22488)|0:0){c[j+40>>2]=0;c[j+40+4>>2]=0;c[j+40+8>>2]=0;c[j+40+12>>2]=0;ef(23848,0.0,0,0,j+40|0)}c[6013]=c[6013]|1;g[6063]=0.0;e=+g[6073]*0.0;h=+g[6074]*0.0;g[6068]=+g[6072]*0.0;g[6069]=e;g[6070]=h;g[6071]=0.0;c[6076]=0;c[6077]=0;c[6078]=0;c[6079]=0;h=+g[6065]*0.0;e=+g[6066]*0.0;g[6117]=+g[6064]*0.0;g[6118]=h;g[6119]=e;g[6120]=0.0;c[d+88>>2]=23848;e=f-+g[d+212>>2];g[d+32>>2]=e;h=+g[d+204>>2];i=+g[d+208>>2]*.009999999776482582;if(e>2]=h-i;e=h-i}if(e>h+i)g[d+32>>2]=h+i;c[d+16>>2]=c[j>>2];c[d+16+4>>2]=c[j+4>>2];c[d+16+8>>2]=c[j+8>>2];c[d+16+12>>2]=c[j+12>>2];s=+g[d>>2];r=+g[d+4>>2];o=+g[d+8>>2];h=s*+g[d+52>>2]+r*+g[d+56>>2]+o*+g[d+60>>2];k=c[b+108>>2]|0;e=+g[d+16>>2]-+g[k+52>>2];n=+g[d+20>>2]-+g[k+56>>2];p=+g[d+24>>2]-+g[k+60>>2];i=+g[k+392>>2];q=+g[k+396>>2];m=+g[k+388>>2];g[d+272>>2]=!(h>=-.10000000149011612)?-1.0/h*(s*(i*p-n*q+ +g[k+372>>2])+r*(+g[k+376>>2]+(e*q-p*m))+o*(n*m-e*i+ +g[k+380>>2])):0.0;i=f;h=!(h>=-.10000000149011612)?-1.0/h:10.0;k=d+268|0;g[k>>2]=h;l=j;return +i}function xf(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+64|0;e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+4|0,o+48|0,o+32|0);h=+g[o+48>>2]+-.019999999552965164;g[o+48>>2]=h;i=+g[o+48+4>>2]+-.019999999552965164;g[o+48+4>>2]=i;j=+g[o+48+8>>2]+-.019999999552965164;g[o+48+8>>2]=j;f=+g[o+32>>2]+.019999999552965164;g[o+32>>2]=f;k=+g[o+32+4>>2]+.019999999552965164;g[o+32+4>>2]=k;m=+g[o+32+8>>2]+.019999999552965164;g[o+32+8>>2]=m;if(((a[b+44>>0]|0)!=0?(c[d+252>>2]|0)==2:0)?(c[d+204>>2]&3|0)==0:0){e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+68|0,o+16|0,o);h=+g[o+16>>2]+-.019999999552965164;g[o+16>>2]=h;j=+g[o+16+4>>2]+-.019999999552965164;g[o+16+4>>2]=j;k=+g[o+16+8>>2]+-.019999999552965164;g[o+16+8>>2]=k;f=+g[o>>2]+.019999999552965164;g[o>>2]=f;m=+g[o+4>>2]+.019999999552965164;g[o+4>>2]=m;n=+g[o+8>>2]+.019999999552965164;g[o+8>>2]=n;i=+g[o+48>>2];if(h>2]=h;else h=i;i=+g[o+48+4>>2];if(j>2]=j;i=j}j=+g[o+48+8>>2];if(k>2]=k;j=k}k=+g[o+16+12>>2];if(k<+g[o+48+12>>2])g[o+48+12>>2]=k;k=+g[o+32>>2];if(k>2]=f;else f=k;k=+g[o+32+4>>2];if(k>2]=m;k=m}m=+g[o+32+8>>2];if(m>2]=n;m=n}n=+g[o+12>>2];if(+g[o+32+12>>2]>2]=n}e=c[b+68>>2]|0;if((c[d+204>>2]&1|0)==0?(h=f-h,k=k-i,n=m-j,!(h*h+k*k+n*n<999999995904.0)):0){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=5;if(!(a[14696]|0)){l=o;return}e=c[b+72>>2]|0;if(!e){l=o;return}a[14696]=0;Ob[c[(c[e>>2]|0)+44>>2]&127](e,14697);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14746);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14814);b=c[b+72>>2]|0;Ob[c[(c[b>>2]|0)+44>>2]&127](b,14879);l=o;return}Zb[c[(c[e>>2]|0)+16>>2]&31](e,c[d+188>>2]|0,o+48|0,o+32|0,c[b+24>>2]|0);l=o;return}function yf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;b=l;l=l+608|0;p=+g[d+116>>2]-+g[d+52>>2];o=+g[d+120>>2]-+g[d+56>>2];n=+g[d+124>>2]-+g[d+60>>2];i=+g[e+116>>2]-+g[e+52>>2];j=+g[e+120>>2]-+g[e+56>>2];k=+g[e+124>>2]-+g[e+60>>2];m=+g[d+276>>2];if(p*p+o*o+n*n>2],i*i+j*j+k*k>2]|0;f=c[e+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;q=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[b+552+32>>2]=f;c[b+552+48>>2]=f;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=h;c[b+12>>2]=b+552;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){i=+g[b+376+164>>2];if(+g[d+268>>2]>i)g[d+268>>2]=i;if(+g[e+268>>2]>i)g[e+268>>2]=i;if(!(i<1.0))i=1.0}else i=1.0;q=c[e+192>>2]|0;h=c[d+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;f=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[b+552+32>>2]=h;c[b+552+48>>2]=h;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=b+552;c[b+12>>2]=q;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){j=+g[b+376+164>>2];if(+g[d+268>>2]>j)g[d+268>>2]=j;if(+g[e+268>>2]>j)g[e+268>>2]=j;if(i>j)i=j}p=i;l=b;return +p}function zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Us(480)|0;Vd(i,b,d,e);c[i>>2]=4080;a[i+360>>0]=1;c[i+356>>2]=0;c[i+348>>2]=0;c[i+352>>2]=0;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;g[i+384>>2]=1.0e3;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+388+16>>2]=0;c[i+388+20>>2]=0;c[i+388+24>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;a[i+444>>0]=1;c[i+440>>2]=0;c[i+432>>2]=0;c[i+436>>2]=0;c[i+472>>2]=h;a[i+476>>0]=0;if(!h){c[6995]=(c[6995]|0)+1;f=sc(59)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}g[f+12>>2]=1.0;c[f+8>>2]=0;c[f+4>>2]=5;c[f>>2]=3172;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+16>>0]=1;c[i+472>>2]=f;a[i+476>>0]=1}c[i+364>>2]=4302;a[i+368>>0]=1;a[i+369>>0]=0;a[i+370>>0]=0;c[i+404>>2]=d;c[i+408>>2]=b;Bi(i+428|0);h=c[i+432>>2]|0;if((h|0)>0)e=0;else{d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}do{d=(c[i+440>>2]|0)+(e<<2)|0;f=c[d>>2]|0;c[d>>2]=0;if(f|0)do{d=f;f=c[f+280>>2]|0;cJ(d)}while((f|0)!=0);e=e+1|0}while((e|0)!=(h|0));d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}function Af(a,b,d,e,f,h,i){a=a|0;b=+b;d=+d;e=+e;f=f|0;h=+h;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0;s=l;l=l+16|0;j=d*h+ +g[a+52>>2];d=e*h+ +g[a+56>>2];g[i+48>>2]=b*h+ +g[a+48>>2];g[i+52>>2]=j;g[i+56>>2]=d;g[i+60>>2]=0.0;d=+g[f>>2];j=+g[f+4>>2];k=+g[f+8>>2];if(d*d+j*j+k*k>1.1920928955078125e-07)b=+D(+(d*d+j*j+k*k));else b=0.0;e=b*h>.7853981852531433?.7853981852531433/h:b;if(e<1.0000000474974513e-03)b=h*.5-e*h*h*h*.02083333395421505*e;else b=+G(+(e*.5*h))/e;r=b*d;q=b*j;p=b*k;d=+F(+(e*h*.5));yh(a,s);e=+g[s>>2];j=+g[s+12>>2];k=+g[s+8>>2];h=+g[s+4>>2];b=(d*j-r*e-q*h-p*k)*(d*j-r*e-q*h-p*k)+((p*j+d*k+r*h-q*e)*(p*j+d*k+r*h-q*e)+((d*e+r*j+q*k-p*h)*(d*e+r*j+q*k-p*h)+(p*e+(q*j+d*h)-r*k)*(p*e+(q*j+d*h)-r*k)));if(b>1.1920928955078125e-07){b=1.0/+D(+b);m=(d*e+r*j+q*k-p*h)*b;n=(p*j+d*k+r*h-q*e)*b;o=(d*j-r*e-q*h-p*k)*b;b=(p*e+(q*j+d*h)-r*k)*b}else{m=d*e+r*j+q*k-p*h;n=p*j+d*k+r*h-q*e;o=d*j-r*e-q*h-p*k;b=p*e+(q*j+d*h)-r*k}d=o*o+(n*n+(b*b+m*m));if(d>1.1920928955078125e-07){q=m*(2.0/d);r=b*(2.0/d);e=n*(2.0/d);p=o*q;h=o*r;k=o*e;q=m*q;j=m*r;m=m*e;r=b*r;o=b*e;n=n*e;g[i>>2]=1.0-(r+n);g[i+4>>2]=j-k;g[i+8>>2]=m+h;g[i+12>>2]=0.0;g[i+16>>2]=j+k;g[i+20>>2]=1.0-(q+n);g[i+24>>2]=o-p;g[i+28>>2]=0.0;g[i+32>>2]=m-h;g[i+36>>2]=o+p;g[i+40>>2]=1.0-(q+r);g[i+44>>2]=0.0;l=s;return}else{c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[i+16>>2]=c[a+16>>2];c[i+16+4>>2]=c[a+16+4>>2];c[i+16+8>>2]=c[a+16+8>>2];c[i+16+12>>2]=c[a+16+12>>2];c[i+32>>2]=c[a+32>>2];c[i+32+4>>2]=c[a+32+4>>2];c[i+32+8>>2]=c[a+32+8>>2];c[i+32+12>>2]=c[a+32+12>>2];l=s;return}}function Bf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0;x=l;l=l+256|0;if(!a){l=x;return}p=+g[b>>2];q=+g[b+4>>2];r=+g[b+8>>2];s=+g[b+16>>2];t=+g[b+20>>2];o=+g[b+24>>2];c[x>>2]=a;a=64;n=1;e=x;b=0;while(1){m=n+-1|0;j=c[e+(m<<2)>>2]|0;do if(((((+g[j>>2]<=s?+g[j+16>>2]>=p:0)?+g[j+4>>2]<=t:0)?+g[j+20>>2]>=q:0)?+g[j+8>>2]<=o:0)?+g[j+24>>2]>=r:0){if(!(c[j+40>>2]|0)){Ob[c[(c[d>>2]|0)+12>>2]&127](d,j);f=m;break}i=c[j+36>>2]|0;do if((m|0)==(a|0)?(u=a|0?a<<1:1,(n|0)<=(u|0)):0){if((u|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((u<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;h=v+4+15&-16}else h=0;if((n|0)>1){f=0;do{c[h+(f<<2)>>2]=c[e+(f<<2)>>2];f=f+1|0}while((f|0)!=(a|0));if(!(b<<24>>24)){a=u;k=1;break}}else if((e|0)==0|b<<24>>24==0){a=u;k=1;break}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);a=u;k=1}else{h=e;k=b}while(0);c[h+(m<<2)>>2]=i;f=c[j+40>>2]|0;do if((n|0)==(a|0)){a=n|0?n<<1:1;if((n|0)<(a|0)){if((a|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((a<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;e=w+4+15&-16}else e=0;if((n|0)>0){b=0;do{c[e+(b<<2)>>2]=c[h+(b<<2)>>2];b=b+1|0}while((b|0)!=(n|0));if(!(k<<24>>24)){b=1;break}}else if((h|0)==0|k<<24>>24==0){b=1;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);b=1}else{a=n;e=h;b=k}}else{e=h;b=k}while(0);c[e+(n<<2)>>2]=f;f=n+1|0}else f=m;while(0);if((f|0)>0)n=f;else break}if((e|0)==0|b<<24>>24==0){l=x;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=x;return}function Cf(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];c[b+276>>2]=c[a+1316>>2];c[b+324>>2]=c[a+1364>>2];c[b+252>>2]=d[a+1309>>0];c[b+300>>2]=c[a+1340>>2];c[b+280>>2]=c[a+1320>>2];c[b+328>>2]=c[a+1368>>2];c[b+256>>2]=d[a+1310>>0];c[b+304>>2]=c[a+1344>>2];c[b+284>>2]=c[a+1324>>2];c[b+332>>2]=c[a+1372>>2];c[b+260>>2]=d[a+1311>>0];c[b+308>>2]=c[a+1348>>2];c[b+288>>2]=c[a+1328>>2];c[b+336>>2]=c[a+1376>>2];c[b+264>>2]=d[a+1312>>0];c[b+312>>2]=c[a+1352>>2];c[b+292>>2]=c[a+1332>>2];c[b+340>>2]=c[a+1380>>2];c[b+268>>2]=d[a+1313>>0];c[b+316>>2]=c[a+1356>>2];c[b+296>>2]=c[a+1336>>2];c[b+344>>2]=c[a+1384>>2];c[b+272>>2]=d[a+1314>>0];c[b+320>>2]=c[a+1360>>2];return 12447}function Df(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=c[b+220>>2]|0;Sb[c[(c[k>>2]|0)+8>>2]&127](k,b,c[b+24>>2]|0);k=c[b+324>>2]|0;if((k|0)>0){j=c[b+332>>2]|0;i=0;do{e=c[j+(i<<2)>>2]|0;d=c[e+772>>2]|0;e=c[e+776>>2]|0;if((d|0?(e|0?(c[d+204>>2]&3|0)==0:0):0)?(c[e+204>>2]&3|0)==0:0){g=c[d+208>>2]|0;d=c[e+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(g<<3)>>2]|0;if((e|0)!=(g|0)){f=h+(g<<3)|0;do{g=h+(e<<3)|0;c[f>>2]=c[g>>2];g=c[g>>2]|0;f=h+(g<<3)|0;e=c[f>>2]|0}while((g|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){f=h+(d<<3)|0;do{d=h+(e<<3)|0;c[f>>2]=c[d>>2];d=c[d>>2]|0;f=h+(d<<3)|0;e=c[f>>2]|0}while((d|0)!=(e|0))}if((g|0)!=(d|0)){c[h+(g<<3)>>2]=d;f=h+(d<<3)+4|0;c[f>>2]=(c[f>>2]|0)+(c[h+(g<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0))}k=c[b+228>>2]|0;if((k|0)<=0){m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}j=c[b+236>>2]|0;i=0;do{d=c[j+(i<<2)>>2]|0;if((a[d+20>>0]|0?(l=c[d+28>>2]|0,(c[l+204>>2]&3|0)==0):0)?(m=c[d+32>>2]|0,(c[m+204>>2]&3|0)==0):0){f=c[l+208>>2]|0;d=c[m+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(f<<3)>>2]|0;if((e|0)!=(f|0)){g=h+(f<<3)|0;do{f=h+(e<<3)|0;c[g>>2]=c[f>>2];f=c[f>>2]|0;g=h+(f<<3)|0;e=c[g>>2]|0}while((f|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){g=h+(d<<3)|0;do{d=h+(e<<3)|0;c[g>>2]=c[d>>2];d=c[d>>2]|0;g=h+(d<<3)|0;e=c[g>>2]|0}while((d|0)!=(e|0))}if((f|0)!=(d|0)){c[h+(f<<3)>>2]=d;g=h+(d<<3)+4|0;c[g>>2]=(c[g>>2]|0)+(c[h+(f<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0));m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}function Ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6157]=(c[6157]|0)+1;k=(c[b+12>>2]|0)>(c[d+12>>2]|0);n=k?d:b;h=c[n+12>>2]|0;k=k?b:d;f=c[k+12>>2]|0;j=(((f<<16|h)+~((f<<16|h)<<15)|0)>>>10^(f<<16|h)+~((f<<16|h)<<15))*9|0;j=(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11))&(c[a+12>>2]|0)+-1;b=c[(c[a+40>>2]|0)+(j<<2)>>2]|0;if((b|0)==-1){a=0;return a|0}g=c[a+16>>2]|0;d=b;while(1){if((c[(c[g+(d<<4)>>2]|0)+12>>2]|0)==(h|0)?(c[(c[g+(d<<4)+4>>2]|0)+12>>2]|0)==(f|0):0)break;b=c[(c[a+60>>2]|0)+(d<<2)>>2]|0;if((b|0)==-1){b=0;i=22;break}else d=b}if((i|0)==22)return b|0;b=g+(d<<4)|0;if(!b){a=0;return a|0}Sb[c[(c[a>>2]|0)+32>>2]&127](a,b,e);m=c[g+(d<<4)+12>>2]|0;l=b-(c[a+16>>2]|0)>>4;d=j;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(l|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(j<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(l<<2)>>2];i=(c[a+8>>2]|0)+-1|0;b=c[a+68>>2]|0;if(b|0)Cb[c[(c[b>>2]|0)+12>>2]&31](b,n,k,e)|0;if((i|0)==(l|0)){c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}h=c[a+16>>2]|0;g=c[(c[h+(i<<4)+4>>2]|0)+12>>2]<<16|c[(c[h+(i<<4)>>2]|0)+12>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;d=g;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(i|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(g<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(i<<2)>>2];c[h+(l<<4)>>2]=c[h+(i<<4)>>2];c[h+(l<<4)+4>>2]=c[h+(i<<4)+4>>2];c[h+(l<<4)+8>>2]=c[h+(i<<4)+8>>2];c[h+(l<<4)+12>>2]=c[h+(i<<4)+12>>2];e=(c[a+40>>2]|0)+(g<<2)|0;c[(c[a+60>>2]|0)+(l<<2)>>2]=c[e>>2];c[e>>2]=l;c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}function Ff(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0;f=l;l=l+784|0;c[f+720>>2]=1065353216;c[f+720+4>>2]=0;c[f+720+4+4>>2]=0;c[f+720+4+8>>2]=0;c[f+720+4+12>>2]=0;c[f+720+20>>2]=1065353216;c[f+720+24>>2]=0;c[f+720+24+4>>2]=0;c[f+720+24+8>>2]=0;c[f+720+24+12>>2]=0;c[f+720+40>>2]=1065353216;e=f+720+44|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[f+544>>2]=3896;c[f+544+168>>2]=0;g[f+544+172>>2]=0.0;c[f+544+164>>2]=c[b+200>>2];e=c[b+196>>2]|0;c[f+488+8>>2]=0;c[f+488+12>>2]=-1;i=f+488+28|0;c[f+488>>2]=7020;c[f+488+4>>2]=8;c[f+488+16>>2]=1065353216;c[f+488+20>>2]=1065353216;c[f+488+24>>2]=1065353216;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[i+16>>2]=0;c[f+488+32>>2]=e;c[f+488+48>>2]=e;g[f+488+52>>2]=0.0;c[f+376+8>>2]=0;c[f+376+12>>2]=-1;c[f+376+16>>2]=1065353216;c[f+376+20>>2]=1065353216;c[f+376+24>>2]=1065353216;g[f+376+28>>2]=0.0;g[f+376+48>>2]=.03999999910593033;c[f+376+56>>2]=0;c[f+376>>2]=3924;c[f+376+4>>2]=1;c[f+376+60>>2]=c[d>>2];c[f+376+60+4>>2]=c[d+4>>2];c[f+376+60+8>>2]=c[d+8>>2];c[f+376+60+12>>2]=c[d+12>>2];c[f+376+76>>2]=c[d+16>>2];c[f+376+76+4>>2]=c[d+16+4>>2];c[f+376+76+8>>2]=c[d+16+8>>2];c[f+376+76+12>>2]=c[d+16+12>>2];c[f+376+92>>2]=c[d+32>>2];c[f+376+92+4>>2]=c[d+32+4>>2];c[f+376+92+8>>2]=c[d+32+8>>2];c[f+376+92+12>>2]=c[d+32+12>>2];g[f+16+308>>2]=9.999999747378752e-05;a[f+16+332>>0]=0;c[f>>2]=5276;c[f+4>>2]=f+16;c[f+8>>2]=f+488;c[f+12>>2]=f+376;if(fd(f,b+4|0,b+68|0,f+720|0,f+720|0,f+544|0)|0?(h=+g[f+544+164>>2],+g[b+200>>2]>h):0)g[b+200>>2]=h;c[f+376>>2]=7472;e=c[f+376+56>>2]|0;if(!e){l=f;return}Ib[c[c[e>>2]>>2]&511](e);e=c[f+376+56>>2]|0;if(!e){l=f;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=f;return}function Gf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=c[b+4>>2]|0;if((i|0)==(c[b+8>>2]|0)?(h=i|0?i<<1:1,(i|0)<(h|0)):0){if(!h){e=0;g=i}else{c[6995]=(c[6995]|0)+1;e=sc((h*244|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=c[b+4>>2]|0}if((g|0)>0){f=0;do{k=e+(f*244|0)|0;j=c[b+12>>2]|0;l=j+(f*244|0)|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=j+(f*244|0)+16|0;l=e+(f*244|0)+16|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];l=j+(f*244|0)+32|0;k=e+(f*244|0)+32|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=e+(f*244|0)+48|0;l=j+(f*244|0)+48|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];gi(e+(f*244|0)+64|0,j+(f*244|0)+64|0,180)|0;f=f+1|0}while((f|0)!=(g|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=h;e=c[b+4>>2]|0}else e=i;c[b+4>>2]=e+1;l=c[b+12>>2]|0;c[l+(i*244|0)>>2]=c[d>>2];c[l+(i*244|0)+4>>2]=c[d+4>>2];c[l+(i*244|0)+8>>2]=c[d+8>>2];c[l+(i*244|0)+12>>2]=c[d+12>>2];c[l+(i*244|0)+16>>2]=c[d+16>>2];c[l+(i*244|0)+16+4>>2]=c[d+16+4>>2];c[l+(i*244|0)+16+8>>2]=c[d+16+8>>2];c[l+(i*244|0)+16+12>>2]=c[d+16+12>>2];c[l+(i*244|0)+32>>2]=c[d+32>>2];c[l+(i*244|0)+32+4>>2]=c[d+32+4>>2];c[l+(i*244|0)+32+8>>2]=c[d+32+8>>2];c[l+(i*244|0)+32+12>>2]=c[d+32+12>>2];c[l+(i*244|0)+48>>2]=c[d+48>>2];c[l+(i*244|0)+48+4>>2]=c[d+48+4>>2];c[l+(i*244|0)+48+8>>2]=c[d+48+8>>2];c[l+(i*244|0)+48+12>>2]=c[d+48+12>>2];gi(l+(i*244|0)+64|0,d+64|0,180)|0;return (c[b+12>>2]|0)+(i*244|0)|0}function Hf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0;fi(a,b,e)|0;c[b+52>>2]=c[a+552>>2];c[b+56>>2]=c[a+556>>2];c[b+60>>2]=c[a+560>>2];c[b+64>>2]=c[a+564>>2];c[b+68>>2]=c[a+568>>2];c[b+72>>2]=c[a+572>>2];c[b+76>>2]=c[a+576>>2];c[b+80>>2]=c[a+580>>2];c[b+84>>2]=c[a+584>>2];c[b+88>>2]=c[a+588>>2];c[b+92>>2]=c[a+592>>2];c[b+96>>2]=c[a+596>>2];c[b+100>>2]=c[a+600>>2];c[b+104>>2]=c[a+604>>2];c[b+108>>2]=c[a+608>>2];c[b+112>>2]=c[a+612>>2];c[b+116>>2]=c[a+616>>2];c[b+120>>2]=c[a+620>>2];c[b+124>>2]=c[a+624>>2];c[b+128>>2]=c[a+628>>2];c[b+132>>2]=c[a+632>>2];c[b+136>>2]=c[a+636>>2];c[b+140>>2]=c[a+640>>2];c[b+144>>2]=c[a+644>>2];c[b+148>>2]=c[a+648>>2];c[b+152>>2]=c[a+652>>2];c[b+156>>2]=c[a+656>>2];c[b+160>>2]=c[a+660>>2];c[b+164>>2]=c[a+664>>2];c[b+168>>2]=c[a+668>>2];c[b+172>>2]=c[a+672>>2];c[b+176>>2]=c[a+676>>2];c[b+184>>2]=d[a+736>>0];c[b+188>>2]=d[a+737>>0];c[b+196>>2]=c[a+684>>2];c[b+192>>2]=c[a+680>>2];c[b+180>>2]=d[a+740>>0];h=+g[a+688>>2];i=+g[a+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;g[b+200>>2]=f;f=+mh(h+i,6.2831854820251465);if(f<-3.1415927410125732){i=f+6.2831854820251465;e=b+204|0;g[e>>2]=i;e=a+696|0;e=c[e>>2]|0;j=b+208|0;c[j>>2]=e;j=a+700|0;j=c[j>>2]|0;e=b+212|0;c[e>>2]=j;a=a+704|0;a=c[a>>2]|0;b=b+216|0;c[b>>2]=a;return 12693}if(!(f>3.1415927410125732)){i=f;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}i=f+-6.2831854820251465;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}function If(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;k=l;l=l+64|0;n=+g[a+20>>2];u=+g[a+40>>2];p=+g[a+24>>2];s=+g[a+36>>2];t=+g[a+32>>2];m=+g[a+16>>2];j=+g[a>>2];i=+g[a+4>>2];q=+g[a+8>>2];h=1.0/((n*u-p*s)*j+i*(p*t-u*m)+(s*m-n*t)*q);z=+g[b>>2];y=+g[b+4>>2];A=+g[b+8>>2];x=+g[b+16>>2];w=+g[b+20>>2];v=+g[b+24>>2];r=+g[b+32>>2];o=+g[b+36>>2];f=+g[b+40>>2];g[k+16>>2]=A*(s*m-n*t)*h+(z*(n*u-p*s)*h+y*(p*t-u*m)*h);g[k+16+4>>2]=A*(t*i-s*j)*h+(z*(s*q-u*i)*h+y*(u*j-t*q)*h);g[k+16+8>>2]=A*(n*j-m*i)*h+(z*(p*i-n*q)*h+y*(m*q-p*j)*h);g[k+16+12>>2]=0.0;g[k+16+16>>2]=(n*u-p*s)*h*x+(p*t-u*m)*h*w+(s*m-n*t)*h*v;g[k+16+20>>2]=(s*q-u*i)*h*x+(u*j-t*q)*h*w+(t*i-s*j)*h*v;g[k+16+24>>2]=(p*i-n*q)*h*x+(m*q-p*j)*h*w+(n*j-m*i)*h*v;g[k+16+28>>2]=0.0;g[k+16+32>>2]=(n*u-p*s)*h*r+(p*t-u*m)*h*o+(s*m-n*t)*h*f;g[k+16+36>>2]=(s*q-u*i)*h*r+(u*j-t*q)*h*o+(t*i-s*j)*h*f;g[k+16+40>>2]=(p*i-n*q)*h*r+(m*q-p*j)*h*o+(n*j-m*i)*h*f;g[k+16+44>>2]=0.0;yh(k+16|0,k);f=+g[k>>2];h=+g[k+4>>2];i=+g[k+8>>2];m=+g[k+12>>2];j=1.0/+D(+(f*f+h*h+i*i+m*m));g[k>>2]=f*j;g[k+4>>2]=h*j;g[k+8>>2]=i*j;g[k+12>>2]=m*j;m=m*j<-1.0?-1.0:m*j;g[e>>2]=+I(+(m>1.0?1.0:m))*2.0;g[d>>2]=f*j;g[d+4>>2]=h*j;g[d+8>>2]=i*j;g[d+12>>2]=0.0;if(f*j*f*j+h*j*h*j+i*j*i*j<1.4210854715202004e-14){c[d>>2]=1065353216;c[d+4>>2]=0;c[d+8>>2]=0;g[d+12>>2]=0.0;l=k;return}else{A=1.0/+D(+(f*j*f*j+h*j*h*j+i*j*i*j));g[d>>2]=f*j*A;g[d+4>>2]=A*h*j;g[d+8>>2]=A*i*j;l=k;return}}function Jf(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0;v=c[a+892>>2]|0;if((v|0)<=0)return;q=c[a+900>>2]|0;a=0;do{u=c[q+(a*56|0)>>2]|0;j=c[q+(a*56|0)+4>>2]|0;y=c[j+8>>2]|0;x=c[j+12>>2]|0;w=c[j+16>>2]|0;f=q+(a*56|0)+8|0;s=+g[f>>2];h=q+(a*56|0)+12|0;r=+g[h>>2];i=q+(a*56|0)+16|0;p=+g[i>>2];b=+g[y+8>>2]*s+ +g[x+8>>2]*r+ +g[w+8>>2]*p;d=+g[y+12>>2]*s+ +g[x+12>>2]*r+ +g[w+12>>2]*p;e=+g[y+16>>2]*s+ +g[x+16>>2]*r+ +g[w+16>>2]*p;k=+g[u+8>>2];l=+g[u+12>>2];m=+g[u+16>>2];n=k-+g[u+24>>2]-(b-(s*+g[y+24>>2]+r*+g[x+24>>2]+p*+g[w+24>>2]));o=l-+g[u+28>>2]-(d-(s*+g[y+28>>2]+r*+g[x+28>>2]+p*+g[w+28>>2]));p=m-+g[u+32>>2]-(e-(s*+g[y+32>>2]+r*+g[x+32>>2]+p*+g[w+32>>2]));r=+g[q+(a*56|0)+24>>2];s=+g[q+(a*56|0)+28>>2];t=+g[q+(a*56|0)+32>>2];if(n*r+o*s+p*t<0.0){e=+g[q+(a*56|0)+40>>2]-(k*r+l*s+m*t-(b*r+d*s+e*t));b=r*e+0.0;d=s*e+0.0;e=t*e+0.0}else{b=0.0;d=0.0;e=0.0}z=+g[q+(a*56|0)+44>>2];b=b-z*(n-r*(n*r+o*s+p*t));d=d-z*(o-s*(n*r+o*s+p*t));s=e-z*(p-t*(n*r+o*s+p*t));t=+g[q+(a*56|0)+48>>2];g[u+8>>2]=k+t*b;g[u+12>>2]=l+t*d;g[u+16>>2]=t*s+m;y=q+(a*56|0)+52|0;t=+g[y>>2]*+g[f>>2];x=c[j+8>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[h>>2];x=c[j+12>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[i>>2];y=c[j+16>>2]|0;g[y+8>>2]=+g[y+8>>2]-b*t;g[y+12>>2]=+g[y+12>>2]-d*t;g[y+16>>2]=+g[y+16>>2]-s*t;a=a+1|0}while((a|0)!=(v|0));return}function Kf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+32>>2]|0;if((l|0)>=(k|0))return;if((c[b+36>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+32>>2]|0}g=c[b+40>>2]|0;if((f|0)<=0)if(!g)e=b+44|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+44>>0]|0))e=b+44|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+44|0}a[e>>0]=1;c[b+40>>2]=d;c[b+36>>2]=k;i=b+40|0}else{i=b+40|0;d=c[b+40>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+32>>2]=k;h=c[b+52>>2]|0;if((h|0)<(k|0)){if((c[b+56>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}g=c[b+60>>2]|0;if((f|0)<=0)if(!g)e=b+64|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+64>>0]|0))e=b+64|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+64|0}a[e>>0]=1;c[b+60>>2]=d;c[b+56>>2]=k}else d=c[b+60>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+52>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+60>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+60>>2]|0;d=0;do{k=c[(c[g+(d<<4)+4>>2]|0)+12>>2]<<16|c[(c[g+(d<<4)>>2]|0)+12>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Lf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=4276;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?1000000015047466219876688.0e6:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?1000000015047466219876688.0e6:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?1000000015047466219876688.0e6:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Mf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+20>>2]=c[a+76>>2];e=c[a+20>>2]|0;c[b+16>>2]=e;c[b+12>>2]=0;if(!e)return 16280;g=Bb[c[(c[d>>2]|0)+16>>2]&63](d,76,e)|0;e=c[g+8>>2]|0;c[b+12>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;if((c[b+16>>2]|0)>0){f=0;while(1){h=c[a+28>>2]|0;c[e+72>>2]=c[h+(f*80|0)+72>>2];c[e+64>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[h+(f*80|0)+64>>2]|0)|0;if(!(zb[c[(c[d>>2]|0)+24>>2]&31](d,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)|0)){h=c[(c[d>>2]|0)+16>>2]|0;i=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;i=xb[c[(c[i>>2]|0)+52>>2]&127](i)|0;i=Bb[h&63](d,i,1)|0;h=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;h=Bb[c[(c[h>>2]|0)+56>>2]&63](h,c[i+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,i,h,1346455635,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)}i=c[a+28>>2]|0;c[e+68>>2]=c[i+(f*80|0)+68>>2];c[e>>2]=c[i+(f*80|0)>>2];c[e+4>>2]=c[i+(f*80|0)+4>>2];c[e+8>>2]=c[i+(f*80|0)+8>>2];c[e+12>>2]=c[i+(f*80|0)+12>>2];c[e+16>>2]=c[i+(f*80|0)+16>>2];c[e+20>>2]=c[i+(f*80|0)+20>>2];c[e+24>>2]=c[i+(f*80|0)+24>>2];c[e+28>>2]=c[i+(f*80|0)+28>>2];c[e+32>>2]=c[i+(f*80|0)+32>>2];c[e+36>>2]=c[i+(f*80|0)+36>>2];c[e+40>>2]=c[i+(f*80|0)+40>>2];c[e+44>>2]=c[i+(f*80|0)+44>>2];c[e+48>>2]=c[i+(f*80|0)+48>>2];c[e+52>>2]=c[i+(f*80|0)+52>>2];c[e+56>>2]=c[i+(f*80|0)+56>>2];c[e+60>>2]=c[i+(f*80|0)+60>>2];f=f+1|0;if((f|0)>=(c[b+16>>2]|0)){e=d;break}else e=e+76|0}}else e=d;Zb[c[(c[e>>2]|0)+20>>2]&31](d,g,16255,1497453121,c[g+8>>2]|0);return 16280}function Nf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+28>>2]|0;if((l|0)>=(k|0))return;if((c[b+32>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+28>>2]|0}g=c[b+36>>2]|0;if((f|0)<=0)if(!g)e=b+40|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+40>>0]|0))e=b+40|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+40|0}a[e>>0]=1;c[b+36>>2]=d;c[b+32>>2]=k;i=b+36|0}else{i=b+36|0;d=c[b+36>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+28>>2]=k;h=c[b+48>>2]|0;if((h|0)<(k|0)){if((c[b+52>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+48>>2]|0}g=c[b+56>>2]|0;if((f|0)<=0)if(!g)e=b+60|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=d;c[b+52>>2]=k}else d=c[b+56>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+48>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+56>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+56>>2]|0;d=0;do{k=c[g+(d*12|0)+4>>2]<<16|c[g+(d*12|0)>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Of(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((c[b+8>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d*36|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;r=e+4+15&-16}else r=0;n=c[b+4>>2]|0;if((n|0)>0){m=0;do{o=c[b+12>>2]|0;i=r+(m*36|0)+16|0;a[i>>0]=1;j=r+(m*36|0)+12|0;c[j>>2]=0;l=r+(m*36|0)+4|0;c[l>>2]=0;k=r+(m*36|0)+8|0;c[k>>2]=0;p=c[o+(m*36|0)+4>>2]|0;if((p|0)>0){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}g=c[l>>2]|0;h=c[j>>2]|0;if((g|0)<=0){if(h|0)q=13}else{e=0;do{c[f+(e<<2)>>2]=c[h+(e<<2)>>2];e=e+1|0}while((e|0)!=(g|0));q=13}if((q|0)==13?(q=0,a[i>>0]|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[i>>0]=1;c[j>>2]=f;c[k>>2]=p;Yk(f|0,0,p<<2|0)|0;g=c[j>>2]|0;c[l>>2]=p;f=c[o+(m*36|0)+12>>2]|0;e=0;do{c[g+(e<<2)>>2]=c[f+(e<<2)>>2];e=e+1|0}while((e|0)!=(p|0))}else c[l>>2]=p;p=r+(m*36|0)+20|0;o=o+(m*36|0)+20|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];m=m+1|0}while((m|0)!=(n|0));f=c[b+4>>2]|0;if((f|0)>0){e=0;do{h=c[b+12>>2]|0;i=h+(e*36|0)+4|0;j=h+(e*36|0)+12|0;k=c[j>>2]|0;g=h+(e*36|0)+16|0;if(k|0){if(a[g>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[g>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(e*36|0)+8>>2]=0;e=e+1|0}while((e|0)!=(f|0))}}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=r;c[b+8>>2]=d;return}function Pf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=6004;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?999999984306749440.0:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?999999984306749440.0:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?999999984306749440.0:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Qf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=l;l=l+128|0;if(!b){l=h;return}if(c[b+40>>2]|0){Qf(a,c[b+36>>2]|0,d+1|0,e,f);Qf(a,c[b+40>>2]|0,d+1|0,e,f)}if((d|0)<0){l=h;return}m=+g[b>>2];r=+g[b+16>>2];j=+g[b+4>>2];q=+g[b+20>>2];i=+g[b+8>>2];p=+g[b+24>>2];k=(m+r)*.5-(r-m)*.5;n=(j+q)*.5-(q-j)*.5;o=(i+p)*.5-(p-i)*.5;m=(m+r)*.5+(r-m)*.5;j=(j+q)*.5+(q-j)*.5;i=(i+p)*.5+(p-i)*.5;f=(c[b+40>>2]|0)==0?f:e;g[h>>2]=k;g[h+4>>2]=n;g[h+8>>2]=o;g[h+12>>2]=0.0;g[h+16>>2]=m;g[h+20>>2]=n;g[h+24>>2]=o;g[h+28>>2]=0.0;g[h+32>>2]=m;g[h+36>>2]=j;g[h+40>>2]=o;g[h+44>>2]=0.0;g[h+48>>2]=k;g[h+52>>2]=j;g[h+56>>2]=o;g[h+60>>2]=0.0;g[h+64>>2]=k;g[h+68>>2]=n;g[h+72>>2]=i;g[h+76>>2]=0.0;g[h+80>>2]=m;g[h+84>>2]=n;g[h+88>>2]=i;g[h+92>>2]=0.0;g[h+96>>2]=m;g[h+100>>2]=j;g[h+104>>2]=i;g[h+108>>2]=0.0;g[h+112>>2]=k;g[h+116>>2]=j;g[h+120>>2]=i;g[h+124>>2]=0.0;Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+16|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+32|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+48|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+64|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+80|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+96|0,h+112|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+112|0,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h+112|0,f);l=h;return}function Rf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b>>2]=6640;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;c[b+36>>2]=1566444395;c[b+40>>2]=1566444395;c[b+44>>2]=1566444395;g[b+48>>2]=0.0;c[b+52>>2]=-581039253;c[b+56>>2]=-581039253;c[b+60>>2]=-581039253;g[b+64>>2]=0.0;c[b+68>>2]=0;c[b+72>>2]=1;g[b+76>>2]=0.0;c[b+80>>2]=1065353216;c[b+84>>2]=1065353216;c[b+88>>2]=1065353216;g[b+92>>2]=0.0;c[b+4>>2]=31;if(d){c[6995]=(c[6995]|0)+1;d=sc(59)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=-1;c[d+12>>2]=0;c[d+16>>2]=0;c[b+68>>2]=d;d=c[b+24>>2]|0}else d=0;if((d|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e*80|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+20>>2]|0;if((f|0)>0){d=0;do{i=h+(d*80|0)|0;j=c[b+28>>2]|0;k=j+(d*80|0)|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=j+(d*80|0)+16|0;k=h+(d*80|0)+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];k=j+(d*80|0)+32|0;i=h+(d*80|0)+32|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+48|0;k=j+(d*80|0)+48|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+64|0;j=j+(d*80|0)+64|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=h;c[b+24>>2]=e;return}function Sf(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;r=l;l=l+96|0;m=r;n=m+96|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));if(!i)p=c[c[b+940>>2]>>2]|0;else p=i;i=c[b+832>>2]|0;if((i|0)==(c[b+836>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if(!q)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((q*104|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[b+832>>2]|0}if((i|0)>0){j=0;do{m=o+(j*104|0)|0;k=(c[b+840>>2]|0)+(j*104|0)|0;n=m+104|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));j=j+1|0}while((j|0)!=(i|0))}i=c[b+840>>2]|0;if(i|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=o;c[b+836>>2]=q;i=c[b+832>>2]|0}m=c[b+840>>2]|0;c[m+(i*104|0)>>2]=0;c[m+(i*104|0)+4>>2]=p;m=m+(i*104|0)+8|0;k=r;n=m+96|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));q=c[b+832>>2]|0;c[b+832>>2]=q+1;p=c[b+840>>2]|0;k=c[b+780>>2]|0;c[p+(q*104|0)+8>>2]=k+(d*104|0);o=c[b+780>>2]|0;c[p+(q*104|0)+12>>2]=o+(e*104|0);m=c[b+780>>2]|0;c[p+(q*104|0)+16>>2]=m+(f*104|0);n=c[b+780>>2]|0;c[p+(q*104|0)+20>>2]=n+(h*104|0);z=+g[k+(d*104|0)+8>>2];w=+g[k+(d*104|0)+12>>2];A=+g[k+(d*104|0)+16>>2];t=+g[m+(f*104|0)+8>>2]-z;y=+g[m+(f*104|0)+12>>2]-w;v=+g[m+(f*104|0)+16>>2]-A;u=+g[n+(h*104|0)+8>>2]-z;x=+g[n+(h*104|0)+12>>2]-w;s=+g[n+(h*104|0)+16>>2]-A;g[p+(q*104|0)+24>>2]=(+g[o+(e*104|0)+16>>2]-A)*(t*x-y*u)+((+g[o+(e*104|0)+8>>2]-z)*(y*s-v*x)+(+g[o+(e*104|0)+12>>2]-w)*(v*u-t*s));a[b+984>>0]=1;l=r;return}function Tf(b){b=b|0;var d=0;c[b>>2]=5052;d=c[b+204>>2]|0;if(d|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;d=c[b+176>>2]|0;if(d|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0.0,p=0;k=l;l=l+160|0;i=c[b+12>>2]|0;if(!i){l=k;return}m=(a[b+16>>0]|0)!=0;n=m?e:d;e=m?d:e;p=c[n+4>>2]|0;d=c[e+4>>2]|0;c[h+4>>2]=i;o=+g[i+784>>2]+ +g[h+32>>2];c[k+136>>2]=9648;c[k+136+4>>2]=p;c[k+136+8>>2]=d;g[k+136+12>>2]=o;g[k+128>>2]=999999984306749440.0;i=c[n+12>>2]|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[k+16>>2]=c[i+16>>2];c[k+16+4>>2]=c[i+16+4>>2];c[k+16+8>>2]=c[i+16+8>>2];c[k+16+12>>2]=c[i+16+12>>2];c[k+32>>2]=c[i+32>>2];c[k+32+4>>2]=c[i+32+4>>2];c[k+32+8>>2]=c[i+32+8>>2];c[k+32+12>>2]=c[i+32+12>>2];c[k+48>>2]=c[i+48>>2];c[k+48+4>>2]=c[i+48+4>>2];c[k+48+8>>2]=c[i+48+8>>2];c[k+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+64>>2]=c[i>>2];c[k+64+4>>2]=c[i+4>>2];c[k+64+8>>2]=c[i+8>>2];c[k+64+12>>2]=c[i+12>>2];c[k+80>>2]=c[i+16>>2];c[k+80+4>>2]=c[i+16+4>>2];c[k+80+8>>2]=c[i+16+8>>2];c[k+80+12>>2]=c[i+16+12>>2];c[k+96>>2]=c[i+32>>2];c[k+96+4>>2]=c[i+32+4>>2];c[k+96+8>>2]=c[i+32+8>>2];c[k+96+12>>2]=c[i+32+12>>2];c[k+112>>2]=c[i+48>>2];c[k+112+4>>2]=c[i+48+4>>2];c[k+112+8>>2]=c[i+48+8>>2];c[k+112+12>>2]=c[i+48+12>>2];Xd(k+136|0,k,h,c[f+20>>2]|0,m);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function Vf(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0;d=c[a+812>>2]|0;if((d|0)>0){e=c[a+820>>2]|0;b=0;do{f=c[e+(b*44|0)+8>>2]|0;h=c[e+(b*44|0)+12>>2]|0;i=c[e+(b*44|0)+16>>2]|0;l=+g[f+8>>2];n=+g[f+12>>2];j=+g[f+16>>2];k=+g[h+8>>2]-l;o=+g[h+12>>2]-n;m=+g[h+16>>2]-j;l=+g[i+8>>2]-l;n=+g[i+12>>2]-n;j=+g[i+16>>2]-j;g[e+(b*44|0)+36>>2]=+D(+((k*n-o*l)*(k*n-o*l)+((o*j-m*n)*(o*j-m*n)+(m*l-k*j)*(m*l-k*j))));b=b+1|0}while((b|0)!=(d|0))}d=c[a+772>>2]|0;if((d|0)>0){c[6995]=(c[6995]|0)+1;b=sc((d<<2|3)+16|0)|0;if(!b)e=0;else{c[(b+4+15&-16)+-4>>2]=b;e=b+4+15&-16}Yk(e|0,0,d<<2|0)|0;f=c[a+772>>2]|0;if((f|0)>0){d=c[a+780>>2]|0;b=0;do{g[d+(b*104|0)+92>>2]=0.0;b=b+1|0}while((b|0)!=(f|0));i=e;h=e;b=f}else{i=e;h=e;b=f}}else{i=0;h=0;b=d}f=c[a+812>>2]|0;if((f|0)>0){d=c[a+820>>2]|0;e=c[a+780>>2]|0;b=0;do{o=+C(+(+g[d+(b*44|0)+36>>2]));p=c[d+(b*44|0)+8>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+12>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+16>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];b=b+1|0}while((b|0)!=(f|0));b=c[a+772>>2]|0}if((b|0)>0){d=0;do{e=c[i+(d<<2)>>2]|0;if((e|0)>0){q=(c[a+780>>2]|0)+(d*104|0)+92|0;g[q>>2]=+g[q>>2]/+(e|0)}else g[(c[a+780>>2]|0)+(d*104|0)+92>>2]=0.0;d=d+1|0}while((d|0)!=(b|0));if(!h)return}else if((i|0)==0|(h|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);return}function Wf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0;d=l;l=l+128|0;F=c[(c[a+8>>2]|0)+28>>2]|0;f=c[F+(b*80|0)+64>>2]|0;e=c[a+12>>2]|0;w=+g[F+(b*80|0)>>2];C=+g[e>>2];v=+g[F+(b*80|0)+16>>2];B=+g[e+4>>2];u=+g[F+(b*80|0)+32>>2];A=+g[e+8>>2];t=+g[F+(b*80|0)+4>>2];s=+g[F+(b*80|0)+20>>2];r=+g[F+(b*80|0)+36>>2];q=+g[F+(b*80|0)+8>>2];o=+g[F+(b*80|0)+24>>2];m=+g[F+(b*80|0)+40>>2];z=+g[e+16>>2];y=+g[e+20>>2];x=+g[e+24>>2];p=+g[e+32>>2];n=+g[e+36>>2];k=+g[e+40>>2];E=+g[F+(b*80|0)+48>>2];D=+g[F+(b*80|0)+52>>2];h=+g[F+(b*80|0)+56>>2];j=+g[e+48>>2]+(C*E+B*D+A*h);i=z*E+y*D+x*h+ +g[e+52>>2];h=p*E+n*D+k*h+ +g[e+56>>2];g[d+56>>2]=w*C+v*B+u*A;g[d+56+4>>2]=C*t+B*s+A*r;g[d+56+8>>2]=C*q+B*o+A*m;g[d+56+12>>2]=0.0;g[d+56+16>>2]=w*z+v*y+u*x;g[d+56+20>>2]=t*z+s*y+r*x;g[d+56+24>>2]=q*z+o*y+m*x;g[d+56+28>>2]=0.0;g[d+56+32>>2]=w*p+v*n+u*k;g[d+56+36>>2]=t*p+s*n+r*k;g[d+56+40>>2]=q*p+o*n+m*k;g[d+56+44>>2]=0.0;g[d+56+48>>2]=j;g[d+56+52>>2]=i;g[d+56+56>>2]=h;g[d+56+60>>2]=0.0;e=c[a+4>>2]|0;c[d+32>>2]=0;c[d+32+4>>2]=f;c[d+32+8>>2]=e;c[d+32+12>>2]=d+56;c[d+32+16>>2]=-1;c[d+32+20>>2]=b;e=c[a+24>>2]|0;g[d+4>>2]=1.0;c[d+8>>2]=0;c[d+12>>2]=1;c[d+16>>2]=-1;c[d+20>>2]=0;c[d>>2]=6108;c[d+24>>2]=e;c[d+28>>2]=b;c[d+4>>2]=c[e+4>>2];c[d+20>>2]=c[e+20>>2];ad(c[a+16>>2]|0,c[a+20>>2]|0,d+32|0,d);l=d;return}function Xf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;i=l;l=l+80|0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=0;do{q=i+64+(f<<2)|0;c[i+64>>2]=0;c[i+64+4>>2]=0;c[i+64+8>>2]=0;c[i+64+12>>2]=0;g[q>>2]=1.0;j=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i+32>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+32+4>>2]=o;g[i+32+8>>2]=p;g[i+32+12>>2]=0.0;Sb[j&127](i+48|0,a,i+32|0);p=+g[i+48>>2];o=+g[i+48+4>>2];n=+g[i+48+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;j=i+32+(f<<2)|0;g[e+(f<<2)>>2]=h+ +g[j>>2];g[q>>2]=-1.0;q=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+4>>2]=o;g[i+8>>2]=p;g[i+12>>2]=0.0;Sb[q&127](i+16|0,a,i);p=+g[i+16>>2];o=+g[i+16+4>>2];n=+g[i+16+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;g[d+(f<<2)>>2]=+g[j>>2]-h;f=f+1|0}while((f|0)!=3);l=i;return}function Yf(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0;m=l;l=l+48|0;c[6995]=(c[6995]|0)+1;f=sc(83)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}c[k>>2]=g;c[k+4>>2]=h;c[k+8>>2]=i;h=k+16|0;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];h=k+32|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];h=k+56|0;c[h>>2]=0;i=k+52|0;c[i>>2]=0;c[m+16>>2]=c[d>>2];c[m+16+4>>2]=c[d+4>>2];c[m+16+8>>2]=c[d+8>>2];c[m+16+12>>2]=c[d+12>>2];c[m+16+16>>2]=c[e>>2];c[m+16+16+4>>2]=c[e+4>>2];c[m+16+16+8>>2]=c[e+8>>2];c[m+16+16+12>>2]=c[e+12>>2];c[k+60>>2]=c[b+104>>2];f=(c[b+148>>2]|0)+1|0;c[b+148>>2]=f;c[k+12>>2]=f;f=c[b+8>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;g=j+44|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(g|0))}else c[b+8>>2]=0;c[f+32>>2]=0;c[f+36>>2]=k;c[f+40>>2]=0;c[f>>2]=c[m+16>>2];c[f+4>>2]=c[m+16+4>>2];c[f+8>>2]=c[m+16+8>>2];c[f+12>>2]=c[m+16+12>>2];c[f+16>>2]=c[m+16+16>>2];c[f+20>>2]=c[m+16+20>>2];c[f+24>>2]=c[m+16+24>>2];c[f+28>>2]=c[m+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,f);c[b+16>>2]=(c[b+16>>2]|0)+1;c[k+48>>2]=f;j=b+84+(c[b+104>>2]<<2)|0;c[i>>2]=0;c[h>>2]=c[j>>2];f=c[j>>2]|0;if(f|0)c[f+52>>2]=k;c[j>>2]=k;if(a[b+153>>0]|0){l=m;return k|0}c[m>>2]=9248;c[m+4>>2]=b;c[m+8>>2]=k;Bf(c[b+4>>2]|0,m+16|0,m);Bf(c[b+44>>2]|0,m+16|0,m);l=m;return k|0}function Zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0;C=l;l=l+96|0;n=+g[e+4>>2];o=+g[e+20>>2];p=+g[e+36>>2];q=+g[e+8>>2];r=+g[e+24>>2];s=+g[e+40>>2];t=+g[e+12>>2];u=+g[e+28>>2];v=+g[e+44>>2];w=-+g[e+52>>2];x=-+g[e+56>>2];y=-+g[e+60>>2];k=c[b+780>>2]|0;z=+g[k+(d*104|0)+8>>2];A=+g[k+(d*104|0)+12>>2];B=+g[k+(d*104|0)+16>>2];a:do if(f){f=c[b+328>>2]|0;b:do if((f|0)>0){j=c[b+336>>2]|0;i=0;while(1){if((c[j+(i<<2)>>2]|0)==(e|0))break;i=i+1|0;if((i|0)>=(f|0))break b}if((i|0)!=(f|0)){f=k;break a}}while(0);if((f|0)==(c[b+332>>2]|0)?(m=f|0?f<<1:1,(f|0)<(m|0)):0){if(!m)j=0;else{c[6995]=(c[6995]|0)+1;f=sc((m<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;f=c[b+328>>2]|0}if((f|0)>0){i=0;do{c[j+(i<<2)>>2]=c[(c[b+336>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+336>>2]|0;if(i){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=j;c[b+332>>2]=m}c[(c[b+336>>2]|0)+(f<<2)>>2]=e;c[b+328>>2]=f+1;f=c[b+780>>2]|0}else f=k;while(0);c[C>>2]=f+(d*104|0);c[C+20>>2]=e;g[C+4>>2]=n*w+o*x+p*y+(n*z+o*A+p*B);g[C+8>>2]=q*w+r*x+s*y+(q*z+r*A+s*B);g[C+12>>2]=t*w+u*x+v*y+(t*z+u*A+v*B);g[C+16>>2]=0.0;e=f+(d*104|0)+100|0;a[e>>0]=a[e>>0]|1;g[C+24>>2]=h;Ln(b+848|0,C);l=C;return}function _f(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0;I=l;l=l+32|0;j=+g[b+16>>2];f=+g[b>>2];k=+g[b+20>>2];h=+g[b+4>>2];n=+g[b+24>>2];i=+g[b+8>>2];r=+g[b+32>>2];v=+g[b+36>>2];w=+g[b+40>>2];B=(k-h)*(w-i)-(n-i)*(v-h);C=(n-i)*(r-f)-(j-f)*(w-i);E=(j-f)*(v-h)-(k-h)*(r-f);g[I+16>>2]=B;g[I+16+4>>2]=C;g[I+16+8>>2]=E;g[I+16+12>>2]=0.0;o=+g[a+4>>2];s=+g[a+8>>2];x=+g[a+12>>2];F=B*o+C*s+E*x-(f*B+h*C+i*E);p=+g[a+20>>2];t=+g[a+24>>2];y=+g[a+28>>2];if(F*(B*p+C*t+E*y-(f*B+h*C+i*E))>=0.0){l=I;return}G=c[a+36>>2]|0;if(F<=0.0&(G&1|0)!=0){l=I;return}H=F/(F-(B*p+C*t+E*y-(f*B+h*C+i*E)));if(!(H<+g[a+40>>2])){l=I;return}A=(B*B+C*C+E*E)*-9.999999747378752e-05;z=f-(p*H+o*(1.0-H));u=h-(t*H+s*(1.0-H));q=i-(y*H+x*(1.0-H));m=j-(p*H+o*(1.0-H));k=k-(t*H+s*(1.0-H));j=n-(y*H+x*(1.0-H));if(!(E*(z*k-u*m)+(B*(u*j-q*k)+C*(q*m-z*j))>=A)){l=I;return}i=r-(p*H+o*(1.0-H));h=v-(t*H+s*(1.0-H));f=w-(y*H+x*(1.0-H));if(!(E*(m*h-k*i)+(B*(k*f-j*h)+C*(j*i-m*f))>=A)){l=I;return}if(!(E*(u*i-z*h)+(B*(q*h-u*f)+C*(z*f-q*i))>=A)){l=I;return}f=1.0/+D(+(B*B+C*C+E*E));g[I+16>>2]=B*f;g[I+16+4>>2]=C*f;g[I+16+8>>2]=E*f;b=c[(c[a>>2]|0)+12>>2]|0;if(F<=0.0&(G&2|0)==0){g[I>>2]=-(B*f);g[I+4>>2]=-(C*f);g[I+8>>2]=-(E*f);g[I+12>>2]=0.0;g[a+40>>2]=+pb[b&3](a,I,H,d,e);l=I;return}else{g[a+40>>2]=+pb[b&3](a,I+16|0,H,d,e);l=I;return}}function $f(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0;k=l;l=l+144|0;i=c[b+12>>2]|0;if(!i){l=k;return}n=c[d+4>>2]|0;m=c[e+4>>2]|0;c[h+4>>2]=i;g[k+12+128>>2]=999999984306749440.0;i=c[d+12>>2]|0;c[k+12>>2]=c[i>>2];c[k+12+4>>2]=c[i+4>>2];c[k+12+8>>2]=c[i+8>>2];c[k+12+12>>2]=c[i+12>>2];c[k+12+16>>2]=c[i+16>>2];c[k+12+16+4>>2]=c[i+16+4>>2];c[k+12+16+8>>2]=c[i+16+8>>2];c[k+12+16+12>>2]=c[i+16+12>>2];c[k+12+32>>2]=c[i+32>>2];c[k+12+32+4>>2]=c[i+32+4>>2];c[k+12+32+8>>2]=c[i+32+8>>2];c[k+12+32+12>>2]=c[i+32+12>>2];c[k+12+48>>2]=c[i+48>>2];c[k+12+48+4>>2]=c[i+48+4>>2];c[k+12+48+8>>2]=c[i+48+8>>2];c[k+12+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+12+64>>2]=c[i>>2];c[k+12+64+4>>2]=c[i+4>>2];c[k+12+64+8>>2]=c[i+8>>2];c[k+12+64+12>>2]=c[i+12>>2];c[k+12+80>>2]=c[i+16>>2];c[k+12+80+4>>2]=c[i+16+4>>2];c[k+12+80+8>>2]=c[i+16+8>>2];c[k+12+80+12>>2]=c[i+16+12>>2];c[k+12+96>>2]=c[i+32>>2];c[k+12+96+4>>2]=c[i+32+4>>2];c[k+12+96+8>>2]=c[i+32+8>>2];c[k+12+96+12>>2]=c[i+32+12>>2];c[k+12+112>>2]=c[i+48>>2];c[k+12+112+4>>2]=c[i+48+4>>2];c[k+12+112+8>>2]=c[i+48+8>>2];c[k+12+112+12>>2]=c[i+48+12>>2];c[k>>2]=9628;c[k+4>>2]=n;c[k+8>>2]=m;pc(k,k+12|0,h,c[f+20>>2]|0,0);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function ag(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=qt()|0;Ij(f,4,b);c[f>>2]=4996;c[f+552>>2]=c[d>>2];c[f+552+4>>2]=c[d+4>>2];c[f+552+8>>2]=c[d+8>>2];c[f+552+12>>2]=c[d+12>>2];c[f+568>>2]=c[d+16>>2];c[f+568+4>>2]=c[d+16+4>>2];c[f+568+8>>2]=c[d+16+8>>2];c[f+568+12>>2]=c[d+16+12>>2];c[f+584>>2]=c[d+32>>2];c[f+584+4>>2]=c[d+32+4>>2];c[f+584+8>>2]=c[d+32+8>>2];c[f+584+12>>2]=c[d+32+12>>2];c[f+600>>2]=c[d+48>>2];c[f+600+4>>2]=c[d+48+4>>2];c[f+600+8>>2]=c[d+48+8>>2];c[f+600+12>>2]=c[d+48+12>>2];c[f+616>>2]=c[d>>2];c[f+616+4>>2]=c[d+4>>2];c[f+616+8>>2]=c[d+8>>2];c[f+616+12>>2]=c[d+12>>2];c[f+632>>2]=c[d+16>>2];c[f+632+4>>2]=c[d+16+4>>2];c[f+632+8>>2]=c[d+16+8>>2];c[f+632+12>>2]=c[d+16+12>>2];c[f+648>>2]=c[d+32>>2];c[f+648+4>>2]=c[d+32+4>>2];c[f+648+8>>2]=c[d+32+8>>2];c[f+648+12>>2]=c[d+32+12>>2];c[f+664>>2]=c[d+48>>2];c[f+664+4>>2]=c[d+48+4>>2];c[f+664+8>>2]=c[d+48+8>>2];c[f+664+12>>2]=c[d+48+12>>2];g[f+688>>2]=0.0;g[f+692>>2]=-1.0;g[f+696>>2]=.8999999761581421;g[f+700>>2]=.30000001192092896;g[f+704>>2]=1.0;g[f+708>>2]=0.0;g[f+712>>2]=0.0;a[f+716>>0]=0;a[f+736>>0]=0;a[f+737>>0]=0;a[f+738>>0]=0;a[f+739>>0]=1;a[f+740>>0]=e&1;c[f+748>>2]=0;c[f+748+4>>2]=0;c[f+748+8>>2]=0;c[f+748+12>>2]=0;c[f+748+16>>2]=0;d=c[f+28>>2]|0;l=+g[f+600>>2];k=+g[f+604>>2];j=+g[f+608>>2];i=l*+g[d+20>>2]+k*+g[d+24>>2]+j*+g[d+28>>2]+ +g[d+56>>2];h=l*+g[d+36>>2]+k*+g[d+40>>2]+j*+g[d+44>>2]+ +g[d+60>>2];g[f+664>>2]=l*+g[d+4>>2]+k*+g[d+8>>2]+j*+g[d+12>>2]+ +g[d+52>>2];g[f+668>>2]=i;g[f+672>>2]=h;g[f+676>>2]=0.0;g[f+732>>2]=e?-1.0:1.0;return f|0}function bg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;q=l;l=l+48|0;if((f|0)==(d|0)|((d|0)==(e|0)|(e|0)==(f|0))){l=q;return}k=q;m=k+36|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));if(!h)o=c[c[b+940>>2]>>2]|0;else o=h;h=c[b+812>>2]|0;if((h|0)==(c[b+816>>2]|0)?(p=h|0?h<<1:1,(h|0)<(p|0)):0){if(!p)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*44|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}n=h;h=c[b+812>>2]|0}if((h|0)>0){i=0;do{k=n+(i*44|0)|0;j=(c[b+820>>2]|0)+(i*44|0)|0;m=k+44|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));i=i+1|0}while((i|0)!=(h|0))}h=c[b+820>>2]|0;if(h|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=n;c[b+816>>2]=p;h=c[b+812>>2]|0}k=c[b+820>>2]|0;c[k+(h*44|0)>>2]=0;c[k+(h*44|0)+4>>2]=o;k=k+(h*44|0)+8|0;j=q;m=k+36|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));p=c[b+812>>2]|0;c[b+812>>2]=p+1;o=c[b+820>>2]|0;k=c[b+780>>2]|0;c[o+(p*44|0)+8>>2]=k+(d*104|0);m=c[b+780>>2]|0;c[o+(p*44|0)+12>>2]=m+(e*104|0);n=c[b+780>>2]|0;c[o+(p*44|0)+16>>2]=n+(f*104|0);t=+g[k+(d*104|0)+8>>2];v=+g[k+(d*104|0)+12>>2];r=+g[k+(d*104|0)+16>>2];s=+g[m+(e*104|0)+8>>2]-t;w=+g[m+(e*104|0)+12>>2]-v;u=+g[m+(e*104|0)+16>>2]-r;t=+g[n+(f*104|0)+8>>2]-t;v=+g[n+(f*104|0)+12>>2]-v;r=+g[n+(f*104|0)+16>>2]-r;g[o+(p*44|0)+36>>2]=+D(+((s*v-w*t)*(s*v-w*t)+((w*r-u*v)*(w*r-u*v)+(u*t-s*r)*(u*t-s*r))));a[b+984>>0]=1;l=q;return}function cg(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;g[r+16+60>>2]=0.0;g[r+16+8>>2]=0.0;g[r+16+12>>2]=.10000000149011612;g[r+16+16>>2]=300.0;g[r+16>>2]=1.0;g[r+16+4>>2]=-1.0;g[r+16+28>>2]=0.0;g[r+16+32>>2]=.20000000298023224;g[r+16+36>>2]=0.0;g[r+16+40>>2]=0.0;g[r+16+20>>2]=1.0;g[r+16+24>>2]=.5;c[r+16+56>>2]=0;g[r+16+48>>2]=0.0;a[r+16+44>>0]=0;p=0;do{o=c[b+856+(p<<2)>>2]|0;n=a[b+788+p>>0]|0;if(!o){if(n<<24>>24){n=1;q=5}}else q=5;if((q|0)==5){q=0;g[r+16+40>>2]=0.0;c[r+16+56>>2]=o;c[r+16+52>>2]=c[b+840+(p<<2)>>2];c[r+16+48>>2]=c[b+824+(p<<2)>>2];c[r+16+20>>2]=c[b+732>>2];a[r+16+44>>0]=n;c[r+16+4>>2]=c[b+696+(p<<2)>>2];c[r+16+24>>2]=c[b+728>>2];c[r+16>>2]=c[b+680+(p<<2)>>2];g[r+16+16>>2]=0.0;c[r+16+12>>2]=c[b+808+(p<<2)>>2];c[r+16+8>>2]=c[b+792+(p<<2)>>2];c[r>>2]=c[b+1064+(p<<2)>>2];c[r+4>>2]=c[b+1080+(p<<2)>>2];c[r+8>>2]=c[b+1096+(p<<2)>>2];g[r+12>>2]=0.0;o=c[b+1304>>2]>>p*3;if(!(o&1))n=c[d+32>>2]|0;else n=b+740+(p<<2)|0;c[r+16+28>>2]=c[n>>2];if(!(o&2))n=c[d+32>>2]|0;else n=b+772+(p<<2)|0;c[r+16+36>>2]=c[n>>2];c[r+16+32>>2]=c[((o&4|0)==0?d+4|0:b+756+(p<<2)|0)>>2];if(a[b+1301>>0]|0){o=p+1|0;if(!(c[b+868+(((o|0)==3?0:o)<<6)+56>>2]|0))n=1;else n=(c[b+868+(((p+2|0)%3|0)<<6)+56>>2]|0)==0&1}else n=0;e=(Hd(b,r+16|0,f,h,i,j,k,m,d,e,r,0,n)|0)+e|0}p=p+1|0}while((p|0)!=3);l=r;return e|0}function dg(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;q=0;do{p=c[(c[b+256>>2]|0)+(q<<2)>>2]|0;if(!(c[p+204>>2]&3)){m=+g[p+504>>2];f=+E(+(1.0-m),+d);i=f*+g[p+372>>2];g[p+372>>2]=i;h=f*+g[p+376>>2];g[p+376>>2]=h;f=f*+g[p+380>>2];g[p+380>>2]=f;o=+g[p+508>>2];l=+E(+(1.0-o),+d);j=l*+g[p+388>>2];g[p+388>>2]=j;k=l*+g[p+392>>2];g[p+392>>2]=k;l=l*+g[p+396>>2];g[p+396>>2]=l;do if(a[p+512>>0]|0){if(l*l+(j*j+k*k)<+g[p+524>>2]?i*i+h*h+f*f<+g[p+520>>2]:0){r=+g[p+516>>2];g[p+388>>2]=j*r;g[p+392>>2]=r*k;g[p+396>>2]=r*l;g[p+372>>2]=r*i;g[p+376>>2]=r*h;g[p+380>>2]=r*f;i=r*i;h=r*h;f=r*f;n=j*r;k=r*k;l=r*l}else n=j;j=+D(+(i*i+h*h+f*f));do if(j.004999999888241291){i=i-i*(1.0/j)*.004999999888241291;g[p+372>>2]=i;h=h-h*(1.0/j)*.004999999888241291;g[p+376>>2]=h;f=f-f*(1.0/j)*.004999999888241291;g[p+380>>2]=f;break}else{c[p+372>>2]=0;c[p+372+4>>2]=0;c[p+372+8>>2]=0;c[p+372+12>>2]=0;i=0.0;h=0.0;f=0.0;break}while(0);j=+D(+(n*n+k*k+l*l));if(j.004999999888241291){g[p+388>>2]=n-n*(1.0/j)*.004999999888241291;g[p+392>>2]=k-k*(1.0/j)*.004999999888241291;g[p+396>>2]=l-l*(1.0/j)*.004999999888241291;break}else{c[p+388>>2]=0;c[p+388+4>>2]=0;c[p+388+8>>2]=0;c[p+388+12>>2]=0;break}}while(0);Af(p+4|0,i,h,f,p+388|0,d,p+68|0);e=c[b+248>>2]|0}q=q+1|0}while((q|0)<(e|0));return}function eg(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=qt()|0;Ij(e,4,b);c[e>>2]=4996;c[e+552>>2]=c[d>>2];c[e+552+4>>2]=c[d+4>>2];c[e+552+8>>2]=c[d+8>>2];c[e+552+12>>2]=c[d+12>>2];c[e+568>>2]=c[d+16>>2];c[e+568+4>>2]=c[d+16+4>>2];c[e+568+8>>2]=c[d+16+8>>2];c[e+568+12>>2]=c[d+16+12>>2];c[e+584>>2]=c[d+32>>2];c[e+584+4>>2]=c[d+32+4>>2];c[e+584+8>>2]=c[d+32+8>>2];c[e+584+12>>2]=c[d+32+12>>2];c[e+600>>2]=c[d+48>>2];c[e+600+4>>2]=c[d+48+4>>2];c[e+600+8>>2]=c[d+48+8>>2];c[e+600+12>>2]=c[d+48+12>>2];c[e+616>>2]=c[d>>2];c[e+616+4>>2]=c[d+4>>2];c[e+616+8>>2]=c[d+8>>2];c[e+616+12>>2]=c[d+12>>2];c[e+632>>2]=c[d+16>>2];c[e+632+4>>2]=c[d+16+4>>2];c[e+632+8>>2]=c[d+16+8>>2];c[e+632+12>>2]=c[d+16+12>>2];c[e+648>>2]=c[d+32>>2];c[e+648+4>>2]=c[d+32+4>>2];c[e+648+8>>2]=c[d+32+8>>2];c[e+648+12>>2]=c[d+32+12>>2];c[e+664>>2]=c[d+48>>2];c[e+664+4>>2]=c[d+48+4>>2];c[e+664+8>>2]=c[d+48+8>>2];c[e+664+12>>2]=c[d+48+12>>2];g[e+688>>2]=0.0;g[e+692>>2]=-1.0;g[e+696>>2]=.8999999761581421;g[e+700>>2]=.30000001192092896;g[e+704>>2]=1.0;g[e+708>>2]=0.0;g[e+712>>2]=0.0;a[e+716>>0]=0;a[e+736>>0]=0;a[e+737>>0]=0;a[e+738>>0]=0;a[e+739>>0]=1;a[e+740>>0]=0;c[e+748>>2]=0;c[e+748+4>>2]=0;c[e+748+8>>2]=0;c[e+748+12>>2]=0;c[e+748+16>>2]=0;d=c[e+28>>2]|0;k=+g[e+600>>2];j=+g[e+604>>2];i=+g[e+608>>2];h=k*+g[d+20>>2]+j*+g[d+24>>2]+i*+g[d+28>>2]+ +g[d+56>>2];f=k*+g[d+36>>2]+j*+g[d+40>>2]+i*+g[d+44>>2]+ +g[d+60>>2];g[e+664>>2]=k*+g[d+4>>2]+j*+g[d+8>>2]+i*+g[d+12>>2]+ +g[d+52>>2];g[e+668>>2]=h;g[e+672>>2]=f;g[e+676>>2]=0.0;g[e+732>>2]=1.0;return e|0}function fg(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=h|0;i=i|0;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;x=+g[j+(h<<2)>>2];y=+g[j+16+(h<<2)>>2];w=+g[j+32+(h<<2)>>2];o=+g[k+(i<<2)>>2];q=+g[k+16+(i<<2)>>2];s=+g[k+32+(i<<2)>>2];t=+g[k+48>>2]-+g[j+48>>2];u=+g[k+52>>2]-+g[j+52>>2];v=+g[k+56>>2]-+g[j+56>>2];m=1.0-(x*o+y*q+w*s)*(x*o+y*q+w*s);if(!(m==0.0)){m=(x*t+y*u+w*v-(x*o+y*q+w*s)*(o*t+q*u+s*v))/m;if(!(m<-c)){if(m>c){m=c;p=4}}else{m=-c;p=4}}else{m=0.0;p=4}n=(x*o+y*q+w*s)*m-(o*t+q*u+s*v);if(n<-e){m=(x*o+y*q+w*s)*-e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=-e;m=c}else n=-e;else{n=-e;m=-c}}else if(n>e){m=(x*o+y*q+w*s)*e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=e;m=c}else n=e;else{n=e;m=-c}}r=o*n;q=q*n;o=s*n;e=r+(t-x*m);n=q+(u-y*m);m=o+(v-w*m);c=+D(+(m*m+(e*e+n*n)));if(c-d-f>l)return +(c-d-f);do if(m*m+(e*e+n*n)<=1.4210854715202004e-14)if(+C(+w)>.7071067690849304){m=1.0/+D(+(y*y+w*w));g[a>>2]=0.0;g[a+4>>2]=-(w*m);i=a+4|0;j=a;m=y*m;h=2;break}else{m=1.0/+D(+(x*x+y*y));g[a>>2]=-(y*m);g[a+4>>2]=x*m;i=a+4|0;j=a;m=0.0;h=2;break}else{g[a>>2]=e*-(1.0/c);g[a+4>>2]=n*-(1.0/c);g[a+8>>2]=m*-(1.0/c);i=a+4|0;j=a;m=0.0;h=3}while(0);g[a+(h<<2)>>2]=m;x=q+ +g[k+52>>2]+ +g[i>>2]*f;y=o+ +g[k+56>>2]+ +g[a+8>>2]*f;g[b>>2]=r+ +g[k+48>>2]+ +g[j>>2]*f;g[b+4>>2]=x;g[b+8>>2]=y;g[b+12>>2]=0.0;return +(c-d-f)}function gg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=c[b+28>>2]|0;j=c[b+32>>2]|0;if(!(a[b+1301>>0]|0)){h=0;e=cg(b,d,0,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);l=k;return}h=0;e=0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);cg(b,d,e,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;l=k;return}function hg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[a+60>>2]|0;c[e+4>>2]=f;g=e+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*24|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[e>>2]=f;c[g>>2]=c[a+48>>2];c[a+48>>2]=e}else c[a+52>>2]=c[e+8>>2];h=c[e>>2]|0;g=c[e+4>>2]|0;if((g|0)>0){e=0;f=h;do{e=e+1|0;i=f;f=f+24|0;c[i>>2]=(e|0)<(g|0)?f:0}while((e|0)!=(g|0))}}else h=e;c[a+56>>2]=c[h>>2];c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}e=c[a+60>>2]|0;c[f+4>>2]=e;g=f+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*24|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[f>>2]=e;c[g>>2]=c[a+48>>2];c[a+48>>2]=f}else{c[a+52>>2]=c[e+8>>2];f=e}e=c[f>>2]|0;i=c[f+4>>2]|0;if((i|0)>0){f=0;g=e;do{f=f+1|0;j=g;g=g+24|0;c[j>>2]=(f|0)<(i|0)?g:0}while((f|0)!=(i|0))}}c[a+56>>2]=c[e>>2];j=e;c[j>>2]=0;c[j+4>>2]=0;c[h+8>>2]=e;c[e+8>>2]=h;j=c[a+100>>2]|0;c[h+20>>2]=j;c[e+20>>2]=j;c[h+12>>2]=d;c[e+12>>2]=b;c[h+16>>2]=0;c[e+16>>2]=0;e=c[a+116>>2]|0;c[a+116>>2]=e+1;if((e|0)<(c[a+120>>2]|0))return h|0;c[a+120>>2]=e+1;return h|0}function ig(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0;c[b+4>>2]=1065353216;c[b+8>>2]=1065353216;c[b+12>>2]=1065353216;g[b+16>>2]=0.0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[b+48>>2]=0;c[b>>2]=8796;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+164>>0]=d&1;a[b+165>>0]=e&1;g[b+168>>2]=0.0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+24>>2]|0;if((e|0)>0){d=0;do{h=f+(d<<5)|0;i=(c[b+32>>2]|0)+(d<<5)|0;c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[h+16>>2]=c[i+16>>2];c[h+20>>2]=c[i+20>>2];c[h+24>>2]=c[i+24>>2];c[h+28>>2]=c[i+28>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=f;c[b+28>>2]=1;i=c[b+24>>2]|0;c[f+(i<<5)>>2]=0;c[f+(i<<5)+4>>2]=0;c[f+(i<<5)+8>>2]=12;c[f+(i<<5)+12>>2]=0;c[f+(i<<5)+16>>2]=0;c[f+(i<<5)+20>>2]=16;c[f+(i<<5)+24>>2]=2;c[f+(i<<5)+28>>2]=0;c[b+24>>2]=(c[b+24>>2]|0)+1;i=(a[b+164>>0]|0)==0;d=c[b+32>>2]|0;c[d>>2]=(c[(i?b+148|0:b+128|0)>>2]|0)/3|0;c[d+4>>2]=0;c[d+24>>2]=i?3:2;c[d+8>>2]=i?6:12;if(!(a[b+165>>0]|0)){h=12;b=(c[b+108>>2]|0)/3|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}else{h=16;b=c[b+88>>2]|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}}function jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;f=l;l=l+112|0;h=c[a+28>>2]|0;x=+g[d>>2];D=+g[h>>2];w=+g[d+16>>2];C=+g[h+4>>2];v=+g[d+32>>2];B=+g[h+8>>2];u=+g[d+4>>2];t=+g[d+20>>2];s=+g[d+36>>2];r=+g[d+8>>2];p=+g[d+24>>2];n=+g[d+40>>2];A=+g[h+16>>2];z=+g[h+20>>2];y=+g[h+24>>2];q=+g[h+32>>2];o=+g[h+36>>2];m=+g[h+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];i=+g[d+56>>2];k=+g[h+48>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[h+52>>2];i=q*F+o*E+m*i+ +g[h+56>>2];g[f+48>>2]=x*D+w*C+v*B;g[f+48+4>>2]=D*u+C*t+B*s;g[f+48+8>>2]=D*r+C*p+B*n;g[f+48+12>>2]=0.0;g[f+48+16>>2]=x*A+w*z+v*y;g[f+48+20>>2]=u*A+t*z+s*y;g[f+48+24>>2]=r*A+p*z+n*y;g[f+48+28>>2]=0.0;g[f+48+32>>2]=x*q+w*o+v*m;g[f+48+36>>2]=u*q+t*o+s*m;g[f+48+40>>2]=r*q+p*o+n*m;g[f+48+44>>2]=0.0;g[f+48+48>>2]=k;g[f+48+52>>2]=j;g[f+48+56>>2]=i;g[f+48+60>>2]=0.0;h=c[a+32>>2]|0;g[f+24+4>>2]=1.0;c[f+24+8>>2]=1;c[f+24+12>>2]=-1;c[f+24>>2]=6260;c[f+24+16>>2]=h;c[f+24+20>>2]=b;c[f+24+4>>2]=c[h+4>>2];h=c[a+4>>2]|0;d=c[h+8>>2]|0;c[f>>2]=h;c[f+4>>2]=e;c[f+8>>2]=d;c[f+12>>2]=f+48;c[f+16>>2]=-1;c[f+20>>2]=b;vc(c[a+8>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,f,f+24|0,+g[a+20>>2]);l=f;return}function kg(){var b=0,d=0,e=0;b=Us(348)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;c[b>>2]=5400;c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d){e=0;Li(e);d=b+344|0;c[d>>2]=e;return b|0}c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16;Li(d);e=b+344|0;c[e>>2]=d;return b|0}function lg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0;k=l;l=l+16|0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=1065353216;c[b+20>>2]=1065353216;c[b+24>>2]=1065353216;g[b+28>>2]=0.0;g[b+48>>2]=.03999999910593033;c[b+56>>2]=0;c[b+60>>2]=1065353216;c[b+64>>2]=1065353216;c[b+68>>2]=1065353216;g[b+72>>2]=0.0;c[b+76>>2]=-1082130432;c[b+80>>2]=-1082130432;c[b+84>>2]=-1082130432;g[b+88>>2]=0.0;a[b+92>>0]=0;c[b>>2]=7604;a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b+4>>2]=4;if((e|0)<=0){c[b+100>>2]=e;uj(b);l=k;return}c[6995]=(c[6995]|0)+1;h=sc((e<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+100>>2]|0;if((i|0)>0){h=0;do{m=j+(h<<4)|0;n=(c[b+108>>2]|0)+(h<<4)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+108>>2]|0;if(h|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=j;c[b+104>>2]=e;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];if((e|0)!=1){h=1;do{n=(c[b+108>>2]|0)+(h<<4)|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];h=h+1|0}while((h|0)!=(e|0))}c[b+100>>2]=e;h=0;while(1){j=c[d+4>>2]|0;m=c[d+8>>2]|0;n=c[b+108>>2]|0;c[n+(h<<4)>>2]=c[d>>2];c[n+(h<<4)+4>>2]=j;c[n+(h<<4)+8>>2]=m;g[n+(h<<4)+12>>2]=0.0;h=h+1|0;if((h|0)==(e|0))break;else d=d+f|0}uj(b);l=k;return}function mg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0;s=l;l=l+48|0;q=+g[d>>2];p=+g[d+4>>2];r=+g[d+8>>2];j=q*+g[b+4>>2]+p*+g[b+20>>2]+r*+g[b+36>>2];k=q*+g[b+8>>2]+p*+g[b+24>>2]+r*+g[b+40>>2];g[s+32>>2]=+g[b>>2]*q+ +g[b+16>>2]*p+ +g[b+32>>2]*r;g[s+32+4>>2]=j;g[s+32+8>>2]=k;g[s+32+12>>2]=0.0;Sb[c[(c[a>>2]|0)+64>>2]&127](s+16|0,a,s+32|0);k=+g[s+16>>2];j=+g[s+16+4>>2];r=+g[s+16+8>>2];p=k*+g[b>>2]+j*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];q=k*+g[b+16>>2]+j*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];r=k*+g[b+32>>2]+j*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];t=c[(c[a>>2]|0)+64>>2]|0;j=-+g[s+32+4>>2];k=-+g[s+32+8>>2];g[s>>2]=-+g[s+32>>2];g[s+4>>2]=j;g[s+8>>2]=k;g[s+12>>2]=0.0;Sb[t&127](s+16|0,a,s);k=+g[s+16>>2];j=+g[s+16+4>>2];m=+g[s+16+8>>2];n=k*+g[b>>2]+j*+g[b+4>>2]+m*+g[b+8>>2]+ +g[b+48>>2];o=k*+g[b+16>>2]+j*+g[b+20>>2]+m*+g[b+24>>2]+ +g[b+52>>2];m=k*+g[b+32>>2]+j*+g[b+36>>2]+m*+g[b+40>>2]+ +g[b+56>>2];g[e>>2]=p*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2];g[f>>2]=n*+g[d>>2]+o*+g[d+4>>2]+m*+g[d+8>>2];g[i>>2]=n;g[i+4>>2]=o;g[i+8>>2]=m;g[i+12>>2]=0.0;g[h>>2]=p;g[h+4>>2]=q;g[h+8>>2]=r;g[h+12>>2]=0.0;j=+g[e>>2];k=+g[f>>2];if(!(j>k)){l=s;return}g[e>>2]=k;g[f>>2]=j;g[i>>2]=p;g[i+4>>2]=q;g[i+8>>2]=r;g[i+12>>2]=0.0;g[h>>2]=n;g[h+4>>2]=o;g[h+8>>2]=m;g[h+12>>2]=0.0;l=s;return}function ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;if((b|0)<0)b=c[a+12>>2]|0;d=c[a>>2]|0;if(!((b|0)>0&(d|0)!=0)){l=n;return}while(1){e=d+40|0;if(c[e>>2]|0){m=0;while(1){g=d+32|0;h=c[g>>2]|0;if(h>>>0>d>>>0){i=(c[h+40>>2]|0)==(d|0)&1;j=c[h+36+((i^1)<<2)>>2]|0;k=c[h+32>>2]|0;if(!k)f=a;else f=k+36+(((c[k+40>>2]|0)==(h|0)&1)<<2)|0;c[f>>2]=d;c[j+32>>2]=d;c[h+32>>2]=d;c[g>>2]=k;k=d+36|0;c[h+36>>2]=c[k>>2];c[h+40>>2]=c[e>>2];c[(c[k>>2]|0)+32>>2]=h;c[(c[e>>2]|0)+32>>2]=h;c[d+36+(i<<2)>>2]=h;c[d+36+((i^1)<<2)>>2]=j;c[n>>2]=c[h>>2];c[n+4>>2]=c[h+4>>2];c[n+8>>2]=c[h+8>>2];c[n+12>>2]=c[h+12>>2];c[n+16>>2]=c[h+16>>2];c[n+20>>2]=c[h+20>>2];c[n+24>>2]=c[h+24>>2];c[n+28>>2]=c[h+28>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];c[h+16>>2]=c[d+16>>2];c[h+20>>2]=c[d+20>>2];c[h+24>>2]=c[d+24>>2];c[h+28>>2]=c[d+28>>2];c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];c[d+16>>2]=c[n+16>>2];c[d+20>>2]=c[n+20>>2];c[d+24>>2]=c[n+24>>2];c[d+28>>2]=c[n+28>>2];d=h}d=c[d+36+(((c[a+16>>2]|0)>>>m&1)<<2)>>2]|0;e=d+40|0;if(!(c[e>>2]|0))break;else m=m+1&31}}if(!(Ag(a,d)|0))e=0;else e=c[a>>2]|0;Pe(a,e,d);c[a+16>>2]=(c[a+16>>2]|0)+1;b=b+-1|0;if(!b)break;d=c[a>>2]|0}l=n;return}function og(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0;i=l;l=l+32|0;d=a[b+8>>0]|0?d:e;if(((c[(c[d+4>>2]|0)+4>>2]|0)+-21|0)>>>0>=9){l=i;return}e=c[(c[d+8>>2]|0)+192>>2]|0;y=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[b+64>>2]=f;g[b+68>>2]=y+.05999999865889549;c[b+56>>2]=h;h=c[b+16>>2]|0;Sb[c[(c[h>>2]|0)+28>>2]&127](h,i+16|0,i);y=+g[i>>2];x=+g[i+16>>2];w=+g[i+4>>2];v=+g[i+16+4>>2];u=+g[i+8>>2];t=+g[i+16+8>>2];h=c[d+12>>2]|0;B=+g[h>>2];o=+g[h+16>>2];D=+g[h+32>>2];z=+g[h+4>>2];m=+g[h+20>>2];A=+g[h+36>>2];q=+g[h+8>>2];j=+g[h+24>>2];r=+g[h+40>>2];E=-+g[h+48>>2];s=-+g[h+52>>2];k=-+g[h+56>>2];p=(y+x)*.5*B+(w+v)*.5*o+(u+t)*.5*D+(B*E+o*s+D*k);n=(y+x)*.5*z+(w+v)*.5*m+(u+t)*.5*A+(z*E+m*s+A*k);k=(y+x)*.5*q+(w+v)*.5*j+(u+t)*.5*r+(q*E+j*s+r*k);s=+g[b+68>>2];o=((y-x)*.5+s)*+C(+(B+o*0.0+D*0.0))+((w-v)*.5+s)*+C(+(B*0.0+o+D*0.0))+((u-t)*.5+s)*+C(+(D+(B*0.0+o*0.0)));m=((y-x)*.5+s)*+C(+(z+m*0.0+A*0.0))+((w-v)*.5+s)*+C(+(z*0.0+m+A*0.0))+((u-t)*.5+s)*+C(+(A+(z*0.0+m*0.0)));j=((y-x)*.5+s)*+C(+(q+j*0.0+r*0.0))+((w-v)*.5+s)*+C(+(q*0.0+j+r*0.0))+((u-t)*.5+s)*+C(+(r+(q*0.0+j*0.0)));g[b+24>>2]=p-o;g[b+28>>2]=n-m;g[b+32>>2]=k-j;g[b+36>>2]=0.0;g[b+40>>2]=p+o;g[b+44>>2]=n+m;g[b+48>>2]=k+j;g[b+52>>2]=0.0;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+12|0,b+24|0,b+40|0);l=i;return}function pg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0;x=l;l=l+48|0;u=+g[e>>2];v=+g[d>>2];w=+g[e+4>>2];t=+g[d+4>>2];s=+g[e+8>>2];n=+g[d+8>>2];o=+D(+((u-v)*.5*(u-v)*.5+(w-t)*.5*(w-t)*.5+(s-n)*.5*(s-n)*.5));p=+g[a+60>>2];d=+C(+p)>.7071067690849304;q=+g[a+56>>2];if(d){m=1.0/+D(+(p*p+q*q));r=+g[a+52>>2];f=r*-(p*m);h=(p*p+q*q)*m;i=0.0;j=-(r*q*m);k=-(p*m);m=q*m}else{r=+g[a+52>>2];k=1.0/+D(+(r*r+q*q));f=(r*r+q*q)*k;h=-(p*r*k);i=-(q*k);j=p*-(q*k);k=r*k;m=0.0}y=(u+v)*.5*r+(w+t)*.5*q+(s+n)*.5*p-+g[a+68>>2];z=(u+v)*.5-r*y;i=o*i;r=o*k;v=o*m;k=o*h;m=o*j;u=o*f;g[x>>2]=k+(i+z);g[x+4>>2]=m+(r+((w+t)*.5-q*y));g[x+8>>2]=u+(v+((s+n)*.5-p*y));g[x+12>>2]=0.0;g[x+16>>2]=i+z-k;g[x+20>>2]=r+((w+t)*.5-q*y)-m;g[x+24>>2]=v+((s+n)*.5-p*y)-u;g[x+28>>2]=0.0;g[x+32>>2]=z-i-k;g[x+36>>2]=(w+t)*.5-q*y-r-m;g[x+40>>2]=(s+n)*.5-p*y-v-u;g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,0);g[x>>2]=z-i-k;g[x+4>>2]=(w+t)*.5-q*y-r-m;g[x+8>>2]=(s+n)*.5-p*y-v-u;g[x+12>>2]=0.0;g[x+16>>2]=k+(z-i);g[x+20>>2]=m+((w+t)*.5-q*y-r);g[x+24>>2]=u+((s+n)*.5-p*y-v);g[x+28>>2]=0.0;g[x+32>>2]=k+(i+z);g[x+36>>2]=m+(r+((w+t)*.5-q*y));g[x+40>>2]=u+(v+((s+n)*.5-p*y));g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,1);l=x;return}function qg(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if(!(a[d+164>>0]|0)){f=c[d+148>>2]|0;if((f|0)==(c[d+152>>2]|0)?(k=f|0?f<<1:1,(f|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<1)+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+148>>2]|0}h=c[d+156>>2]|0;if((f|0)<=0)if(!h)f=d+160|0;else g=27;else{g=0;do{b[i+(g<<1)>>1]=b[h+(g<<1)>>1]|0;g=g+1|0}while((g|0)!=(f|0));g=27}if((g|0)==27){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=k;f=c[d+148>>2]|0}b[(c[d+156>>2]|0)+(f<<1)>>1]=e;c[d+148>>2]=f+1;k=d+156|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}else{f=c[d+128>>2]|0;if((f|0)==(c[d+132>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+128>>2]|0}h=c[d+136>>2]|0;if((f|0)<=0)if(!h)f=d+140|0;else g=12;else{g=0;do{c[i+(g<<2)>>2]=c[h+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0));g=12}if((g|0)==12){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=j;f=c[d+128>>2]|0}c[(c[d+136>>2]|0)+(f<<2)>>2]=e;c[d+128>>2]=(c[d+128>>2]|0)+1;k=d+136|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}}function rg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;ce(b,d);c[b>>2]=3244;c[6995]=(c[6995]|0)+1;e=sc(27)|0;i=e+4+15&-16;c[i+-4>>2]=e;a[i+4>>0]=0;c[(e+4+15&-16)>>2]=3276;c[b+88>>2]=i;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3296;c[b+92>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3296;c[b+96>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3316;c[b+100>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3336;c[b+104>>2]=e;a[e+4>>0]=1;if(!(a[b+20>>0]|0))return;e=c[b+16>>2]|0;if(!e)return;if((c[e>>2]|0)>=156)return;f=c[e+16>>2]|0;if(f){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+16>>2]|0;if(!e)i=b+16|0;else{f=b+16|0;g=11}}else{f=b+16|0;g=11}if((g|0)==11){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);i=f}c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}e=c[d+12>>2]|0;c[h>>2]=156;f=h+4|0;c[f>>2]=e;c[h+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*156|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[h+16>>2]=e;c[h+12>>2]=e;f=c[f>>2]|0;c[h+8>>2]=f;if(f+-1|0){b=c[h>>2]|0;g=e;d=f+-1|0;do{j=g;g=g+b|0;c[j>>2]=g;d=d+-1|0}while((d|0)!=0);e=e+(P(b,f+-1|0)|0)|0}c[e>>2]=0;c[i>>2]=h;return}function sg(a,b,e){a=a|0;b=b|0;e=e|0;bf(a,b,e)|0;c[b+264>>2]=c[a+324>>2];c[b+268>>2]=c[a+328>>2];c[b+272>>2]=c[a+332>>2];c[b+276>>2]=c[a+336>>2];c[b+280>>2]=c[a+340>>2];c[b+284>>2]=c[a+344>>2];c[b+288>>2]=c[a+348>>2];c[b+292>>2]=c[a+352>>2];c[b+296>>2]=c[a+356>>2];c[b+300>>2]=c[a+360>>2];c[b+304>>2]=c[a+364>>2];c[b+308>>2]=c[a+368>>2];c[b+312>>2]=c[a+372>>2];c[b+316>>2]=c[a+376>>2];c[b+320>>2]=c[a+380>>2];c[b+324>>2]=c[a+384>>2];c[b+328>>2]=c[a+388>>2];c[b+332>>2]=c[a+392>>2];c[b+336>>2]=c[a+396>>2];c[b+340>>2]=c[a+400>>2];c[b+456>>2]=c[a+404>>2];c[b+344>>2]=c[a+604>>2];c[b+348>>2]=c[a+608>>2];c[b+352>>2]=c[a+612>>2];c[b+356>>2]=c[a+616>>2];c[b+360>>2]=c[a+408>>2];c[b+364>>2]=c[a+412>>2];c[b+368>>2]=c[a+416>>2];c[b+372>>2]=c[a+420>>2];c[b+376>>2]=c[a+424>>2];c[b+380>>2]=c[a+428>>2];c[b+384>>2]=c[a+432>>2];c[b+388>>2]=c[a+436>>2];c[b+392>>2]=c[a+440>>2];c[b+396>>2]=c[a+444>>2];c[b+400>>2]=c[a+448>>2];c[b+404>>2]=c[a+452>>2];c[b+408>>2]=c[a+456>>2];c[b+412>>2]=c[a+460>>2];c[b+416>>2]=c[a+464>>2];c[b+420>>2]=c[a+468>>2];c[b+424>>2]=c[a+472>>2];c[b+428>>2]=c[a+476>>2];c[b+432>>2]=c[a+480>>2];c[b+436>>2]=c[a+484>>2];c[b+440>>2]=c[a+488>>2];c[b+444>>2]=c[a+492>>2];c[b+448>>2]=c[a+496>>2];c[b+452>>2]=c[a+500>>2];c[b+460>>2]=c[a+504>>2];c[b+464>>2]=c[a+508>>2];c[b+492>>2]=d[a+512>>0];c[b+468>>2]=c[a+516>>2];c[b+472>>2]=c[a+520>>2];c[b+476>>2]=c[a+524>>2];c[b+480>>2]=c[a+528>>2];c[b+484>>2]=c[a+532>>2];c[b+488>>2]=c[a+536>>2];return 12085}function tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0,l=0,m=0.0;c[6131]=(c[6131]|0)+1;if(!(c[b+4>>2]&2))j=.019999999552965164;else{k=c[d+192>>2]|0;i=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);k=c[e+192>>2]|0;j=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);j=i>2];i=+g[e+184>>2];i=m>2]|0;h=c[f+12>>2]|0;if(!h){if(c[b+4>>2]&4|0){b=0;return b|0}c[6995]=(c[6995]|0)+1;f=sc(823)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}}else{c[f+12>>2]=c[h>>2];c[f+8>>2]=(c[f+8>>2]|0)+-1;k=h}c[k>>2]=1025;f=k+120|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+312|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+504|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+696|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[k+772>>2]=d;c[k+776>>2]=e;c[k+780>>2]=0;g[k+784>>2]=j;g[k+788>>2]=i;e=k;f=c[b+12>>2]|0;c[k+800>>2]=f;if((f|0)==(c[b+16>>2]|0)?(l=f|0?f<<1:1,(f|0)<(l|0)):0){if(!l)d=0;else{c[6995]=(c[6995]|0)+1;f=sc((l<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=f;f=c[b+12>>2]|0}if((f|0)>0){h=0;do{c[d+(h<<2)>>2]=c[(c[b+20>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+20>>2]|0;if(h){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=d;c[b+16>>2]=l}c[(c[b+20>>2]|0)+(f<<2)>>2]=e;c[b+12>>2]=f+1;b=k;return b|0}function ug(b,d,e,f,h,i,k,l,m){b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;k=k|0;l=l|0;m=m|0;var n=0,o=0.0,p=0.0,q=0.0,r=0.0;n=at()|0;c[n+8>>2]=0;c[n+12>>2]=-1;g[n+16>>2]=0.0;c[n>>2]=8404;c[n+4>>2]=24;c[n+68>>2]=b;c[n+72>>2]=d;g[n+76>>2]=h;g[n+80>>2]=i;g[n+84>>2]=+(b+-1|0);g[n+88>>2]=+(d+-1|0);g[n+92>>2]=f;c[n+96>>2]=e;c[n+100>>2]=l;a[n+104>>0]=m&1;a[n+105>>0]=0;a[n+106>>0]=0;c[n+108>>2]=k;c[n+112>>2]=1065353216;c[n+116>>2]=1065353216;c[n+120>>2]=1065353216;g[n+124>>2]=0.0;switch(k|0){case 0:{g[n+20>>2]=h;c[n+24>>2]=0;b=n+88|0;d=n+84|0;e=n+80|0;f=0.0;i=0.0;break}case 1:{c[n+20>>2]=0;g[n+24>>2]=h;b=n+88|0;d=n+80|0;e=n+84|0;f=0.0;i=h;h=0.0;break}case 2:{c[n+20>>2]=0;c[n+24>>2]=0;b=n+80|0;d=n+88|0;e=n+84|0;f=h;i=0.0;h=0.0;break}default:{q=+g[n+36>>2];h=+g[n+20>>2];p=+g[n+40>>2];f=+g[n+24>>2];o=+g[n+44>>2];i=+g[n+28>>2];h=q+h;f=p+f;i=o+i;h=h*.5;f=f*.5;i=i*.5;m=n+52|0;g[m>>2]=h;m=n+56|0;g[m>>2]=f;m=n+60|0;g[m>>2]=i;m=n+64|0;g[m>>2]=0.0;return n|0}}g[n+28>>2]=f;g[n+32>>2]=0.0;k=c[e>>2]|0;c[n+36>>2]=k;l=c[d>>2]|0;c[n+40>>2]=l;m=c[b>>2]|0;c[n+44>>2]=m;g[n+48>>2]=0.0;r=(c[j>>2]=k,+g[j>>2]);p=(c[j>>2]=l,+g[j>>2]);o=h;h=p;p=i;i=(c[j>>2]=m,+g[j>>2]);q=f;o=r+o;p=h+p;q=i+q;o=o*.5;p=p*.5;q=q*.5;m=n+52|0;g[m>>2]=o;m=n+56|0;g[m>>2]=p;m=n+60|0;g[m>>2]=q;m=n+64|0;g[m>>2]=0.0;return n|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);d=c[a+8>>2]|0;if((d|0)<=0){dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&8){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645651,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}function wg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=c[d>>2]|0;l=zb[c[(c[l>>2]|0)+56>>2]&31](l,116)|0;ul(l,d,e,f,0);c[l>>2]=6576;a[l+104>>0]=1;c[l+100>>2]=0;c[l+92>>2]=0;c[l+96>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(83)|0;if(!b)h=0;else{c[(b+4+15&-16)+-4>>2]=b;h=b+4+15&-16}c[h>>2]=9668;i=h+20|0;a[i>>0]=1;j=h+16|0;c[j>>2]=0;d=h+8|0;c[d>>2]=0;k=h+12|0;c[k>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(43)|0;if(!b)g=0;else{c[(b+4+15&-16)+-4>>2]=b;g=b+4+15&-16}d=c[d>>2]|0;if((d|0)>0){b=0;do{m=g+(b*12|0)|0;n=(c[j>>2]|0)+(b*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];b=b+1|0}while((b|0)!=(d|0))}b=c[j>>2]|0;if(!b){a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[j>>2]=0;a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}function xg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;g=c[a+52>>2]|0;Bb[c[(c[g>>2]|0)+56>>2]&63](g,b+12|0,d)|0;c[b+52>>2]=c[a+16>>2];do if((c[a+56>>2]|0)!=0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&1|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+56>>2]|0)|0;if(!e){c[b+40>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+56>>2]|0)|0;c[b+44>>2]=0;e=c[a+56>>2]|0;e=xb[c[(c[e>>2]|0)+12>>2]&127](e)|0;e=Bb[c[(c[d>>2]|0)+16>>2]&63](d,e,1)|0;g=c[a+56>>2]|0;g=Bb[c[(c[g>>2]|0)+16>>2]&63](g,c[e+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,e,g,1213612625,c[a+56>>2]|0);break}else{c[b+40>>2]=e;c[b+44>>2]=0;break}}else f=8;while(0);if((f|0)==8){c[b+40>>2]=0;c[b+44>>2]=0}if(c[a+60>>2]|0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&2|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+60>>2]|0)|0;if(!e){c[b+48>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+60>>2]|0)|0;f=c[a+60>>2]|0;f=xb[c[(c[f>>2]|0)+8>>2]&127](f)|0;f=Bb[c[(c[d>>2]|0)+16>>2]&63](d,f,1)|0;g=c[a+60>>2]|0;g=Bb[c[(c[g>>2]|0)+12>>2]&63](g,c[f+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,f,g,1346456916,c[a+60>>2]|0);g=b+56|0;c[g>>2]=0;return 16561}else{c[b+48>>2]=e;g=b+56|0;c[g>>2]=0;return 16561}}c[b+48>>2]=0;g=b+56|0;c[g>>2]=0;return 16561}function yg(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+32|0;d=c[a+8>>2]|0;if((d|0)<=0){l=h;return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if((!((e|0)==0?1:(c[e+252>>2]&2|0)==0)?(c[e+220>>2]|0)!=2:0)?!(b==0.0?1:(c[e+204>>2]&2|0)==0):0){d=c[e+540>>2]|0;if(!d)d=e+4|0;else{Ob[c[(c[d>>2]|0)+8>>2]&127](d,e+4|0);d=e+4|0}j=1.0/b*(+g[e+56>>2]-+g[e+120>>2]);k=1.0/b*(+g[e+60>>2]-+g[e+124>>2]);g[e+372>>2]=1.0/b*(+g[e+52>>2]-+g[e+116>>2]);g[e+376>>2]=j;g[e+380>>2]=k;g[e+384>>2]=0.0;If(e+68|0,d,h+8|0,h);k=+g[h>>2];j=1.0/b*k*+g[h+8+4>>2];i=1.0/b*k*+g[h+8+8>>2];g[e+388>>2]=1.0/b*+g[h+8>>2]*k;g[e+392>>2]=j;g[e+396>>2]=i;g[e+400>>2]=0.0;c[e+132>>2]=c[e+372>>2];c[e+132+4>>2]=c[e+372+4>>2];c[e+132+8>>2]=c[e+372+8>>2];c[e+132+12>>2]=c[e+372+12>>2];c[e+148>>2]=c[e+388>>2];c[e+148+4>>2]=c[e+388+4>>2];c[e+148+8>>2]=c[e+388+8>>2];c[e+148+12>>2]=c[e+388+12>>2];c[e+68>>2]=c[d>>2];c[e+68+4>>2]=c[d+4>>2];c[e+68+8>>2]=c[d+8>>2];c[e+68+12>>2]=c[d+12>>2];c[e+84>>2]=c[e+20>>2];c[e+84+4>>2]=c[e+20+4>>2];c[e+84+8>>2]=c[e+20+8>>2];c[e+84+12>>2]=c[e+20+12>>2];c[e+100>>2]=c[e+36>>2];c[e+100+4>>2]=c[e+36+4>>2];c[e+100+8>>2]=c[e+36+8>>2];c[e+100+12>>2]=c[e+36+12>>2];c[e+116>>2]=c[e+52>>2];c[e+116+4>>2]=c[e+52+4>>2];c[e+116+8>>2]=c[e+52+8>>2];c[e+116+12>>2]=c[e+52+12>>2];d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));l=h;return}function zg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=qt()|0;c[i+4>>2]=4;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4996;c[i+552>>2]=c[e>>2];c[i+552+4>>2]=c[e+4>>2];c[i+552+8>>2]=c[e+8>>2];c[i+552+12>>2]=c[e+12>>2];c[i+568>>2]=c[e+16>>2];c[i+568+4>>2]=c[e+16+4>>2];c[i+568+8>>2]=c[e+16+8>>2];c[i+568+12>>2]=c[e+16+12>>2];c[i+584>>2]=c[e+32>>2];c[i+584+4>>2]=c[e+32+4>>2];c[i+584+8>>2]=c[e+32+8>>2];c[i+584+12>>2]=c[e+32+12>>2];c[i+600>>2]=c[e+48>>2];c[i+600+4>>2]=c[e+48+4>>2];c[i+600+8>>2]=c[e+48+8>>2];c[i+600+12>>2]=c[e+48+12>>2];c[i+616>>2]=c[f>>2];c[i+616+4>>2]=c[f+4>>2];c[i+616+8>>2]=c[f+8>>2];c[i+616+12>>2]=c[f+12>>2];c[i+632>>2]=c[f+16>>2];c[i+632+4>>2]=c[f+16+4>>2];c[i+632+8>>2]=c[f+16+8>>2];c[i+632+12>>2]=c[f+16+12>>2];c[i+648>>2]=c[f+32>>2];c[i+648+4>>2]=c[f+32+4>>2];c[i+648+8>>2]=c[f+32+8>>2];c[i+648+12>>2]=c[f+32+12>>2];c[i+664>>2]=c[f+48>>2];c[i+664+4>>2]=c[f+48+4>>2];c[i+664+8>>2]=c[f+48+8>>2];c[i+664+12>>2]=c[f+48+12>>2];g[i+688>>2]=0.0;g[i+692>>2]=-1.0;g[i+696>>2]=.8999999761581421;g[i+700>>2]=.30000001192092896;g[i+704>>2]=1.0;g[i+708>>2]=0.0;g[i+712>>2]=0.0;a[i+716>>0]=0;a[i+736>>0]=0;a[i+737>>0]=0;a[i+738>>0]=0;a[i+739>>0]=1;a[i+740>>0]=h&1;c[i+748>>2]=0;c[i+748+4>>2]=0;c[i+748+8>>2]=0;c[i+748+12>>2]=0;c[i+748+16>>2]=0;g[i+732>>2]=h?-1.0:1.0;return i|0}function Ag(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((c[a>>2]|0)==(b|0)){c[a>>2]=0;a=0;return a|0}e=c[b+32>>2]|0;d=c[e+32>>2]|0;b=c[e+36+(((c[e+40>>2]|0)!=(b|0)&1)<<2)>>2]|0;a:do if(!d){c[a>>2]=b;c[b+32>>2]=0;d=c[a+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[a+4>>2]=e}else{c[d+36+(((c[d+40>>2]|0)==(e|0)&1)<<2)>>2]=b;c[b+32>>2]=d;b=c[a+4>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[a+4>>2]=e;while(1){n=+g[d>>2];r=d+4|0;p=+g[r>>2];w=d+8|0;o=+g[w>>2];e=d+16|0;m=+g[e>>2];t=d+20|0;k=+g[t>>2];u=d+24|0;h=+g[u>>2];v=c[d+36>>2]|0;q=c[d+40>>2]|0;b=c[(+g[v>>2]<+g[q>>2]?v:q)>>2]|0;c[d>>2]=b;s=c[(+g[v+16>>2]>+g[q+16>>2]?v+16|0:q+16|0)>>2]|0;c[e>>2]=s;e=c[(+g[v+4>>2]<+g[q+4>>2]?v:q)+4>>2]|0;c[r>>2]=e;r=c[(+g[v+20>>2]>+g[q+20>>2]?v+16|0:q+16|0)+4>>2]|0;c[t>>2]=r;t=c[(+g[v+8>>2]<+g[q+8>>2]?v:q)+8>>2]|0;c[w>>2]=t;q=c[(+g[v+24>>2]>+g[q+24>>2]?v+16|0:q+16|0)+8>>2]|0;c[u>>2]=q;b=n!=(c[j>>2]=b,+g[j>>2]);n=(c[j>>2]=t,+g[j>>2]);l=(c[j>>2]=s,+g[j>>2]);i=(c[j>>2]=r,+g[j>>2]);f=(c[j>>2]=q,+g[j>>2]);if(!(b|p!=(c[j>>2]=e,+g[j>>2])|o!=n|m!=l|k!=i|h!=f))break;d=c[d+32>>2]|0;if(!d)break a}return d|0}while(0);w=c[a>>2]|0;return w|0}function Bg(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0;h=l;l=l+16|0;d=+g[a+396>>2]*b;b=+g[a+512>>2];f=c[a+852>>2]|0;if((f|0)<=0){l=h;return}e=0;do{t=c[a+860>>2]|0;j=t+(e*96|0)+20|0;w=c[j>>2]|0;o=c[t+(e*96|0)>>2]|0;z=+g[t+(e*96|0)+4>>2];y=+g[t+(e*96|0)+8>>2];x=+g[t+(e*96|0)+12>>2];i=t+(e*96|0)+76|0;v=+g[w+392>>2];q=+g[t+(e*96|0)+84>>2];A=+g[w+396>>2];m=+g[t+(e*96|0)+80>>2];k=+g[i>>2];n=+g[w+388>>2];s=+g[o+8>>2];r=+g[o+12>>2];p=+g[o+16>>2];u=d*(z*+g[w+4>>2]+y*+g[w+8>>2]+x*+g[w+12>>2]+ +g[w+52>>2]-s)+(b*(v*q-A*m+ +g[w+372>>2])-(s-+g[o+24>>2]));q=d*(z*+g[w+20>>2]+y*+g[w+24>>2]+x*+g[w+28>>2]+ +g[w+56>>2]-r)+(b*(+g[w+376>>2]+(A*k-q*n))-(r-+g[o+28>>2]));k=d*(z*+g[w+36>>2]+y*+g[w+40>>2]+x*+g[w+44>>2]+ +g[w+60>>2]-p)+(b*(m*n-v*k+ +g[w+380>>2])-(p-+g[o+32>>2]));v=+g[t+(e*96|0)+24>>2];n=(u*+g[t+(e*96|0)+28>>2]+q*+g[t+(e*96|0)+32>>2]+ +g[t+(e*96|0)+36>>2]*k)*v;m=(u*+g[t+(e*96|0)+44>>2]+q*+g[t+(e*96|0)+48>>2]+k*+g[t+(e*96|0)+52>>2])*v;k=v*(u*+g[t+(e*96|0)+60>>2]+q*+g[t+(e*96|0)+64>>2]+k*+g[t+(e*96|0)+68>>2]);q=+g[t+(e*96|0)+92>>2];g[o+8>>2]=s+n*q;g[o+12>>2]=q*m+r;g[o+16>>2]=q*k+p;j=c[j>>2]|0;g[h>>2]=-n;g[h+4>>2]=-m;g[h+8>>2]=-k;g[h+12>>2]=0.0;ll(j,h,i);e=e+1|0}while((e|0)!=(f|0));l=h;return}function Cg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0;m=l;l=l+688|0;c[m+568+8>>2]=0;c[m+568+12>>2]=-1;c[m+568+16>>2]=1065353216;c[m+568+20>>2]=1065353216;c[m+568+24>>2]=1065353216;g[m+568+28>>2]=0.0;c[m+568+56>>2]=0;c[m+568>>2]=3924;c[m+568+4>>2]=1;c[m+568+60>>2]=c[d>>2];c[m+568+60+4>>2]=c[d+4>>2];c[m+568+60+8>>2]=c[d+8>>2];c[m+568+60+12>>2]=c[d+12>>2];c[m+568+76>>2]=c[d+16>>2];c[m+568+76+4>>2]=c[d+16+4>>2];c[m+568+76+8>>2]=c[d+16+8>>2];c[m+568+76+12>>2]=c[d+16+12>>2];c[m+568+92>>2]=c[d+32>>2];c[m+568+92+4>>2]=c[d+32+4>>2];c[m+568+92+8>>2]=c[d+32+8>>2];c[m+568+92+12>>2]=c[d+32+12>>2];c[m+568+48>>2]=c[b+204>>2];g[m+208+308>>2]=9.999999747378752e-05;a[m+208+332>>0]=0;c[m+200>>2]=9464;d=c[b+4>>2]|0;c[m+176>>2]=9532;c[m+176+4>>2]=m+208;c[m+176+8>>2]=m+200;c[m+176+12>>2]=d;c[m+176+16>>2]=m+568;c[m+176+20>>2]=0;c[m>>2]=3896;c[m+168>>2]=0;g[m+164>>2]=1.0;c[m+172>>2]=c[b+208>>2];if((Wd(m+176|0,b+8|0,b+72|0,b+136|0,b+136|0,m)|0?(h=+g[m+132>>2],i=+g[m+136>>2],j=+g[m+140>>2],h*h+i*i+j*j>9.999999747378752e-05):0)?(k=+g[m+164>>2],k<+g[b+200>>2]):0){n=1.0/+D(+(h*h+i*i+j*j));g[m+132>>2]=h*n;g[m+136>>2]=i*n;g[m+140>>2]=j*n;+rb[c[(c[b>>2]|0)+12>>2]&3](b,m+132|0,m+148|0,k,e,f)}c[m+568>>2]=7472;b=c[m+568+56>>2]|0;if(!b){l=m;return}Ib[c[c[b>>2]>>2]&511](b);b=c[m+568+56>>2]|0;if(!b){l=m;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);l=m;return}function Dg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=qt()|0;c[h+4>>2]=4;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4996;c[h+552>>2]=c[e>>2];c[h+552+4>>2]=c[e+4>>2];c[h+552+8>>2]=c[e+8>>2];c[h+552+12>>2]=c[e+12>>2];c[h+568>>2]=c[e+16>>2];c[h+568+4>>2]=c[e+16+4>>2];c[h+568+8>>2]=c[e+16+8>>2];c[h+568+12>>2]=c[e+16+12>>2];c[h+584>>2]=c[e+32>>2];c[h+584+4>>2]=c[e+32+4>>2];c[h+584+8>>2]=c[e+32+8>>2];c[h+584+12>>2]=c[e+32+12>>2];c[h+600>>2]=c[e+48>>2];c[h+600+4>>2]=c[e+48+4>>2];c[h+600+8>>2]=c[e+48+8>>2];c[h+600+12>>2]=c[e+48+12>>2];c[h+616>>2]=c[f>>2];c[h+616+4>>2]=c[f+4>>2];c[h+616+8>>2]=c[f+8>>2];c[h+616+12>>2]=c[f+12>>2];c[h+632>>2]=c[f+16>>2];c[h+632+4>>2]=c[f+16+4>>2];c[h+632+8>>2]=c[f+16+8>>2];c[h+632+12>>2]=c[f+16+12>>2];c[h+648>>2]=c[f+32>>2];c[h+648+4>>2]=c[f+32+4>>2];c[h+648+8>>2]=c[f+32+8>>2];c[h+648+12>>2]=c[f+32+12>>2];c[h+664>>2]=c[f+48>>2];c[h+664+4>>2]=c[f+48+4>>2];c[h+664+8>>2]=c[f+48+8>>2];c[h+664+12>>2]=c[f+48+12>>2];g[h+688>>2]=0.0;g[h+692>>2]=-1.0;g[h+696>>2]=.8999999761581421;g[h+700>>2]=.30000001192092896;g[h+704>>2]=1.0;g[h+708>>2]=0.0;g[h+712>>2]=0.0;a[h+716>>0]=0;a[h+736>>0]=0;a[h+737>>0]=0;a[h+738>>0]=0;a[h+739>>0]=1;a[h+740>>0]=0;c[h+748>>2]=0;c[h+748+4>>2]=0;c[h+748+8>>2]=0;c[h+748+12>>2]=0;c[h+748+16>>2]=0;g[h+732>>2]=1.0;return h|0}function Eg(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0;d=c[a+772>>2]|0;if((d|0)>0){b=0;do{l=(c[a+780>>2]|0)+(b*104|0)+72|0;b=b+1|0;c[l>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0}while((b|0)!=(d|0))}d=c[a+812>>2]|0;if((d|0)>0){b=0;do{o=c[a+820>>2]|0;j=c[o+(b*44|0)+12>>2]|0;h=c[o+(b*44|0)+8>>2]|0;k=+g[h+8>>2];e=+g[j+8>>2]-k;f=+g[h+12>>2];i=+g[j+12>>2]-f;m=+g[h+16>>2];n=+g[j+16>>2]-m;l=c[o+(b*44|0)+16>>2]|0;k=+g[l+8>>2]-k;f=+g[l+12>>2]-f;m=+g[l+16>>2]-m;p=1.0/+D(+((e*f-i*k)*(e*f-i*k)+((i*m-n*f)*(i*m-n*f)+(n*k-e*m)*(n*k-e*m))));g[o+(b*44|0)+20>>2]=p*(i*m-n*f);g[o+(b*44|0)+24>>2]=p*(n*k-e*m);g[o+(b*44|0)+28>>2]=(e*f-i*k)*p;c[o+(b*44|0)+32>>2]=0;g[h+72>>2]=i*m-n*f+ +g[h+72>>2];g[h+76>>2]=n*k-e*m+ +g[h+76>>2];g[h+80>>2]=e*f-i*k+ +g[h+80>>2];g[j+72>>2]=i*m-n*f+ +g[j+72>>2];g[j+76>>2]=n*k-e*m+ +g[j+76>>2];g[j+80>>2]=e*f-i*k+ +g[j+80>>2];g[l+72>>2]=i*m-n*f+ +g[l+72>>2];g[l+76>>2]=n*k-e*m+ +g[l+76>>2];g[l+80>>2]=e*f-i*k+ +g[l+80>>2];b=b+1|0}while((b|0)!=(d|0))}l=c[a+772>>2]|0;if((l|0)<=0)return;a=c[a+780>>2]|0;b=0;do{h=a+(b*104|0)+72|0;i=+g[h>>2];j=a+(b*104|0)+76|0;k=+g[j>>2];d=a+(b*104|0)+80|0;e=+g[d>>2];f=+D(+(i*i+k*k+e*e));if(f>1.1920928955078125e-07){g[h>>2]=i*(1.0/f);g[j>>2]=1.0/f*k;g[d>>2]=1.0/f*e}b=b+1|0}while((b|0)!=(l|0));return}function Fg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=ht()|0;c[h+4>>2]=5;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4940;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[e+16>>2];c[h+316+4>>2]=c[e+16+4>>2];c[h+316+8>>2]=c[e+16+8>>2];c[h+316+12>>2]=c[e+16+12>>2];c[h+332>>2]=c[e+32>>2];c[h+332+4>>2]=c[e+32+4>>2];c[h+332+8>>2]=c[e+32+8>>2];c[h+332+12>>2]=c[e+32+12>>2];c[h+348>>2]=c[e+48>>2];c[h+348+4>>2]=c[e+48+4>>2];c[h+348+8>>2]=c[e+48+8>>2];c[h+348+12>>2]=c[e+48+12>>2];c[h+364>>2]=c[f>>2];c[h+364+4>>2]=c[f+4>>2];c[h+364+8>>2]=c[f+8>>2];c[h+364+12>>2]=c[f+12>>2];c[h+380>>2]=c[f+16>>2];c[h+380+4>>2]=c[f+16+4>>2];c[h+380+8>>2]=c[f+16+8>>2];c[h+380+12>>2]=c[f+16+12>>2];c[h+396>>2]=c[f+32>>2];c[h+396+4>>2]=c[f+32+4>>2];c[h+396+8>>2]=c[f+32+8>>2];c[h+396+12>>2]=c[f+32+12>>2];c[h+412>>2]=c[f+48>>2];c[h+412+4>>2]=c[f+48+4>>2];c[h+412+8>>2]=c[f+48+8>>2];c[h+412+12>>2]=c[f+48+12>>2];a[h+552>>0]=0;c[h+524>>2]=0;g[h+572>>2]=-1.0;g[h+444>>2]=999999984306749440.0;g[h+448>>2]=999999984306749440.0;g[h+452>>2]=999999984306749440.0;g[h+428>>2]=1.0;g[h+432>>2]=.30000001192092896;g[h+436>>2]=1.0;g[h+440>>2]=.009999999776482582;g[h+456>>2]=.05000000074505806;c[h+592>>2]=0;g[h+596>>2]=0.0;g[h+600>>2]=.699999988079071;g[h+604>>2]=0.0;return h|0}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;e=+g[d+128>>2];if(!(e!=0.0)){i=0.0;return +i}c[5961]=(c[5961]|0)+1;k=+g[d+96>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=e-k*+g[d+116>>2]-(f*+g[a+144>>2]+h*+g[a+148>>2]+i*+g[a+152>>2]+(+g[d>>2]*+g[a+160>>2]+ +g[d+4>>2]*+g[a+164>>2]+ +g[d+8>>2]*+g[a+168>>2]))*j-j*(+g[d+48>>2]*+g[b+144>>2]+ +g[d+52>>2]*+g[b+148>>2]+ +g[d+56>>2]*+g[b+152>>2]+(+g[d+32>>2]*+g[b+160>>2]+ +g[d+36>>2]*+g[b+164>>2]+ +g[d+40>>2]*+g[b+168>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+144>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+144>>2];g[a+148>>2]=l+ +g[a+148>>2];g[a+152>>2]=k+ +g[a+152>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+160>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+160>>2];g[a+164>>2]=k+ +g[a+164>>2];g[a+168>>2]=l+ +g[a+168>>2]}if(!(c[b+240>>2]|0)){l=e;return +l}l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+144>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+144>>2];g[b+148>>2]=l+ +g[b+148>>2];g[b+152>>2]=k+ +g[b+152>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+160>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+160>>2];g[b+164>>2]=k+ +g[b+164>>2];g[b+168>>2]=l+ +g[b+168>>2];l=e;return +l}function Hg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=+f;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+16|0;c[b>>2]=5168;a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[b+8>>2]=d;c[b+256>>2]=0;c[b+260>>2]=0;c[b+264>>2]=1065353216;g[b+268>>2]=0.0;c[b+272>>2]=0;c[b+276>>2]=0;c[b+280>>2]=1065353216;g[b+284>>2]=0.0;g[b+64>>2]=.019999999552965164;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;c[b+100>>2]=0;c[b+100+4>>2]=0;c[b+100+8>>2]=0;c[b+100+12>>2]=0;a[b+250>>0]=1;g[b+56>>2]=0.0;c[b+12>>2]=e;a[b+251>>0]=1;g[b+252>>2]=0.0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;g[b+52>>2]=29.399999618530273;g[b+28>>2]=55.0;g[b+32>>2]=10.0;g[b+36>>2]=10.0;a[b+248>>0]=0;a[b+249>>0]=0;a[b+288>>0]=1;g[b+148>>2]=0.0;g[b+16>>2]=.20000000298023224;a[b+289>>0]=0;a[b+290>>0]=0;g[b+240>>2]=0.0;g[b+244>>2]=0.0;k=+g[h>>2];m=+g[h+4>>2];n=+g[h+8>>2];if(!(k*k+m*m+n*n>0.0)){ve(b,h);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}i=1.0/+D(+(k*k+m*m+n*n));j=n*i*-29.399999618530273*n*i*-29.399999618530273+(k*i*-29.399999618530273*k*i*-29.399999618530273+m*i*-29.399999618530273*m*i*-29.399999618530273);if(j>0.0){g[o>>2]=-(k*i*-29.399999618530273);g[o+4>>2]=-(m*i*-29.399999618530273);g[o+8>>2]=-(n*i*-29.399999618530273);g[o+12>>2]=0.0;ve(b,o)}g[b+52>>2]=+D(+j);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}function Ig(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=+g[d+100>>2];j=+g[d+16>>2];k=+g[d+20>>2];l=+g[d+24>>2];h=+g[d+108>>2];h=+g[d+112>>2]-f*+g[d+116>>2]-(j*+g[a+64>>2]+k*+g[a+68>>2]+l*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*h-h*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));e=+g[d+120>>2];if(!(f+h>2];if(f+h>e)i=e-f;else{i=h;e=f+h}}else i=e-f;g[d+100>>2]=e;if(c[a+240>>2]|0){h=i*k*+g[a+132>>2]*+g[a+116>>2];k=i*l*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*i*j*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=h+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=i*+g[a+100>>2]*+g[d+68>>2];l=i*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=i*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +i;l=i*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=i*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*i*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=i*+g[b+100>>2]*+g[d+84>>2];l=i*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=i*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +i}function Jg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6415]=(c[6415]|0)+1;k=(((e<<16|d)+~((e<<16|d)<<15)|0)>>>10^(e<<16|d)+~((e<<16|d)<<15))*9|0;k=((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11);l=c[b+12>>2]|0;f=c[(c[b+36>>2]|0)+((l+-1&k)<<2)>>2]|0;a:do if((f|0)!=-1){h=c[b+16>>2]|0;while(1){g=h+(f*12|0)|0;if((c[g>>2]|0)==(d|0)?(c[h+(f*12|0)+4>>2]|0)==(e|0):0)break;f=c[(c[b+56>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}if(g|0){e=g;return e|0}}while(0);j=c[b+8>>2]|0;if((j|0)==(l|0)){h=l|0?l<<1:1;if((l|0)<(h|0)){if(!h){f=0;i=l}else{c[6995]=(c[6995]|0)+1;f=sc((h*12|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+8>>2]|0}if((i|0)>0){g=0;do{m=f+(g*12|0)|0;n=(c[b+16>>2]|0)+(g*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];g=g+1|0}while((g|0)!=(i|0))}g=c[b+16>>2]|0;if(g|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=h;f=c[b+8>>2]|0}else{f=l;h=l}}else{f=j;h=l}c[b+8>>2]=f+1;g=c[b+16>>2]|0;if((l|0)<(h|0)){Nf(b);f=(c[b+12>>2]|0)+-1&k}else f=l+-1&k;c[g+(j*12|0)>>2]=d;c[g+(j*12|0)+4>>2]=e;c[g+(j*12|0)+8>>2]=0;n=(c[b+36>>2]|0)+(f<<2)|0;c[(c[b+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;n=g+(j*12|0)|0;return n|0}function Kg(b){b=b|0;var d=0;d=Us(676)|0;c[d>>2]=5320;c[d+132>>2]=0;c[d+132+4>>2]=0;c[d+132+8>>2]=0;c[d+132+12>>2]=0;c[d+132+16>>2]=0;c[d+132+20>>2]=0;c[d+132+24>>2]=0;c[d+132+28>>2]=0;c[d+164>>2]=1065353216;c[d+168>>2]=1065353216;c[d+172>>2]=1065353216;g[d+176>>2]=0.0;c[d+180>>2]=0;g[d+184>>2]=999999984306749440.0;c[d+188>>2]=0;c[d+188+4>>2]=0;c[d+188+8>>2]=0;c[d+188+12>>2]=0;c[d+204>>2]=1;c[d+208>>2]=-1;c[d+212>>2]=-1;c[d+216>>2]=-1;c[d+220>>2]=1;g[d+224>>2]=0.0;g[d+228>>2]=.5;g[d+232>>2]=0.0;g[d+236>>2]=0.0;g[d+240>>2]=0.0;g[d+244>>2]=.10000000149011612;g[d+248>>2]=1.0e4;c[d+252>>2]=1;c[d+256>>2]=0;c[d+260>>2]=-1;c[d+264>>2]=-1;g[d+268>>2]=1.0;g[d+272>>2]=0.0;g[d+276>>2]=0.0;c[d+280>>2]=0;a[d+300>>0]=1;c[d+296>>2]=0;c[d+288>>2]=0;c[d+292>>2]=0;c[d+304>>2]=0;c[d+4>>2]=1065353216;c[d+8>>2]=0;c[d+8+4>>2]=0;c[d+8+8>>2]=0;c[d+8+12>>2]=0;c[d+24>>2]=1065353216;c[d+28>>2]=0;c[d+28+4>>2]=0;c[d+28+8>>2]=0;c[d+28+12>>2]=0;c[d+44>>2]=1065353216;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;c[d+48+16>>2]=0;c[d+68>>2]=1065353216;c[d+72>>2]=0;c[d+72+4>>2]=0;c[d+72+8>>2]=0;c[d+72+12>>2]=0;c[d+88>>2]=1065353216;c[d+92>>2]=0;c[d+92+4>>2]=0;c[d+92+8>>2]=0;c[d+92+12>>2]=0;c[d+108>>2]=1065353216;c[d+112>>2]=0;c[d+112+4>>2]=0;c[d+112+8>>2]=0;c[d+112+12>>2]=0;c[d+112+16>>2]=0;c[d>>2]=4324;a[d+560>>0]=1;c[d+556>>2]=0;c[d+548>>2]=0;c[d+552>>2]=0;Id(d,b);return d|0}function Lg(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;c[6995]=(c[6995]|0)+1;b=sc((h+2|0)>>>0>268435455?18:(h+2<<4|3)+16|0)|0;if(!b)j=0;else{c[(b+4+15&-16)+-4>>2]=b;j=b+4+15&-16}k=$I((h+2|0)>>>0>1073741823?-1:h+2<<2)|0;if((h|0)>-2){b=0;do{p=+(b|0)/+(h+1|0);o=+g[e>>2];n=+g[e+4>>2];n=n+p*(+g[f+4>>2]-n);m=+g[e+8>>2];m=m+p*(+g[f+8>>2]-m);g[j+(b<<4)>>2]=o+p*(+g[f>>2]-o);g[j+(b<<4)+4>>2]=n;g[j+(b<<4)+8>>2]=m;g[j+(b<<4)+12>>2]=0.0;g[k+(b<<2)>>2]=1.0;b=b+1|0}while((b|0)<(h+2|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)l=0;else{c[(b+4+15&-16)+-4>>2]=b;l=b+4+15&-16}Bc(l,d,h+2|0,j,k);if(i&1|0){g[(c[l+780>>2]|0)+88>>2]=0.0;a[l+984>>0]=1}if(i&2|0){g[(c[l+780>>2]|0)+((h+1|0)*104|0)+88>>2]=0.0;a[l+984>>0]=1}if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}aJ(k);if((h+2|0)<=1)return l|0;j=l+780|0;k=l+792|0;e=l+800|0;f=l+984|0;b=1;do{r=b+-1|0;q=c[j>>2]|0;Xh(l,0);i=(c[k>>2]|0)+-1|0;d=c[e>>2]|0;c[d+(i*52|0)+24>>2]=q+(r*104|0);c[d+(i*52|0)+28>>2]=q+(b*104|0);n=+g[q+(r*104|0)+8>>2]-+g[q+(b*104|0)+8>>2];o=+g[q+(r*104|0)+12>>2]-+g[q+(b*104|0)+12>>2];p=+g[q+(r*104|0)+16>>2]-+g[q+(b*104|0)+16>>2];g[d+(i*52|0)+32>>2]=+D(+(n*n+o*o+p*p));a[f>>0]=1;b=b+1|0}while((b|0)!=(h+2|0));return l|0}function Mg(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0;if(a[b+1308>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);c[d>>2]=0;c[d+4>>2]=6;if((c[b+856>>2]|0)==0?(a[b+788>>0]|0)==0:0){e=0;f=6}else{c[d>>2]=1;c[d+4>>2]=5;e=1;f=5}if(!((c[b+860>>2]|0)==0?(a[b+789>>0]|0)==0:0)){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}if((c[b+864>>2]|0)==0?(a[b+790>>0]|0)==0:0)n=0;else{e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f;n=0}do{k=+g[b+868+(n<<6)>>2];l=+g[b+868+(n<<6)+4>>2];m=+Xj(+g[b+1192+(n<<2)>>2],k,l);g[b+868+(n<<6)+52>>2]=m;do if(!(k>l)){if(k>m){c[b+868+(n<<6)+56>>2]=1;h=b+868+(n<<6)+48|0;g[h>>2]=m-k;if(!(m-k>3.1415927410125732))if(m-k<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-k+i;j=18;break}h=b+868+(n<<6)+56|0;if(l>2]=2;h=b+868+(n<<6)+48|0;g[h>>2]=m-l;if(!(m-l>3.1415927410125732))if(m-l<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-l+i;j=18}else j=17}else{h=b+868+(n<<6)+56|0;j=17}while(0);if((j|0)==17){j=0;c[h>>2]=0;if(a[b+868+(n<<6)+44>>0]|0)j=18}if((j|0)==18){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}n=n+1|0}while((n|0)!=3);return}function Ng(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;k=+g[d+100>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=+g[d+112>>2]-k*+g[d+116>>2]-(f*+g[a+64>>2]+h*+g[a+68>>2]+i*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*j-j*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=l+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +e;l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +e}function Og(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;g=c[b+8>>2]|0;c[d+216>>2]=g;if((g|0)==(c[b+12>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+8>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+16>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+16>>2]|0;if(h){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=i;c[b+12>>2]=j}c[(c[b+16>>2]|0)+(g<<2)>>2]=d;c[b+8>>2]=g+1;c[k+32>>2]=c[d+4>>2];c[k+32+4>>2]=c[d+4+4>>2];c[k+32+8>>2]=c[d+4+8>>2];c[k+32+12>>2]=c[d+4+12>>2];c[k+32+16>>2]=c[d+20>>2];c[k+32+16+4>>2]=c[d+20+4>>2];c[k+32+16+8>>2]=c[d+20+8>>2];c[k+32+16+12>>2]=c[d+20+12>>2];c[k+32+32>>2]=c[d+36>>2];c[k+32+32+4>>2]=c[d+36+4>>2];c[k+32+32+8>>2]=c[d+36+8>>2];c[k+32+32+12>>2]=c[d+36+12>>2];c[k+32+48>>2]=c[d+52>>2];c[k+32+48+4>>2]=c[d+52+4>>2];c[k+32+48+8>>2]=c[d+52+8>>2];c[k+32+48+12>>2]=c[d+52+12>>2];j=c[d+192>>2]|0;Vb[c[(c[j>>2]|0)+8>>2]&127](j,k+32|0,k+16|0,k);j=c[b+68>>2]|0;c[d+188>>2]=Fb[c[(c[j>>2]|0)+8>>2]&3](j,k+16|0,k,c[(c[d+192>>2]|0)+4>>2]|0,d,e,f,c[b+24>>2]|0)|0;l=k;return}function Pg(){var b=0;b=Us(344)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=5356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;return b|0}function Qg(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=4360;if(a[b+288>>0]|0?(d=c[b+220>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+220>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+212>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+212>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}if(a[b+289>>0]|0?(f=c[b+216>>2]|0,Ib[c[c[f>>2]>>2]&511](f),f=c[b+216>>2]|0,f|0):0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}d=c[b+332>>2]|0;if(d|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;d=c[b+304>>2]|0;if(d|0){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;d=c[b+256>>2]|0;if(d|0){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;d=c[b+236>>2]|0;if(d|0){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;d=c[b+204>>2]|0;if(!d){a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}function Rg(a,b,d,e,f,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=+j;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;c[a>>2]=c[h>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];s=+g[e+4>>2];v=+g[a+8>>2];w=+g[e+8>>2];p=+g[a+4>>2];m=+g[a>>2];r=+g[e>>2];u=(s*v-w*p)*+g[b>>2]+ +g[b+4>>2]*(w*m-v*r)+(p*r-s*m)*+g[b+8>>2];t=(s*v-w*p)*+g[b+16>>2]+(w*m-v*r)*+g[b+20>>2]+(p*r-s*m)*+g[b+24>>2];s=(s*v-w*p)*+g[b+32>>2]+(w*m-v*r)*+g[b+36>>2]+(p*r-s*m)*+g[b+40>>2];g[a+16>>2]=u;g[a+20>>2]=t;g[a+24>>2]=s;g[a+28>>2]=0.0;r=+g[f+4>>2];w=+g[f+8>>2];n=+g[f>>2];q=+g[d>>2]*(r*-v-w*-p)+ +g[d+4>>2]*(w*-m-n*-v)+(n*-p-r*-m)*+g[d+8>>2];o=(r*-v-w*-p)*+g[d+16>>2]+(w*-m-n*-v)*+g[d+20>>2]+(n*-p-r*-m)*+g[d+24>>2];m=(r*-v-w*-p)*+g[d+32>>2]+(w*-m-n*-v)*+g[d+36>>2]+(n*-p-r*-m)*+g[d+40>>2];g[a+32>>2]=q;g[a+36>>2]=o;g[a+40>>2]=m;g[a+44>>2]=0.0;u=+g[i>>2]*u;t=+g[i+4>>2]*t;s=+g[i+8>>2]*s;g[a+48>>2]=u;g[a+52>>2]=t;g[a+56>>2]=s;g[a+60>>2]=0.0;r=+g[k>>2]*q;p=+g[k+4>>2]*o;n=+g[k+8>>2]*m;g[a+64>>2]=r;g[a+68>>2]=p;g[a+72>>2]=n;g[a+76>>2]=0.0;g[a+80>>2]=u*+g[a+16>>2]+t*+g[a+20>>2]+s*+g[a+24>>2]+j+l+(r*q+p*o+n*m);return}function Sg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6414]=(c[6414]|0)+1;h=(((d<<16|b)+~((d<<16|b)<<15)|0)>>>10^(d<<16|b)+~((d<<16|b)<<15))*9|0;m=c[a+36>>2]|0;h=m+(((c[a+12>>2]|0)+-1&(((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11)))<<2)|0;g=c[h>>2]|0;if((g|0)==-1){n=0;return n|0}n=c[a+16>>2]|0;e=g;while(1){l=n+(e*12|0)|0;if((c[l>>2]|0)==(b|0)?(c[n+(e*12|0)+4>>2]|0)==(d|0):0)break;e=c[(c[a+56>>2]|0)+(e<<2)>>2]|0;if((e|0)==-1){e=0;f=13;break}}if((f|0)==13)return e|0;if(!l){n=0;return n|0}k=c[n+(e*12|0)+8>>2]|0;j=(e*12|0)/12|0;i=c[a+56>>2]|0;if((g|0)==(j|0))e=-1;else{e=g;while(1){b=c[i+(e<<2)>>2]|0;if((b|0)==(j|0))break;else e=b}}c[((e|0)==-1?h:i+(e<<2)|0)>>2]=c[i+(j<<2)>>2];f=(c[a+8>>2]|0)+-1|0;if((f|0)==(j|0)){c[a+8>>2]=j;n=k;return n|0}g=c[n+(f*12|0)+4>>2]<<16|c[n+(f*12|0)>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;b=g;d=-1;e=m;while(1){e=c[e+(b<<2)>>2]|0;if((e|0)==(f|0))break;else{b=e;d=e;e=i}}c[((d|0)==-1?m+(g<<2)|0:i+(d<<2)|0)>>2]=c[i+(f<<2)>>2];c[l>>2]=c[n+(f*12|0)>>2];c[l+4>>2]=c[n+(f*12|0)+4>>2];c[l+8>>2]=c[n+(f*12|0)+8>>2];n=(c[a+36>>2]|0)+(g<<2)|0;c[(c[a+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;c[a+8>>2]=(c[a+8>>2]|0)+-1;n=k;return n|0}function Tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;h=l;l=l+64|0;a[d+84>>0]=0;c[h>>2]=c[b+4>>2];c[h+4>>2]=c[b+4+4>>2];c[h+8>>2]=c[b+4+8>>2];c[h+12>>2]=c[b+4+12>>2];c[h+16>>2]=c[b+20>>2];c[h+16+4>>2]=c[b+20+4>>2];c[h+16+8>>2]=c[b+20+8>>2];c[h+16+12>>2]=c[b+20+12>>2];c[h+32>>2]=c[b+36>>2];c[h+32+4>>2]=c[b+36+4>>2];c[h+32+8>>2]=c[b+36+8>>2];c[h+32+12>>2]=c[b+36+12>>2];c[h+48>>2]=c[b+52>>2];c[h+48+4>>2]=c[b+52+4>>2];c[h+48+8>>2]=c[b+52+8>>2];c[h+48+12>>2]=c[b+52+12>>2];if(e?(f=c[b+540>>2]|0,f|0):0)Ob[c[(c[f>>2]|0)+8>>2]&127](f,h);w=+g[d+156>>2];u=+g[h>>2];v=+g[d+160>>2];t=+g[h+4>>2];o=+g[d+164>>2];s=+g[h+8>>2];r=+g[h+16>>2];q=+g[h+20>>2];p=+g[h+24>>2];n=+g[h+32>>2];k=+g[h+36>>2];i=+g[h+40>>2];m=w*r+v*q+o*p+ +g[h+52>>2];j=w*n+v*k+o*i+ +g[h+56>>2];g[d+36>>2]=w*u+v*t+o*s+ +g[h+48>>2];g[d+40>>2]=m;g[d+44>>2]=j;g[d+48>>2]=0.0;j=+g[d+172>>2];m=+g[d+176>>2];o=+g[d+180>>2];g[d+52>>2]=u*j+t*m+s*o;g[d+56>>2]=j*r+m*q+o*p;g[d+60>>2]=j*n+m*k+o*i;g[d+64>>2]=0.0;o=+g[d+188>>2];m=+g[d+192>>2];j=+g[d+196>>2];g[d+68>>2]=u*o+t*m+s*j;g[d+72>>2]=o*r+m*q+j*p;g[d+76>>2]=o*n+m*k+j*i;g[d+80>>2]=0.0;l=h;return}function Ug(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=((e|0)<0)<<31>>31;break a}case 11:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=0;break a}case 12:{f=(c[d>>2]|0)+(8-1)&~(8-1);b=c[f>>2]|0;e=c[f+4>>2]|0;c[d>>2]=f+8;c[a>>2]=b;c[a+4>>2]=e;break a}case 13:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&65535)<<16>>16;c[a+4>>2]=(((f&65535)<<16>>16|0)<0)<<31>>31;break a}case 14:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&65535;c[a+4>>2]=0;break a}case 15:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&255)<<24>>24;c[a+4>>2]=(((f&255)<<24>>24|0)<0)<<31>>31;break a}case 16:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&255;c[a+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function Vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0;w=l;l=l+2048|0;if((e|0)>0)f=0;else{l=w;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));p=0;do{if((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)>0){q=b+(p<<4)|0;r=b+(p<<4)+4|0;s=b+(p<<4)+8|0;t=d+(p<<4)+12|0;u=d+(p<<4)|0;o=0;do{if(((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0)<128){f=(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0;if((f|0)>0)v=10;else{i=-3402823466385288598117041.0e14;f=-1}}else{f=128;v=10}if((v|0)==10){v=0;h=0;do{Sb[c[(c[a>>2]|0)+108>>2]&127](a,h,w+(h<<4)|0);h=h+1|0}while((h|0)!=(f|0));k=+g[q>>2];m=+g[r>>2];n=+g[s>>2];h=-1;j=0;i=-3402823466385288598117041.0e14;do{x=k*+g[w+(j<<4)>>2]+m*+g[w+(j<<4)+4>>2]+n*+g[w+(j<<4)+8>>2];y=x>i;h=y?j:h;i=y?x:i;j=j+1|0}while((j|0)!=(f|0));f=h}if(i>+g[t>>2]){y=w+(f<<4)|0;c[u>>2]=c[y>>2];c[u+4>>2]=c[y+4>>2];c[u+8>>2]=c[y+8>>2];c[u+12>>2]=c[y+12>>2];g[t>>2]=i}o=o+128|0}while((o|0)<(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0))}p=p+1|0}while((p|0)!=(e|0));l=w;return}function Wg(b,d){b=b|0;d=d|0;var e=0;e=ht()|0;Ij(e,5,b);c[e>>2]=4940;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];c[e+316>>2]=c[d+16>>2];c[e+316+4>>2]=c[d+16+4>>2];c[e+316+8>>2]=c[d+16+8>>2];c[e+316+12>>2]=c[d+16+12>>2];c[e+332>>2]=c[d+32>>2];c[e+332+4>>2]=c[d+32+4>>2];c[e+332+8>>2]=c[d+32+8>>2];c[e+332+12>>2]=c[d+32+12>>2];c[e+348>>2]=c[d+48>>2];c[e+348+4>>2]=c[d+48+4>>2];c[e+348+8>>2]=c[d+48+8>>2];c[e+348+12>>2]=c[d+48+12>>2];a[e+527>>0]=0;c[e+364>>2]=c[e+300>>2];c[e+364+4>>2]=c[e+300+4>>2];c[e+364+8>>2]=c[e+300+8>>2];c[e+364+12>>2]=c[e+300+12>>2];c[e+380>>2]=c[e+316>>2];c[e+380+4>>2]=c[e+316+4>>2];c[e+380+8>>2]=c[e+316+8>>2];c[e+380+12>>2]=c[e+316+12>>2];c[e+396>>2]=c[e+332>>2];c[e+396+4>>2]=c[e+332+4>>2];c[e+396+8>>2]=c[e+332+8>>2];c[e+396+12>>2]=c[e+332+12>>2];a[e+524>>0]=0;a[e+525>>0]=0;a[e+526>>0]=0;a[e+552>>0]=0;c[e+412>>2]=0;c[e+412+4>>2]=0;c[e+412+8>>2]=0;c[e+412+12>>2]=0;g[e+572>>2]=-1.0;g[e+444>>2]=999999984306749440.0;g[e+448>>2]=999999984306749440.0;g[e+452>>2]=999999984306749440.0;g[e+428>>2]=1.0;g[e+432>>2]=.30000001192092896;g[e+436>>2]=1.0;g[e+440>>2]=.009999999776482582;g[e+456>>2]=.05000000074505806;c[e+592>>2]=0;g[e+596>>2]=0.0;g[e+600>>2]=.699999988079071;g[e+604>>2]=0.0;return e|0}function Xg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;p=c[a+100>>2]|0;if((p|0)>0){n=0;do{t=c[a+108>>2]|0;s=+g[t+(n<<4)>>2]*+g[a+16>>2];q=+g[t+(n<<4)+4>>2]*+g[a+20>>2];o=+g[t+(n<<4)+8>>2]*+g[a+24>>2];k=s*+g[b>>2]+q*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+q*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+q*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];q=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(q<+g[e>>2]){g[e>>2]=q;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(q>+g[f>>2]){g[f>>2]=q;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(p|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function Yg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+48|0;e=(c[a+52>>2]|0)+4|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];b=d+32+4|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;g[d+32>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+36>>2]=+g[d+16>>2]+ +g[a+16>>2];g[d+32>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+20>>2]=+g[d+16>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[b>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+40>>2]=+g[d+16+4>>2]+ +g[a+16>>2];g[b>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+24>>2]=+g[d+16+4>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[d+32+8>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+44>>2]=+g[d+16+8>>2]+ +g[a+16>>2];g[d+32+8>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+28>>2]=+g[d+16+8>>2]-+g[a+16>>2];l=d;return}function Zg(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+156>>2]|0;c[b+156>>2]=f+1;a[b+152>>0]=(f|0)>=(c[b+160>>2]|0)&1;if(f|0){c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+72+16>>2]=0;c[b+72+20>>2]=0;c[b+72+24>>2]=0;c[b+72+28>>2]=0;return}j=+g[b+64>>2];i=1.0/d*+g[b+72>>2]*j;h=1.0/d*j*+g[b+76>>2];d=1.0/d*j*+g[b+80>>2];g[b+72>>2]=i;g[b+76>>2]=h;g[b+80>>2]=d;g[b+84>>2]=0.0;j=+g[b+68>>2];if(j>0.0){l=j*i*+g[b+120>>2]+j*h*+g[b+124>>2]+j*d*+g[b+128>>2];k=j*i*+g[b+136>>2]+j*h*+g[b+140>>2]+j*d*+g[b+144>>2];g[b+88>>2]=j*i*+g[b+104>>2]+j*h*+g[b+108>>2]+j*d*+g[b+112>>2];g[b+92>>2]=l;g[b+96>>2]=k;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-j)*i;g[b+76>>2]=(1.0-j)*h;g[b+80>>2]=(1.0-j)*d;i=(1.0-j)*i;h=(1.0-j)*h;d=(1.0-j)*d}g[b+72>>2]=1.0/+(e|0)*i;g[b+76>>2]=1.0/+(e|0)*h;g[b+80>>2]=1.0/+(e|0)*d;return}function _g(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0;n=l;l=l+16|0;if((f|0)>-3&(f+3|0)>-1){c[6995]=(c[6995]|0)+1;a=sc((f+3<<4|3)+16|0)|0;if(!a)m=0;else{c[(a+4+15&-16)+-4>>2]=a;m=a+4+15&-16}a=0;do{j=m+(a<<4)|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];a=a+1|0}while((a|0)!=(f+3|0));i=0;j=m;while(1){if(!i)h=0.0;else{a=i;h=0.0;k=.5;while(1){h=(a&1|0)==0?h:h+k;a=a>>1;if(!a)break;else k=k*.5}}k=h*2.0+-1.0;o=(+(i<<1|0)*3.1415927410125732+3.1415927410125732)/+(f+3|0);p=+D(+(1.0-k*k));h=p*+G(+o);g[j>>2]=p*+F(+o);g[j+4>>2]=h;g[j+8>>2]=k;g[j+12>>2]=0.0;i=i+1|0;if((i|0)==(f+3|0)){j=m;i=m;break}else j=j+16|0}}else{j=0;i=0}if((f|0)>-3){a=0;do{r=j+(a<<4)|0;q=j+(a<<4)+4|0;m=j+(a<<4)+8|0;o=+g[q>>2]*+g[e+4>>2]+ +g[d+4>>2];p=+g[m>>2]*+g[e+8>>2]+ +g[d+8>>2];g[r>>2]=+g[r>>2]*+g[e>>2]+ +g[d>>2];g[q>>2]=o;g[m>>2]=p;g[j+(a<<4)+12>>2]=0.0;a=a+1|0}while((a|0)<(f+3|0))}a=ic(b,j,f+3|0,1)|0;if((j|0)==0|(i|0)==0){l=n;return a|0}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);l=n;return a|0}function $g(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0;Dl(a+1028|0);if((c[a+812>>2]|0)<=0)return;f=0;do{p=c[a+820>>2]|0;q=p+(f*44|0)|0;d=c[p+(f*44|0)+8>>2]|0;e=c[p+(f*44|0)+12>>2]|0;b=c[p+(f*44|0)+16>>2]|0;m=+g[d+8>>2];n=+g[d+12>>2];o=+g[d+16>>2];i=+g[d+20>>2];u=+g[e+8>>2];j=u>2];k=r>2];l=s>2];h=t>2];j=t>2];k=s>2];l=r>2];h=u>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}d=b;e=d+44|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0))}else c[a+1032>>2]=0;c[b+32>>2]=0;c[b+36>>2]=q;c[b+40>>2]=0;g[b>>2]=j;g[b+4>>2]=k;g[b+8>>2]=l;g[b+12>>2]=h;g[b+16>>2]=m;g[b+20>>2]=n;g[b+24>>2]=o;g[b+28>>2]=i;Pe(a+1028|0,c[a+1028>>2]|0,b);c[a+1040>>2]=(c[a+1040>>2]|0)+1;c[p+(f*44|0)+40>>2]=b;f=f+1|0}while((f|0)<(c[a+812>>2]|0));return}function ah(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=c[a+12>>2]|0;i=c[h+(((d+b|0)/2|0)<<4)>>2]|0;j=c[h+(((d+b|0)/2|0)<<4)+4>>2]|0;k=c[h+(((d+b|0)/2|0)<<4)+8>>2]|0;f=d;e=b;while(1){while(1){g=c[h+(e<<4)+4>>2]|0;if((g|0)>=(j|0)){if((g|0)!=(j|0))break;g=c[h+(e<<4)>>2]|0;if((g|0)>=(i|0)){if((g|0)!=(i|0))break;if((c[h+(e<<4)+8>>2]|0)>=(k|0))break}}e=e+1|0}while(1){g=c[h+(f<<4)+4>>2]|0;if((j|0)>=(g|0)){if((j|0)!=(g|0))break;g=c[h+(f<<4)>>2]|0;if((i|0)>=(g|0)){if((i|0)!=(g|0))break;if((k|0)>=(c[h+(f<<4)+8>>2]|0))break}}f=f+-1|0}if((e|0)<=(f|0)){g=h+(e<<4)|0;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];h=h+(f<<4)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];h=(c[a+12>>2]|0)+(f<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];f=f+-1|0;e=e+1|0}if((e|0)>(f|0))break;h=c[a+12>>2]|0}if((f|0)>(b|0))ah(a,b,f);if((e|0)>=(d|0)){l=m;return}ah(a,e,d);l=m;return}function bh(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;q=c[a+8>>2]|0;if((q|0)>0){n=0;do{t=c[a+16>>2]|0;s=+g[t+(n<<4)>>2];p=+g[t+(n<<4)+4>>2];o=+g[t+(n<<4)+8>>2];k=s*+g[b>>2]+p*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+p*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+p*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];p=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(p<+g[e>>2]){g[e>>2]=p;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(p>+g[f>>2]){g[f>>2]=p;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(q|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function ch(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+548>>2]|0;if((f|0)<=0)return;g=c[a+556>>2]|0;d=0;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){e=25;break}}if((e|0)==25)return;if((d|0)<(f|0))d=0;else return;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}if((f|0)>(d|0)){d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+556>>2]|0)+(f+-1<<2)>>2]=e;c[a+548>>2]=f+-1}g=c[b+28>>2]|0;b=c[b+32>>2]|0;if((g|0)==(a|0)){d=c[a+288>>2]|0;a:do if((d|0)>0){f=c[a+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(b|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[a+296>>2]|0;g=f+(e<<2)|0;b=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[a+296>>2]|0)+(d+-1<<2)>>2]=b;c[a+288>>2]=d+-1;d=d+-1|0}c[a+280>>2]=(d|0)>0&1;return}else{d=c[b+288>>2]|0;b:do if((d|0)>0){f=c[b+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break b;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[b+296>>2]|0;g=f+(e<<2)|0;a=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[b+296>>2]|0)+(d+-1<<2)>>2]=a;c[b+288>>2]=d+-1;d=d+-1|0}c[b+280>>2]=(d|0)>0&1;return}}function dh(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0;j=c[a+28>>2]|0;i=0;e=0.0;f=0.0;h=0.0;a:while(1){switch(i|0){case 0:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 1:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 2:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 3:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 4:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 5:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 6:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 7:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}default:{}}if((j|0)>0){d=c[a+36>>2]|0;b=0;do{if(+g[d+(b*36|0)+32>>2]+(e*+g[d+(b*36|0)+20>>2]+f*+g[d+(b*36|0)+24>>2]+h*+g[d+(b*36|0)+28>>2])>0.0){b=0;d=16;break a}b=b+1|0}while((b|0)<(j|0))}i=i+1|0;if((i|0)>=8){b=1;d=16;break}}if((d|0)==16)return b|0;return 0}function eh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+32|0;j=(a[b+68>>0]|0)!=0;k=j?e:d;j=j?d:e;h=c[k+4>>2]|0;i=c[h+20>>2]|0;g=c[b+52>>2]|0;if((g|0)<(i|0)){if((c[b+56>>2]|0)<(i|0)){if(!i){d=0;f=g}else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}if((f|0)>0){e=0;do{c[d+(e<<2)>>2]=c[(c[b+60>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=d;c[b+56>>2]=i;e=b+60|0}else e=b+60|0;d=g;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0))}c[b+52>>2]=i;if((i|0)<=0){l=m;return}d=0;do{if(!(c[h+68>>2]|0)){e=c[(c[h+28>>2]|0)+(d*80|0)+64>>2]|0;f=c[k+8>>2]|0;g=c[k+12>>2]|0;c[m>>2]=k;c[m+4>>2]=e;c[m+8>>2]=f;c[m+12>>2]=g;c[m+16>>2]=-1;c[m+20>>2]=d;g=c[b+4>>2]|0;g=Db[c[(c[g>>2]|0)+8>>2]&1](g,m,j,c[b+72>>2]|0,1)|0;c[(c[b+60>>2]|0)+(d<<2)>>2]=g}else c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0));l=m;return}function fh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];return 12393}function gh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+32>>2]|0;if(!e)f=0;else f=c[b+40>>2]|0;i=c[b+52>>2]|0;if(!i)g=0;else g=c[b+60>>2]|0;d=c[b+72>>2]|0;if(!d)h=0;else h=c[b+80>>2]|0;j=c[b+8>>2]|0;+wb[c[(c[j>>2]|0)+12>>2]&3](j,f,e,g,i,h,d,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);d=c[b+32>>2]|0;if((d|0)<0){if((c[b+36>>2]|0)<0){e=c[b+40>>2]|0;if(e|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0;if((d|0)<0){if((c[b+56>>2]|0)<0){e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+56>>2]=0}do{c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+52>>2]=0;d=c[b+72>>2]|0;if((d|0)>=0){c[b+72>>2]=0;return}if((c[b+76>>2]|0)<0){e=c[b+80>>2]|0;if(e|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+76>>2]=0}do{c[(c[b+80>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0);c[b+72>>2]=0;return}function hh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)g=0;else{c[(d+4+15&-16)+-4>>2]=d;g=d+4+15&-16}h=g;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;if((c[b+932>>2]|0)>0){i=c[c[b+940>>2]>>2]|0;c[g>>2]=c[i>>2];c[g+4>>2]=c[i+4>>2];c[g+8>>2]=c[i+8>>2];c[g+12>>2]=c[i+12>>2];c[g+16>>2]=c[i+16>>2]}else{c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0}e=c[b+932>>2]|0;if((e|0)!=(c[b+936>>2]|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}i=e|0?e<<1:1;if((e|0)>=(i|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}if(!i)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+932>>2]|0}if((e|0)>0){f=0;do{c[d+(f<<2)>>2]=c[(c[b+940>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+940>>2]|0;if(f){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+932>>2]|0}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=d;c[b+936>>2]=i;i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}function ih(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c[b+4>>2]|0;if((e|0)==(c[b+8>>2]|0)){Of(b,e|0?e<<1:1);e=c[b+4>>2]|0}o=c[b+12>>2]|0;j=o+(e*36|0)+16|0;a[j>>0]=1;k=o+(e*36|0)+12|0;c[k>>2]=0;n=o+(e*36|0)+4|0;c[n>>2]=0;l=o+(e*36|0)+8|0;c[l>>2]=0;p=c[d+4>>2]|0;if((p|0)<=0){c[n>>2]=p;p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)g=0;else{c[(f+4+15&-16)+-4>>2]=f;g=f+4+15&-16}h=c[n>>2]|0;i=c[k>>2]|0;if((h|0)<=0){if(i|0)m=10}else{f=0;do{c[g+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));m=10}if((m|0)==10?a[j>>0]|0:0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[j>>0]=1;c[k>>2]=g;c[l>>2]=p;Yk(g|0,0,p<<2|0)|0;h=c[k>>2]|0;c[n>>2]=p;g=c[d+12>>2]|0;f=0;do{c[h+(f<<2)>>2]=c[g+(f<<2)>>2];f=f+1|0}while((f|0)!=(p|0));p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}function jh(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;k=(a[28564]|0)==0;j=0;do{i=c[(c[b+256>>2]|0)+(j<<2)>>2]|0;a:do if(i){f=c[i+220>>2]|0;b:do switch(f|0){case 4:case 2:{if((f|0)==4)break a;break}default:{o=+g[i+372>>2];n=+g[i+376>>2];m=+g[i+380>>2];l=+g[i+532>>2];if(o*o+n*n+m*m>2],m=+g[i+392>>2],n=+g[i+396>>2],o=+g[i+536>>2],l*l+m*m+n*n>2]=+g[i+224>>2]+d;break b}g[i+224>>2]=0.0;if((f&-2|0)!=4){c[i+220>>2]=0;f=0}}}while(0);h=f&-2;do if(k){if((h|0)!=2?!(+g[i+224>>2]>2.0):0)break;if(c[i+204>>2]&3|0){if((h|0)==4)break a;c[i+220>>2]=2;break a}if((f|0)==1){if((h|0)==4)break a;c[i+220>>2]=3;break a}else{if((f|0)!=2)break a;e=(c[i+304>>2]|0)+2|0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+304>>2]=e;c[i+372>>2]=0;c[i+372+4>>2]=0;c[i+372+8>>2]=0;c[i+372+12>>2]=0;e=c[b+248>>2]|0;break a}}while(0);if((h|0)!=4)c[i+220>>2]=1}while(0);j=j+1|0}while((j|0)<(e|0));return}function kh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,f,h);n=c[h>>2]|0;k=c[h+4>>2]|0;b=c[h+8>>2]|0;l=c[f>>2]|0;o=c[f+4>>2]|0;i=c[f+8>>2]|0;m=+g[d>>2];p=+g[d+4>>2];q=+g[d+8>>2];if(m>0.0)n=(g[j>>2]=(c[j>>2]=n,+g[j>>2])+m,c[j>>2]|0);else l=(g[j>>2]=(c[j>>2]=l,+g[j>>2])+m,c[j>>2]|0);if(p>0.0){d=o;k=(g[j>>2]=(c[j>>2]=k,+g[j>>2])+p,c[j>>2]|0)}else d=(g[j>>2]=(c[j>>2]=o,+g[j>>2])+p,c[j>>2]|0);if(q>0.0)b=(g[j>>2]=(c[j>>2]=b,+g[j>>2])+q,c[j>>2]|0);else i=(g[j>>2]=(c[j>>2]=i,+g[j>>2])+q,c[j>>2]|0);m=+g[e>>2];p=+g[e+4>>2];q=+g[e+8>>2];q=+D(+(m*m+p*p+q*q));q=q*+nb[c[(c[a>>2]|0)+16>>2]&15](a);c[f>>2]=l;c[f+4>>2]=d;c[f+8>>2]=i;g[f+12>>2]=0.0;c[h>>2]=n;c[h+4>>2]=k;c[h+8>>2]=b;g[h+12>>2]=0.0;g[f>>2]=+g[f>>2]-q;g[f+4>>2]=+g[f+4>>2]-q;g[f+8>>2]=+g[f+8>>2]-q;g[h>>2]=q+ +g[h>>2];g[h+4>>2]=q+ +g[h+4>>2];g[h+8>>2]=q+ +g[h+8>>2];return}function lh(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;j=c[b+772>>2]|0;if(e){if((j|0)>0){f=c[b+780>>2]|0;e=0;do{g[f+(e*104|0)+88>>2]=0.0;e=e+1|0}while((e|0)!=(j|0))}i=c[b+812>>2]|0;if((i|0)>0){f=c[b+820>>2]|0;e=0;do{m=c[f+(e*44|0)+8>>2]|0;l=c[f+(e*44|0)+12>>2]|0;k=c[f+(e*44|0)+16>>2]|0;o=+g[m+8>>2];q=+g[m+12>>2];h=+g[m+16>>2];n=+g[l+8>>2]-o;r=+g[l+12>>2]-q;p=+g[l+16>>2]-h;o=+g[k+8>>2]-o;q=+g[k+12>>2]-q;h=+g[k+16>>2]-h;h=+D(+((n*q-r*o)*(n*q-r*o)+((r*h-p*q)*(r*h-p*q)+(p*o-n*h)*(p*o-n*h))));g[m+88>>2]=h+ +g[m+88>>2];g[l+88>>2]=h+ +g[l+88>>2];g[k+88>>2]=h+ +g[k+88>>2];e=e+1|0}while((e|0)!=(i|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=1.0/+g[m>>2];e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;h=0.0;do{r=+g[f+(e*104|0)+88>>2];h=h+(r>0.0?1.0/r:0.0);e=e+1|0}while((e|0)!=(j|0));h=1.0/h*d;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=+g[m>>2]/h;e=e+1|0}while((e|0)!=(j|0));m=b+984|0;a[m>>0]=1;return}function mh(a,b){a=+a;b=+b;var d=0,e=0,f=0,h=0,i=0,k=0,l=0,m=0;l=(g[j>>2]=a,c[j>>2]|0);i=(g[j>>2]=b,c[j>>2]|0);a:do if((i<<1|0)!=0?!((l>>>23&255|0)==255|((QD(b)|0)&2147483647)>>>0>2139095040):0){if(l<<1>>>0<=i<<1>>>0)return +((l<<1|0)==(i<<1|0)?a*0.0:a);if(!(l>>>23&255)){if((l<<9|0)>-1){e=l<<9;d=0;do{d=d+-1|0;e=e<<1}while((e|0)>-1)}else d=0;e=l<<1-d}else{e=l&8388607|8388608;d=l>>>23&255}if(!(i>>>23&255)){if((i<<9|0)>-1){f=0;h=i<<9;do{f=f+-1|0;h=h<<1}while((h|0)>-1)}else f=0;k=f;i=i<<1-f}else{k=i>>>23&255;i=i&8388607|8388608}f=e-i|0;b:do if((d|0)>(k|0)){h=f;f=(f|0)>-1;while(1){if(f)if(!h)break;else e=h;e=e<<1;d=d+-1|0;f=e-i|0;if((d|0)>(k|0)){h=f;f=(f|0)>-1}else{h=(f|0)>-1;break b}}b=a*0.0;break a}else h=(f|0)>-1;while(0);if(h)if(!f){b=a*0.0;break}else e=f;if(e>>>0<8388608)do{e=e<<1;d=d+-1|0}while(e>>>0<8388608);if((d|0)>0)d=e+-8388608|d<<23;else d=e>>>(1-d|0);b=(c[j>>2]=d|l&-2147483648,+g[j>>2])}else m=3;while(0);if((m|0)==3)b=a*b/(a*b);return +b}function nh(b,e,f,h,i,j){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0;if((d[h+55>>0]|0|0)==(e|0)){h=0;return h|0}k=c[5288+(i<<2)>>2]|0;if(+g[h>>2]*+g[f+16>>2]+ +g[h+4>>2]*+g[f+20>>2]+ +g[h+8>>2]*+g[f+24>>2]-+g[h+16>>2]<-9.999999747378752e-06){e=lf(b,c[h+20+(k<<2)>>2]|0,c[h+20+(i<<2)>>2]|0,f,0)|0;if(!e){h=0;return h|0}a[e+52>>0]=i;c[e+32>>2]=h;a[h+52+i>>0]=0;c[h+32+(i<<2)>>2]=e;i=c[j>>2]|0;if(!i)c[j+4>>2]=e;else{a[i+53>>0]=2;c[i+36>>2]=e;a[e+54>>0]=1;c[e+40>>2]=i}c[j>>2]=e;c[j+8>>2]=(c[j+8>>2]|0)+1;h=1;return h|0}i=c[5300+(i<<2)>>2]|0;a[h+55>>0]=e;if(!(nh(b,e,f,c[h+32+(k<<2)>>2]|0,d[h+52+k>>0]|0,j)|0)){h=0;return h|0}if(!(nh(b,e,f,c[h+32+(i<<2)>>2]|0,d[h+52+i>>0]|0,j)|0)){h=0;return h|0}i=c[h+48>>2]|0;if(i|0)c[i+44>>2]=c[h+44>>2];i=c[h+44>>2]|0;if(i|0)c[i+48>>2]=c[h+48>>2];if((c[b+18496>>2]|0)==(h|0))c[b+18496>>2]=c[h+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[h+44>>2]=0;c[h+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=h;c[b+18504>>2]=h;c[b+18508>>2]=(c[b+18508>>2]|0)+1;h=1;return h|0}function oh(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0;a=l;l=l+80|0;o=+g[h+52>>2]-+g[f+52>>2];n=+g[h+56>>2]-+g[f+56>>2];g[a+56>>2]=+g[h+48>>2]-+g[f+48>>2];g[a+56+4>>2]=o;g[a+56+8>>2]=n;g[a+56+12>>2]=0.0;if(Hc(d,f,e,h,a+56|0,a,1)|0){c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=1;l=a;return k|0}if(!(Gd(d,f,e,h,a+56|0,a)|0)){k=0;l=a;return k|0}c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=0;l=a;return k|0}function ph(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0;p=l;l=l+2048|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){n=1.0;m=0.0;h=0.0}else{q=1.0/+D(+(e*e+h*h+f*f));n=e*q;m=h*q;h=f*q}if((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)<=0){l=p;return}k=0;f=-999999984306749440.0;while(1){if(((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0)<128){d=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0;if((d|0)>0)o=8;else{e=-3402823466385288598117041.0e14;d=-1}}else{d=128;o=8}if((o|0)==8){o=0;i=0;do{Sb[c[(c[b>>2]|0)+108>>2]&127](b,i,p+(i<<4)|0);i=i+1|0}while((i|0)!=(d|0));i=-1;j=0;e=-3402823466385288598117041.0e14;do{q=n*+g[p+(j<<4)>>2]+m*+g[p+(j<<4)+4>>2]+h*+g[p+(j<<4)+8>>2];r=q>e;i=r?j:i;e=r?q:e;j=j+1|0}while((j|0)!=(d|0));d=i}if(e>f){r=p+(d<<4)|0;c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2]}else e=f;k=k+128|0;if((k|0)>=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0))break;else f=e}l=p;return}function qh(b){b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0,k=0;k=l;l=l+64|0;if(!(a[b+290>>0]|0)){d=c[b+248>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if((c[f+540>>2]|0)!=0?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(j=+g[b+284>>2],j!=0.0):0)e=e-j;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));l=k;return}else{d=c[b+8>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if((!((f|0)==0?1:(c[f+252>>2]&2|0)==0)?(c[f+540>>2]|0)!=0:0)?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(i=+g[b+284>>2],i!=0.0):0)e=e-i;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+8>>2]|0}h=h+1|0}while((h|0)<(d|0));l=k;return}}function rh(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0,k=0.0,l=0.0;e=c[d+204>>2]|0;if((e&3|0)==0?(c[d+564>>2]&1|0)==0:0){h=+g[d+404>>2];if(h!=0.0){l=1.0/h*+g[b+268>>2];k=1.0/h*+g[b+272>>2];g[d+424>>2]=1.0/h*+g[b+264>>2];g[d+428>>2]=l;g[d+432>>2]=k;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(e&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{f=c[b+248>>2]|0;if((f|0)==(c[b+252>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+248>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+256>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+256>>2]|0;if(i){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=e;c[b+252>>2]=j;e=c[d+204>>2]|0}c[(c[b+256>>2]|0)+(f<<2)>>2]=d;c[b+248>>2]=f+1}j=(e&3|0)==0;Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,j?1:2,j?-1:-3);return}function sh(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;i=c[a+68+(d<<2)>>2]|0;j=b[i+((f&65535)<<2)+-4>>1]|0;if((e[i+((f&65535)<<2)>>1]|0)>=(j&65535))return;k=c[a+60>>2]|0;m=k+((e[i+((f&65535)<<2)+2>>1]|0)<<6)+54+(d<<1)|0;h=i+((f&65535)<<2)+-4|0;l=i+((f&65535)<<2)|0;while(1){i=e[l+-2>>1]|0;if(!(j&1)){f=e[l+2>>1]|0;if(((((e[k+(f<<6)+54+((1<>1]|0)>=(e[k+(i<<6)+48+((1<>1]|0)?(e[k+(i<<6)+54+((1<>1]|0)>=(e[k+(f<<6)+48+((1<>1]|0):0)?(e[k+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(i<<6)+48+((1<<(1<>1]|0):0)?(e[k+(i<<6)+54+((1<<(1<>1]|0)>=(e[k+(f<<6)+48+((1<<(1<>1]|0):0)?(p=c[a+92>>2]|0,n=k+(f<<6)|0,o=k+(i<<6)|0,Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0,p=c[a+96>>2]|0,p|0):0)Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0;f=k+(i<<6)+48+(d<<1)|0}else f=k+(i<<6)+54+(d<<1)|0;b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[m>>1]=(b[m>>1]|0)+-1<<16>>16;f=e[l>>1]|e[l+2>>1]<<16;j=e[h>>1]|e[h+2>>1]<<16;b[l>>1]=j;b[l+2>>1]=j>>>16;b[h>>1]=f;b[h+2>>1]=f>>>16;f=l+-4|0;h=h+-4|0;j=b[h>>1]|0;if((e[f>>1]|0)>=(j&65535))break;l=f;k=c[a+60>>2]|0}return}function th(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0,k=0,l=0,m=0.0,n=0.0;h=c[d+204>>2]|0;if((h&3|0)==0?(c[d+564>>2]&1|0)==0:0){i=+g[d+404>>2];if(i!=0.0){n=1.0/i*+g[b+268>>2];m=1.0/i*+g[b+272>>2];g[d+424>>2]=1.0/i*+g[b+264>>2];g[d+428>>2]=n;g[d+432>>2]=m;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(h&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{h=c[b+248>>2]|0;if((h|0)==(c[b+252>>2]|0)?(l=h|0?h<<1:1,(h|0)<(l|0)):0){if(!l)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((l<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+248>>2]|0}if((h|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+256>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[b+256>>2]|0;if(j){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=k;c[b+252>>2]=l}c[(c[b+256>>2]|0)+(h<<2)>>2]=d;c[b+248>>2]=h+1}Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,e,f);return}function uh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0,j=0.0,k=0,l=0.0;l=+g[d>>2];if(+g[b>>2]<=l){j=+g[d+4>>2];if((((+g[b+4>>2]<=j?+g[b+8>>2]<=+g[d+8>>2]:0)?+g[b+16>>2]>=+g[d+16>>2]:0)?+g[b+20>>2]>=+g[d+20>>2]:0)?+g[b+24>>2]>=+g[d+24>>2]:0){d=0;return d|0}else h=d+4|0}else{h=d+4|0;j=+g[d+4>>2]}g[d>>2]=l-f;g[h>>2]=j-f;g[d+8>>2]=+g[d+8>>2]-f;g[d+16>>2]=+g[d+16>>2]+f;g[d+20>>2]=+g[d+20>>2]+f;g[d+24>>2]=+g[d+24>>2]+f;l=+g[e>>2];k=l>0.0?d+16|0:d;g[k>>2]=l+ +g[k>>2];l=+g[e+4>>2];h=l>0.0?d+20|0:h;g[h>>2]=l+ +g[h>>2];l=+g[e+8>>2];h=l>0.0?d+24|0:d+8|0;g[h>>2]=l+ +g[h>>2];h=Ag(a,b)|0;a:do if(h){k=c[a+8>>2]|0;if((k|0)<=-1){h=c[a>>2]|0;break}if(k){e=0;while(1){i=c[h+32>>2]|0;e=e+1|0;if(!i)break a;if((e|0)>=(k|0)){h=i;break}else h=i}}}else h=0;while(0);c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];Pe(a,h,b);d=1;return d|0}function vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*.5;l=(+g[a+40>>2]-+g[a+24>>2])*.5;i=(+g[a+44>>2]-+g[a+28>>2])*.5;n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=i+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);B=(+g[a+36>>2]+ +g[a+20>>2])*.5;z=(+g[a+40>>2]+ +g[a+24>>2])*.5;x=(+g[a+44>>2]+ +g[a+28>>2])*.5;G=+g[b>>2];w=+C(+G);F=+g[b+4>>2];v=+C(+F);t=+g[b+8>>2];u=+C(+t);E=+g[b+16>>2];s=+C(+E);D=+g[b+20>>2];r=+C(+D);p=+g[b+24>>2];q=+C(+p);A=+g[b+32>>2];m=+C(+A);y=+g[b+36>>2];j=+C(+y);f=+g[b+40>>2];h=+C(+f);t=B*G+z*F+x*t+ +g[b+48>>2];p=B*E+z*D+x*p+ +g[b+52>>2];f=B*A+z*y+x*f+ +g[b+56>>2];g[d>>2]=t-((o+n)*w+(l+k)*v+i*u);g[d+4>>2]=p-((o+n)*s+(l+k)*r+i*q);g[d+8>>2]=f-((o+n)*m+(l+k)*j+i*h);g[d+12>>2]=0.0;g[e>>2]=(o+n)*w+(l+k)*v+i*u+t;g[e+4>>2]=(o+n)*s+(l+k)*r+i*q+p;g[e+8>>2]=(o+n)*m+(l+k)*j+i*h+f;g[e+12>>2]=0.0;return}function wh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0;I=+g[a+52>>2];z=+g[a+36>>2];H=+g[a+56>>2];x=+g[a+40>>2];F=+g[a+60>>2];v=+g[a+44>>2];G=(c[a+20>>2]|0)==0;m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(G?0.0:(I-z)*.5)+m;k=(G?0.0:(H-x)*.5)+k;i=(G?0.0:(F-v)*.5)+i;E=+g[b>>2];u=+C(+E);D=+g[b+4>>2];t=+C(+D);r=+g[b+8>>2];s=+C(+r);B=+g[b+16>>2];q=+C(+B);A=+g[b+20>>2];p=+C(+A);n=+g[b+24>>2];o=+C(+n);y=+g[b+32>>2];l=+C(+y);w=+g[b+36>>2];j=+C(+w);f=+g[b+40>>2];h=+C(+f);z=G?0.0:(I+z)*.5;x=G?0.0:(H+x)*.5;v=G?0.0:(F+v)*.5;r=z*E+x*D+v*r+ +g[b+48>>2];n=z*B+x*A+v*n+ +g[b+52>>2];f=z*y+x*w+v*f+ +g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function xh(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=c[a+68+(d<<2)>>2]|0;k=c[a+60>>2]|0;l=e[h+((f&65535)<<2)+2>>1]|0;i=b[h+((f&65535)<<2)+-4>>1]|0;if((e[h+((f&65535)<<2)>>1]|0)>=(i&65535))return;g=h+((f&65535)<<2)+-4|0;j=h+((f&65535)<<2)|0;h=k;while(1){f=e[j+-2>>1]|0;if(!(i&1))f=h+(f<<6)+48+(d<<1)|0;else{if(((((e[k+(l<<6)+54+((1<>1]|0)>=(e[h+(f<<6)+48+((1<>1]|0)?(e[h+(f<<6)+54+((1<>1]|0)>=(e[k+(l<<6)+48+((1<>1]|0):0)?(e[k+(l<<6)+54+((1<<(1<>1]|0)>=(e[h+(f<<6)+48+((1<<(1<>1]|0):0)?(e[h+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(l<<6)+48+((1<<(1<>1]|0):0)?(n=c[a+92>>2]|0,m=h+(f<<6)|0,Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0,n=c[a+96>>2]|0,n|0):0)Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0;f=h+(f<<6)+54+(d<<1)|0}b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[k+(l<<6)+48+(d<<1)>>1]=(b[k+(l<<6)+48+(d<<1)>>1]|0)+-1<<16>>16;f=e[j>>1]|e[j+2>>1]<<16;i=e[g>>1]|e[g+2>>1]<<16;b[j>>1]=i;b[j+2>>1]=i>>>16;b[g>>1]=f;b[g+2>>1]=f>>>16;f=j+-4|0;g=g+-4|0;i=b[g>>1]|0;if((e[f>>1]|0)>=(i&65535))break;j=f;h=c[a+60>>2]|0}return}function yh(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;d=+g[(gJ(a)|0)>>2];e=+g[(OI(a+16|0)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];if(d+e+c>0.0){e=+VI(d+e+c+1.0);g[f+12>>2]=e*.5;d=+g[(OI(a+32|0)|0)>>2];g[f>>2]=(d-+g[(NI(a+16|0)|0)>>2])*(.5/e);d=+g[(NI(a)|0)>>2];g[f+4>>2]=(d-+g[(gJ(a+32|0)|0)>>2])*(.5/e);d=+g[(gJ(a+16|0)|0)>>2];g[f+8>>2]=(d-+g[(OI(a)|0)>>2])*(.5/e);i=f+4|0;h=f+8|0;a=f+12|0;j=f;as(b,j,i,h,a);l=f;return}else{h=(d>2];k=gJ(a+((((h+1|0)>>>0)%3|0)<<4)|0)|0;e=e-+g[k+((((h+1|0)>>>0)%3|0)<<2)>>2];j=gJ(a+((((h+2|0)>>>0)%3|0)<<4)|0)|0;e=+VI(e-+g[j+((((h+2|0)>>>0)%3|0)<<2)>>2]+1.0);g[f+(h<<2)>>2]=e*.5;g[f+12>>2]=(+g[j+((((h+1|0)>>>0)%3|0)<<2)>>2]-+g[k+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+1|0)>>>0)%3|0)<<2)>>2]=(+g[k+(h<<2)>>2]+ +g[i+((((h+1|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+2|0)>>>0)%3|0)<<2)>>2]=(+g[j+(h<<2)>>2]+ +g[i+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);h=f+4|0;i=f+8|0;j=f+12|0;a=f;as(b,a,h,i,j);l=f;return}}function zh(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;j=xb[c[(c[b>>2]|0)+28>>2]&127](b)|0;i=+g[j>>2]-+g[d>>2];h=+g[j+4>>2]-+g[d+4>>2];f=+g[j+8>>2]-+g[d+8>>2];if(!(i*i+h*h+f*f>1.1920928955078125e-07))return;Yg(b,d);if((a[b+65>>0]|0)!=0?(e=c[b+56>>2]|0,Ib[c[c[e>>2]>>2]&511](e),e=c[b+56>>2]|0,(e|0)!=0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);e=b+56|0}else e=b+56|0;c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[e>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;return}function Ah(b,d){b=b|0;d=d|0;var e=0.0,f=0.0;if(a[b+1309>>0]|0){e=(+g[b+1256>>2]-+g[b+1316>>2])*+g[b+1340>>2];g[b+792>>2]=e*(+g[d>>2]*+g[b+1364>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+808>>2]=e/+g[d>>2]}if(a[b+1310>>0]|0){e=(+g[b+1260>>2]-+g[b+1320>>2])*+g[b+1344>>2];g[b+796>>2]=e*(+g[d>>2]*+g[b+1368>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+812>>2]=e/+g[d>>2]}if(a[b+1311>>0]|0){e=(+g[b+1264>>2]-+g[b+1324>>2])*+g[b+1348>>2];g[b+800>>2]=e*(+g[d>>2]*+g[b+1372>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+816>>2]=e/+g[d>>2]}if(a[b+1312>>0]|0){f=-((+g[b+1192>>2]-+g[b+1328>>2])*+g[b+1352>>2]);e=+g[d>>2];g[b+876>>2]=e*+g[b+1376>>2]/+(c[d+44>>2]|0)*f;g[b+880>>2]=+C(+f)/e}if(a[b+1313>>0]|0){e=-((+g[b+1196>>2]-+g[b+1332>>2])*+g[b+1356>>2]);f=+g[d>>2];g[b+940>>2]=f*+g[b+1380>>2]/+(c[d+44>>2]|0)*e;g[b+944>>2]=+C(+e)/f}if(!(a[b+1314>>0]|0)){gg(b,d);return}e=-((+g[b+1200>>2]-+g[b+1336>>2])*+g[b+1360>>2]);f=+g[d>>2];g[b+1004>>2]=f*+g[b+1384>>2]/+(c[d+44>>2]|0)*e;g[b+1008>>2]=+C(+e)/f;gg(b,d);return}function Bh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0;e=l;l=l+160|0;c[e+136>>2]=0;c[e+136+4>>2]=0;c[e+136+8>>2]=0;c[e+136+12>>2]=0;c[e+136+16>>2]=0;c[e+32>>2]=7356;f=e+32+4|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;c[e+32+44>>2]=0;c[e+32+44+4>>2]=0;c[e+32+44+8>>2]=0;c[e+32+44+12>>2]=0;c[e+32+60>>2]=1065353216;c[e+32+64>>2]=0;c[e+32+68>>2]=c[e+136+4>>2];c[e+32+68+4>>2]=c[e+136+4+4>>2];c[e+32+68+8>>2]=c[e+136+4+8>>2];c[e+32+68+12>>2]=c[e+136+4+12>>2];g[e+32+84>>2]=-999999984306749440.0;j=+g[d>>2];i=+g[d+4>>2];h=+g[d+8>>2];g[e+32+88>>2]=j+i*0.0+h*0.0;g[e+32+92>>2]=j*0.0+i+h*0.0;g[e+32+96>>2]=j*0.0+i*0.0+h;g[e+32+100>>2]=0.0;c[e+16>>2]=1566444395;c[e+16+4>>2]=1566444395;c[e+16+8>>2]=1566444395;g[e+16+12>>2]=0.0;d=c[(c[b>>2]|0)+64>>2]|0;g[e>>2]=-999999984306749440.0;g[e+4>>2]=-999999984306749440.0;g[e+8>>2]=-999999984306749440.0;g[e+12>>2]=0.0;Vb[d&127](b,e+32|0,e,e+16|0);c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];l=e;return}function Ch(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;var n=0;n=l;l=l+128|0;c[n+80>>2]=c[a+4>>2];c[n+80+4>>2]=c[a+20>>2];c[n+80+8>>2]=c[a+36>>2];g[n+80+12>>2]=0.0;c[n+80+16>>2]=c[a+8>>2];c[n+80+20>>2]=c[a+24>>2];c[n+80+24>>2]=c[a+40>>2];g[n+80+28>>2]=0.0;c[n+80+32>>2]=c[a+12>>2];c[n+80+36>>2]=c[a+28>>2];c[n+80+40>>2]=c[a+44>>2];g[n+80+44>>2]=0.0;c[n+32>>2]=c[b+4>>2];c[n+32+4>>2]=c[b+20>>2];c[n+32+8>>2]=c[b+36>>2];g[n+32+12>>2]=0.0;c[n+32+16>>2]=c[b+8>>2];c[n+32+20>>2]=c[b+24>>2];c[n+32+24>>2]=c[b+40>>2];g[n+32+28>>2]=0.0;c[n+32+32>>2]=c[b+12>>2];c[n+32+36>>2]=c[b+28>>2];c[n+32+40>>2]=c[b+44>>2];g[n+32+44>>2]=0.0;h=h-+g[a+56>>2];i=i-+g[a+60>>2];g[n+16>>2]=f-+g[a+52>>2];g[n+16+4>>2]=h;g[n+16+8>>2]=i;g[n+16+12>>2]=0.0;i=k-+g[b+56>>2];m=m-+g[b+60>>2];g[n>>2]=j-+g[b+52>>2];g[n+4>>2]=i;g[n+8>>2]=m;g[n+12>>2]=0.0;Rg(d,n+80|0,n+32|0,n+16|0,n,e,a+456|0,+g[a+404>>2],b+456|0,+g[b+404>>2]);l=n;return}function Dh(b,d){b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0,k=0,l=0.0,m=0.0;if(a[b+48>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=4;c[d+4>>2]=2;Zc(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+1088>>2]=0.0;a[b+297>>0]=0;e=+g[b+192>>2];h=+g[b+196>>2];do if(!(e<=h))k=0;else{m=+g[b+892>>2];l=+g[b+908>>2];i=+g[b+924>>2];i=+Xj(+L(+(+g[b+832>>2]*m+ +g[b+848>>2]*l+ +g[b+864>>2]*i),+(+g[b+828>>2]*m+ +g[b+844>>2]*l+ +g[b+860>>2]*i)),e,h);g[b+1084>>2]=i;if(!(ih)e=h;else{k=0;break}g[b+1088>>2]=i-e;a[b+297>>0]=1;k=1}while(0);a[b+296>>0]=0;f=c[b+1032>>2]|0;c[b+1080>>2]=f;e=+g[b+184>>2];h=+g[b+188>>2];i=(c[j>>2]=f,+g[j>>2]);do if(!(e<=h))f=10;else{if(!(i>h)){if(!(i>2]=i-e;a[b+296>>0]=1;f=12}while(0);if((f|0)==10?(g[b+1032>>2]=0.0,a[b+1096>>0]|0):0)f=12;if((f|0)==12){c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1}if(k<<24>>24==0?(a[b+1112>>0]|0)==0:0)return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Eh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0;v=l;l=l+16|0;if((e|0)<=0){l=v;return}u=0;do{c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;o=c[a+56>>2]|0;w=c[a+32+(o<<2)>>2]|0;c[v+(o<<2)>>2]=w;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];q=b+(u<<4)|0;p=+g[q>>2];r=b+(u<<4)+4|0;m=+g[r>>2];s=b+(u<<4)+8|0;k=+g[s>>2];n=(c[j>>2]=w,+g[j>>2]);if(f*p+i*m+h*k>-999999984306749440.0){o=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=o;o=c[a+56>>2]|0;t=f*p+i*m+h*k;n=+g[a+32+(o<<2)>>2];p=+g[q>>2];m=+g[r>>2];k=+g[s>>2]}else t=-999999984306749440.0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;g[v+(o<<2)>>2]=-n;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];if(f*p+i*m+h*k>t){w=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=w}u=u+1|0}while((u|0)!=(e|0));l=v;return}function Fh(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=f|0;var h=0,i=0,j=0,k=0,m=0.0,n=0.0;j=l;l=l+48|0;m=1.0/+D(+(b*b+d*d+e*e));g[f>>2]=m*b;g[f+4>>2]=m*d;g[f+8>>2]=m*e;g[f+12>>2]=0.0;h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;Sb[h&127](j,i,f);b=-+g[f>>2];d=-+g[f+4>>2];e=-+g[f+8>>2];h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a+4>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;m=+g[a+24>>2]*b+ +g[a+28>>2]*d+ +g[a+32>>2]*e;n=+g[a+40>>2]*b+ +g[a+44>>2]*d+ +g[a+48>>2]*e;g[j+16>>2]=+g[a+8>>2]*b+ +g[a+12>>2]*d+ +g[a+16>>2]*e;g[j+16+4>>2]=m;g[j+16+8>>2]=n;g[j+16+12>>2]=0.0;Sb[h&127](j+32|0,i,j+16|0);n=+g[j+32>>2];b=+g[j+32+4>>2];d=+g[j+32+8>>2];e=+g[j+4>>2]-(n*+g[a+72>>2]+b*+g[a+76>>2]+d*+g[a+80>>2]+ +g[a+108>>2]);m=+g[j+8>>2]-(n*+g[a+88>>2]+b*+g[a+92>>2]+d*+g[a+96>>2]+ +g[a+112>>2]);g[f+16>>2]=+g[j>>2]-(n*+g[a+56>>2]+b*+g[a+60>>2]+d*+g[a+64>>2]+ +g[a+104>>2]);g[f+20>>2]=e;g[f+24>>2]=m;g[f+28>>2]=0.0;l=j;return}function Gh(a,b,c,d,e,f,h,i,j,k,l,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=+n;o=+o;var p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;q=(j-f)*(n-h)-(k-h)*(m-f);r=(k-h)*(l-e)-(i-e)*(n-h);s=(i-e)*(m-f)-(j-f)*(l-e);if(+C(+(s*d+(q*b+r*c)))<1.1920928955078125e-07){s=-1.0;return +s}t=+g[a>>2];v=+g[a+4>>2];u=+g[a+8>>2];p=-(q*t+r*v+s*u-(s*h+(q*e+r*f)))/(s*d+(q*b+r*c));if(((p>1.1920928955078125e-06&p-1.1920928955078125e-06:0)?s*((m-(v+p*c))*(i-(t+p*b))-(j-(v+p*c))*(l-(t+p*b)))+(q*((j-(v+p*c))*(n-(u+p*d))-(k-(u+p*d))*(m-(v+p*c)))+r*((k-(u+p*d))*(l-(t+p*b))-(n-(u+p*d))*(i-(t+p*b))))>-1.1920928955078125e-06:0)?s*((f-(v+p*c))*(l-(t+p*b))-(m-(v+p*c))*(e-(t+p*b)))+(q*((m-(v+p*c))*(h-(u+p*d))-(n-(u+p*d))*(f-(v+p*c)))+r*((n-(u+p*d))*(e-(t+p*b))-(h-(u+p*d))*(l-(t+p*b))))>-1.1920928955078125e-06:0){v=p;return +v}v=-1.0;return +v}function Hh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(a[b+165>>0]|0){if((c[b+92>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d<<4|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}else g=0;f=c[b+88>>2]|0;if((f|0)>0){e=0;do{i=g+(e<<4)|0;h=(c[b+96>>2]|0)+(e<<4)|0;c[i>>2]=c[h>>2];c[i+4>>2]=c[h+4>>2];c[i+8>>2]=c[h+8>>2];c[i+12>>2]=c[h+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+96>>2]|0;if(e|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=g;c[b+92>>2]=d;return}if((c[b+112>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((d<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+108>>2]|0;g=c[b+116>>2]|0;if((f|0)<=0)if(!g)e=b+120|0;else i=21;else{e=0;do{c[h+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));i=21}if((i|0)==21){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+116>>2]=0;e=b+120|0}a[e>>0]=1;c[b+116>>2]=h;c[b+112>>2]=d;return}function Ih(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(a[d+164>>0]|0)){if((c[d+152>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,g=sc((e<<1)+19|0)|0,(g|0)!=0):0){c[(g+4+15&-16)+-4>>2]=g;i=g+4+15&-16}else i=0;g=c[d+148>>2]|0;h=c[d+156>>2]|0;if((g|0)<=0)if(!h)f=d+160|0;else j=22;else{f=0;do{b[i+(f<<1)>>1]=b[h+(f<<1)>>1]|0;f=f+1|0}while((f|0)!=(g|0));j=22}if((j|0)==22){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=e;return}else{if((c[d+132>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}else i=0;g=c[d+128>>2]|0;h=c[d+136>>2]|0;if((g|0)<=0)if(!h)f=d+140|0;else j=10;else{f=0;do{c[i+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(g|0));j=10}if((j|0)==10){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=e;return}}function Jh(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];c[b+84>>2]=c[a+332>>2];c[b+88>>2]=c[a+336>>2];c[b+92>>2]=c[a+340>>2];c[b+96>>2]=c[a+344>>2];c[b+100>>2]=c[a+348>>2];c[b+104>>2]=c[a+352>>2];c[b+108>>2]=c[a+356>>2];c[b+112>>2]=c[a+360>>2];c[b+116>>2]=c[a+364>>2];c[b+120>>2]=c[a+368>>2];c[b+124>>2]=c[a+372>>2];c[b+128>>2]=c[a+376>>2];c[b+132>>2]=c[a+380>>2];c[b+136>>2]=c[a+384>>2];c[b+140>>2]=c[a+388>>2];c[b+144>>2]=c[a+392>>2];c[b+148>>2]=c[a+396>>2];c[b+152>>2]=c[a+400>>2];c[b+156>>2]=c[a+404>>2];c[b+160>>2]=c[a+408>>2];c[b+164>>2]=c[a+412>>2];c[b+168>>2]=c[a+416>>2];c[b+172>>2]=c[a+420>>2];c[b+176>>2]=c[a+424>>2];c[b+180>>2]=c[a+444>>2];c[b+184>>2]=c[a+448>>2];c[b+188>>2]=c[a+452>>2];c[b+192>>2]=c[a+428>>2];c[b+196>>2]=c[a+432>>2];c[b+200>>2]=c[a+436>>2];c[b+204>>2]=c[a+440>>2];return 12643}function Kh(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+32|0;n=+g[a+60>>2];r=+g[a+76>>2]-n;m=+g[a+64>>2];p=+g[a+80>>2]-m;k=+g[a+68>>2];s=+g[a+84>>2]-k;o=+g[a+92>>2]-n;q=+g[a+96>>2]-m;h=+g[a+100>>2]-k;i=1.0/+D(+((r*q-p*o)*(r*q-p*o)+((p*h-s*q)*(p*h-s*q)+(s*o-r*h)*(s*o-r*h))));f=i*(p*h-s*q);h=i*(s*o-r*h);i=(r*q-p*o)*i;k=i*+g[b+8>>2]+(+g[b>>2]*f+ +g[b+4>>2]*h)-(f*n+h*m+i*k);if(!(k>=-d)|!(k<=d)){b=0;l=j;return b|0}e=0;while(1){Vb[c[(c[a>>2]|0)+104>>2]&127](a,e,j+16|0,j);n=+g[j+16>>2];s=+g[j>>2]-n;p=+g[j+16+4>>2];o=+g[j+4>>2]-p;m=+g[j+16+8>>2];r=+g[j+8>>2]-m;q=1.0/+D(+((h*s-f*o)*(h*s-f*o)+((i*o-h*r)*(i*o-h*r)+(f*r-i*s)*(f*r-i*s))));e=e+1|0;if((h*s-f*o)*q*+g[b+8>>2]+(+g[b>>2]*q*(i*o-h*r)+ +g[b+4>>2]*q*(f*r-i*s))-(m*(h*s-f*o)*q+(n*q*(i*o-h*r)+p*q*(f*r-i*s)))<-d){e=0;a=5;break}if((e|0)>=3){e=1;a=5;break}}if((a|0)==5){l=j;return e|0}return 0}function Lh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0;c[6995]=(c[6995]|0)+1;h=sc(55)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[j>>2]=d;c[j+4>>2]=e;c[j+8>>2]=f;c[j+12>>2]=-1;c[j+16>>2]=-1;c[j+20>>2]=-1;c[j+28>>2]=-1;g[j+32>>2]=0.0;f=j;d=c[b+4>>2]|0;c[j+24>>2]=d;if((d|0)!=(c[b+8>>2]|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}i=d|0?d<<1:1;if((d|0)>=(i|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}if(!i)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((i<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}d=c[b+4>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+12>>2]|0;if(e){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+4>>2]|0}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=i;i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}function Mh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0;o=+nb[c[(c[a>>2]|0)+48>>2]&15](a);u=+g[a+76>>2];t=+g[a+60>>2];r=+g[a+80>>2];q=+g[a+64>>2];n=+g[a+84>>2];m=+g[a+68>>2];F=+g[b>>2];y=+C(+F);E=+g[b+4>>2];x=+C(+E);k=+g[b+8>>2];l=+C(+k);D=+g[b+16>>2];w=+C(+D);B=+g[b+20>>2];v=+C(+B);i=+g[b+24>>2];j=+C(+i);A=+g[b+32>>2];s=+C(+A);z=+g[b+36>>2];p=+C(+z);f=+g[b+40>>2];h=+C(+f);k=(u+t)*.5*F+(r+q)*.5*E+(n+m)*.5*k+ +g[b+48>>2];i=(u+t)*.5*D+(r+q)*.5*B+(n+m)*.5*i+ +g[b+52>>2];f=(u+t)*.5*A+(r+q)*.5*z+(n+m)*.5*f+ +g[b+56>>2];l=(o+(u-t)*.5)*y+(o+(r-q)*.5)*x+(o+(n-m)*.5)*l;j=(o+(u-t)*.5)*w+(o+(r-q)*.5)*v+(o+(n-m)*.5)*j;h=(o+(u-t)*.5)*s+(o+(r-q)*.5)*p+(o+(n-m)*.5)*h;g[d>>2]=k-l;g[d+4>>2]=i-j;g[d+8>>2]=f-h;g[d+12>>2]=0.0;g[e>>2]=l+k;g[e+4>>2]=j+i;g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function Nh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;if(a[d+32>>0]&1){f=c[b+4>>2]|0;if(f|0)ll(f,d,e);f=c[b>>2]|0;if(f|0){n=+g[d>>2];l=+g[f+128>>2];m=+g[d+4>>2];k=+g[d+8>>2];h=+g[e+4>>2];p=+g[e+8>>2];o=+g[e>>2];j=+g[f+180>>2]*(k*h-m*p)+ +g[f+184>>2]*(n*p-k*o)+(m*o-n*h)*+g[f+188>>2];i=(k*h-m*p)*+g[f+196>>2]+(n*p-k*o)*+g[f+200>>2]+(m*o-n*h)*+g[f+204>>2];h=(k*h-m*p)*+g[f+212>>2]+(n*p-k*o)*+g[f+216>>2]+(m*o-n*h)*+g[f+220>>2];g[f+244>>2]=n*l+ +g[f+244>>2];g[f+248>>2]=l*m+ +g[f+248>>2];g[f+252>>2]=l*k+ +g[f+252>>2];g[f+316>>2]=n*l+ +g[f+316>>2];g[f+320>>2]=l*m+ +g[f+320>>2];g[f+324>>2]=l*k+ +g[f+324>>2];g[f+260>>2]=j+ +g[f+260>>2];g[f+264>>2]=i+ +g[f+264>>2];g[f+268>>2]=h+ +g[f+268>>2];g[f+332>>2]=j+ +g[f+332>>2];g[f+336>>2]=i+ +g[f+336>>2];g[f+340>>2]=h+ +g[f+340>>2];c[f+308>>2]=(c[f+308>>2]|0)+1}}if(!(a[d+32>>0]&2))return;aj(b,d+16|0,e);return}function Oh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;h=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=h;if(h|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;g=c[a+100>>2]|0;c[b+60>>2]=g;if(!g){c[b+52>>2]=0;c[b+56>>2]=0;d=b+64|0;c[d>>2]=0;return 17203}c[b+52>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+108>>2]|0)|0;c[b+56>>2]=0;h=Bb[c[(c[d>>2]|0)+16>>2]&63](d,16,g)|0;if((g|0)>0){e=c[a+108>>2]|0;a=c[h+8>>2]|0;f=0;while(1){c[a>>2]=c[e+(f<<4)>>2];c[a+4>>2]=c[e+(f<<4)+4>>2];c[a+8>>2]=c[e+(f<<4)+8>>2];c[a+12>>2]=c[e+(f<<4)+12>>2];f=f+1|0;if((f|0)==(g|0))break;else a=a+16|0}}else e=c[a+108>>2]|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,h,19202,1497453121,e);d=b+64|0;c[d>>2]=0;return 17203}function Ph(b){b=b|0;var d=0;d=c[b+112>>2]|0;if(d|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=0;c[b+104>>2]=0;c[b+108>>2]=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function Qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;k=c[b>>2]|0;if((k|0)==(c[a+84>>2]|0)){j=1.0;return +j}if(c[k+204>>2]&4|0){j=1.0;return +j}f=+g[b+8>>2];h=+g[b+12>>2];e=+g[b+16>>2];if(d){i=f;j=h}else{i=+g[k+4>>2]*f+ +g[k+8>>2]*h+ +g[k+12>>2]*e;j=f*+g[k+20>>2]+h*+g[k+24>>2]+e*+g[k+28>>2];e=f*+g[k+36>>2]+h*+g[k+40>>2]+e*+g[k+44>>2]}if(i*+g[a+88>>2]+j*+g[a+92>>2]+e*+g[a+96>>2]<+g[a+104>>2]){j=1.0;return +j}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=k;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=+g[b+8>>2];f=+g[b+12>>2];h=+g[b+16>>2];i=e*+g[k+20>>2]+f*+g[k+24>>2]+h*+g[k+28>>2];j=e*+g[k+36>>2]+f*+g[k+40>>2]+h*+g[k+44>>2];g[a+48>>2]=+g[k+4>>2]*e+ +g[k+8>>2]*f+ +g[k+12>>2]*h;g[a+52>>2]=i;g[a+56>>2]=j;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];j=+g[b+40>>2];return +j}function Rh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;if((c[b+12>>2]|0)>=2){Nf(b);return}c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=f+(d*12|0)|0;h=(c[b+16>>2]|0)+(d*12|0)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Nf(b);return}function Sh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+52>>2];c[b+56>>2]=c[a+56>>2];c[b+60>>2]=c[a+60>>2];c[b+64>>2]=c[a+64>>2];c[b+68>>2]=c[a+68>>2];c[b+72>>2]=c[a+72>>2];c[b+76>>2]=c[a+76>>2];c[b+80>>2]=c[a+80>>2];c[b+84>>2]=c[a+84>>2];c[b+88>>2]=c[a+88>>2];c[b+92>>2]=c[a+92>>2];c[b+96>>2]=c[a+96>>2];c[b+100>>2]=c[a+100>>2];c[b+104>>2]=c[a+104>>2];c[b+108>>2]=c[a+108>>2];c[b+112>>2]=c[a+112>>2];c[b+116>>2]=c[a+116>>2];c[b+120>>2]=c[a+120>>2];c[b+124>>2]=c[a+124>>2];c[b+128>>2]=c[a+128>>2];c[b+132>>2]=c[a+132>>2];c[b+136>>2]=c[a+136>>2];c[b+140>>2]=c[a+140>>2];c[b+144>>2]=c[a+144>>2];c[b+148>>2]=c[a+148>>2];c[b+152>>2]=c[a+152>>2];c[b+156>>2]=c[a+156>>2];c[b+160>>2]=c[a+160>>2];c[b+164>>2]=c[a+164>>2];c[b+168>>2]=c[a+168>>2];c[b+172>>2]=c[a+172>>2];c[b+176>>2]=c[a+176>>2];c[b+180>>2]=c[a+188>>2];c[b+184>>2]=c[a+184>>2];c[b+188>>2]=c[a+196>>2];c[b+192>>2]=c[a+192>>2];c[b+196>>2]=d[a+180>>0];c[b+200>>2]=d[a+49>>0];return 12599}function Th(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);id(a,b);dj(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function Uh(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=+d;e=+e;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;p=+g[c>>2];o=+g[c+16>>2];n=+g[c+32>>2];m=+g[c+4>>2];l=+g[c+20>>2];k=+g[c+36>>2];j=+g[c+8>>2];i=+g[c+24>>2];h=+g[c+40>>2];g[a>>2]=b-((p*0.0+o*-f+n*e)*0.0+(m*0.0+l*-f+k*e)*f+(j*0.0+i*-f+h*e)*-e);g[a+4>>2]=0.0-((p*0.0+o*-f+n*e)*-f+(m*0.0+l*-f+k*e)*0.0+(j*0.0+i*-f+h*e)*d);g[a+8>>2]=0.0-((p*0.0+o*-f+n*e)*e+(m*0.0+l*-f+k*e)*-d+(j*0.0+i*-f+h*e)*0.0);g[a+12>>2]=0.0;g[a+16>>2]=0.0-((p*f+o*0.0+n*-d)*0.0+(m*f+l*0.0+k*-d)*f+(j*f+i*0.0+h*-d)*-e);g[a+20>>2]=b-((p*f+o*0.0+n*-d)*-f+(m*f+l*0.0+k*-d)*0.0+(j*f+i*0.0+h*-d)*d);g[a+24>>2]=0.0-((p*f+o*0.0+n*-d)*e+(m*f+l*0.0+k*-d)*-d+(j*f+i*0.0+h*-d)*0.0);g[a+28>>2]=0.0;g[a+32>>2]=0.0-((p*-e+o*d+n*0.0)*0.0+(m*-e+l*d+k*0.0)*f+(j*-e+i*d+h*0.0)*-e);g[a+36>>2]=0.0-((p*-e+o*d+n*0.0)*-f+(m*-e+l*d+k*0.0)*0.0+(j*-e+i*d+h*0.0)*d);g[a+40>>2]=b-((p*-e+o*d+n*0.0)*e+(m*-e+l*d+k*0.0)*-d+(j*-e+i*d+h*0.0)*0.0);g[a+44>>2]=0.0;return}function Vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0;f=l;l=l+96|0;g[f+4>>2]=1.0;c[f+8>>2]=0;c[f+12>>2]=1;c[f+16>>2]=-1;c[f+20>>2]=0;c[f>>2]=2952;c[f+24>>2]=c[b>>2];c[f+24+4>>2]=c[b+4>>2];c[f+24+8>>2]=c[b+8>>2];c[f+24+12>>2]=c[b+12>>2];c[f+40>>2]=c[d>>2];c[f+40+4>>2]=c[d+4>>2];c[f+40+8>>2]=c[d+8>>2];c[f+40+12>>2]=c[d+12>>2];a=c[a+4>>2]|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,f);a=c[f+8>>2]|0;if(!a){e=0;l=f;return e|0}if(!(c[a+252>>2]&2)){e=0;l=f;return e|0}if(c[a+204>>2]&4|0){e=0;l=f;return e|0}c[e>>2]=c[f+72>>2];c[e+4>>2]=c[f+72+4>>2];c[e+8>>2]=c[f+72+8>>2];c[e+12>>2]=c[f+72+12>>2];c[e+16>>2]=c[f+56>>2];c[e+16+4>>2]=c[f+56+4>>2];c[e+16+8>>2]=c[f+56+8>>2];c[e+16+12>>2]=c[f+56+12>>2];k=+g[e+16>>2];j=+g[e+20>>2];i=+g[e+24>>2];h=1.0/+D(+(k*k+j*j+i*i));g[e+16>>2]=k*h;g[e+20>>2]=j*h;g[e+24>>2]=i*h;c[e+32>>2]=c[f+4>>2];e=a;l=f;return e|0}function Wh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0;e=l;l=l+32|0;d=c[b+448>>2]|0;switch(c[a+448>>2]&48&d&63){case 32:{if((a|0)==(b|0)&(d&64|0)==0){l=e;return}g[e+4>>2]=1.0;c[e+8+4>>2]=0;c[e+8+4+4>>2]=0;c[e+8+4+8>>2]=0;c[e>>2]=3748;c[e+8>>2]=c[a+516>>2];d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+16>>2]=c[(+g[a+376>>2]<+g[b+376>>2]?a+376|0:b+376|0)>>2];c[e+24>>2]=a;c[e+28>>2]=b;Ee(c[a+1068>>2]|0,c[b+1068>>2]|0,e);l=e;return}case 16:{if((a|0)==(b|0)){l=e;return}c[e>>2]=3784;d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+4>>2]=a;c[e+8>>2]=b;Ee(c[a+988>>2]|0,c[b+1028>>2]|0,e);c[e+4>>2]=b;c[e+8>>2]=a;Ee(c[b+988>>2]|0,c[a+1028>>2]|0,e);l=e;return}default:{l=e;return}}}function Xh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+48|0;g=m;h=g+44|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));if(!d)j=c[c[b+940>>2]>>2]|0;else j=d;d=c[b+792>>2]|0;if((d|0)==(c[b+796>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((k*52|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[b+792>>2]|0}if((d|0)>0){e=0;do{g=i+(e*52|0)|0;f=(c[b+800>>2]|0)+(e*52|0)|0;h=g+52|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));e=e+1|0}while((e|0)!=(d|0))}d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=i;c[b+796>>2]=k;d=c[b+792>>2]|0}g=c[b+800>>2]|0;c[g+(d*52|0)>>2]=0;c[g+(d*52|0)+4>>2]=j;g=g+(d*52|0)+8|0;f=m;h=g+44|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));c[b+792>>2]=(c[b+792>>2]|0)+1;l=m;return}function Yh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0;i=l;l=l+32|0;c[i+16>>2]=c[d>>2];c[i+16+4>>2]=c[d+4>>2];c[i+16+8>>2]=c[d+8>>2];c[i+16+12>>2]=c[d+12>>2];f=+g[i+16>>2];h=+g[i+16+4>>2];e=+g[i+16+8>>2];if(f*f+h*h+e*e<1.4210854715202004e-14){c[i+16>>2]=-1082130432;c[i+16+4>>2]=-1082130432;c[i+16+8>>2]=-1082130432;g[i+16+12>>2]=0.0;f=-1.0;h=-1.0;e=-1.0}j=1.0/+D(+(f*f+h*h+e*e));g[i+16>>2]=f*j;g[i+16+4>>2]=h*j;g[i+16+8>>2]=e*j;Nd(i,b,i+16|0);switch(c[b+4>>2]|0){case 8:{e=+g[b+32>>2]*+g[b+16>>2];break}case 0:{e=+g[b+48>>2];break}case 1:{e=+g[b+48>>2];break}case 13:{e=+g[b+48>>2];break}case 11:{e=+g[b+48>>2];break}case 10:{e=+g[b+48>>2];break}case 4:case 5:{e=+g[b+48>>2];break}default:e=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}h=e*+g[i+16+4>>2]+ +g[i+4>>2];j=e*+g[i+16+8>>2]+ +g[i+8>>2];g[a>>2]=e*+g[i+16>>2]+ +g[i>>2];g[a+4>>2]=h;g[a+8>>2]=j;g[a+12>>2]=0.0;l=i;return}function Zh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,k=0,m=0,n=0,o=0.0;m=l;l=l+80|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];if(e*e+f*f+i*i<9.999999747378752e-05){k=1065353216;h=0;e=0.0;d=0}else{o=1.0/+D(+(e*e+f*f+i*i));k=(g[j>>2]=e*o,c[j>>2]|0);n=(g[j>>2]=f*o,c[j>>2]|0);h=(g[j>>2]=i*o,c[j>>2]|0);e=+g[d+12>>2];d=n}c[m+32>>2]=8168;n=m+32+4|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[m+32+20>>2]=-999999984306749440.0;c[m+32+24>>2]=k;c[m+32+28>>2]=d;c[m+32+32>>2]=h;g[m+32+36>>2]=e;c[m+16>>2]=1566444395;c[m+16+4>>2]=1566444395;c[m+16+8>>2]=1566444395;g[m+16+12>>2]=0.0;b=c[b+96>>2]|0;k=c[(c[b>>2]|0)+8>>2]|0;g[m>>2]=-999999984306749440.0;g[m+4>>2]=-999999984306749440.0;g[m+8>>2]=-999999984306749440.0;g[m+12>>2]=0.0;Vb[k&127](b,m+32|0,m,m+16|0);c[a>>2]=c[n>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];c[a+12>>2]=c[n+12>>2];l=m;return}function _h(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0;p=l;l=l+32|0;e=c[a+12>>2]|0;if(!e){l=p;return}c[f+4>>2]=e;q=c[b+4>>2]|0;a=c[d+4>>2]|0;r=c[b+12>>2]|0;b=c[d+12>>2]|0;h=+g[r+48>>2]-+g[b+48>>2];i=+g[r+52>>2]-+g[b+52>>2];k=+g[r+56>>2]-+g[b+56>>2];m=+D(+(h*h+i*i+k*k));n=+g[q+32>>2]*+g[q+16>>2];o=+g[a+32>>2]*+g[a+16>>2];c[e+780>>2]=0;if(m>n+o+ +g[f+32>>2]){l=p;return}c[p+16>>2]=1065353216;c[p+16+4>>2]=0;c[p+16+8>>2]=0;g[p+16+12>>2]=0.0;if(m>1.1920928955078125e-07){g[p+16>>2]=h*(1.0/m);g[p+16+4>>2]=i*(1.0/m);g[p+16+8>>2]=k*(1.0/m);g[p+16+12>>2]=0.0;j=h*(1.0/m);i=i*(1.0/m);h=k*(1.0/m)}else{j=1.0;i=0.0;h=0.0}r=c[d+12>>2]|0;i=o*i+ +g[r+52>>2];k=o*h+ +g[r+56>>2];g[p>>2]=o*j+ +g[r+48>>2];g[p+4>>2]=i;g[p+8>>2]=k;g[p+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,p+16|0,p,m-(n+o));l=p;return}function $h(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0;m=c[a+4>>2]|0;a=c[a+44>>2]|0;do if(!m)if(!a){e=0;f=0.0;h=0;i=0;j=0;k=0.0;l=0;a=0}else{e=c[a>>2]|0;f=+g[a+12>>2];h=c[a+16>>2]|0;i=c[a+20>>2]|0;j=c[a+24>>2]|0;k=+g[a+28>>2];l=c[a+4>>2]|0;a=c[a+8>>2]|0}else if(!a){e=c[m>>2]|0;f=+g[m+12>>2];h=c[m+16>>2]|0;i=c[m+20>>2]|0;j=c[m+24>>2]|0;k=+g[m+28>>2];l=c[m+4>>2]|0;a=c[m+8>>2]|0;break}else{e=c[(+g[m>>2]<+g[a>>2]?m:a)>>2]|0;f=0.0;h=c[(+g[m+16>>2]>+g[a+16>>2]?m+16|0:a+16|0)>>2]|0;i=c[(+g[m+20>>2]>+g[a+20>>2]?m+16|0:a+16|0)+4>>2]|0;j=c[(+g[m+24>>2]>+g[a+24>>2]?m+16|0:a+16|0)+8>>2]|0;k=0.0;l=c[(+g[m+4>>2]<+g[a+4>>2]?m:a)+4>>2]|0;a=c[(+g[m+8>>2]<+g[a+8>>2]?m:a)+8>>2]|0;break}while(0);c[b>>2]=e;c[b+4>>2]=l;c[b+8>>2]=a;g[b+12>>2]=f;c[d>>2]=h;c[d+4>>2]=i;c[d+8>>2]=j;g[d+12>>2]=k;return}function ai(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0.0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;f=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];j=+D(+(f*f+i*i+j*j));h=c[b+68>>2]|0;do if(!(+g[d+(l<<2)>>2]>j*+g[b+56>>2])){f=+g[d+(h<<2)>>2];e=c[b+76>>2]|0;i=+g[d+(e<<2)>>2];j=+D(+(f*f+i*i));if(j>1.1920928955078125e-07){j=+g[b+60>>2]/j;g[a+(h<<2)>>2]=f*j;g[a+(l<<2)>>2]=-k;f=i*j;break}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;f=0.0;break}}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;f=0.0;e=c[b+76>>2]|0}while(0);g[a+(e<<2)>>2]=f;if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;i=+g[d>>2];j=+g[d+4>>2];k=+g[d+8>>2];m=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:i;f=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:j;k=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:k;j=1.0/+D(+(k*k+(m*m+f*f)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*j*m;g[a+4>>2]=i*j*f+ +g[a+4>>2];g[a+8>>2]=i*j*k+ +g[a+8>>2];return}function bi(a,b,d){a=a|0;b=b|0;d=d|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];c[a+316>>2]=c[b+16>>2];c[a+316+4>>2]=c[b+16+4>>2];c[a+316+8>>2]=c[b+16+8>>2];c[a+316+12>>2]=c[b+16+12>>2];c[a+332>>2]=c[b+32>>2];c[a+332+4>>2]=c[b+32+4>>2];c[a+332+8>>2]=c[b+32+8>>2];c[a+332+12>>2]=c[b+32+12>>2];c[a+348>>2]=c[b+48>>2];c[a+348+4>>2]=c[b+48+4>>2];c[a+348+8>>2]=c[b+48+8>>2];c[a+348+12>>2]=c[b+48+12>>2];c[a+364>>2]=c[d>>2];c[a+364+4>>2]=c[d+4>>2];c[a+364+8>>2]=c[d+8>>2];c[a+364+12>>2]=c[d+12>>2];c[a+380>>2]=c[d+16>>2];c[a+380+4>>2]=c[d+16+4>>2];c[a+380+8>>2]=c[d+16+8>>2];c[a+380+12>>2]=c[d+16+12>>2];c[a+396>>2]=c[d+32>>2];c[a+396+4>>2]=c[d+32+4>>2];c[a+396+8>>2]=c[d+32+8>>2];c[a+396+12>>2]=c[d+32+12>>2];c[a+412>>2]=c[d+48>>2];c[a+412+4>>2]=c[d+48+4>>2];c[a+412+8>>2]=c[d+48+8>>2];c[a+412+12>>2]=c[d+48+12>>2];Ib[c[(c[a>>2]|0)+8>>2]&511](a);return}function ci(a){a=a|0;var b=0,d=0;Dd(a);a:do if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&6144|0):0){d=xb[c[(c[a>>2]|0)+104>>2]&127](a)|0;while(1){b=d+-1|0;if((d|0)<=0)break a;d=zb[c[(c[a>>2]|0)+108>>2]&31](a,b)|0;Ob[c[(c[a>>2]|0)+172>>2]&127](a,d);d=b}}while(0);if((((xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&16387|0):0)?xb[c[(c[a>>2]|0)+20>>2]&127](a)|0:0)?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,xb[c[(c[d>>2]|0)+56>>2]&127](d)|0):0)?(c[a+296>>2]|0)>0:0){b=0;do{d=c[(c[a+304>>2]|0)+(b<<2)>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,c[a+72>>2]|0);b=b+1|0}while((b|0)<(c[a+296>>2]|0))}if(!(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0))return;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Ib[c[(c[a>>2]|0)+104>>2]&511](a);return}function di(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;c=l;l=l+48|0;yh(a+364|0,c+16|0);h=-+g[c+16>>2];e=-+g[c+16+4>>2];m=-+g[c+16+8>>2];k=+g[c+16+12>>2];f=+g[b>>2];n=+g[b+12>>2];j=+g[b+8>>2];i=+g[b+4>>2];yh(a+300|0,c);p=+g[c>>2];q=+g[c+12>>2];d=+g[c+8>>2];o=+g[c+4>>2];g[c+32>>2]=(k*n-f*h-i*e-j*m)*p+(k*f+n*h+j*e-i*m)*q+(f*m+(n*e+k*i)-j*h)*d-(n*m+k*j+i*h-f*e)*o;g[c+32+4>>2]=p*(n*m+k*j+i*h-f*e)+(q*(f*m+(n*e+k*i)-j*h)+(k*n-f*h-i*e-j*m)*o)-(k*f+n*h+j*e-i*m)*d;g[c+32+8>>2]=(n*m+k*j+i*h-f*e)*q+(k*n-f*h-i*e-j*m)*d+(k*f+n*h+j*e-i*m)*o-p*(f*m+(n*e+k*i)-j*h);g[c+32+12>>2]=(k*n-f*h-i*e-j*m)*q-(k*f+n*h+j*e-i*m)*p-(f*m+(n*e+k*i)-j*h)*o-(n*m+k*j+i*h-f*e)*d;Ce(a,c+32|0);l=c;return}function ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!e)e=c[b+188>>2]|0;j=c[d>>2]|0;f=c[b+328>>2]|0;a:do if((f|0)>0){h=c[b+336>>2]|0;g=0;while(1){if((c[h+(g<<2)>>2]|0)==(j|0))break;g=g+1|0;if((g|0)>=(f|0))break a}if((g|0)!=(f|0))return}while(0);if((f|0)==(c[b+332>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+328>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+336>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+336>>2]|0;if(g){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=h;c[b+332>>2]=i}c[(c[b+336>>2]|0)+(f<<2)>>2]=j;c[b+328>>2]=f+1;b=c[b+344>>2]|0;Bb[c[(c[b>>2]|0)+8>>2]&63](b,e,d)|0;return}function fi(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;c[b>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+28>>2]|0)|0;c[b+4>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+32>>2]|0)|0;f=zb[c[(c[e>>2]|0)+40>>2]&31](e,a)|0;g=zb[c[(c[e>>2]|0)+28>>2]&31](e,f)|0;c[b+8>>2]=g;if(g|0)Ob[c[(c[e>>2]|0)+48>>2]&127](e,f);c[b+12>>2]=c[a+4>>2];c[b+24>>2]=d[a+21>>0];c[b+40>>2]=c[a+24>>2];c[b+44>>2]=c[a+16>>2];c[b+48>>2]=d[a+20>>0];c[b+20>>2]=c[a+12>>2];c[b+16>>2]=c[a+8>>2];c[b+28>>2]=c[a+36>>2];c[b+32>>2]=c[a+40>>2];c[b+36>>2]=0;f=c[a+28>>2]|0;if((c[f+548>>2]|0)>0){e=0;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+28>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0))}f=c[a+32>>2]|0;if((c[f+548>>2]|0)>0)e=0;else return 12572;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+32>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0));return 12572}function gi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return db(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function hi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(xb[c[(c[d>>2]|0)+16>>2]&127](d)|0)return;i=c[b+772>>2]|0;h=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;if(xb[c[(c[d>>2]|0)+8>>2]&127](d)|0?(e=xb[c[(c[d>>2]|0)+20>>2]&127](d)|0,g=xb[c[(c[d>>2]|0)+24>>2]&127](d)|0,(i|0)>0):0){f=c[b+780>>2]|0;a=h+(e<<2)|0;e=0;while(1){k=c[f+(e*104|0)+12>>2]|0;j=c[f+(e*104|0)+16>>2]|0;c[a>>2]=c[f+(e*104|0)+8>>2];c[a+4>>2]=k;c[a+8>>2]=j;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}}if(!(xb[c[(c[d>>2]|0)+12>>2]&127](d)|0))return;a=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;g=xb[c[(c[d>>2]|0)+32>>2]&127](d)|0;if((i|0)<=0)return;f=c[b+780>>2]|0;a=h+(a<<2)|0;e=0;while(1){j=c[f+(e*104|0)+76>>2]|0;k=c[f+(e*104|0)+80>>2]|0;c[a>>2]=c[f+(e*104|0)+72>>2];c[a+4>>2]=j;c[a+8>>2]=k;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}return}function ii(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9696;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;f=c[b+28>>2]|0;if((f|0)>0){d=0;do{g=c[b+36>>2]|0;h=g+(d*36|0)+4|0;i=g+(d*36|0)+12|0;j=c[i>>2]|0;e=g+(d*36|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*36|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ji(b){b=b|0;var d=0;c[b>>2]=8796;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}function ki(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+188>>2]|0;if(d|0){f=c[a+68>>2]|0;f=xb[c[(c[f>>2]|0)+36>>2]&127](f)|0;Sb[c[(c[f>>2]|0)+40>>2]&127](f,d,c[a+24>>2]|0);f=c[a+68>>2]|0;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,c[a+24>>2]|0);c[b+188>>2]=0}d=c[b+216>>2]|0;f=c[a+8>>2]|0;if((d|0)>-1&(d|0)<(f|0)){g=c[a+16>>2]|0;e=c[g+(d<<2)>>2]|0;c[g+(d<<2)>>2]=c[g+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=e;c[a+8>>2]=f+-1;if((d|0)>=(f+-1|0)){c[b+216>>2]=-1;return}c[(c[(c[a+16>>2]|0)+(d<<2)>>2]|0)+216>>2]=d;c[b+216>>2]=-1;return}a:do if((f|0)>0){e=c[a+16>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){c[b+216>>2]=-1;return}h=c[a+16>>2]|0;e=h+(d<<2)|0;g=c[e>>2]|0;c[e>>2]=c[h+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=g;c[a+8>>2]=f+-1;c[b+216>>2]=-1;return}function li(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0;p=l;l=l+16|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){o=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(e*e+h*h+f*f));o=e*m;n=h*m;m=f*m}c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;d=c[b+56>>2]|0;b=c[b+32+(d<<2)>>2]|0;c[p+(d<<2)>>2]=b;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];i=o*e+n*h+m*f;k=(c[j>>2]=b,+g[j>>2]);if(i>-999999984306749440.0){b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b}else i=-999999984306749440.0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;g[p+(d<<2)>>2]=-k;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];if(!(o*e+n*h+m*f>i)){l=p;return}b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b;l=p;return}function mi(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];n=+g[b+68>>2];o=+g[b+72>>2];m=+g[b+76>>2];if(!(n*n+o*o+m*m>0.0)){g[b+20>>2]=0.0;return}k=+g[d>>2];l=+g[d+4>>2];e=+g[d+8>>2];f=1.0/+D(+(k*k+l*l+e*e));h=+g[b+256>>2];i=+g[b+260>>2];j=+g[b+264>>2];if(!(h*k*f+l*f*i+e*f*j!=0.0))return;p=h*k*f+l*f*i+e*f*j<-1.0?-1.0:h*k*f+l*f*i+e*f*j;p=+G(+(1.5707963705062866-+I(+(p>1.0?1.0:p))))*+D(+(n*n+o*o+m*m));g[b+68>>2]=n-h*p;g[b+72>>2]=o-i*p;g[b+76>>2]=m-j*p;g[b+20>>2]=(h*k*f+l*f*i+e*f*j<0.0?-1.0:1.0)*+D(+(j*p*j*p+(h*p*h*p+i*p*i*p)));if(!(h*k*f+l*f*i+e*f*j>0.0))return;a[b+249>>0]=1;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function ni(b){b=b|0;var d=0;c[b>>2]=9356;d=c[b+160>>2]|0;if(d|0){if(a[b+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+160>>2]=0}a[b+164>>0]=1;c[b+160>>2]=0;c[b+152>>2]=0;c[b+156>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(!d){a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}function oi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0;p=l;l=l+16|0;if((e|0)<=0){l=p;return}o=0;do{h=+g[a+64>>2]*.5;i=c[a+72>>2]|0;k=+g[b+(o<<4)>>2];m=+g[b+(o<<4)+4>>2];n=+g[b+(o<<4)+8>>2];n=+D(+(k*k+m*m+n*n));j=c[a+68>>2]|0;do if(!(+g[b+(o<<4)+(i<<2)>>2]>n*+g[a+56>>2])){k=+g[b+(o<<4)+(j<<2)>>2];f=c[a+76>>2]|0;m=+g[b+(o<<4)+(f<<2)>>2];n=+D(+(k*k+m*m));if(n>1.1920928955078125e-07){n=+g[a+60>>2]/n;g[p+(j<<2)>>2]=k*n;g[p+(i<<2)>>2]=-h;h=m*n;break}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=-h;h=0.0;break}}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=h;h=0.0;f=c[a+76>>2]|0}while(0);g[p+(f<<2)>>2]=h;j=d+(o<<4)|0;c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2];o=o+1|0}while((o|0)!=(e|0));l=p;return}function pi(b){b=b|0;var d=0;c[b>>2]=5112;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function qi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*+g[a+112>>2]*.5;m=(+g[a+40>>2]-+g[a+24>>2])*+g[a+116>>2]*.5;k=(+g[a+44>>2]-+g[a+28>>2])*+g[a+120>>2]*.5;t=+C(+(+g[b>>2]));s=+C(+(+g[b+4>>2]));r=+C(+(+g[b+8>>2]));n=+C(+(+g[b+16>>2]));l=+C(+(+g[b+20>>2]));j=+C(+(+g[b+24>>2]));w=+C(+(+g[b+32>>2]));v=+C(+(+g[b+36>>2]));f=+C(+(+g[b+40>>2]));u=+g[b+48>>2];p=+g[b+52>>2];h=+g[b+56>>2];q=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=o*w+m*v+k*f+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=u-(o*t+m*s+k*r+q);g[d+4>>2]=p-(o*n+m*l+k*j+i);g[d+8>>2]=h-f;g[d+12>>2]=0.0;g[e>>2]=u+(o*t+m*s+k*r+q);g[e+4>>2]=p+(o*n+m*l+k*j+i);g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function ri(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0;f=l;l=l+16|0;y=c[a+56>>2]|0;z=c[a+32+(((y+2|0)%3|0)<<2)>>2]|0;c[f>>2]=z;c[f+4>>2]=z;c[f+8>>2]=z;g[f+12>>2]=0.0;g[f+(y<<2)>>2]=(c[j>>2]=z,+g[j>>2])+ +g[a+32+(y<<2)>>2];w=+C(+(+g[b>>2]));v=+C(+(+g[b+4>>2]));u=+C(+(+g[b+8>>2]));s=+C(+(+g[b+16>>2]));r=+C(+(+g[b+20>>2]));q=+C(+(+g[b+24>>2]));o=+C(+(+g[b+32>>2]));m=+C(+(+g[b+36>>2]));i=+C(+(+g[b+40>>2]));x=+g[b+48>>2];t=+g[b+52>>2];p=+g[b+56>>2];n=+g[f>>2];k=+g[f+4>>2];h=+g[f+8>>2];g[d>>2]=x-(w*n+v*k+u*h);g[d+4>>2]=t-(s*n+r*k+q*h);g[d+8>>2]=p-(o*n+m*k+i*h);g[d+12>>2]=0.0;g[e>>2]=x+(w*n+v*k+u*h);g[e+4>>2]=t+(s*n+r*k+q*h);g[e+8>>2]=p+(o*n+m*k+i*h);g[e+12>>2]=0.0;l=f;return}function si(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+64|0;b=c[b+36>>2]|0;e=c[(c[a+24>>2]|0)+28>>2]|0;c[d>>2]=c[e+(b*80|0)>>2];c[d+4>>2]=c[e+(b*80|0)+4>>2];c[d+8>>2]=c[e+(b*80|0)+8>>2];c[d+12>>2]=c[e+(b*80|0)+12>>2];c[d+16>>2]=c[e+(b*80|0)+16>>2];c[d+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[d+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[d+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[d+32>>2]=c[e+(b*80|0)+32>>2];c[d+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[d+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[d+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[d+48>>2]=c[e+(b*80|0)+48>>2];c[d+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[d+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[d+48+12>>2]=c[e+(b*80|0)+48+12>>2];jg(a,b,d,c[e+(b*80|0)+64>>2]|0);l=d;return}function ti(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=l;l=l+48|0;e=c[a+28>>2]|0;c[i+32>>2]=e;e=(c[a+20>>2]|0)-e|0;c[i+32+4>>2]=e;c[i+32+8>>2]=b;c[i+32+12>>2]=d;c[i>>2]=c[a+60>>2];c[i+4>>2]=i+32;c[i+8>>2]=2;f=SC($a(146,i|0)|0)|0;a:do if((e+d|0)!=(f|0)){b=2;g=e+d|0;e=i+32|0;while(1){if((f|0)<0)break;g=g-f|0;j=c[e+4>>2]|0;k=f>>>0>j>>>0;e=k?e+8|0:e;b=(k<<31>>31)+b|0;j=f-(k?j:0)|0;c[e>>2]=(c[e>>2]|0)+j;c[e+4>>2]=(c[e+4>>2]|0)-j;c[i+16>>2]=c[a+60>>2];c[i+16+4>>2]=e;c[i+16+8>>2]=b;f=SC($a(146,i+16|0)|0)|0;if((g|0)==(f|0)){h=3;break a}}c[a+16>>2]=0;c[a+28>>2]=0;c[a+20>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[e+4>>2]|0)|0}else h=3;while(0);if((h|0)==3){k=c[a+44>>2]|0;c[a+16>>2]=k+(c[a+48>>2]|0);c[a+28>>2]=k;c[a+20>>2]=k}l=i;return d|0}function ui(b){b=b|0;var d=0;if((a[22440]|0)==0?Uz(22440)|0:0){if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}c[5738]=c[5682];c[5739]=c[5683];c[5740]=c[5684];c[5741]=c[5685];c[5742]=c[5686];c[5743]=c[5687];c[5744]=c[5688];c[5745]=c[5689];c[5746]=c[5690];c[5747]=c[5691];c[5748]=c[5692];c[5749]=c[5693];c[5750]=c[5694];c[5751]=c[5695];c[5752]=c[5696];c[5753]=c[5697]}d=c[b+8>>2]|0;if(!d){d=c[b>>2]|0;return ((d|0)==0?22952:d+60|0)|0}else return d+4|0;return 0}function vi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=c[b>>2]|0;if((e|0)==(c[a+84>>2]|0)){f=1.0;return +f}if(c[e+204>>2]&4|0){f=1.0;return +f}if((+g[a+32>>2]-+g[a+16>>2])*+g[b+8>>2]+(+g[a+36>>2]-+g[a+20>>2])*+g[b+12>>2]+(+g[a+40>>2]-+g[a+24>>2])*+g[b+16>>2]>=-+g[a+88>>2]){f=1.0;return +f}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{k=+g[b+8>>2];j=+g[b+12>>2];i=+g[b+16>>2];h=k*+g[e+20>>2]+j*+g[e+24>>2]+i*+g[e+28>>2];f=k*+g[e+36>>2]+j*+g[e+40>>2]+i*+g[e+44>>2];g[a+48>>2]=+g[e+4>>2]*k+ +g[e+8>>2]*j+ +g[e+12>>2]*i;g[a+52>>2]=h;g[a+56>>2]=f;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];k=+g[b+40>>2];return +k}function wi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;i=l;l=l+80|0;if((e|0)>0)f=0;else{l=i;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));h=i+32+4|0;f=0;do{j=b+(f<<4)|0;c[i+32>>2]=8168;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;g[i+32+20>>2]=-999999984306749440.0;c[i+32+24>>2]=c[j>>2];c[i+32+24+4>>2]=c[j+4>>2];c[i+32+24+8>>2]=c[j+8>>2];c[i+32+24+12>>2]=c[j+12>>2];c[i+16>>2]=1566444395;c[i+16+4>>2]=1566444395;c[i+16+8>>2]=1566444395;g[i+16+12>>2]=0.0;j=c[a+96>>2]|0;k=c[(c[j>>2]|0)+8>>2]|0;g[i>>2]=-999999984306749440.0;g[i+4>>2]=-999999984306749440.0;g[i+8>>2]=-999999984306749440.0;g[i+12>>2]=0.0;Vb[k&127](j,i+32|0,i,i+16|0);j=d+(f<<4)|0;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];f=f+1|0}while((f|0)<(e|0));l=i;return}function xi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[b+100>>2]|0;if((f|0)==(c[b+104>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+100>>2]|0}if((f|0)>0){g=0;do{j=h+(g<<4)|0;k=(c[b+108>>2]|0)+(g<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];g=g+1|0}while((g|0)!=(f|0))}f=c[b+108>>2]|0;if(f|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=h;c[b+104>>2]=i;f=c[b+100>>2]|0}k=(c[b+108>>2]|0)+(f<<4)|0;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[b+100>>2]=(c[b+100>>2]|0)+1;if(!e)return;uj(b);return}function yi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+96|0;b=c[b>>2]|0;if((b|0)==(c[a+4>>2]|0)){l=d;return 1}e=c[a+12>>2]|0;if(!(zb[c[(c[e>>2]|0)+8>>2]&31](e,c[b+188>>2]|0)|0)){l=d;return 1}e=c[a+4>>2]|0;f=c[e+192>>2]|0;c[d+64>>2]=0;c[d+64+4>>2]=f;c[d+64+8>>2]=e;c[d+64+12>>2]=e+4;c[d+64+16>>2]=-1;c[d+64+20>>2]=-1;e=c[b+192>>2]|0;c[d+40>>2]=0;c[d+40+4>>2]=e;c[d+40+8>>2]=b;c[d+40+12>>2]=b+4;c[d+40+16>>2]=-1;c[d+40+20>>2]=-1;b=c[(c[a+8>>2]|0)+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,d+64|0,d+40|0,0,2)|0;if(b|0){f=c[a+12>>2]|0;c[d+4>>2]=0;c[d+8>>2]=d+64;c[d+12>>2]=d+40;g[d+32>>2]=0.0;c[d>>2]=6324;c[d+36>>2]=f;Zb[c[(c[b>>2]|0)+8>>2]&31](b,d+64|0,d+40|0,(c[a+8>>2]|0)+28|0,d);Ib[c[c[b>>2]>>2]&511](b);f=c[(c[a+8>>2]|0)+24>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,b)}l=d;return 1}function zi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;i=c[c[a>>2]>>2]|0;h=c[c[a+4>>2]>>2]|0;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,i,h)|0)){l=k;return}f=c[i+192>>2]|0;c[k+64>>2]=0;c[k+64+4>>2]=f;c[k+64+8>>2]=i;c[k+64+12>>2]=i+4;c[k+64+16>>2]=-1;c[k+64+20>>2]=-1;f=c[h+192>>2]|0;c[k+40>>2]=0;c[k+40+4>>2]=f;c[k+40+8>>2]=h;c[k+40+12>>2]=h+4;c[k+40+16>>2]=-1;c[k+40+20>>2]=-1;f=c[a+8>>2]|0;if(!f){f=Db[c[(c[b>>2]|0)+8>>2]&1](b,k+64|0,k+40|0,0,1)|0;c[a+8>>2]=f;if(f|0)j=4}else j=4;if((j|0)==4){c[k>>2]=5916;c[k+4>>2]=0;c[k+8>>2]=k+64;c[k+12>>2]=k+40;g[k+32>>2]=0.0;if((c[d+8>>2]|0)!=1){e=+tb[c[(c[f>>2]|0)+12>>2]&15](f,i,h,d,k);if(+g[d+12>>2]>e)g[d+12>>2]=e}else Zb[c[(c[f>>2]|0)+8>>2]&31](f,k+64|0,k+40|0,d,k)}l=k;return}function Ai(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;c[a+4>>2]=35;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=8484;c[a+56>>2]=1;f=+g[b+4>>2]+-.03999999910593033;d=+g[b+8>>2]+-.03999999910593033;g[a+32>>2]=+g[b>>2]+-.03999999910593033;g[a+36>>2]=f;g[a+40>>2]=d;g[a+44>>2]=0.0;e=!(+g[b>>2]<+g[b+4>>2])&1;d=+g[b+((+g[b+(e<<2)>>2]<+g[b+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(d<.03999999910593033)){c[a+4>>2]=13;return}j=+HG(a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=j+ +g[a+32>>2];h=h+ +g[a+36>>2];f=f+ +g[a+40>>2];g[a+48>>2]=d;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=f-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=j-i;g[a+36>>2]=h-d;g[a+40>>2]=f;g[a+44>>2]=0.0;c[a+4>>2]=13;return}function Bi(b){b=b|0;var d=0,e=0,f=0,h=0;c[b+32>>2]=262144;d=c[b+4>>2]|0;if((d|0)<2383){if((c[b+8>>2]|0)<2383){c[6995]=(c[6995]|0)+1;e=sc(9551)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=2383;e=b+12|0}else e=b+12|0;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=2383)}c[b+4>>2]=2383;e=0;do{h=(c[b+12>>2]|0)+(e<<2)|0;d=c[h>>2]|0;c[h>>2]=0;if(d|0)do{h=d;d=c[d+280>>2]|0;cJ(h)}while((d|0)!=0);e=e+1|0}while((e|0)!=2383);g[b+20>>2]=.25;c[b+24>>2]=0;c[b+28>>2]=0;c[b+36>>2]=1;c[b+40>>2]=1;return}function Ci(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d>>2]=8188;c[d+4>>2]=0;f=+g[a+4>>2]+-.03999999910593033;b=+g[a+8>>2]+-.03999999910593033;g[d+32>>2]=+g[a>>2]+-.03999999910593033;g[d+36>>2]=f;g[d+40>>2]=b;g[d+44>>2]=0.0;e=!(+g[a>>2]<+g[a+4>>2])&1;b=+g[a+((+g[a+(e<<2)>>2]<+g[a+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(b<.03999999910593033))return d|0;j=+HG(d);h=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);j=j+ +g[d+32>>2];h=h+ +g[d+36>>2];f=f+ +g[d+40>>2];g[d+48>>2]=b;i=+nb[c[(c[d>>2]|0)+48>>2]&15](d);b=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=f-+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[d+32>>2]=j-i;g[d+36>>2]=h-b;g[d+40>>2]=f;g[d+44>>2]=0.0;return d|0}function Di(b,d,e,f){b=b|0;d=+d;e=e|0;f=+f;var h=0,i=0.0,j=0;eb(c[6994]|0,0)|0;if(e){g[b+284>>2]=f;i=+g[b+280>>2]+d;g[b+280>>2]=i;if(!(i>=f)){d=f;j=0}else{g[b+280>>2]=i-+(~~(i/f)|0)*f;d=f;j=~~(i/f)}}else{g[b+280>>2]=a[b+316>>0]|0?0.0:d;g[b+284>>2]=0.0;j=!(+C(+d)<1.1920928955078125e-07)&1;e=j}if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0){h=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;a[28564]=(xb[c[(c[h>>2]|0)+56>>2]&127](h)|0)>>>4&1}if(j){h=(j|0)>(e|0)?e:j;Jb[c[(c[b>>2]|0)+168>>2]&31](b,d*+(h|0));Ib[c[(c[b>>2]|0)+176>>2]&511](b);if((h|0)>0){e=0;do{Jb[c[(c[b>>2]|0)+160>>2]&31](b,d);Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=e+1|0}while((e|0)<(h|0));e=b}else e=b}else{Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=b}Ib[c[(c[e>>2]|0)+120>>2]&511](b);c[6993]=(c[6993]|0)+1;return j|0}function Ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;f=c[b+24>>2]|0;if((f|0)<(i|0)){if((c[b+28>>2]|0)<(i|0)){if(!i){e=0;h=f}else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+24>>2]|0}if((h|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[b+32>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[b+32>>2]|0;if(g|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=e;c[b+28>>2]=i;e=b+32|0}else e=b+32|0;do{c[(c[e>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(i|0))}else e=b+32|0;c[b+24>>2]=i;f=c[e>>2]|0;if((i|0)<=0)return;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(i|0));return}function Fi(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==32&(d|0)==32)){if((b|0)==32){if((d|0)<20){a=a+92|0;break}if((d+-21|0)>>>0<9){a=a+100|0;break}}else{if((b|0)<20&(d|0)==32){a=a+96|0;break}if((b+-21|0)>>>0<9&(d|0)==32){a=a+104|0;break}if((b|0)==8&(d|0)==8){a=a+56|0;break}if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+88|0;while(0);return c[a>>2]|0}function Gi(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=6512;e=c[b+52>>2]|0;if((e|0)>0){d=0;do{f=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);f=c[b+4>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,c[(c[b+60>>2]|0)+(d<<2)>>2]|0)}d=d+1|0}while((d|0)!=(e|0))}d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+20>>2]|0;if(!d){a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}function Hi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0;if((e|0)>0)f=0;else return;do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));r=0;do{j=+g[a+16>>2];k=+g[b+(r<<4)>>2]*j;l=+g[a+20>>2];m=+g[b+(r<<4)+4>>2]*l;n=+g[a+24>>2];o=+g[b+(r<<4)+8>>2]*n;p=c[a+100>>2]|0;if((p|0)>0){q=c[a+108>>2]|0;f=-1;i=0;h=-3402823466385288598117041.0e14;do{s=k*+g[q+(i<<4)>>2]+m*+g[q+(i<<4)+4>>2]+o*+g[q+(i<<4)+8>>2];t=s>h;f=t?i:f;h=t?s:h;i=i+1|0}while((i|0)!=(p|0));o=+g[q+(f<<4)+4>>2]*l;s=+g[q+(f<<4)+8>>2]*n;g[d+(r<<4)>>2]=+g[q+(f<<4)>>2]*j;g[d+(r<<4)+4>>2]=o;g[d+(r<<4)+8>>2]=s}else h=-999999984306749440.0;g[d+(r<<4)+12>>2]=h;r=r+1|0}while((r|0)!=(e|0));return}function Ii(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;x=+g[a>>2]*f+ +g[a+16>>2]*h+ +g[a+32>>2]*i;v=+g[a+4>>2]*f+ +g[a+20>>2]*h+ +g[a+36>>2]*i;t=+g[a+8>>2]*f+ +g[a+24>>2]*h+ +g[a+40>>2]*i;s=+g[b>>2]*f+ +g[b+16>>2]*h+ +g[b+32>>2]*i;q=+g[b+4>>2]*f+ +g[b+20>>2]*h+ +g[b+36>>2]*i;o=+g[b+8>>2]*f+ +g[b+24>>2]*h+ +g[b+40>>2]*i;w=+g[j+80>>2];u=+g[j+84>>2];p=+g[j+88>>2];r=+g[k+80>>2];m=+g[k+84>>2];n=+g[k+88>>2];p=x*(x<0.0?-w:w)+v*(v<0.0?-u:u)+t*(t<0.0?-p:p);n=s*(s<0.0?-r:r)+q*(q<0.0?-m:m)+o*(o<0.0?-n:n);o=+g[j+96>>2];m=+g[k+96>>2];m=(p>o?p:o)+(n>m?n:m);return !((c*f+d*h+e*i+ml)|0}function Ji(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+772>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+776>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+772>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+776>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+772>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+776>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ji(a,b,e);if((f|0)<(d|0))b=f;else break}return} +function wd(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0;r=l;l=l+288|0;o=c[b+248>>2]|0;if((o|0)>0){h=c[b+256>>2]|0;i=r+224+48|0;m=r+64+28|0;e=0;do{n=c[h+(e<<2)>>2]|0;g[n+268>>2]=1.0;a:do switch(c[n+220>>2]|0){case 2:case 5:break;default:if(!(c[n+204>>2]&3)){Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,d,r+224|0);f=+g[i>>2]-+g[n+52>>2];j=+g[r+224+52>>2]-+g[n+56>>2];k=+g[r+224+56>>2]-+g[n+60>>2];do if((a[b+44>>0]|0?(s=+g[n+276>>2],s*s!=0.0?s*s>2]|0)+4>>2]|0)<20:0){c[5787]=(c[5787]|0)+1;u=c[b+68>>2]|0;u=xb[c[(c[u>>2]|0)+36>>2]&127](u)|0;t=c[b+24>>2]|0;g[r+120+4>>2]=1.0;c[r+120+16>>2]=c[n+52>>2];c[r+120+16+4>>2]=c[n+52+4>>2];c[r+120+16+8>>2]=c[n+52+8>>2];c[r+120+16+12>>2]=c[n+52+12>>2];c[r+120+32>>2]=c[i>>2];c[r+120+32+4>>2]=c[i+4>>2];c[r+120+32+8>>2]=c[i+8>>2];c[r+120+32+12>>2]=c[i+12>>2];c[r+120+80>>2]=0;c[r+120>>2]=4556;c[r+120+84>>2]=n;c[r+120+92>>2]=u;c[r+120+96>>2]=t;t=c[n+272>>2]|0;c[r+64+8>>2]=0;c[r+64+12>>2]=-1;c[r+64>>2]=7020;c[r+64+4>>2]=8;c[r+64+16>>2]=1065353216;c[r+64+20>>2]=1065353216;c[r+64+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[r+64+32>>2]=t;c[r+64+48>>2]=t;g[r+64+52>>2]=0.0;c[r+120+88>>2]=c[b+56>>2];t=c[n+188>>2]|0;c[r+120+8>>2]=c[t+4>>2];c[r+120+12>>2]=c[t+8>>2];c[r+48>>2]=c[i>>2];c[r+48+4>>2]=c[i+4>>2];c[r+48+8>>2]=c[i+8>>2];c[r+48+12>>2]=c[i+12>>2];c[r>>2]=c[n+4>>2];c[r+4>>2]=c[n+4+4>>2];c[r+8>>2]=c[n+4+8>>2];c[r+12>>2]=c[n+4+12>>2];c[r+16>>2]=c[n+20>>2];c[r+16+4>>2]=c[n+20+4>>2];c[r+16+8>>2]=c[n+20+8>>2];c[r+16+12>>2]=c[n+20+12>>2];c[r+32>>2]=c[n+36>>2];c[r+32+4>>2]=c[n+36+4>>2];c[r+32+8>>2]=c[n+36+8>>2];c[r+32+12>>2]=c[n+36+12>>2];Ud(b,r+64|0,n+4|0,r,r+120|0,0.0);f=+g[r+120+4>>2];if(f<1.0){g[n+268>>2]=f;Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,f*d,r+224|0);g[n+268>>2]=0.0;Oe(n,r+224|0);break a}else break}while(0);Oe(n,r+224|0)}}while(0);e=e+1|0}while((e|0)<(o|0))}if(!(a[b+291>>0]|0)){l=r;return}if((c[b+324>>2]|0)<=0){l=r;return}n=0;do{o=c[(c[b+332>>2]|0)+(n<<2)>>2]|0;h=c[o+772>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;m=c[o+776>>2]|0;m=(c[m+252>>2]&2|0)==0?0:m;e=c[o+780>>2]|0;if((e|0)>0)if(!h){h=0;do{f=+g[58]*+g[m+232>>2];if(f>0.0?(p=+g[o+4+(h*192|0)+124>>2],p!=0.0):0){k=f*+g[o+4+(h*192|0)+64>>2]*p;d=f*+g[o+4+(h*192|0)+68>>2]*p;s=f*+g[o+4+(h*192|0)+72>>2]*p;f=+g[o+4+(h*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(h*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(h*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}h=h+1|0}while((h|0)<(e|0))}else{i=0;do{f=+g[h+232>>2]*+g[m+232>>2];if(f>0.0?(q=+g[o+4+(i*192|0)+124>>2],q!=0.0):0){k=f*+g[o+4+(i*192|0)+64>>2]*q;d=f*+g[o+4+(i*192|0)+68>>2]*q;s=f*+g[o+4+(i*192|0)+72>>2]*q;g[r+224>>2]=-k;g[r+224+4>>2]=-d;g[r+224+8>>2]=-s;g[r+224+12>>2]=0.0;j=+g[o+4+(i*192|0)+52>>2]-+g[h+56>>2];f=+g[o+4+(i*192|0)+56>>2]-+g[h+60>>2];g[r+120>>2]=+g[o+4+(i*192|0)+48>>2]-+g[h+52>>2];g[r+120+4>>2]=j;g[r+120+8>>2]=f;g[r+120+12>>2]=0.0;f=+g[o+4+(i*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(i*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(i*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;ll(h,r+224|0,r+120|0);g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}i=i+1|0}while((i|0)<(e|0))}n=n+1|0}while((n|0)<(c[b+324>>2]|0));l=r;return}function xd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0;q=l;l=l+240|0;c[a+4>>2]=(c[a+4>>2]|0)+1;p=c[b+36>>2]|0;o=c[d+36>>2]|0;f=c[a+8>>2]|0;J=c[(c[f+4>>2]|0)+28>>2]|0;d=c[J+(p*80|0)+64>>2]|0;b=(c[(c[a+12>>2]|0)+4>>2]|0)+28|0;e=c[(c[b>>2]|0)+(o*80|0)+64>>2]|0;f=c[f+12>>2]|0;n=+g[f>>2];H=+g[f+4>>2];I=+g[f+8>>2];h=+g[f+16>>2];k=+g[f+20>>2];t=+g[f+24>>2];r=+g[f+32>>2];u=+g[f+36>>2];C=+g[f+40>>2];v=+g[J+(p*80|0)>>2];w=+g[J+(p*80|0)+16>>2];x=+g[J+(p*80|0)+32>>2];y=+g[J+(p*80|0)+4>>2];z=+g[J+(p*80|0)+20>>2];A=+g[J+(p*80|0)+36>>2];i=+g[J+(p*80|0)+8>>2];B=+g[J+(p*80|0)+24>>2];D=+g[J+(p*80|0)+40>>2];s=+g[J+(p*80|0)+48>>2];j=+g[J+(p*80|0)+52>>2];G=+g[J+(p*80|0)+56>>2];E=+g[f+48>>2]+(n*s+H*j+I*G);F=+g[f+52>>2]+(h*s+k*j+t*G);G=+g[f+56>>2]+(r*s+u*j+C*G);g[q+176>>2]=n*v+H*w+I*x;g[q+176+4>>2]=n*y+H*z+I*A;g[q+176+8>>2]=n*i+H*B+I*D;g[q+176+12>>2]=0.0;g[q+176+16>>2]=h*v+k*w+t*x;g[q+176+20>>2]=h*y+k*z+t*A;g[q+176+24>>2]=h*i+k*B+t*D;g[q+176+28>>2]=0.0;g[q+176+32>>2]=r*v+u*w+C*x;g[q+176+36>>2]=r*y+u*z+C*A;g[q+176+40>>2]=r*i+u*B+C*D;g[q+176+44>>2]=0.0;g[q+176+48>>2]=E;g[q+176+52>>2]=F;g[q+176+56>>2]=G;g[q+176+60>>2]=0.0;f=c[(c[a+12>>2]|0)+12>>2]|0;G=+g[f>>2];F=+g[f+4>>2];E=+g[f+8>>2];D=+g[f+16>>2];C=+g[f+20>>2];B=+g[f+24>>2];u=+g[f+32>>2];i=+g[f+36>>2];r=+g[f+40>>2];b=c[b>>2]|0;A=+g[b+(o*80|0)>>2];z=+g[b+(o*80|0)+16>>2];y=+g[b+(o*80|0)+32>>2];x=+g[b+(o*80|0)+4>>2];w=+g[b+(o*80|0)+20>>2];v=+g[b+(o*80|0)+36>>2];t=+g[b+(o*80|0)+8>>2];k=+g[b+(o*80|0)+24>>2];h=+g[b+(o*80|0)+40>>2];I=+g[b+(o*80|0)+48>>2];H=+g[b+(o*80|0)+52>>2];n=+g[b+(o*80|0)+56>>2];j=+g[f+48>>2]+(G*I+F*H+E*n);s=+g[f+52>>2]+(D*I+C*H+B*n);n=+g[f+56>>2]+(u*I+i*H+r*n);g[q+112>>2]=G*A+F*z+E*y;g[q+112+4>>2]=G*x+F*w+E*v;g[q+112+8>>2]=G*t+F*k+E*h;g[q+112+12>>2]=0.0;g[q+112+16>>2]=D*A+C*z+B*y;g[q+112+20>>2]=D*x+C*w+B*v;g[q+112+24>>2]=D*t+C*k+B*h;g[q+112+28>>2]=0.0;g[q+112+32>>2]=u*A+i*z+r*y;g[q+112+36>>2]=u*x+i*w+r*v;g[q+112+40>>2]=u*t+i*k+r*h;g[q+112+44>>2]=0.0;g[q+112+48>>2]=j;g[q+112+52>>2]=s;g[q+112+56>>2]=n;g[q+112+60>>2]=0.0;Vb[c[(c[d>>2]|0)+8>>2]&127](d,q+176|0,q+96|0,q+80|0);Vb[c[(c[e>>2]|0)+8>>2]&127](e,q+112|0,q+64|0,q+48|0);n=+g[(c[a+24>>2]|0)+32>>2];s=+g[q+96>>2]-n;g[q+96>>2]=s;j=+g[q+96+4>>2]-n;g[q+96+4>>2]=j;h=+g[q+96+8>>2]-n;g[q+96+8>>2]=h;r=n+ +g[q+80>>2];g[q+80>>2]=r;k=n+ +g[q+80+4>>2];g[q+80+4>>2]=k;i=n+ +g[q+80+8>>2];g[q+80+8>>2]=i;if(!(s>+g[q+48>>2])?!(r<+g[q+64>>2]):0)b=1;else b=0;if(!(!(h>+g[q+48+8>>2])?!(i<+g[q+64+8>>2]):0))b=0;if(j>+g[q+48+4>>2]){l=q;return}if(k<+g[q+64+4>>2]|b^1){l=q;return}f=c[a+8>>2]|0;b=c[f+8>>2]|0;c[q+24>>2]=f;c[q+24+4>>2]=d;c[q+24+8>>2]=b;c[q+24+12>>2]=q+176;c[q+24+16>>2]=-1;c[q+24+20>>2]=p;b=c[a+12>>2]|0;f=c[b+8>>2]|0;c[q>>2]=b;c[q+4>>2]=e;c[q+8>>2]=f;c[q+12>>2]=q+112;c[q+16>>2]=-1;c[q+20>>2]=o;f=c[a+28>>2]|0;c[6416]=(c[6416]|0)+1;b=(((o<<16|p)+~((o<<16|p)<<15)|0)>>>10^(o<<16|p)+~((o<<16|p)<<15))*9|0;b=(c[f+12>>2]|0)+-1&(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11));a:do if((b|0)<(c[f+28>>2]|0)?(m=c[(c[f+36>>2]|0)+(b<<2)>>2]|0,(m|0)!=-1):0){e=c[f+16>>2]|0;d=m;while(1){b=e+(d*12|0)|0;if((c[b>>2]|0)==(p|0)?(c[e+(d*12|0)+4>>2]|0)==(o|0):0)break a;d=c[(c[f+56>>2]|0)+(d<<2)>>2]|0;if((d|0)==-1){b=0;break}}}else b=0;while(0);do if(!(n>0.0))if(!b){b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,c[a+32>>2]|0,1)|0;J=c[a+28>>2]|0;c[(Bb[c[(c[J>>2]|0)+12>>2]&63](J,p,o)|0)+8>>2]=b;break}else{b=c[b+8>>2]|0;break}else{b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,0,2)|0}while(0);J=c[a+24>>2]|0;f=c[J+8>>2]|0;m=c[J+12>>2]|0;c[J+8>>2]=q+24;c[J+12>>2]=q;Sb[c[(c[J>>2]|0)+8>>2]&127](J,-1,p);J=c[a+24>>2]|0;Sb[c[(c[J>>2]|0)+12>>2]&127](J,-1,o);Zb[c[(c[b>>2]|0)+8>>2]&31](b,q+24|0,q,c[a+20>>2]|0,c[a+24>>2]|0);J=c[a+24>>2]|0;c[J+8>>2]=f;c[J+12>>2]=m;l=q;return}function yd(b,d,e){b=b|0;d=d|0;e=e|0;fi(b,d,e)|0;c[d+52>>2]=c[b+48>>2];c[d+56>>2]=c[b+52>>2];c[d+60>>2]=c[b+56>>2];c[d+64>>2]=c[b+60>>2];c[d+68>>2]=c[b+64>>2];c[d+72>>2]=c[b+68>>2];c[d+76>>2]=c[b+72>>2];c[d+80>>2]=c[b+76>>2];c[d+84>>2]=c[b+80>>2];c[d+88>>2]=c[b+84>>2];c[d+92>>2]=c[b+88>>2];c[d+96>>2]=c[b+92>>2];c[d+100>>2]=c[b+96>>2];c[d+104>>2]=c[b+100>>2];c[d+108>>2]=c[b+104>>2];c[d+112>>2]=c[b+108>>2];c[d+116>>2]=c[b+112>>2];c[d+120>>2]=c[b+116>>2];c[d+124>>2]=c[b+120>>2];c[d+128>>2]=c[b+124>>2];c[d+132>>2]=c[b+128>>2];c[d+136>>2]=c[b+132>>2];c[d+140>>2]=c[b+136>>2];c[d+144>>2]=c[b+140>>2];c[d+148>>2]=c[b+144>>2];c[d+152>>2]=c[b+148>>2];c[d+156>>2]=c[b+152>>2];c[d+160>>2]=c[b+156>>2];c[d+164>>2]=c[b+160>>2];c[d+168>>2]=c[b+164>>2];c[d+172>>2]=c[b+168>>2];c[d+176>>2]=c[b+172>>2];c[d+428>>2]=c[b+968>>2];c[d+412>>2]=c[b+972>>2];c[d+444>>2]=c[b+976>>2];c[d+460>>2]=c[b+980>>2];c[d+476>>2]=c[b+984>>2];c[d+492>>2]=c[b+988>>2];c[d+508>>2]=c[b+992>>2];c[d+524>>2]=c[b+1e3>>2];c[d+540>>2]=c[b+1004>>2];c[d+556>>2]=c[b+1012>>2];c[d+572>>2]=c[b+1020>>2];c[d+588>>2]=c[b+1028>>2];c[d+604>>2]=c[b+1036>>2];c[d+432>>2]=c[b+1056>>2];c[d+416>>2]=c[b+1060>>2];c[d+448>>2]=c[b+1064>>2];c[d+464>>2]=c[b+1068>>2];c[d+480>>2]=c[b+1072>>2];c[d+496>>2]=c[b+1076>>2];c[d+512>>2]=c[b+1080>>2];c[d+528>>2]=c[b+1088>>2];c[d+544>>2]=c[b+1092>>2];c[d+560>>2]=c[b+1100>>2];c[d+576>>2]=c[b+1108>>2];c[d+592>>2]=c[b+1116>>2];c[d+608>>2]=c[b+1124>>2];c[d+436>>2]=c[b+1144>>2];c[d+420>>2]=c[b+1148>>2];c[d+452>>2]=c[b+1152>>2];c[d+468>>2]=c[b+1156>>2];c[d+484>>2]=c[b+1160>>2];c[d+500>>2]=c[b+1164>>2];c[d+516>>2]=c[b+1168>>2];c[d+532>>2]=c[b+1176>>2];c[d+548>>2]=c[b+1180>>2];c[d+564>>2]=c[b+1188>>2];c[d+580>>2]=c[b+1196>>2];c[d+596>>2]=c[b+1204>>2];c[d+612>>2]=c[b+1212>>2];g[d+440>>2]=0.0;g[d+424>>2]=0.0;g[d+456>>2]=0.0;g[d+472>>2]=0.0;g[d+488>>2]=0.0;g[d+504>>2]=0.0;g[d+520>>2]=0.0;g[d+536>>2]=0.0;g[d+552>>2]=0.0;g[d+568>>2]=0.0;g[d+584>>2]=0.0;g[d+600>>2]=0.0;g[d+616>>2]=0.0;a[d+620>>0]=a[b+996>>0]|0;a[d+624>>0]=a[b+1008>>0]|0;a[d+628>>0]=a[b+1016>>0]|0;a[d+632>>0]=a[b+1024>>0]|0;a[d+636>>0]=a[b+1032>>0]|0;a[d+621>>0]=a[b+1084>>0]|0;a[d+625>>0]=a[b+1096>>0]|0;a[d+629>>0]=a[b+1104>>0]|0;a[d+633>>0]=a[b+1112>>0]|0;a[d+637>>0]=a[b+1120>>0]|0;a[d+622>>0]=a[b+1172>>0]|0;a[d+626>>0]=a[b+1184>>0]|0;a[d+630>>0]=a[b+1192>>0]|0;a[d+634>>0]=a[b+1200>>0]|0;a[d+638>>0]=a[b+1208>>0]|0;a[d+623>>0]=0;a[d+627>>0]=0;a[d+631>>0]=0;a[d+635>>0]=0;a[d+639>>0]=0;c[d+196>>2]=c[b+680>>2];c[d+200>>2]=c[b+684>>2];c[d+204>>2]=c[b+688>>2];c[d+208>>2]=c[b+692>>2];c[d+180>>2]=c[b+696>>2];c[d+184>>2]=c[b+700>>2];c[d+188>>2]=c[b+704>>2];c[d+192>>2]=c[b+708>>2];c[d+212>>2]=c[b+712>>2];c[d+216>>2]=c[b+716>>2];c[d+220>>2]=c[b+720>>2];c[d+224>>2]=c[b+724>>2];c[d+228>>2]=c[b+728>>2];c[d+232>>2]=c[b+732>>2];c[d+236>>2]=c[b+736>>2];c[d+240>>2]=c[b+740>>2];c[d+244>>2]=c[b+744>>2];c[d+248>>2]=c[b+748>>2];c[d+252>>2]=c[b+752>>2];c[d+256>>2]=c[b+756>>2];c[d+260>>2]=c[b+760>>2];c[d+264>>2]=c[b+764>>2];c[d+268>>2]=c[b+768>>2];c[d+272>>2]=c[b+772>>2];c[d+276>>2]=c[b+776>>2];c[d+280>>2]=c[b+780>>2];c[d+284>>2]=c[b+784>>2];c[d+288>>2]=c[b+788>>2];c[d+292>>2]=c[b+876>>2];c[d+296>>2]=c[b+880>>2];c[d+300>>2]=c[b+884>>2];c[d+304>>2]=c[b+888>>2];c[d+308>>2]=c[b+892>>2];c[d+312>>2]=c[b+896>>2];c[d+316>>2]=c[b+900>>2];c[d+320>>2]=c[b+904>>2];c[d+324>>2]=c[b+804>>2];c[d+328>>2]=c[b+808>>2];c[d+332>>2]=c[b+812>>2];c[d+336>>2]=c[b+816>>2];c[d+340>>2]=c[b+820>>2];c[d+344>>2]=c[b+824>>2];c[d+348>>2]=c[b+828>>2];c[d+352>>2]=c[b+832>>2];c[d+356>>2]=c[b+840>>2];c[d+360>>2]=c[b+844>>2];c[d+364>>2]=c[b+848>>2];c[d+368>>2]=c[b+852>>2];c[d+372>>2]=c[b+860>>2];c[d+376>>2]=c[b+864>>2];c[d+380>>2]=c[b+868>>2];c[d+384>>2]=c[b+872>>2];a[d+388>>0]=a[b+792>>0]|0;a[d+392>>0]=a[b+795>>0]|0;a[d+396>>0]=a[b+798>>0]|0;a[d+400>>0]=a[b+836>>0]|0;a[d+404>>0]=a[b+856>>0]|0;a[d+389>>0]=a[b+793>>0]|0;a[d+393>>0]=a[b+796>>0]|0;a[d+397>>0]=a[b+799>>0]|0;a[d+401>>0]=a[b+837>>0]|0;a[d+405>>0]=a[b+857>>0]|0;a[d+390>>0]=a[b+794>>0]|0;a[d+394>>0]=a[b+797>>0]|0;a[d+398>>0]=a[b+800>>0]|0;a[d+402>>0]=a[b+838>>0]|0;a[d+406>>0]=a[b+858>>0]|0;a[d+391>>0]=0;a[d+395>>0]=0;a[d+399>>0]=0;a[d+403>>0]=0;a[d+407>>0]=0;c[d+640>>2]=c[b+1232>>2];c[d+408>>2]=0;return 12302}function zd(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0;I=l;l=l+128|0;c[I+16>>2]=i;c[I+16+4>>2]=j;c[I+16+8>>2]=k;c[I>>2]=e;c[I+4>>2]=f;c[I+8>>2]=h;if(!(+g[d+52>>2]<+g[b+12>>2])){m=0;l=I;return m|0}w=+g[d+36>>2];y=+g[d+40>>2];x=+g[d+44>>2];k=c[d+48>>2]|0;z=1.0/+D(+(w*w+y*y+x*x));h=ui(I)|0;A=+g[d+4>>2]-+g[h+48>>2];B=+g[d+8>>2]-+g[h+52>>2];C=+g[d+12>>2]-+g[h+56>>2];h=ui(I+16|0)|0;E=+g[d+20>>2]-+g[h+48>>2];F=+g[d+24>>2]-+g[h+52>>2];G=+g[d+28>>2]-+g[h+56>>2];if(!f)if(!e){p=0.0;s=0.0;q=0.0;n=0.0;o=0.0;r=0.0}else{r=+g[e+336>>2];o=+g[e+340>>2];v=+g[e+332>>2];p=+g[e+316>>2];s=+g[e+320>>2];q=+g[e+324>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}else{r=+g[f+392>>2];o=+g[f+396>>2];v=+g[f+388>>2];p=+g[f+372>>2];s=+g[f+376>>2];q=+g[f+380>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}v=p+n;u=s+o;t=q+r;if(!j)if(!i){r=0.0;s=0.0;n=0.0;o=0.0;p=0.0;q=0.0}else{q=+g[i+336>>2];p=+g[i+340>>2];J=+g[i+332>>2];r=+g[i+316>>2];s=+g[i+320>>2];n=+g[i+324>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}else{q=+g[j+392>>2];p=+g[j+396>>2];J=+g[j+388>>2];r=+g[j+372>>2];s=+g[j+376>>2];n=+g[j+380>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}r=v-(r+o);u=u-(s+p);t=t-(n+q);v=x*z*t+(y*z*u+w*z*r);J=+g[d+52>>2]-+g[b+12>>2];c[m+4>>2]=c[I>>2];c[m+4+4>>2]=c[I+4>>2];c[m+4+8>>2]=c[I+8>>2];c[m+16>>2]=c[I+16>>2];c[m+16+4>>2]=c[I+16+4>>2];c[m+16+8>>2]=c[I+16+8>>2];d=ui(I)|0;s=A*+g[d+4>>2]+B*+g[d+20>>2]+C*+g[d+36>>2];q=A*+g[d+8>>2]+B*+g[d+24>>2]+C*+g[d+40>>2];g[m+28>>2]=A*+g[d>>2]+B*+g[d+16>>2]+C*+g[d+32>>2];g[m+32>>2]=s;g[m+36>>2]=q;g[m+40>>2]=0.0;d=ui(I+16|0)|0;q=E*+g[d+4>>2]+F*+g[d+20>>2]+G*+g[d+36>>2];s=E*+g[d+8>>2]+F*+g[d+24>>2]+G*+g[d+40>>2];g[m+44>>2]=E*+g[d>>2]+F*+g[d+16>>2]+G*+g[d+32>>2];g[m+48>>2]=q;g[m+52>>2]=s;g[m+56>>2]=0.0;g[m+164>>2]=A;g[m+168>>2]=B;g[m+172>>2]=C;g[m+176>>2]=0.0;g[m+180>>2]=E;g[m+184>>2]=F;g[m+188>>2]=G;g[m+192>>2]=0.0;g[m+60>>2]=1.0;g[m+64>>2]=1.0;c[m+156>>2]=0;c[m+160>>2]=0;g[m+68>>2]=1.0;g[m+72>>2]=w*z*J;g[m+76>>2]=y*z*J;g[m+80>>2]=x*z*J;g[m+84>>2]=0.0;g[m+196>>2]=w*z;g[m+200>>2]=y*z;g[m+204>>2]=x*z;c[m+208>>2]=k;a[m+152>>0]=0;J=+g[b+16>>2];g[m+212>>2]=(t-x*z*v)*(t-x*z*v)+((r-w*z*v)*(r-w*z*v)+(u-y*z*v)*(u-y*z*v))>2]|0;if(!k){k=c[I>>2]|0;if(!k)o=0.0;else{k=k+128|0;H=14}}else{k=k+404|0;H=14}if((H|0)==14)o=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+4>>2]|0;if(!k){e=c[I>>2]|0;e=(e|0)==0?22904:e+180|0}else e=k+324|0;k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;if(!k)n=0.0;else{k=k+128|0;H=25}}else{k=k+404|0;H=25}if((H|0)==25)n=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;k=(k|0)==0?22904:k+180|0}else k=k+324|0;Uh(I+80|0,o,e,+g[m+164>>2],+g[m+168>>2],+g[m+172>>2]);Uh(I+32|0,n,k,+g[m+180>>2],+g[m+184>>2],+g[m+188>>2]);C=+g[I+80>>2]+ +g[I+32>>2];F=+g[I+80+4>>2]+ +g[I+32+4>>2];y=+g[I+80+8>>2]+ +g[I+32+8>>2];G=+g[I+80+16>>2]+ +g[I+32+16>>2];E=+g[I+80+20>>2]+ +g[I+32+20>>2];z=+g[I+80+24>>2]+ +g[I+32+24>>2];A=+g[I+80+32>>2]+ +g[I+32+32>>2];B=+g[I+80+36>>2]+ +g[I+32+36>>2];x=+g[I+80+40>>2]+ +g[I+32+40>>2];J=1.0/(y*(G*B-E*A)+(C*(E*x-z*B)+F*(z*A-G*x)));g[m+104>>2]=(E*x-z*B)*J;g[m+108>>2]=(y*B-F*x)*J;g[m+112>>2]=(F*z-y*E)*J;g[m+116>>2]=0.0;g[m+120>>2]=(z*A-G*x)*J;g[m+124>>2]=(C*x-y*A)*J;g[m+128>>2]=(y*G-C*z)*J;g[m+132>>2]=0.0;g[m+136>>2]=(G*B-E*A)*J;g[m+140>>2]=(F*A-C*B)*J;g[m+144>>2]=(C*E-F*G)*J;g[m+148>>2]=0.0;m=1;l=I;return m|0}function Ad(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0;u=l;l=l+288|0;q=c[b+4>>2]|0;a[q+312>>0]=0;c[q>>2]=0;a[q+356>>0]=1;c[q+292>>2]=1566444395;c[q+296>>2]=1566444395;c[q+300>>2]=1566444395;g[q+304>>2]=0.0;c[q+336>>2]=0;c[q+336+4>>2]=0;c[q+336+8>>2]=0;c[q+336+12>>2]=0;a[q+336+16>>0]=0;a[q+332>>0]=a[q+332>>0]&-16;r=+g[e+48>>2]-+g[d+48>>2]-(+g[h+48>>2]-+g[f+48>>2]);s=+g[e+52>>2]-+g[d+52>>2]-(+g[h+52>>2]-+g[f+52>>2]);t=+g[e+56>>2]-+g[d+56>>2]-(+g[h+56>>2]-+g[f+56>>2]);c[u+216>>2]=9504;g[u+216+36>>2]=999999984306749440.0;a[u+216+40>>0]=0;q=c[b+8>>2]|0;p=c[b+12>>2]|0;o=c[b+4>>2]|0;c[u+136>>2]=9552;c[u+136+4>>2]=0;c[u+136+8>>2]=1065353216;c[u+136+12>>2]=0;g[u+136+16>>2]=0.0;c[u+136+20>>2]=0;c[u+136+24>>2]=o;c[u+136+28>>2]=q;c[u+136+32>>2]=p;c[u+136+36>>2]=c[q+4>>2];c[u+136+40>>2]=c[p+4>>2];g[u+136+44>>2]=+nb[c[(c[q>>2]|0)+48>>2]&15](q);g[u+136+48>>2]=+nb[c[(c[p>>2]|0)+48>>2]&15](p);a[u+136+52>>0]=0;c[u+136+60>>2]=-1;c[u+136+72>>2]=1;c[u+136+76>>2]=1;g[u+128>>2]=999999984306749440.0;c[u>>2]=c[d>>2];c[u+4>>2]=c[d+4>>2];c[u+8>>2]=c[d+8>>2];c[u+12>>2]=c[d+12>>2];c[u+16>>2]=c[d+16>>2];c[u+16+4>>2]=c[d+16+4>>2];c[u+16+8>>2]=c[d+16+8>>2];c[u+16+12>>2]=c[d+16+12>>2];c[u+32>>2]=c[d+32>>2];c[u+32+4>>2]=c[d+32+4>>2];c[u+32+8>>2]=c[d+32+8>>2];c[u+32+12>>2]=c[d+32+12>>2];c[u+48>>2]=c[d+48>>2];c[u+48+4>>2]=c[d+48+4>>2];c[u+48+8>>2]=c[d+48+8>>2];c[u+48+12>>2]=c[d+48+12>>2];c[u+64>>2]=c[f>>2];c[u+64+4>>2]=c[f+4>>2];c[u+64+8>>2]=c[f+8>>2];c[u+64+12>>2]=c[f+12>>2];c[u+80>>2]=c[f+16>>2];c[u+80+4>>2]=c[f+16+4>>2];c[u+80+8>>2]=c[f+16+8>>2];c[u+80+12>>2]=c[f+16+12>>2];c[u+96>>2]=c[f+32>>2];c[u+96+4>>2]=c[f+32+4>>2];c[u+96+8>>2]=c[f+32+8>>2];c[u+96+12>>2]=c[f+32+12>>2];c[u+112>>2]=c[f+48>>2];c[u+112+4>>2]=c[f+48+4>>2];c[u+112+8>>2]=c[f+48+8>>2];c[u+112+12>>2]=c[f+48+12>>2];Dc(u+136|0,u,u+216|0,0,0);p=(a[u+216+40>>0]|0)==0;q=u+216+20|0;c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];if(p){i=0;l=u;return i|0}n=+g[u+216+36>>2];k=+g[u+216+16>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;do if(n>1.0000000474974513e-03){p=0;k=0.0;while(1){if((p|0)>31){b=0;p=13;break}w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;v=k;k=k-n/(t*(c[j>>2]=b,+g[j>>2])+w);if(!(!(k<=v)&(!(k<0.0)&!(k>1.0)))){b=0;p=13;break}Jb[c[c[i>>2]>>2]&31](i,k);w=1.0-k;g[u+48>>2]=w*+g[d+48>>2]+k*+g[e+48>>2];g[u+52>>2]=w*+g[d+52>>2]+k*+g[e+52>>2];g[u+56>>2]=w*+g[d+56>>2]+k*+g[e+56>>2];g[u+112>>2]=w*+g[f+48>>2]+k*+g[h+48>>2];g[u+116>>2]=w*+g[f+52>>2]+k*+g[h+52>>2];g[u+120>>2]=w*+g[f+56>>2]+k*+g[h+56>>2];Dc(u+136|0,u,u+216|0,0,0);if(!(a[u+216+40>>0]|0)){b=0;p=13;break}n=+g[u+216+36>>2];if(n<0.0){p=8;break}c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;if(!(n>1.0000000474974513e-03)){p=10;break}else p=p+1|0}if((p|0)==8){g[i+164>>2]=k;e=c[u+216+8>>2]|0;f=c[u+216+12>>2]|0;h=c[u+216+16>>2]|0;c[i+132>>2]=c[u+216+4>>2];c[i+136>>2]=e;c[i+140>>2]=f;c[i+144>>2]=h;c[i+148>>2]=c[q>>2];c[i+148+4>>2]=c[q+4>>2];c[i+148+8>>2]=c[q+8>>2];c[i+148+12>>2]=c[q+12>>2];i=1;l=u;return i|0}else if((p|0)==10){n=k;k=+g[u+216+16>>2];break}else if((p|0)==13){l=u;return b|0}}else n=0.0;while(0);w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;if(t*(c[j>>2]=b,+g[j>>2])+w>=-+g[i+172>>2]){i=0;l=u;return i|0}g[i+164>>2]=n;c[i+132>>2]=o;c[i+136>>2]=m;c[i+140>>2]=b;g[i+144>>2]=k;c[i+148>>2]=c[u+264>>2];c[i+148+4>>2]=c[u+264+4>>2];c[i+148+8>>2]=c[u+264+8>>2];c[i+148+12>>2]=c[u+264+12>>2];i=1;l=u;return i|0}function Bd(a,d,f,h,i){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;P=l;l=l+16|0;c[d+16>>2]=c[f>>2];c[d+16+4>>2]=c[f+4>>2];c[d+16+8>>2]=c[f+8>>2];c[d+16+12>>2]=c[f+12>>2];c[d+32>>2]=c[h>>2];c[d+32+4>>2]=c[h+4>>2];c[d+32+8>>2]=c[h+8>>2];c[d+32+12>>2]=c[h+12>>2];H=c[a+60>>2]|0;I=c[d+12>>2]&65535;q=+g[a+8>>2];s=+g[a+12>>2];x=+g[a+16>>2];r=+g[a+40>>2];k=(+g[f>>2]-q)*r;u=+g[a+44>>2];m=(+g[f+4>>2]-s)*u;y=+g[a+48>>2];o=(+g[f+8>>2]-x)*y;if(!(k<=0.0)){p=b[a+6>>1]|0;p=(!(k>=+(p&65535))?~~k&65535:p)&b[a+4>>1]}else p=0;b[P+6>>1]=p;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]}else j=0;b[P+6+2>>1]=j;if(!(o<=0.0)){j=b[a+6>>1]|0;j=(!(o>=+(j&65535))?~~o&65535:j)&b[a+4>>1]}else j=0;b[P+6+4>>1]=j;o=(+g[h>>2]-q)*r;m=(+g[h+4>>2]-s)*u;k=(+g[h+8>>2]-x)*y;if(!(o<=0.0)){n=b[a+6>>1]|0;n=(!(o>=+(n&65535))?~~o&65535:n)&b[a+4>>1]|1}else n=1;b[P>>1]=n;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]|1}else j=1;b[P+2>>1]=j;if(!(k<=0.0)){j=b[a+6>>1]|0;j=(!(k>=+(j&65535))?~~k&65535:j)&b[a+4>>1]|1}else j=1;b[P+4>>1]=j;G=0;while(1){D=b[H+(I<<6)+48+(G<<1)>>1]|0;E=b[H+(I<<6)+54+(G<<1)>>1]|0;B=a+68+(G<<2)|0;A=c[B>>2]|0;C=(p&65535)-(e[A+((D&65535)<<2)>>1]|0)|0;F=(n&65535)-(e[A+((E&65535)<<2)>>1]|0)|0;b[A+((D&65535)<<2)>>1]=p;b[A+((E&65535)<<2)>>1]=n;if((C|0)<0)xh(a,G,D);a:do if((F|0)>0?(J=c[B>>2]|0,K=c[a+60>>2]|0,L=e[J+((E&65535)<<2)+2>>1]|0,M=b[J+((E&65535)<<2)+6>>1]|0,M<<16>>16):0){z=1<>1]|0;if((e[w>>1]|0)<(n&65535))break a;t=c[a+60>>2]|0;p=j&65535;if(!(n&1)){do if((((e[K+(L<<6)+54+(z<<1)>>1]|0)>=(e[t+(p<<6)+48+(z<<1)>>1]|0)?(e[t+(p<<6)+54+(z<<1)>>1]|0)>=(e[K+(L<<6)+48+(z<<1)>>1]|0):0)?(e[K+(L<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0)?(e[t+(p<<6)+54+((1<>1]|0)>=(e[K+(L<<6)+48+((1<>1]|0):0){n=c[a+92>>2]|0;j=t+((e[w+2>>1]|0)<<6)|0;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0;n=c[a+96>>2]|0;if(!n)break;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0}while(0);j=t+(p<<6)+48+(G<<1)|0}else j=t+(p<<6)+54+(G<<1)|0;b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[A>>1]=(b[A>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;t=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=t;b[w+2>>1]=t>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);b:do if((C|0)>0?(N=c[B>>2]|0,O=b[N+((D&65535)<<2)+6>>1]|0,O<<16>>16):0){z=(c[a+60>>2]|0)+((e[N+((D&65535)<<2)+2>>1]|0)<<6)+48+(G<<1)|0;A=1<>1]|0;if((e[w>>1]|0)<(n&65535))break b;t=c[a+60>>2]|0;p=j&65535;if(!(n&1))j=t+(p<<6)+48+(G<<1)|0;else{j=e[w+2>>1]|0;do if(((e[t+(j<<6)+54+(A<<1)>>1]|0)>=(e[t+(p<<6)+48+(A<<1)>>1]|0)?(e[t+(p<<6)+54+(A<<1)>>1]|0)>=(e[t+(j<<6)+48+(A<<1)>>1]|0):0)?(e[t+(j<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0){if((e[t+(p<<6)+54+((1<>1]|0)<(e[t+(j<<6)+48+((1<>1]|0))break;n=c[a+92>>2]|0;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0;n=c[a+96>>2]|0;if(!n)break;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0}while(0);j=t+(p<<6)+54+(G<<1)|0}b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[z>>1]=(b[z>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;D=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=D;b[w+2>>1]=D>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);if((F|0)<0)sh(a,G,E,i);j=G+1|0;if((j|0)==3)break;G=j;p=b[P+6+(j<<1)>>1]|0;n=b[P+(j<<1)>>1]|0}j=c[a+108>>2]|0;if(!j){l=P;return}Zb[c[(c[j>>2]|0)+16>>2]&31](j,c[d+60>>2]|0,f,h,i);l=P;return}function Cd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;b=c[7001]|0;d=c[a+-4>>2]|0;j=a+-8+(d&-8)|0;do if(!(d&1)){e=c[a+-8>>2]|0;if(!(d&3))return;h=a+-8+(0-e)|0;g=e+(d&-8)|0;if(h>>>0>>0)return;if((h|0)==(c[7002]|0)){a=c[j+4>>2]|0;if((a&3|0)!=3){i=h;b=g;break}c[6999]=g;c[j+4>>2]=a&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[6997]=c[6997]&~(1<<(e>>>3));i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){a=c[h+16+4>>2]|0;if(!a){a=c[h+16>>2]|0;if(!a){a=0;break}else e=h+16|0}else e=h+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;if((h|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=c[6998]&~(1<>2]|0)!=(h|0)&1)<<2)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=c[h+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[h+16+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=a+-8|0;b=d&-8;h=a+-8|0}while(0);if(h>>>0>=j>>>0)return;d=c[j+4>>2]|0;if(!(d&1))return;if(!(d&2)){a=c[7002]|0;if((j|0)==(c[7003]|0)){j=(c[7e3]|0)+b|0;c[7e3]=j;c[7003]=i;c[i+4>>2]=j|1;if((i|0)!=(a|0))return;c[7002]=0;c[6999]=0;return}if((j|0)==(a|0)){j=(c[6999]|0)+b|0;c[6999]=j;c[7002]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(d&-8)+b|0;do if(d>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[6997]=c[6997]&~(1<<(d>>>3));break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){a=c[j+16+4>>2]|0;if(!a){a=c[j+16>>2]|0;if(!a){b=0;break}else e=j+16|0}else e=j+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);if(g|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=c[6998]&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+16+4>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[7002]|0)){c[6999]=f;return}}else{c[j+4>>2]=d&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=28028+(d<<1<<2);return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{j=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(j+245760|0)>>>16&2)+(j<<((j+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[i+28>>2]=a;c[i+20>>2]=0;c[i+16>>2]=0;b=c[6998]|0;d=1<>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){a=73;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){a=72;break}else{b=b<<1;d=a}}if((a|0)==72){c[e>>2]=i;c[i+24>>2]=d;c[i+12>>2]=i;c[i+8>>2]=i;break}else if((a|0)==73){h=d+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=d;c[i+24>>2]=0;break}}else{c[6998]=b|d;c[e>>2]=i;c[i+24>>2]=e;c[i+12>>2]=i;c[i+8>>2]=i}while(0);j=(c[7005]|0)+-1|0;c[7005]=j;if(!j)a=28444;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[7005]=-1;return}function Dd(b){b=b|0;var d=0.0,e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;q=l;l=l+192|0;if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=q;return}i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ib[c[(c[i>>2]|0)+100>>2]&511](i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ob[c[(c[i>>2]|0)+8>>2]&127](q+80|0,i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if(((xb[c[(c[i>>2]|0)+56>>2]&127](i)|0)&8|0?(e=c[b+24>>2]|0,e|0):0)?(j=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0,(j|0)>0):0){f=0;do{h=c[b+24>>2]|0;h=zb[c[(c[h>>2]|0)+40>>2]&31](h,f)|0;i=c[h+780>>2]|0;if((i|0)>0){e=0;do{r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ub[c[(c[r>>2]|0)+40>>2]&0](r,h+4+(e*192|0)+32|0,h+4+(e*192|0)+64|0,+g[h+4+(e*192|0)+80>>2],c[h+4+(e*192|0)+156>>2]|0,q+80+96|0);e=e+1|0}while((e|0)!=(i|0))}f=f+1|0}while((f|0)!=(j|0))}r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if((xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&3|0?(c[b+8>>2]|0)>0:0){h=0;do{e=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if(!(c[e+204>>2]&32)){if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&1|0):0){c[q+64>>2]=1053609165;c[q+64+4>>2]=1053609165;c[q+64+8>>2]=1053609165;g[q+64+12>>2]=0.0;switch(c[e+220>>2]|0){case 1:{c[q+64>>2]=c[q+80>>2];c[q+64+4>>2]=c[q+80+4>>2];c[q+64+8>>2]=c[q+80+8>>2];c[q+64+12>>2]=c[q+80+12>>2];break}case 2:{c[q+64>>2]=c[q+80+16>>2];c[q+64+4>>2]=c[q+80+16+4>>2];c[q+64+8>>2]=c[q+80+16+8>>2];c[q+64+12>>2]=c[q+80+16+12>>2];break}case 3:{c[q+64>>2]=c[q+80+32>>2];c[q+64+4>>2]=c[q+80+32+4>>2];c[q+64+8>>2]=c[q+80+32+8>>2];c[q+64+12>>2]=c[q+80+32+12>>2];break}case 4:{c[q+64>>2]=c[q+80+48>>2];c[q+64+4>>2]=c[q+80+48+4>>2];c[q+64+8>>2]=c[q+80+48+8>>2];c[q+64+12>>2]=c[q+80+48+12>>2];break}case 5:{c[q+64>>2]=c[q+80+64>>2];c[q+64+4>>2]=c[q+80+64+4>>2];c[q+64+8>>2]=c[q+80+64+8>>2];c[q+64+12>>2]=c[q+80+64+12>>2];break}default:{c[q+64>>2]=1050253722;c[q+64+4>>2]=1050253722;c[q+64+8>>2]=1050253722;g[q+64+12>>2]=0.0}}if(c[e+204>>2]&256|0){c[q+64>>2]=c[e+308>>2];c[q+64+4>>2]=c[e+308+4>>2];c[q+64+8>>2]=c[e+308+8>>2];c[q+64+12>>2]=c[e+308+12>>2]}Vb[c[(c[b>>2]|0)+28>>2]&127](b,e+4|0,c[e+192>>2]|0,q+64|0)}f=c[b+72>>2]|0;if(f|0?(xb[c[(c[f>>2]|0)+56>>2]&127](f)|0)&2|0:0){c[q+32>>2]=c[q+80+80>>2];c[q+32+4>>2]=c[q+80+80+4>>2];c[q+32+8>>2]=c[q+80+80+8>>2];c[q+32+12>>2]=c[q+80+80+12>>2];r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+4|0,q+64|0,q+48|0);g[q+64>>2]=+g[q+64>>2]+-.019999999552965164;g[q+64+4>>2]=+g[q+64+4>>2]+-.019999999552965164;g[q+64+8>>2]=+g[q+64+8>>2]+-.019999999552965164;g[q+48>>2]=+g[q+48>>2]+.019999999552965164;g[q+48+4>>2]=+g[q+48+4>>2]+.019999999552965164;g[q+48+8>>2]=+g[q+48+8>>2]+.019999999552965164;do if((a[b+44>>0]|0?(c[e+252>>2]|0)==2:0)?(c[e+204>>2]&3|0)==0:0){r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+68|0,q+16|0,q);d=+g[q+16>>2]+-.019999999552965164;g[q+16>>2]=d;k=+g[q+16+4>>2]+-.019999999552965164;g[q+16+4>>2]=k;m=+g[q+16+8>>2]+-.019999999552965164;g[q+16+8>>2]=m;n=+g[q>>2]+.019999999552965164;g[q>>2]=n;o=+g[q+4>>2]+.019999999552965164;g[q+4>>2]=o;p=+g[q+8>>2]+.019999999552965164;g[q+8>>2]=p;if(d<+g[q+64>>2])g[q+64>>2]=d;if(k<+g[q+64+4>>2])g[q+64+4>>2]=k;if(m<+g[q+64+8>>2])g[q+64+8>>2]=m;d=+g[q+16+12>>2];if(d<+g[q+64+12>>2])g[q+64+12>>2]=d;if(+g[q+48>>2]>2]=n;if(+g[q+48+4>>2]>2]=o;if(+g[q+48+8>>2]>2]=p;d=+g[q+12>>2];if(!(+g[q+48+12>>2]>2]=d}while(0);r=c[b+72>>2]|0;Vb[c[(c[r>>2]|0)+60>>2]&127](r,q+64|0,q+48|0,q+32|0)}}h=h+1|0}while((h|0)<(c[b+8>>2]|0))}l=q;return}function Ed(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+32|0;g=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;c[e+20>>2]=g;c[e>>2]=0;if(!g){s=e+24|0;c[s>>2]=0;s=d+4|0;f=e+4|0;s=c[s>>2]|0;c[f>>2]=s;f=d+8|0;f=c[f>>2]|0;s=e+8|0;c[s>>2]=f;s=d+12|0;s=c[s>>2]|0;f=e+12|0;c[f>>2]=s;d=d+16|0;d=c[d>>2]|0;f=e+16|0;c[f>>2]=d;l=t;return 19256}s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,g)|0;g=c[s+8>>2]|0;c[e>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;r=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;a:do if((r|0)>0){q=0;while(1){cc[c[(c[d>>2]|0)+16>>2]&3](d,t+28|0,t+4|0,t+16|0,t+8|0,t+24|0,t+20|0,t,t+12|0,q);i=c[t>>2]|0;c[g+24>>2]=i;c[g+28>>2]=c[t+4>>2];j=g+12|0;m=g+16|0;p=g+4|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;switch(c[t+12>>2]|0){case 2:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i*3|0)|0;k=c[j+8>>2]|0;c[g+8>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){m=c[t+24>>2]|0;i=0;do{n=m+(P(c[t+20>>2]|0,i)|0)|0;o=i*3|0;c[k+(o<<2)>>2]=c[n>>2];c[k+(o+1<<2)>>2]=c[n+4>>2];c[k+(o+2<<2)>>2]=c[n+8>>2];i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19137,1497453121,c[j+8>>2]|0)}break}case 3:{if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,8,i)|0;o=c[n+8>>2]|0;c[j>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t>>2]|0;if((j|0)>0){k=c[t+24>>2]|0;m=c[t+20>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;b[o+(i<<3)>>1]=b[u>>1]|0;b[o+(i<<3)+2>>1]=b[u+2>>1]|0;b[o+(i<<3)+4>>1]=b[u+4>>1]|0;a[o+(i<<3)+6>>0]=0;a[o+(i<<3)+7>>0]=0;i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19152,1497453121,c[n+8>>2]|0)}break}case 5:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;k=c[j+8>>2]|0;c[m>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){i=0;do{u=(c[t+24>>2]|0)+(P(c[t+20>>2]|0,i)|0)|0;a[k+(i<<2)>>0]=a[u>>0]|0;a[k+(i<<2)+1>>0]=a[u+1>>0]|0;a[k+(i<<2)+2>>0]=a[u+2>>0]|0;a[k+(i<<2)+3>>0]=0;i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19179,1497453121,c[j+8>>2]|0)}break}default:{}}switch(c[t+16>>2]|0){case 0:{i=c[t+4>>2]|0;if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,i)|0;k=c[j+8>>2]|0;c[g>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;m=c[t+4>>2]|0;if((m|0)>0){n=c[t+28>>2]|0;o=c[t+8>>2]|0;i=0;do{u=n+(P(o,i)|0)|0;c[k+(i<<4)>>2]=c[u>>2];c[k+(i<<4)+4>>2]=c[u+4>>2];c[k+(i<<4)+8>>2]=c[u+8>>2];i=i+1|0}while((i|0)!=(m|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19202,1497453121,c[j+8>>2]|0)}break}case 1:{i=c[t+4>>2]|0;if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,i)|0;o=c[n+8>>2]|0;c[p>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t+4>>2]|0;if((j|0)>0){k=c[t+28>>2]|0;m=c[t+8>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;h[o+(i<<5)>>3]=+h[u>>3];h[o+(i<<5)+8>>3]=+h[u+8>>3];h[o+(i<<5)+16>>3]=+h[u+16>>3];i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19221,1497453121,c[n+8>>2]|0)}break}default:{}}Ob[c[(c[d>>2]|0)+24>>2]&127](d,q);q=q+1|0;if((q|0)==(r|0)){g=f;break a}else g=g+32|0}}else g=f;while(0);Zb[c[(c[g>>2]|0)+20>>2]&31](f,s,19241,1497453121,c[s+8>>2]|0);u=e+24|0;c[u>>2]=0;u=d+4|0;f=e+4|0;u=c[u>>2]|0;c[f>>2]=u;f=d+8|0;f=c[f>>2]|0;u=e+8|0;c[u>>2]=f;u=d+12|0;u=c[u>>2]|0;f=e+12|0;c[f>>2]=u;f=d+16|0;f=c[f>>2]|0;u=e+16|0;c[u>>2]=f;l=t;return 19256}function Fd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;j=c[d+8>>2]|0;if(!j){h=0;return h|0}i=0;D=j;do{if((c[D+20>>2]|0)>(c[a+100>>2]|0)){B=c[D+12>>2]|0;w=c[B+88>>2]|0;x=w-(c[d+88>>2]|0)|0;y=c[B+92>>2]|0;z=y-(c[d+92>>2]|0)|0;B=c[B+96>>2]|0;C=B-(c[d+96>>2]|0)|0;k=ct(c[g>>2]|0,c[g+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;o=A;j=ct(c[g+8>>2]|0,c[g+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;o=Ow(j|0,A|0,k|0,o|0)|0;k=A;j=ct(c[g+16>>2]|0,c[g+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;j=Ow(o|0,k|0,j|0,A|0)|0;k=A;o=ct(c[f>>2]|0,c[f+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;v=A;n=ct(c[f+8>>2]|0,c[f+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;v=Ow(n|0,A|0,o|0,v|0)|0;o=A;n=ct(c[f+16>>2]|0,c[f+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;n=Ow(v|0,o|0,n|0,A|0)|0;o=A;if((k|0)>0|(k|0)==0&j>>>0>0){l=1;v=j}else{v=sw(0,0,j|0,k|0)|0;l=((j|0)!=0|(k|0)!=0)<<31>>31;v=(j|0)!=0|(k|0)!=0?v:0;k=(j|0)!=0|(k|0)!=0?A:0}if(!((o|0)>0|(o|0)==0&n>>>0>0)){j=sw(0,0,n|0,o|0)|0;j=(n|0)!=0|(o|0)!=0?j:0;m=(n|0)!=0|(o|0)!=0?A:0;if((j|0)!=0|(m|0)!=0|(l|0)!=0){l=(n|0)!=0|(o|0)!=0?0-l|0:l;n=j;p=8}}else{m=o;p=8}a:do if((p|0)==8){p=0;if(!i){c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break}j=c[h+16>>2]|0;if((l|0)==(j|0)){if(l|0){p=c[h+8>>2]|0;s=c[h+8+4>>2]|0;o=ct(p|0,0,v|0,0)|0;j=A;t=ct(s|0,0,v|0,0)|0;r=A;p=ct(p|0,0,k|0,0)|0;q=A;s=ct(s|0,0,k|0,0)|0;G=A;p=Ow(t|0,0,p|0,0)|0;t=A;G=Ow(r|0,0,s|0,G|0)|0;q=Ow(G|0,A|0,q|0,0)|0;t=Ow(q|0,A|0,t|0,0)|0;q=A;j=Ow(0,p|0,o|0,j|0)|0;o=A;p=Ow(t|0,q|0,(o>>>0

>>0|(o|0)==(p|0)&j>>>0<0)&1|0,0)|0;q=A;t=c[h>>2]|0;G=c[h+4>>2]|0;s=ct(t|0,0,n|0,0)|0;r=A;E=ct(G|0,0,n|0,0)|0;H=A;t=ct(t|0,0,m|0,0)|0;u=A;G=ct(G|0,0,m|0,0)|0;F=A;t=Ow(E|0,0,t|0,0)|0;E=A;F=Ow(H|0,0,G|0,F|0)|0;u=Ow(F|0,A|0,u|0,0)|0;E=Ow(u|0,A|0,E|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(E|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(!(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0))if(q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0)j=1;else j=o>>>0>>0|(o|0)==(s|0)&j>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&j>>>0>r>>>0)&1;else j=-1;j=P(j,l)|0;p=17}}else{j=l-j|0;p=17}do if((p|0)==17){p=0;if((j|0)>=0)if(!j)break;else break a;else{c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break a}}while(0);j=(c[i+4>>2]|0)==(D|0);if((c[i>>2]|0)==(D|0))if(j){H=c[e+8>>2]|0;E=P(H,z)|0;u=c[e+4>>2]|0;E=E-(P(u,C)|0)|0;G=c[e>>2]|0;H=(P(G,C)|0)-(P(H,x)|0)|0;G=(P(u,x)|0)-(P(G,z)|0)|0;u=c[i+12>>2]|0;j=c[(c[D+8>>2]|0)+12>>2]|0;z=c[j+88>>2]|0;x=(c[u+88>>2]|0)-z|0;v=c[j+92>>2]|0;C=(c[u+92>>2]|0)-v|0;j=c[j+96>>2]|0;u=(c[u+96>>2]|0)-j|0;F=(P(B-j|0,C)|0)-(P(y-v|0,u)|0)|0;j=(P(w-z|0,u)|0)-(P(B-j|0,x)|0)|0;C=(P(y-v|0,x)|0)-(P(w-z|0,C)|0)|0;E=ct(F|0,((F|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;F=A;H=ct(j|0,((j|0)<0)<<31>>31|0,H|0,((H|0)<0)<<31>>31|0)|0;j=A;G=ct(C|0,((C|0)<0)<<31>>31|0,G|0,((G|0)<0)<<31>>31|0)|0;G=Ow(E|0,F|0,G|0,A|0)|0;j=Ow(G|0,A|0,H|0,j|0)|0;H=A;j=(H|0)>0|(H|0)==0&j>>>0>0?2:1}else j=2;else j=j&1;i=(j|0)==2^b?i:D}while(0);j=c[d+8>>2]|0}D=c[D>>2]|0}while((D|0)!=(j|0));return i|0}function Gd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;v=l;l=l+544|0;j=h;k=j+36|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[v+384>>2]=a;c[v+384+4>>2]=d;o=+g[e>>2];F=+g[b>>2];n=+g[e+16>>2];i=+g[b+16>>2];m=+g[e+32>>2];G=+g[b+32>>2];w=+g[b+4>>2];H=+g[b+20>>2];x=+g[b+36>>2];t=+g[b+8>>2];r=+g[b+24>>2];p=+g[b+40>>2];E=+g[e+4>>2];C=+g[e+20>>2];B=+g[e+36>>2];A=+g[e+8>>2];z=+g[e+24>>2];y=+g[e+40>>2];g[v+384+8>>2]=o*F+n*i+m*G;g[v+384+12>>2]=o*w+n*H+m*x;g[v+384+16>>2]=o*t+n*r+m*p;g[v+384+20>>2]=0.0;g[v+384+24>>2]=F*E+i*C+G*B;g[v+384+28>>2]=w*E+H*C+x*B;g[v+384+32>>2]=t*E+r*C+p*B;g[v+384+36>>2]=0.0;g[v+384+40>>2]=F*A+i*z+G*y;g[v+384+44>>2]=w*A+H*z+x*y;g[v+384+48>>2]=t*A+r*z+p*y;g[v+384+52>>2]=0.0;p=+g[e+48>>2]-+g[b+48>>2];r=+g[e+52>>2]-+g[b+52>>2];t=+g[e+56>>2]-+g[b+56>>2];x=+g[b>>2];H=+g[e>>2];w=+g[b+16>>2];G=+g[e+16>>2];i=+g[b+32>>2];F=+g[e+32>>2];m=+g[b+4>>2];n=+g[b+20>>2];o=+g[b+36>>2];q=+g[b+8>>2];s=+g[b+24>>2];u=+g[b+40>>2];g[v+384+56>>2]=x*H+w*G+i*F;g[v+384+60>>2]=x*E+w*C+i*B;g[v+384+64>>2]=x*A+w*z+i*y;g[v+384+68>>2]=0.0;g[v+384+72>>2]=H*m+G*n+F*o;g[v+384+76>>2]=E*m+C*n+B*o;g[v+384+80>>2]=A*m+z*n+y*o;g[v+384+84>>2]=0.0;g[v+384+88>>2]=H*q+G*s+F*u;g[v+384+92>>2]=E*q+C*s+B*u;g[v+384+96>>2]=A*q+z*s+y*u;g[v+384+100>>2]=0.0;g[v+384+104>>2]=p*x+r*w+t*i;g[v+384+108>>2]=p*m+r*n+t*o;g[v+384+112>>2]=p*q+r*s+t*u;g[v+384+116>>2]=0.0;c[v+384+120>>2]=80;c[v+384+124>>2]=0;c[v+364>>2]=0;c[v+128>>2]=0;c[v+128+4>>2]=0;c[v+128+8>>2]=0;c[v+128+12>>2]=0;c[v+376>>2]=2;c[v+368>>2]=0;g[v+144>>2]=0.0;a=Jc(v,v+384|0,f)|0;if(a|0){c[h>>2]=(a|0)==1?1:2;h=0;l=v;return h|0}a=c[v+372>>2]|0;if(!(c[a+32>>2]|0)){q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;i=0.0}else{f=0;o=0.0;p=0.0;q=0.0;i=0.0;m=0.0;n=0.0;do{u=+g[a+16+(f<<2)>>2];d=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;e=(c[v+384>>2]|0)+(k>>1)|0;if(k&1)d=c[(c[e>>2]|0)+d>>2]|0;Sb[d&127](v+528|0,e,c[a+(f<<2)>>2]|0);o=o+u*+g[v+528>>2];p=p+u*+g[v+528+4>>2];q=q+u*+g[v+528+8>>2];a=c[(c[v+372>>2]|0)+(f<<2)>>2]|0;r=-+g[a>>2];s=-+g[a+4>>2];t=-+g[a+8>>2];a=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;d=(c[v+384+4>>2]|0)+(k>>1)|0;if(k&1)a=c[(c[d>>2]|0)+a>>2]|0;G=+g[v+384+24>>2]*r+ +g[v+384+28>>2]*s+ +g[v+384+32>>2]*t;F=+g[v+384+40>>2]*r+ +g[v+384+44>>2]*s+ +g[v+384+48>>2]*t;g[v+512>>2]=+g[v+384+8>>2]*r+ +g[v+384+12>>2]*s+ +g[v+384+16>>2]*t;g[v+512+4>>2]=G;g[v+512+8>>2]=F;g[v+512+12>>2]=0.0;Sb[a&127](v+528|0,d,v+512|0);F=+g[v+528>>2];G=+g[v+528+4>>2];H=+g[v+528+8>>2];i=i+u*(F*+g[v+384+56>>2]+G*+g[v+384+60>>2]+H*+g[v+384+64>>2]+ +g[v+384+104>>2]);m=m+u*(F*+g[v+384+72>>2]+G*+g[v+384+76>>2]+H*+g[v+384+80>>2]+ +g[v+384+108>>2]);n=n+u*(F*+g[v+384+88>>2]+G*+g[v+384+92>>2]+H*+g[v+384+96>>2]+ +g[v+384+112>>2]);f=f+1|0;a=c[v+372>>2]|0}while(f>>>0<(c[a+32>>2]|0)>>>0)}E=o*+g[b+16>>2]+p*+g[b+20>>2]+q*+g[b+24>>2]+ +g[b+52>>2];F=o*+g[b+32>>2]+p*+g[b+36>>2]+q*+g[b+40>>2]+ +g[b+56>>2];g[h+4>>2]=o*+g[b>>2]+p*+g[b+4>>2]+q*+g[b+8>>2]+ +g[b+48>>2];g[h+8>>2]=E;g[h+12>>2]=F;g[h+16>>2]=0.0;F=i*+g[b+16>>2]+m*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];E=i*+g[b+32>>2]+m*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[h+20>>2]=i*+g[b>>2]+m*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[h+24>>2]=F;g[h+28>>2]=E;g[h+32>>2]=0.0;E=o-i;F=p-m;H=q-n;g[h+48>>2]=0.0;G=+D(+(E*E+F*F+H*H));g[h+52>>2]=G;G=G>9.999999747378752e-05?1.0/G:1.0;g[h+36>>2]=G*E;g[h+40>>2]=G*F;g[h+44>>2]=G*H;h=1;l=v;return h|0}function Hd(b,d,e,f,h,i,j,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;B=P(c[l+24>>2]|0,m)|0;y=(a[d+44>>0]|0)!=0;A=c[d+56>>2]|0;if(!(y|(A|0)!=0)){d=0;return d|0}C=c[(o|0?l+12|0:l+8|0)>>2]|0;m=c[(o|0?l+20|0:l+16|0)>>2]|0;c[C+(B<<2)>>2]=c[n>>2];c[C+(B+1<<2)>>2]=c[n+4>>2];c[C+(B+2<<2)>>2]=c[n+8>>2];g[m+(B<<2)>>2]=-+g[n>>2];g[m+(B+1<<2)>>2]=-+g[n+4>>2];g[m+(B+2<<2)>>2]=-+g[n+8>>2];if(!o){q=+g[b+1176>>2];if(!(a[b+1301>>0]|0)){q=q-+g[e+48>>2];r=+g[b+1180>>2]-+g[e+52>>2];w=+g[b+1184>>2]-+g[e+56>>2];u=+g[n+8>>2];v=+g[n+4>>2];x=+g[n>>2];m=c[l+12>>2]|0;g[m+(B<<2)>>2]=r*u-w*v;g[m+(B+1<<2)>>2]=w*x-q*u;g[m+(B+2<<2)>>2]=q*v-r*x;x=+g[b+1176>>2]-+g[f+48>>2];r=+g[b+1180>>2]-+g[f+52>>2];v=+g[b+1184>>2]-+g[f+56>>2];q=+g[n+8>>2];u=+g[n+4>>2];w=+g[n>>2];m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-(r*q-v*u);r=x*u-r*w;e=m;q=-(v*w-x*q)}else{I=q-+g[f+48>>2];H=+g[b+1180>>2]-+g[f+52>>2];F=+g[b+1184>>2]-+g[f+56>>2];r=+g[n>>2];G=+g[n+4>>2];E=+g[n+8>>2];K=+g[b+1112>>2]-+g[e+48>>2];q=+g[b+1116>>2]-+g[e+52>>2];s=+g[b+1120>>2]-+g[e+56>>2];u=+g[d+52>>2]-+g[d+48>>2];J=r*(r*K+G*q+E*s)+r*u-r*(I*r+H*G+F*E);D=G*(r*K+G*q+E*s)+G*u-G*(I*r+H*G+F*E);u=E*(r*K+G*q+E*s)+E*u-E*(I*r+H*G+F*E);w=+g[b+1272>>2];x=+g[b+1276>>2];t=E*(q-G*(r*K+G*q+E*s)+w*D)-G*(s-E*(r*K+G*q+E*s)+w*u);v=r*(s-E*(r*K+G*q+E*s)+w*u)-E*(K-r*(r*K+G*q+E*s)+w*J);s=G*(K-r*(r*K+G*q+E*s)+w*J)-r*(q-G*(r*K+G*q+E*s)+w*D);q=(H-G*(I*r+H*G+F*E)-x*D)*E-(F-E*(I*r+H*G+F*E)-x*u)*G;u=(F-E*(I*r+H*G+F*E)-x*u)*r-(I-r*(I*r+H*G+F*E)-x*J)*E;r=(I-r*(I*r+H*G+F*E)-x*J)*G-(H-G*(I*r+H*G+F*E)-x*D)*r;if(!((p|0)!=0|(a[b+1280>>0]|0)==0)){t=w*t;v=w*v;s=w*s;q=x*q;u=x*u;r=x*r}m=(c[l+12>>2]|0)+(B<<2)|0;g[m>>2]=t;g[m+4>>2]=v;g[m+8>>2]=s;m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-q;e=m;q=-u}g[m+(B+1<<2)>>2]=q;g[e+(B+2<<2)>>2]=-r}if(A|0?+g[d>>2]==+g[d+4>>2]:0){m=c[l+28>>2]|0;g[m+(B<<2)>>2]=0.0;q=0.0}else z=12;do if((z|0)==12){e=c[l+28>>2]|0;g[e+(B<<2)>>2]=0.0;if(!y){if(A|0){m=e;q=0.0;break}else m=1;return m|0}c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+28>>2];if(A|0){m=e;q=+g[e+(B<<2)>>2];break}v=+g[d+8>>2];q=o|0?v:-v;r=+g[d+52>>2];s=+g[d>>2];t=+g[d+4>>2];u=+g[l>>2]*+g[d+32>>2];do if(!(s>t))if(!(s==t)){if(q/u<0.0)if(r>=s?s-q/u>r:0){q=(s-r)/(q/u);break}else{q=r0.0)if(r<=t?t-q/ut?0.0:1.0;break}else q=0.0}else q=0.0;else q=1.0;while(0);g[e+(B<<2)>>2]=q*v+ +g[e+(B<<2)>>2];g[(c[l+36>>2]|0)+(B<<2)>>2]=-+g[d+12>>2];c[(c[l+40>>2]|0)+(B<<2)>>2]=c[d+12>>2];C=1;return C|0}while(0);K=+g[l>>2]*+g[d+32>>2];f=m+(B<<2)|0;g[f>>2]=q+ +g[d+48>>2]*(o|0?-K:K);c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+36>>2];e=c[l+36>>2]|0;m=c[l+40>>2]|0;if(+g[d>>2]==+g[d+4>>2]){g[e+(B<<2)>>2]=-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=3402823466385288598117041.0e14;C=1;return C|0}g[e+(B<<2)>>2]=(A|0)==1?0.0:-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=(A|0)==1?3402823466385288598117041.0e14:0.0;r=+g[d+40>>2];if(!(r>0.0)){C=1;return C|0}d=o|0?j:h;C=o|0?k:i;J=+g[n>>2];K=+g[n+4>>2];q=+g[n+8>>2];q=+g[d>>2]*J+ +g[d+4>>2]*K+ +g[d+8>>2]*q-(J*+g[C>>2]+K*+g[C+4>>2]+q*+g[C+8>>2]);if((A|0)==1){if(!(q<0.0)){C=1;return C|0}if(!(+g[f>>2]<-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}else{if(!(q>0.0)){C=1;return C|0}if(!(+g[f>>2]>-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}return 0}function Id(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,k=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;n=l;l=l+16|0;c[b+252>>2]=2;c[b+372>>2]=0;c[b+372+4>>2]=0;c[b+372+8>>2]=0;c[b+372+12>>2]=0;c[b+372+16>>2]=0;c[b+372+20>>2]=0;c[b+372+24>>2]=0;c[b+372+28>>2]=0;c[b+604>>2]=1065353216;c[b+608>>2]=1065353216;c[b+612>>2]=1065353216;g[b+616>>2]=0.0;c[b+408>>2]=1065353216;c[b+412>>2]=1065353216;c[b+416>>2]=1065353216;e=b+420|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+472>>2]=0;c[b+472+4>>2]=0;c[b+472+8>>2]=0;c[b+472+12>>2]=0;c[b+472+16>>2]=0;c[b+472+20>>2]=0;c[b+472+24>>2]=0;c[b+472+28>>2]=0;f=+g[d+92>>2];m=+g[d+96>>2];g[n+12>>2]=f;g[n+8>>2]=m;g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+504>>2]=c[(f<0.0?n+4|0:f>1.0?n:n+12|0)>>2];g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+508>>2]=c[(m<0.0?n+4|0:m>1.0?n:n+8|0)>>2];c[b+532>>2]=c[d+116>>2];c[b+536>>2]=c[d+120>>2];e=c[d+4>>2]|0;c[b+540>>2]=e;c[b+668>>2]=0;c[b+672>>2]=0;a[b+512>>0]=a[d+124>>0]|0;c[b+516>>2]=c[d+128>>2];c[b+520>>2]=c[d+132>>2];c[b+524>>2]=c[d+136>>2];c[b+528>>2]=c[d+140>>2];if(!e){c[b+4>>2]=c[d+8>>2];c[b+4+4>>2]=c[d+8+4>>2];c[b+4+8>>2]=c[d+8+8>>2];c[b+4+12>>2]=c[d+8+12>>2];c[b+20>>2]=c[d+24>>2];c[b+20+4>>2]=c[d+24+4>>2];c[b+20+8>>2]=c[d+24+8>>2];c[b+20+12>>2]=c[d+24+12>>2];c[b+36>>2]=c[d+40>>2];c[b+36+4>>2]=c[d+40+4>>2];c[b+36+8>>2]=c[d+40+8>>2];c[b+36+12>>2]=c[d+40+12>>2];c[b+52>>2]=c[d+56>>2];c[b+52+4>>2]=c[d+56+4>>2];c[b+52+8>>2]=c[d+56+8>>2];c[b+52+12>>2]=c[d+56+12>>2];e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}else{Ob[c[(c[e>>2]|0)+8>>2]&127](e,b+4|0);e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}c[b+68>>2]=c[k>>2];c[b+68+4>>2]=c[k+4>>2];c[b+68+8>>2]=c[k+8>>2];c[b+68+12>>2]=c[k+12>>2];c[b+84>>2]=c[e>>2];c[b+84+4>>2]=c[e+4>>2];c[b+84+8>>2]=c[e+8>>2];c[b+84+12>>2]=c[e+12>>2];c[b+100>>2]=c[h>>2];c[b+100+4>>2]=c[h+4>>2];c[b+100+8>>2]=c[h+8>>2];c[b+100+12>>2]=c[h+12>>2];c[b+116>>2]=c[i>>2];c[b+116+4>>2]=c[i+4>>2];c[b+116+8>>2]=c[i+8>>2];c[b+116+12>>2]=c[i+12>>2];c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+228>>2]=c[d+100>>2];c[b+236>>2]=c[d+104>>2];c[b+240>>2]=c[d+108>>2];c[b+232>>2]=c[d+112>>2];Ob[c[(c[b>>2]|0)+8>>2]&127](b,c[d+72>>2]|0);e=c[5786]|0;c[5786]=e+1;c[b+568>>2]=e;f=+g[d>>2];e=c[b+204>>2]|0;if(f==0.0){c[b+204>>2]=e|1;m=0.0}else{c[b+204>>2]=e&-2;m=1.0/f}g[b+404>>2]=m;p=f*+g[b+444>>2];o=f*+g[b+448>>2];g[b+424>>2]=f*+g[b+440>>2];g[b+428>>2]=p;g[b+432>>2]=o;g[b+436>>2]=0.0;f=+g[d+76>>2];h=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+80>>2];e=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+84>>2];d=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;c[b+456>>2]=h;c[b+460>>2]=e;c[b+464>>2]=d;g[b+468>>2]=0.0;r=m*+g[b+412>>2];x=m*+g[b+416>>2];g[b+620>>2]=m*+g[b+408>>2];g[b+624>>2]=r;g[b+628>>2]=x;g[b+632>>2]=0.0;x=+g[b+4>>2];r=(c[j>>2]=h,+g[j>>2]);w=+g[b+8>>2];f=(c[j>>2]=e,+g[j>>2]);v=+g[b+12>>2];o=(c[j>>2]=d,+g[j>>2]);u=+g[b+20>>2];t=+g[b+24>>2];s=+g[b+28>>2];q=+g[b+36>>2];p=+g[b+40>>2];m=+g[b+44>>2];g[b+324>>2]=x*x*r+w*w*f+v*v*o;g[b+328>>2]=x*r*u+w*f*t+v*o*s;g[b+332>>2]=x*r*q+w*f*p+v*o*m;g[b+336>>2]=0.0;g[b+340>>2]=x*r*u+w*f*t+v*o*s;g[b+344>>2]=u*r*u+t*f*t+s*o*s;g[b+348>>2]=r*u*q+f*t*p+o*s*m;g[b+352>>2]=0.0;g[b+356>>2]=x*r*q+w*f*p+v*o*m;g[b+360>>2]=u*r*q+t*f*p+s*o*m;g[b+364>>2]=q*r*q+p*f*p+m*o*m;g[b+368>>2]=0.0;c[b+564>>2]=8;c[b+572>>2]=0;c[b+572+4>>2]=0;c[b+572+8>>2]=0;c[b+572+12>>2]=0;c[b+572+16>>2]=0;c[b+572+20>>2]=0;c[b+572+24>>2]=0;c[b+572+28>>2]=0;m=+g[b+404>>2];o=m*+g[b+412>>2];p=m*+g[b+416>>2];g[b+620>>2]=+g[b+408>>2]*m;g[b+624>>2]=o;g[b+628>>2]=p;e=b+632|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));l=n;return}function Jd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0;h=l;l=l+240|0;if(!(c[b+16>>2]|0)){K=c[b+12>>2]|0;b=c[b+20>>2]|0;x=+g[d>>2];q=+g[d+4>>2];u=+g[d+8>>2];j=+g[d+16>>2];r=+g[d+20>>2];i=+g[d+24>>2];m=+g[d+32>>2];s=+g[d+36>>2];n=+g[d+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];D=+g[d+56>>2];J=+g[e>>2];I=+g[e+16>>2];z=+g[e+32>>2];H=+g[e+4>>2];G=+g[e+20>>2];y=+g[e+36>>2];v=+g[e+8>>2];k=+g[e+24>>2];p=+g[e+40>>2];C=-+g[e+48>>2];B=-+g[e+52>>2];w=-+g[e+56>>2];d=c[(c[K>>2]|0)+64>>2]|0;A=-+g[b+52>>2];t=-+g[b+56>>2];o=-+g[b+60>>2];g[h+16>>2]=(x*J+j*I+m*z)*A+(x*H+j*G+m*y)*t+(x*v+j*k+m*p)*o;g[h+16+4>>2]=(q*J+r*I+s*z)*A+(q*H+r*G+s*y)*t+(q*v+r*k+s*p)*o;g[h+16+8>>2]=(u*J+i*I+n*z)*A+(u*H+i*G+n*y)*t+(u*v+i*k+n*p)*o;g[h+16+12>>2]=0.0;Sb[d&127](h+152|0,K,h+16|0);o=+g[h+152>>2];t=+g[h+152+4>>2];A=+g[h+152+8>>2];z=F*J+E*I+D*z+(J*C+I*B+z*w)+((x*J+j*I+m*z)*o+(q*J+r*I+s*z)*t+(u*J+i*I+n*z)*A);y=F*H+E*G+D*y+(H*C+G*B+y*w)+((x*H+j*G+m*y)*o+(q*H+r*G+s*y)*t+(u*H+i*G+n*y)*A);A=F*v+E*k+D*p+(v*C+k*B+p*w)+((x*v+j*k+m*p)*o+(q*v+r*k+s*p)*t+(u*v+i*k+n*p)*A);p=+g[b+52>>2];n=+g[b+56>>2];k=+g[b+60>>2];i=k*A+(p*z+n*y)-+g[b+68>>2];v=+g[e>>2];u=+g[e+4>>2];t=+g[e+8>>2];s=+g[e+16>>2];r=+g[e+20>>2];q=+g[e+24>>2];o=+g[e+32>>2];m=+g[e+36>>2];j=+g[e+40>>2];x=(z-p*i)*s+(y-n*i)*r+(A-k*i)*q+ +g[e+52>>2];w=(z-p*i)*o+(y-n*i)*m+(A-k*i)*j+ +g[e+56>>2];g[h+16>>2]=t*(A-k*i)+(v*(z-p*i)+u*(y-n*i))+ +g[e+48>>2];g[h+16+4>>2]=x;g[h+16+8>>2]=w;g[h+16+12>>2]=0.0;g[h>>2]=v*p+u*n+t*k;g[h+4>>2]=p*s+n*r+k*q;g[h+8>>2]=p*o+n*m+k*j;g[h+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,h,h+16|0,i);l=h;return}else{N=c[b+4>>2]|0;a[N+312>>0]=0;c[N>>2]=0;a[N+356>>0]=1;c[N+292>>2]=1566444395;c[N+296>>2]=1566444395;c[N+300>>2]=1566444395;g[N+304>>2]=0.0;c[N+336>>2]=0;c[N+336+4>>2]=0;c[N+336+8>>2]=0;c[N+336+12>>2]=0;a[N+336+16>>0]=0;a[N+332>>0]=a[N+332>>0]&-16;N=c[b+12>>2]|0;M=c[b+16>>2]|0;L=c[N+4>>2]|0;K=c[M+4>>2]|0;I=+nb[c[(c[N>>2]|0)+48>>2]&15](N);O=c[b+16>>2]|0;J=+nb[c[(c[O>>2]|0)+48>>2]&15](O);O=c[b+4>>2]|0;b=c[b+8>>2]|0;c[h+152>>2]=9552;c[h+152+4>>2]=0;c[h+152+8>>2]=1065353216;c[h+152+12>>2]=0;g[h+152+16>>2]=0.0;c[h+152+20>>2]=b;c[h+152+24>>2]=O;c[h+152+28>>2]=N;c[h+152+32>>2]=M;c[h+152+36>>2]=L;c[h+152+40>>2]=K;g[h+152+44>>2]=I;g[h+152+48>>2]=J;a[h+152+52>>0]=0;c[h+152+60>>2]=-1;c[h+152+72>>2]=1;c[h+152+76>>2]=1;g[h+16+128>>2]=999999984306749440.0;c[h+16>>2]=c[d>>2];c[h+16+4>>2]=c[d+4>>2];c[h+16+8>>2]=c[d+8>>2];c[h+16+12>>2]=c[d+12>>2];c[h+16+16>>2]=c[d+16>>2];c[h+16+16+4>>2]=c[d+16+4>>2];c[h+16+16+8>>2]=c[d+16+8>>2];c[h+16+16+12>>2]=c[d+16+12>>2];c[h+16+32>>2]=c[d+32>>2];c[h+16+32+4>>2]=c[d+32+4>>2];c[h+16+32+8>>2]=c[d+32+8>>2];c[h+16+32+12>>2]=c[d+32+12>>2];c[h+16+48>>2]=c[d+48>>2];c[h+16+48+4>>2]=c[d+48+4>>2];c[h+16+48+8>>2]=c[d+48+8>>2];c[h+16+48+12>>2]=c[d+48+12>>2];c[h+16+64>>2]=c[e>>2];c[h+16+64+4>>2]=c[e+4>>2];c[h+16+64+8>>2]=c[e+8>>2];c[h+16+64+12>>2]=c[e+12>>2];c[h+16+80>>2]=c[e+16>>2];c[h+16+80+4>>2]=c[e+16+4>>2];c[h+16+80+8>>2]=c[e+16+8>>2];c[h+16+80+12>>2]=c[e+16+12>>2];c[h+16+96>>2]=c[e+32>>2];c[h+16+96+4>>2]=c[e+32+4>>2];c[h+16+96+8>>2]=c[e+32+8>>2];c[h+16+96+12>>2]=c[e+32+12>>2];c[h+16+112>>2]=c[e+48>>2];c[h+16+112+4>>2]=c[e+48+4>>2];c[h+16+112+8>>2]=c[e+48+8>>2];c[h+16+112+12>>2]=c[e+48+12>>2];Dc(h+152|0,h+16|0,f,0,0);l=h;return}}function Kd(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0;w=l;l=l+96|0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}m=ui(b+4|0)|0;j=+g[b+28>>2];i=+g[b+32>>2];h=+g[b+36>>2];u=j*+g[m+16>>2]+i*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];t=j*+g[m+32>>2]+i*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+156>>2]=j*+g[m>>2]+i*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];g[b+160>>2]=u;g[b+164>>2]=t;g[b+168>>2]=0.0;m=ui(b+16|0)|0;t=+g[b+44>>2];u=+g[b+48>>2];h=+g[b+52>>2];i=t*+g[m>>2]+u*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];j=t*+g[m+16>>2]+u*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];h=t*+g[m+32>>2]+u*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+172>>2]=i;g[b+176>>2]=j;g[b+180>>2]=h;g[b+184>>2]=0.0;i=+g[b+156>>2]-i;j=+g[b+160>>2]-j;h=+g[b+164>>2]-h;if(i*i+j*j+h*h>16.0){u=1.0/+D(+(i*i+j*j+h*h));i=i*4.0*u;j=j*4.0*u;h=h*4.0*u}u=+g[b+64>>2];g[b+72>>2]=1.0/d*i*u;g[b+76>>2]=1.0/d*j*u;g[b+80>>2]=1.0/d*h*u;g[b+84>>2]=0.0;f=ui(b+4|0)|0;g[b+156>>2]=+g[b+156>>2]-+g[f+48>>2];g[b+160>>2]=+g[b+160>>2]-+g[f+52>>2];g[b+164>>2]=+g[b+164>>2]-+g[f+56>>2];f=ui(b+16|0)|0;g[b+172>>2]=+g[b+172>>2]-+g[f+48>>2];g[b+176>>2]=+g[b+176>>2]-+g[f+52>>2];g[b+180>>2]=+g[b+180>>2]-+g[f+56>>2];f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f)i=0.0;else{f=f+128|0;v=27}}else{f=f+404|0;v=27}if((v|0)==27)i=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+8>>2]|0;if(!f){m=c[b+4>>2]|0;m=(m|0)==0?22904:m+180|0}else m=f+324|0;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f)h=0.0;else{f=f+128|0;v=38}}else{f=f+404|0;v=38}if((v|0)==38)h=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;f=(f|0)==0?22904:f+180|0}else f=f+324|0;Uh(w+48|0,i,m,+g[b+156>>2],+g[b+160>>2],+g[b+164>>2]);Uh(w,h,f,+g[b+172>>2],+g[b+176>>2],+g[b+180>>2]);h=+g[w+48>>2]+ +g[w>>2];i=+g[w+48+4>>2]+ +g[w+4>>2];j=+g[w+48+8>>2]+ +g[w+8>>2];d=+g[w+48+16>>2]+ +g[w+16>>2];n=+g[w+48+20>>2]+ +g[w+20>>2];o=+g[w+48+24>>2]+ +g[w+24>>2];p=+g[w+48+32>>2]+ +g[w+32>>2];q=+g[w+48+36>>2]+ +g[w+36>>2];r=+g[w+48+40>>2]+ +g[w+40>>2];s=1.0/(j*(d*q-n*p)+(h*(n*r-o*q)+i*(o*p-d*r)));g[b+104>>2]=(n*r-o*q)*s;g[b+108>>2]=(j*q-i*r)*s;g[b+112>>2]=(i*o-j*n)*s;g[b+116>>2]=0.0;g[b+120>>2]=(o*p-d*r)*s;g[b+124>>2]=(h*r-j*p)*s;g[b+128>>2]=(j*d-h*o)*s;g[b+132>>2]=0.0;g[b+136>>2]=(d*q-n*p)*s;g[b+140>>2]=(i*p-h*q)*s;g[b+144>>2]=(h*n-i*d)*s;g[b+148>>2]=0.0;t=+g[b+68>>2];u=+g[b+72>>2];if(t>0.0){y=+g[b+76>>2];x=+g[b+80>>2];g[b+88>>2]=t*u*(n*r-o*q)*s+t*y*(j*q-i*r)*s+t*x*(i*o-j*n)*s;g[b+92>>2]=t*u*(o*p-d*r)*s+t*y*(h*r-j*p)*s+t*x*(j*d-h*o)*s;g[b+96>>2]=t*u*(d*q-n*p)*s+t*y*(i*p-h*q)*s+t*x*(h*n-i*d)*s;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-t)*u;g[b+76>>2]=(1.0-t)*y;g[b+80>>2]=(1.0-t)*x;r=(1.0-t)*u;s=(1.0-t)*y;u=(1.0-t)*x;t=+(e|0);t=1.0/t;r=t*r;g[b+72>>2]=r;s=t*s;g[b+76>>2]=s;u=t*u;g[b+80>>2]=u;l=w;return}else{t=u;u=+g[b+76>>2];y=+g[b+80>>2];x=+(e|0);x=1.0/x;t=x*t;g[b+72>>2]=t;u=x*u;g[b+76>>2]=u;y=x*y;g[b+80>>2]=y;l=w;return}}function Ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;f=m+(i*104|0)+8|0;q=+g[f>>2];h=m+(i*104|0)+12|0;p=+g[h>>2];d=m+(i*104|0)+16|0;l=+g[d>>2];j=q*+g[b>>2]+p*+g[b+4>>2]+l*+g[b+8>>2]+ +g[b+48>>2];k=q*+g[b+16>>2]+p*+g[b+20>>2]+l*+g[b+24>>2]+ +g[b+52>>2];l=q*+g[b+32>>2]+p*+g[b+36>>2]+l*+g[b+40>>2]+ +g[b+56>>2];g[f>>2]=j;g[h>>2]=k;g[d>>2]=l;g[m+(i*104|0)+20>>2]=0.0;d=m+(i*104|0)+24|0;p=+g[d>>2];h=m+(i*104|0)+28|0;q=+g[h>>2];f=m+(i*104|0)+32|0;r=+g[f>>2];s=p*+g[b+16>>2]+q*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];t=p*+g[b+32>>2]+q*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];g[d>>2]=p*+g[b>>2]+q*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];g[h>>2]=s;g[f>>2]=t;g[m+(i*104|0)+36>>2]=0.0;f=m+(i*104|0)+72|0;t=+g[f>>2];h=m+(i*104|0)+76|0;s=+g[h>>2];d=m+(i*104|0)+80|0;r=+g[d>>2];q=t*+g[b+16>>2]+s*+g[b+20>>2]+r*+g[b+24>>2];p=t*+g[b+32>>2]+s*+g[b+36>>2]+r*+g[b+40>>2];g[f>>2]=+g[b>>2]*t+ +g[b+4>>2]*s+ +g[b+8>>2]*r;g[h>>2]=q;g[d>>2]=p;g[m+(i*104|0)+84>>2]=0.0;m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;r=+nb[c[(c[o>>2]|0)+48>>2]&15](o);t=+g[d+4>>2]-r;s=+g[d+8>>2]-r;g[a+952>>2]=+g[d>>2]-r;g[a+956>>2]=t;g[a+960>>2]=s;g[a+964>>2]=0.0;s=r+ +g[d+20>>2];t=r+ +g[d+24>>2];g[a+968>>2]=r+ +g[d+16>>2];g[a+972>>2]=s;g[a+976>>2]=t;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;r=+g[m+8>>2]-+g[o+8>>2];s=+g[m+12>>2]-+g[o+12>>2];t=+g[m+16>>2]-+g[o+16>>2];t=+D(+(r*r+s*s+t*t));g[f+(d*52|0)+32>>2]=t;g[f+(d*52|0)+44>>2]=t*t;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}function Md(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0;B=c[b+88>>2]|0;if((B|0)==(c[b+92>>2]|0)?(o=B|0?B<<1:1,(B|0)<(o|0)):0){if(!o){k=0;n=B}else{c[6995]=(c[6995]|0)+1;k=sc((o*152|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}n=c[b+88>>2]|0}if((n|0)>0){l=0;do{gi(k+(l*152|0)|0,(c[b+96>>2]|0)+(l*152|0)|0,152)|0;l=l+1|0}while((l|0)!=(n|0))}l=c[b+96>>2]|0;if(l|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[l+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=k;c[b+92>>2]=o;k=c[b+88>>2]|0}else k=B;c[b+88>>2]=k+1;A=c[b+96>>2]|0;c[A+(B*152|0)+140>>2]=h;c[A+(B*152|0)+16>>2]=0;c[A+(B*152|0)+16+4>>2]=0;c[A+(B*152|0)+16+8>>2]=0;c[A+(B*152|0)+16+12>>2]=0;g[A+(B*152|0)+48>>2]=-0.0;g[A+(B*152|0)+52>>2]=-0.0;g[A+(B*152|0)+56>>2]=-0.0;g[A+(B*152|0)+60>>2]=0.0;b=c[b+16>>2]|0;o=c[b+(e*244|0)+240>>2]|0;h=c[b+(f*244|0)+240>>2]|0;c[A+(B*152|0)+144>>2]=e;c[A+(B*152|0)+148>>2]=f;g[A+(B*152|0)+104>>2]=i;c[A+(B*152|0)+132>>2]=0;g[A+(B*152|0)+100>>2]=0.0;g[A+(B*152|0)+96>>2]=0.0;x=-+g[d>>2];y=-+g[d+4>>2];z=-+g[d+8>>2];g[A+(B*152|0)>>2]=x;g[A+(B*152|0)+4>>2]=y;g[A+(B*152|0)+8>>2]=z;g[A+(B*152|0)+12>>2]=0.0;if(o|0){k=(g[j>>2]=(+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z)*+g[o+604>>2],c[j>>2]|0);l=(g[j>>2]=(+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z)*+g[o+608>>2],c[j>>2]|0);n=(g[j>>2]=(+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z)*+g[o+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+64>>2]=k;c[A+(B*152|0)+68>>2]=l;c[A+(B*152|0)+72>>2]=n;g[A+(B*152|0)+76>>2]=0.0;u=+g[d>>2];v=+g[d+4>>2];w=+g[d+8>>2];d=c[d+12>>2]|0;g[A+(B*152|0)+32>>2]=u;g[A+(B*152|0)+36>>2]=v;g[A+(B*152|0)+40>>2]=w;c[A+(B*152|0)+44>>2]=d;if(h|0){k=(g[j>>2]=(u*+g[h+324>>2]+v*+g[h+328>>2]+w*+g[h+332>>2])*+g[h+604>>2],c[j>>2]|0);l=(g[j>>2]=(u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2])*+g[h+608>>2],c[j>>2]|0);n=(g[j>>2]=(u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2])*+g[h+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+80>>2]=k;c[A+(B*152|0)+84>>2]=l;c[A+(B*152|0)+88>>2]=n;g[A+(B*152|0)+92>>2]=0.0;if(o|0){m=+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z;p=+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z;q=+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z}else{m=0.0;p=0.0;q=0.0}if(h|0){r=+g[h+324>>2]*u+ +g[h+328>>2]*v+ +g[h+332>>2]*w;s=u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2];t=u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2]}else{r=0.0;s=0.0;t=0.0}s=1.0/(m*x+p*y+q*z+0.0+(r*u+s*v+t*w));g[A+(B*152|0)+108>>2]=s;if(o|0){p=+g[b+(e*244|0)+192>>2];q=+g[b+(e*244|0)+196>>2];r=+g[b+(e*244|0)+200>>2];m=(+g[b+(e*244|0)+176>>2]+ +g[b+(e*244|0)+208>>2])*0.0+(+g[b+(e*244|0)+180>>2]+ +g[b+(e*244|0)+212>>2])*0.0+(+g[b+(e*244|0)+184>>2]+ +g[b+(e*244|0)+216>>2])*0.0}else{p=0.0;q=0.0;r=0.0;m=0.0}m=m+(p*x+q*y+r*z);if(!h){t=0.0;x=0.0;z=0.0;y=-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}t=+g[b+(f*244|0)+192>>2];x=+g[b+(f*244|0)+196>>2];z=+g[b+(f*244|0)+200>>2];y=(+g[b+(f*244|0)+176>>2]+ +g[b+(f*244|0)+208>>2])*-0.0+(+g[b+(f*244|0)+180>>2]+ +g[b+(f*244|0)+212>>2])*-0.0+(+g[b+(f*244|0)+184>>2]+ +g[b+(f*244|0)+216>>2])*-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}function Nd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0;t=l;l=l+48|0;switch(c[b+4>>2]|0){case 8:{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;l=t;return}case 0:{n=+g[b+32>>2];r=+g[b+36>>2];r=+g[d+4>>2]>=0.0?r:-r;s=+g[b+40>>2];s=+g[d+8>>2]>=0.0?s:-s;g[a>>2]=+g[d>>2]>=0.0?n:-n;g[a+4>>2]=r;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 1:{k=+g[d>>2];m=+g[d+4>>2];n=+g[d+8>>2];r=k*+g[b+60>>2]+m*+g[b+60+4>>2]+n*+g[b+60+8>>2];s=k*+g[b+60+16>>2]+m*+g[b+60+20>>2]+n*+g[b+60+24>>2];n=k*+g[b+60+32>>2]+m*+g[b+60+36>>2]+n*+g[b+60+40>>2];g[t+32>>2]=r;g[t+32+4>>2]=s;g[t+32+8>>2]=n;g[t+32+12>>2]=0.0;o=+g[t+32+((r>2]>2]|0;q=c[b+60+(o<<4)+8>>2]|0;c[a>>2]=c[b+60+(o<<4)>>2];c[a+4>>2]=p;c[a+8>>2]=q;g[a+12>>2]=0.0;l=t;return}case 13:{c[t+32>>2]=c[b+32>>2];c[t+32+4>>2]=c[b+32+4>>2];c[t+32+8>>2]=c[b+32+8>>2];c[t+32+12>>2]=c[b+32+12>>2];c[t+16>>2]=c[d>>2];e=c[d+4>>2]|0;c[t+16+4>>2]=e;q=c[d+8>>2]|0;c[t+16+8>>2]=q;g[t+16+12>>2]=0.0;b=c[b+56>>2]|0;f=(c[j>>2]=q,+g[j>>2]);switch(b|0){case 2:{d=0;o=2;p=1;f=(c[j>>2]=e,+g[j>>2]);break}case 1:{d=0;o=1;p=2;break}default:{d=1;o=0;p=2}}r=+g[t+32+(d<<2)>>2];i=+g[t+32+(b<<2)>>2];n=+g[t+16+(d<<2)>>2];m=+D(+(n*n+f*f));h=+g[t+16+(o<<2)>>2];if(m!=0.0){k=r/m*f;e=t;h=h<0.0?-i:i;f=n*(r/m)}else{k=0.0;e=t;h=h<0.0?-i:i;f=r}g[t+(d<<2)>>2]=f;g[t+(o<<2)>>2]=h;g[t+(p<<2)>>2]=k;c[a>>2]=c[e>>2];c[a+4>>2]=c[t+4>>2];c[a+8>>2]=c[t+8>>2];g[a+12>>2]=0.0;l=t;return}case 10:{f=+g[d>>2];h=+g[d+4>>2];i=+g[d+8>>2];e=c[b+56>>2]|0;r=+g[b+32+(e<<2)>>2];if(f*f+h*h+i*i<1.4210854715202004e-14){s=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(f*f+h*h+i*i));s=f*m;n=h*m;m=i*m}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=r;k=+g[t+32>>2];h=+g[t+32+4>>2];f=+g[t+32+8>>2];i=s*k+n*h+m*f;if(i>-999999984306749440.0){p=(g[j>>2]=f,c[j>>2]|0);q=(g[j>>2]=h,c[j>>2]|0);o=(g[j>>2]=k,c[j>>2]|0)}else{i=-999999984306749440.0;o=0;p=0;q=0}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=-r;k=+g[t+32>>2];r=+g[t+32+4>>2];f=+g[t+32+8>>2];e=s*k+n*r+m*f>i;b=(g[j>>2]=k,c[j>>2]|0);d=(g[j>>2]=r,c[j>>2]|0);p=e?(g[j>>2]=f,c[j>>2]|0):p;c[a>>2]=e?b:o;c[a+4>>2]=e?d:q;c[a+8>>2]=p;g[a+12>>2]=0.0;l=t;return}case 5:{p=c[b+96>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 4:{p=c[b+108>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}default:{Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);l=t;return}}}function Od(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0;x=l;l=l+64|0;if((h|0)>0){b=0;j=0;do{w=c[f+(j<<2)>>2]|0;b=(w|0)>(b|0)?w:b;j=j+1|0}while((j|0)<(h*3|0))}else b=0;t=b+1|0;k=P(t,t)|0;if(!k)j=0;else{c[6995]=(c[6995]|0)+1;j=sc(k+19|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Yk(j|0,0,k|0)|0}if((b|0)>-1){c[6995]=(c[6995]|0)+1;b=sc((t<<4|3)+16|0)|0;if(!b)m=0;else{c[(b+4+15&-16)+-4>>2]=b;m=b+4+15&-16}b=0;do{w=m+(b<<4)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];b=b+1|0}while((b|0)!=(t|0));b=0;k=0;while(1){v=c[e+(k+1<<2)>>2]|0;w=c[e+(k+2<<2)>>2]|0;c[m+(b<<4)>>2]=c[e+(k<<2)>>2];c[m+(b<<4)+4>>2]=v;c[m+(b<<4)+8>>2]=w;g[m+(b<<4)+12>>2]=0.0;k=k+3|0;if((k|0)>=(t*3|0)){w=m;v=m;break}else b=b+1|0}}else{w=0;v=0}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)u=0;else{c[(b+4+15&-16)+-4>>2]=b;u=b+4+15&-16}Bc(u,d,t,w,0);if((h|0)>0){d=u+780|0;n=u+792|0;o=u+800|0;p=u+984|0;e=0;do{q=c[f+(e<<2)>>2]|0;r=c[f+(e+1<<2)>>2]|0;s=c[f+(e+2<<2)>>2]|0;m=P(q,t)|0;b=j+(m+s)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+((P(s,t)|0)+q)>>0]=1;B=c[d>>2]|0;Xh(u,0);k=(c[n>>2]|0)+-1|0;b=c[o>>2]|0;c[b+(k*52|0)+24>>2]=B+(s*104|0);c[b+(k*52|0)+28>>2]=B+(q*104|0);A=+g[B+(s*104|0)+8>>2]-+g[B+(q*104|0)+8>>2];z=+g[B+(s*104|0)+12>>2]-+g[B+(q*104|0)+12>>2];y=+g[B+(s*104|0)+16>>2]-+g[B+(q*104|0)+16>>2];g[b+(k*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[p>>0]=1}k=P(r,t)|0;b=j+(k+q)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(m+r)>>0]=1;b=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=b+(q*104|0);c[m+(B*52|0)+28>>2]=b+(r*104|0);y=+g[b+(q*104|0)+8>>2]-+g[b+(r*104|0)+8>>2];z=+g[b+(q*104|0)+12>>2]-+g[b+(r*104|0)+12>>2];A=+g[b+(q*104|0)+16>>2]-+g[b+(r*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}b=j+((P(s,t)|0)+r)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(k+s)>>0]=1;k=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=k+(r*104|0);c[m+(B*52|0)+28>>2]=k+(s*104|0);y=+g[k+(r*104|0)+8>>2]-+g[k+(s*104|0)+8>>2];z=+g[k+(r*104|0)+12>>2]-+g[k+(s*104|0)+12>>2];A=+g[k+(r*104|0)+16>>2]-+g[k+(s*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}bg(u,q,r,s,0);e=e+3|0}while((e|0)<(h*3|0))}if(i){m=c[u+792>>2]|0;if((m|0)>0){e=u+800|0;b=243703;k=0;do{d=c[e>>2]|0;n=d+(k*52|0)|0;b=(P(b,1664525)|0)+1013904223|0;o=x;p=n;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=n;p=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;p=x;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(m|0))}else b=243703;d=c[u+812>>2]|0;if((d|0)>0){n=u+820|0;k=0;do{e=c[n>>2]|0;m=e+(k*44|0)|0;b=(P(b,1664525)|0)+1013904223|0;e=e+(((b>>>0)%(d>>>0)|0)*44|0)|0;o=x;p=m;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=m;p=e;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=e;p=x;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(d|0))}}if(!((w|0)==0|(v|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0)}if(!j){l=x;return u|0}c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);l=x;return u|0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0;H=l;l=l+96|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){G=0;l=H;return G|0}G=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[G+188>>2]|0)|0)){G=1;l=H;return G|0}b=c[G+192>>2]|0;F=c[a+216>>2]|0;if((c[b+4>>2]|0)!=32){c[H+32>>2]=0;c[H+32+4>>2]=b;c[H+32+8>>2]=G;c[H+32+12>>2]=G+4;c[H+32+16>>2]=-1;c[H+32+20>>2]=-1;ad(a+68|0,a+132|0,H+32|0,F);G=1;l=H;return G|0}if((G|0)==0?1:(c[G+252>>2]|0)!=8){G=1;l=H;return G|0}if(c[G+812>>2]|0?(c[G+1028>>2]|0)==0:0)$g(G);B=+g[a+180>>2]-+g[a+116>>2];C=+g[a+184>>2]-+g[a+120>>2];E=+g[a+188>>2]-+g[a+124>>2];b=c[G+1028>>2]|0;if(!b){s=c[G+812>>2]|0;if((s|0)>0){r=c[G+820>>2]|0;q=0;d=0;b=-1;i=1065353216;m=0;e=1.0;f=1.0;do{K=c[r+(q*44|0)+8>>2]|0;J=c[r+(q*44|0)+12>>2]|0;I=c[r+(q*44|0)+16>>2]|0;h=+Gh(a+116|0,B,C,E,+g[K+8>>2],+g[K+12>>2],+g[K+16>>2],+g[J+8>>2],+g[J+12>>2],+g[J+16>>2],+g[I+8>>2],+g[I+12>>2],+g[I+16>>2],f);if(h>0.0){d=d+1|0;b=q;i=(g[j>>2]=h,c[j>>2]|0);m=3;e=h;f=h}q=q+1|0}while((q|0)!=(s|0))}else{d=0;b=-1;i=1065353216;m=0;e=1.0}}else{c[H+32>>2]=3396;c[H+32+4>>2]=c[a+116>>2];c[H+32+4+4>>2]=c[a+116+4>>2];c[H+32+4+8>>2]=c[a+116+8>>2];c[H+32+4+12>>2]=c[a+116+12>>2];g[H+32+36>>2]=B;g[H+32+40>>2]=C;g[H+32+44>>2]=E;g[H+32+48>>2]=0.0;c[H+32+20>>2]=c[a+180>>2];c[H+32+20+4>>2]=c[a+180+4>>2];c[H+32+20+8>>2]=c[a+180+8>>2];c[H+32+20+12>>2]=c[a+180+12>>2];c[H+32+52>>2]=1065353216;c[H+32+56>>2]=0;c[H+32+60>>2]=0;Ue(b,a+116|0,a+180|0,H+32|0);b=c[H+32+56>>2]|0;if(!b){d=0;b=-1;i=1065353216;m=0;e=1.0}else{K=c[H+32+52>>2]|0;d=1;b=(b-(c[G+820>>2]|0)|0)/44|0;i=K;m=3;e=(c[j>>2]=K,+g[j>>2])}}s=c[G+832>>2]|0;if((s|0)>0){r=c[G+840>>2]|0;q=0;f=(c[j>>2]=i,+g[j>>2]);while(1){K=c[r+(q*104|0)+8>>2]|0;v=+g[K+8>>2];y=+g[K+12>>2];A=+g[K+16>>2];K=c[r+(q*104|0)+12>>2]|0;k=+g[K+8>>2];p=+g[K+12>>2];u=+g[K+16>>2];K=c[r+(q*104|0)+16>>2]|0;w=+g[K+8>>2];x=+g[K+12>>2];z=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,w,x,z,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}else i=m;K=c[r+(q*104|0)+20>>2]|0;n=+g[K+8>>2];o=+g[K+12>>2];t=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}h=+Gh(a+116|0,B,C,E,k,p,u,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;f=h;e=h}h=+Gh(a+116|0,B,C,E,v,y,A,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}q=q+1|0;if((q|0)==(s|0)){p=e;break}else m=i}}else{i=m;p=e}if(!d){K=1;l=H;return K|0}if(!(p<=+g[F+4>>2])){K=1;l=H;return K|0}c[H+32>>2]=0;c[H+32+4>>2]=b;k=+g[a+180>>2]-+g[a+116>>2];n=+g[a+184>>2]-+g[a+120>>2];o=+g[a+188>>2]-+g[a+124>>2];e=1.0/+D(+(k*k+n*n+o*o));if((i|0)==3){d=c[G+820>>2]|0;e=+g[d+(b*44|0)+20>>2];h=+g[d+(b*44|0)+24>>2];f=+g[d+(b*44|0)+28>>2];if(k*e+n*h+o*f>0.0){k=-e;h=-h;f=-f;e=0.0}else{k=e;e=+g[d+(b*44|0)+32>>2]}}else{k=-(k*e);h=-(n*e);f=-(o*e);e=0.0}c[H>>2]=G;c[H+4>>2]=H+32;g[H+8>>2]=k;g[H+12>>2]=h;g[H+16>>2]=f;g[H+20>>2]=e;g[H+24>>2]=p;+qb[c[(c[F>>2]|0)+12>>2]&31](F,H,1);K=1;l=H;return K|0}function Qd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0;if(a[b+165>>0]|0){h=c[b+88>>2]|0;a:do if((h|0)>0&e){f=c[b+96>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){s=+g[f+(e<<4)>>2]-j;r=+g[f+(e<<4)+4>>2]-k;q=+g[f+(e<<4)+8>>2]-l;if(s*s+r*r+q*q<=m)break;e=e+1|0;if((e|0)>=(h|0))break a}return e|0}while(0);p=(c[b+32>>2]|0)+12|0;c[p>>2]=(c[p>>2]|0)+1;if((h|0)==(c[b+92>>2]|0)?(i=h|0?h<<1:1,(h|0)<(i|0)):0){if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<4|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+88>>2]|0}if((h|0)>0){f=0;do{p=e+(f<<4)|0;o=(c[b+96>>2]|0)+(f<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+96>>2]|0;if(f|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=e;c[b+92>>2]=i;e=c[b+88>>2]|0}else e=h;p=(c[b+96>>2]|0)+(e<<4)|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+88>>2]|0;c[b+88>>2]=d+1;c[(c[b+32>>2]|0)+16>>2]=c[b+96>>2];return d|0}h=c[b+108>>2]|0;b:do if((h|0)>0&e){f=c[b+116>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){q=+g[f+(e<<2)>>2]-j;r=+g[f+(e+1<<2)>>2]-k;s=+g[f+(e+2<<2)>>2]-l;i=e+3|0;if(q*q+r*r+s*s<=m)break;if((i|0)<(h|0))e=i;else break b}d=(e|0)/3|0;return d|0}while(0);e=c[b+112>>2]|0;if((h|0)==(e|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+108>>2]|0}i=c[b+116>>2]|0;if((h|0)<=0)if(!i)f=b+120|0;else p=34;else{f=0;do{c[e+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));p=34}if((p|0)==34){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;f=c[b+108>>2]|0;i=n}else{f=h;i=h}}else{f=h;i=e}h=c[b+116>>2]|0;c[h+(f<<2)>>2]=c[d>>2];e=f+1|0;c[b+108>>2]=e;if((e|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=48;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=48}if((p|0)==48){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;o=e;f=c[b+108>>2]|0;i=n}else{o=h;f=i;e=h}}else{o=h;f=e;e=h}c[o+(f<<2)>>2]=c[d+4>>2];f=f+1|0;c[b+108>>2]=f;if((f|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){e=0;h=o}else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=62;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=62}if((p|0)==62){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;h=e;f=c[b+108>>2]|0}else{h=o;f=i}}else h=o;c[h+(f<<2)>>2]=c[d+8>>2];d=f+1|0;c[b+108>>2]=d;b=c[b+32>>2]|0;c[b+12>>2]=(c[b+12>>2]|0)+1;c[b+16>>2]=e;d=((d|0)/3|0)+-1|0;return d|0}function Rd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;m=l;l=l+400|0;f=c[d+36>>2]|0;d=c[e+36>>2]|0;e=c[b+24>>2]|0;if(((e|0)==(c[b+28>>2]|0)?c[e+1132>>2]|0:0)?(j=(P(c[d+380>>2]|0,c[e+1112>>2]|0)|0)+(c[f+380>>2]|0)|0,a[(c[e+1140>>2]|0)+j>>0]|0):0){c[5773]=(c[5773]|0)+1;l=m;return}c[m+332+4>>2]=35;c[m+332+8>>2]=0;c[m+332+12>>2]=-1;c[m+332+16>>2]=1065353216;c[m+332+20>>2]=1065353216;c[m+332+24>>2]=1065353216;g[m+332+28>>2]=0.0;c[m+332>>2]=3644;c[m+332+56>>2]=f;g[m+332+48>>2]=0.0;c[m+272+4>>2]=35;c[m+272+8>>2]=0;c[m+272+12>>2]=-1;c[m+272+16>>2]=1065353216;c[m+272+20>>2]=1065353216;c[m+272+24>>2]=1065353216;g[m+272+28>>2]=0.0;c[m+272>>2]=3644;c[m+272+56>>2]=d;g[m+272+48>>2]=0.0;if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}o=+g[f+232>>2]-+g[d+232>>2];n=+g[f+236>>2]-+g[d+236>>2];g[m>>2]=+g[f+228>>2]-+g[d+228>>2];g[m+4>>2]=o;g[m+8>>2]=n;g[m+12>>2]=0.0;if(!(!(Gd(m+332|0,22728,m+272|0,22728,m,m+216|0)|0)?!(Hc(m+332|0,22728,m+272|0,22728,m,m+216|0,0)|0):0))h=19;if((h|0)==19?(c[m+4>>2]=0,c[m+4+4>>2]=0,c[m+4+8>>2]=0,c[m+4+12>>2]=0,c[m+4+16>>2]=0,c[m+4+20>>2]=0,a[m+152>>0]=0,c[m>>2]=3432,zd(b,m+216|0,f,0,0,d,0,0,m)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)j=0;else{c[(d+4+15&-16)+-4>>2]=d;j=d+4+15&-16}e=j+4|0;d=j+152|0;Yk(e|0,0,212)|0;c[j>>2]=3432;f=m+4|0;h=e+100|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));e=j+104|0;c[e>>2]=c[m+104>>2];c[e+4>>2]=c[m+104+4>>2];c[e+8>>2]=c[m+104+8>>2];c[e+12>>2]=c[m+104+12>>2];e=j+120|0;c[e>>2]=c[m+120>>2];c[e+4>>2]=c[m+120+4>>2];c[e+8>>2]=c[m+120+8>>2];c[e+12>>2]=c[m+120+12>>2];e=j+136|0;c[e>>2]=c[m+136>>2];c[e+4>>2]=c[m+136+4>>2];c[e+8>>2]=c[m+136+8>>2];c[e+12>>2]=c[m+136+12>>2];a[d>>0]=a[m+152>>0]|0;e=j+156|0;f=m+156|0;h=e+60|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));h=c[b+24>>2]|0;i=j;d=c[h+912>>2]|0;if((d|0)==(c[h+916>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[h+912>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[h+920>>2]|0;if(e){if(a[h+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[h+912>>2]|0}c[h+920>>2]=0}a[h+924>>0]=1;c[h+920>>2]=f;c[h+916>>2]=k}c[(c[h+920>>2]|0)+(d<<2)>>2]=i;c[h+912>>2]=d+1;i=c[b+24>>2]|0;k=c[b+28>>2]|0;n=+g[i+408>>2];o=+g[k+408>>2];b=j+64|0;g[b>>2]=+g[b>>2]*(n>o?n:o);b=j+68|0;g[b>>2]=+g[b>>2]*(+g[i+420>>2]+ +g[k+420>>2])*.5}l=m;return}function Sd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0;p=l;l=l+128|0;c[b+72>>2]=(c[b+72>>2]|0)+1;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];c[p+16>>2]=c[d+16>>2];c[p+16+4>>2]=c[d+16+4>>2];c[p+16+8>>2]=c[d+16+8>>2];c[p+16+12>>2]=c[d+16+12>>2];c[p+32>>2]=c[d+32>>2];c[p+32+4>>2]=c[d+32+4>>2];c[p+32+8>>2]=c[d+32+8>>2];c[p+32+12>>2]=c[d+32+12>>2];c[p+48>>2]=c[d+48>>2];c[p+48+4>>2]=c[d+48+4>>2];c[p+48+8>>2]=c[d+48+8>>2];c[p+48+12>>2]=c[d+48+12>>2];n=c[e+4>>2]|0;o=+nb[c[(c[e>>2]|0)+48>>2]&15](e);Vb[c[(c[e>>2]|0)+8>>2]&127](e,d,p+112|0,p+96|0);f=+g[p+112>>2];if(+g[b+36>>2]>f)g[b+36>>2]=f;f=+g[p+96>>2];if(+g[b+52>>2]>2]=f;f=+g[p+112+4>>2];if(+g[b+40>>2]>f)g[b+40>>2]=f;f=+g[p+96+4>>2];if(+g[b+56>>2]>2]=f;f=+g[p+112+8>>2];if(+g[b+44>>2]>f)g[b+44>>2]=f;f=+g[p+96+8>>2];if(+g[b+60>>2]>2]=f;k=c[b+68>>2]|0;if(!k){k=b+20|0;j=0}else{c[p+64>>2]=c[p+112>>2];c[p+64+4>>2]=c[p+112+4>>2];c[p+64+8>>2]=c[p+112+8>>2];c[p+64+12>>2]=c[p+112+12>>2];c[p+64+16>>2]=c[p+96>>2];c[p+64+16+4>>2]=c[p+96+4>>2];c[p+64+16+8>>2]=c[p+96+8>>2];c[p+64+16+12>>2]=c[p+96+12>>2];j=c[b+20>>2]|0;d=c[k+4>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;i=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0))}else c[k+4>>2]=0;c[d+32>>2]=0;c[d+36>>2]=j;c[d+40>>2]=0;c[d>>2]=c[p+64>>2];c[d+4>>2]=c[p+64+4>>2];c[d+8>>2]=c[p+64+8>>2];c[d+12>>2]=c[p+64+12>>2];c[d+16>>2]=c[p+64+16>>2];c[d+20>>2]=c[p+64+20>>2];c[d+24>>2]=c[p+64+24>>2];c[d+28>>2]=c[p+64+28>>2];Pe(k,c[k>>2]|0,d);c[k+12>>2]=(c[k+12>>2]|0)+1;k=b+20|0;j=d}d=c[k>>2]|0;if((d|0)==(c[b+24>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((m*80|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[k>>2]|0}if((d|0)>0){h=0;do{q=i+(h*80|0)|0;r=c[b+28>>2]|0;s=r+(h*80|0)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=r+(h*80|0)+16|0;s=i+(h*80|0)+16|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];s=r+(h*80|0)+32|0;q=i+(h*80|0)+32|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+48|0;s=r+(h*80|0)+48|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+64|0;r=r+(h*80|0)+64|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=h+1|0}while((h|0)!=(d|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=i;c[b+24>>2]=m;d=c[k>>2]|0}s=c[b+28>>2]|0;r=s+(d*80|0)|0;c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];r=s+(d*80|0)+16|0;c[r>>2]=c[p+16>>2];c[r+4>>2]=c[p+16+4>>2];c[r+8>>2]=c[p+16+8>>2];c[r+12>>2]=c[p+16+12>>2];r=s+(d*80|0)+32|0;c[r>>2]=c[p+32>>2];c[r+4>>2]=c[p+32+4>>2];c[r+8>>2]=c[p+32+8>>2];c[r+12>>2]=c[p+32+12>>2];r=s+(d*80|0)+48|0;c[r>>2]=c[p+48>>2];c[r+4>>2]=c[p+48+4>>2];c[r+8>>2]=c[p+48+8>>2];c[r+12>>2]=c[p+48+12>>2];s=s+(d*80|0)+64|0;c[s>>2]=e;c[s+4>>2]=n;g[s+8>>2]=o;c[s+12>>2]=j;c[k>>2]=(c[k>>2]|0)+1;l=p;return}function Td(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0;m=l;l=l+16|0;if(!(a[b+1308>>0]|0)){l=m;return}g[b+928>>2]=0.0;g[b+992>>2]=0.0;g[b+1056>>2]=0.0;c[b+712>>2]=0;c[b+712+4>>2]=0;c[b+712+8>>2]=0;c[b+712+12>>2]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);Ib[c[(c[b>>2]|0)+44>>2]&511](b);e=+g[b+1284>>2];f=+g[b+1288>>2];h=+g[b+1292>>2];if(+g[b+696>>2]>=+g[b+680>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+16>>2]|0;k=c[d+32>>2]|0;c[m>>2]=c[d>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+176|0,m,e,f,h,e,f,h)}if(+g[b+700>>2]>=+g[b+684>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+20>>2]|0;k=c[d+36>>2]|0;c[m>>2]=c[d+4>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+260|0,m,e,f,h,e,f,h)}if(+g[b+704>>2]>=+g[b+688>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+24>>2]|0;k=c[d+40>>2]|0;c[m>>2]=c[d+8>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+344|0,m,e,f,h,e,f,h)}k=0;do{f=+g[b+868+(k<<6)>>2];h=+g[b+868+(k<<6)+4>>2];j=+Xj(+g[b+1192+(k<<2)>>2],f,h);g[b+868+(k<<6)+52>>2]=j;do if(!(f>h)){if(f>j){c[b+868+(k<<6)+56>>2]=1;d=b+868+(k<<6)+48|0;g[d>>2]=j-f;if(!(j-f>3.1415927410125732))if(j-f<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-f+e;i=16;break}d=b+868+(k<<6)+56|0;if(h>2]=2;d=b+868+(k<<6)+48|0;g[d>>2]=j-h;if(!(j-h>3.1415927410125732))if(j-h<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-h+e;i=16}else i=15}else{d=b+868+(k<<6)+56|0;i=15}while(0);if((i|0)==15?(i=0,c[d>>2]=0,a[b+868+(k<<6)+44>>0]|0):0)i=16;if((i|0)==16){K=b+1208+(k<<4)|0;c[m>>2]=c[K>>2];c[m+4>>2]=c[K+4>>2];c[m+8>>2]=c[K+8>>2];c[m+12>>2]=c[K+12>>2];K=b+428+(k*84|0)|0;d=c[b+28>>2]|0;J=+g[d+4>>2];I=+g[d+20>>2];H=+g[d+36>>2];F=+g[d+8>>2];E=+g[d+24>>2];D=+g[d+40>>2];B=+g[d+12>>2];A=+g[d+28>>2];z=+g[d+44>>2];i=c[b+32>>2]|0;x=+g[i+4>>2];w=+g[i+20>>2];v=+g[i+36>>2];t=+g[i+8>>2];s=+g[i+24>>2];r=+g[i+40>>2];p=+g[i+12>>2];n=+g[i+28>>2];f=+g[i+44>>2];c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;o=+g[m>>2];e=+g[m+4>>2];h=+g[m+8>>2];g[b+428+(k*84|0)+16>>2]=J*o+I*e+H*h;g[b+428+(k*84|0)+20>>2]=F*o+E*e+D*h;g[b+428+(k*84|0)+24>>2]=B*o+A*e+z*h;g[b+428+(k*84|0)+28>>2]=0.0;g[b+428+(k*84|0)+32>>2]=x*-o+w*-e+v*-h;g[b+428+(k*84|0)+36>>2]=t*-o+s*-e+r*-h;g[b+428+(k*84|0)+40>>2]=p*-o+n*-e+f*-h;g[b+428+(k*84|0)+44>>2]=0.0;G=(J*o+I*e+H*h)*+g[d+456>>2];C=(F*o+E*e+D*h)*+g[d+460>>2];y=(B*o+A*e+z*h)*+g[d+464>>2];g[b+428+(k*84|0)+48>>2]=G;g[b+428+(k*84|0)+52>>2]=C;g[b+428+(k*84|0)+56>>2]=y;g[b+428+(k*84|0)+60>>2]=0.0;u=(x*-o+w*-e+v*-h)*+g[i+456>>2];q=(t*-o+s*-e+r*-h)*+g[i+460>>2];j=(p*-o+n*-e+f*-h)*+g[i+464>>2];g[b+428+(k*84|0)+64>>2]=u;g[b+428+(k*84|0)+68>>2]=q;g[b+428+(k*84|0)+72>>2]=j;g[b+428+(k*84|0)+76>>2]=0.0;g[b+428+(k*84|0)+80>>2]=(J*o+I*e+H*h)*G+(F*o+E*e+D*h)*C+(B*o+A*e+z*h)*y+((x*-o+w*-e+v*-h)*u+(t*-o+s*-e+r*-h)*q+(p*-o+n*-e+f*-h)*j)}k=k+1|0}while((k|0)!=3);l=m;return}function Ud(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0;i=l;l=l+464|0;c[i+128>>2]=c[d>>2];c[i+128+4>>2]=c[d+4>>2];c[i+128+8>>2]=c[d+8>>2];c[i+128+12>>2]=c[d+12>>2];c[i+128+16>>2]=c[d+16>>2];c[i+128+16+4>>2]=c[d+16+4>>2];c[i+128+16+8>>2]=c[d+16+8>>2];c[i+128+16+12>>2]=c[d+16+12>>2];c[i+128+32>>2]=c[d+32>>2];c[i+128+32+4>>2]=c[d+32+4>>2];c[i+128+32+8>>2]=c[d+32+8>>2];c[i+128+32+12>>2]=c[d+32+12>>2];k=i+128+48|0;c[k>>2]=c[d+48>>2];c[k+4>>2]=c[d+48+4>>2];c[k+8>>2]=c[d+48+8>>2];c[k+12>>2]=c[d+48+12>>2];c[i+64>>2]=c[e>>2];c[i+64+4>>2]=c[e+4>>2];c[i+64+8>>2]=c[e+8>>2];c[i+64+12>>2]=c[e+12>>2];c[i+64+16>>2]=c[e+16>>2];c[i+64+16+4>>2]=c[e+16+4>>2];c[i+64+16+8>>2]=c[e+16+8>>2];c[i+64+16+12>>2]=c[e+16+12>>2];c[i+64+32>>2]=c[e+32>>2];c[i+64+32+4>>2]=c[e+32+4>>2];c[i+64+32+8>>2]=c[e+32+8>>2];c[i+64+32+12>>2]=c[e+32+12>>2];j=i+64+48|0;c[j>>2]=c[e+48>>2];c[j+4>>2]=c[e+48+4>>2];c[j+8>>2]=c[e+48+8>>2];c[j+12>>2]=c[e+48+12>>2];If(i+128|0,i+64|0,i+256|0,i+192|0);t=+g[i+192>>2];m=t*+g[i+256+4>>2];r=t*+g[i+256+8>>2];g[i+16>>2]=+g[i+256>>2]*t;g[i+16+4>>2]=m;g[i+16+8>>2]=r;g[i+16+12>>2]=0.0;c[i+256>>2]=0;c[i+256+4>>2]=0;c[i+256+8>>2]=0;c[i+256+12>>2]=0;c[i+192+48>>2]=0;c[i+192+48+4>>2]=0;c[i+192+48+8>>2]=0;c[i+192+48+12>>2]=0;yh(i+128|0,i);r=+g[i>>2];m=+g[i+4>>2];t=+g[i+8>>2];q=+g[i+12>>2];o=r*(2.0/(r*r+m*m+t*t+q*q));n=m*(2.0/(r*r+m*m+t*t+q*q));p=t*(2.0/(r*r+m*m+t*t+q*q));g[i+192>>2]=1.0-(m*n+t*p);g[i+192+4>>2]=r*n-q*p;g[i+192+8>>2]=r*p+q*n;g[i+192+12>>2]=0.0;g[i+192+16>>2]=r*n+q*p;g[i+192+20>>2]=1.0-(r*o+t*p);g[i+192+24>>2]=m*p-q*o;g[i+192+28>>2]=0.0;g[i+192+32>>2]=r*p-q*n;g[i+192+36>>2]=m*p+q*o;g[i+192+40>>2]=1.0-(r*o+m*n);g[i+192+44>>2]=0.0;kh(b,i+192|0,i+256|0,i+16|0,i+48|0,i+32|0);c[i+256>>2]=6284;c[i+256+36>>2]=c[d>>2];c[i+256+36+4>>2]=c[d+4>>2];c[i+256+36+8>>2]=c[d+8>>2];c[i+256+36+12>>2]=c[d+12>>2];c[i+256+52>>2]=c[d+16>>2];c[i+256+52+4>>2]=c[d+16+4>>2];c[i+256+52+8>>2]=c[d+16+8>>2];c[i+256+52+12>>2]=c[d+16+12>>2];c[i+256+68>>2]=c[d+32>>2];c[i+256+68+4>>2]=c[d+32+4>>2];c[i+256+68+8>>2]=c[d+32+8>>2];c[i+256+68+12>>2]=c[d+32+12>>2];s=i+256+84|0;c[s>>2]=c[d+48>>2];c[s+4>>2]=c[d+48+4>>2];c[s+8>>2]=c[d+48+8>>2];c[s+12>>2]=c[d+48+12>>2];c[i+256+100>>2]=c[e>>2];c[i+256+100+4>>2]=c[e+4>>2];c[i+256+100+8>>2]=c[e+8>>2];c[i+256+100+12>>2]=c[e+12>>2];c[i+256+116>>2]=c[e+16>>2];c[i+256+116+4>>2]=c[e+16+4>>2];c[i+256+116+8>>2]=c[e+16+8>>2];c[i+256+116+12>>2]=c[e+16+12>>2];c[i+256+132>>2]=c[e+32>>2];c[i+256+132+4>>2]=c[e+32+4>>2];c[i+256+132+8>>2]=c[e+32+8>>2];c[i+256+132+12>>2]=c[e+32+12>>2];d=i+256+148|0;c[d>>2]=c[e+48>>2];c[d+4>>2]=c[e+48+4>>2];c[d+8>>2]=c[e+48+8>>2];c[d+12>>2]=c[e+48+12>>2];c[i+256+180>>2]=a;c[i+256+184>>2]=f;g[i+256+188>>2]=h;c[i+256+192>>2]=b;n=+g[d>>2]-+g[s>>2];m=+g[i+256+152>>2]-+g[i+256+88>>2];o=+g[i+256+156>>2]-+g[i+256+92>>2];h=1.0/+D(+(n*n+m*m+o*o));r=n*h==0.0?999999984306749440.0:1.0/(n*h);g[i+256+4>>2]=r;q=m*h==0.0?999999984306749440.0:1.0/(m*h);g[i+256+8>>2]=q;p=o*h==0.0?999999984306749440.0:1.0/(o*h);g[i+256+12>>2]=p;c[i+256+20>>2]=r<0.0&1;c[i+256+24>>2]=q<0.0&1;c[i+256+28>>2]=p<0.0&1;g[i+256+32>>2]=o*o*h+(n*n*h+m*m*h);f=c[a+68>>2]|0;$b[c[(c[f>>2]|0)+24>>2]&7](f,k,j,i+256|0,i+48|0,i+32|0);l=i;return}function Vd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=d;g[b+28>>2]=0.0;c[b+32>>2]=0;c[b+36>>2]=1;g[b+40>>2]=1.0;a[b+44>>0]=1;c[b+48>>2]=0;a[b+52>>0]=0;a[b+53>>0]=1;a[b+54>>0]=1;g[b+56>>2]=.03999999910593033;a[b+60>>0]=0;g[b+64>>2]=0.0;c[b+68>>2]=e;c[b+72>>2]=0;a[b+76>>0]=1;c[b+80>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;g[b+92>>2]=.6000000238418579;g[b+96>>2]=1.0;g[b+100>>2]=.30000001192092896;g[b+104>>2]=.01666666753590107;g[b+108>>2]=0.0;g[b+116>>2]=20.0;c[b+112>>2]=10;g[b+124>>2]=.20000000298023224;g[b+128>>2]=.20000000298023224;g[b+132>>2]=0.0;g[b+136>>2]=.20000000298023224;g[b+140>>2]=0.0;g[b+120>>2]=1.0;c[b+144>>2]=1;g[b+148>>2]=-.03999999910593033;g[b+152>>2]=.10000000149011612;g[b+156>>2]=0.0;g[b+160>>2]=.8500000238418579;c[b+164>>2]=260;c[b+168>>2]=2;c[b+172>>2]=128;g[b+176>>2]=100.0;g[b+180>>2]=1000000015047466219876688.0e6;g[b+184>>2]=0.0;g[b+188>>2]=.20000000298023224;c[b>>2]=4360;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+212>>2]=0;c[b+216>>2]=f;a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;c[b+264>>2]=0;c[b+268>>2]=-1054867456;a[b+290>>0]=0;a[b+291>>0]=0;c[b+272>>2]=0;c[b+272+4>>2]=0;c[b+272+8>>2]=0;c[b+272+12>>2]=0;a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;c[b+312>>2]=0;a[b+316>>0]=1;a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;c[b+340>>2]=0;if(!f){c[6995]=(c[6995]|0)+1;e=sc(255)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5052;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;a[e+160>>0]=1;c[e+156>>2]=0;c[e+148>>2]=0;c[e+152>>2]=0;a[e+180>>0]=1;c[e+176>>2]=0;c[e+168>>2]=0;c[e+172>>2]=0;a[e+208>>0]=1;c[e+204>>2]=0;c[e+196>>2]=0;c[e+200>>2]=0;c[e+232>>2]=0;c[e+224>>2]=0;c[e+212>>2]=14;c[e+216>>2]=15;c[e+220>>2]=16;c[b+216>>2]=e;e=1}else e=0;a[b+289>>0]=e;c[6995]=(c[6995]|0)+1;e=sc(87)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5768;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+64>>0]=1;c[b+220>>2]=e;a[b+288>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(107)|0;if(!e){f=0;h=c[b+216>>2]|0;c[f>>2]=4580;e=f+4|0;c[e>>2]=0;e=f+8|0;c[e>>2]=h;e=f+12|0;c[e>>2]=0;e=f+16|0;c[e>>2]=0;e=f+20|0;c[e>>2]=0;e=f+24|0;c[e>>2]=d;d=f+44|0;a[d>>0]=1;d=f+40|0;c[d>>2]=0;d=f+32|0;c[d>>2]=0;d=f+36|0;c[d>>2]=0;d=f+64|0;a[d>>0]=1;d=f+60|0;c[d>>2]=0;d=f+52|0;c[d>>2]=0;d=f+56|0;c[d>>2]=0;d=f+84|0;a[d>>0]=1;d=f+80|0;c[d>>2]=0;d=f+72|0;c[d>>2]=0;d=f+76|0;c[d>>2]=0;c[b+212>>2]=f;return}c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16;e=c[b+216>>2]|0;c[h>>2]=4580;f=h+4|0;c[f>>2]=0;f=h+8|0;c[f>>2]=e;f=h+12|0;c[f>>2]=0;f=h+16|0;c[f>>2]=0;f=h+20|0;c[f>>2]=0;f=h+24|0;c[f>>2]=d;d=h+44|0;a[d>>0]=1;d=h+40|0;c[d>>2]=0;d=h+32|0;c[d>>2]=0;d=h+36|0;c[d>>2]=0;d=h+64|0;a[d>>0]=1;d=h+60|0;c[d>>2]=0;d=h+52|0;c[d>>2]=0;d=h+56|0;c[d>>2]=0;d=h+84|0;a[d>>0]=1;d=h+80|0;c[d>>2]=0;d=h+72|0;c[d>>2]=0;d=h+76|0;c[d>>2]=0;c[b+212>>2]=h;return}function Wd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0;C=l;l=l+272|0;z=+g[e+48>>2]-+g[d+48>>2];A=+g[e+52>>2]-+g[d+52>>2];B=+g[e+56>>2]-+g[d+56>>2];If(d,e,C+256|0,C+208|0);v=+g[C+208>>2];t=+g[C+256>>2]*v;u=v*+g[C+256+4>>2];v=v*+g[C+256+8>>2];g[C+192>>2]=t;g[C+192+4>>2]=u;g[C+192+8>>2]=v;g[C+192+12>>2]=0.0;w=+g[h+48>>2]-+g[f+48>>2];x=+g[h+52>>2]-+g[f+52>>2];y=+g[h+56>>2]-+g[f+56>>2];If(f,h,C+256|0,C+208|0);r=+g[C+208>>2];p=+g[C+256>>2]*r;q=r*+g[C+256+4>>2];r=r*+g[C+256+8>>2];g[C+176>>2]=p;g[C+176+4>>2]=q;g[C+176+8>>2]=r;g[C+176+12>>2]=0.0;e=c[b+12>>2]|0;s=+nb[c[(c[e>>2]|0)+16>>2]&15](e);e=c[b+16>>2]|0;if(!e)m=0.0;else m=+nb[c[(c[e>>2]|0)+16>>2]&15](e);s=s*+D(+(t*t+u*u+v*v))+m*+D(+(p*p+q*q+r*r));if(s+ +D(+((w-z)*(w-z)+(x-A)*(x-A)+(y-B)*(y-B)))==0.0){i=0;l=C;return i|0}c[C+208>>2]=9504;g[C+208+36>>2]=999999984306749440.0;a[C+208+40>>0]=0;Jd(b,d,f,C+208|0);h=(a[C+208+40>>0]|0)==0;c[C+256>>2]=c[C+208+20>>2];c[C+256+4>>2]=c[C+208+20+4>>2];c[C+256+8>>2]=c[C+208+20+8>>2];c[C+256+12>>2]=c[C+208+20+12>>2];a:do if(!h?(o=c[C+208+4>>2]|0,k=c[C+208+8>>2]|0,n=c[C+208+12>>2]|0,v=(w-z)*(c[j>>2]=o,+g[j>>2]),v=v+(x-A)*(c[j>>2]=k,+g[j>>2]),!(s+(v+(y-B)*(c[j>>2]=n,+g[j>>2]))<=1.1920928955078125e-07)):0){m=+g[C+208+16>>2];p=+g[C+208+36>>2]+ +g[i+172>>2];b:do if(p>1.0000000474974513e-03){h=0;q=0.0;r=p;while(1){e=c[i+168>>2]|0;if(e|0){E=c[(c[e>>2]|0)+28>>2]|0;c[C+112>>2]=1065353216;c[C+112+4>>2]=1065353216;c[C+112+8>>2]=1065353216;g[C+112+12>>2]=0.0;Qb[E&7](e,C+256|0,.20000000298023224,C+112|0)}m=(w-z)*(c[j>>2]=o,+g[j>>2]);m=m+(x-A)*(c[j>>2]=k,+g[j>>2]);m=s+(m+(y-B)*(c[j>>2]=n,+g[j>>2]));if(m<=1.1920928955078125e-07){k=0;break a}p=q+r/m;if(!(!(p<=q)&(!(p<0.0)&!(p>1.0)))){k=0;break a}Af(d,z,A,B,C+192|0,p,C+112|0);Af(f,w,x,y,C+176|0,p,C+48|0);k=c[i+168>>2]|0;if(k|0){E=c[(c[k>>2]|0)+28>>2]|0;c[C>>2]=1065353216;c[C+4>>2]=0;c[C+8>>2]=0;g[C+12>>2]=0.0;Qb[E&7](k,C+112+48|0,.20000000298023224,C)}Jb[c[c[i>>2]>>2]&31](i,p);c[C>>2]=9504;g[C+36>>2]=999999984306749440.0;a[C+40>>0]=0;Jd(b,C+112|0,C+48|0,C);if(!(a[C+40>>0]|0)){k=15;break}m=+g[C+36>>2];q=+g[i+172>>2];c[C+256>>2]=c[C+20>>2];c[C+256+4>>2]=c[C+20+4>>2];c[C+256+8>>2]=c[C+20+8>>2];c[C+256+12>>2]=c[C+20+12>>2];e=h+1|0;if((h|0)>63){k=16;break}n=c[C+12>>2]|0;k=c[C+8>>2]|0;o=c[C+4>>2]|0;r=m+q;if(!(r>1.0000000474974513e-03)){m=+g[C+16>>2];break b}else{h=e;q=p}}if((k|0)==15)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-1,h);else if((k|0)==16)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-2,e);k=0;break a}else p=0.0;while(0);g[i+164>>2]=p;c[i+132>>2]=o;c[i+136>>2]=k;c[i+140>>2]=n;g[i+144>>2]=m;c[i+148>>2]=c[C+256>>2];c[i+148+4>>2]=c[C+256+4>>2];c[i+148+8>>2]=c[C+256+8>>2];c[i+148+12>>2]=c[C+256+12>>2];k=1}else k=0;while(0);E=k;l=C;return E|0}function Xd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0;F=l;l=l+32|0;A=+g[b+48>>2]-+g[b+112>>2];h=+g[b+52>>2]-+g[b+116>>2];E=+g[b+56>>2]-+g[b+120>>2];B=A*+g[b+64>>2]+h*+g[b+80>>2]+E*+g[b+96>>2];C=A*+g[b+68>>2]+h*+g[b+84>>2]+E*+g[b+100>>2];E=A*+g[b+72>>2]+h*+g[b+88>>2]+E*+g[b+104>>2];e=c[a+8>>2]|0;z=c[a+4>>2]|0;h=+g[z+32>>2]*+g[z+16>>2];A=h+ +g[a+12>>2];p=+g[e+76>>2];q=+g[e+60>>2];r=+g[e+80>>2];s=+g[e+64>>2];t=+g[e+84>>2];u=+g[e+68>>2];v=+g[e+92>>2];w=+g[e+96>>2];x=+g[e+100>>2];j=(r-s)*(x-u)-(t-u)*(w-s);k=(t-u)*(v-q)-(p-q)*(x-u);o=(p-q)*(w-s)-(r-s)*(v-q);if(!(o*o+(j*j+k*k)>=1.4210854715202004e-14)){l=F;return}n=1.0/+D(+(o*o+(j*j+k*k)));i=(B-q)*j*n+k*n*(C-s)+o*n*(E-u);if(i<0.0){i=-i;m=-(j*n);j=-(k*n);k=-(o*n)}else{m=j*n;j=k*n;k=o*n}if(!(i0.0&(o>0.0&y>0.0)|x<=0.0&(o<=0.0&y<=0.0))){if((xb[c[(c[e>>2]|0)+100>>2]&127](e)|0)<=0){l=F;return}e=0;z=0;o=0.0;n=0.0;i=0.0;do{G=c[a+8>>2]|0;Vb[c[(c[G>>2]|0)+104>>2]&127](G,z,F+16|0,F);s=+g[F+16>>2];x=+g[F+16+4>>2];u=+g[F+16+8>>2];t=+g[F>>2]-s;y=+g[F+4>>2]-x;v=+g[F+8>>2]-u;do if((B-s)*t+(C-x)*y+(E-u)*v>0.0)if((B-s)*t+(C-x)*y+(E-u)*v>2]|0}while((z|0)<(xb[c[(c[G>>2]|0)+100>>2]&127](G)|0));if(!(e&1)){l=F;return}else{p=A*A;s=o;r=n;q=i}}else{p=A*A;s=B-i*m;r=E-i*k;q=C-i*j}n=B-s;o=C-q;i=E-r;if(!(n*n+o*o+i*i1.1920928955078125e-07){j=+D(+(n*n+o*o+i*i));h=h-j;m=n*(1.0/j);k=i*(1.0/j);j=o*(1.0/j)}i=-h;h=+g[b+64>>2];if(f){y=+g[b+68>>2];A=+g[b+72>>2];B=h*m+y*j+A*k;p=+g[b+80>>2];t=+g[b+84>>2];u=+g[b+88>>2];C=m*p+j*t+k*u;v=+g[b+96>>2];w=+g[b+100>>2];x=+g[b+104>>2];E=m*v+j*w+k*x;g[F+16>>2]=-B;g[F+16+4>>2]=-C;g[F+16+8>>2]=-E;g[F+16+12>>2]=0.0;C=s*p+q*t+r*u+ +g[b+116>>2]+C*i;E=s*v+q*w+r*x+ +g[b+120>>2]+E*i;g[F>>2]=s*h+q*y+r*A+ +g[b+112>>2]+B*i;g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[c[(c[d>>2]|0)+16>>2]&15](d,F+16|0,F,i);l=F;return}else{G=c[(c[d>>2]|0)+16>>2]|0;A=+g[b+68>>2];B=+g[b+72>>2];v=+g[b+80>>2];w=+g[b+84>>2];C=+g[b+88>>2];x=+g[b+96>>2];y=+g[b+100>>2];E=+g[b+104>>2];g[F+16>>2]=h*m+A*j+B*k;g[F+16+4>>2]=m*v+j*w+k*C;g[F+16+8>>2]=m*x+j*y+k*E;g[F+16+12>>2]=0.0;C=s*v+q*w+r*C+ +g[b+116>>2];E=s*x+q*y+r*E+ +g[b+120>>2];g[F>>2]=s*h+q*A+r*B+ +g[b+112>>2];g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[G&15](d,F+16|0,F,i);l=F;return}}function Yd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;i=l;l=l+16|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;ef(23152,0.0,0,0,i)}c[5839]=c[5839]|1;g[5889]=0.0;j=+g[5899]*0.0;k=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=j;g[5896]=k;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;k=+g[5891]*0.0;j=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=k;g[5945]=j;g[5946]=0.0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=23152;c[b+32>>2]=d;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+112>>2]=c[e>>2];c[b+112+4>>2]=c[e+4>>2];c[b+112+8>>2]=c[e+8>>2];c[b+112+12>>2]=c[e+12>>2];c[b+128>>2]=c[e+16>>2];c[b+128+4>>2]=c[e+16+4>>2];c[b+128+8>>2]=c[e+16+8>>2];c[b+128+12>>2]=c[e+16+12>>2];c[b+144>>2]=c[e+32>>2];c[b+144+4>>2]=c[e+32+4>>2];c[b+144+8>>2]=c[e+32+8>>2];c[b+144+12>>2]=c[e+32+12>>2];c[b+160>>2]=c[e+48>>2];c[b+160+4>>2]=c[e+48+4>>2];c[b+160+8>>2]=c[e+48+8>>2];c[b+160+12>>2]=c[e+48+12>>2];e=b+680|0;h=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=f&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;y=+g[b+112>>2];E=+g[d+4>>2];x=+g[b+128>>2];D=+g[d+8>>2];w=+g[b+144>>2];C=+g[d+12>>2];v=+g[b+116>>2];u=+g[b+132>>2];t=+g[b+148>>2];s=+g[b+120>>2];q=+g[b+136>>2];o=+g[b+152>>2];B=+g[d+20>>2];A=+g[d+24>>2];z=+g[d+28>>2];r=+g[d+36>>2];p=+g[d+40>>2];n=+g[d+44>>2];G=+g[b+160>>2];F=+g[b+164>>2];k=+g[b+168>>2];m=+g[d+52>>2]+(E*G+D*F+C*k);j=B*G+A*F+z*k+ +g[d+56>>2];k=r*G+p*F+n*k+ +g[d+60>>2];g[b+48>>2]=y*E+x*D+w*C;g[b+52>>2]=E*v+D*u+C*t;g[b+56>>2]=E*s+D*q+C*o;g[b+60>>2]=0.0;g[b+64>>2]=y*B+x*A+w*z;g[b+68>>2]=v*B+u*A+t*z;g[b+72>>2]=s*B+q*A+o*z;g[b+76>>2]=0.0;g[b+80>>2]=y*r+x*p+w*n;g[b+84>>2]=v*r+u*p+t*n;g[b+88>>2]=s*r+q*p+o*n;g[b+92>>2]=0.0;g[b+96>>2]=m;g[b+100>>2]=j;g[b+104>>2]=k;g[b+108>>2]=0.0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);l=i;return}function Zd(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+288|0;c[w+208>>2]=c[d>>2];c[w+208+4>>2]=c[d+4>>2];c[w+208+8>>2]=c[d+8>>2];c[w+208+12>>2]=c[d+12>>2];o=w+208+16|0;c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];e=w+208+32|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];v=c[j>>2]|0;q=c[j+4>>2]|0;r=c[j+8>>2]|0;s=c[j+16>>2]|0;t=c[j+12>>2]|0;p=c[j+20>>2]|0;c[w+156>>2]=c[w+208>>2];c[w+156+4>>2]=c[w+208+4>>2];c[w+156+8>>2]=c[w+208+8>>2];c[w+156+12>>2]=c[w+208+12>>2];c[w+172>>2]=c[o>>2];c[w+172+4>>2]=c[o+4>>2];c[w+172+8>>2]=c[o+8>>2];c[w+172+12>>2]=c[o+12>>2];c[w+188>>2]=c[e>>2];c[w+188+4>>2]=c[e+4>>2];c[w+188+8>>2]=c[e+8>>2];c[w+188+12>>2]=c[e+12>>2];e=c[b+128>>2]|0;if((e|0)==(c[b+132>>2]|0)?(u=e|0?e<<1:1,(e|0)<(u|0)):0){if(!u)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((u*284|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+128>>2]|0}if((e|0)>0){f=0;do{j=c[b+136>>2]|0;m=d+(f*284|0)|0;n=j+(f*284|0)|0;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(f*284|0)+92|0;n=j+(f*284|0)+92|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=j+(f*284|0)+108|0;n=d+(f*284|0)+108|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=j+(f*284|0)+124|0;m=d+(f*284|0)+124|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+140|0;n=j+(f*284|0)+140|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+156|0;n=j+(f*284|0)+156|0;o=m+128|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));f=f+1|0}while((f|0)!=(e|0))}e=c[b+136>>2]|0;if(e|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=d;c[b+132>>2]=u;e=c[b+128>>2]|0}d=c[b+136>>2]|0;m=d+(e*284|0)|0;n=w;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(e*284|0)+92|0;c[m>>2]=c[w+92>>2];c[m+4>>2]=c[w+92+4>>2];c[m+8>>2]=c[w+92+8>>2];c[m+12>>2]=c[w+92+12>>2];m=d+(e*284|0)+108|0;c[m>>2]=c[w+108>>2];c[m+4>>2]=c[w+108+4>>2];c[m+8>>2]=c[w+108+8>>2];c[m+12>>2]=c[w+108+12>>2];m=d+(e*284|0)+124|0;c[m>>2]=c[w+124>>2];c[m+4>>2]=c[w+124+4>>2];c[m+8>>2]=c[w+124+8>>2];c[m+12>>2]=c[w+124+12>>2];m=d+(e*284|0)+140|0;c[m>>2]=c[w+140>>2];c[m+4>>2]=c[w+140+4>>2];c[m+8>>2]=c[w+140+8>>2];c[m+12>>2]=c[w+140+12>>2];d=d+(e*284|0)+156|0;m=d;n=w+156|0;o=m+48|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));g[d+48>>2]=h;c[d+52>>2]=t;g[d+56>>2]=i;c[d+60>>2]=v;c[d+64>>2]=q;c[d+68>>2]=r;c[d+72>>2]=s;g[d+76>>2]=0.0;g[d+80>>2]=0.0;g[d+84>>2]=0.0;g[d+88>>2]=.10000000149011612;c[d+92>>2]=p;g[d+96>>2]=0.0;g[d+100>>2]=0.0;a[d+104>>0]=k&1;m=d+105|0;n=w+256|0;o=m+23|0;do{a[m>>0]=a[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));k=c[b+128>>2]|0;c[b+128>>2]=k+1;k=(c[b+136>>2]|0)+(k*284|0)|0;Tg(c[b+108>>2]|0,k,0);xe(c[b+108>>2]|0,c[b+136>>2]|0,(c[b+128>>2]|0)+-1|0,0);l=w;return k|0}function _d(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((h|0)<0){o=c[b+8>>2]|0;+wb[c[(c[o>>2]|0)+12>>2]&3](o,d,e,f,g,c[b+12>>2]|0,c[b+16>>2]|0,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);return}l=c[b+16>>2]|0;a:do if((l|0)>0){j=c[b+12>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=c[k>>2]|0;n=c[o+28>>2]|0;if((c[((c[n+208>>2]|0)>-1?n:c[o+32>>2]|0)+208>>2]|0)==(h|0)){o=k;break a}i=i+1|0;if((i|0)>=(l|0)){o=0;break}}}else{i=0;o=0}while(0);if((i|0)<(l|0)){k=c[b+12>>2]|0;j=0;do{n=c[k+(i<<2)>>2]|0;m=c[n+28>>2]|0;j=((c[((c[m+208>>2]|0)>-1?m:c[n+32>>2]|0)+208>>2]|0)==(h|0)&1)+j|0;i=i+1|0}while((i|0)!=(l|0));n=j}else n=0;i=c[b+4>>2]|0;if((c[i+80>>2]|0)<2){m=c[b+8>>2]|0;+wb[c[(c[m>>2]|0)+12>>2]&3](m,d,e,f,g,o,n,i,c[b+20>>2]|0,c[b+24>>2]|0);return}if((e|0)>0){l=0;i=c[b+32>>2]|0;j=c[b+36>>2]|0;do{m=d+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+32>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+40>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+40>>2]|0;if(k){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+32>>2]|0}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=i;c[b+36>>2]=h;i=j;j=h}else i=j}c[(c[b+40>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+32>>2]=i;l=l+1|0}while((l|0)!=(e|0))}if((g|0)>0){l=0;i=c[b+52>>2]|0;j=c[b+56>>2]|0;do{m=f+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+52>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+60>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+60>>2]|0;if(k){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+52>>2]|0}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=i;c[b+56>>2]=h;i=j;j=h}else i=j}c[(c[b+60>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+52>>2]=i;l=l+1|0}while((l|0)!=(g|0))}if((n|0)>0){m=0;i=c[b+72>>2]|0;j=c[b+76>>2]|0;do{l=o+(m<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h){k=0;i=j}else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=i;i=c[b+72>>2]|0}if((i|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+80>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[b+80>>2]|0;if(j){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[b+72>>2]|0}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=k;c[b+76>>2]=h;j=h}else i=j}c[(c[b+80>>2]|0)+(i<<2)>>2]=c[l>>2];i=i+1|0;c[b+72>>2]=i;m=m+1|0}while((m|0)!=(n|0))}else i=c[b+72>>2]|0;if(((c[b+52>>2]|0)+i|0)<=(c[(c[b+4>>2]|0)+80>>2]|0))return;gh(b);return}function $d(d,f,h,i){d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;w=l;l=l+80|0;v=c[d+52>>2]|0;c[w>>2]=7212;c[w+4>>2]=v;c[w+8>>2]=f;c[w+60>>2]=0;v=c[d+56>>2]|0;if(!(a[v+60>>0]|0)){f=c[v+56>>2]|0;if((f|0)>0){p=0;d=0;m=c[v+96>>2]|0;while(1){d=d+1|0;if(!(+g[h>>2]>+g[m+16>>2])?!(+g[i>>2]<+g[m>>2]):0)j=1;else j=0;if(!(!(+g[h+8>>2]>+g[m+24>>2])?!(+g[i+8>>2]<+g[m+8>>2]):0))j=0;if(!(+g[h+4>>2]>+g[m+20>>2])?!(+g[i+4>>2]<+g[m+4>>2]):0){k=c[m+32>>2]|0;if(j&(k|0)==-1){Sb[c[(c[w>>2]|0)+8>>2]&127](w,c[m+36>>2]|0,c[m+40>>2]|0);f=c[v+56>>2]|0;o=43}else{n=(k|0)==-1;o=42}}else{k=c[m+32>>2]|0;n=(k|0)==-1;j=0;o=42}if((o|0)==42){o=0;if(n|j)o=43;else{m=m+(k<<6)|0;j=k+p|0}}if((o|0)==43){m=m+64|0;j=p+1|0}if((j|0)<(f|0))p=j;else break}}else d=0;if((c[6160]|0)>=(d|0)){l=w;return}c[6160]=d;l=w;return}z=+g[h>>2];D=+g[h+4>>2];H=+g[h+8>>2];G=+g[v+4>>2];z=z>2];D=D>2];H=H>2];E=+g[v+24>>2];A=+g[v+28>>2];F=+g[v+36>>2];B=+g[v+40>>2];x=+g[v+44>>2];s=~~(((I>1]=s;t=~~(((E>1]=t;b[w+70+4>>1]=u;H=+g[i>>2];D=+g[i+4>>2];z=+g[i+8>>2];H=H>1]=i;q=~~(((E>1]=q;b[w+64+4>>1]=r;switch(c[v+144>>2]|0){case 0:{o=c[v+56>>2]|0;if((o|0)>0){d=0;f=c[v+136>>2]|0;j=0;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{v=c[m>>2]|0;j=j-v|0;f=f+(0-v<<4)|0}}while((j|0)<(o|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d;break}case 1:{if((c[v+152>>2]|0)>0){h=0;do{d=c[v+160>>2]|0;if(((i&65535)>=(e[d+(h<<5)>>1]|0)?(s&65535)<=(e[d+(h<<5)+6>>1]|0):0)&(u&65535)<=(e[d+(h<<5)+10>>1]|0)&(r&65535)>=(e[d+(h<<5)+4>>1]|0)&(t&65535)<=(e[d+(h<<5)+8>>1]|0)&(q&65535)>=(e[d+(h<<5)+2>>1]|0)){p=c[d+(h<<5)+12>>2]|0;o=c[d+(h<<5)+16>>2]|0;if((o|0)>0){d=0;f=(c[v+136>>2]|0)+(p<<4)|0;j=p;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{n=c[m>>2]|0;j=j-n|0;f=f+(0-n<<4)|0}}while((j|0)<(o+p|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d}h=h+1|0}while((h|0)<(c[v+152>>2]|0))}break}case 2:{Ek(c[v+136>>2]|0,w,w+70|0,w+64|0);break}default:{}}l=w;return}function ae(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0;x=l;l=l+192|0;w=c[a+4>>2]|0;o=+g[w+784>>2];if(o>2]|0;i=(c[a+8>>2]|0)+8|0;v=c[i>>2]|0;E=+g[d>>2];j=+g[b>>2]*e+E;B=+g[d+4>>2];m=+g[b+4>>2]*e+B;y=+g[d+8>>2];n=+g[b+8>>2]*e+y;k=(c[a+12>>2]|0)+8|0;f=c[k>>2]|0;t=(u|0)!=(v|0)?f:u;f=(u|0)!=(v|0)?v:f;z=j-+g[t+52>>2];A=m-+g[t+56>>2];r=n-+g[t+60>>2];p=z*+g[t+4>>2]+A*+g[t+20>>2]+r*+g[t+36>>2];q=z*+g[t+8>>2]+A*+g[t+24>>2]+r*+g[t+40>>2];r=z*+g[t+12>>2]+A*+g[t+28>>2]+r*+g[t+44>>2];E=E-+g[f+52>>2];B=B-+g[f+56>>2];y=y-+g[f+60>>2];A=E*+g[f+4>>2]+B*+g[f+20>>2]+y*+g[f+36>>2];z=E*+g[f+8>>2]+B*+g[f+24>>2]+y*+g[f+40>>2];y=E*+g[f+12>>2]+B*+g[f+28>>2]+y*+g[f+44>>2];g[x>>2]=p;g[x+4>>2]=q;g[x+8>>2]=r;g[x+12>>2]=0.0;g[x+16>>2]=A;g[x+20>>2]=z;g[x+24>>2]=y;g[x+28>>2]=0.0;c[x+64>>2]=c[b>>2];c[x+64+4>>2]=c[b+4>>2];c[x+64+8>>2]=c[b+8>>2];c[x+64+12>>2]=c[b+12>>2];g[x+80>>2]=e;c[x+84>>2]=0;c[x+84+4>>2]=0;c[x+84+8>>2]=0;c[x+84+12>>2]=0;b=x+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[x+48>>2]=j;g[x+52>>2]=m;g[x+56>>2]=n;g[x+60>>2]=0.0;c[x+32>>2]=c[d>>2];c[x+32+4>>2]=c[d+4>>2];c[x+32+8>>2]=c[d+8>>2];c[x+32+12>>2]=c[d+12>>2];h=c[w+780>>2]|0;if((h|0)>0){b=-1;d=0;e=o*o;while(1){j=+g[w+4+(d*192|0)>>2]-p;m=+g[w+4+(d*192|0)+4>>2]-q;n=+g[w+4+(d*192|0)+8>>2]-r;f=j*j+m*m+n*n>2]|0;f=c[k>>2]|0;E=+g[b+228>>2];B=+g[f+228>>2];A=E*B<-10.0?-10.0:E*B;g[x+84>>2]=A>10.0?10.0:A;g[x+96>>2]=+g[b+232>>2]*+g[f+232>>2];A=+g[b+236>>2]*B+ +g[f+236>>2]*E;A=A<-10.0?-10.0:A;g[x+88>>2]=A>10.0?10.0:A;E=+g[b+240>>2]*B+ +g[f+240>>2]*E;E=E<-10.0?-10.0:E;g[x+92>>2]=E>10.0?10.0:E;d=c[b+204>>2]|0;if((d&128|0)==0?(c[f+204>>2]&128|0)==0:0)b=0;else{g[x+148>>2]=+g[b+244>>2]+ +g[f+244>>2];g[x+144>>2]=1.0/(1.0/+g[b+248>>2]+1.0/+g[f+248>>2]);c[x+120>>2]=8;b=8}if((d&512|0)==0?(c[f+204>>2]&512|0)==0:0)s=b;else{s=b|16;c[x+120>>2]=s}e=+g[x+72>>2];k=+C(+e)>.7071067690849304;n=+g[x+68>>2];if(k){m=1.0/+D(+(e*e+n*n));q=+g[x+64>>2];o=-(m*e);p=q*-(m*e);q=-(m*n*q);j=(e*e+n*n)*m;m=m*n;e=0.0}else{j=+g[x+64>>2];E=1.0/+D(+(j*j+n*n));o=E*j;p=(j*j+n*n)*E;q=e*-(n*E);j=-(E*j*e);m=0.0;e=-(n*E)}g[x+160>>2]=e;g[x+164>>2]=o;g[x+168>>2]=m;g[x+176>>2]=j;g[x+180>>2]=q;g[x+184>>2]=p;f=c[a+16>>2]|0;b=c[a+20>>2]|0;if((u|0)!=(v|0)){c[x+100>>2]=b;d=a+28|0;b=a+24|0}else{c[x+100>>2]=f;d=a+24|0;f=b;b=a+28|0}a=c[d>>2]|0;c[x+104>>2]=f;c[x+108>>2]=a;c[x+112>>2]=c[b>>2];if((t|0)>-1){b=w+4+(t*192|0)|0;f=w+4+(t*192|0)+156|0;d=c[f>>2]|0;h=w+4+(t*192|0)+124|0;e=+g[h>>2];i=w+4+(t*192|0)+128|0;j=+g[i>>2];k=w+4+(t*192|0)+132|0;m=+g[k>>2];if(!((s&16|0)!=0?(E=e*+g[w+4+(t*192|0)+84>>2]+0.0,!(j*j+m*m>E*E)):0)){w=w+4+(t*192|0)+116|0;a=c[w>>2]|0;gi(b|0,x|0,192)|0;c[w>>2]=a;g[h>>2]=e;g[i>>2]=j;g[k>>2]=m}c[f>>2]=d}else kf(w,x)|0;l=x;return}function be(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+172>>2];t=+g[f+340>>2];p=+g[b+168>>2];n=+g[b+164>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+172>>2];p=+g[f+396>>2];q=+g[b+168>>2];n=+g[b+164>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}p=k+d;r=o+j;q=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){k=0.0;n=0.0;m=0.0;d=0.0;j=0.0;o=0.0}else{t=+g[f+336>>2];j=+g[b+188>>2];w=+g[f+340>>2];v=+g[b+184>>2];o=+g[b+180>>2];u=+g[f+332>>2];k=+g[f+316>>2];n=+g[f+320>>2];m=+g[f+324>>2];d=t*j-w*v;j=w*o-j*u;o=v*u-t*o}}else{w=+g[f+392>>2];j=+g[b+188>>2];t=+g[f+396>>2];u=+g[b+184>>2];o=+g[b+180>>2];v=+g[f+388>>2];k=+g[f+372>>2];n=+g[f+376>>2];m=+g[f+380>>2];d=w*j-t*u;j=t*o-j*v;o=u*v-w*o}p=p-(k+d);n=r-(n+j);d=q-(m+o);j=+g[b+196>>2];k=+g[b+200>>2];m=+g[b+204>>2];a[s+36+32>>0]=1;c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;c[s+36>>2]=c[b+72>>2];c[s+36+4>>2]=c[b+72+4>>2];c[s+36+8>>2]=c[b+72+8>>2];c[s+36+12>>2]=c[b+72+12>>2];if(j*p+n*k+d*m<0.0){u=+g[b+212>>2];v=+g[s+36>>2]+((j*p+n*k+d*m)*j+(p-(j*p+n*k+d*m)*j)*u);g[s+36>>2]=v;w=(j*p+n*k+d*m)*k+u*(n-(j*p+n*k+d*m)*k)+ +g[s+36+4>>2];g[s+36+4>>2]=w;k=(j*p+n*k+d*m)*m+u*(d-(j*p+n*k+d*m)*m)+ +g[s+36+8>>2];g[s+36+8>>2]=k;f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=v;j=w}else{f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=+g[s+36>>2];j=+g[s+36+4>>2];k=+g[s+36+8>>2]}m=(+g[b+104>>2]*d+ +g[b+108>>2]*j+ +g[b+112>>2]*k)*e;n=(d*+g[b+120>>2]+j*+g[b+124>>2]+k*+g[b+128>>2])*e;d=(d*+g[b+136>>2]+j*+g[b+140>>2]+k*+g[b+144>>2])*e;g[i>>2]=m;g[f>>2]=n;g[h>>2]=d;g[s+36+12>>2]=0.0;f=c[b+4>>2]|0;if((f|0)!=(c[b+16>>2]|0)){f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+164|0);Nh(b+16|0,s+36|0,b+180|0);l=s;return}if(!(m==m&n==n&(d==d&0.0==0.0))){l=s;return}w=+D(+(m*m+n*n+d*d));if(w<+g[f+368>>2]){l=s;return}h=c[s+36+32>>2]|0;w=+g[f+372>>2];g[s+12>>2]=0.0;g[s+28>>2]=0.0;c[s+32>>2]=h;g[s>>2]=-(m*w);g[s+4>>2]=-(n*w);g[s+8>>2]=-(d*w);g[s+16>>2]=w*-0.0;g[s+20>>2]=w*-0.0;g[s+24>>2]=w*-0.0;Nh(b+4|0,s,b+164|0);d=+g[(c[b+4>>2]|0)+372>>2];f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));g[s>>2]=d*+g[s>>2];g[s+4>>2]=d*+g[s+4>>2];g[s+8>>2]=d*+g[s+8>>2];g[s+16>>2]=d*+g[s+16>>2];g[s+20>>2]=d*+g[s+20>>2];g[s+24>>2]=d*+g[s+24>>2];Nh(b+16|0,s,b+180|0);l=s;return}function ce(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[b>>2]=5536;k=(c[d+20>>2]|0)==0;c[6995]=(c[6995]|0)+1;e=sc(23)|0;c[(e+4+15&-16)+-4>>2]=e;c[(e+4+15&-16)>>2]=k?9416:9464;c[b+24>>2]=e+4+15&-16;c[6995]=(c[6995]|0)+1;e=sc(39)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}k=c[b+24>>2]|0;a[e+4>>0]=0;c[e>>2]=6380;c[e+12>>2]=0;c[e+16>>2]=3;c[e+8>>2]=k;c[b+28>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5568;c[b+32>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5588;c[b+36>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5608;c[b+40>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5628;c[b+44>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5648;c[b+48>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5668;c[b+52>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5688;c[b+56>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5708;c[b+72>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5708;c[b+76>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5728;c[b+68>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+84>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+80>>2]=e;a[e+4>>0]=1;k=c[d+16>>2]|0;k=(k|0)>80?k:80;e=c[d>>2]|0;if(!e){a[b+12>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+8>>2]|0;c[j>>2]=804;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*804|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+8>>2]=j}else{a[b+12>>0]=0;c[b+8>>2]=e}g=(k|0)>116?k+16&-16:128;e=c[d+4>>2]|0;if(e|0){a[b+20>>0]=0;c[b+16>>2]=e;return}a[b+20>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+12>>2]|0;c[j>>2]=g;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;e=P(e,g)|0;c[6995]=(c[6995]|0)+1;e=sc((e|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+16>>2]=j;return}function de(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+48|0;c[s+16>>2]=c[e>>2];c[s+16+4>>2]=c[e+4>>2];c[s+16+8>>2]=c[e+8>>2];c[s+16+12>>2]=c[e+12>>2];c[s+16+16>>2]=c[f>>2];c[s+16+16+4>>2]=c[f+4>>2];c[s+16+16+8>>2]=c[f+8>>2];c[s+16+16+12>>2]=c[f+12>>2];do if((c[d+60>>2]|0)==2){h=c[d+48>>2]|0;Ag(b+44|0,h)|0;i=c[b+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+48>>2]=h;c[b+56>>2]=(c[b+56>>2]|0)+-1;h=c[b+8>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+8>>2]=0;c[h+32>>2]=0;c[h+36>>2]=d;c[h+40>>2]=0;c[h>>2]=c[s+16>>2];c[h+4>>2]=c[s+16+4>>2];c[h+8>>2]=c[s+16+8>>2];c[h+12>>2]=c[s+16+12>>2];c[h+16>>2]=c[s+16+16>>2];c[h+20>>2]=c[s+16+20>>2];c[h+24>>2]=c[s+16+24>>2];c[h+28>>2]=c[s+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,h);c[b+16>>2]=(c[b+16>>2]|0)+1;c[d+48>>2]=h;h=1}else{c[b+128>>2]=(c[b+128>>2]|0)+1;r=c[d+48>>2]|0;if(((((+g[r>>2]<=+g[s+16+16>>2]?+g[r+16>>2]>=+g[s+16>>2]:0)?+g[r+4>>2]<=+g[s+16+20>>2]:0)?+g[r+20>>2]>=+g[s+16+4>>2]:0)?+g[r+8>>2]<=+g[s+16+24>>2]:0)?+g[r+24>>2]>=+g[s+16+8>>2]:0){k=+g[d+16>>2];t=+g[e>>2]-k;m=+g[d+20>>2];p=+g[e+4>>2]-m;n=+g[d+24>>2];q=+g[e+8>>2]-n;u=+g[b+100>>2];k=(+g[d+32>>2]-k)*.5*u;m=(+g[d+36>>2]-m)*.5*u;n=u*(+g[d+40>>2]-n)*.5;g[s>>2]=k;g[s+4>>2]=m;g[s+8>>2]=n;g[s+12>>2]=0.0;if(t<0.0)g[s>>2]=-k;if(p<0.0)g[s+4>>2]=-m;if(q<0.0)g[s+8>>2]=-n;if(uh(b+4|0,r,s+16|0,s,.05000000074505806)|0){c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}else h=0;break}h=Ag(b+4|0,r)|0;a:do if(h){o=c[b+12>>2]|0;if((o|0)<=-1){h=c[b+4>>2]|0;break}if(o){i=0;while(1){j=c[h+32>>2]|0;i=i+1|0;if(!j)break a;if((i|0)>=(o|0)){h=j;break}else h=j}}}else h=0;while(0);c[r>>2]=c[s+16>>2];c[r+4>>2]=c[s+16+4>>2];c[r+8>>2]=c[s+16+8>>2];c[r+12>>2]=c[s+16+12>>2];c[r+16>>2]=c[s+16+16>>2];c[r+20>>2]=c[s+16+20>>2];c[r+24>>2]=c[s+16+24>>2];c[r+28>>2]=c[s+16+28>>2];Pe(b+4|0,h,r);c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}while(0);i=c[d+52>>2]|0;c[((i|0)==0?b+84+(c[d+60>>2]<<2)|0:i+56|0)>>2]=c[d+56>>2];i=c[d+56>>2]|0;if(i|0)c[i+52>>2]=c[d+52>>2];c[d+16>>2]=c[e>>2];c[d+16+4>>2]=c[e+4>>2];c[d+16+8>>2]=c[e+8>>2];c[d+16+12>>2]=c[e+12>>2];c[d+32>>2]=c[f>>2];c[d+32+4>>2]=c[f+4>>2];c[d+32+8>>2]=c[f+8>>2];c[d+32+12>>2]=c[f+12>>2];i=c[b+104>>2]|0;c[d+60>>2]=i;c[d+52>>2]=0;c[d+56>>2]=c[b+84+(i<<2)>>2];j=c[b+84+(i<<2)>>2]|0;if(j|0)c[j+52>>2]=d;c[b+84+(i<<2)>>2]=d;if(!h){l=s;return}a[b+154>>0]=1;if(a[b+153>>0]|0){l=s;return}c[s>>2]=9248;c[s+4>>2]=b;ne(b+44|0,c[b+44>>2]|0,c[d+48>>2]|0,s);ne(b+4|0,c[b+4>>2]|0,c[d+48>>2]|0,s);l=s;return}function ee(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;D=c[a+772>>2]|0;if((D|0)>0){c[6995]=(c[6995]|0)+1;d=sc((D<<4|3)+16|0)|0;if(!d)h=0;else{c[(d+4+15&-16)+-4>>2]=d;h=d+4+15&-16}Yk(h|0,0,D<<4|0)|0;f=c[a+772>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Yk(d|0,0,f<<2|0)|0;B=d;C=h;A=d;z=h}else{B=0;C=h;A=0;z=h}}else{B=0;C=0;A=0;z=0}y=c[a+1112>>2]|0;if(b){if((y|0)>0){i=c[a+1120>>2]|0;d=0;do{f=c[i+(d<<2)>>2]|0;h=c[f+312>>2]|0;if(h|0){g[f+276>>2]=1.0/+(h|0)*+g[f+276>>2];g[f+280>>2]=1.0/+(h|0)*+g[f+280>>2];g[f+284>>2]=1.0/+(h|0)*+g[f+284>>2];g[f+292>>2]=+g[f+292>>2]*(1.0/+(h|0));g[f+296>>2]=1.0/+(h|0)*+g[f+296>>2];g[f+300>>2]=1.0/+(h|0)*+g[f+300>>2]}d=d+1|0}while((d|0)!=(y|0));i=11}}else i=11;if((i|0)==11?(y|0)>0:0){k=c[a+1120>>2]|0;if(b){f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+312>>2]|0)>0?(w=+g[a+512>>2],r=+g[h+276>>2]*w,s=w*+g[h+280>>2],t=w*+g[h+284>>2],u=w*+g[h+292>>2],v=w*+g[h+296>>2],w=w*+g[h+300>>2],x=c[h+24>>2]|0,(x|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{q=c[i+(d<<2)>>2]|0;p=+g[j+(d<<2)>>2];o=+g[q+8>>2]-+g[h+228>>2];n=+g[q+12>>2]-+g[h+232>>2];m=+g[q+16>>2]-+g[h+236>>2];E=C+(((q-b|0)/104|0)<<4)|0;g[E>>2]=+g[E>>2]+p*(r+(v*m-w*n));E=C+(((q-b|0)/104|0)<<4)+4|0;g[E>>2]=+g[E>>2]+p*(s+(w*o-u*m));E=C+(((q-b|0)/104|0)<<4)+8|0;g[E>>2]=p*(t+(u*n-v*o))+ +g[E>>2];q=B+(((q-b|0)/104|0)<<2)|0;g[q>>2]=p+ +g[q>>2];d=d+1|0}while((d|0)!=(x|0))}f=f+1|0}while((f|0)!=(y|0))}else{f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+308>>2]|0)>0?(p=+g[a+512>>2],e=+g[h+244>>2]*p,l=p*+g[h+248>>2],m=p*+g[h+252>>2],n=p*+g[h+260>>2],o=p*+g[h+264>>2],p=p*+g[h+268>>2],q=c[h+24>>2]|0,(q|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{E=c[i+(d<<2)>>2]|0;w=+g[j+(d<<2)>>2];v=+g[E+8>>2]-+g[h+228>>2];u=+g[E+12>>2]-+g[h+232>>2];t=+g[E+16>>2]-+g[h+236>>2];x=C+(((E-b|0)/104|0)<<4)|0;g[x>>2]=+g[x>>2]+w*(e+(o*t-p*u));x=C+(((E-b|0)/104|0)<<4)+4|0;g[x>>2]=+g[x>>2]+w*(l+(p*v-n*t));x=C+(((E-b|0)/104|0)<<4)+8|0;g[x>>2]=w*(m+(n*u-o*v))+ +g[x>>2];E=B+(((E-b|0)/104|0)<<2)|0;g[E>>2]=w+ +g[E>>2];d=d+1|0}while((d|0)!=(q|0))}f=f+1|0}while((f|0)!=(y|0))}}if((D|0)>0){d=0;do{e=+g[B+(d<<2)>>2];if(e>0.0){v=1.0/e*+g[C+(d<<4)+4>>2];w=1.0/e*+g[C+(d<<4)+8>>2];E=c[a+780>>2]|0;y=E+(d*104|0)+8|0;g[y>>2]=1.0/e*+g[C+(d<<4)>>2]+ +g[y>>2];y=E+(d*104|0)+12|0;g[y>>2]=v+ +g[y>>2];E=E+(d*104|0)+16|0;g[E>>2]=w+ +g[E>>2]}d=d+1|0}while((d|0)!=(D|0))}if(!((B|0)==0|(A|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[A+-4>>2]|0)}if((C|0)==0|(z|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[z+-4>>2]|0);return}function fe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;p=l;l=l+144|0;if((c[a+20>>2]|0)<=0){o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}j=p+16+16|0;k=p+16+32|0;m=p+16+48|0;i=0;do{o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[p+16>>2]=c[n>>2];c[p+16+4>>2]=c[n+4>>2];c[p+16+8>>2]=c[n+8>>2];c[p+16+12>>2]=c[n+12>>2];n=o+(i*80|0)+16|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];n=o+(i*80|0)+32|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];n=o+(i*80|0)+48|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];o=c[o+(i*80|0)+64>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];q=+g[p+4>>2]*+g[b+4>>2]/+g[a+84>>2];r=+g[p+8>>2]*+g[b+8>>2]/+g[a+88>>2];g[p>>2]=+g[p>>2]*+g[b>>2]/+g[a+80>>2];g[p+4>>2]=q;g[p+8>>2]=r;g[p+12>>2]=0.0;o=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Ob[c[(c[o>>2]|0)+24>>2]&127](o,p);r=+g[p+16+52>>2]*+g[b+4>>2]/+g[a+84>>2];q=+g[p+16+56>>2]*+g[b+8>>2]/+g[a+88>>2];g[p+16+48>>2]=+g[m>>2]*+g[b>>2]/+g[a+80>>2];g[p+16+52>>2]=r;g[p+16+56>>2]=q;g[p+16+60>>2]=0.0;o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[n>>2]=c[p+16>>2];c[n+4>>2]=c[p+16+4>>2];c[n+8>>2]=c[p+16+8>>2];c[n+12>>2]=c[p+16+12>>2];n=o+(i*80|0)+16|0;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];n=o+(i*80|0)+32|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];o=o+(i*80|0)+48|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];if(c[a+68>>2]|0){n=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Vb[c[(c[n>>2]|0)+8>>2]&127](n,p+16|0,p+128|0,p+112|0);c[p+80>>2]=c[p+128>>2];c[p+80+4>>2]=c[p+128+4>>2];c[p+80+8>>2]=c[p+128+8>>2];c[p+80+12>>2]=c[p+128+12>>2];c[p+80+16>>2]=c[p+112>>2];c[p+80+16+4>>2]=c[p+112+4>>2];c[p+80+16+8>>2]=c[p+112+8>>2];c[p+80+16+12>>2]=c[p+112+12>>2];n=c[a+68>>2]|0;o=c[(c[a+28>>2]|0)+(i*80|0)+76>>2]|0;d=Ag(n,o)|0;a:do if(d){h=c[n+8>>2]|0;if((h|0)<=-1){d=c[n>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);c[o>>2]=c[p+80>>2];c[o+4>>2]=c[p+80+4>>2];c[o+8>>2]=c[p+80+8>>2];c[o+12>>2]=c[p+80+12>>2];c[o+16>>2]=c[p+80+16>>2];c[o+20>>2]=c[p+80+20>>2];c[o+24>>2]=c[p+80+24>>2];c[o+28>>2]=c[p+80+28>>2];Pe(n,d,o)}i=i+1|0}while((i|0)<(c[a+20>>2]|0));o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}function ge(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+96|0;q=c[b+12>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,(c[b+8>>2]|0)+4|0,s+80|0,s+64|0);q=c[d+68>>2]|0;Zb[c[(c[q>>2]|0)+16>>2]&31](q,c[(c[b+8>>2]|0)+188>>2]|0,s+80|0,s+64|0,c[d+24>>2]|0);q=c[d+24>>2]|0;Vb[c[(c[q>>2]|0)+32>>2]&127](q,c[(c[b+8>>2]|0)+344>>2]|0,d+28|0,q);q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];q=c[q+344>>2]|0;if((xb[c[(c[q>>2]|0)+36>>2]&127](q)|0)>0){d=0;q=0;do{e=c[b+204>>2]|0;if((e|0)<0){if((c[b+208>>2]|0)<0){f=c[b+212>>2]|0;if(f|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+208>>2]=0}do{c[(c[b+212>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[b+204>>2]=0;e=c[(c[b+8>>2]|0)+344>>2]|0;e=c[(xb[c[(c[e>>2]|0)+28>>2]&127](e)|0)+12>>2]|0;f=c[c[e+(q<<4)>>2]>>2]|0;h=c[c[e+(q<<4)+4>>2]>>2]|0;if(!((f|0)!=0?(c[f+204>>2]&4|0)!=0:0))r=14;do if((r|0)==14){r=0;if(h|0?c[h+204>>2]&4|0:0)break;if(Bb[c[(c[b>>2]|0)+56>>2]&63](b,f,h)|0){e=c[e+(q<<4)+8>>2]|0;if(e|0)Ob[c[(c[e>>2]|0)+16>>2]&127](e,b+200|0);p=c[b+204>>2]|0;if((p|0)>0){n=c[b+212>>2]|0;o=c[b+8>>2]|0;m=0;do{f=c[n+(m<<2)>>2]|0;j=(c[f+772>>2]|0)==(o|0)?-1.0:1.0;h=c[f+780>>2]|0;if((h|0)>0){k=-+g[b+16>>2];e=0;do{i=+g[f+4+(e*192|0)+80>>2];if(i>2]*.20000000298023224;t=i*j*+g[f+4+(e*192|0)+72>>2]*.20000000298023224;g[b+132>>2]=i*j*+g[f+4+(e*192|0)+64>>2]*.20000000298023224+ +g[b+132>>2];g[b+136>>2]=u+ +g[b+136>>2];g[b+140>>2]=t+ +g[b+140>>2];d=1}e=e+1|0}while((e|0)!=(h|0))}m=m+1|0}while((m|0)!=(p|0))}}}while(0);q=q+1|0;p=c[(c[b+8>>2]|0)+344>>2]|0}while((q|0)<(xb[c[(c[p>>2]|0)+36>>2]&127](p)|0))}else d=0;r=c[b+8>>2]|0;c[s>>2]=c[r+4>>2];c[s+4>>2]=c[r+4+4>>2];c[s+8>>2]=c[r+4+8>>2];c[s+12>>2]=c[r+4+12>>2];c[s+16>>2]=c[r+20>>2];c[s+16+4>>2]=c[r+20+4>>2];c[s+16+8>>2]=c[r+20+8>>2];c[s+16+12>>2]=c[r+20+12>>2];c[s+32>>2]=c[r+36>>2];c[s+32+4>>2]=c[r+36+4>>2];c[s+32+8>>2]=c[r+36+8>>2];c[s+32+12>>2]=c[r+36+12>>2];c[s+48>>2]=c[b+132>>2];c[s+48+4>>2]=c[b+132+4>>2];c[s+48+8>>2]=c[b+132+8>>2];c[s+48+12>>2]=c[b+132+12>>2];c[r+304>>2]=(c[r+304>>2]|0)+1;c[r+4>>2]=c[s>>2];c[r+4+4>>2]=c[s+4>>2];c[r+4+8>>2]=c[s+8>>2];c[r+4+12>>2]=c[s+12>>2];c[r+20>>2]=c[s+16>>2];c[r+20+4>>2]=c[s+16+4>>2];c[r+20+8>>2]=c[s+16+8>>2];c[r+20+12>>2]=c[s+16+12>>2];c[r+36>>2]=c[s+32>>2];c[r+36+4>>2]=c[s+32+4>>2];c[r+36+8>>2]=c[s+32+8>>2];c[r+36+12>>2]=c[s+32+12>>2];c[r+52>>2]=c[s+48>>2];c[r+52+4>>2]=c[s+48+4>>2];c[r+52+8>>2]=c[s+48+8>>2];c[r+52+12>>2]=c[s+48+12>>2];l=s;return d|0}function he(d,f,h,i,j,k){d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0,n=0.0;c[d>>2]=8928;b[d+4>>1]=-2;b[d+6>>1]=-1;c[d+92>>2]=j;c[d+96>>2]=0;a[d+100>>0]=0;c[d+104>>2]=0;c[d+108>>2]=0;if(!j){c[6995]=(c[6995]|0)+1;j=sc(91)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Li(j);c[d+92>>2]=j;a[d+100>>0]=1}if(!k){c[6995]=(c[6995]|0)+1;j=sc(43)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=j+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[j>>2]=8992;a[j+20>>0]=1;c[j+16>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[d+112>>2]=j;c[6995]=(c[6995]|0)+1;j=sc(195)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Ne(j,c[d+112>>2]|0);c[d+108>>2]=j;a[j+153>>0]=1}c[d+8>>2]=c[f>>2];c[d+8+4>>2]=c[f+4>>2];c[d+8+8>>2]=c[f+8>>2];c[d+8+12>>2]=c[f+12>>2];c[d+24>>2]=c[h>>2];c[d+24+4>>2]=c[h+4>>2];c[d+24+8>>2]=c[h+8>>2];c[d+24+12>>2]=c[h+12>>2];n=+(e[d+6>>1]|0);m=n/(+g[d+28>>2]-+g[d+12>>2]);l=n/(+g[d+32>>2]-+g[d+16>>2]);g[d+40>>2]=n/(+g[d+24>>2]-+g[d+8>>2]);g[d+44>>2]=m;g[d+48>>2]=l;g[d+52>>2]=0.0;h=(i&65535)+1&65535;c[6995]=(c[6995]|0)+1;j=sc(h<<6|19)|0;if(!j)f=0;else{c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16}if(h|0){j=f+(h<<6)|0;k=f;do{c[k>>2]=0;k=k+64|0}while((k|0)!=(j|0))}c[d+60>>2]=f;b[d+58>>1]=(i&65535)+1;b[d+56>>1]=0;b[d+64>>1]=1;if(h>>>0>1){j=1;k=1;do{b[f+(k<<6)+48>>1]=k+1;j=j+1<<16>>16;k=j&65535}while(k>>>0>>0)}b[f+(h+-1<<6)+48>>1]=0;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+80>>2]=j;c[d+68>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+84>>2]=j;c[d+72>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j){f=0;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}function ie(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+8>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=3876;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function je(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+76>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=5848;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function ke(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0;p=+g[e>>2];i=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?i:1566444395;m=+g[e+4>>2];l=(g[j>>2]=m,c[j>>2]|0);v=m<999999984306749440.0?l:1566444395;y=+g[e+8>>2];o=(g[j>>2]=y,c[j>>2]|0);w=y<999999984306749440.0?o:1566444395;i=p>-999999984306749440.0?i:-581039253;l=m>-999999984306749440.0?l:-581039253;o=y>-999999984306749440.0?o:-581039253;y=+g[e+16>>2];t=y<(c[j>>2]=u,+g[j>>2]);k=(g[j>>2]=y,c[j>>2]|0);u=t?k:u;m=+g[e+20>>2];t=m<(c[j>>2]=v,+g[j>>2]);n=(g[j>>2]=m,c[j>>2]|0);v=t?n:v;p=+g[e+24>>2];t=p<(c[j>>2]=w,+g[j>>2]);q=(g[j>>2]=p,c[j>>2]|0);w=t?q:w;k=(c[j>>2]=i,+g[j>>2])>2]=l,+g[j>>2])>2]=o,+g[j>>2])>2];q=y<(c[j>>2]=u,+g[j>>2]);r=(g[j>>2]=y,c[j>>2]|0);m=+g[e+36>>2];s=m<(c[j>>2]=v,+g[j>>2]);t=(g[j>>2]=m,c[j>>2]|0);p=+g[e+40>>2];l=p<(c[j>>2]=w,+g[j>>2]);n=(g[j>>2]=p,c[j>>2]|0);k=(c[j>>2]=k,+g[j>>2])>2]=i,+g[j>>2])>2]=o,+g[j>>2])>2]=k,+g[j>>2]);H=(c[j>>2]=q?r:u,+g[j>>2]);C=(c[j>>2]=i,+g[j>>2]);D=(c[j>>2]=s?t:v,+g[j>>2]);m=(c[j>>2]=o,+g[j>>2]);z=(c[j>>2]=l?n:w,+g[j>>2]);o=c[d+8>>2]|0;F=+g[o+4>>2];B=+g[o+8>>2];p=+g[o+12>>2];E=+g[o+36>>2];A=+g[o+40>>2];y=+g[o+44>>2];o=~~(((G-H<2.0000000949949026e-03?H+-1.0000000474974513e-03:H)-F)*E)&65535&-2;q=~~(((C-D<2.0000000949949026e-03?D+-1.0000000474974513e-03:D)-B)*A)&65535&-2;r=~~(((m-z<2.0000000949949026e-03?z+-1.0000000474974513e-03:z)-p)*y)&65535&-2;s=~~(((G-H<2.0000000949949026e-03?G+1.0000000474974513e-03:G)-F)*E+1.0)&65535|1;t=~~(((C-D<2.0000000949949026e-03?C+1.0000000474974513e-03:C)-B)*A+1.0)&65535|1;e=~~(((m-z<2.0000000949949026e-03?m+1.0000000474974513e-03:m)-p)*y+1.0)&65535|1;n=c[d+4>>2]|0;i=c[n+4>>2]|0;if((i|0)==(c[n+8>>2]|0)?(x=i|0?i<<1:1,(i|0)<(x|0)):0){if(!x)l=0;else{c[6995]=(c[6995]|0)+1;i=sc((x<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}l=i;i=c[n+4>>2]|0}if((i|0)>0){k=0;do{d=l+(k<<4)|0;w=(c[n+12>>2]|0)+(k<<4)|0;c[d>>2]=c[w>>2];c[d+4>>2]=c[w+4>>2];c[d+8>>2]=c[w+8>>2];c[d+12>>2]=c[w+12>>2];k=k+1|0}while((k|0)!=(i|0))}i=c[n+12>>2]|0;if(i|0){if(a[n+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+12>>2]=0}a[n+16>>0]=1;c[n+12>>2]=l;c[n+8>>2]=x;i=c[n+4>>2]|0}x=c[n+12>>2]|0;b[x+(i<<4)>>1]=o;b[x+(i<<4)+2>>1]=q;b[x+(i<<4)+4>>1]=r;b[x+(i<<4)+6>>1]=s;b[x+(i<<4)+8>>1]=t;b[x+(i<<4)+10>>1]=e;c[x+(i<<4)+12>>2]=f<<21|h;c[n+4>>2]=(c[n+4>>2]|0)+1;return}function le(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+336|0;h=c[d+36>>2]|0;c[n+272+4>>2]=35;c[n+272+8>>2]=0;c[n+272+12>>2]=-1;c[n+272+16>>2]=1065353216;c[n+272+20>>2]=1065353216;c[n+272+24>>2]=1065353216;g[n+272+28>>2]=0.0;c[n+272>>2]=3644;c[n+272+56>>2]=h;g[n+272+48>>2]=0.0;k=c[b+28>>2]|0;d=c[k+4>>2]|0;if(c[(c[k+8>>2]|0)+204>>2]&3|0?a[h+376>>0]|0:0){l=n;return}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}e=c[(c[b+28>>2]|0)+12>>2]|0;c[n>>2]=1065353216;c[n+4>>2]=0;c[n+8>>2]=0;g[n+12>>2]=0.0;if(!(!(Gd(n+272|0,22728,d,e,n,n+216|0)|0)?!(Hc(n+272|0,22728,d,e,n,n+216|0,0)|0):0))i=12;if((i|0)==12?(c[n+4>>2]=0,c[n+4+4>>2]=0,c[n+4+8>>2]=0,c[n+4+12>>2]=0,c[n+4+16>>2]=0,c[n+4+20>>2]=0,a[n+152>>0]=0,c[n>>2]=3432,k=c[(c[b+28>>2]|0)+8>>2]|0,zd(b,n+216|0,h,0,0,0,(c[k+252>>2]&2|0)==0?0:k,k,n)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)k=0;else{c[(d+4+15&-16)+-4>>2]=d;k=d+4+15&-16}e=k+4|0;d=k+152|0;Yk(e|0,0,212)|0;c[k>>2]=3432;h=n+4|0;i=e+100|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));e=k+104|0;c[e>>2]=c[n+104>>2];c[e+4>>2]=c[n+104+4>>2];c[e+8>>2]=c[n+104+8>>2];c[e+12>>2]=c[n+104+12>>2];e=k+120|0;c[e>>2]=c[n+120>>2];c[e+4>>2]=c[n+120+4>>2];c[e+8>>2]=c[n+120+8>>2];c[e+12>>2]=c[n+120+12>>2];e=k+136|0;c[e>>2]=c[n+136>>2];c[e+4>>2]=c[n+136+4>>2];c[e+8>>2]=c[n+136+8>>2];c[e+12>>2]=c[n+136+12>>2];a[d>>0]=a[n+152>>0]|0;e=k+156|0;h=n+156|0;i=e+60|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));i=c[b+24>>2]|0;j=k;d=c[i+912>>2]|0;if((d|0)==(c[i+916>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)h=0;else{c[6995]=(c[6995]|0)+1;d=sc((m<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;d=c[i+912>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[i+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[i+920>>2]|0;if(e){if(a[i+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[i+912>>2]|0}c[i+920>>2]=0}a[i+924>>0]=1;c[i+920>>2]=h;c[i+916>>2]=m}c[(c[i+920>>2]|0)+(d<<2)>>2]=j;c[i+912>>2]=d+1;d=c[b+24>>2]|0;e=k+64|0;f=+g[e>>2];if(!(c[(c[(c[b+28>>2]|0)+8>>2]|0)+204>>2]&3)){g[e>>2]=f*+g[d+400>>2];d=d+412|0}else{g[e>>2]=f*+g[d+404>>2];d=d+416|0}b=k+68|0;g[b>>2]=+g[d>>2]*+g[b>>2]}l=n;return}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=c[b>>2]|0;m=c[b+4>>2]|0;i=c[b+8>>2]|0;n=c[a+4>>2]|0;p=Lh(a,d,m,i)|0;c[p+12>>2]=c[b+12>>2];c[p+16>>2]=n+1;c[p+20>>2]=n+2;h=c[(c[a+12>>2]|0)+(c[b+12>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(m|0)&(f|0)==(i|0))){if((e|0)==(i|0)?(f|0)==(m|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(m|0)&(g|0)==(i|0)))if(!((f|0)==(i|0)&(g|0)==(m|0)))if((g|0)!=(m|0)|(e|0)==(i|0)^1){if((g|0)==(i|0)?(e|0)==(m|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=2}else e=h+12|0;else{e=0;o=2}}else{e=2;o=2}while(0);if((o|0)==2)e=h+12+(e<<2)|0;c[e>>2]=n;k=Lh(a,d,i,l)|0;c[k+12>>2]=c[b+12+4>>2];c[k+16>>2]=n+2;c[k+20>>2]=n;h=c[(c[a+12>>2]|0)+(c[b+12+4>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(i|0)&(f|0)==(l|0))){if((e|0)==(l|0)?(f|0)==(i|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(i|0)&(g|0)==(l|0)))if(!((f|0)==(l|0)&(g|0)==(i|0)))if((g|0)!=(i|0)|(e|0)==(l|0)^1){if((g|0)==(l|0)?(e|0)==(i|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=12}else e=h+12|0;else{e=0;o=12}}else{e=2;o=12}while(0);if((o|0)==12)e=h+12+(e<<2)|0;c[e>>2]=n+1;j=Lh(a,d,l,m)|0;c[j+12>>2]=c[b+12+8>>2];c[j+16>>2]=n;c[j+20>>2]=n+1;e=c[a+12>>2]|0;i=c[e+(c[b+12+8>>2]<<2)>>2]|0;f=c[i>>2]|0;g=c[i+4>>2]|0;do if(!((f|0)==(l|0)&(g|0)==(m|0))){if((f|0)==(m|0)?(g|0)==(l|0):0){f=i+12+8|0;break}h=c[i+8>>2]|0;if(!((g|0)==(l|0)&(h|0)==(m|0)))if(!((g|0)==(m|0)&(h|0)==(l|0)))if((h|0)!=(l|0)|(f|0)==(m|0)^1){if((h|0)==(m|0)?(f|0)==(l|0):0){f=i+12+4|0;break}f=9772}else{f=1;o=22}else f=i+12|0;else{f=0;o=22}}else{f=2;o=22}while(0);if((o|0)==22)f=i+12+(f<<2)|0;c[f>>2]=n+2;f=c[e+(c[p+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,p,f);c[(c[a+12>>2]|0)+(c[p+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[k+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,k,f);c[(c[a+12>>2]|0)+(c[k+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[j+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,j,f);c[(c[a+12>>2]|0)+(c[j+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}c[e+(c[b+24>>2]<<2)>>2]=0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function ne(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!((d|0)!=0&(e|0)!=0))return;if((c[b+24>>2]|0)<128?(c[b+28>>2]|0)<128:0){c[6995]=(c[6995]|0)+1;h=sc(1043)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+24>>2]|0;if((i|0)>0){h=0;do{k=(c[b+32>>2]|0)+(h<<3)|0;l=c[k+4>>2]|0;m=j+(h<<3)|0;c[m>>2]=c[k>>2];c[m+4>>2]=l;h=h+1|0}while((h|0)!=(i|0))}h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=j;c[b+28>>2]=128}c[b+24>>2]=128;h=c[b+32>>2]|0;c[h>>2]=d;c[h+4>>2]=e;h=1;i=124;do{m=h+-1|0;j=c[b+32>>2]|0;k=c[j+(m<<3)>>2]|0;l=c[j+(m<<3)+4>>2]|0;if((m|0)>(i|0)){e=c[b+24>>2]|0;if((e|0)<(e<<1|0)?(c[b+28>>2]|0)<(e<<1|0):0){if(e){c[6995]=(c[6995]|0)+1;i=sc((e<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+24>>2]|0;if((d|0)>0){j=0;do{p=(c[b+32>>2]|0)+(j<<3)|0;o=c[p+4>>2]|0;n=i+(j<<3)|0;c[n>>2]=c[p>>2];c[n+4>>2]=o;j=j+1|0}while((j|0)!=(d|0))}}else i=0;j=c[b+32>>2]|0;if(j|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=i;c[b+28>>2]=e<<1;j=i}c[b+24>>2]=e<<1;i=(e<<1)+-4|0}do if((k|0)==(l|0))if(!(c[k+40>>2]|0))h=m;else{o=c[k+36>>2]|0;c[j+(m<<3)>>2]=o;c[j+(m<<3)+4>>2]=o;o=c[k+40>>2]|0;p=h+1|0;n=c[b+32>>2]|0;c[n+(h<<3)>>2]=o;c[n+(h<<3)+4>>2]=o;n=c[k+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+36>>2];c[o+(p<<3)+4>>2]=n;h=h+2|0}else if(((((+g[k>>2]<=+g[l+16>>2]?+g[k+16>>2]>=+g[l>>2]:0)?+g[k+4>>2]<=+g[l+20>>2]:0)?+g[k+20>>2]>=+g[l+4>>2]:0)?+g[k+8>>2]<=+g[l+24>>2]:0)?+g[k+24>>2]>=+g[l+8>>2]:0){d=(c[l+40>>2]|0)!=0;if(!(c[k+40>>2]|0))if(d){o=c[l+36>>2]|0;c[j+(m<<3)>>2]=k;c[j+(m<<3)+4>>2]=o;o=c[l+40>>2]|0;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=k;c[p+(h<<3)+4>>2]=o;h=h+1|0;break}else{Sb[c[(c[f>>2]|0)+8>>2]&127](f,k,l);h=m;break}else{e=c[k+36>>2]|0;if(d){p=c[l+36>>2]|0;c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=p;p=c[l+36>>2]|0;n=h+1|0;m=c[b+32>>2]|0;c[m+(h<<3)>>2]=c[k+40>>2];c[m+(h<<3)+4>>2]=p;m=c[l+40>>2]|0;p=h+2|0;o=c[b+32>>2]|0;c[o+(n<<3)>>2]=c[k+36>>2];c[o+(n<<3)+4>>2]=m;n=c[l+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+40>>2];c[o+(p<<3)+4>>2]=n;h=h+3|0;break}else{c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=l;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=c[k+40>>2];c[p+(h<<3)+4>>2]=l;h=h+1|0;break}}}else h=m;while(0)}while((h|0)!=0);return}function oe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+16|0;f=lt()|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;ef(23152,0.0,0,0,h)}c[5839]=c[5839]|1;g[5889]=0.0;x=+g[5899]*0.0;D=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=x;g[5896]=D;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;D=+g[5891]*0.0;x=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=D;g[5945]=x;g[5946]=0.0;c[f+4>>2]=7;c[f+8>>2]=-1;c[f+12>>2]=-1;g[f+16>>2]=3402823466385288598117041.0e14;a[f+20>>0]=1;a[f+21>>0]=0;c[f+24>>2]=-1;c[f+28>>2]=23152;c[f+32>>2]=b;g[f+36>>2]=0.0;g[f+40>>2]=.05000000074505806;c[f+44>>2]=0;c[f>>2]=4884;a[f+48>>0]=0;c[f+116>>2]=c[d>>2];c[f+116+4>>2]=c[d+4>>2];c[f+116+8>>2]=c[d+8>>2];c[f+116+12>>2]=c[d+12>>2];c[f+132>>2]=c[d+16>>2];c[f+132+4>>2]=c[d+16+4>>2];c[f+132+8>>2]=c[d+16+8>>2];c[f+132+12>>2]=c[d+16+12>>2];c[f+148>>2]=c[d+32>>2];c[f+148+4>>2]=c[d+32+4>>2];c[f+148+8>>2]=c[d+32+8>>2];c[f+148+12>>2]=c[d+32+12>>2];c[f+164>>2]=c[d+48>>2];c[f+164+4>>2]=c[d+48+4>>2];c[f+164+8>>2]=c[d+48+8>>2];c[f+164+12>>2]=c[d+48+12>>2];a[f+180>>0]=e&1;x=+g[f+116>>2];D=+g[b+4>>2];w=+g[f+132>>2];C=+g[b+8>>2];v=+g[f+148>>2];B=+g[b+12>>2];u=+g[f+120>>2];t=+g[f+136>>2];s=+g[f+152>>2];r=+g[f+124>>2];p=+g[f+140>>2];n=+g[f+156>>2];A=+g[b+20>>2];z=+g[b+24>>2];y=+g[b+28>>2];q=+g[b+36>>2];o=+g[b+40>>2];m=+g[b+44>>2];F=+g[f+164>>2];E=+g[f+168>>2];i=+g[f+172>>2];k=+g[b+52>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[b+56>>2];i=q*F+o*E+m*i+ +g[b+60>>2];g[f+52>>2]=x*D+w*C+v*B;g[f+56>>2]=D*u+C*t+B*s;g[f+60>>2]=D*r+C*p+B*n;g[f+64>>2]=0.0;g[f+68>>2]=x*A+w*z+v*y;g[f+72>>2]=u*A+t*z+s*y;g[f+76>>2]=r*A+p*z+n*y;g[f+80>>2]=0.0;g[f+84>>2]=x*q+w*o+v*m;g[f+88>>2]=u*q+t*o+s*m;g[f+92>>2]=r*q+p*o+n*m;g[f+96>>2]=0.0;g[f+100>>2]=k;g[f+104>>2]=j;g[f+108>>2]=i;g[f+112>>2]=0.0;g[f+184>>2]=1.0;g[f+188>>2]=-1.0;g[f+192>>2]=0.0;g[f+196>>2]=0.0;g[f+200>>2]=1.0;g[f+204>>2]=.699999988079071;g[f+208>>2]=0.0;g[f+212>>2]=0.0;g[f+216>>2]=1.0;g[f+220>>2]=.699999988079071;g[f+224>>2]=0.0;g[f+228>>2]=0.0;g[f+264>>2]=1.0;g[f+268>>2]=.699999988079071;g[f+272>>2]=1.0;g[f+276>>2]=0.0;g[f+280>>2]=1.0;g[f+284>>2]=.699999988079071;g[f+288>>2]=1.0;g[f+292>>2]=0.0;g[f+232>>2]=1.0;g[f+236>>2]=.699999988079071;g[f+240>>2]=1.0;g[f+244>>2]=0.0;g[f+248>>2]=1.0;g[f+252>>2]=.699999988079071;g[f+256>>2]=1.0;g[f+260>>2]=0.0;a[f+1096>>0]=0;g[f+1116>>2]=0.0;g[f+1120>>2]=0.0;g[f+1124>>2]=0.0;c[f+300>>2]=0;c[f+1100>>2]=0;c[f+1100+4>>2]=0;c[f+1100+8>>2]=0;a[f+1100+12>>0]=0;a[f+49>>0]=1;Zc(f,(c[f+28>>2]|0)+4|0,(c[f+32>>2]|0)+4|0);l=h;return f|0}function pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=0;do{k=l;l=l+1|0;m=(l|0)==3;j=c[b+((m?0:l)<<2)>>2]|0;k=c[b+(((k+2|0)%3|0)<<2)>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=3}else e=d+12|0;else{e=0;n=3}}else e=d+12+8|0;else{e=2;n=3}if((n|0)==3){n=0;e=d+12+(e<<2)|0}i=c[e>>2]|0;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=10}else e=b+12|0;else{e=0;n=10}}else e=b+12+8|0;else{e=2;n=10}if((n|0)==10){n=0;e=b+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(k|0)&(f|0)==(j|0))){if((e|0)==(j|0)?(f|0)==(k|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1){if((g|0)==(j|0)?(e|0)==(k|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=17}else e=h+12|0;else{e=0;n=17}}else{e=2;n=17}while(0);if((n|0)==17){n=0;e=h+12+(e<<2)|0}c[e>>2]=i;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=27}else e=b+12|0;else{e=0;n=27}}else e=b+12+8|0;else{e=2;n=27}if((n|0)==27){n=0;e=b+12+(e<<2)|0}i=c[e>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=34}else e=d+12|0;else{e=0;n=34}}else e=d+12+8|0;else{e=2;n=34}if((n|0)==34){n=0;e=d+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(j|0)&(f|0)==(k|0))){if((e|0)==(k|0)?(f|0)==(j|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1){if((g|0)==(k|0)?(e|0)==(j|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=41}else e=h+12|0;else{e=0;n=41}}else{e=2;n=41}while(0);if((n|0)==41){n=0;e=h+12+(e<<2)|0}c[e>>2]=i}while(!m);return}function qe(b){b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0;u=l;l=l+176|0;if(!(a[b+527>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+520>>2]=0.0;g[b+516>>2]=0.0;c[b+576>>2]=0;c[b+576+4>>2]=0;c[b+576+8>>2]=0;c[b+576+12>>2]=0;if(!(a[b+524>>0]|0)){d=c[b+28>>2]|0;j=+g[b+348>>2];k=+g[b+352>>2];q=+g[b+356>>2];s=j*+g[d+20>>2]+k*+g[d+24>>2]+q*+g[d+28>>2]+ +g[d+56>>2];e=c[b+32>>2]|0;m=+g[b+412>>2];n=+g[b+416>>2];r=+g[b+420>>2];t=m*+g[e+20>>2]+n*+g[e+24>>2]+r*+g[e+28>>2]+ +g[e+56>>2];o=m*+g[e+36>>2]+n*+g[e+40>>2]+r*+g[e+44>>2]+ +g[e+60>>2];p=j*+g[d+4>>2]+k*+g[d+8>>2]+q*+g[d+12>>2]+ +g[d+52>>2];q=j*+g[d+36>>2]+k*+g[d+40>>2]+q*+g[d+44>>2]+ +g[d+60>>2];r=m*+g[e+4>>2]+n*+g[e+8>>2]+r*+g[e+12>>2]+ +g[e+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){h=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*h;g[u+128+4>>2]=(t-s)*h;g[u+128+8>>2]=(o-q)*h;c[u+128+12>>2]=0;m=(o-q)*h;f=(t-s)*h;h=(r-p)*h}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;f=0.0;h=1.0}if(+C(+m)>.7071067690849304){w=m*m+f*f;v=1.0/+D(+w);j=-(v*m);m=v*f;n=-(m*h);i=h*j;k=0.0;f=w*v;h=m}else{j=h*h+f*f;i=1.0/+D(+j);k=-(f*i);f=i*h;n=m*k;i=j*i;j=f;f=-(f*m);h=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=h;g[u+128+32>>2]=f;g[u+128+36>>2]=n;g[u+128+40>>2]=i;d=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[e+4>>2];c[u+32+4>>2]=c[e+20>>2];c[u+32+8>>2]=c[e+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[e+8>>2];c[u+32+20>>2]=c[e+24>>2];c[u+32+24>>2]=c[e+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[e+12>>2];c[u+32+36>>2]=c[e+28>>2];c[u+32+40>>2]=c[e+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[e+56>>2];w=o-+g[e+60>>2];g[u>>2]=r-+g[e+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;e=c[b+32>>2]|0;Rg(b+48+(d*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(d<<4)|0,x+456|0,+g[x+404>>2],e+456|0,+g[e+404>>2]);d=d+1|0;if((d|0)==3)break;e=c[b+32>>2]|0}d=b+32|0}else d=b+32|0;e=c[b+28>>2]|0;x=c[d>>2]|0;xc(b,e+4|0,x+4|0,e+324|0,x+324|0);l=u;return}function re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+80|0;c[a+72>>2]=(c[a+72>>2]|0)+1;f=c[a+68>>2]|0;if(f|0){d=c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0;Ag(f,d)|0;e=c[f+4>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[f+4>>2]=d;c[f+12>>2]=(c[f+12>>2]|0)+-1}f=(c[a+20>>2]|0)+-1|0;e=c[a+28>>2]|0;c[g>>2]=c[e+(b*80|0)>>2];c[g+4>>2]=c[e+(b*80|0)+4>>2];c[g+8>>2]=c[e+(b*80|0)+8>>2];c[g+12>>2]=c[e+(b*80|0)+12>>2];c[g+16>>2]=c[e+(b*80|0)+16>>2];c[g+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[g+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[g+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[g+32>>2]=c[e+(b*80|0)+32>>2];c[g+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[g+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[g+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[g+48>>2]=c[e+(b*80|0)+48>>2];c[g+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[g+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[g+48+12>>2]=c[e+(b*80|0)+48+12>>2];c[g+64>>2]=c[e+(b*80|0)+64>>2];c[g+64+4>>2]=c[e+(b*80|0)+64+4>>2];c[g+64+8>>2]=c[e+(b*80|0)+64+8>>2];c[g+64+12>>2]=c[e+(b*80|0)+64+12>>2];c[e+(b*80|0)>>2]=c[e+(f*80|0)>>2];c[e+(b*80|0)+4>>2]=c[e+(f*80|0)+4>>2];c[e+(b*80|0)+8>>2]=c[e+(f*80|0)+8>>2];c[e+(b*80|0)+12>>2]=c[e+(f*80|0)+12>>2];c[e+(b*80|0)+16>>2]=c[e+(f*80|0)+16>>2];c[e+(b*80|0)+16+4>>2]=c[e+(f*80|0)+16+4>>2];c[e+(b*80|0)+16+8>>2]=c[e+(f*80|0)+16+8>>2];c[e+(b*80|0)+16+12>>2]=c[e+(f*80|0)+16+12>>2];c[e+(b*80|0)+32>>2]=c[e+(f*80|0)+32>>2];c[e+(b*80|0)+32+4>>2]=c[e+(f*80|0)+32+4>>2];c[e+(b*80|0)+32+8>>2]=c[e+(f*80|0)+32+8>>2];c[e+(b*80|0)+32+12>>2]=c[e+(f*80|0)+32+12>>2];c[e+(b*80|0)+48>>2]=c[e+(f*80|0)+48>>2];c[e+(b*80|0)+48+4>>2]=c[e+(f*80|0)+48+4>>2];c[e+(b*80|0)+48+8>>2]=c[e+(f*80|0)+48+8>>2];c[e+(b*80|0)+48+12>>2]=c[e+(f*80|0)+48+12>>2];c[e+(b*80|0)+64>>2]=c[e+(f*80|0)+64>>2];c[e+(b*80|0)+64+4>>2]=c[e+(f*80|0)+64+4>>2];c[e+(b*80|0)+64+8>>2]=c[e+(f*80|0)+64+8>>2];c[e+(b*80|0)+64+12>>2]=c[e+(f*80|0)+64+12>>2];e=c[a+28>>2]|0;c[e+(f*80|0)>>2]=c[g>>2];c[e+(f*80|0)+4>>2]=c[g+4>>2];c[e+(f*80|0)+8>>2]=c[g+8>>2];c[e+(f*80|0)+12>>2]=c[g+12>>2];c[e+(f*80|0)+16>>2]=c[g+16>>2];c[e+(f*80|0)+16+4>>2]=c[g+16+4>>2];c[e+(f*80|0)+16+8>>2]=c[g+16+8>>2];c[e+(f*80|0)+16+12>>2]=c[g+16+12>>2];c[e+(f*80|0)+32>>2]=c[g+32>>2];c[e+(f*80|0)+32+4>>2]=c[g+32+4>>2];c[e+(f*80|0)+32+8>>2]=c[g+32+8>>2];c[e+(f*80|0)+32+12>>2]=c[g+32+12>>2];c[e+(f*80|0)+48>>2]=c[g+48>>2];c[e+(f*80|0)+48+4>>2]=c[g+48+4>>2];c[e+(f*80|0)+48+8>>2]=c[g+48+8>>2];c[e+(f*80|0)+48+12>>2]=c[g+48+12>>2];c[e+(f*80|0)+64>>2]=c[g+64>>2];c[e+(f*80|0)+64+4>>2]=c[g+64+4>>2];c[e+(f*80|0)+64+8>>2]=c[g+64+8>>2];c[e+(f*80|0)+64+12>>2]=c[g+64+12>>2];if(!(c[a+68>>2]|0)){f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}c[(c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0)+36>>2]=b;f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}function se(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[b+92>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0))return;o=c[b+92>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;f=c[o+4>>2]|0;if((f|0)>1){te(o,0,f+-1|0);j=c[o+4>>2]|0}else j=f;m=c[b+104>>2]|0;f=j-m|0;if((m|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){g=0;i=j}else{c[6995]=(c[6995]|0)+1;g=sc((f<<4|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{m=c[o+12>>2]|0;c[g+(h<<4)>>2]=c[m+(h<<4)>>2];c[g+(h<<4)+4>>2]=c[m+(h<<4)+4>>2];c[g+(h<<4)+8>>2]=c[m+(h<<4)+8>>2];c[g+(h<<4)+12>>2]=c[m+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=g;c[o+8>>2]=f;h=o+12|0}else h=o+12|0;g=j;do{m=(c[h>>2]|0)+(g<<4)|0;g=g+1|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0}while((g|0)!=(f|0))}c[o+4>>2]=f;c[b+104>>2]=0;if((f|0)>0){l=0;m=0;g=0;h=0;do{k=c[o+12>>2]|0;j=k+(l<<4)|0;p=m;m=c[j>>2]|0;k=k+(l<<4)+4|0;i=c[k>>2]|0;if(!((m|0)==(p|0)&(i|0)==(g|0))){p=m+48|0;if((((((e[m+54>>1]|0)>=(e[i+48>>1]|0)?(e[i+54>>1]|0)>=(e[p>>1]|0):0)?(e[m+56>>1]|0)>=(e[i+48+2>>1]|0):0)?(e[i+56>>1]|0)>=(e[p+2>>1]|0):0)?(e[m+58>>1]|0)>=(e[i+52>>1]|0):0)?(e[i+58>>1]|0)>=(e[m+52>>1]|0):0)g=i;else{f=i;n=29}}else{f=g;n=29}if((n|0)==29){n=0;h=c[b+92>>2]|0;Sb[c[(c[h>>2]|0)+32>>2]&127](h,j,d);c[j>>2]=0;c[k>>2]=0;h=(c[b+104>>2]|0)+1|0;c[b+104>>2]=h;c[6156]=(c[6156]|0)+-1;g=f;f=c[o+4>>2]|0}l=l+1|0}while((l|0)<(f|0));if((f|0)>1){te(o,0,f+-1|0);g=c[o+4>>2]|0;h=c[b+104>>2]|0}else g=f;f=g-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){h=0;j=g}else{c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+4>>2]|0}if((j|0)>0){i=0;do{p=c[o+12>>2]|0;c[h+(i<<4)>>2]=c[p+(i<<4)>>2];c[h+(i<<4)+4>>2]=c[p+(i<<4)+4>>2];c[h+(i<<4)+8>>2]=c[p+(i<<4)+8>>2];c[h+(i<<4)+12>>2]=c[p+(i<<4)+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[o+12>>2]|0;if(i|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=h;c[o+8>>2]=f}do{p=(c[o+12>>2]|0)+(g<<4)|0;g=g+1|0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0}while((g|0)!=(f|0))}}c[o+4>>2]=f;c[b+104>>2]=0;return}function te(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;while(1){m=c[a+12>>2]|0;o=(b+d|0)/2|0;p=c[m+(o<<4)>>2]|0;n=c[m+(o<<4)+4>>2]|0;o=c[m+(o<<4)+8>>2]|0;e=d;f=b;while(1){a:do if(!p)while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=(l|0)){g=(h|0)>(i|0);if(g|(j|0)==(p|0)^1)if((j|0)==(p|0)&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}}while(0);b:do if(!p)while(1){j=c[m+(e<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;if(!n)h=-1;else h=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)i=-1;else i=c[k+12>>2]|0;do if((g|0)>=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(e<<4)>>2]|0;if(!j)i=-1;else i=c[j+12>>2]|0;if(!n)g=-1;else g=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;do if((l|0)<=(i|0)){g=(g|0)>(h|0);if(g|(p|0)==(j|0)^1)if((p|0)==(j|0)&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}}while(0);if((f|0)<=(e|0)){h=m+(f<<4)|0;i=c[h>>2]|0;j=c[m+(f<<4)+4>>2]|0;k=c[m+(f<<4)+8>>2]|0;l=c[m+(f<<4)+12>>2]|0;m=m+(e<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];m=c[a+12>>2]|0;c[m+(e<<4)>>2]=i;c[m+(e<<4)+4>>2]=j;c[m+(e<<4)+8>>2]=k;c[m+(e<<4)+12>>2]=l;e=e+-1|0;f=f+1|0}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))te(a,b,e);if((f|0)<(d|0))b=f;else break}return}function ue(a,d,f,h,i,j,k,m,n){a=a|0;d=d|0;f=f|0;h=+h;i=+i;j=+j;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0;W=l;l=l+32|0;T=+g[f>>2];F=+g[f+4>>2];L=+g[f+8>>2];M=1.0/+D(+((h-T)*(h-T)+(i-F)*(i-F)+(j-L)*(j-L)));Q=(h-T)*M==0.0?999999984306749440.0:1.0/((h-T)*M);R=(i-F)*M==0.0?999999984306749440.0:1.0/((i-F)*M);S=(j-L)*M==0.0?999999984306749440.0:1.0/((j-L)*M);fa=(T>h?h:T)+ +g[k>>2];ea=(F>i?i:F)+ +g[k+4>>2];da=(L>j?j:L)+ +g[k+8>>2];ba=(T>2];Z=(F>2];r=(L>2];aa=+g[a+4>>2];fa=fa>2];ea=ea>2];da=da>2];_=+g[a+24>>2];q=+g[a+28>>2];$=+g[a+36>>2];X=+g[a+40>>2];t=+g[a+44>>2];U=~~(((ca0){B=0;o=0;E=c[a+136>>2]|0;while(1){o=o+1|0;p=E+6|0;u=b[E>>1]|0;v=E+10|0;w=b[E+4>>1]|0;x=E+8|0;y=b[E+2>>1]|0;z=E+12|0;A=(c[z>>2]|0)>-1;do if(((I&65535)>=(u&65535)?(U&65535)<=(e[p>>1]|0):0)&(H&65535)<=(e[v>>1]|0)&(K&65535)>=(w&65535)&(G&65535)<=(e[x>>1]|0)&(J&65535)>=(y&65535)){ba=+g[a+36>>2];da=+g[a+40>>2];fa=+g[a+44>>2];ca=+g[a+4>>2];ea=+g[a+8>>2];s=+g[a+12>>2];g[W+12>>2]=0.0;t=+(e[p>>1]|0)/ba+ca;q=+(e[x>>1]|0)/da+ea;r=+(e[v>>1]|0)/fa+s;g[W+28>>2]=0.0;g[W>>2]=+(u&65535)/ba+ca-+g[m>>2];g[W+4>>2]=+(y&65535)/da+ea-+g[m+4>>2];g[W+8>>2]=+(w&65535)/fa+s-+g[m+8>>2];g[W+16>>2]=t-+g[k>>2];g[W+20>>2]=q-+g[k+4>>2];g[W+24>>2]=r-+g[k+8>>2];r=+g[f>>2];q=Q*(+g[W+((Q<0.0&1)<<4)>>2]-r);r=Q*(+g[W+((Q<0.0^1)<<4)>>2]-r);t=+g[f+4>>2];s=R*(+g[W+((R<0.0&1)<<4)+4>>2]-t);t=R*(+g[W+((R<0.0^1)<<4)+4>>2]-t);if(!(s>r|q>t)?(N=s>q?s:q,C=t>2],O=S*(+g[W+((S<0.0&1)<<4)+8>>2]-P),P=S*(+g[W+((S<0.0^1)<<4)+8>>2]-P),!(O>C|N>P)):0){p=(P0.0?(O>N?O:N)<(j-L)*(j-L)*M+((h-T)*(h-T)*M+(i-F)*(i-F)*M):0;if(!(A&p)){V=9;break}p=c[z>>2]|0;Sb[c[(c[d>>2]|0)+8>>2]&127](d,p>>21,p&2097151);p=1;break}p=0;V=9}else{p=0;V=9}while(0);if((V|0)==9){V=0;if(A|p)p=1;else p=0-(c[z>>2]|0)|0}B=p+B|0;if((B|0)>=(n|0))break;else E=E+(p<<4)|0}}else o=0;if((c[6160]|0)>=(o|0)){l=W;return}c[6160]=o;l=W;return}function ve(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0;o=l;l=l+80|0;h=+g[b+12>>2];k=+g[a+264>>2];f=+g[b+8>>2];n=+g[a+260>>2];e=+g[b+4>>2];if((k==f?+g[a+268>>2]==h:0)&n==e?+g[a+256>>2]==+g[b>>2]:0){l=o;return}m=+g[a+256>>2];d=+g[b>>2];if(d*d+e*e+f*f>0.0){j=1.0/+D(+(d*d+e*e+f*f));g[a+256>>2]=d*j;g[a+260>>2]=e*j;g[a+264>>2]=f*j;i=d*j;e=e*j;f=f*j;d=h}else{c[a+256>>2]=0;c[a+260>>2]=0;c[a+264>>2]=0;i=0.0;e=0.0;f=0.0;d=0.0}g[a+268>>2]=d;b=c[a+8>>2]|0;if(!b){l=o;return}d=i*i+e*e+f*f;do if(!(d==0.0)?!(m*m+n*n+k*k==0.0):0){d=1.0/+D(+d);j=i*d;g[a+256>>2]=j;h=e*d;g[a+260>>2]=h;d=f*d;g[a+264>>2]=d;e=1.0/+D(+(m*m+n*n+k*k));if(!(d*k*e+(h*n*e+m*e*j)<-.9999998807907104)){p=+D(+((d*k*e+(h*n*e+m*e*j)+1.0)*2.0));i=(d*m*e-k*e*j)*(1.0/p);f=(h*k*e-d*n*e)*(1.0/p);d=(n*e*j-h*m*e)*(1.0/p);e=p*.5;break}if(+C(+d)>.7071067690849304){e=1.0/+D(+(d*d+h*h));i=-(d*e);f=0.0;d=h*e;e=0.0;break}else{f=1.0/+D(+(h*h+j*j));i=j*f;f=-(h*f);d=0.0;e=0.0;break}}else{i=0.0;f=0.0;d=0.0;e=0.0}while(0);c[o+16>>2]=c[b+4>>2];c[o+16+4>>2]=c[b+4+4>>2];c[o+16+8>>2]=c[b+4+8>>2];c[o+16+12>>2]=c[b+4+12>>2];s=o+16+16|0;c[s>>2]=c[b+20>>2];c[s+4>>2]=c[b+20+4>>2];c[s+8>>2]=c[b+20+8>>2];c[s+12>>2]=c[b+20+12>>2];r=o+16+32|0;c[r>>2]=c[b+36>>2];c[r+4>>2]=c[b+36+4>>2];c[r+8>>2]=c[b+36+8>>2];c[r+12>>2]=c[b+36+12>>2];q=o+16+48|0;c[q>>2]=c[b+52>>2];c[q+4>>2]=c[b+52+4>>2];c[q+8>>2]=c[b+52+8>>2];c[q+12>>2]=c[b+52+12>>2];f=-f;p=-i;j=-d;yh(o+16|0,o);d=+g[o>>2];t=+g[o+12>>2];m=+g[o+8>>2];i=+g[o+4>>2];k=e*d+t*f+m*p-i*j;n=d*j+(t*p+e*i)-m*f;h=t*j+e*m+i*f-d*p;j=e*t-d*f-i*p-m*j;m=k*(2.0/(j*j+(h*h+(k*k+n*n))));p=n*(2.0/(j*j+(h*h+(k*k+n*n))));i=h*(2.0/(j*j+(h*h+(k*k+n*n))));g[o+16>>2]=1.0-(n*p+h*i);g[o+16+4>>2]=k*p-j*i;g[o+16+8>>2]=k*i+j*p;g[o+16+12>>2]=0.0;g[o+16+16>>2]=k*p+j*i;g[o+16+20>>2]=1.0-(k*m+h*i);g[o+16+24>>2]=n*i-j*m;g[o+16+28>>2]=0.0;g[o+16+32>>2]=k*i-j*p;g[o+16+36>>2]=n*i+j*m;g[o+16+40>>2]=1.0-(k*m+n*p);g[o+16+44>>2]=0.0;a=c[a+8>>2]|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+4>>2]=c[o+16>>2];c[a+4+4>>2]=c[o+16+4>>2];c[a+4+8>>2]=c[o+16+8>>2];c[a+4+12>>2]=c[o+16+12>>2];c[a+20>>2]=c[s>>2];c[a+20+4>>2]=c[s+4>>2];c[a+20+8>>2]=c[s+8>>2];c[a+20+12>>2]=c[s+12>>2];c[a+36>>2]=c[r>>2];c[a+36+4>>2]=c[r+4>>2];c[a+36+8>>2]=c[r+8>>2];c[a+36+12>>2]=c[r+12>>2];c[a+52>>2]=c[q>>2];c[a+52+4>>2]=c[q+4>>2];c[a+52+8>>2]=c[q+8>>2];c[a+52+12>>2]=c[q+12>>2];l=o;return}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+160|0;e=c[a+4>>2]|0;f=c[e+12>>2]|0;D=+g[f>>2];C=+g[f+4>>2];B=+g[f+8>>2];A=+g[f+16>>2];z=+g[f+20>>2];y=+g[f+24>>2];r=+g[f+32>>2];p=+g[f+36>>2];n=+g[f+40>>2];e=c[(c[e+4>>2]|0)+28>>2]|0;x=+g[e+(d*80|0)>>2];w=+g[e+(d*80|0)+16>>2];v=+g[e+(d*80|0)+32>>2];u=+g[e+(d*80|0)+4>>2];t=+g[e+(d*80|0)+20>>2];s=+g[e+(d*80|0)+36>>2];q=+g[e+(d*80|0)+8>>2];o=+g[e+(d*80|0)+24>>2];m=+g[e+(d*80|0)+40>>2];F=+g[e+(d*80|0)+48>>2];E=+g[e+(d*80|0)+52>>2];i=+g[e+(d*80|0)+56>>2];k=+g[f+48>>2]+(D*F+C*E+B*i);j=+g[f+52>>2]+(A*F+z*E+y*i);i=+g[f+56>>2]+(r*F+p*E+n*i);g[h+88>>2]=D*x+C*w+B*v;g[h+88+4>>2]=D*u+C*t+B*s;g[h+88+8>>2]=D*q+C*o+B*m;g[h+88+12>>2]=0.0;g[h+88+16>>2]=A*x+z*w+y*v;g[h+88+20>>2]=A*u+z*t+y*s;g[h+88+24>>2]=A*q+z*o+y*m;g[h+88+28>>2]=0.0;g[h+88+32>>2]=r*x+p*w+n*v;g[h+88+36>>2]=r*u+p*t+n*s;g[h+88+40>>2]=r*q+p*o+n*m;g[h+88+44>>2]=0.0;g[h+88+48>>2]=k;g[h+88+52>>2]=j;g[h+88+56>>2]=i;g[h+88+60>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,h+88|0,h+72|0,h+56|0);i=+g[(c[a+20>>2]|0)+32>>2];g[h+72>>2]=+g[h+72>>2]-i;g[h+72+4>>2]=+g[h+72+4>>2]-i;g[h+72+8>>2]=+g[h+72+8>>2]-i;g[h+56>>2]=i+ +g[h+56>>2];g[h+56+4>>2]=i+ +g[h+56+4>>2];g[h+56+8>>2]=i+ +g[h+56+8>>2];f=c[a+8>>2]|0;e=c[f+4>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,c[f+12>>2]|0,h+40|0,h+24|0);if(!(+g[h+72>>2]>+g[h+24>>2])?!(+g[h+56>>2]<+g[h+40>>2]):0)e=1;else e=0;if(!(!(+g[h+72+8>>2]>+g[h+24+8>>2])?!(+g[h+56+8>>2]<+g[h+40+8>>2]):0))e=0;if(+g[h+72+4>>2]>+g[h+24+4>>2]){l=h;return}if(+g[h+56+4>>2]<+g[h+40+4>>2]|e^1){l=h;return}e=c[a+4>>2]|0;f=c[e+8>>2]|0;c[h>>2]=e;c[h+4>>2]=b;c[h+8>>2]=f;c[h+12>>2]=h+88;c[h+16>>2]=-1;c[h+20>>2]=d;if(!(+g[(c[a+20>>2]|0)+32>>2]>0.0)){e=c[(c[a+24>>2]|0)+(d<<2)>>2]|0;if(!e){f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,c[a+28>>2]|0,1)|0;c[(c[a+24>>2]|0)+(d<<2)>>2]=f;f=c[(c[a+24>>2]|0)+(d<<2)>>2]|0}else f=e}else{f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,0,2)|0}b=c[a+20>>2]|0;e=c[b+8>>2]|0;if((c[e+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)){c[b+8>>2]=h;Sb[c[(c[b>>2]|0)+8>>2]&127](b,-1,d)}else{e=c[b+12>>2]|0;c[b+12>>2]=h;Sb[c[(c[b>>2]|0)+12>>2]&127](b,-1,d)}Zb[c[(c[f>>2]|0)+8>>2]&31](f,h,c[a+8>>2]|0,c[a+16>>2]|0,c[a+20>>2]|0);d=c[a+20>>2]|0;c[((c[(c[d+8>>2]|0)+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)?d+8|0:d+12|0)>>2]=e;l=h;return}function xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,H=0.0,I=0.0,J=0.0;Tg(a,b+(c*284|0)|0,d);m=+g[b+(c*284|0)+52>>2];h=+g[b+(c*284|0)+56>>2];q=+g[b+(c*284|0)+60>>2];J=+g[b+(c*284|0)+76>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+68>>2];w=1.0/+D(+((x*-m-z*-h)*(x*-m-z*-h)+((J*-h-x*-q)*(J*-h-x*-q)+(z*-q-J*-m)*(z*-q-J*-m))));v=(J*-h-x*-q)*w;u=w*(z*-q-J*-m);w=w*(x*-m-z*-h);e=+g[b+(c*284|0)+232>>2]*.5;k=+G(+e)/+D(+(m*m+h*h+q*q));e=+F(+e);l=2.0/(e*e+(k*-q*k*-q+(k*-m*k*-m+k*-h*k*-h)));H=1.0-(k*-h*k*-h*l+k*-q*k*-q*l);E=k*-m*k*-h*l-e*k*-q*l;I=k*-m*k*-q*l+e*k*-h*l;B=k*-m*k*-h*l+e*k*-q*l;A=1.0-(k*-m*k*-m*l+k*-q*k*-q*l);C=k*-h*k*-q*l-e*k*-m*l;j=k*-m*k*-q*l-e*k*-h*l;e=k*-h*k*-q*l+e*k*-m*l;l=1.0-(k*-m*k*-m*l+k*-h*k*-h*l);k=+g[b+(c*284|0)+236>>2]*-.5;y=+G(+k)/+D(+(J*J+(x*x+z*z)));k=+F(+k);r=2.0/(k*k+(J*y*J*y+(z*y*z*y+x*y*x*y)));n=1.0-(x*y*x*y*r+J*y*J*y*r);i=z*y*x*y*r-k*J*y*r;t=z*y*J*y*r+k*x*y*r;o=z*y*x*y*r+k*J*y*r;f=1.0-(z*y*z*y*r+J*y*J*y*r);s=x*y*J*y*r-k*z*y*r;p=z*y*J*y*r-k*x*y*r;k=x*y*J*y*r+k*z*y*r;r=1.0-(z*y*z*y*r+x*y*x*y*r);y=+g[b+(c*284|0)+68>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+76>>2];g[b+(c*284|0)+92>>2]=z*(H*t+E*s+I*r)+(y*(I*p+(E*o+H*n))+x*(I*k+(H*i+E*f)));g[b+(c*284|0)+96>>2]=w*(H*t+E*s+I*r)+(v*(I*p+(E*o+H*n))+u*(I*k+(H*i+E*f)));g[b+(c*284|0)+100>>2]=(H*t+E*s+I*r)*-q+((I*p+(E*o+H*n))*-m+(I*k+(H*i+E*f))*-h);g[b+(c*284|0)+104>>2]=0.0;g[b+(c*284|0)+108>>2]=z*(B*t+A*s+C*r)+(y*(C*p+(A*o+B*n))+x*(C*k+(B*i+A*f)));g[b+(c*284|0)+112>>2]=w*(B*t+A*s+C*r)+(v*(C*p+(A*o+B*n))+u*(C*k+(B*i+A*f)));g[b+(c*284|0)+116>>2]=(B*t+A*s+C*r)*-q+((C*p+(A*o+B*n))*-m+(C*k+(B*i+A*f))*-h);g[b+(c*284|0)+120>>2]=0.0;g[b+(c*284|0)+124>>2]=z*(j*t+e*s+l*r)+(y*(l*p+(e*o+j*n))+x*(l*k+(j*i+e*f)));g[b+(c*284|0)+128>>2]=w*(j*t+e*s+l*r)+(v*(l*p+(e*o+j*n))+u*(l*k+(j*i+e*f)));g[b+(c*284|0)+132>>2]=(j*t+e*s+l*r)*-q+((l*p+(e*o+j*n))*-m+(l*k+(j*i+e*f))*-h);g[b+(c*284|0)+136>>2]=0.0;h=+g[b+(c*284|0)+32>>2];f=h*+g[b+(c*284|0)+56>>2]+ +g[b+(c*284|0)+40>>2];e=h*+g[b+(c*284|0)+60>>2]+ +g[b+(c*284|0)+44>>2];g[b+(c*284|0)+140>>2]=+g[b+(c*284|0)+52>>2]*h+ +g[b+(c*284|0)+36>>2];g[b+(c*284|0)+144>>2]=f;g[b+(c*284|0)+148>>2]=e;g[b+(c*284|0)+152>>2]=0.0;return}function ye(b,d,e,f,h,i,k,l){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;c[b+4>>2]=4;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4996;g[b+688>>2]=0.0;g[b+692>>2]=-1.0;g[b+696>>2]=.8999999761581421;g[b+700>>2]=.30000001192092896;g[b+704>>2]=1.0;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;a[b+736>>0]=0;a[b+737>>0]=0;a[b+738>>0]=0;a[b+739>>0]=1;a[b+740>>0]=l&1;c[b+748>>2]=0;c[b+748+4>>2]=0;c[b+748+8>>2]=0;c[b+748+12>>2]=0;c[b+748+16>>2]=0;c[b+600>>2]=c[f>>2];c[b+600+4>>2]=c[f+4>>2];c[b+600+8>>2]=c[f+8>>2];c[b+600+12>>2]=c[f+12>>2];m=+g[d+4>>2];n=+g[d+20>>2];o=+g[d+36>>2];p=+g[i>>2];q=+g[i+4>>2];r=+g[i+8>>2];do if(!(m*p+n*q+o*r>=.9999998807907104))if(!(m*p+n*q+o*r<=-.9999998807907104)){e=(g[j>>2]=o*q-n*r,c[j>>2]|0);s=(g[j>>2]=m*r-o*p,c[j>>2]|0);f=(g[j>>2]=n*p-m*q,c[j>>2]|0);x=r*(m*r-o*p)-q*(n*p-m*q);y=p*(n*p-m*q)-r*(o*q-n*r);w=q*(o*q-n*r)-p*(m*r-o*p);break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=+g[d+12>>2];y=+g[d+28>>2];w=+g[d+44>>2];break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=-+g[d+12>>2];y=-+g[d+28>>2];w=-+g[d+44>>2]}while(0);g[b+552>>2]=x;c[b+556>>2]=e;c[b+560>>2]=c[i>>2];g[b+564>>2]=0.0;g[b+568>>2]=y;c[b+572>>2]=s;c[b+576>>2]=c[i+4>>2];g[b+580>>2]=0.0;g[b+584>>2]=w;c[b+588>>2]=f;c[b+592>>2]=c[i+8>>2];g[b+596>>2]=0.0;p=+g[i+4>>2];t=+g[k+8>>2];q=+g[i+8>>2];u=+g[k+4>>2];v=+g[k>>2];m=+g[i>>2];do if(t*q+(p*u+v*m)<-.9999998807907104)if(+C(+q)>.7071067690849304){n=1.0/+D(+(p*p+q*q));o=-(q*n);r=0.0;n=p*n;m=0.0;break}else{q=1.0/+D(+(p*p+m*m));o=m*q;r=0.0;n=0.0;m=-(p*q);break}else{z=+D(+((t*q+(p*u+v*m)+1.0)*2.0));o=(q*v-t*m)*(1.0/z);r=z*.5;n=(u*m-p*v)*(1.0/z);m=(p*t-q*u)*(1.0/z)}while(0);B=w*o+x*r-y*n;q=x*n+y*r-w*m;p=y*m+w*r-x*o;A=-(x*m)-y*o-w*n;x=-m;o=-o;w=-n;z=q*w+(A*x+r*B)-p*o;y=p*x+(A*o+r*q)-B*w;x=B*o+(A*w+r*p)-q*x;c[b+664>>2]=c[h>>2];c[b+664+4>>2]=c[h+4>>2];c[b+664+8>>2]=c[h+8>>2];c[b+664+12>>2]=c[h+12>>2];g[b+616>>2]=z;g[b+620>>2]=u*x-t*y;c[b+624>>2]=c[k>>2];g[b+628>>2]=0.0;g[b+632>>2]=y;g[b+636>>2]=t*z-v*x;c[b+640>>2]=c[k+4>>2];g[b+644>>2]=0.0;g[b+648>>2]=x;g[b+652>>2]=v*y-u*z;c[b+656>>2]=c[k+8>>2];g[b+660>>2]=0.0;g[b+732>>2]=l?-1.0:1.0;return}function ze(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0;D=l;l=l+32|0;if(!b){l=D;return}n=c[k+4>>2]|0;if((n|0)<128){if((c[k+8>>2]|0)<128){c[6995]=(c[6995]|0)+1;o=sc(531)|0;if(!o)q=0;else{c[(o+4+15&-16)+-4>>2]=o;q=o+4+15&-16}p=c[k+4>>2]|0;if((p|0)>0){o=0;do{c[q+(o<<2)>>2]=c[(c[k+12>>2]|0)+(o<<2)>>2];o=o+1|0}while((o|0)!=(p|0))}o=c[k+12>>2]|0;if(o|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[k+12>>2]=0}a[k+16>>0]=1;c[k+12>>2]=q;c[k+8>>2]=128;o=k+12|0}else o=k+12|0;do{c[(c[o>>2]|0)+(n<<2)>>2]=0;n=n+1|0}while((n|0)!=128);y=k+8|0}else{o=k+12|0;y=k+8|0}c[k+4>>2]=128;c[c[o>>2]>>2]=b;p=1;n=126;do{w=p+-1|0;q=c[o>>2]|0;x=c[q+(w<<2)>>2]|0;u=+g[x+4>>2]-+g[j+4>>2];s=+g[x+8>>2]-+g[j+8>>2];g[D>>2]=+g[x>>2]-+g[j>>2];g[D+4>>2]=u;g[D+8>>2]=s;g[D+12>>2]=0.0;s=+g[x+20>>2]-+g[i+4>>2];u=+g[x+24>>2]-+g[i+8>>2];g[D+16>>2]=+g[x+16>>2]-+g[i>>2];g[D+20>>2]=s;g[D+24>>2]=u;g[D+28>>2]=0.0;v=c[f>>2]|0;u=+g[d>>2];s=+g[e>>2];t=(+g[D+(v<<4)>>2]-u)*s;u=s*(+g[D+(1-v<<4)>>2]-u);v=c[f+4>>2]|0;s=+g[d+4>>2];E=+g[e+4>>2];r=(+g[D+(v<<4)+4>>2]-s)*E;s=E*(+g[D+(1-v<<4)+4>>2]-s);do if((!(r>u|t>s)?(A=r>t?r:t,z=s>2]|0,C=+g[d+8>>2],E=+g[e+8>>2],B=(+g[D+(v<<4)+8>>2]-C)*E,C=E*(+g[D+(1-v<<4)+8>>2]-C),!(B>z|A>C)):0)?((C0.0?(B>A?B:A)>2]|0)){Ob[c[(c[m>>2]|0)+12>>2]&127](m,x);p=w;break}if((w|0)>(n|0)){v=c[k+4>>2]|0;if((v|0)<(v<<1|0)){if((c[y>>2]|0)<(v<<1|0)){if(v){c[6995]=(c[6995]|0)+1;n=sc((v<<3|3)+16|0)|0;if(!n)q=0;else{c[(n+4+15&-16)+-4>>2]=n;q=n+4+15&-16}b=c[k+4>>2]|0;if((b|0)>0){n=0;do{c[q+(n<<2)>>2]=c[(c[o>>2]|0)+(n<<2)>>2];n=n+1|0}while((n|0)!=(b|0))}}else q=0;n=c[o>>2]|0;if(n|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[o>>2]=0}a[k+16>>0]=1;c[o>>2]=q;c[y>>2]=v<<1;n=v}else n=v;do{c[q+(n<<2)>>2]=0;n=n+1|0;q=c[o>>2]|0}while((n|0)!=(v<<1|0))}c[k+4>>2]=v<<1;n=(v<<1)+-2|0}c[q+(w<<2)>>2]=c[x+36>>2];c[(c[o>>2]|0)+(p<<2)>>2]=c[x+40>>2];p=p+1|0}else p=w;while(0)}while((p|0)!=0);l=D;return}function Ae(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0.0;D=l;l=l+32|0;q=+g[d>>2];h=(g[j>>2]=q,c[j>>2]|0);t=q<999999984306749440.0?h:1566444395;p=+g[d+4>>2];k=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?k:1566444395;E=+g[d+8>>2];n=(g[j>>2]=E,c[j>>2]|0);w=E<999999984306749440.0?n:1566444395;r=+g[d+12>>2];y=r<0.0?r:0.0;h=q>-999999984306749440.0?h:-581039253;k=p>-999999984306749440.0?k:-581039253;n=E>-999999984306749440.0?n:-581039253;r=r>0.0?r:0.0;E=+g[d+16>>2];B=E<(c[j>>2]=t,+g[j>>2]);i=(g[j>>2]=E,c[j>>2]|0);t=B?i:t;p=+g[d+20>>2];B=p<(c[j>>2]=u,+g[j>>2]);m=(g[j>>2]=p,c[j>>2]|0);u=B?m:u;q=+g[d+24>>2];B=q<(c[j>>2]=w,+g[j>>2]);o=(g[j>>2]=q,c[j>>2]|0);w=B?o:w;s=+g[d+28>>2];y=s>2]=h,+g[j>>2])>2]=k,+g[j>>2])>2]=n,+g[j>>2])>2];B=E<(c[j>>2]=t,+g[j>>2]);h=(g[j>>2]=E,c[j>>2]|0);B=B?h:t;q=+g[d+36>>2];A=q<(c[j>>2]=u,+g[j>>2]);i=(g[j>>2]=q,c[j>>2]|0);A=A?i:u;r=+g[d+40>>2];z=r<(c[j>>2]=w,+g[j>>2]);k=(g[j>>2]=r,c[j>>2]|0);z=z?k:w;p=+g[d+44>>2];y=p>2]=x,+g[j>>2])>2]=v,+g[j>>2])>2]=m,+g[j>>2])>2]|0;h=c[t+4>>2]|0;if((h|0)==(c[t+8>>2]|0)?(C=h|0?h<<1:1,(h|0)<(C|0)):0){if(!C)o=0;else{c[6995]=(c[6995]|0)+1;h=sc(C<<6|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[t+4>>2]|0}if((h|0)>0){i=0;do{k=o+(i<<6)|0;m=(c[t+12>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(h|0))}h=c[t+12>>2]|0;if(h|0){if(a[t+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[t+12>>2]=0}a[t+16>>0]=1;c[t+12>>2]=o;c[t+8>>2]=C;h=c[t+4>>2]|0}C=c[t+12>>2]|0;c[C+(h<<6)>>2]=B;c[C+(h<<6)+4>>2]=A;c[C+(h<<6)+8>>2]=z;g[C+(h<<6)+12>>2]=y;c[C+(h<<6)+16>>2]=w;c[C+(h<<6)+20>>2]=v;c[C+(h<<6)+24>>2]=u;g[C+(h<<6)+28>>2]=p;c[C+(h<<6)+32>>2]=-1;c[C+(h<<6)+36>>2]=e;c[C+(h<<6)+40>>2]=f;f=C+(h<<6)+44|0;c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];c[f+16>>2]=c[D+16>>2];c[t+4>>2]=(c[t+4>>2]|0)+1;l=D;return}function Be(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;o=l;l=l+16|0;n=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];k=+g[e>>2];m=+g[e+4>>2];h=+g[e+8>>2];if(!(a[b+232>>0]|0)){z=+g[b+104>>2];w=+g[b+120>>2];C=+g[b+136>>2];y=+g[b+108>>2];u=+g[b+124>>2];B=+g[b+140>>2];x=+g[b+112>>2];s=+g[b+128>>2];A=+g[b+144>>2];F=-+g[b+152>>2];E=-+g[b+156>>2];D=-+g[b+160>>2];J=+g[b+168>>2];I=+g[b+172>>2];r=+g[b+176>>2];H=+g[b+184>>2];G=+g[b+188>>2];q=+g[b+192>>2];v=+g[b+200>>2];t=+g[b+204>>2];p=+g[b+208>>2];r=h*(C*J+B*I+A*r)+(k*(z*J+y*I+x*r)+m*(w*J+u*I+s*r))+(J*(z*F+w*E+C*D)+(y*F+u*E+B*D)*I+(x*F+s*E+A*D)*r+ +g[b+216>>2]);q=h*(C*H+B*G+A*q)+(k*(z*H+y*G+x*q)+m*(w*H+u*G+s*q))+((z*F+w*E+C*D)*H+(y*F+u*E+B*D)*G+(x*F+s*E+A*D)*q+ +g[b+220>>2]);p=(z*F+w*E+C*D)*v+(y*F+u*E+B*D)*t+(x*F+s*E+A*D)*p+ +g[b+224>>2]+(h*(C*v+B*t+A*p)+(k*(z*v+y*t+x*p)+m*(w*v+u*t+s*p)));g[o>>2]=r;g[o+4>>2]=q;g[o+8>>2]=p;n=(n*f+k-r)*+g[d>>2]+(i*f+m-q)*+g[d+4>>2]+(j*f+h-p)*+g[d+8>>2];e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,n);l=o;return}else{z=+g[b+40>>2];C=+g[b+56>>2];w=+g[b+72>>2];A=+g[b+44>>2];E=+g[b+60>>2];x=+g[b+76>>2];B=+g[b+48>>2];G=+g[b+64>>2];y=+g[b+80>>2];t=-+g[b+88>>2];u=-+g[b+92>>2];v=-+g[b+96>>2];p=+g[b+168>>2];q=+g[b+172>>2];H=+g[b+176>>2];r=+g[b+184>>2];s=+g[b+188>>2];I=+g[b+192>>2];D=+g[b+200>>2];F=+g[b+204>>2];J=+g[b+208>>2];H=(j*f+h)*(w*p+x*q+y*H)+((n*f+k)*(z*p+A*q+B*H)+(i*f+m)*(C*p+E*q+G*H))+(p*(z*t+C*u+w*v)+(A*t+E*u+x*v)*q+(B*t+G*u+y*v)*H+ +g[b+216>>2]);I=(j*f+h)*(w*r+x*s+y*I)+((n*f+k)*(z*r+A*s+B*I)+(i*f+m)*(C*r+E*s+G*I))+((z*t+C*u+w*v)*r+(A*t+E*u+x*v)*s+(B*t+G*u+y*v)*I+ +g[b+220>>2]);J=(z*t+C*u+w*v)*D+(A*t+E*u+x*v)*F+(B*t+G*u+y*v)*J+ +g[b+224>>2]+((j*f+h)*(w*D+x*F+y*J)+((n*f+k)*(z*D+A*F+B*J)+(i*f+m)*(C*D+E*F+G*J)));g[o>>2]=H+n*(n*(H-k)+i*(I-m)+j*(J-h));g[o+4>>2]=I+i*(n*(H-k)+i*(I-m)+j*(J-h));g[o+8>>2]=J+j*(n*(H-k)+i*(I-m)+j*(J-h));J=n*(H-k)+i*(I-m)+j*(J-h);e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,J);l=o;return}}function Ce(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;c[a+556>>2]=c[b>>2];c[a+556+4>>2]=c[b+4>>2];c[a+556+8>>2]=c[b+8>>2];c[a+556+12>>2]=c[b+12>>2];q=+g[a+568>>2];j=+g[5957];r=+g[a+560>>2];e=+g[5959];o=+g[a+564>>2];h=+g[5958];p=+g[a+556>>2];i=(j*o+q*h-e*p)*-o+(q*(q*j+r*e-o*h)+(-(j*p)-r*h-e*o)*-p)-(q*e+h*p-j*r)*-r;k=(q*e+h*p-j*r)*-p+(q*(j*o+q*h-e*p)+(-(j*p)-r*h-e*o)*-r)-(q*j+r*e-o*h)*-o;d=(q*j+r*e-o*h)*-r+((-(j*p)-r*h-e*o)*-o+q*(q*e+h*p-j*r))-(j*o+q*h-e*p)*-p;do if(e*d+(h*k+j*i)<-.9999998807907104)if(+C(+e)>.7071067690849304){d=1.0/+D(+(e*e+h*h));l=-(e*d);f=0.0;d=h*d;e=0.0;break}else{f=1.0/+D(+(j*j+h*h));l=j*f;f=-(h*f);d=0.0;e=0.0;break}else{v=+D(+((e*d+(h*k+j*i)+1.0)*2.0));l=(e*i-j*d)*(1.0/v);f=(h*d-e*k)*(1.0/v);d=(j*k-h*i)*(1.0/v);e=v*.5}while(0);m=1.0/+D(+(f*f+l*l+d*d+e*e));t=f*m;n=l*m;s=d*m;m=e*m;e=1.0/+D(+((m*q-p*-t-r*-n-o*-s)*(m*q-p*-t-r*-n-o*-s)+((q*-s+m*o+r*-t-p*-n)*(q*-s+m*o+r*-t-p*-n)+((p*m+q*-t+o*-n-r*-s)*(p*m+q*-t+o*-n-r*-s)+(p*-s+(q*-n+m*r)-o*-t)*(p*-s+(q*-n+m*r)-o*-t)))));h=(p*m+q*-t+o*-n-r*-s)*e;v=e*(p*-s+(q*-n+m*r)-o*-t);f=e*(q*-s+m*o+r*-t-p*-n);p=e*(m*q-p*-t-r*-n-o*-s);e=+g[a+444>>2];if(e>=.05000000074505806?(u=+g[a+448>>2],u>=.05000000074505806):0){d=m<-1.0?-1.0:m;d=+I(+(d>1.0?1.0:d))*2.0;if(d>1.1920928955078125e-07){i=1.0/+D(+(s*s+(t*t+n*n)));if(+C(+(n*i))>1.1920928955078125e-07){k=t*i;j=n*i;l=s*i;e=+D(+((s*i*s*i/(n*i*n*i)+1.0)/(1.0/(u*u)+s*i*s*i/(n*i*n*i)/(e*e))))}else{k=t*i;j=n*i;l=s*i}}else{k=0.0;j=0.0;l=0.0;e=0.0}if(+C(+d)>1.1920928955078125e-07){if(!(d>e)){e=-e;if(d>2];if(k>=.05000000074505806){d=p<-1.0?-1.0:p;d=+I(+(d>1.0?1.0:d))*2.0;if(d>3.1415927410125732){d=-p<-1.0?-1.0:-p;d=+I(+(d>1.0?1.0:d))*2.0;e=-h;i=-v;j=-f}else{e=h;i=v;j=f}if(d>1.1920928955078125e-07){u=1.0/+D(+(e*e+i*i+j*j));e=e*u;i=i*u;j=j*u}if(+C(+d)>1.1920928955078125e-07){if(!(d>k)){if(d<-k)d=-k}else d=k;v=d*.5;d=+G(+v)/+D(+(j*j+(i*i+e*e)));h=e*d;f=j*d;e=+F(+v);d=i*d}else{e=p;d=v}}else{e=p;d=v}g[a+556>>2]=n*f+(m*h+o*e)-l*d;g[a+560>>2]=l*h+(m*d+n*e)-o*f;g[a+564>>2]=o*d+(m*f+l*e)-n*h;g[a+568>>2]=m*e-o*h-n*d-l*f;return}function De(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;r=l;l=l+32|0;e=c[b+128>>2]|0;if((e|0)>0){f=0;do{xe(c[b+108>>2]|0,c[b+136>>2]|0,f,0);f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0))}q=c[b+108>>2]|0;m=+g[q+372>>2];n=+g[q+376>>2];h=+g[q+380>>2];h=+D(+(m*m+n*n+h*h))*3.5999999046325684;g[b+104>>2]=h;p=c[b+120>>2]|0;if(+g[q+4+(p<<2)>>2]*+g[q+372>>2]+ +g[q+20+(p<<2)>>2]*+g[q+376>>2]+ +g[q+36+(p<<2)>>2]*+g[q+380>>2]<0.0)g[b+104>>2]=-h;if((e|0)>0){e=0;do{+wf(b,(c[b+136>>2]|0)+(e*284|0)|0);e=e+1|0;f=c[b+128>>2]|0}while((e|0)<(f|0));i=1.0/+g[(c[b+108>>2]|0)+404>>2];if((f|0)>0){f=0;do{e=c[b+136>>2]|0;if(!(a[e+(f*284|0)+84>>0]|0))h=0.0;else{h=+g[e+(f*284|0)+272>>2];h=i*(+g[e+(f*284|0)+216>>2]*(+g[e+(f*284|0)+204>>2]-+g[e+(f*284|0)+32>>2])*+g[e+(f*284|0)+268>>2]-h*+g[(h<0.0?e+(f*284|0)+220|0:e+(f*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[e+(f*284|0)+276>>2]=h;f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0));if((e|0)>0){e=0;do{p=c[b+136>>2]|0;k=+g[p+(e*284|0)+276>>2];n=+g[p+(e*284|0)+248>>2];k=k>n?n:k;n=k*+g[p+(e*284|0)+4>>2]*d;m=k*+g[p+(e*284|0)+8>>2]*d;g[r+16>>2]=+g[p+(e*284|0)>>2]*k*d;g[r+16+4>>2]=n;g[r+16+8>>2]=m;g[r+16+12>>2]=0.0;q=c[b+108>>2]|0;m=+g[p+(e*284|0)+20>>2]-+g[q+56>>2];n=+g[p+(e*284|0)+24>>2]-+g[q+60>>2];g[r>>2]=+g[p+(e*284|0)+16>>2]-+g[q+52>>2];g[r+4>>2]=m;g[r+8>>2]=n;g[r+12>>2]=0.0;ll(q,r+16|0,r);e=e+1|0}while((e|0)<(c[b+128>>2]|0))}}}Jb[c[(c[b>>2]|0)+20>>2]&31](b,d);o=c[b+128>>2]|0;if((o|0)<=0){l=r;return}p=c[b+136>>2]|0;q=c[b+108>>2]|0;f=0;do{h=+g[p+(f*284|0)+36>>2]-+g[q+52>>2];i=+g[p+(f*284|0)+40>>2]-+g[q+56>>2];j=+g[p+(f*284|0)+44>>2]-+g[q+60>>2];k=+g[q+392>>2];m=+g[q+396>>2];n=+g[q+388>>2];if(!(a[p+(f*284|0)+84>>0]|0)){s=p+(f*284|0)+240|0;e=s;h=+g[s>>2]}else{e=c[b+120>>2]|0;y=+g[q+4+(e<<2)>>2];w=+g[q+20+(e<<2)>>2];u=+g[q+36+(e<<2)>>2];x=+g[p+(f*284|0)>>2];v=+g[p+(f*284|0)+4>>2];t=+g[p+(f*284|0)+8>>2];h=((i*n-h*k+ +g[q+380>>2])*(u-t*(y*x+w*v+u*t))+((k*j-i*m+ +g[q+372>>2])*(y-x*(y*x+w*v+u*t))+(h*m-j*n+ +g[q+376>>2])*(w-v*(y*x+w*v+u*t))))*d/+g[p+(f*284|0)+212>>2];e=p+(f*284|0)+240|0;g[e>>2]=h}s=p+(f*284|0)+236|0;g[s>>2]=h+ +g[s>>2];g[e>>2]=h*.9900000095367432;f=f+1|0}while((f|0)!=(o|0));l=r;return}function Ee(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(!((a|0)!=0&(b|0)!=0))return;c[6995]=(c[6995]|0)+1;e=sc(1043)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}c[f>>2]=a;c[f+4>>2]=b;e=1;b=124;h=128;a=f;l=128;k=f;i=f;o=f;while(1){r=e+-1|0;p=c[a+(r<<3)>>2]|0;q=c[a+(r<<3)+4>>2]|0;if((r|0)>(b|0)){n=l<<1;do if((l|0)<(n|0)&(h|0)<(n|0)){if(l){c[6995]=(c[6995]|0)+1;b=sc((l<<4|3)+16|0)|0;if(!b)f=0;else{c[(b+4+15&-16)+-4>>2]=b;f=b+4+15&-16}if((l|0)>0){b=0;do{j=a+(b<<3)|0;k=c[j+4>>2]|0;m=f+(b<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;b=b+1|0}while((b|0)!=(l|0));h=f;a=f}else{h=f;b=f;s=12}}else{h=0;b=0;s=12}if((s|0)==12){s=0;if(!a){j=n;a=b;f=h;i=h;b=h;break}else a=b}if(!o){j=n;f=h;i=h;b=h}else{c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);j=n;f=h;i=h;b=h}}else{j=h;f=k;b=o}while(0);m=n+-4|0;h=j;l=n;k=f;j=b}else{m=b;j=o}do if((p|0)==(q|0))if(!(c[p+40>>2]|0))e=r;else{q=c[p+36>>2]|0;c[a+(r<<3)>>2]=q;c[a+(r<<3)+4>>2]=q;q=c[p+40>>2]|0;r=e+1|0;c[a+(e<<3)>>2]=q;c[a+(e<<3)+4>>2]=q;q=c[p+40>>2]|0;c[a+(r<<3)>>2]=c[p+36>>2];c[a+(r<<3)+4>>2]=q;e=e+2|0}else if(((((+g[p>>2]<=+g[q+16>>2]?+g[p+16>>2]>=+g[q>>2]:0)?+g[p+4>>2]<=+g[q+20>>2]:0)?+g[p+20>>2]>=+g[q+4>>2]:0)?+g[p+8>>2]<=+g[q+24>>2]:0)?+g[p+24>>2]>=+g[q+8>>2]:0){b=(c[q+40>>2]|0)!=0;if(!(c[p+40>>2]|0))if(b){o=c[q+36>>2]|0;c[a+(r<<3)>>2]=p;c[a+(r<<3)+4>>2]=o;r=c[q+40>>2]|0;c[a+(e<<3)>>2]=p;c[a+(e<<3)+4>>2]=r;e=e+1|0;break}else{Sb[c[(c[d>>2]|0)+8>>2]&127](d,p,q);e=r;break}else{f=c[p+36>>2]|0;if(b){n=c[q+36>>2]|0;c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=n;n=c[q+36>>2]|0;o=e+1|0;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=n;n=c[q+40>>2]|0;r=e+2|0;c[a+(o<<3)>>2]=c[p+36>>2];c[a+(o<<3)+4>>2]=n;q=c[q+40>>2]|0;c[a+(r<<3)>>2]=c[p+40>>2];c[a+(r<<3)+4>>2]=q;e=e+3|0;break}else{c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=q;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=q;e=e+1|0;break}}}else e=r;while(0);if(!e)break;else{b=m;o=j}}if((a|0)==0|(k|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);return}function Fe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0,J=0.0;d=l;l=l+96|0;k=+g[b>>2];m=+g[a+28>>2];n=+g[b+4>>2];o=+g[a+32>>2];p=+g[b+8>>2];q=+g[a+36>>2];r=+g[a+44>>2];s=+g[a+48>>2];t=+g[a+52>>2];u=+g[a+60>>2];v=+g[a+64>>2];w=+g[a+68>>2];x=+g[a+76>>2];y=+g[a+80>>2];z=+g[a+84>>2];g[d+80>>2]=k*m+n*o+p*q+x;g[d+80+4>>2]=k*r+n*s+p*t+y;g[d+80+8>>2]=k*u+n*v+p*w+z;g[d+80+12>>2]=0.0;A=+g[b+16>>2];B=+g[b+20>>2];C=+g[b+24>>2];g[d+64>>2]=A*m+B*o+C*q+x;g[d+64+4>>2]=A*r+B*s+C*t+y;g[d+64+8>>2]=A*u+B*v+C*w+z;g[d+64+12>>2]=0.0;E=+g[b+32>>2];F=+g[b+36>>2];j=+g[b+40>>2];g[d+48>>2]=E*m+F*o+j*q+x;g[d+48+4>>2]=E*r+F*s+j*t+y;g[d+48+8>>2]=E*u+F*v+j*w+z;g[d+48+12>>2]=0.0;f=(k*m+n*o+p*q+x+(A*m+B*o+C*q+x)+(E*m+F*o+j*q+x))*.3333333432674408;h=(k*r+n*s+p*t+y+(A*r+B*s+C*t+y)+(E*r+F*s+j*t+y))*.3333333432674408;i=(k*u+n*v+p*w+z+(A*u+B*v+C*w+z)+(E*u+F*v+j*w+z))*.3333333432674408;g[d+32>>2]=f;g[d+32+4>>2]=h;g[d+32+8>>2]=i;g[d+32+12>>2]=0.0;b=c[a+8>>2]|0;if(!((xb[c[(c[b>>2]|0)+56>>2]&127](b)|0)&16384)){e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;b=a+12|0;Vb[G&127](e,d+80|0,d+64|0,b);e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;Vb[G&127](e,d+64|0,d+48|0,b);a=c[a+8>>2]|0;e=c[a>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](a,d+48|0,d+80|0,b);l=d;return}J=+g[d+80>>2];I=A*r+B*s+C*t+y-(k*r+n*s+p*t+y);H=A*u+B*v+C*w+z-(k*u+n*v+p*w+z);y=E*r+F*s+j*t+y-(k*r+n*s+p*t+y);w=E*u+F*v+j*w+z-(k*u+n*v+p*w+z);z=H*(E*m+F*o+j*q+x-J)-(A*m+B*o+C*q+x-J)*w;F=(A*m+B*o+C*q+x-J)*y-I*(E*m+F*o+j*q+x-J);E=1.0/+D(+(F*F+((I*w-H*y)*(I*w-H*y)+z*z)));c[d+16>>2]=1065353216;c[d+16+4>>2]=1065353216;c[d+16+8>>2]=0;g[d+16+12>>2]=0.0;b=c[a+8>>2]|0;e=c[(c[b>>2]|0)+16>>2]|0;g[d>>2]=E*(I*w-H*y)+f;g[d+4>>2]=E*z+h;g[d+8>>2]=E*F+i;g[d+12>>2]=0.0;Vb[e&127](b,d+32|0,d,d+16|0);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;G=a+12|0;Vb[e&127](b,d+80|0,d+64|0,G);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](b,d+64|0,d+48|0,G);a=c[a+8>>2]|0;b=c[a>>2]|0;b=b+16|0;b=c[b>>2]|0;Vb[b&127](a,d+48|0,d+80|0,G);l=d;return}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0.0;a=l;l=l+144|0;switch(c[b+448>>2]&15){case 1:{c[a+112>>2]=3572;h=c[d+8>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;i=c[d+12>>2]|0;j=+g[i+48>>2];e=+g[i+52>>2];f=+g[i+56>>2];f=+D(+((j-j)*(j-j)+(e-e)*(e-e)+(f-f)*(f-f)));i=c[b+192>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+96|0,a+64|0);c[a>>2]=c[a+96>>2];c[a+4>>2]=c[a+96+4>>2];c[a+8>>2]=c[a+96+8>>2];c[a+12>>2]=c[a+96+12>>2];c[a+16>>2]=c[a+64>>2];c[a+16+4>>2]=c[a+64+4>>2];c[a+16+8>>2]=c[a+64+8>>2];c[a+16+12>>2]=c[a+64+12>>2];c[a+32>>2]=c[a>>2];c[a+32+4>>2]=c[a+4>>2];c[a+32+8>>2]=c[a+8>>2];c[a+32+12>>2]=c[a+12>>2];c[a+32+16>>2]=c[a+16>>2];c[a+32+20>>2]=c[a+20>>2];c[a+32+24>>2]=c[a+24>>2];c[a+32+28>>2]=c[a+28>>2];g[a+32>>2]=+g[a+32>>2]-e;g[a+32+4>>2]=+g[a+32+4>>2]-e;g[a+32+8>>2]=+g[a+32+8>>2]-e;g[a+32+16>>2]=e+ +g[a+32+16>>2];g[a+32+20>>2]=e+ +g[a+32+20>>2];g[a+32+24>>2]=e+ +g[a+32+24>>2];c[a+112+4>>2]=b;c[a+112+8>>2]=d;c[a+112+12>>2]=h;g[a+112+16>>2]=f+e;g[a+112+20>>2]=e;Bf(c[b+988>>2]|0,a+32|0,a+112|0);l=a;return}case 2:{g[a+4>>2]=1.0;c[a+8+4>>2]=0;c[a+8+4+4>>2]=0;c[a+8+4+8>>2]=0;c[a>>2]=3608;c[a+24>>2]=b;c[a+28>>2]=d;c[a+8>>2]=c[b+516>>2];i=c[d+4>>2]|0;j=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+192>>2]|0;j=j+ +nb[c[(c[i>>2]|0)+48>>2]&15](i);g[a+12>>2]=j;f=+g[(c[d+8>>2]|0)+228>>2];g[a+112>>2]=f;c[a+16>>2]=c[(+g[b+376>>2]>2];i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+112|0,a+96|0);c[a+32>>2]=c[a+112>>2];c[a+32+4>>2]=c[a+112+4>>2];c[a+32+8>>2]=c[a+112+8>>2];c[a+32+12>>2]=c[a+112+12>>2];c[a+32+16>>2]=c[a+96>>2];c[a+32+16+4>>2]=c[a+96+4>>2];c[a+32+16+8>>2]=c[a+96+8>>2];c[a+32+16+12>>2]=c[a+96+12>>2];c[a+64>>2]=c[a+32>>2];c[a+64+4>>2]=c[a+32+4>>2];c[a+64+8>>2]=c[a+32+8>>2];c[a+64+12>>2]=c[a+32+12>>2];c[a+64+16>>2]=c[a+32+16>>2];c[a+64+20>>2]=c[a+32+20>>2];c[a+64+24>>2]=c[a+32+24>>2];c[a+64+28>>2]=c[a+32+28>>2];g[a+64>>2]=+g[a+64>>2]-j;g[a+64+4>>2]=+g[a+64+4>>2]-j;g[a+64+8>>2]=+g[a+64+8>>2]-j;g[a+64+16>>2]=j+ +g[a+64+16>>2];g[a+64+20>>2]=j+ +g[a+64+20>>2];g[a+64+24>>2]=j+ +g[a+64+24>>2];Bf(c[b+1068>>2]|0,a+64|0,a);l=a;return}default:{l=a;return}}}function He(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+48>>2]=c[f>>2];c[b+48+4>>2]=c[f+4>>2];c[b+48+8>>2]=c[f+8>>2];c[b+48+12>>2]=c[f+12>>2];c[b+64>>2]=c[f+16>>2];c[b+64+4>>2]=c[f+16+4>>2];c[b+64+8>>2]=c[f+16+8>>2];c[b+64+12>>2]=c[f+16+12>>2];c[b+80>>2]=c[f+32>>2];c[b+80+4>>2]=c[f+32+4>>2];c[b+80+8>>2]=c[f+32+8>>2];c[b+80+12>>2]=c[f+32+12>>2];c[b+96>>2]=c[f+48>>2];c[b+96+4>>2]=c[f+48+4>>2];c[b+96+8>>2]=c[f+48+8>>2];c[b+96+12>>2]=c[f+48+12>>2];c[b+112>>2]=c[h>>2];c[b+112+4>>2]=c[h+4>>2];c[b+112+8>>2]=c[h+8>>2];c[b+112+12>>2]=c[h+12>>2];c[b+128>>2]=c[h+16>>2];c[b+128+4>>2]=c[h+16+4>>2];c[b+128+8>>2]=c[h+16+8>>2];c[b+128+12>>2]=c[h+16+12>>2];c[b+144>>2]=c[h+32>>2];c[b+144+4>>2]=c[h+32+4>>2];c[b+144+8>>2]=c[h+32+8>>2];c[b+144+12>>2]=c[h+32+12>>2];c[b+160>>2]=c[h+48>>2];c[b+160+4>>2]=c[h+48+4>>2];c[b+160+8>>2]=c[h+48+8>>2];c[b+160+12>>2]=c[h+48+12>>2];d=b+680|0;e=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=i&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);return}function Ie(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;c[e+16>>2]=c[a+20>>2];c[e+20>>2]=c[a+24>>2];c[e+24>>2]=c[a+28>>2];c[e+28>>2]=c[a+32>>2];c[e>>2]=c[a+4>>2];c[e+4>>2]=c[a+8>>2];c[e+8>>2]=c[a+12>>2];c[e+12>>2]=c[a+16>>2];c[e+32>>2]=c[a+36>>2];c[e+36>>2]=c[a+40>>2];c[e+40>>2]=c[a+44>>2];c[e+44>>2]=c[a+48>>2];c[e+48>>2]=c[a+56>>2];c[e+52>>2]=d[a+60>>0];k=c[a+88>>2]|0;c[e+56>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+96>>2]|0)|0;c[e+64>>2]=k;if(k|0){i=c[a+88>>2]|0;j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,48,i)|0;if((i|0)>0){g=c[j+8>>2]|0;h=0;while(1){k=c[a+96>>2]|0;c[g+16>>2]=c[k+(h<<6)+16>>2];c[g+20>>2]=c[k+(h<<6)+20>>2];c[g+24>>2]=c[k+(h<<6)+24>>2];c[g+28>>2]=c[k+(h<<6)+28>>2];c[g>>2]=c[k+(h<<6)>>2];c[g+4>>2]=c[k+(h<<6)+4>>2];c[g+8>>2]=c[k+(h<<6)+8>>2];c[g+12>>2]=c[k+(h<<6)+12>>2];c[g+32>>2]=c[k+(h<<6)+32>>2];c[g+36>>2]=c[k+(h<<6)+36>>2];c[g+40>>2]=c[k+(h<<6)+40>>2];c[g+44>>2]=0;h=h+1|0;if((h|0)==(i|0))break;else g=g+48|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,18364,1497453121,c[a+96>>2]|0)}}else c[e+64>>2]=0;k=c[a+128>>2]|0;c[e+60>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+136>>2]|0)|0;c[e+68>>2]=k;if(k|0){j=c[a+128>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[a+136>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h+12>>2]=c[g+(i<<4)+12>>2];b[h+6>>1]=b[g+(i<<4)+6>>1]|0;b[h+8>>1]=b[g+(i<<4)+8>>1]|0;b[h+10>>1]=b[g+(i<<4)+10>>1]|0;b[h>>1]=b[g+(i<<4)>>1]|0;b[h+2>>1]=b[g+(i<<4)+2>>1]|0;b[h+4>>1]=b[g+(i<<4)+4>>1]|0;i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[a+136>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18387,1497453121,g)}}else c[e+68>>2]=0;c[e+76>>2]=c[a+144>>2];k=c[a+152>>2]|0;c[e+80>>2]=k;if(!k){c[e+72>>2]=0;return 18431}k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+160>>2]|0)|0;c[e+72>>2]=k;if(!k)return 18431;j=c[a+152>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,j)|0;if((j|0)>0){g=c[a+160>>2]|0;h=c[k+8>>2]|0;i=0;while(1){b[h+14>>1]=b[g+(i<<5)+6>>1]|0;b[h+16>>1]=b[g+(i<<5)+8>>1]|0;b[h+18>>1]=b[g+(i<<5)+10>>1]|0;b[h+8>>1]=b[g+(i<<5)>>1]|0;b[h+10>>1]=b[g+(i<<5)+2>>1]|0;b[h+12>>1]=b[g+(i<<5)+4>>1]|0;c[h>>2]=c[g+(i<<5)+12>>2];c[h+4>>2]=c[g+(i<<5)+16>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+20|0}}else g=c[a+160>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18410,1497453121,g);return 18431}function Je(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0;if(!b)b=0;else b=(c[b+252>>2]&2|0)==0?0:b;c[a+64>>2]=0;c[a+64+4>>2]=0;c[a+64+8>>2]=0;c[a+64+12>>2]=0;c[a+64+16>>2]=0;c[a+64+20>>2]=0;c[a+64+24>>2]=0;c[a+64+28>>2]=0;c[a+144>>2]=0;c[a+144+4>>2]=0;c[a+144+8>>2]=0;c[a+144+12>>2]=0;c[a+144+16>>2]=0;c[a+144+20>>2]=0;c[a+144+24>>2]=0;c[a+144+28>>2]=0;if(!b){c[a>>2]=1065353216;c[a+4>>2]=0;c[a+4+4>>2]=0;c[a+4+8>>2]=0;c[a+4+12>>2]=0;c[a+20>>2]=1065353216;c[a+24>>2]=0;c[a+24+4>>2]=0;c[a+24+8>>2]=0;c[a+24+12>>2]=0;c[a+40>>2]=1065353216;c[a+44>>2]=0;c[a+44+4>>2]=0;c[a+44+8>>2]=0;c[a+44+12>>2]=0;c[a+44+16>>2]=0;c[a+240>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+96>>2]=1065353216;c[a+100>>2]=1065353216;c[a+104>>2]=1065353216;g[a+108>>2]=0.0;c[a+112>>2]=1065353216;c[a+116>>2]=1065353216;c[a+120>>2]=1065353216;g[a+124>>2]=0.0;b=a+176|0;e=b+60|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));a=a+236|0;g[a>>2]=0.0;return}else{e=b+4|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];e=b+20|0;c[a+16>>2]=c[e>>2];c[a+16+4>>2]=c[e+4>>2];c[a+16+8>>2]=c[e+8>>2];c[a+16+12>>2]=c[e+12>>2];e=b+36|0;c[a+32>>2]=c[e>>2];c[a+32+4>>2]=c[e+4>>2];c[a+32+8>>2]=c[e+8>>2];c[a+32+12>>2]=c[e+12>>2];e=b+52|0;c[a+48>>2]=c[e>>2];c[a+48+4>>2]=c[e+4>>2];c[a+48+8>>2]=c[e+8>>2];c[a+48+12>>2]=c[e+12>>2];e=b+404|0;k=+g[e>>2];l=b+408|0;j=k*+g[b+412>>2];i=k*+g[b+416>>2];g[a+128>>2]=k*+g[l>>2];g[a+132>>2]=j;g[a+136>>2]=i;g[a+140>>2]=0.0;c[a+240>>2]=b;m=b+604|0;c[a+96>>2]=c[m>>2];c[a+96+4>>2]=c[m+4>>2];c[a+96+8>>2]=c[m+8>>2];c[a+96+12>>2]=c[m+12>>2];c[a+112>>2]=c[l>>2];c[a+112+4>>2]=c[l+4>>2];c[a+112+8>>2]=c[l+8>>2];c[a+112+12>>2]=c[l+12>>2];l=b+372|0;c[a+176>>2]=c[l>>2];c[a+176+4>>2]=c[l+4>>2];c[a+176+8>>2]=c[l+8>>2];c[a+176+12>>2]=c[l+12>>2];l=b+388|0;c[a+192>>2]=c[l>>2];c[a+192+4>>2]=c[l+4>>2];c[a+192+8>>2]=c[l+8>>2];c[a+192+12>>2]=c[l+12>>2];i=+g[e>>2];j=i*+g[b+476>>2]*d;k=i*+g[b+480>>2]*d;g[a+208>>2]=i*+g[b+472>>2]*d;g[a+212>>2]=j;g[a+216>>2]=k;g[a+220>>2]=0.0;k=+g[b+488>>2];j=+g[b+492>>2];i=+g[b+496>>2];h=(k*+g[b+328>>2]+j*+g[b+344>>2]+i*+g[b+360>>2])*d;f=(k*+g[b+332>>2]+j*+g[b+348>>2]+i*+g[b+364>>2])*d;g[a+224>>2]=(+g[b+324>>2]*k+ +g[b+340>>2]*j+ +g[b+356>>2]*i)*d;g[a+228>>2]=h;g[a+232>>2]=f;a=a+236|0;g[a>>2]=0.0;return}}function Ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0;M=l;l=l+64|0;c[M+48>>2]=a;c[M+48+4>>2]=b;c[M+48+8>>2]=d;L=+g[a>>2];z=+g[b>>2];A=+g[a+4>>2];B=+g[b+4>>2];C=+g[a+8>>2];E=+g[b+8>>2];g[M>>2]=L-z;g[M+4>>2]=A-B;g[M+8>>2]=C-E;g[M+12>>2]=0.0;F=+g[d>>2];G=+g[d+4>>2];H=+g[d+8>>2];g[M+16>>2]=z-F;g[M+20>>2]=B-G;g[M+24>>2]=E-H;g[M+28>>2]=0.0;g[M+32>>2]=F-L;g[M+36>>2]=G-A;g[M+40>>2]=H-C;g[M+44>>2]=0.0;I=(A-B)*(E-H)-(C-E)*(B-G);J=(C-E)*(z-F)-(E-H)*(L-z);K=(B-G)*(L-z)-(A-B)*(z-F);if(K*K+(I*I+J*J)>0.0){k=0;x=-1.0;y=0;m=0;h=0;o=A-B;p=C-E;i=L-z;u=L;v=A;w=C}else{L=-1.0;l=M;return +L}while(1){if(u*(K*o-J*p)+v*(I*p-K*i)+(J*i-I*o)*w>0.0){n=c[5288+(y<<2)>>2]|0;N=c[M+48+(n<<2)>>2]|0;r=+g[N>>2];i=r-u;s=+g[N+4>>2];p=s-v;t=+g[N+8>>2];q=t-w;do if(i*i+p*p+q*q>0.0){o=-(u*i+v*p+w*q)/(i*i+p*p+q*q);if(o>=1.0){k=2;i=r*r+s*s+t*t;m=0;h=1065353216;break}if(!(o<=0.0)){h=(g[j>>2]=o,c[j>>2]|0);u=u+i*o;i=v+p*o;w=w+q*o;k=3;i=w*w+(u*u+i*i);m=(g[j>>2]=1.0-o,c[j>>2]|0);break}else{k=1;i=u*u+v*v+w*w;m=1065353216;h=0;break}}else i=-1.0;while(0);if(x<0.0|i>2]=(k&1|0?1<>2]=m;c[e+(n<<2)>>2]=h;g[e+(c[5288+(n<<2)>>2]<<2)>>2]=0.0}else i=x}else i=x;n=y+1|0;if((n|0)==3)break;N=c[M+48+(n<<2)>>2]|0;x=i;y=n;o=+g[M+(n<<4)+4>>2];p=+g[M+(n<<4)+8>>2];i=+g[M+(n<<4)>>2];u=+g[N>>2];v=+g[N+4>>2];w=+g[N+8>>2]}if(!(i<0.0)){L=i;l=M;return +L}w=+D(+(K*K+(I*I+J*J)));x=(I*+g[a>>2]+J*+g[a+4>>2]+K*+g[a+8>>2])/(K*K+(I*I+J*J));c[f>>2]=7;u=+g[b>>2]-I*x;t=+g[b+4>>2]-J*x;v=+g[b+8>>2]-K*x;E=+D(+((t*(z-F)-u*(B-G))*(t*(z-F)-u*(B-G))+(((B-G)*v-t*(E-H))*((B-G)*v-t*(E-H))+(u*(E-H)-v*(z-F))*(u*(E-H)-v*(z-F)))))/w;g[e>>2]=E;z=+g[d>>2]-I*x;v=+g[d+4>>2]-J*x;B=+g[d+8>>2]-K*x;L=+D(+((v*(F-L)-z*(G-A))*(v*(F-L)-z*(G-A))+(((G-A)*B-v*(H-C))*((G-A)*B-v*(H-C))+(z*(H-C)-B*(F-L))*(z*(H-C)-B*(F-L)))))/w;g[e+4>>2]=L;g[e+8>>2]=1.0-(L+E);L=K*x*K*x+(I*x*I*x+J*x*J*x);l=M;return +L}function Le(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;d=l;l=l+144|0;g[a+36>>2]=0.0;c[d+128>>2]=0;c[d+128+4>>2]=0;c[d+128+8>>2]=0;c[d+128+12>>2]=0;b=0;do{e=d+128+(b<<2)|0;g[e>>2]=1.0;A=c[a+28>>2]|0;I=c[A+4>>2]|0;c[d+80>>2]=I;F=c[A+20>>2]|0;c[d+80+4>>2]=F;C=c[A+36>>2]|0;c[d+80+8>>2]=C;g[d+80+12>>2]=0.0;H=c[A+8>>2]|0;c[d+80+16>>2]=H;E=c[A+24>>2]|0;c[d+80+20>>2]=E;B=c[A+40>>2]|0;c[d+80+24>>2]=B;g[d+80+28>>2]=0.0;G=c[A+12>>2]|0;c[d+80+32>>2]=G;D=c[A+28>>2]|0;c[d+80+36>>2]=D;z=c[A+44>>2]|0;c[d+80+40>>2]=z;g[d+80+44>>2]=0.0;f=c[a+32>>2]|0;y=c[f+4>>2]|0;c[d+32>>2]=y;v=c[f+20>>2]|0;c[d+32+4>>2]=v;s=c[f+36>>2]|0;c[d+32+8>>2]=s;g[d+32+12>>2]=0.0;x=c[f+8>>2]|0;c[d+32+16>>2]=x;u=c[f+24>>2]|0;c[d+32+20>>2]=u;r=c[f+40>>2]|0;c[d+32+24>>2]=r;g[d+32+28>>2]=0.0;w=c[f+12>>2]|0;c[d+32+32>>2]=w;t=c[f+28>>2]|0;c[d+32+36>>2]=t;h=c[f+44>>2]|0;c[d+32+40>>2]=h;g[d+32+44>>2]=0.0;p=+g[a+300>>2];m=p*(c[j>>2]=I,+g[j>>2]);i=+g[a+304>>2];m=m+i*(c[j>>2]=H,+g[j>>2]);k=+g[a+308>>2];m=m+k*(c[j>>2]=G,+g[j>>2]);q=p*(c[j>>2]=F,+g[j>>2]);q=q+i*(c[j>>2]=E,+g[j>>2]);q=q+k*(c[j>>2]=D,+g[j>>2]);p=p*(c[j>>2]=C,+g[j>>2]);i=p+i*(c[j>>2]=B,+g[j>>2]);p=+g[A+52>>2];o=+g[A+56>>2];n=+g[A+60>>2];n=i+k*(c[j>>2]=z,+g[j>>2])+n-n;g[d+16>>2]=m+p-p;g[d+16+4>>2]=q+o-o;g[d+16+8>>2]=n;g[d+16+12>>2]=0.0;n=+g[a+316>>2];o=n*(c[j>>2]=y,+g[j>>2]);q=+g[a+320>>2];o=o+q*(c[j>>2]=x,+g[j>>2]);p=+g[a+324>>2];o=o+p*(c[j>>2]=w,+g[j>>2]);m=n*(c[j>>2]=v,+g[j>>2]);m=m+q*(c[j>>2]=u,+g[j>>2]);m=m+p*(c[j>>2]=t,+g[j>>2]);n=n*(c[j>>2]=s,+g[j>>2]);q=n+q*(c[j>>2]=r,+g[j>>2]);n=+g[f+52>>2];k=+g[f+56>>2];i=+g[f+60>>2];i=q+p*(c[j>>2]=h,+g[j>>2])+i-i;g[d>>2]=o+n-n;g[d+4>>2]=m+k-k;g[d+8>>2]=i;g[d+12>>2]=0.0;h=c[a+28>>2]|0;f=c[a+32>>2]|0;Rg(a+48+(b*84|0)|0,d+80|0,d+32|0,d+16|0,d,d+128|0,h+456|0,+g[h+404>>2],f+456|0,+g[f+404>>2]);g[e>>2]=0.0;b=b+1|0}while((b|0)!=3);l=d;return}function Me(a,b,d){a=a|0;b=b|0;d=d|0;var f=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,r+28|0,r+24|0,r+20|0,r+16|0,r+12|0,r+8|0,r+4|0,r,b);n=(c[r+12>>2]|0)+(P(c[r+8>>2]|0,d)|0)|0;q=c[a+4>>2]|0;p=(c[r+20>>2]|0)==0;o=c[r+28>>2]|0;do if((c[r>>2]|0)==3){m=c[r+16>>2]|0;k=o+(P(m,e[n+4>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+32>>2]=j;g[r+32+36>>2]=i;g[r+32+40>>2]=f;g[r+32+44>>2]=0.0;k=o+(P(m,e[n+2>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+16>>2]=j;g[r+32+20>>2]=i;g[r+32+24>>2]=f;g[r+32+28>>2]=0.0;k=o+(P(m,e[n>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2];break}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3];break}}else{k=c[r+16>>2]|0;m=o+(P(k,c[n+8>>2]|0)|0)|0;if(p){i=+g[m+4>>2]*+g[q+8>>2];j=+g[m+8>>2]*+g[q+12>>2];g[r+32+32>>2]=+g[m>>2]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+g[p+4>>2]*+g[q+8>>2];i=+g[p+8>>2]*+g[q+12>>2];g[r+32+16>>2]=+g[p>>2]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+g[p+4>>2]*+g[q+8>>2];j=+g[p>>2]*+g[q+4>>2];f=+g[p+8>>2];break}else{i=+h[m+8>>3]*+g[q+8>>2];j=+h[m+16>>3]*+g[q+12>>2];g[r+32+32>>2]=+h[m>>3]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+h[p+8>>3]*+g[q+8>>2];i=+h[p+16>>3]*+g[q+12>>2];g[r+32+16>>2]=+h[p>>3]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+h[p+8>>3]*+g[q+8>>2];j=+h[p>>3]*+g[q+4>>2];f=+h[p+16>>3];break}}while(0);f=f*+g[q+12>>2];g[r+32>>2]=j;g[r+32+4>>2]=i;g[r+32+8>>2]=f;g[r+32+12>>2]=0.0;q=c[a+8>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,r+32|0,b,d);q=c[a+4>>2]|0;Ob[c[(c[q>>2]|0)+24>>2]&127](q,b);l=r;return}function Ne(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;c[b>>2]=9184;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=0;c[b+20>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;c[b+52>>2]=-1;c[b+56>>2]=0;c[b+60>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;c[b+164>>2]=0;a[b+153>>0]=0;a[b+154>>0]=1;a[b+152>>0]=((d|0)!=0^1)&1;g[b+100>>2]=0.0;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+128>>2]=0;c[b+132>>2]=0;g[b+136>>2]=0.0;if(d|0)n=0;else{c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Li(d);n=c[b+160>>2]|0}c[b+96>>2]=d;c[b+148>>2]=0;c[b+140>>2]=0;c[b+144>>2]=0;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;a[o+16>>0]=1;c[o+12>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;if((n|0)<=1){if((n|0)!=1){if((c[b+164>>2]|0)<1){c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)m=0;else{c[(d+4+15&-16)+-4>>2]=d;m=d+4+15&-16}e=c[b+160>>2]|0;if((e|0)>0){d=0;do{pj(m+(d*20|0)|0,(c[b+168>>2]|0)+(d*20|0)|0);d=d+1|0}while((d|0)!=(e|0));e=c[b+160>>2]|0;if((e|0)>0){d=0;do{h=c[b+168>>2]|0;i=h+(d*20|0)+4|0;j=h+(d*20|0)+12|0;k=c[j>>2]|0;f=h+(d*20|0)+16|0;if(k|0){if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[f>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(e|0))}}d=c[b+168>>2]|0;if(d|0){if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0}a[b+172>>0]=1;c[b+168>>2]=m;c[b+164>>2]=1;d=n}else d=n;while(1){pj((c[b+168>>2]|0)+(d*20|0)|0,o);if(!d)break;else d=d+1|0}d=c[o+12>>2]|0;c[b+160>>2]=1;if(!d){l=o;return}if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+12>>2]=0;l=o;return}}else{d=1;do{f=c[b+168>>2]|0;h=f+(d*20|0)+4|0;i=f+(d*20|0)+12|0;j=c[i>>2]|0;e=f+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[f+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(n|0))}c[b+160>>2]=1;l=o;return}function Oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;if(!(c[a+204>>2]&2)){c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];c[a+84>>2]=c[b+16>>2];c[a+84+4>>2]=c[b+16+4>>2];c[a+84+8>>2]=c[b+16+8>>2];c[a+84+12>>2]=c[b+16+12>>2];c[a+100>>2]=c[b+32>>2];c[a+100+4>>2]=c[b+32+4>>2];c[a+100+8>>2]=c[b+32+8>>2];c[a+100+12>>2]=c[b+32+12>>2];c[a+116>>2]=c[b+48>>2];c[a+116+4>>2]=c[b+48+4>>2];c[a+116+8>>2]=c[b+48+8>>2];c[a+116+12>>2]=c[b+48+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}else{c[a+68>>2]=c[a+4>>2];c[a+68+4>>2]=c[a+4+4>>2];c[a+68+8>>2]=c[a+4+8>>2];c[a+68+12>>2]=c[a+4+12>>2];c[a+84>>2]=c[a+20>>2];c[a+84+4>>2]=c[a+20+4>>2];c[a+84+8>>2]=c[a+20+8>>2];c[a+84+12>>2]=c[a+20+12>>2];c[a+100>>2]=c[a+36>>2];c[a+100+4>>2]=c[a+36+4>>2];c[a+100+8>>2]=c[a+36+8>>2];c[a+100+12>>2]=c[a+36+12>>2];c[a+116>>2]=c[a+52>>2];c[a+116+4>>2]=c[a+52+4>>2];c[a+116+8>>2]=c[a+52+8>>2];c[a+116+12>>2]=c[a+52+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}c[a+132>>2]=c[a+372>>2];c[a+132+4>>2]=c[a+372+4>>2];c[a+132+8>>2]=c[a+372+8>>2];c[a+132+12>>2]=c[a+372+12>>2];c[a+148>>2]=c[a+388>>2];c[a+148+4>>2]=c[a+388+4>>2];c[a+148+8>>2]=c[a+388+8>>2];c[a+148+12>>2]=c[a+388+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];w=+g[a+4>>2];q=+g[a+456>>2];v=+g[a+8>>2];o=+g[a+460>>2];u=+g[a+12>>2];m=+g[a+464>>2];t=+g[a+20>>2];s=+g[a+24>>2];r=+g[a+28>>2];p=+g[a+36>>2];n=+g[a+40>>2];l=+g[a+44>>2];g[a+324>>2]=w*w*q+v*v*o+u*u*m;g[a+328>>2]=w*q*t+v*o*s+u*m*r;g[a+332>>2]=w*q*p+v*o*n+u*m*l;g[a+336>>2]=0.0;g[a+340>>2]=w*q*t+v*o*s+u*m*r;g[a+344>>2]=t*q*t+s*o*s+r*m*r;g[a+348>>2]=q*t*p+o*s*n+m*r*l;g[a+352>>2]=0.0;g[a+356>>2]=w*q*p+v*o*n+u*m*l;g[a+360>>2]=t*q*p+s*o*n+r*m*l;g[a+364>>2]=p*q*p+n*o*n+l*m*l;g[a+368>>2]=0.0;return}function Pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(!(c[a>>2]|0)){c[a>>2]=d;c[d+32>>2]=0;return}f=c[b+40>>2]|0;if(!f)q=b;else{e=+g[d>>2]+ +g[d+16>>2];h=+g[d+4>>2]+ +g[d+20>>2];k=+g[d+8>>2]+ +g[d+24>>2];do{t=c[b+36>>2]|0;l=+C(+(e-(+g[t>>2]+ +g[t+16>>2])))+ +C(+(h-(+g[t+4>>2]+ +g[t+20>>2])))+ +C(+(k-(+g[t+8>>2]+ +g[t+24>>2])));b=c[b+36+((!(l<+C(+(e-(+g[f>>2]+ +g[f+16>>2])))+ +C(+(h-(+g[f+4>>2]+ +g[f+20>>2])))+ +C(+(k-(+g[f+8>>2]+ +g[f+24>>2]))))&1)<<2)>>2]|0;f=c[b+40>>2]|0}while((f|0)!=0);q=b}s=q+32|0;t=c[s>>2]|0;b=c[a+4>>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;i=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(i|0))}else c[a+4>>2]=0;c[b+32>>2]=t;c[b+36>>2]=0;n=b+40|0;c[n>>2]=0;o=q+16|0;f=c[(+g[d>>2]<+g[q>>2]?d:q)>>2]|0;c[b>>2]=f;i=c[(+g[d+16>>2]>+g[q+16>>2]?d+16|0:o)>>2]|0;c[b+16>>2]=i;r=c[(+g[d+4>>2]<+g[q+4>>2]?d:q)+4>>2]|0;c[b+4>>2]=r;m=c[(+g[d+20>>2]>+g[q+20>>2]?d+16|0:o)+4>>2]|0;c[b+20>>2]=m;p=c[(+g[d+8>>2]<+g[q+8>>2]?d:q)+8>>2]|0;c[b+8>>2]=p;o=c[(+g[d+24>>2]>+g[q+24>>2]?d+16|0:o)+8>>2]|0;c[b+24>>2]=o;if(!t){c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;c[a>>2]=b;return}c[t+36+(((c[(c[s>>2]|0)+40>>2]|0)==(q|0)&1)<<2)>>2]=b;c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;b=p;n=r;while(1){u=(c[j>>2]=f,+g[j>>2]);l=(c[j>>2]=b,+g[j>>2]);k=(c[j>>2]=i,+g[j>>2]);h=(c[j>>2]=m,+g[j>>2]);e=(c[j>>2]=o,+g[j>>2]);if(+g[t>>2]<=u){b=t+4|0;if((((+g[b>>2]<=(c[j>>2]=n,+g[j>>2])?+g[t+8>>2]<=l:0)?+g[t+16>>2]>=k:0)?+g[t+20>>2]>=h:0)?+g[t+24>>2]>=e:0){b=22;break}}else b=t+4|0;d=c[t+36>>2]|0;o=c[t+40>>2]|0;f=c[(+g[d>>2]<+g[o>>2]?d:o)>>2]|0;c[t>>2]=f;i=c[(+g[d+16>>2]>+g[o+16>>2]?d+16|0:o+16|0)>>2]|0;c[t+16>>2]=i;n=c[(+g[d+4>>2]<+g[o+4>>2]?d:o)+4>>2]|0;c[b>>2]=n;m=c[(+g[d+20>>2]>+g[o+20>>2]?d+16|0:o+16|0)+4>>2]|0;c[t+20>>2]=m;b=c[(+g[d+8>>2]<+g[o+8>>2]?d:o)+8>>2]|0;c[t+8>>2]=b;o=c[(+g[d+24>>2]>+g[o+24>>2]?d+16|0:o+16|0)+8>>2]|0;c[t+24>>2]=o;t=c[t+32>>2]|0;if(!t){b=22;break}}if((b|0)==22)return}function Qe(){if(a[22504]|0)return;if(!(Uz(22504)|0))return;c[6161]=0;c[6162]=-2147483648;c[6163]=-1082130432;g[6164]=0.0;c[6165]=1060716128;c[6166]=-1090087446;c[6167]=-1092290076;g[6168]=0.0;c[6169]=-1098022214;c[6170]=-1084636126;c[6171]=-1092290076;g[6172]=0.0;c[6173]=-1083901670;c[6174]=-2147483648;c[6175]=-1092290177;g[6176]=0.0;c[6177]=-1098022214;c[6178]=1062847522;c[6179]=-1092290043;g[6180]=0.0;c[6181]=1060716128;c[6182]=1057396202;c[6183]=-1092290076;g[6184]=0.0;c[6185]=1049461434;c[6186]=-1084636126;c[6187]=1055193605;g[6188]=0.0;c[6189]=-1086767520;c[6190]=-1090087446;c[6191]=1055193572;g[6192]=0.0;c[6193]=-1086767520;c[6194]=1057396202;c[6195]=1055193572;g[6196]=0.0;c[6197]=1049461434;c[6198]=1062847522;c[6199]=1055193572;g[6200]=0.0;c[6201]=1063581978;c[6202]=0;c[6203]=1055193471;g[6204]=0.0;c[6205]=-2147483648;c[6206]=0;c[6207]=1065353216;g[6208]=0.0;c[6209]=1054458864;c[6210]=-1096927567;c[6211]=-1084636042;g[6212]=0.0;c[6213]=-1104782626;c[6214]=-1090519208;c[6215]=-1084636042;g[6216]=0.0;c[6217]=1049007812;c[6218]=-1085334679;c[6219]=-1090087228;g[6220]=0.0;c[6221]=1054458864;c[6222]=1050556081;c[6223]=-1084636042;g[6224]=0.0;c[6225]=1062847505;c[6226]=-2147483648;c[6227]=-1090087262;g[6228]=0.0;c[6229]=-1090087362;c[6230]=-2147483648;c[6231]=-1084636076;g[6232]=0.0;c[6233]=-1087361736;c[6234]=-1090519141;c[6235]=-1090087262;g[6236]=0.0;c[6237]=-1104782626;c[6238]=1056964440;c[6239]=-1084636042;g[6240]=0.0;c[6241]=-1087361736;c[6242]=1056964507;c[6243]=-1090087262;g[6244]=0.0;c[6245]=1049007812;c[6246]=1062148969;c[6247]=-1090087228;g[6248]=0.0;c[6249]=1064532105;c[6250]=1050556148;c[6251]=0;g[6252]=0.0;c[6253]=1064532105;c[6254]=-1096927500;c[6255]=0;g[6256]=0.0;c[6257]=1058437413;c[6258]=-1085334595;c[6259]=0;g[6260]=0.0;c[6261]=0;c[6262]=-1082130432;c[6263]=0;g[6264]=0.0;c[6265]=-1089046235;c[6266]=-1085334595;c[6267]=0;g[6268]=0.0;c[6269]=-1082951543;c[6270]=-1096927500;c[6271]=-2147483648;g[6272]=0.0;c[6273]=-1082951543;c[6274]=1050556148;c[6275]=-2147483648;g[6276]=0.0;c[6277]=-1089046235;c[6278]=1062149053;c[6279]=-2147483648;g[6280]=0.0;c[6281]=-2147483648;c[6282]=1065353216;c[6283]=-2147483648;g[6284]=0.0;c[6285]=1058437413;c[6286]=1062149053;c[6287]=-2147483648;g[6288]=0.0;c[6289]=1060121912;c[6290]=-1090519141;c[6291]=1057396386;g[6292]=0.0;c[6293]=-1098475836;c[6294]=-1085334679;c[6295]=1057396420;g[6296]=0.0;c[6297]=-1084636143;c[6298]=0;c[6299]=1057396386;g[6300]=0.0;c[6301]=-1098475836;c[6302]=1062148969;c[6303]=1057396420;g[6304]=0.0;c[6305]=1060121912;c[6306]=1056964507;c[6307]=1057396386;g[6308]=0.0;c[6309]=1057396286;c[6310]=0;c[6311]=1062847572;g[6312]=0.0;c[6313]=1042701022;c[6314]=-1090519208;c[6315]=1062847606;g[6316]=0.0;c[6317]=-1093024784;c[6318]=-1096927567;c[6319]=1062847606;g[6320]=0.0;c[6321]=-1093024784;c[6322]=1050556081;c[6323]=1062847606;g[6324]=0.0;c[6325]=1042701022;c[6326]=1056964440;c[6327]=1062847606;g[6328]=0.0;return}function Re(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=+e;f=+f;h=+h;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0;V=l;l=l+32|0;z=+g[d>>2];B=+g[d+4>>2];A=+g[d+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2];q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];K=1.0/+D(+((e-z)*(e-z)+(f-B)*(f-B)+(h-A)*(h-A)));L=(e-z)*K==0.0?999999984306749440.0:1.0/((e-z)*K);M=(f-B)*K==0.0?999999984306749440.0:1.0/((f-B)*K);N=(h-A)*K==0.0?999999984306749440.0:1.0/((h-A)*K);O=(z>e?e:z)+v;P=(B>f?f:B)+t;Q=(A>h?h:A)+r;R=(z>2]|0;a:do if((o|0)>0){x=c[a+96>>2]|0;k=0;w=0;while(1){k=k+1|0;c[V>>2]=c[x>>2];c[V+4>>2]=c[x+4>>2];c[V+8>>2]=c[x+8>>2];c[V+12>>2]=c[x+12>>2];p=x+16|0;c[V+16>>2]=c[p>>2];c[V+16+4>>2]=c[p+4>>2];c[V+16+8>>2]=c[p+8>>2];c[V+16+12>>2]=c[p+12>>2];g[V>>2]=+g[V>>2]-q;g[V+4>>2]=+g[V+4>>2]-s;g[V+8>>2]=+g[V+8>>2]-u;g[V+16>>2]=+g[V+16>>2]-v;g[V+20>>2]=+g[V+20>>2]-t;g[V+24>>2]=+g[V+24>>2]-r;if(!(O>+g[p>>2])?!(R<+g[x>>2]):0)m=1;else m=0;if(!(!(Q>+g[x+24>>2])?!(T<+g[x+8>>2]):0))m=0;if(((!(P>+g[x+20>>2])?!(S<+g[x+4>>2]|m^1):0)?(E=+g[d>>2],C=L*(+g[V+((L<0.0&1)<<4)>>2]-E),E=L*(+g[V+((L<0.0^1)<<4)>>2]-E),G=+g[d+4>>2],F=M*(+g[V+((M<0.0&1)<<4)+4>>2]-G),G=M*(+g[V+((M<0.0^1)<<4)+4>>2]-G),!(F>E|C>G)):0)?(H=F>C?F:C,y=G>2],I=N*(+g[V+((N<0.0&1)<<4)+8>>2]-J),J=N*(+g[V+((N<0.0^1)<<4)+8>>2]-J),!(I>y|H>J)):0){m=(J0.0?(I>H?I:H)<(h-A)*(h-A)*K+((e-z)*(e-z)*K+(f-B)*(f-B)*K):0;n=c[x+32>>2]|0;if(m&(n|0)==-1){Sb[c[(c[b>>2]|0)+8>>2]&127](b,c[x+36>>2]|0,c[x+40>>2]|0);n=1;o=c[a+56>>2]|0}else{p=(n|0)==-1;U=16}}else{n=c[x+32>>2]|0;p=(n|0)==-1;m=0;U=16}if((U|0)==16){U=0;n=p|m?1:n}m=n+w|0;if((m|0)>=(o|0))break a;x=x+(n<<6)|0;w=m;q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2]}}else k=0;while(0);if((c[6160]|0)>=(k|0)){l=V;return}c[6160]=k;l=V;return}function Se(a,b,d,e,f,h){a=a|0;b=b|0;d=+d;e=+e;f=+f;h=h|0;var i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;a:while(1){if((b|0)>0){i=-1;j=0;do{do if(c[h+(j<<2)>>2]|0){if((i|0)!=-1?!(+g[a+(j<<4)>>2]*d+ +g[a+(j<<4)+4>>2]*e+ +g[a+(j<<4)+8>>2]*f>+g[a+(i<<4)>>2]*d+ +g[a+(i<<4)+4>>2]*e+ +g[a+(i<<4)+8>>2]*f):0)break;i=j}while(0);j=j+1|0}while((j|0)!=(b|0))}else i=-1;A=h+(i<<2)|0;if((c[A>>2]|0)==3){B=36;break}k=+D(+((e-f*0.0)*(e-f*0.0)+(f*0.0-d)*(f*0.0-d)+(d*0.0-e*0.0)*(d*0.0-e*0.0)));l=+D(+((d-e*0.0)*(d-e*0.0)+((e*0.0-f)*(e*0.0-f)+(f*0.0-d*0.0)*(f*0.0-d*0.0))));if(k>l){y=(d*0.0-e*0.0)*(1.0/k);z=(f*0.0-d)*(1.0/k);s=(e-f*0.0)*(1.0/k)}else{y=(d-e*0.0)*(1.0/l);z=(f*0.0-d*0.0)*(1.0/l);s=(e*0.0-f)*(1.0/l)}t=z*f-y*e;u=y*d-s*f;v=s*e-z*d;w=(i|0)==-1;r=0;j=-1;while(1){x=+(r|0);q=+G(+(x*.01745329238474369));o=+F(+(x*.01745329238474369));k=(s*q+t*o)*.02500000037252903+d;l=(z*q+u*o)*.02500000037252903+e;o=(y*q+v*o)*.02500000037252903+f;if((b|0)>0){m=-1;n=0;do{do if(c[h+(n<<2)>>2]|0){if((m|0)!=-1?!(k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]>k*+g[a+(m<<4)>>2]+l*+g[a+(m<<4)+4>>2]+o*+g[a+(m<<4)+8>>2]):0)break;m=n}while(0);n=n+1|0}while((n|0)!=(b|0))}else m=-1;if((j|0)==(i|0)&(m|0)==(i|0))break a;b:do if(!((j|0)==-1|(j|0)==(m|0))?x+-40.0<=x:0){if((b|0)>0)q=x+-40.0;else{k=x+-40.0;while(1){if((j|0)==(i|0)&w){i=-1;break a}k=k+5.0;if(!(k<=x))break b;else j=-1}}while(1){o=q*.01745329238474369;C=+G(+o);o=+F(+o);k=(s*C+t*o)*.02500000037252903+d;l=(z*C+u*o)*.02500000037252903+e;o=(y*C+v*o)*.02500000037252903+f;n=-1;p=0;do{do if(c[h+(p<<2)>>2]|0){if((n|0)!=-1?!(k*+g[a+(p<<4)>>2]+l*+g[a+(p<<4)+4>>2]+o*+g[a+(p<<4)+8>>2]>k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]):0)break;n=p}while(0);p=p+1|0}while((p|0)!=(b|0));if((j|0)==(i|0)&(n|0)==(i|0))break a;q=q+5.0;if(!(q<=x))break;else j=n}}while(0);r=r+45|0;if((r|0)>360)break;else j=m}c[A>>2]=0}if((B|0)==36)return i|0;c[h+(i<<2)>>2]=3;B=i;return B|0}function Te(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0;m=c[b+472>>2]|0;Sb[c[(c[m>>2]|0)+16>>2]&127](m,b+344|0,0);m=c[b+472>>2]|0;xb[c[(c[m>>2]|0)+12>>2]&127](m)|0;Hj(b,d);m=c[b+348>>2]|0;if((m|0)>0){f=c[b+356>>2]|0;e=0;k=0;do{l=c[(c[f+(e<<2)>>2]|0)+444>>2]|0;k=(k|0)>(l|0)?k:l;e=e+1|0}while((e|0)!=(m|0));e=0;while(1){h=c[f+(e<<2)>>2]|0;if((c[h+912>>2]|0)>0){f=0;do{l=c[(c[h+920>>2]|0)+(f<<2)>>2]|0;Mb[c[(c[l>>2]|0)+8>>2]&15](l,+g[h+512>>2],k);f=f+1|0}while((f|0)<(c[h+912>>2]|0))}e=e+1|0;if((e|0)==(m|0))break;f=c[b+356>>2]|0}if((k|0)>0){h=0;do{e=0;do{i=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;j=c[i+912>>2]|0;if((j|0)>0){f=0;do{l=c[(c[i+920>>2]|0)+(f<<2)>>2]|0;Kb[c[(c[l>>2]|0)+12>>2]&7](l,+g[i+512>>2],1.0);f=f+1|0}while((f|0)!=(j|0))}e=e+1|0}while((e|0)!=(m|0));h=h+1|0}while((h|0)!=(k|0));k=0}else k=0;do{l=c[(c[b+356>>2]|0)+(k<<2)>>2]|0;if((c[l+912>>2]|0)>0){e=0;do{f=c[(c[l+920>>2]|0)+(e<<2)>>2]|0;Jb[c[(c[f>>2]|0)+16>>2]&31](f,+g[l+512>>2]);f=c[l+920>>2]|0;h=c[f+(e<<2)>>2]|0;if(a[h+152>>0]|0){if(!h)j=f;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);j=c[l+920>>2]|0}i=e+-1|0;f=c[l+912>>2]|0;a:do if((f|0)>0){h=c[j+(e<<2)>>2]|0;e=0;while(1){if((c[j+(e<<2)>>2]|0)==(h|0))break a;e=e+1|0;if((e|0)>=(f|0)){e=f;break}}}else e=f;while(0);if((f|0)>(e|0)){h=j+(e<<2)|0;e=c[h>>2]|0;c[h>>2]=c[j+(f+-1<<2)>>2];c[(c[l+920>>2]|0)+(f+-1<<2)>>2]=e;c[l+912>>2]=f+-1;e=i;f=f+-1|0}else e=i}else f=c[l+912>>2]|0;e=e+1|0}while((e|0)<(f|0))}k=k+1|0}while((k|0)!=(m|0))}m=c[b+472>>2]|0;Jb[c[(c[m>>2]|0)+28>>2]&31](m,+g[m+12>>2]*d);if((c[b+348>>2]|0)<=0){b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}e=0;do{m=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;Wh(m,m);e=e+1|0}while((e|0)<(c[b+348>>2]|0));b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}function Ue(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0;I=l;l=l+544|0;if(!a){l=I;return}f=+g[b>>2];G=+g[d>>2]-f;k=+g[b+4>>2];B=+g[d+4>>2]-k;v=+g[d+8>>2]-+g[b+8>>2];w=1.0/+D(+(G*G+B*B+v*v));x=G*w==0.0?999999984306749440.0:1.0/(G*w);y=B*w==0.0?999999984306749440.0:1.0/(B*w);z=v*w==0.0?999999984306749440.0:1.0/(v*w);c[I+32>>2]=a;p=1;o=126;h=128;r=I+32|0;i=128;u=0;while(1){s=p+-1|0;t=c[r+(s<<2)>>2]|0;c[I>>2]=c[t>>2];c[I+4>>2]=c[t+4>>2];c[I+8>>2]=c[t+8>>2];c[I+12>>2]=c[t+12>>2];c[I+16>>2]=c[t+16>>2];c[I+16+4>>2]=c[t+16+4>>2];c[I+16+8>>2]=c[t+16+8>>2];c[I+16+12>>2]=c[t+16+12>>2];n=x*(+g[I+((x<0.0&1)<<4)>>2]-f);j=x*(+g[I+((x<0.0^1)<<4)>>2]-f);m=y*(+g[I+((y<0.0&1)<<4)+4>>2]-k);f=y*(+g[I+((y<0.0^1)<<4)+4>>2]-k);do if((!(m>j|n>f)?(C=m>n?m:n,A=f>2],E=z*(+g[I+((z<0.0&1)<<4)+8>>2]-F),F=z*(+g[I+((z<0.0^1)<<4)+8>>2]-F),!(E>A|C>F)):0)?((F0.0?(E>C?E:C)>2]|0)){Ob[c[(c[e>>2]|0)+12>>2]&127](e,t);p=s;d=r;a=u;break}if((s|0)>(o|0)){q=i<<1;if((i|0)<(q|0)){do if((h|0)<(q|0)){if(i){c[6995]=(c[6995]|0)+1;d=sc((i<<3|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}if((i|0)>0){a=0;do{c[d+(a<<2)>>2]=c[r+(a<<2)>>2];a=a+1|0}while((a|0)!=(i|0));if(!(u<<24>>24)){h=q;a=1;break}}else H=15}else{d=0;H=15}if((H|0)==15){H=0;if(u<<24>>24==0|(r|0)==0){h=q;a=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);h=q;a=1}else{d=r;a=u}while(0);Yk(d+(i<<2)|0,0,i<<2|0)|0}else{d=r;a=u}o=q+-2|0;i=q}else{d=r;a=u}c[d+(s<<2)>>2]=c[t+36>>2];c[d+(p<<2)>>2]=c[t+40>>2];p=p+1|0}else{p=s;d=r;a=u}while(0);if(!p)break;r=d;u=a;f=+g[b>>2];k=+g[b+4>>2]}if(a<<24>>24==0|(d|0)==0){l=I;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);l=I;return}function Ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;d=m+(i*104|0)+8|0;j=+g[b>>2]*+g[d>>2];g[d>>2]=j;d=m+(i*104|0)+12|0;k=+g[b+4>>2]*+g[d>>2];g[d>>2]=k;d=m+(i*104|0)+16|0;l=+g[b+8>>2]*+g[d>>2];g[d>>2]=l;d=m+(i*104|0)+24|0;g[d>>2]=+g[b>>2]*+g[d>>2];d=m+(i*104|0)+28|0;g[d>>2]=+g[b+4>>2]*+g[d>>2];d=m+(i*104|0)+32|0;g[d>>2]=+g[b+8>>2]*+g[d>>2];m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;k=+nb[c[(c[o>>2]|0)+48>>2]&15](o);n=+g[d+4>>2]-k;l=+g[d+8>>2]-k;g[a+952>>2]=+g[d>>2]-k;g[a+956>>2]=n;g[a+960>>2]=l;g[a+964>>2]=0.0;l=k+ +g[d+20>>2];n=k+ +g[d+24>>2];g[a+968>>2]=k+ +g[d+16>>2];g[a+972>>2]=l;g[a+976>>2]=n;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;k=+g[m+8>>2]-+g[o+8>>2];l=+g[m+12>>2]-+g[o+12>>2];n=+g[m+16>>2]-+g[o+16>>2];n=+D(+(k*k+l*l+n*n));g[f+(d*52|0)+32>>2]=n;g[f+(d*52|0)+44>>2]=n*n;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);return}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0;o=l;l=l+144|0;i=+g[b>>2];j=+g[b+16>>2];p=i>2];if((p+g[a+20>>2]){l=o;return}m=i>j?b:b+16|0;if(+g[(+g[m>>2]>h?m:b+32|0)>>2]<+g[a+4>>2]){l=o;return}h=+g[b+8>>2];i=+g[b+24>>2];p=h>2];if((p+g[a+28>>2]){l=o;return}m=h>i?b+8|0:b+24|0;if(+g[(+g[m>>2]>j?m:b+40|0)>>2]<+g[a+12>>2]){l=o;return}h=+g[b+4>>2];i=+g[b+20>>2];p=h>2];if((p+g[a+24>>2]){l=o;return}m=h>i?b+4|0:b+20|0;if(+g[(+g[m>>2]>j?m:b+36|0)>>2]<+g[a+8>>2]){l=o;return}m=c[a+48>>2]|0;f=c[a+36>>2]|0;if((c[(c[f+4>>2]|0)+4>>2]|0)>=20){l=o;return}c[o+24+8>>2]=0;c[o+24+12>>2]=-1;c[o+24+16>>2]=1065353216;c[o+24+20>>2]=1065353216;c[o+24+24>>2]=1065353216;g[o+24+28>>2]=0.0;c[o+24+56>>2]=0;c[o+24>>2]=3924;c[o+24+4>>2]=1;c[o+24+60>>2]=c[b>>2];c[o+24+60+4>>2]=c[b+4>>2];c[o+24+60+8>>2]=c[b+8>>2];c[o+24+60+12>>2]=c[b+12>>2];c[o+24+76>>2]=c[b+16>>2];c[o+24+76+4>>2]=c[b+16+4>>2];c[o+24+76+8>>2]=c[b+16+8>>2];c[o+24+76+12>>2]=c[b+16+12>>2];c[o+24+92>>2]=c[b+32>>2];c[o+24+92+4>>2]=c[b+32+4>>2];c[o+24+92+8>>2]=c[b+32+8>>2];c[o+24+92+12>>2]=c[b+32+12>>2];c[o+24+48>>2]=c[a+56>>2];q=c[a+40>>2]|0;k=c[q+8>>2]|0;b=c[q+12>>2]|0;c[o>>2]=q;c[o+4>>2]=o+24;c[o+8>>2]=k;c[o+12>>2]=b;c[o+16>>2]=d;c[o+20>>2]=e;b=c[(c[m>>2]|0)+8>>2]|0;if(+g[(c[a+44>>2]|0)+32>>2]>0.0)k=Db[b&1](m,f,o,0,2)|0;else k=Db[b&1](m,f,o,c[a+64>>2]|0,1)|0;f=c[a+44>>2]|0;b=c[f+8>>2]|0;if((c[b+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)){c[f+8>>2]=o;Sb[c[(c[f>>2]|0)+8>>2]&127](f,d,e)}else{b=c[f+12>>2]|0;c[f+12>>2]=o;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,e)}Zb[c[(c[k>>2]|0)+8>>2]&31](k,c[a+36>>2]|0,o,c[a+52>>2]|0,c[a+44>>2]|0);q=c[a+44>>2]|0;c[((c[(c[q+8>>2]|0)+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)?q+8|0:q+12|0)>>2]=b;Ib[c[c[k>>2]>>2]&511](k);Ob[c[(c[m>>2]|0)+60>>2]&127](m,k);c[o+24>>2]=7472;b=c[o+24+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),n=c[o+24+56>>2]|0,n|0):0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}l=o;return}function Xe(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=l;l=l+48|0;c[b+8>>2]=0;c[b+12>>2]=-1;g[b+16>>2]=0.0;c[b>>2]=7272;c[b+52>>2]=d;c[b+4>>2]=21;if(xb[c[(c[d>>2]|0)+40>>2]&127](d)|0)Sb[c[(c[d>>2]|0)+48>>2]&127](d,b+20|0,b+36|0);else{d=h+32+4|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;g[h+32>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+36>>2]=+g[h+16>>2]+ +g[b+16>>2];g[h+32>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+20>>2]=+g[h+16>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[d>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+40>>2]=+g[h+16+4>>2]+ +g[b+16>>2];g[d>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+24>>2]=+g[h+16+4>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[h+32+8>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+44>>2]=+g[h+16+8>>2]+ +g[b+16>>2];g[h+32+8>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+28>>2]=+g[h+16+8>>2]-+g[b+16>>2]}c[b>>2]=7120;c[b+56>>2]=0;c[b+60>>2]=0;a[b+64>>0]=e&1;a[b+65>>0]=0;c[b+4>>2]=21;if(!f){l=h;return}c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[b+56>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;l=h;return}function Ye(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!b)if(!e){if(f|0){c[f>>2]=(a>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(a>>>0)/(d>>>0)>>>0;return (A=e,f)|0}else{if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;e=0;f=0;return (A=e,f)|0}do if(d){if(e|0){h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=31){n=h+1|0;i=a>>>((h+1|0)>>>0)&h-31>>31|b<<31-h;m=b>>>((h+1|0)>>>0)&h-31>>31;g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}if(d-1&d|0){h=(S(d|0)|0)+33-(S(b|0)|0)|0;n=h;i=32-h-1>>31&b>>>((h-32|0)>>>0)|(b<<32-h|a>>>(h>>>0))&h-32>>31;m=h-32>>31&b>>>(h>>>0);g=a<<64-h&32-h>>31;h=(b<<64-h|a>>>((h-32|0)>>>0))&32-h>>31|a<<32-h&h-33>>31;break}if(f|0){c[f>>2]=d-1&a;c[f+4>>2]=0}if((d|0)==1){e=b|b&0;f=a|0|0;return (A=e,f)|0}else{f=tq(d|0)|0;e=b>>>(f>>>0)|0;f=b<<32-f|a>>>(f>>>0)|0;return (A=e,f)|0}}else{if(!e){if(f|0){c[f>>2]=(b>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(b>>>0)/(d>>>0)>>>0;return (A=e,f)|0}if(!a){if(f|0){c[f>>2]=0;c[f+4>>2]=(b>>>0)%(e>>>0)}d=0;f=(b>>>0)/(e>>>0)>>>0;return (A=d,f)|0}if(!(e-1&e)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=e-1&b|b&0}d=0;f=b>>>((tq(e|0)|0)>>>0);return (A=d,f)|0}h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=30){n=h+1|0;i=b<<31-h|a>>>((h+1|0)>>>0);m=b>>>((h+1|0)>>>0);g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}while(0);if(!n){j=h;b=m;a=0;h=0}else{k=Ow(d|0|0,e|e&0|0,-1,-1)|0;l=A;j=h;b=m;a=n;h=0;do{p=j;j=g>>>31|j<<1;g=h|g<<1;p=i<<1|p>>>31|0;o=i>>>31|b<<1|0;sw(k|0,l|0,p|0,o|0)|0;n=A;m=n>>31|((n|0)<0?-1:0)<<1;h=m&1;i=sw(p|0,o|0,m&(d|0)|0,(((n|0)<0?-1:0)>>31|((n|0)<0?-1:0)<<1)&(e|e&0)|0)|0;b=A;a=a-1|0}while((a|0)!=0);a=0}if(f|0){c[f>>2]=i;c[f+4>>2]=b}o=(g|0)>>>31|j<<1|(0<<1|g>>>31)&0|a;p=(g<<1|0>>>31)&-2|h;return (A=o,p)|0}function Ze(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;j=l;l=l+64|0;k=(a[b+76>>0]|0)!=0;i=k?e:d;d=k?d:e;e=c[d+4>>2]|0;if(((c[e+4>>2]|0)+-21|0)>>>0>=9){l=j;return}if((c[(c[i+4>>2]|0)+4>>2]|0)>=20){l=j;return}m=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[h+4>>2]=c[b+72>>2];c[b+44>>2]=i;c[b+48>>2]=d;c[b+60>>2]=f;g[b+64>>2]=m;c[b+52>>2]=h;k=c[d+12>>2]|0;B=+g[k>>2];A=+g[k+16>>2];z=+g[k+32>>2];y=+g[k+4>>2];x=+g[k+20>>2];w=+g[k+36>>2];s=+g[k+8>>2];q=+g[k+24>>2];o=+g[k+40>>2];v=-+g[k+48>>2];u=-+g[k+52>>2];t=-+g[k+56>>2];k=c[i+12>>2]|0;K=+g[k>>2];J=+g[k+16>>2];I=+g[k+32>>2];H=+g[k+4>>2];G=+g[k+20>>2];F=+g[k+36>>2];E=+g[k+8>>2];D=+g[k+24>>2];C=+g[k+40>>2];r=+g[k+48>>2];p=+g[k+52>>2];n=+g[k+56>>2];g[j>>2]=B*K+A*J+z*I;g[j+4>>2]=B*H+A*G+z*F;g[j+8>>2]=B*E+A*D+z*C;g[j+12>>2]=0.0;g[j+16>>2]=y*K+x*J+w*I;g[j+20>>2]=y*H+x*G+w*F;g[j+24>>2]=y*E+x*D+w*C;g[j+28>>2]=0.0;g[j+32>>2]=s*K+q*J+o*I;g[j+36>>2]=s*H+q*G+o*F;g[j+40>>2]=s*E+q*D+o*C;g[j+44>>2]=0.0;g[j+48>>2]=B*v+A*u+z*t+(B*r+A*p+z*n);g[j+52>>2]=y*v+x*u+w*t+(y*r+x*p+w*n);g[j+56>>2]=s*v+q*u+o*t+(s*r+q*p+o*n);g[j+60>>2]=0.0;k=c[(c[b+44>>2]|0)+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,j,b+12|0,b+28|0);m=+g[h+32>>2]+m;g[b+28>>2]=m+ +g[b+28>>2];g[b+32>>2]=m+ +g[b+32>>2];g[b+36>>2]=m+ +g[b+36>>2];g[b+12>>2]=+g[b+12>>2]-m;g[b+16>>2]=+g[b+16>>2]-m;g[b+20>>2]=+g[b+20>>2]-m;k=c[b+72>>2]|0;f=c[d+8>>2]|0;c[k+772>>2]=c[i+8>>2];c[k+776>>2]=f;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+8|0,b+12|0,b+28|0);e=c[h+4>>2]|0;do if(c[e+780>>2]|0){f=c[e+772>>2]|0;i=c[(c[h+8>>2]|0)+8>>2]|0;d=c[(c[h+12>>2]|0)+8>>2]|0;if((f|0)==(i|0)){af(e,f+4|0,d+4|0);break}else{af(e,d+4|0,i+4|0);break}}while(0);c[b+44>>2]=0;c[b+48>>2]=0;l=j;return}function _e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;k=l;l=l+128|0;a=c[a+20>>2]|0;n=+g[a+952>>2];x=+g[a+956>>2];v=+g[a+960>>2];w=+g[a+968>>2];f=+g[a+972>>2];i=+g[a+976>>2];z=+g[b>>2];m=+g[b+4>>2];p=v*+g[b+8>>2];q=+g[b+16>>2];r=+g[b+20>>2];t=v*+g[b+24>>2];u=+g[b+32>>2];o=+g[b+36>>2];s=+g[b+40>>2];y=+g[b+48>>2];j=+g[b+52>>2];h=+g[b+56>>2];g[k>>2]=n*z+x*m+p+y;g[k+4>>2]=n*q+x*r+t+j;g[k+8>>2]=n*u+x*o+v*s+h;g[k+12>>2]=0.0;g[k+16>>2]=w*z+x*m+p+y;g[k+20>>2]=w*q+x*r+t+j;g[k+24>>2]=w*u+x*o+v*s+h;g[k+28>>2]=0.0;g[k+32>>2]=w*z+f*m+p+y;g[k+36>>2]=w*q+f*r+t+j;g[k+40>>2]=w*u+f*o+v*s+h;g[k+44>>2]=0.0;g[k+48>>2]=n*z+f*m+p+y;g[k+52>>2]=n*q+f*r+t+j;g[k+56>>2]=n*u+f*o+v*s+h;g[k+60>>2]=0.0;v=+g[b>>2];u=+g[b+4>>2];t=i*+g[b+8>>2];r=+g[b+16>>2];q=+g[b+20>>2];p=i*+g[b+24>>2];m=+g[b+32>>2];g[k+64>>2]=n*v+x*u+t+y;g[k+68>>2]=n*r+x*q+p+j;g[k+72>>2]=n*m+x*o+i*s+h;g[k+76>>2]=0.0;h=+g[b+36>>2];i=i*+g[b+40>>2];s=+g[b+48>>2];o=+g[b+52>>2];j=+g[b+56>>2];g[k+80>>2]=w*v+x*u+t+s;g[k+84>>2]=w*r+x*q+p+o;g[k+88>>2]=w*m+x*h+i+j;g[k+92>>2]=0.0;g[k+96>>2]=w*v+f*u+t+s;g[k+100>>2]=w*r+f*q+p+o;g[k+104>>2]=w*m+f*h+i+j;g[k+108>>2]=0.0;g[k+112>>2]=n*v+f*u+t+s;g[k+116>>2]=n*r+f*q+p+o;g[k+120>>2]=n*m+f*h+i+j;g[k+124>>2]=0.0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];a=1;do{f=+g[k+(a<<4)>>2];if(f<+g[d>>2])g[d>>2]=f;h=+g[k+(a<<4)+4>>2];if(h<+g[d+4>>2])g[d+4>>2]=h;i=+g[k+(a<<4)+8>>2];if(i<+g[d+8>>2])g[d+8>>2]=i;j=+g[k+(a<<4)+12>>2];if(j<+g[d+12>>2])g[d+12>>2]=j;if(+g[e>>2]>2]=f;if(+g[e+4>>2]>2]=h;if(+g[e+8>>2]>2]=i;if(+g[e+12>>2]>2]=j;a=a+1|0}while((a|0)!=8);l=k;return}function $e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0;n=l;l=l+192|0;m=c[(c[a+4>>2]|0)+772>>2]|0;k=c[(c[a+8>>2]|0)+8>>2]|0;y=+g[d>>2];h=+g[b>>2]*e+y;x=+g[d+4>>2];i=+g[b+4>>2]*e+x;o=+g[d+8>>2];j=+g[b+8>>2]*e+o;w=c[(c[a+12>>2]|0)+8>>2]|0;f=(m|0)!=(k|0)?w:m;w=(m|0)!=(k|0)?k:w;v=h-+g[f+52>>2];u=i-+g[f+56>>2];t=j-+g[f+60>>2];s=v*+g[f+8>>2]+u*+g[f+24>>2]+t*+g[f+40>>2];r=v*+g[f+12>>2]+u*+g[f+28>>2]+t*+g[f+44>>2];y=y-+g[w+52>>2];x=x-+g[w+56>>2];o=o-+g[w+60>>2];q=y*+g[w+4>>2]+x*+g[w+20>>2]+o*+g[w+36>>2];p=y*+g[w+8>>2]+x*+g[w+24>>2]+o*+g[w+40>>2];o=y*+g[w+12>>2]+x*+g[w+28>>2]+o*+g[w+44>>2];g[n>>2]=v*+g[f+4>>2]+u*+g[f+20>>2]+t*+g[f+36>>2];g[n+4>>2]=s;g[n+8>>2]=r;g[n+12>>2]=0.0;g[n+16>>2]=q;g[n+20>>2]=p;g[n+24>>2]=o;g[n+28>>2]=0.0;c[n+64>>2]=c[b>>2];c[n+64+4>>2]=c[b+4>>2];c[n+64+8>>2]=c[b+8>>2];c[n+64+12>>2]=c[b+12>>2];g[n+80>>2]=e;c[n+84>>2]=0;c[n+84+4>>2]=0;c[n+84+8>>2]=0;c[n+84+12>>2]=0;b=n+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[n+48>>2]=h;g[n+52>>2]=i;g[n+56>>2]=j;g[n+60>>2]=0.0;c[n+32>>2]=c[d>>2];c[n+32+4>>2]=c[d+4>>2];c[n+32+8>>2]=c[d+8>>2];c[n+32+12>>2]=c[d+12>>2];b=c[a+16>>2]|0;f=c[a+20>>2]|0;if((m|0)!=(k|0)){c[n+100>>2]=f;z=a+28|0;d=b;w=a+24|0;b=f;f=c[z>>2]|0;z=n+104|0;c[z>>2]=d;z=n+108|0;c[z>>2]=f;w=c[w>>2]|0;z=n+112|0;c[z>>2]=w;z=(m|0)!=(k|0)?a+12|0:a+8|0;z=c[z>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,z,b,f,m,d,w);l=n;return}else{c[n+100>>2]=b;d=a+24|0;w=f;z=a+28|0;f=b;d=c[d>>2]|0;b=n+104|0;c[b>>2]=w;b=n+108|0;c[b>>2]=d;z=c[z>>2]|0;b=n+112|0;c[b>>2]=z;b=(m|0)!=(k|0)?a+12|0:a+8|0;b=c[b>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,b,f,d,m,w,z);l=n;return}}function af(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;e=c[a+780>>2]|0;if((e|0)<=0)return;do{j=e;e=e+-1|0;p=+g[a+4+(e*192|0)>>2];q=+g[a+4+(e*192|0)+4>>2];f=+g[a+4+(e*192|0)+8>>2];o=p*+g[b>>2]+q*+g[b+4>>2]+f*+g[b+8>>2]+ +g[b+48>>2];m=p*+g[b+16>>2]+q*+g[b+20>>2]+f*+g[b+24>>2]+ +g[b+52>>2];f=p*+g[b+32>>2]+q*+g[b+36>>2]+f*+g[b+40>>2]+ +g[b+56>>2];g[a+4+(e*192|0)+48>>2]=o;g[a+4+(e*192|0)+52>>2]=m;g[a+4+(e*192|0)+56>>2]=f;g[a+4+(e*192|0)+60>>2]=0.0;q=+g[a+4+(e*192|0)+16>>2];p=+g[a+4+(e*192|0)+20>>2];h=+g[a+4+(e*192|0)+24>>2];n=q*+g[d>>2]+p*+g[d+4>>2]+h*+g[d+8>>2]+ +g[d+48>>2];l=q*+g[d+16>>2]+p*+g[d+20>>2]+h*+g[d+24>>2]+ +g[d+52>>2];h=q*+g[d+32>>2]+p*+g[d+36>>2]+h*+g[d+40>>2]+ +g[d+56>>2];g[a+4+(e*192|0)+32>>2]=n;g[a+4+(e*192|0)+36>>2]=l;g[a+4+(e*192|0)+40>>2]=h;g[a+4+(e*192|0)+44>>2]=0.0;g[a+4+(e*192|0)+80>>2]=(o-n)*+g[a+4+(e*192|0)+64>>2]+(m-l)*+g[a+4+(e*192|0)+68>>2]+(f-h)*+g[a+4+(e*192|0)+72>>2];i=a+4+(e*192|0)+156|0;c[i>>2]=(c[i>>2]|0)+1}while((j|0)>1);e=c[a+780>>2]|0;if((e|0)<=0)return;j=e;do{i=j;j=j+-1|0;d=a+4+(j*192|0)|0;f=+g[a+4+(j*192|0)+80>>2];h=+g[a+784>>2];if(!(f<=h)){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}else{o=+g[a+4+(j*192|0)+32>>2]-(+g[a+4+(j*192|0)+48>>2]-+g[a+4+(j*192|0)+64>>2]*f);p=+g[a+4+(j*192|0)+36>>2]-(+g[a+4+(j*192|0)+52>>2]-f*+g[a+4+(j*192|0)+68>>2]);q=+g[a+4+(j*192|0)+40>>2]-(+g[a+4+(j*192|0)+56>>2]-f*+g[a+4+(j*192|0)+72>>2]);if(o*o+p*p+q*q>h*h){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}}if((k|0)==12){k=0;e=e+-1|0;c[a+780>>2]=e}}while((i|0)>1);return} +function Gc(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0;s=l;l=l+96|0;p=c[b+128>>2]|0;if(!p){l=s;return}e=c[b+8>>2]|0;if((e|0)<(p|0)){if((c[b+12>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+8>>2]|0;if((i|0)>0){h=0;do{n=j+(h<<4)|0;t=(c[b+16>>2]|0)+(h<<4)|0;c[n>>2]=c[t>>2];c[n+4>>2]=c[t+4>>2];c[n+8>>2]=c[t+8>>2];c[n+12>>2]=c[t+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+16>>2]|0;if(h|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=j;c[b+12>>2]=p;h=b+16|0}else h=b+16|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+8>>2]=p;e=c[b+28>>2]|0;if((e|0)<(p|0)){if((c[b+32>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+28>>2]|0;if((i|0)>0){h=0;do{t=j+(h<<4)|0;n=(c[b+36>>2]|0)+(h<<4)|0;c[t>>2]=c[n>>2];c[t+4>>2]=c[n+4>>2];c[t+8>>2]=c[n+8>>2];c[t+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+36>>2]|0;if(h|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=j;c[b+32>>2]=p;h=b+36|0}else h=b+36|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+28>>2]=p;n=c[b+48>>2]|0;if((n|0)<(p|0)){if((c[b+52>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}h=c[b+48>>2]|0;i=c[b+56>>2]|0;if((h|0)<=0)if(!i)e=b+60|0;else o=39;else{e=0;do{c[j+(e<<2)>>2]=c[i+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));o=39}if((o|0)==39)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=j;c[b+52>>2]=p;h=p<<2;e=j}else{h=p<<2;e=c[b+56>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+48>>2]=p;n=c[b+68>>2]|0;if((n|0)<(p|0)){if((c[b+72>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+68>>2]|0;j=c[b+76>>2]|0;if((i|0)<=0)if(!j)h=b+80|0;else o=52;else{h=0;do{c[e+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));o=52}if((o|0)==52)if(!(a[b+80>>0]|0))h=b+80|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+80|0}a[h>>0]=1;c[b+76>>2]=e;c[b+72>>2]=p;h=p<<2}else{h=p<<2;e=c[b+76>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+68>>2]=p;e=c[b+128>>2]|0;if((e|0)<=0){l=s;return}i=c[b+76>>2]|0;j=c[b+56>>2]|0;h=0;do{g[i+(h<<2)>>2]=0.0;g[j+(h<<2)>>2]=0.0;h=h+1|0}while((h|0)!=(e|0));j=0;do{h=c[b+136>>2]|0;i=c[h+(j*284|0)+88>>2]|0;if(i){n=h+(j*284|0)+92|0;c[s+48>>2]=c[n>>2];c[s+48+4>>2]=c[n+4>>2];c[s+48+8>>2]=c[n+8>>2];c[s+48+12>>2]=c[n+12>>2];n=h+(j*284|0)+108|0;c[s+48+16>>2]=c[n>>2];c[s+48+16+4>>2]=c[n+4>>2];c[s+48+16+8>>2]=c[n+8>>2];c[s+48+16+12>>2]=c[n+12>>2];n=h+(j*284|0)+124|0;c[s+48+32>>2]=c[n>>2];c[s+48+32+4>>2]=c[n+4>>2];c[s+48+32+8>>2]=c[n+8>>2];c[s+48+32+12>>2]=c[n+12>>2];n=c[b+112>>2]|0;e=c[s+48+16+(n<<2)>>2]|0;y=c[s+48+32+(n<<2)>>2]|0;o=c[b+36>>2]|0;c[o+(j<<4)>>2]=c[s+48+(n<<2)>>2];c[o+(j<<4)+4>>2]=e;c[o+(j<<4)+8>>2]=y;g[o+(j<<4)+12>>2]=0.0;o=c[b+36>>2]|0;y=o+(j<<4)|0;z=+g[y>>2];e=h+(j*284|0)|0;f=+g[e>>2];n=o+(j<<4)+4|0;x=+g[n>>2];t=h+(j*284|0)+4|0;k=+g[t>>2];o=o+(j<<4)+8|0;u=+g[o>>2];p=h+(j*284|0)+8|0;w=+g[p>>2];m=z-f*(z*f+x*k+u*w);v=x-k*(z*f+x*k+u*w);w=u-w*(z*f+x*k+u*w);u=1.0/+D(+(m*m+v*v+w*w));g[y>>2]=m*u;g[n>>2]=v*u;g[o>>2]=w*u;k=+g[t>>2];x=+g[p>>2];f=+g[e>>2];e=c[b+16>>2]|0;g[e+(j<<4)>>2]=k*w*u-x*v*u;g[e+(j<<4)+4>>2]=x*m*u-w*u*f;g[e+(j<<4)+8>>2]=v*u*f-k*m*u;g[e+(j<<4)+12>>2]=0.0;e=c[b+16>>2]|0;p=e+(j<<4)|0;u=+g[p>>2];t=e+(j<<4)+4|0;m=+g[t>>2];e=e+(j<<4)+8|0;k=+g[e>>2];f=1.0/+D(+(u*u+m*m+k*k));g[p>>2]=u*f;g[t>>2]=m*f;g[e>>2]=k*f;e=c[b+108>>2]|0;t=c[b+36>>2]|0;f=+g[t+(j<<4)>>2];k=+g[t+(j<<4)+4>>2];m=+g[t+(j<<4)+8>>2];if(f*f+k*k+m*m>1.100000023841858)f=0.0;else{C=+g[h+(j*284|0)+16>>2];H=C-+g[e+52>>2];F=+g[h+(j*284|0)+20>>2];J=F-+g[e+56>>2];K=+g[h+(j*284|0)+24>>2];M=K-+g[e+60>>2];C=C-+g[i+52>>2];F=F-+g[i+56>>2];K=K-+g[i+60>>2];G=+g[e+392>>2];N=+g[e+396>>2];I=+g[e+388>>2];B=+g[i+392>>2];L=+g[i+396>>2];E=+g[i+388>>2];A=(m*J-k*M)*+g[e+4>>2]+(f*M-m*H)*+g[e+20>>2]+(k*H-f*J)*+g[e+36>>2];u=(m*J-k*M)*+g[e+8>>2]+(f*M-m*H)*+g[e+24>>2]+(k*H-f*J)*+g[e+40>>2];v=(m*J-k*M)*+g[e+12>>2]+(f*M-m*H)*+g[e+28>>2]+(k*H-f*J)*+g[e+44>>2];w=(F*-m-K*-k)*+g[i+4>>2]+(K*-f-C*-m)*+g[i+20>>2]+(C*-k-F*-f)*+g[i+36>>2];x=(F*-m-K*-k)*+g[i+8>>2]+(K*-f-C*-m)*+g[i+24>>2]+(C*-k-F*-f)*+g[i+40>>2];z=(F*-m-K*-k)*+g[i+12>>2]+(K*-f-C*-m)*+g[i+28>>2]+(C*-k-F*-f)*+g[i+44>>2];f=(f*(M*G-J*N+ +g[e+372>>2]-(K*B-F*L+ +g[i+372>>2]))+k*(+g[e+376>>2]+(H*N-M*I)-(+g[i+376>>2]+(C*L-K*E)))+m*(J*I-H*G+ +g[e+380>>2]-(F*E-C*B+ +g[i+380>>2])))*-.20000000298023224*(1.0/(+g[i+404>>2]+(+g[e+404>>2]+(A*A*+g[e+456>>2]+u*u*+g[e+460>>2]+v*v*+g[e+464>>2]))+(w*w*+g[i+456>>2]+x*x*+g[i+460>>2]+z*z*+g[i+464>>2])))}g[(c[b+76>>2]|0)+(j<<2)>>2]=f;e=c[b+128>>2]|0}j=j+1|0}while((j|0)<(e|0));if((e|0)<=0){l=s;return}i=0;o=0;h=c[b+136>>2]|0;while(1){e=c[h+(o*284|0)+88>>2]|0;if(e){f=+g[h+(o*284|0)+252>>2];if(f!=0.0){f=f*d;p=h}else{N=+g[h+(o*284|0)+256>>2];N=N==0.0?0.0:N;p=c[b+108>>2]|0;y=c[b+16>>2]|0;H=+g[h+(o*284|0)+16>>2];F=+g[h+(o*284|0)+20>>2];A=+g[h+(o*284|0)+24>>2];x=+g[y+(o<<4)>>2];E=+g[y+(o<<4)+4>>2];f=+g[y+(o<<4)+8>>2];P=H-+g[p+52>>2];Q=F-+g[p+56>>2];k=A-+g[p+60>>2];m=+g[p+324>>2]*(Q*f-k*E)+ +g[p+340>>2]*(k*x-P*f)+(P*E-Q*x)*+g[p+356>>2];R=(Q*f-k*E)*+g[p+328>>2]+(k*x-P*f)*+g[p+344>>2]+(P*E-Q*x)*+g[p+360>>2];O=(Q*f-k*E)*+g[p+332>>2]+(k*x-P*f)*+g[p+348>>2]+(P*E-Q*x)*+g[p+364>>2];L=H-+g[e+52>>2];J=F-+g[e+56>>2];C=A-+g[e+60>>2];w=(E*L-x*J)*+g[e+356>>2]+(+g[e+324>>2]*(f*J-E*C)+ +g[e+340>>2]*(x*C-f*L));u=(f*J-E*C)*+g[e+328>>2]+(x*C-f*L)*+g[e+344>>2]+(E*L-x*J)*+g[e+360>>2];v=(f*J-E*C)*+g[e+332>>2]+(x*C-f*L)*+g[e+348>>2]+(E*L-x*J)*+g[e+364>>2];H=H-+g[p+52>>2];F=F-+g[p+56>>2];A=A-+g[p+60>>2];I=+g[p+392>>2];z=+g[p+396>>2];G=+g[p+388>>2];M=+g[e+392>>2];B=+g[e+396>>2];K=+g[e+388>>2];f=-(1.0/(+g[p+404>>2]+(f*(Q*m-P*R)+(x*(k*R-Q*O)+E*(P*O-k*m)))+(+g[e+404>>2]+(f*(J*w-L*u)+(x*(C*u-J*v)+E*(L*v-C*w)))))*((A*I-F*z+ +g[p+372>>2]-(C*M-J*B+ +g[e+372>>2]))*x+(+g[p+376>>2]+(H*z-A*G)-(+g[e+376>>2]+(L*B-C*K)))*E+(F*G-H*I+ +g[p+380>>2]-(J*K-L*M+ +g[e+380>>2]))*f));f=N>2]|0}n=c[b+56>>2]|0;y=n+(o<<2)|0;g[y>>2]=0.0;e=p+(o*284|0)+280|0;g[e>>2]=1.0;m=+g[h+(o*284|0)+276>>2]*d*+g[h+(o*284|0)+228>>2];g[y>>2]=f;f=f*.5;k=+g[(c[b+76>>2]|0)+(o<<2)>>2];if(f*f+k*k>m*m){R=m/+D(+(f*f+k*k));g[e>>2]=R*+g[e>>2];e=1}else e=i}else{n=c[b+56>>2]|0;g[n+(o<<2)>>2]=0.0;g[h+(o*284|0)+280>>2]=1.0;e=i;p=h}o=o+1|0;j=c[b+128>>2]|0;if((o|0)>=(j|0))break;else{i=e;h=p}}if(e){if((j|0)<=0){l=s;return}h=c[b+76>>2]|0;e=0;do{i=h+(e<<2)|0;if(+g[i>>2]!=0.0?(q=p+(e*284|0)+280|0,r=+g[q>>2],r<1.0):0){y=n+(e<<2)|0;g[y>>2]=r*+g[y>>2];g[i>>2]=+g[q>>2]*+g[i>>2]}e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){l=s;return}e=0;h=n;while(1){i=c[b+108>>2]|0;j=p+(e*284|0)+16|0;k=+g[j>>2]-+g[i+52>>2];n=p+(e*284|0)+20|0;m=+g[n>>2]-+g[i+56>>2];o=p+(e*284|0)+24|0;d=+g[o>>2]-+g[i+60>>2];g[s+48>>2]=k;g[s+48+4>>2]=m;g[s+48+8>>2]=d;g[s+48+12>>2]=0.0;f=+g[h+(e<<2)>>2];if(f!=0.0){y=c[b+16>>2]|0;Q=f*+g[y+(e<<4)+4>>2];R=f*+g[y+(e<<4)+8>>2];g[s+32>>2]=+g[y+(e<<4)>>2]*f;g[s+32+4>>2]=Q;g[s+32+8>>2]=R;g[s+32+12>>2]=0.0;ll(i,s+32|0,s+48|0)}f=+g[(c[b+76>>2]|0)+(e<<2)>>2];if(f!=0.0){y=c[(c[b+136>>2]|0)+(e*284|0)+88>>2]|0;Q=+g[n>>2]-+g[y+56>>2];P=+g[o>>2]-+g[y+60>>2];g[s+32>>2]=+g[j>>2]-+g[y+52>>2];g[s+32+4>>2]=Q;g[s+32+8>>2]=P;g[s+32+12>>2]=0.0;t=c[b+36>>2]|0;P=+g[t+(e<<4)>>2]*f;Q=f*+g[t+(e<<4)+4>>2];R=f*+g[t+(e<<4)+8>>2];g[s+16>>2]=P;g[s+16+4>>2]=Q;g[s+16+8>>2]=R;g[s+16+12>>2]=0.0;t=c[b+108>>2]|0;q=c[b+116>>2]|0;L=+g[t+4+(q<<2)>>2];M=+g[t+20+(q<<2)>>2];N=+g[t+36+(q<<2)>>2];O=(L*k+M*m+N*d)*(1.0-+g[p+(e*284|0)+244>>2]);g[s+48>>2]=k-L*O;g[s+48+4>>2]=m-M*O;g[s+48+8>>2]=d-N*O;ll(t,s+16|0,s+48|0);g[s>>2]=-P;g[s+4>>2]=-Q;g[s+8>>2]=-R;g[s+12>>2]=0.0;ll(y,s,s+32|0)}e=e+1|0;if((e|0)>=(c[b+128>>2]|0))break;p=c[b+136>>2]|0;h=c[b+56>>2]|0}l=s;return}function Hc(b,e,f,h,i,j,k){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0;v=l;l=l+19040|0;p=j;q=p+36|0;do{c[p>>2]=0;p=p+4|0}while((p|0)<(q|0));c[v+18896>>2]=b;c[v+18896+4>>2]=f;x=+g[h>>2];K=+g[e>>2];y=+g[h+16>>2];A=+g[e+16>>2];z=+g[h+32>>2];L=+g[e+32>>2];B=+g[e+4>>2];M=+g[e+20>>2];C=+g[e+36>>2];s=+g[e+8>>2];n=+g[e+24>>2];w=+g[e+40>>2];J=+g[h+4>>2];I=+g[h+20>>2];H=+g[h+36>>2];G=+g[h+8>>2];F=+g[h+24>>2];E=+g[h+40>>2];g[v+18896+8>>2]=x*K+y*A+z*L;g[v+18896+12>>2]=x*B+y*M+z*C;g[v+18896+16>>2]=x*s+y*n+z*w;g[v+18896+20>>2]=0.0;g[v+18896+24>>2]=K*J+A*I+L*H;g[v+18896+28>>2]=B*J+M*I+C*H;g[v+18896+32>>2]=s*J+n*I+w*H;g[v+18896+36>>2]=0.0;g[v+18896+40>>2]=K*G+A*F+L*E;g[v+18896+44>>2]=B*G+M*F+C*E;g[v+18896+48>>2]=s*G+n*F+w*E;g[v+18896+52>>2]=0.0;w=+g[h+48>>2]-+g[e+48>>2];n=+g[h+52>>2]-+g[e+52>>2];s=+g[h+56>>2]-+g[e+56>>2];C=+g[e>>2];M=+g[h>>2];B=+g[e+16>>2];L=+g[h+16>>2];A=+g[e+32>>2];K=+g[h+32>>2];z=+g[e+4>>2];y=+g[e+20>>2];x=+g[e+36>>2];m=+g[e+8>>2];o=+g[e+24>>2];r=+g[e+40>>2];g[v+18896+56>>2]=C*M+B*L+A*K;g[v+18896+60>>2]=C*J+B*I+A*H;g[v+18896+64>>2]=C*G+B*F+A*E;g[v+18896+68>>2]=0.0;g[v+18896+72>>2]=M*z+L*y+K*x;g[v+18896+76>>2]=J*z+I*y+H*x;g[v+18896+80>>2]=G*z+F*y+E*x;g[v+18896+84>>2]=0.0;g[v+18896+88>>2]=M*m+L*o+K*r;g[v+18896+92>>2]=J*m+I*o+H*r;g[v+18896+96>>2]=G*m+F*o+E*r;g[v+18896+100>>2]=0.0;g[v+18896+104>>2]=w*C+n*B+s*A;g[v+18896+108>>2]=w*z+n*y+s*x;g[v+18896+112>>2]=w*m+n*o+s*r;g[v+18896+116>>2]=0.0;c[v+18896+120>>2]=k?81:80;c[v+18896+124>>2]=k?0:0;c[v+18512+364>>2]=0;c[v+18512+128>>2]=0;c[v+18512+128+4>>2]=0;c[v+18512+128+8>>2]=0;c[v+18512+128+12>>2]=0;c[v+18512+376>>2]=2;c[v+18512+368>>2]=0;g[v+18512+144>>2]=0.0;r=-+g[i+4>>2];s=-+g[i+8>>2];g[v+19024>>2]=-+g[i>>2];g[v+19024+4>>2]=r;g[v+19024+8>>2]=s;g[v+19024+12>>2]=0.0;switch(Jc(v+18512|0,v+18896|0,v+19024|0)|0){case 1:{c[v+18496>>2]=0;c[v+18496+4>>2]=0;c[v+18496+8>>2]=0;c[v+18496+12>>2]=0;c[v>>2]=9;c[v+18492>>2]=0;c[v+40>>2]=0;c[v+40+4>>2]=0;c[v+40+8>>2]=0;c[v+40+12>>2]=0;c[v+40+16>>2]=0;b=0;do{f=256-b+-1|0;c[v+4156+(f*56|0)+44>>2]=0;h=c[v+18504>>2]|0;c[v+4156+(f*56|0)+48>>2]=h;if(h|0)c[h+44>>2]=v+4156+(f*56|0);c[v+18504>>2]=v+4156+(f*56|0);c[v+18508>>2]=(c[v+18508>>2]|0)+1;b=b+1|0}while((b|0)!=256);o=+g[i>>2];r=+g[i+4>>2];n=+g[i+8>>2];t=c[v+18512+372>>2]|0;do if((c[t+32>>2]|0)>>>0>1?sd(v+18512|0)|0:0){b=c[v+18496>>2]|0;if(b|0){p=c[v+18500>>2]|0;q=c[v+18508>>2]|0;do{f=b+44|0;k=b+48|0;h=c[k>>2]|0;if(h|0)c[h+44>>2]=c[f>>2];f=c[f>>2]|0;if(f|0)c[f+48>>2]=c[k>>2];if((c[v+18496>>2]|0)==(b|0))c[v+18496>>2]=c[k>>2];p=p+-1|0;c[b+44>>2]=0;c[k>>2]=c[v+18504>>2];f=c[v+18504>>2]|0;if(f|0)c[f+44>>2]=b;c[v+18504>>2]=b;q=q+1|0;b=c[v+18496>>2]|0}while((b|0)!=0);c[v+18500>>2]=p;c[v+18508>>2]=q}c[v>>2]=0;c[v+18492>>2]=0;b=c[t>>2]|0;f=c[t+12>>2]|0;M=+g[f+16>>2];E=+g[b+16>>2]-M;G=+g[f+20>>2];H=+g[b+20>>2]-G;J=+g[f+24>>2];K=+g[b+24>>2]-J;f=c[t+4>>2]|0;I=+g[f+16>>2]-M;L=+g[f+20>>2]-G;F=+g[f+24>>2]-J;h=c[t+8>>2]|0;M=+g[h+16>>2]-M;G=+g[h+20>>2]-G;J=+g[h+24>>2]-J;if(E*L*J+(H*F*M+K*I*G-E*F*G-H*I*J)-K*L*M<0.0){c[t>>2]=f;c[t+4>>2]=b;k=c[t+16>>2]|0;c[t+16>>2]=c[t+20>>2];c[t+20>>2]=k;k=f}else{k=b;b=f}k=lf(v,k,b,h,1)|0;p=lf(v,c[t+4>>2]|0,c[t>>2]|0,c[t+12>>2]|0,1)|0;q=lf(v,c[t+8>>2]|0,c[t+4>>2]|0,c[t+12>>2]|0,1)|0;i=lf(v,c[t>>2]|0,c[t+8>>2]|0,c[t+12>>2]|0,1)|0;if((c[v+18500>>2]|0)==4){f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(!b)b=f;else{n=m*m;while(1){m=+g[b+16>>2];h=m*m>2]|0;if(!b)break;else n=h?m*m:n}b=f;m=+g[f+16>>2]}o=+g[b>>2];s=+g[b+4>>2];r=+g[b+8>>2];n=+g[b+12>>2];N=c[b+20>>2]|0;f=c[b+24>>2]|0;h=c[b+28>>2]|0;a[k+52>>0]=0;c[k+32>>2]=p;a[p+52>>0]=0;c[p+32>>2]=k;a[k+53>>0]=0;c[k+36>>2]=q;a[q+52>>0]=1;c[q+32>>2]=k;a[k+54>>0]=0;c[k+40>>2]=i;a[i+52>>0]=2;c[i+32>>2]=k;a[p+53>>0]=2;c[p+36>>2]=i;a[i+54>>0]=1;c[i+40>>2]=p;a[p+54>>0]=1;c[p+40>>2]=q;a[q+53>>0]=2;c[q+36>>2]=p;a[q+54>>0]=1;c[q+40>>2]=i;a[i+53>>0]=2;c[i+36>>2]=q;c[v>>2]=0;i=b;t=0;p=N;q=f;k=h;while(1){f=c[v+18492>>2]|0;if(f>>>0>=128){u=44;break}c[v+19024>>2]=0;c[v+19024+4>>2]=0;c[v+19024+8>>2]=0;c[v+18492>>2]=f+1;t=t+1|0;a[i+55>>0]=t;h=i+4|0;N=i+8|0;Fh(v+18512|0,+g[i>>2],+g[h>>2],+g[N>>2],v+60+(f<<5)|0);if(+g[i>>2]*+g[v+60+(f<<5)+16>>2]+ +g[h>>2]*+g[v+60+(f<<5)+20>>2]+ +g[N>>2]*+g[v+60+(f<<5)+24>>2]-+g[i+16>>2]>9.999999747378752e-05)b=0;else{b=7;u=43;break}do{h=nh(v,t,v+60+(f<<5)|0,c[i+32+(b<<2)>>2]|0,d[i+52+b>>0]|0,v+19024|0)|0;b=b+1|0}while(h&b>>>0<3);if(!(h&(c[v+19024+8>>2]|0)>>>0>2)){b=4;u=43;break}h=c[v+19024>>2]|0;b=c[v+19024+4>>2]|0;a[h+53>>0]=2;c[h+36>>2]=b;a[b+54>>0]=1;c[b+40>>2]=h;b=i+44|0;h=i+48|0;f=c[h>>2]|0;if(f|0)c[f+44>>2]=c[b>>2];b=c[b>>2]|0;if(b|0)c[b+48>>2]=c[h>>2];if((c[v+18496>>2]|0)==(i|0))c[v+18496>>2]=c[h>>2];c[v+18500>>2]=(c[v+18500>>2]|0)+-1;c[i+44>>2]=0;c[h>>2]=c[v+18504>>2];b=c[v+18504>>2]|0;if(b|0)c[b+44>>2]=i;c[v+18504>>2]=i;c[v+18508>>2]=(c[v+18508>>2]|0)+1;f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(b){n=m*m;h=f;while(1){m=+g[b+16>>2];f=m*m>2]|0;if(!b)break;else n=f?m*m:n}f=h;m=+g[h+16>>2]}o=+g[f>>2];s=+g[f+4>>2];r=+g[f+8>>2];n=+g[f+12>>2];b=c[f+20>>2]|0;h=c[f+24>>2]|0;k=c[f+28>>2]|0;if(t>>>0>=255){f=k;break}else{i=f;p=b;q=h}}if((u|0)==43){c[v>>2]=b;b=p;h=q;f=k}else if((u|0)==44){c[v>>2]=6;b=p;h=q;f=k}I=o*m;G=s*m;K=r*m;g[v+40>>2]=o;g[v+44>>2]=s;g[v+48>>2]=r;g[v+52>>2]=n;g[v+56>>2]=m;c[v+36>>2]=3;c[v+4>>2]=b;c[v+8>>2]=h;c[v+12>>2]=f;N=h;L=+g[N+16>>2]-I;E=+g[N+20>>2]-G;C=+g[N+24>>2]-K;t=f;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;L=+D(+((L*F-E*J)*(L*F-E*J)+((E*H-C*F)*(E*H-C*F)+(C*J-L*H)*(C*J-L*H))));g[v+20>>2]=L;J=+g[t+16>>2]-I;C=+g[t+20>>2]-G;t=b;F=+g[t+16>>2]-I;E=+g[t+20>>2]-G;M=+g[t+24>>2]-K;M=+D(+((J*E-C*F)*(J*E-C*F)+((C*M-H*E)*(C*M-H*E)+(H*F-J*M)*(H*F-J*M))));g[v+24>>2]=M;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;I=+g[N+16>>2]-I;G=+g[N+20>>2]-G;K=+g[N+24>>2]-K;K=+D(+((J*G-F*I)*(J*G-F*I)+((F*K-H*G)*(F*K-H*G)+(H*I-J*K)*(H*I-J*K))));g[v+20>>2]=L/(K+(L+M));g[v+24>>2]=M/(K+(L+M));g[v+28>>2]=K/(K+(L+M));if((c[v>>2]|0)!=9)if(!(c[v+36>>2]|0)){o=0.0;n=0.0;m=0.0;break}else{k=v+36|0;u=53;break}c[j>>2]=3;N=0;l=v;return N|0}else u=47}else u=47;while(0);if((u|0)==47){c[v>>2]=8;g[v+40>>2]=o;g[v+44>>2]=r;g[v+48>>2]=n;g[v+52>>2]=0.0;m=+D(+(o*o+r*r+n*n));if(m>0.0){g[v+40>>2]=1.0/m*o;g[v+44>>2]=1.0/m*r;g[v+48>>2]=1.0/m*n}else{c[v+40>>2]=1065353216;c[v+44>>2]=0;c[v+48>>2]=0}g[v+52>>2]=0.0;g[v+56>>2]=0.0;c[v+36>>2]=1;c[v+4>>2]=c[t>>2];g[v+20>>2]=1.0;k=v+36|0;u=53}if((u|0)==53){h=0;m=0.0;n=0.0;o=0.0;do{b=c[v+18896+120>>2]|0;N=c[v+18896+124>>2]|0;f=(c[v+18896>>2]|0)+(N>>1)|0;if(N&1)b=c[(c[f>>2]|0)+b>>2]|0;Sb[b&127](v+19024|0,f,c[v+4+(h<<2)>>2]|0);M=+g[v+20+(h<<2)>>2];m=m+ +g[v+19024>>2]*M;n=n+M*+g[v+19024+4>>2];o=o+M*+g[v+19024+8>>2];h=h+1|0}while(h>>>0<(c[k>>2]|0)>>>0)}c[j>>2]=1;M=m*+g[e+16>>2]+n*+g[e+20>>2]+o*+g[e+24>>2]+ +g[e+52>>2];J=m*+g[e+32>>2]+n*+g[e+36>>2]+o*+g[e+40>>2]+ +g[e+56>>2];g[j+4>>2]=m*+g[e>>2]+n*+g[e+4>>2]+o*+g[e+8>>2]+ +g[e+48>>2];g[j+8>>2]=M;g[j+12>>2]=J;g[j+16>>2]=0.0;J=+g[v+40>>2];M=+g[v+56>>2];K=+g[v+44>>2];L=+g[v+48>>2];E=m-J*M;F=n-M*K;G=o-M*L;H=E*+g[e+16>>2]+F*+g[e+20>>2]+G*+g[e+24>>2]+ +g[e+52>>2];I=E*+g[e+32>>2]+F*+g[e+36>>2]+G*+g[e+40>>2]+ +g[e+56>>2];g[j+20>>2]=E*+g[e>>2]+F*+g[e+4>>2]+G*+g[e+8>>2]+ +g[e+48>>2];g[j+24>>2]=H;g[j+28>>2]=I;g[j+32>>2]=0.0;g[j+36>>2]=-J;g[j+40>>2]=-K;g[j+44>>2]=-L;g[j+48>>2]=0.0;g[j+52>>2]=-M;N=1;l=v;return N|0}case 2:{c[j>>2]=2;N=0;l=v;return N|0}default:{N=0;l=v;return N|0}}return 0}function Ic(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;w=l;l=l+208|0;u=(a[b+68>>0]|0)!=0;t=u?e:d;u=u?d:e;v=c[t+4>>2]|0;if((c[v+72>>2]|0)!=(c[b+80>>2]|0)){j=c[b+52>>2]|0;if((j|0)>0){i=0;do{k=c[(c[b+60>>2]|0)+(i<<2)>>2]|0;if(k|0){Ib[c[c[k>>2]>>2]&511](k);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(i<<2)>>2]|0)}i=i+1|0}while((i|0)!=(j|0))}eh(b,d,e);c[b+80>>2]=c[v+72>>2]}d=c[b+52>>2]|0;if(!d){l=w;return}m=c[v+68>>2]|0;j=c[b+4>>2]|0;k=c[b+60>>2]|0;i=c[b+72>>2]|0;c[w+176>>2]=6540;c[w+176+4>>2]=t;c[w+176+8>>2]=u;c[w+176+12>>2]=j;c[w+176+16>>2]=f;c[w+176+20>>2]=h;c[w+176+24>>2]=k;c[w+176+28>>2]=i;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0);d=c[b+52>>2]|0}c[b+32>>2]=0;if((d|0)>0){f=0;do{i=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if(i){Ob[c[(c[i>>2]|0)+16>>2]&127](i,b+28|0);i=c[b+32>>2]|0;if((i|0)>0){k=0;do{j=c[(c[b+40>>2]|0)+(k<<2)>>2]|0;if(c[j+780>>2]|0){c[h+4>>2]=j;i=c[j+772>>2]|0;d=c[(c[h+8>>2]|0)+8>>2]|0;e=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(d|0))af(j,i+4|0,e+4|0);else af(j,e+4|0,d+4|0);c[h+4>>2]=0;i=c[b+32>>2]|0}k=k+1|0}while((k|0)<(i|0))}if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(!m){if((d|0)>0){i=0;do{we(w+176|0,c[(c[v+28>>2]|0)+(i*80|0)+64>>2]|0,i);i=i+1|0}while((i|0)<(d|0))}}else{k=c[t+12>>2]|0;F=+g[k>>2];E=+g[k+16>>2];D=+g[k+32>>2];C=+g[k+4>>2];B=+g[k+20>>2];A=+g[k+36>>2];r=+g[k+8>>2];p=+g[k+24>>2];n=+g[k+40>>2];z=-+g[k+48>>2];y=-+g[k+52>>2];x=-+g[k+56>>2];k=c[u+12>>2]|0;O=+g[k>>2];N=+g[k+16>>2];M=+g[k+32>>2];L=+g[k+4>>2];K=+g[k+20>>2];J=+g[k+36>>2];I=+g[k+8>>2];H=+g[k+24>>2];G=+g[k+40>>2];q=+g[k+48>>2];o=+g[k+52>>2];s=+g[k+56>>2];g[w+32>>2]=F*O+E*N+D*M;g[w+32+4>>2]=F*L+E*K+D*J;g[w+32+8>>2]=F*I+E*H+D*G;g[w+32+12>>2]=0.0;g[w+32+16>>2]=C*O+B*N+A*M;g[w+32+20>>2]=C*L+B*K+A*J;g[w+32+24>>2]=C*I+B*H+A*G;g[w+32+28>>2]=0.0;g[w+32+32>>2]=r*O+p*N+n*M;g[w+32+36>>2]=r*L+p*K+n*J;g[w+32+40>>2]=r*I+p*H+n*G;g[w+32+44>>2]=0.0;g[w+32+48>>2]=F*z+E*y+D*x+(F*q+E*o+D*s);g[w+32+52>>2]=C*z+B*y+A*x+(C*q+B*o+A*s);g[w+32+56>>2]=r*z+p*y+n*x+(r*q+p*o+n*s);g[w+32+60>>2]=0.0;k=c[u+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,w+32|0,w+112|0,w+96|0);s=+g[h+32>>2];n=+g[w+112>>2]-s;g[w+112>>2]=n;o=+g[w+112+4>>2]-s;g[w+112+4>>2]=o;p=+g[w+112+8>>2]-s;g[w+112+8>>2]=p;q=s+ +g[w+96>>2];g[w+96>>2]=q;r=s+ +g[w+96+4>>2];g[w+96+4>>2]=r;s=s+ +g[w+96+8>>2];g[w+96+8>>2]=s;k=c[m>>2]|0;if(k|0){i=c[b+12>>2]|0;d=c[b+16>>2]|0;if((i|0)<0){if((d|0)<0){d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+16>>2]=0;d=0}do{c[(c[b+20>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+12>>2]=0;if((d|0)<64){c[6995]=(c[6995]|0)+1;i=sc(275)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=64;d=64}else i=0;if((i|0)==(d|0)){j=d<<1;if((d|0)<(j|0)){c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d}c[(c[b+20>>2]|0)+(i<<2)>>2]=k;d=i+1|0;c[b+12>>2]=d;while(1){i=d+-1|0;e=c[b+20>>2]|0;f=c[e+(i<<2)>>2]|0;c[b+12>>2]=i;do if(((((+g[f>>2]<=q?+g[f+16>>2]>=n:0)?+g[f+4>>2]<=r:0)?+g[f+20>>2]>=o:0)?+g[f+8>>2]<=s:0)?+g[f+24>>2]>=p:0){if(!(c[f+40>>2]|0)){Ob[c[(c[w+176>>2]|0)+12>>2]&127](w+176|0,f);i=c[b+12>>2]|0;break}k=c[f+36>>2]|0;j=c[b+16>>2]|0;do if((i|0)==(j|0)){j=i|0?i<<1:1;if((d|0)>(j|0)){d=i;break}if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j;d=i;i=j}else{d=i;i=j}while(0);c[e+(d<<2)>>2]=k;d=d+1|0;c[b+12>>2]=d;k=c[f+40>>2]|0;do if((d|0)==(i|0)){j=i|0?i<<1:1;if((i|0)>=(j|0))break;if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d;while(0);c[(c[b+20>>2]|0)+(i<<2)>>2]=k;i=i+1|0;c[b+12>>2]=i}while(0);if((i|0)>0)d=i;else break}}}e=c[b+52>>2]|0;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;if((e|0)>0){d=0;do{do if(c[(c[b+60>>2]|0)+(d<<2)>>2]|0){f=c[v+28>>2]|0;m=c[f+(d*80|0)+64>>2]|0;h=c[t+12>>2]|0;q=+g[h>>2];r=+g[h+4>>2];s=+g[h+8>>2];x=+g[h+16>>2];y=+g[h+20>>2];z=+g[h+24>>2];G=+g[h+32>>2];I=+g[h+36>>2];K=+g[h+40>>2];A=+g[f+(d*80|0)>>2];B=+g[f+(d*80|0)+16>>2];C=+g[f+(d*80|0)+32>>2];D=+g[f+(d*80|0)+4>>2];E=+g[f+(d*80|0)+20>>2];F=+g[f+(d*80|0)+36>>2];H=+g[f+(d*80|0)+8>>2];J=+g[f+(d*80|0)+24>>2];L=+g[f+(d*80|0)+40>>2];o=+g[f+(d*80|0)+48>>2];p=+g[f+(d*80|0)+52>>2];O=+g[f+(d*80|0)+56>>2];M=+g[h+48>>2]+(q*o+r*p+s*O);N=+g[h+52>>2]+(x*o+y*p+z*O);O=+g[h+56>>2]+(G*o+I*p+K*O);g[w+112>>2]=q*A+r*B+s*C;g[w+112+4>>2]=q*D+r*E+s*F;g[w+112+8>>2]=q*H+r*J+s*L;g[w+112+12>>2]=0.0;g[w+112+16>>2]=x*A+y*B+z*C;g[w+112+20>>2]=x*D+y*E+z*F;g[w+112+24>>2]=x*H+y*J+z*L;g[w+112+28>>2]=0.0;g[w+112+32>>2]=G*A+I*B+K*C;g[w+112+36>>2]=G*D+I*E+K*F;g[w+112+40>>2]=G*H+I*J+K*L;g[w+112+44>>2]=0.0;g[w+112+48>>2]=M;g[w+112+52>>2]=N;g[w+112+56>>2]=O;g[w+112+60>>2]=0.0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,w+112|0,w+96|0,w+32|0);m=c[u+4>>2]|0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,c[u+12>>2]|0,w+16|0,w);if(!(+g[w+96>>2]>+g[w>>2])?!(+g[w+32>>2]<+g[w+16>>2]):0)i=1;else i=0;if(!(!(+g[w+96+8>>2]>+g[w+8>>2])?!(+g[w+32+8>>2]<+g[w+16+8>>2]):0))i=0;if(!(+g[w+96+4>>2]>+g[w+4>>2])?!(+g[w+32+4>>2]<+g[w+16+4>>2]|i^1):0)break;m=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;Ib[c[c[m>>2]>>2]&511](m);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(d<<2)>>2]|0);c[(c[b+60>>2]|0)+(d<<2)>>2]=0}while(0);d=d+1|0}while((d|0)<(e|0))}l=w;return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,E=0.0,F=0.0,G=0.0;C=l;l=l+176|0;c[a+348>>2]=a+220;c[a+352>>2]=a+252;c[a+356>>2]=a+284;c[a+360>>2]=a+316;c[a+364>>2]=4;c[a+368>>2]=0;c[a+376>>2]=0;y=c[b+4>>2]|0;c[a>>2]=c[b>>2];c[a+4>>2]=y;c[a+8>>2]=c[b+8>>2];c[a+8+4>>2]=c[b+8+4>>2];c[a+8+8>>2]=c[b+8+8>>2];c[a+8+12>>2]=c[b+8+12>>2];c[a+24>>2]=c[b+24>>2];c[a+24+4>>2]=c[b+24+4>>2];c[a+24+8>>2]=c[b+24+8>>2];c[a+24+12>>2]=c[b+24+12>>2];c[a+40>>2]=c[b+40>>2];c[a+40+4>>2]=c[b+40+4>>2];c[a+40+8>>2]=c[b+40+8>>2];c[a+40+12>>2]=c[b+40+12>>2];c[a+56>>2]=c[b+56>>2];c[a+56+4>>2]=c[b+56+4>>2];c[a+56+8>>2]=c[b+56+8>>2];c[a+56+12>>2]=c[b+56+12>>2];c[a+72>>2]=c[b+72>>2];c[a+72+4>>2]=c[b+72+4>>2];c[a+72+8>>2]=c[b+72+8>>2];c[a+72+12>>2]=c[b+72+12>>2];c[a+88>>2]=c[b+88>>2];c[a+88+4>>2]=c[b+88+4>>2];c[a+88+8>>2]=c[b+88+8>>2];c[a+88+12>>2]=c[b+88+12>>2];c[a+104>>2]=c[b+104>>2];c[a+104+4>>2]=c[b+104+4>>2];c[a+104+8>>2]=c[b+104+8>>2];c[a+104+12>>2]=c[b+104+12>>2];y=c[b+124>>2]|0;c[a+120>>2]=c[b+120>>2];c[a+124>>2]=y;g[a+144>>2]=0.0;c[a+180>>2]=0;c[a+128>>2]=c[d>>2];c[a+128+4>>2]=c[d+4>>2];c[a+128+8>>2]=c[d+8>>2];c[a+128+12>>2]=c[d+12>>2];e=+g[a+128>>2];f=+g[a+132>>2];h=+g[a+136>>2];if(e*e+f*f+h*h>0.0){g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,-e,-f,-h,a+316|0);b=a+148|0;d=a+164|0}else{g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,1.0,0.0,0.0,a+316|0);b=a+148|0;d=a+164|0}g[d>>2]=1.0;y=(c[b>>2]|0)+16|0;c[a+128>>2]=c[y>>2];c[a+128+4>>2]=c[y+4>>2];c[a+128+8>>2]=c[y+8>>2];c[a+128+12>>2]=c[y+12>>2];c[C+24+48>>2]=c[y>>2];c[C+24+48+4>>2]=c[y+4>>2];c[C+24+48+8>>2]=c[y+8>>2];c[C+24+48+12>>2]=c[y+12>>2];c[C+24+32>>2]=c[y>>2];c[C+24+32+4>>2]=c[y+4>>2];c[C+24+32+8>>2]=c[y+8>>2];c[C+24+32+12>>2]=c[y+12>>2];c[C+24+16>>2]=c[y>>2];c[C+24+16+4>>2]=c[y+4>>2];c[C+24+16+8>>2]=c[y+8>>2];c[C+24+16+12>>2]=c[y+12>>2];c[C+24>>2]=c[y>>2];c[C+24+4>>2]=c[y+4>>2];c[C+24+8>>2]=c[y+8>>2];c[C+24+12>>2]=c[y+12>>2];y=0;z=0.0;e=e*e+f*f+h*h;x=0;a:do{w=c[a+368>>2]|0;f=+g[a+128>>2];h=+g[a+132>>2];i=+g[a+136>>2];o=+D(+(f*f+h*h+i*i));if(o<9.999999747378752e-05){B=6;break}g[a+148+(w*36|0)+16+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=0.0;b=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=b;c[a+148+(w*36|0)+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=c[a+348+(b<<2)>>2];b=c[a+148+(w*36|0)+32>>2]|0;c[a+148+(w*36|0)+32>>2]=b+1;Fh(a,-f,-h,-i,c[a+148+(w*36|0)+(b<<2)>>2]|0);b=c[a+148+(w*36|0)+32>>2]|0;d=c[a+148+(w*36|0)+(b+-1<<2)>>2]|0;f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];r=f-+g[C+24>>2];s=h-+g[C+24+4>>2];v=i-+g[C+24+8>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+16>>2];s=h-+g[C+24+20>>2];v=i-+g[C+24+24>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+32>>2];s=h-+g[C+24+36>>2];v=i-+g[C+24+40>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+48>>2];s=h-+g[C+24+52>>2];v=i-+g[C+24+56>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}x=x+1&3;u=C+24+(x<<4)|0;c[u>>2]=c[d+16>>2];c[u+4>>2]=c[d+16+4>>2];c[u+8>>2]=c[d+16+8>>2];c[u+12>>2]=c[d+16+12>>2];v=(+g[a+128>>2]*f+ +g[a+132>>2]*h+ +g[a+136>>2]*i)/o;z=v>z?v:z;if(o-z-o*9.999999747378752e-05<=0.0){B=10;break}c[C>>2]=0;b:do switch(b|0){case 2:{u=c[a+148+(w*36|0)>>2]|0;t=c[a+148+(w*36|0)+4>>2]|0;e=+g[t+16>>2];f=+g[u+16>>2];h=+g[t+20>>2];i=+g[u+20>>2];o=+g[t+24>>2];p=+g[u+24>>2];if(!((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p)>0.0)){B=38;break a}q=-(f*(e-f)+i*(h-i)+p*(o-p))/((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p));if(q>=1.0){g[C+8>>2]=0.0;g[C+8+4>>2]=1.0;c[C>>2]=2;e=e*e+h*h+o*o;break b}if(!(q<=0.0)){g[C+8+4>>2]=q;g[C+8>>2]=1.0-q;c[C>>2]=3;e=((e-f)*q+f)*((e-f)*q+f)+((h-i)*q+i)*((h-i)*q+i)+((o-p)*q+p)*((o-p)*q+p);break b}else{g[C+8>>2]=1.0;g[C+8+4>>2]=0.0;c[C>>2]=1;e=f*f+i*i+p*p;break b}}case 3:{e=+Ke((c[a+148+(w*36|0)>>2]|0)+16|0,(c[a+148+(w*36|0)+4>>2]|0)+16|0,(c[a+148+(w*36|0)+8>>2]|0)+16|0,C+8|0,C);break}case 4:{m=c[a+148+(w*36|0)>>2]|0;n=c[a+148+(w*36|0)+4>>2]|0;t=c[a+148+(w*36|0)+8>>2]|0;u=c[a+148+(w*36|0)+12>>2]|0;c[C+152>>2]=m+16;c[C+152+4>>2]=n+16;c[C+152+8>>2]=t+16;c[C+152+12>>2]=u+16;i=+g[m+16>>2];o=+g[u+16>>2];f=+g[m+20>>2];p=+g[u+20>>2];h=+g[m+24>>2];q=+g[u+24>>2];g[C+104>>2]=i-o;g[C+104+4>>2]=f-p;g[C+104+8>>2]=h-q;g[C+104+12>>2]=0.0;e=+g[n+16>>2];F=+g[n+20>>2];s=+g[n+24>>2];g[C+104+16>>2]=e-o;g[C+104+20>>2]=F-p;g[C+104+24>>2]=s-q;g[C+104+28>>2]=0.0;r=+g[t+16>>2];G=+g[t+20>>2];E=+g[t+24>>2];g[C+104+32>>2]=r-o;g[C+104+36>>2]=G-p;g[C+104+40>>2]=E-q;g[C+104+44>>2]=0.0;v=(f-p)*(s-q)*(r-o)+(h-q)*(e-o)*(G-p)-(G-p)*(s-q)*(i-o)-(f-p)*(e-o)*(E-q)+(E-q)*(i-o)*(F-p)-(r-o)*(h-q)*(F-p);if(v!=v|0.0!=0.0|v==0.0|!(v*(h*((e-r)*(f-F)-(F-G)*(i-e))+(i*((F-G)*(h-s)-(s-E)*(f-F))+f*((s-E)*(i-e)-(e-r)*(h-s))))<=0.0))e=-1.0;else{c[C+92>>2]=0;c[C+92+4>>2]=0;c[C+92+8>>2]=0;c[C+88>>2]=0;e=-1.0;k=0;s=f-p;r=h-q;h=i-o;f=q;d=c[C>>2]|0;while(1){b=c[5288+(k<<2)>>2]|0;E=+g[C+104+(b<<4)+8>>2];F=+g[C+104+(b<<4)+4>>2];G=+g[C+104+(b<<4)>>2];if(v*((s*E-r*F)*o+p*(r*G-E*h)+(F*h-s*G)*f)>0.0?(A=+Ke(c[C+152+(k<<2)>>2]|0,c[C+152+(b<<2)>>2]|0,u+16|0,C+92|0,C+88|0),e<0.0|A>2]|0;c[C+8+(k<<2)>>2]=c[C+92>>2];c[C+8+(b<<2)>>2]=c[C+92+4>>2];g[C+8+(c[5288+(b<<2)>>2]<<2)>>2]=0.0;c[C+8+12>>2]=c[C+92+8>>2];e=A;d=(d&2|0?1<>2];r=+g[C+104+(b<<4)+8>>2];h=+g[C+104+(b<<4)>>2];o=+g[u+16>>2];p=+g[u+20>>2];f=+g[u+24>>2]}c[C>>2]=d;if(e<0.0){c[C>>2]=15;i=+g[t+20>>2];G=+g[n+24>>2];F=+g[u+16>>2];f=+g[t+24>>2];E=+g[n+16>>2];o=+g[u+20>>2];h=+g[t+16>>2];s=+g[u+24>>2];q=+g[n+20>>2];g[C+8>>2]=(i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v;e=+g[m+20>>2];p=+g[m+24>>2];r=+g[m+16>>2];g[C+8+4>>2]=(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v;g[C+8+8>>2]=(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v;g[C+8+12>>2]=1.0-((i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v+(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v+(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v);e=0.0}}break}default:{}}while(0);if(!(e>=0.0)){B=38;break}c[a+148+((1-w|0)*36|0)+32>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+368>>2]=1-w;d=c[a+148+(w*36|0)+32>>2]|0;k=c[C>>2]|0;if(d|0){b=0;do{m=a+148+(w*36|0)+(b<<2)|0;n=c[m>>2]|0;if(!(k&1<>2]|0;c[a+364>>2]=u+1;c[a+348+(u<<2)>>2]=n}else{c[a+148+((1-w|0)*36|0)+(c[a+148+((1-w|0)*36|0)+32>>2]<<2)>>2]=n;t=c[C+8+(b<<2)>>2]|0;u=c[a+148+((1-w|0)*36|0)+32>>2]|0;c[a+148+((1-w|0)*36|0)+32>>2]=u+1;c[a+148+((1-w|0)*36|0)+16+(u<<2)>>2]=t;u=c[m>>2]|0;E=(c[j>>2]=t,+g[j>>2]);F=E*+g[u+20>>2];G=E*+g[u+24>>2];g[a+128>>2]=+g[u+16>>2]*E+ +g[a+128>>2];g[a+132>>2]=F+ +g[a+132>>2];g[a+136>>2]=G+ +g[a+136>>2]}b=b+1|0}while((b|0)!=(d|0))}if((k|0)==15)c[a+376>>2]=1;y=y+1|0;if(y>>>0>=128){B=40;break}b=c[a+376>>2]|0}while(!(b|0));if((B|0)==6){c[a+376>>2]=1;B=41}else if((B|0)==9){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==10){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==38){b=c[a+368>>2]|0;y=(c[a+148+(b*36|0)+32>>2]|0)+-1|0;c[a+148+(b*36|0)+32>>2]=y;y=c[a+148+(b*36|0)+(y<<2)>>2]|0;b=c[a+364>>2]|0;c[a+364>>2]=b+1;c[a+348+(b<<2)>>2]=y;b=c[a+376>>2]|0}else if((B|0)==40){c[a+376>>2]=2;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);a=2;l=C;return a|0}if((B|0)==41)b=c[a+376>>2]|0;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);switch(b|0){case 0:{F=+g[a+128>>2];G=+g[a+132>>2];e=+g[a+136>>2];e=+D(+(F*F+G*G+e*e));break}case 1:{e=0.0;break}default:{a=b;l=C;return a|0}}g[a+144>>2]=e;a=b;l=C;return a|0}function Kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0;r=l;l=l+144|0;m=c[b+48>>2]|0;j=c[b+52>>2]|0;if((j|0?(k=c[j+20>>2]|0,k|0):0)?(xb[c[(c[k>>2]|0)+56>>2]&127](k)|0)&1|0:0){c[r+48>>2]=1065353216;c[r+48+4>>2]=1065353216;c[r+48+8>>2]=0;g[r+48+12>>2]=0.0;k=c[b+8>>2]|0;p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;x=+g[d>>2];E=+g[d+4>>2];A=+g[d+8>>2];v=+g[k+20>>2];s=+g[k+24>>2];w=+g[k+28>>2];t=+g[k+36>>2];z=+g[k+40>>2];B=+g[k+44>>2];u=+g[k+52>>2];C=+g[k+56>>2];y=+g[k+60>>2];g[r+24>>2]=x*+g[k+4>>2]+E*+g[k+8>>2]+A*+g[k+12>>2]+u;g[r+24+4>>2]=x*v+E*s+A*w+C;g[r+24+8>>2]=x*t+E*z+A*B+y;g[r+24+12>>2]=0.0;A=+g[d+16>>2];E=+g[d+20>>2];x=+g[d+24>>2];g[r>>2]=A*+g[k+4>>2]+E*+g[k+8>>2]+x*+g[k+12>>2]+u;g[r+4>>2]=A*v+E*s+x*w+C;g[r+8>>2]=A*t+E*z+x*B+y;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;y=+g[d+16>>2];B=+g[d+20>>2];x=+g[d+24>>2];z=+g[k+20>>2];E=+g[k+24>>2];t=+g[k+28>>2];A=+g[k+36>>2];C=+g[k+40>>2];w=+g[k+44>>2];s=+g[k+52>>2];v=+g[k+56>>2];u=+g[k+60>>2];g[r+24>>2]=y*+g[k+4>>2]+B*+g[k+8>>2]+x*+g[k+12>>2]+s;g[r+24+4>>2]=y*z+B*E+x*t+v;g[r+24+8>>2]=y*A+B*C+x*w+u;g[r+24+12>>2]=0.0;x=+g[d+32>>2];B=+g[d+36>>2];y=+g[d+40>>2];g[r>>2]=x*+g[k+4>>2]+B*+g[k+8>>2]+y*+g[k+12>>2]+s;g[r+4>>2]=x*z+B*E+y*t+v;g[r+8>>2]=x*A+B*C+y*w+u;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;u=+g[d+32>>2];w=+g[d+36>>2];y=+g[d+40>>2];C=+g[k+20>>2];B=+g[k+24>>2];A=+g[k+28>>2];x=+g[k+36>>2];v=+g[k+40>>2];t=+g[k+44>>2];E=+g[k+52>>2];z=+g[k+56>>2];s=+g[k+60>>2];g[r+24>>2]=u*+g[k+4>>2]+w*+g[k+8>>2]+y*+g[k+12>>2]+E;g[r+24+4>>2]=u*C+w*B+y*A+z;g[r+24+8>>2]=u*x+w*v+y*t+s;g[r+24+12>>2]=0.0;y=+g[d>>2];w=+g[d+4>>2];u=+g[d+8>>2];g[r>>2]=y*+g[k+4>>2]+w*+g[k+8>>2]+u*+g[k+12>>2]+E;g[r+4>>2]=y*C+w*B+u*A+z;g[r+8>>2]=y*x+w*v+u*t+s;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0)}j=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;j=(c[b+108>>2]|0)+-1&(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11));a:do if(j>>>0<(c[b+64>>2]|0)>>>0?(h=c[(c[b+72>>2]|0)+(j<<2)>>2]|0,(h|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(h<<2)>>2]|0))break;h=c[(c[b+92>>2]|0)+(h<<2)>>2]|0;if((h|0)==-1)break a}j=c[b+112>>2]|0;if(j+(h<<3)|0){p=c[j+(h<<3)+4>>2]|0;q=c[b+8>>2]|0;c[p+8>>2]=c[(c[q+192>>2]|0)+8>>2];o=c[b+4>>2]|0;n=c[o+192>>2]|0;c[r+48>>2]=0;c[r+48+4>>2]=n;c[r+48+8>>2]=o;c[r+48+12>>2]=o+4;c[r+48+16>>2]=-1;c[r+48+20>>2]=-1;c[r+24>>2]=0;c[r+24+4>>2]=p;c[r+24+8>>2]=q;c[r+24+12>>2]=q+4;c[r+24+16>>2]=e;c[r+24+20>>2]=f;q=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+48|0,r+24|0,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[q>>2]|0)+8>>2]&31](q,r+48|0,r+24|0,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[q>>2]>>2]&511](q);Ob[c[(c[m>>2]|0)+60>>2]&127](m,q);l=r;return}}while(0);u=+g[d+16>>2];F=+g[d>>2];v=+g[d+20>>2];s=+g[d+4>>2];w=+g[d+24>>2];t=+g[d+8>>2];x=+g[d+32>>2];z=+g[d+36>>2];B=+g[d+40>>2];y=(v-s)*(B-t)-(w-t)*(z-s);A=(w-t)*(x-F)-(u-F)*(B-t);E=(u-F)*(z-s)-(v-s)*(x-F);C=1.0/+D(+(E*E+(y*y+A*A)));g[r+48>>2]=F+C*y*.05999999865889549;g[r+48+4>>2]=s+C*A*.05999999865889549;g[r+48+8>>2]=C*E*.05999999865889549+t;g[r+48+12>>2]=0.0;g[r+48+16>>2]=C*y*.05999999865889549+u;g[r+48+20>>2]=C*A*.05999999865889549+v;g[r+48+24>>2]=C*E*.05999999865889549+w;g[r+48+28>>2]=0.0;g[r+48+32>>2]=C*y*.05999999865889549+x;g[r+48+36>>2]=C*A*.05999999865889549+z;g[r+48+40>>2]=C*E*.05999999865889549+B;g[r+48+44>>2]=0.0;g[r+48+48>>2]=F-C*y*.05999999865889549;g[r+48+52>>2]=s-C*A*.05999999865889549;g[r+48+56>>2]=t-C*E*.05999999865889549;g[r+48+60>>2]=0.0;g[r+48+64>>2]=u-C*y*.05999999865889549;g[r+48+68>>2]=v-C*A*.05999999865889549;g[r+48+72>>2]=w-C*E*.05999999865889549;g[r+48+76>>2]=0.0;g[r+48+80>>2]=x-C*y*.05999999865889549;g[r+48+84>>2]=z-C*A*.05999999865889549;g[r+48+88>>2]=B-C*E*.05999999865889549;g[r+48+92>>2]=0.0;c[6995]=(c[6995]|0)+1;h=sc(135)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}lg(h,r+48|0,6,16);p=c[b+8>>2]|0;c[h+8>>2]=c[(c[p+192>>2]|0)+8>>2];o=c[b+4>>2]|0;d=c[o+192>>2]|0;c[r+24>>2]=0;c[r+24+4>>2]=d;c[r+24+8>>2]=o;c[r+24+12>>2]=o+4;c[r+24+16>>2]=-1;c[r+24+20>>2]=-1;c[r>>2]=0;c[r+4>>2]=h;c[r+8>>2]=p;c[r+12>>2]=p+4;c[r+16>>2]=e;c[r+20>>2]=f;p=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+24|0,r,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[p>>2]|0)+8>>2]&31](p,r+24|0,r,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[p>>2]>>2]&511](p);Ob[c[(c[m>>2]|0)+60>>2]&127](m,p);p=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);m=c[b+108>>2]|0;b:do if((p&m+-1)>>>0<(c[b+64>>2]|0)>>>0?(i=c[(c[b+72>>2]|0)+((p&m+-1)<<2)>>2]|0,(i|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(i<<2)>>2]|0))break;i=c[(c[b+92>>2]|0)+(i<<2)>>2]|0;if((i|0)==-1){q=20;break b}}b=c[b+112>>2]|0;c[b+(i<<3)>>2]=e<<21|f;c[b+(i<<3)+4>>2]=h}else q=20;while(0);if((q|0)==20){o=c[b+104>>2]|0;if((o|0)==(m|0)){d=m|0?m<<1:1;if((m|0)<(d|0)){if(!d){i=0;k=m}else{c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[b+104>>2]|0}if((k|0)>0){j=0;do{I=(c[b+112>>2]|0)+(j<<3)|0;H=c[I+4>>2]|0;G=i+(j<<3)|0;c[G>>2]=c[I>>2];c[G+4>>2]=H;j=j+1|0}while((j|0)!=(k|0))}j=c[b+112>>2]|0;if(j|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=i;c[b+108>>2]=d;i=c[b+104>>2]|0}else i=m}else i=o;I=c[b+112>>2]|0;c[I+(i<<3)>>2]=e<<21|f;c[I+(i<<3)+4>>2]=h;c[b+104>>2]=(c[b+104>>2]|0)+1;h=c[b+124>>2]|0;if((h|0)==(c[b+128>>2]|0)?(n=h|0?h<<1:1,(h|0)<(n|0)):0){if(!n)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+124>>2]|0}j=c[b+132>>2]|0;if((h|0)<=0)if(!j)h=b+136|0;else q=43;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));q=43}if((q|0)==43){if(a[b+136>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+132>>2]=0;h=b+136|0}a[h>>0]=1;c[b+132>>2]=k;c[b+128>>2]=n;h=c[b+124>>2]|0}c[(c[b+132>>2]|0)+(h<<2)>>2]=e<<21|f;c[b+124>>2]=(c[b+124>>2]|0)+1;n=c[b+108>>2]|0;if((m|0)<(n|0)){e=c[b+64>>2]|0;if((e|0)<(n|0)){if((c[b+68>>2]|0)<(n|0)){if(!n){h=0;j=e}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+64>>2]|0}k=c[b+72>>2]|0;if((j|0)<=0)if(!k)i=b+76|0;else q=59;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=59}if((q|0)==59)if(!(a[b+76>>0]|0))i=b+76|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+76|0}a[i>>0]=1;c[b+72>>2]=h;c[b+68>>2]=n;m=b+72|0}else{m=b+72|0;h=c[b+72>>2]|0}Yk(h+(e<<2)|0,0,(n<<2)-(e<<2)|0)|0;c[b+64>>2]=n;d=c[b+84>>2]|0;if((d|0)<(n|0)){if((c[b+88>>2]|0)<(n|0)){if(!n){h=0;j=d}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+84>>2]|0}k=c[b+92>>2]|0;if((j|0)<=0)if(!k)i=b+96|0;else q=73;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=73}if((q|0)==73)if(!(a[b+96>>0]|0))i=b+96|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+96|0}a[i>>0]=1;c[b+92>>2]=h;c[b+88>>2]=n}else h=c[b+92>>2]|0;Yk(h+(d<<2)|0,0,(n<<2)-(d<<2)|0)|0}c[b+84>>2]=n;if((n|0)>0){Yk(c[m>>2]|0,-1,n<<2|0)|0;Yk(c[b+92>>2]|0,-1,n<<2|0)|0}if((e|0)>0){k=c[b+132>>2]|0;i=c[m>>2]|0;j=c[b+92>>2]|0;h=0;do{I=c[k+(h<<2)>>2]|0;I=((I+~(I<<15)|0)>>>10^I+~(I<<15))*9|0;I=i+(((((I>>>6^I)+~((I>>>6^I)<<11)|0)>>>16^(I>>>6^I)+~((I>>>6^I)<<11))&(c[b+108>>2]|0)+-1)<<2)|0;c[j+(h<<2)>>2]=c[I>>2];c[I>>2]=h;h=h+1|0}while((h|0)!=(e|0))}}h=p&(c[b+108>>2]|0)+-1}else h=p&m+-1;I=(c[b+72>>2]|0)+(h<<2)|0;c[(c[b+92>>2]|0)+(o<<2)>>2]=c[I>>2];c[I>>2]=o}l=r;return}function Lc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;u=l;l=l+48|0;A=1.0/+g[b+112>>2];B=1.0/+g[b+116>>2];C=1.0/+g[b+120>>2];v=+g[b+52>>2];w=A*+g[e>>2]+v;p=+g[b+56>>2];o=B*+g[e+4>>2]+p;r=+g[b+60>>2];q=C*+g[e+8>>2]+r;v=A*+g[f>>2]+v;p=B*+g[f+4>>2]+p;r=C*+g[f+8>>2]+r;C=+g[b+20>>2];w=w>2];o=o>2];q=q>2];w=z>2];o=y>2];q=x>2]|0)+-1|0;f=(c[b+72>>2]|0)+-1|0;switch(c[b+108>>2]|0){case 0:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(j|0)<(k|0)?j:k;n=(n|0)>0?n:0;break}case 1:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}case 2:{f=(j|0)<(f|0)?j:f;e=(n|0)>0?n:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}default:{e=0;n=0}}if((e|0)>=(f|0)){l=u;return}s=(n|0)<(k|0);do if(s){j=(e&1|0)==0;m=e+1|0;r=+(e|0);h=n;while(1){do if(!(a[b+104>>0]|0)){if(a[b+105>>0]|0?(h+e&1|0)==0:0){t=16;break}if(!(j&(a[b+106>>0]|0)!=0)){o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=52;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=52;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=52;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==52){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=58;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==58){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=64;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=64;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=64;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==64){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=70;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=70;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=70;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==70){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=76;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==76){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}else t=16}else t=16;while(0);if((t|0)==16){t=0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=21;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=21;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=21;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==21){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=27;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==27){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=33;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==33){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=39;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==39){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=45;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=45;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=45;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==45){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}if((h|0)==(k|0)){e=m;break}}}else e=e+1|0;while((e|0)!=(f|0));l=u;return}function Mc(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;j=+j;k=k|0;var m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0,$=0;W=l;l=l+16|0;m=c[h+4>>2]|0;if((m|0)<0){if((c[h+8>>2]|0)<0){o=c[h+12>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[h+12>>2]=0}a[h+16>>0]=1;c[h+12>>2]=0;c[h+8>>2]=0}do{V=(c[h+12>>2]|0)+(m<<4)|0;c[V>>2]=c[W>>2];c[V+4>>2]=c[W+4>>2];c[V+8>>2]=c[W+8>>2];c[V+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[h+4>>2]=0;r=c[f+4>>2]|0;if((c[h+8>>2]|0)<(r|0)){if(r){c[6995]=(c[6995]|0)+1;m=sc((r<<4|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}p=c[h+4>>2]|0;if((p|0)>0){o=0;do{V=m+(o<<4)|0;U=(c[h+12>>2]|0)+(o<<4)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];o=o+1|0}while((o|0)!=(p|0));p=h+12|0}else p=h+12|0}else{m=0;p=h+12|0}o=c[p>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[p>>2]=0}a[h+16>>0]=1;c[p>>2]=m;c[h+8>>2]=r}p=c[d+28>>2]|0;if((p|0)<=0){l=W;return}V=c[d+36>>2]|0;E=+g[e>>2];F=+g[e+4>>2];G=+g[e+8>>2];H=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];w=+g[b>>2];x=+g[b+4>>2];y=+g[b+8>>2];U=-1;u=3402823466385288598117041.0e14;m=0;while(1){z=+g[V+(m*36|0)+20>>2];A=+g[V+(m*36|0)+24>>2];B=+g[V+(m*36|0)+28>>2];o=(z*E+A*F+B*G)*w+(z*H+A*v+B*t)*x+(z*s+A*q+B*n)*y>2]|0;if((N|0)>0){O=V+(U*36|0)+12|0;P=V+(U*36|0)+20|0;Q=V+(U*36|0)+24|0;R=V+(U*36|0)+28|0;M=0;x=E;y=F;u=G;w=H;while(1){J=c[O>>2]|0;m=c[J+(M<<2)>>2]|0;I=c[d+16>>2]|0;M=M+1|0;L=(M|0)==(N|0);J=c[J+((L?0:M)<<2)>>2]|0;X=+g[I+(m<<4)>>2];Y=X-+g[I+(J<<4)>>2];z=+g[I+(m<<4)+4>>2];Z=z-+g[I+(J<<4)+4>>2];A=+g[I+(m<<4)+8>>2];F=A-+g[I+(J<<4)+8>>2];B=Y*x+Z*y+F*u;E=Y*w+Z*v+F*t;F=Y*s+Z*q+F*n;Z=+g[P>>2];Y=+g[Q>>2];K=+g[R>>2];G=x*Z+y*Y+u*K;H=w*Z+v*Y+t*K;K=s*Z+q*Y+n*K;A=(X*x+z*y+A*u+ +g[e+48>>2])*-(E*K-F*H)+(X*w+z*v+A*t+ +g[e+52>>2])*-(F*G-B*K)+(X*s+z*q+A*n+ +g[e+56>>2])*-(B*H-E*G);J=f;I=h;m=c[J+4>>2]|0;if((m|0)>=2){p=c[J+12>>2]|0;s=+g[p+(m+-1<<4)>>2];u=+g[p+(m+-1<<4)+4>>2];v=+g[p+(m+-1<<4)+8>>2];o=0;q=s*-(E*K-F*H)+u*-(F*G-B*K)+v*-(B*H-E*G)-A;while(1){x=+g[p+(o<<4)>>2];y=+g[p+(o<<4)+4>>2];z=+g[p+(o<<4)+8>>2];n=+g[p+(o<<4)+12>>2];w=x*-(E*K-F*H)+y*-(F*G-B*K)+z*-(B*H-E*G)-A;do if(q<0.0)if(w<0.0){r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){t=x;s=y;q=z;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){t=x;s=y;q=z;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{_=p+(C<<4)|0;$=(c[I+12>>2]|0)+(C<<4)|0;c[_>>2]=c[$>>2];c[_+4>>2]=c[$+4>>2];c[_+8>>2]=c[$+8>>2];c[_+12>>2]=c[$+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87;break}else{q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){n=0.0;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){n=0.0;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;n=0.0;C=87;break}else if(w<0.0){q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)==(c[I+8>>2]|0)?(S=r|0?r<<1:1,(r|0)<(S|0)):0){if(!S)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((S<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=S;p=c[I+4>>2]|0}else p=r;r=c[I+12>>2]|0;g[r+(p<<4)>>2]=t;g[r+(p<<4)+4>>2]=s;g[r+(p<<4)+8>>2]=q;g[r+(p<<4)+12>>2]=0.0;r=(c[I+4>>2]|0)+1|0;c[I+4>>2]=r;if((r|0)==(c[I+8>>2]|0)?(T=r|0?r<<1:1,(r|0)<(T|0)):0){if(!T)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((T<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=T;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87}else{t=x;s=y;q=z;C=87}}while(0);if((C|0)==87){C=0;$=c[I+12>>2]|0;g[$+(r<<4)>>2]=t;g[$+(r<<4)+4>>2]=s;g[$+(r<<4)+8>>2]=q;g[$+(r<<4)+12>>2]=n;c[I+4>>2]=(c[I+4>>2]|0)+1}o=o+1|0;if((o|0)==(m|0))break;q=w;s=x;v=z;u=y;p=c[J+12>>2]|0}m=c[J+4>>2]|0}if((m|0)<0){if((c[J+8>>2]|0)<0){o=c[J+12>>2]|0;if(o|0){if(a[J+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[J+12>>2]=0}a[J+16>>0]=1;c[J+12>>2]=0;c[J+8>>2]=0}do{$=(c[J+12>>2]|0)+(m<<4)|0;c[$>>2]=c[W>>2];c[$+4>>2]=c[W+4>>2];c[$+8>>2]=c[W+8>>2];c[$+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[J+4>>2]=0;x=+g[e>>2];y=+g[e+4>>2];u=+g[e+8>>2];w=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];if(L){p=P;o=Q;m=R;C=e+48|0;D=e+52|0;r=e+56|0;break}else{$=f;f=h;h=$}}}else{p=V+(U*36|0)+20|0;o=V+(U*36|0)+24|0;m=V+(U*36|0)+28|0;C=e+48|0;D=e+52|0;r=e+56|0;h=f;x=E;y=F;u=G;w=H}X=+g[p>>2];Y=+g[o>>2];Z=+g[m>>2];u=X*x+Y*y+Z*u;t=X*w+Y*v+Z*t;s=X*s+Y*q+Z*n;q=+g[V+(U*36|0)+32>>2]-(u*+g[C>>2]+t*+g[D>>2]+s*+g[r>>2]);m=c[h+4>>2]|0;if((m|0)<=0){l=W;return}p=0;do{o=c[h+12>>2]|0;n=q+(u*+g[o+(p<<4)>>2]+t*+g[o+(p<<4)+4>>2]+s*+g[o+(p<<4)+8>>2]);n=n<=i?i:n;if(n<=j){m=o+(p<<4)|0;c[W>>2]=c[m>>2];c[W+4>>2]=c[m+4>>2];c[W+8>>2]=c[m+8>>2];c[W+12>>2]=c[m+12>>2];Tb[c[(c[k>>2]|0)+16>>2]&15](k,b,W,n);m=c[h+4>>2]|0}p=p+1|0}while((p|0)<(m|0));l=W;return}function Nc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;j=c[b+228>>2]|0;i=c[b+196>>2]|0;if((i|0)<(j|0)){if((c[b+200>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+196>>2]|0}if((h|0)>0){f=0;do{c[e+(f<<2)>>2]=c[(c[b+204>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+204>>2]|0;if(f|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=e;c[b+200>>2]=j;f=b+204|0}else f=b+204|0;e=i;do{c[(c[f>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=(j|0))}else f=b+204|0;c[b+196>>2]=j;e=0;while(1){if((e|0)>=(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))break;c[(c[f>>2]|0)+(e<<2)>>2]=c[(c[b+236>>2]|0)+(e<<2)>>2];e=e+1|0}e=c[b+196>>2]|0;if((e|0)>1)Ni(b+192|0,0,e+-1|0);if(!(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))e=0;else e=c[f>>2]|0;h=c[b+212>>2]|0;t=c[b+196>>2]|0;u=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;c[h+4>>2]=d;c[h+12>>2]=e;c[h+16>>2]=t;c[h+20>>2]=u;e=c[h+32>>2]|0;if((e|0)<0){if((c[h+36>>2]|0)<0){f=c[h+40>>2]|0;if(f|0){if(a[h+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+40>>2]=0}a[h+44>>0]=1;c[h+40>>2]=0;c[h+36>>2]=0}do{c[(c[h+40>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+32>>2]=0;e=c[h+52>>2]|0;if((e|0)<0){if((c[h+56>>2]|0)<0){f=c[h+60>>2]|0;if(f|0){if(a[h+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+60>>2]=0}a[h+64>>0]=1;c[h+60>>2]=0;c[h+56>>2]=0}do{c[(c[h+60>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+52>>2]=0;e=c[h+72>>2]|0;if((e|0)<0){if((c[h+76>>2]|0)<0){f=c[h+80>>2]|0;if(f|0){if(a[h+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+80>>2]=0}a[h+84>>0]=1;c[h+80>>2]=0;c[h+76>>2]=0}do{c[(c[h+80>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+72>>2]=0;u=c[b+216>>2]|0;e=c[(c[u>>2]|0)+8>>2]|0;s=c[b+8>>2]|0;t=c[b+24>>2]|0;t=xb[c[(c[t>>2]|0)+36>>2]&127](t)|0;Sb[e&127](u,s,t);t=c[b+220>>2]|0;s=c[b+24>>2]|0;u=c[b+212>>2]|0;e=c[t+28>>2]|0;if((e|0)<0){if((c[t+32>>2]|0)<0){f=c[t+36>>2]|0;if(f|0){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=0;c[t+32>>2]=0}do{c[(c[t+36>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+28>>2]=0;j=c[t+8>>2]|0;if((j|0)>0){k=c[t+16>>2]|0;i=0;do{m=k+(i<<3)|0;e=c[m>>2]|0;if((e|0)==(i|0))e=i;else{f=e;h=m;do{e=k+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=k+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}c[m>>2]=e;i=i+1|0}while((i|0)!=(j|0));if((j|0)>1){vj(t+4|0,0,j+-1|0);j=c[t+8>>2]|0}if((j|0)>0){o=c[t+16>>2]|0;e=0;while(1){p=c[o+(e<<3)>>2]|0;m=e;while(1){k=m+1|0;if((k|0)>=(j|0)){n=0;break}if((c[o+(k<<3)>>2]|0)==(p|0))m=k;else{n=1;break}}a:do if((e|0)<=(m|0)){q=c[b+16>>2]|0;f=1;i=e;while(1){h=c[q+(c[o+(i<<3)+4>>2]<<2)>>2]|0;if((c[h+208>>2]|0)==(p|0)){h=c[h+220>>2]|0;f=(h|0)!=4&(f&(h|0)!=1)}if((i|0)<(m|0))i=i+1|0;else break}if(f)while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]&-2|0)!=4:0)c[f+220>>2]=2;if((e|0)>=(m|0))break a;e=e+1|0}else while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]|0)==2:0){c[f+220>>2]=3;g[f+224>>2]=0.0}if((e|0)>=(m|0))break a;e=e+1|0}}while(0);if(n)e=k;else break}}}j=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;if((j|0)>0){i=0;do{k=zb[c[(c[s>>2]|0)+40>>2]&31](s,i)|0;f=c[k+772>>2]|0;h=c[k+776>>2]|0;if((f|0)!=0?(c[f+220>>2]|0)!=2:0)e=94;else e=92;if(((e|0)==92?(e=0,h|0):0)?(c[h+220>>2]|0)!=2:0)e=94;if((e|0)==94){e=c[f+204>>2]|0;if((e&2|0?((e&4|0)==0?(c[f+220>>2]|0)!=2:0):0)?(c[h+204>>2]&3|0)==0:0){if((c[h+220>>2]&-2|0)!=4)c[h+220>>2]=1;g[h+224>>2]=0.0}q=c[h+204>>2]|0;if(q&2|0?((q&4|e&3|0)==0?(c[h+220>>2]|0)!=2:0):0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}if(a[t+64>>0]|0?Bb[c[(c[s>>2]|0)+28>>2]&63](s,f,h)|0:0){f=c[t+28>>2]|0;if((f|0)==(c[t+32>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((r<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[t+28>>2]|0}if((f|0)>0){h=0;do{c[e+(h<<2)>>2]=c[(c[t+36>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[t+36>>2]|0;if(h){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[t+28>>2]|0}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=e;c[t+32>>2]=r;e=f}else e=f;c[(c[t+36>>2]|0)+(e<<2)>>2]=k;c[t+28>>2]=e+1}}i=i+1|0}while((i|0)<(j|0));e=t+64|0}else e=t+64|0;r=c[t+8>>2]|0;if(!(a[e>>0]|0)){w=xb[c[(c[s>>2]|0)+44>>2]&127](s)|0;v=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;$b[c[(c[u>>2]|0)+8>>2]&7](u,c[b+16>>2]|0,c[b+8>>2]|0,w,v,-1);v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}q=c[t+28>>2]|0;if((q|0)>1)Ji(t+24|0,0,q+-1|0);if((r|0)<=0){v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}e=0;n=1;p=0;while(1){f=c[t+16>>2]|0;o=c[f+(e<<3)>>2]|0;b:do if((e|0)<(r|0)){i=1;j=c[t+48>>2]|0;h=c[t+52>>2]|0;while(1){m=c[(c[b+16>>2]|0)+(c[f+(e<<3)+4>>2]<<2)>>2]|0;if((j|0)==(h|0)){k=h|0?h<<1:1;if((h|0)<(k|0)){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[t+48>>2]|0}if((h|0)>0){j=0;do{c[f+(j<<2)>>2]=c[(c[t+56>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[t+56>>2]|0;if(j){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[t+48>>2]|0}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=f;c[t+52>>2]=k;f=h;h=k}else f=h}else f=j;c[(c[t+56>>2]|0)+(f<<2)>>2]=m;j=f+1|0;c[t+48>>2]=j;s=c[m+220>>2]|0;i=i&((s|0)==2|(s|0)==5);e=e+1|0;if((e|0)>=(r|0)){k=e;f=i;break b}f=c[t+16>>2]|0;if((c[f+(e<<3)>>2]|0)!=(o|0)){k=e;f=i;break}}}else{k=e;f=1}while(0);if((p|0)<(q|0)?(v=c[t+36>>2]|0,w=v+(p<<2)|0,s=c[w>>2]|0,m=c[s+772>>2]|0,(c[((c[m+208>>2]|0)>-1?m:c[s+776>>2]|0)+208>>2]|0)==(o|0)):0){e=p;do{e=e+1|0;if((e|0)>=(q|0))break;s=c[v+(e<<2)>>2]|0;n=c[s+772>>2]|0}while((o|0)==(c[((c[n+208>>2]|0)>-1?n:c[s+776>>2]|0)+208>>2]|0));h=w;i=e-p|0;j=e}else{h=0;i=0;j=n}if(!f)$b[c[(c[u>>2]|0)+8>>2]&7](u,c[t+56>>2]|0,c[t+48>>2]|0,h,i,o);p=(i|0)==0?p:j;e=c[t+48>>2]|0;if((e|0)<0){if((c[t+52>>2]|0)<0){f=c[t+56>>2]|0;if(f|0){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=0;c[t+52>>2]=0}do{c[(c[t+56>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+48>>2]=0;if((k|0)>=(r|0))break;else{e=k;n=j}}v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}function Oc(b){b=b|0;var d=0.0,e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0;u=l;l=l+176|0;if(!(a[b+738>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+744>>2]=0.0;if(!(a[b+736>>0]|0)){f=c[b+28>>2]|0;j=+g[b+600>>2];k=+g[b+604>>2];q=+g[b+608>>2];s=j*+g[f+20>>2]+k*+g[f+24>>2]+q*+g[f+28>>2]+ +g[f+56>>2];i=c[b+32>>2]|0;m=+g[b+664>>2];n=+g[b+668>>2];r=+g[b+672>>2];t=m*+g[i+20>>2]+n*+g[i+24>>2]+r*+g[i+28>>2]+ +g[i+56>>2];o=m*+g[i+36>>2]+n*+g[i+40>>2]+r*+g[i+44>>2]+ +g[i+60>>2];p=j*+g[f+4>>2]+k*+g[f+8>>2]+q*+g[f+12>>2]+ +g[f+52>>2];q=j*+g[f+36>>2]+k*+g[f+40>>2]+q*+g[f+44>>2]+ +g[f+60>>2];r=m*+g[i+4>>2]+n*+g[i+8>>2]+r*+g[i+12>>2]+ +g[i+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){e=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*e;g[u+128+4>>2]=(t-s)*e;g[u+128+8>>2]=(o-q)*e;c[u+128+12>>2]=0;m=(o-q)*e;d=(t-s)*e;e=(r-p)*e}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;d=0.0;e=1.0}if(+C(+m)>.7071067690849304){w=m*m+d*d;v=1.0/+D(+w);j=-(v*m);m=v*d;n=-(m*e);h=e*j;k=0.0;d=w*v;e=m}else{j=e*e+d*d;h=1.0/+D(+j);k=-(d*h);d=h*e;n=m*k;h=j*h;j=d;d=-(d*m);e=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=e;g[u+128+32>>2]=d;g[u+128+36>>2]=n;g[u+128+40>>2]=h;f=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[i+4>>2];c[u+32+4>>2]=c[i+20>>2];c[u+32+8>>2]=c[i+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[i+8>>2];c[u+32+20>>2]=c[i+24>>2];c[u+32+24>>2]=c[i+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[i+12>>2];c[u+32+36>>2]=c[i+28>>2];c[u+32+40>>2]=c[i+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[i+56>>2];w=o-+g[i+60>>2];g[u>>2]=r-+g[i+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;i=c[b+32>>2]|0;Rg(b+48+(f*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(f<<4)|0,x+456|0,+g[x+404>>2],i+456|0,+g[i+404>>2]);f=f+1|0;if((f|0)==3)break;i=c[b+32>>2]|0}}n=+g[b+560>>2];o=+g[b+576>>2];p=+g[b+592>>2];if(+C(+p)>.7071067690849304){m=1.0/+D(+(p*p+o*o));d=n*-(p*m);e=(p*p+o*o)*m;h=0.0;j=o*m;k=-(n*o*m);m=-(p*m)}else{m=1.0/+D(+(n*n+o*o));d=(n*n+o*o)*m;e=-(p*n*m);h=-(o*m);j=0.0;k=p*-(o*m);m=n*m}i=c[b+28>>2]|0;K=+g[i+4>>2];J=+g[i+8>>2];s=+g[i+12>>2];R=h*K+m*J+j*s;I=+g[i+20>>2];H=+g[i+24>>2];v=+g[i+28>>2];T=h*I+m*H+j*v;G=+g[i+36>>2];q=+g[i+40>>2];E=+g[i+44>>2];W=h*G+m*q+j*E;B=e*K+k*J+d*s;M=e*I+k*H+d*v;N=e*G+k*q+d*E;f=c[b+32>>2]|0;A=+g[f+4>>2];z=+g[f+20>>2];y=+g[f+36>>2];k=+g[f+8>>2];m=+g[f+24>>2];t=+g[f+40>>2];P=+g[f+12>>2];S=+g[f+28>>2];V=+g[f+44>>2];c[b+300>>2]=0;c[b+300+4>>2]=0;c[b+300+8>>2]=0;c[b+300+12>>2]=0;g[b+316>>2]=R*K+T*I+W*G;g[b+320>>2]=R*J+T*H+W*q;g[b+324>>2]=R*s+T*v+W*E;g[b+328>>2]=0.0;g[b+332>>2]=A*-R+z*-T+y*-W;g[b+336>>2]=k*-R+m*-T+t*-W;g[b+340>>2]=P*-R+S*-T+V*-W;g[b+344>>2]=0.0;F=(R*K+T*I+W*G)*+g[i+456>>2];L=(R*J+T*H+W*q)*+g[i+460>>2];d=(R*s+T*v+W*E)*+g[i+464>>2];g[b+348>>2]=F;g[b+352>>2]=L;g[b+356>>2]=d;g[b+360>>2]=0.0;j=(A*-R+z*-T+y*-W)*+g[f+456>>2];w=(k*-R+m*-T+t*-W)*+g[f+460>>2];X=(P*-R+S*-T+V*-W)*+g[f+464>>2];g[b+364>>2]=j;g[b+368>>2]=w;g[b+372>>2]=X;g[b+376>>2]=0.0;g[b+380>>2]=(R*K+T*I+W*G)*F+(R*J+T*H+W*q)*L+(R*s+T*v+W*E)*d+((A*-R+z*-T+y*-W)*j+(k*-R+m*-T+t*-W)*w+(P*-R+S*-T+V*-W)*X);f=c[b+28>>2]|0;X=+g[f+4>>2];W=+g[f+20>>2];V=+g[f+36>>2];T=+g[f+8>>2];S=+g[f+24>>2];R=+g[f+40>>2];P=+g[f+12>>2];w=+g[f+28>>2];t=+g[f+44>>2];i=c[b+32>>2]|0;m=+g[i+4>>2];k=+g[i+20>>2];j=+g[i+36>>2];y=+g[i+8>>2];z=+g[i+24>>2];A=+g[i+40>>2];d=+g[i+12>>2];L=+g[i+28>>2];F=+g[i+44>>2];c[b+384>>2]=0;c[b+384+4>>2]=0;c[b+384+8>>2]=0;c[b+384+12>>2]=0;g[b+400>>2]=B*X+M*W+N*V;g[b+404>>2]=B*T+M*S+N*R;g[b+408>>2]=B*P+M*w+N*t;g[b+412>>2]=0.0;g[b+416>>2]=m*-B+k*-M+j*-N;g[b+420>>2]=y*-B+z*-M+A*-N;g[b+424>>2]=d*-B+L*-M+F*-N;g[b+428>>2]=0.0;U=(B*X+M*W+N*V)*+g[f+456>>2];Q=(B*T+M*S+N*R)*+g[f+460>>2];r=(B*P+M*w+N*t)*+g[f+464>>2];g[b+432>>2]=U;g[b+436>>2]=Q;g[b+440>>2]=r;g[b+444>>2]=0.0;e=(m*-B+k*-M+j*-N)*+g[i+456>>2];h=(y*-B+z*-M+A*-N)*+g[i+460>>2];O=(d*-B+L*-M+F*-N)*+g[i+464>>2];g[b+448>>2]=e;g[b+452>>2]=h;g[b+456>>2]=O;g[b+460>>2]=0.0;g[b+464>>2]=(B*X+M*W+N*V)*U+(B*T+M*S+N*R)*Q+(B*P+M*w+N*t)*r+((m*-B+k*-M+j*-N)*e+(y*-B+z*-M+A*-N)*h+(d*-B+L*-M+F*-N)*O);i=c[b+28>>2]|0;O=+g[i+4>>2];N=+g[i+20>>2];F=+g[i+36>>2];M=+g[i+8>>2];L=+g[i+24>>2];B=+g[i+40>>2];d=+g[i+12>>2];h=+g[i+28>>2];A=+g[i+44>>2];f=c[b+32>>2]|0;z=+g[f+4>>2];y=+g[f+20>>2];e=+g[f+36>>2];j=+g[f+8>>2];k=+g[f+24>>2];m=+g[f+40>>2];r=+g[f+12>>2];t=+g[f+28>>2];w=+g[f+44>>2];c[b+468>>2]=0;c[b+468+4>>2]=0;c[b+468+8>>2]=0;c[b+468+12>>2]=0;F=(K*n+J*o+s*p)*O+(I*n+H*o+v*p)*N+(G*n+q*o+E*p)*F;B=(K*n+J*o+s*p)*M+(I*n+H*o+v*p)*L+(G*n+q*o+E*p)*B;A=(K*n+J*o+s*p)*d+(I*n+H*o+v*p)*h+(G*n+q*o+E*p)*A;g[b+484>>2]=F;g[b+488>>2]=B;g[b+492>>2]=A;g[b+496>>2]=0.0;s=-(K*n+J*o+s*p);v=-(I*n+H*o+v*p);h=-(G*n+q*o+E*p);g[b+500>>2]=z*s+y*v+e*h;g[b+504>>2]=j*s+k*v+m*h;g[b+508>>2]=r*s+t*v+w*h;g[b+512>>2]=0.0;E=F*+g[i+456>>2];n=B*+g[i+460>>2];o=A*+g[i+464>>2];g[b+516>>2]=E;g[b+520>>2]=n;g[b+524>>2]=o;g[b+528>>2]=0.0;p=(z*s+y*v+e*h)*+g[f+456>>2];q=(j*s+k*v+m*h)*+g[f+460>>2];d=(r*s+t*v+w*h)*+g[f+464>>2];g[b+532>>2]=p;g[b+536>>2]=q;g[b+540>>2]=d;g[b+544>>2]=0.0;g[b+548>>2]=F*E+B*n+A*o+((z*s+y*v+e*h)*p+(j*s+k*v+m*h)*q+(r*s+t*v+w*h)*d);g[b+724>>2]=0.0;f=c[b+28>>2]|0;i=c[b+32>>2]|0;d=+bj(b,f+4|0,i+4|0);g[b+728>>2]=d;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(h>=0.0){d=+mh(d-+g[b+688>>2],6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;if(d<-h){a[b+716>>0]=1;e=1.0;d=-(d+h)}else{if(!(d>h))break;a[b+716>>0]=1;e=-1.0;d=h-d}g[b+708>>2]=d;g[b+712>>2]=e}while(0);T=+g[b+560>>2];U=+g[b+576>>2];X=+g[b+592>>2];V=T*+g[f+4>>2]+U*+g[f+8>>2]+X*+g[f+12>>2];W=T*+g[f+20>>2]+U*+g[f+24>>2]+X*+g[f+28>>2];X=T*+g[f+36>>2]+U*+g[f+40>>2]+X*+g[f+44>>2];g[b+720>>2]=1.0/(V*(V*+g[f+324>>2]+W*+g[f+340>>2]+X*+g[f+356>>2])+W*(V*+g[f+328>>2]+W*+g[f+344>>2]+X*+g[f+360>>2])+X*(V*+g[f+332>>2]+W*+g[f+348>>2]+X*+g[f+364>>2])+(V*(V*+g[i+324>>2]+W*+g[i+340>>2]+X*+g[i+356>>2])+W*(V*+g[i+328>>2]+W*+g[i+344>>2]+X*+g[i+360>>2])+X*(V*+g[i+332>>2]+W*+g[i+348>>2]+X*+g[i+364>>2])));l=u;return}function Pc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0;M=l;l=l+64|0;if(!(c[b+12>>2]|0)){l=M;return}f=(a[b+16>>0]|0)!=0;P=f?e:d;f=f?d:e;i=c[P+4>>2]|0;j=c[f+4>>2]|0;P=c[P+12>>2]|0;aa=+g[P>>2];$=+g[P+16>>2];_=+g[P+32>>2];Z=+g[P+4>>2];Y=+g[P+20>>2];o=+g[P+36>>2];k=+g[P+8>>2];r=+g[P+24>>2];y=+g[P+40>>2];T=+g[P+48>>2];S=+g[P+52>>2];R=+g[P+56>>2];O=c[f+12>>2]|0;X=+g[O>>2];W=+g[O+16>>2];p=+g[O+32>>2];V=+g[O+4>>2];U=+g[O+20>>2];q=+g[O+36>>2];x=+g[O+8>>2];v=+g[O+24>>2];t=+g[O+40>>2];Q=-+g[O+48>>2];I=-+g[O+52>>2];J=-+g[O+56>>2];K=+g[P>>2];L=+g[P+16>>2];H=+g[P+32>>2];B=+g[P+4>>2];A=+g[P+20>>2];z=+g[P+36>>2];w=+g[P+8>>2];u=+g[P+24>>2];s=+g[P+40>>2];P=c[(c[i>>2]|0)+64>>2]|0;n=-+g[j+52>>2];m=-+g[j+56>>2];E=-+g[j+60>>2];g[M+48>>2]=(aa*X+$*W+_*p)*n+(aa*V+$*U+_*q)*m+(aa*x+$*v+_*t)*E;g[M+48+4>>2]=(Z*X+Y*W+o*p)*n+(Z*V+Y*U+o*q)*m+(Z*x+Y*v+o*t)*E;g[M+48+8>>2]=(k*X+r*W+y*p)*n+(k*V+r*U+y*q)*m+(k*x+r*v+y*t)*E;g[M+48+12>>2]=0.0;Sb[P&127](M,i,M+48|0);E=+g[M>>2];y=+g[M+4>>2];r=+g[M+8>>2];k=+g[j+52>>2];m=+g[j+56>>2];n=+g[j+60>>2];o=n*(T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r))+(k*(T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r))+m*(T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)))-+g[j+68>>2];p=T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r)-k*o;q=T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)-m*o;r=T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r)-n*o;P=c[f+12>>2]|0;s=+g[P>>2];t=+g[P+4>>2];u=+g[P+8>>2];v=+g[P+16>>2];w=+g[P+20>>2];x=+g[P+24>>2];y=+g[P+32>>2];z=+g[P+36>>2];A=+g[P+40>>2];B=+g[P+48>>2];E=+g[P+52>>2];H=+g[P+56>>2];P=c[b+12>>2]|0;O=o<+g[P+784>>2];c[h+4>>2]=P;if(O){P=c[f+12>>2]|0;$=k*+g[P+16>>2]+m*+g[P+20>>2]+n*+g[P+24>>2];aa=k*+g[P+32>>2]+m*+g[P+36>>2]+n*+g[P+40>>2];g[M+48>>2]=+g[P>>2]*k+ +g[P+4>>2]*m+ +g[P+8>>2]*n;g[M+48+4>>2]=$;g[M+48+8>>2]=aa;g[M+48+12>>2]=0.0;g[M+32>>2]=u*r+(s*p+t*q)+B;g[M+32+4>>2]=p*v+q*w+r*x+E;g[M+32+8>>2]=p*y+q*z+r*A+H;g[M+32+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+48|0,M+32|0,o)}if((c[i+4>>2]|0)<7?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+24>>2]|0):0){k=+g[j+60>>2];if(+C(+k)>.7071067690849304){n=+g[j+56>>2];aa=1.0/+D(+(k*k+n*n));m=0.0;n=n*aa;k=-(k*aa)}else{aa=+g[j+52>>2];m=+g[j+56>>2];k=1.0/+D(+(aa*aa+m*m));m=-(m*k);n=0.0;k=aa*k}J=.019999999552965164/+nb[c[(c[i>>2]|0)+16>>2]&15](i);J=(J>.39269909262657166?.39269909262657166:J)*.5;I=+G(+J)/+D(+(m*m+k*k+n*n));L=m*I;K=k*I;I=n*I;J=+F(+J);f=c[b+20>>2]|0;if((f|0)>0){i=0;do{v=+g[j+52>>2];aa=+g[j+56>>2];B=+g[j+60>>2];z=+(i|0)*(6.2831854820251465/+(f|0))*.5;$=+G(+z)/+D(+(v*v+aa*aa+B*B));z=+F(+z);A=I*-(aa*$)+(L*z+J*-(v*$))-K*-(B*$);x=L*-(B*$)+(K*z+J*-(aa*$))-I*-(v*$);da=K*-(v*$)+(I*z+J*-(B*$))-L*-(aa*$);H=J*z-L*-(v*$)-K*-(aa*$)-I*-(B*$);ia=B*$*x+(v*$*H+z*A)-aa*$*da;ha=v*$*da+(z*x+aa*$*H)-B*$*A;la=aa*$*A+(B*$*H+z*da)-v*$*x;da=z*H-v*$*A-aa*$*x-B*$*da;f=(a[b+16>>0]|0)!=0;ba=f?e:d;f=f?d:e;P=c[ba+4>>2]|0;O=c[f+4>>2]|0;ba=c[ba+12>>2]|0;$=+g[ba>>2];B=+g[ba+4>>2];x=+g[ba+8>>2];aa=+g[ba+16>>2];A=+g[ba+20>>2];v=+g[ba+24>>2];H=+g[ba+32>>2];z=+g[ba+36>>2];t=+g[ba+40>>2];V=+g[ba+48>>2];W=+g[ba+52>>2];X=+g[ba+56>>2];ba=c[f+12>>2]|0;R=+g[ba>>2];S=+g[ba+16>>2];p=+g[ba+32>>2];T=+g[ba+4>>2];U=+g[ba+20>>2];q=+g[ba+36>>2];w=+g[ba+8>>2];u=+g[ba+24>>2];s=+g[ba+40>>2];Y=-+g[ba+48>>2];Z=-+g[ba+52>>2];_=-+g[ba+56>>2];ga=ia*(2.0/(ia*ia+ha*ha+la*la+da*da));n=ha*(2.0/(ia*ia+ha*ha+la*la+da*da));ca=la*(2.0/(ia*ia+ha*ha+la*la+da*da));na=x*(ia*ca-da*n)+(B*(ia*n+da*ca)+$*(1.0-(ha*n+la*ca)));ka=x*(ha*ca+da*ga)+($*(ia*n-da*ca)+B*(1.0-(ia*ga+la*ca)));k=$*(ia*ca+da*n)+B*(ha*ca-da*ga)+x*(1.0-(ia*ga+ha*n));ma=v*(ia*ca-da*n)+(A*(ia*n+da*ca)+aa*(1.0-(ha*n+la*ca)));ja=v*(ha*ca+da*ga)+(aa*(ia*n-da*ca)+A*(1.0-(ia*ga+la*ca)));y=aa*(ia*ca+da*n)+A*(ha*ca-da*ga)+v*(1.0-(ia*ga+ha*n));oa=t*(ia*ca-da*n)+(z*(ia*n+da*ca)+H*(1.0-(ha*n+la*ca)));la=t*(ha*ca+da*ga)+(H*(ia*n-da*ca)+z*(1.0-(ia*ga+la*ca)));n=H*(ia*ca+da*n)+z*(ha*ca-da*ga)+t*(1.0-(ia*ga+ha*n));ha=+g[ba>>2];ga=+g[ba+16>>2];ia=+g[ba+32>>2];da=+g[ba+4>>2];ca=+g[ba+20>>2];ea=+g[ba+36>>2];m=+g[ba+8>>2];r=+g[ba+24>>2];o=+g[ba+40>>2];ba=c[(c[P>>2]|0)+64>>2]|0;fa=-+g[O+52>>2];Q=-+g[O+56>>2];E=-+g[O+60>>2];g[M+32>>2]=(ia*oa+(ha*na+ga*ma))*fa+(ea*oa+(da*na+ca*ma))*Q+(o*oa+(m*na+r*ma))*E;g[M+32+4>>2]=(ia*la+(ha*ka+ga*ja))*fa+(ea*la+(da*ka+ca*ja))*Q+(o*la+(m*ka+r*ja))*E;g[M+32+8>>2]=(ia*n+(ha*k+ga*y))*fa+(ea*n+(da*k+ca*y))*Q+(o*n+(m*k+r*y))*E;g[M+32+12>>2]=0.0;Sb[ba&127](M+48|0,P,M+32|0);E=+g[M+48>>2];y=+g[M+48+4>>2];r=+g[M+48+8>>2];k=+g[O+52>>2];m=+g[O+56>>2];n=+g[O+60>>2];o=n*(V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r))+(k*(V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r))+m*(V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)))-+g[O+68>>2];p=V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r)-k*o;q=V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)-m*o;r=V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r)-n*o;O=c[f+12>>2]|0;s=+g[O>>2];t=+g[O+4>>2];u=+g[O+8>>2];v=+g[O+16>>2];w=+g[O+20>>2];x=+g[O+24>>2];y=+g[O+32>>2];z=+g[O+36>>2];A=+g[O+40>>2];B=+g[O+48>>2];E=+g[O+52>>2];H=+g[O+56>>2];O=c[b+12>>2]|0;P=o<+g[O+784>>2];c[h+4>>2]=O;if(P){ba=c[f+12>>2]|0;na=k*+g[ba+16>>2]+m*+g[ba+20>>2]+n*+g[ba+24>>2];oa=k*+g[ba+32>>2]+m*+g[ba+36>>2]+n*+g[ba+40>>2];g[M+32>>2]=+g[ba>>2]*k+ +g[ba+4>>2]*m+ +g[ba+8>>2]*n;g[M+32+4>>2]=na;g[M+32+8>>2]=oa;g[M+32+12>>2]=0.0;g[M+16>>2]=u*r+(s*p+t*q)+B;g[M+16+4>>2]=p*v+q*w+r*x+E;g[M+16+8>>2]=p*y+q*z+r*A+H;g[M+16+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+32|0,M+16|0,o)}i=i+1|0;f=c[b+20>>2]|0}while((i|0)<(f|0))}}do if((a[b+8>>0]|0?c[(c[b+12>>2]|0)+780>>2]|0:0)?(N=c[h+4>>2]|0,c[N+780>>2]|0):0){i=c[N+772>>2]|0;j=c[(c[h+8>>2]|0)+8>>2]|0;f=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(j|0)){af(N,i+4|0,f+4|0);break}else{af(N,f+4|0,j+4|0);break}}while(0);l=M;return}function Qc(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;c[d+168>>2]=c[d+152>>2];c[e>>2]=9356;c[e+52>>2]=287;a[e+60>>0]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;c[e+144>>2]=0;a[e+164>>0]=1;c[e+160>>2]=0;c[e+152>>2]=0;c[e+156>>2]=0;c[e+168>>2]=0;c[e+4>>2]=-8388609;c[e+8>>2]=-8388609;c[e+12>>2]=-8388609;g[e+16>>2]=0.0;c[e+20>>2]=2139095039;c[e+24>>2]=2139095039;c[e+28>>2]=2139095039;g[e+32>>2]=0.0;f=c[d+56>>2]|0;if(h){c[e+56>>2]=KB(f|0)|0;a[e+4>>0]=a[d+4+3>>0]|0;a[e+5>>0]=a[d+4+2>>0]|0;a[e+6>>0]=a[d+4+1>>0]|0;a[e+7>>0]=a[d+4>>0]|0;a[e+8>>0]=a[d+8+3>>0]|0;a[e+9>>0]=a[d+8+2>>0]|0;a[e+10>>0]=a[d+8+1>>0]|0;a[e+11>>0]=a[d+8>>0]|0;a[e+12>>0]=a[d+12+3>>0]|0;a[e+13>>0]=a[d+12+2>>0]|0;a[e+14>>0]=a[d+12+1>>0]|0;a[e+15>>0]=a[d+12>>0]|0;a[e+16>>0]=a[d+16+3>>0]|0;a[e+17>>0]=a[d+16+2>>0]|0;a[e+18>>0]=a[d+16+1>>0]|0;a[e+19>>0]=a[d+16>>0]|0;a[e+20>>0]=a[d+20+3>>0]|0;a[e+21>>0]=a[d+20+2>>0]|0;a[e+22>>0]=a[d+20+1>>0]|0;a[e+23>>0]=a[d+20>>0]|0;a[e+24>>0]=a[d+24+3>>0]|0;a[e+25>>0]=a[d+24+2>>0]|0;a[e+26>>0]=a[d+24+1>>0]|0;a[e+27>>0]=a[d+24>>0]|0;a[e+28>>0]=a[d+28+3>>0]|0;a[e+29>>0]=a[d+28+2>>0]|0;a[e+30>>0]=a[d+28+1>>0]|0;a[e+31>>0]=a[d+28>>0]|0;a[e+32>>0]=a[d+32+3>>0]|0;a[e+33>>0]=a[d+32+2>>0]|0;a[e+34>>0]=a[d+32+1>>0]|0;a[e+35>>0]=a[d+32>>0]|0;a[e+36>>0]=a[d+36+3>>0]|0;a[e+37>>0]=a[d+36+2>>0]|0;a[e+38>>0]=a[d+36+1>>0]|0;a[e+39>>0]=a[d+36>>0]|0;a[e+40>>0]=a[d+40+3>>0]|0;a[e+41>>0]=a[d+40+2>>0]|0;a[e+42>>0]=a[d+40+1>>0]|0;a[e+43>>0]=a[d+40>>0]|0;a[e+44>>0]=a[d+44+3>>0]|0;a[e+45>>0]=a[d+44+2>>0]|0;a[e+46>>0]=a[d+44+1>>0]|0;a[e+47>>0]=a[d+44>>0]|0;a[e+48>>0]=a[d+48+3>>0]|0;a[e+49>>0]=a[d+48+2>>0]|0;a[e+50>>0]=a[d+48+1>>0]|0;a[e+51>>0]=a[d+48>>0]|0;c[e+144>>2]=KB(c[d+144>>2]|0)|0;f=KB(c[d+168>>2]|0)|0}else{c[e+56>>2]=f;c[e+4>>2]=c[d+4>>2];c[e+4+4>>2]=c[d+4+4>>2];c[e+4+8>>2]=c[d+4+8>>2];c[e+4+12>>2]=c[d+4+12>>2];c[e+20>>2]=c[d+20>>2];c[e+20+4>>2]=c[d+20+4>>2];c[e+20+8>>2]=c[d+20+8>>2];c[e+20+12>>2]=c[d+20+12>>2];c[e+36>>2]=c[d+36>>2];c[e+36+4>>2]=c[d+36+4>>2];c[e+36+8>>2]=c[d+36+8>>2];c[e+36+12>>2]=c[d+36+12>>2];c[e+144>>2]=c[d+144>>2];f=c[d+168>>2]|0}c[e+168>>2]=f;a[e+60>>0]=a[d+60>>0]|0;k=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){f=c[e+96>>2]|0;if(f|0){if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0}a[e+100>>0]=0;c[e+96>>2]=e+172;c[e+88>>2]=k;c[e+92>>2]=k;if(h)if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{l=j+(i<<6)|0;n=f+(i<<6)|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+4|0;l=f+(i<<6)+4|0;a[l>>0]=a[n+3>>0]|0;a[l+1>>0]=a[n+2>>0]|0;a[l+2>>0]=a[n+1>>0]|0;a[l+3>>0]=a[n>>0]|0;l=j+(i<<6)+8|0;n=f+(i<<6)+8|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+12|0;f=f+(i<<6)+12|0;a[f>>0]=a[n+3>>0]|0;a[f+1>>0]=a[n+2>>0]|0;a[f+2>>0]=a[n+1>>0]|0;a[f+3>>0]=a[n>>0]|0;f=c[d+96>>2]|0;n=f+(i<<6)+16|0;l=c[e+96>>2]|0;m=l+(i<<6)+16|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;m=f+(i<<6)+20|0;n=l+(i<<6)+20|0;a[n>>0]=a[m+3>>0]|0;a[n+1>>0]=a[m+2>>0]|0;a[n+2>>0]=a[m+1>>0]|0;a[n+3>>0]=a[m>>0]|0;n=f+(i<<6)+24|0;m=l+(i<<6)+24|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;f=f+(i<<6)+28|0;l=l+(i<<6)+28|0;a[l>>0]=a[f+3>>0]|0;a[l+1>>0]=a[f+2>>0]|0;a[l+2>>0]=a[f+1>>0]|0;a[l+3>>0]=a[f>>0]|0;j=c[d+96>>2]|0;l=KB(c[j+(i<<6)+32>>2]|0)|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=l;c[f+(i<<6)+36>>2]=KB(c[j+(i<<6)+36>>2]|0)|0;c[f+(i<<6)+40>>2]=KB(c[j+(i<<6)+40>>2]|0)|0;i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;else if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{m=j+(i<<6)|0;n=f+(i<<6)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=(c[d+96>>2]|0)+(i<<6)+16|0;f=(c[e+96>>2]|0)+(i<<6)+16|0;c[f>>2]=c[n>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];c[f+12>>2]=c[n+12>>2];j=c[d+96>>2]|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=c[j+(i<<6)+32>>2];c[f+(i<<6)+36>>2]=c[j+(i<<6)+36>>2];c[f+(i<<6)+40>>2]=c[j+(i<<6)+40>>2];i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;if(!f){f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}else{if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0;f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}}else{f=c[e+136>>2]|0;if(f|0){if(a[e+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+136>>2]=0}a[e+140>>0]=0;c[e+136>>2]=e+172;c[e+128>>2]=k;c[e+132>>2]=k;if(h){if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=JH(b[i+(f<<4)>>1]|0)|0;b[e+172+(f<<4)+2>>1]=JH(b[i+(f<<4)+2>>1]|0)|0;b[e+172+(f<<4)+4>>1]=JH(b[i+(f<<4)+4>>1]|0)|0;b[e+172+(f<<4)+6>>1]=JH(b[i+(f<<4)+6>>1]|0)|0;b[e+172+(f<<4)+8>>1]=JH(b[i+(f<<4)+8>>1]|0)|0;b[e+172+(f<<4)+10>>1]=JH(b[i+(f<<4)+10>>1]|0)|0;c[e+172+(f<<4)+12>>2]=KB(c[i+(f<<4)+12>>2]|0)|0;f=f+1|0}while((f|0)!=(k|0))}}else if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=b[i+(f<<4)>>1]|0;b[e+172+(f<<4)+2>>1]=b[i+(f<<4)+2>>1]|0;b[e+172+(f<<4)+4>>1]=b[i+(f<<4)+4>>1]|0;b[e+172+(f<<4)+6>>1]=b[i+(f<<4)+6>>1]|0;b[e+172+(f<<4)+8>>1]=b[i+(f<<4)+8>>1]|0;b[e+172+(f<<4)+10>>1]=b[i+(f<<4)+10>>1]|0;c[e+172+(f<<4)+12>>2]=c[i+(f<<4)+12>>2];f=f+1|0}while((f|0)!=(k|0))}c[e+136>>2]=0;f=k<<4;i=e+132|0;j=e+128|0;k=e+136|0;l=e+140|0}a[l>>0]=0;c[k>>2]=0;c[j>>2]=0;c[i>>2]=0;k=e+172+f|0;f=c[d+168>>2]|0;i=c[e+160>>2]|0;if(i|0){if(a[e+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[e+160>>2]=0}a[e+164>>0]=0;c[e+160>>2]=k;c[e+152>>2]=f;c[e+156>>2]=f;j=c[d+168>>2]|0;if(h){if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=JH(b[i+(f<<5)>>1]|0)|0;b[k+(f<<5)+2>>1]=JH(b[i+(f<<5)+2>>1]|0)|0;b[k+(f<<5)+4>>1]=JH(b[i+(f<<5)+4>>1]|0)|0;b[k+(f<<5)+6>>1]=JH(b[i+(f<<5)+6>>1]|0)|0;b[k+(f<<5)+8>>1]=JH(b[i+(f<<5)+8>>1]|0)|0;b[k+(f<<5)+10>>1]=JH(b[i+(f<<5)+10>>1]|0)|0;c[k+(f<<5)+12>>2]=KB(c[i+(f<<5)+12>>2]|0)|0;c[k+(f<<5)+16>>2]=KB(c[i+(f<<5)+16>>2]|0)|0;f=f+1|0}while((f|0)!=(j|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}else{if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=b[i+(f<<5)>>1]|0;b[k+(f<<5)+2>>1]=b[i+(f<<5)+2>>1]|0;b[k+(f<<5)+4>>1]=b[i+(f<<5)+4>>1]|0;b[k+(f<<5)+6>>1]=b[i+(f<<5)+6>>1]|0;b[k+(f<<5)+8>>1]=b[i+(f<<5)+8>>1]|0;b[k+(f<<5)+10>>1]=b[i+(f<<5)+10>>1]|0;c[k+(f<<5)+12>>2]=c[i+(f<<5)+12>>2];c[k+(f<<5)+16>>2]=c[i+(f<<5)+16>>2];c[k+(f<<5)+20>>2]=0;c[k+(f<<5)+24>>2]=0;c[k+(f<<5)+28>>2]=0;f=f+1|0}while((f|0)<(c[d+168>>2]|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}return 0}function Rc(b,d,e,f,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;C=l;l=l+4224|0;if(((c[e+4>>2]|0)+-17|0)>>>0<2)A=((c[f+4>>2]|0)+-17|0)>>>0<2;else A=0;b=0;do{Qe();v=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];x=+g[24644+(b<<4)+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(b<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(b<<4)+4>>2]=z;g[C+1248+(b<<4)+8>>2]=y;g[C+1248+(b<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(b<<4)>>2]=v*+g[i>>2]+w*+g[i+16>>2]+x*+g[i+32>>2];g[C+256+(b<<4)+4>>2]=y;g[C+256+(b<<4)+8>>2]=z;g[C+256+(b<<4)+12>>2]=0.0;b=b+1|0}while((b|0)!=42);q=xb[c[(c[e>>2]|0)+84>>2]&127](e)|0;if((q|0)>0){b=0;p=42;while(1){Sb[c[(c[e>>2]|0)+88>>2]&127](e,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[h+16>>2]+z*+g[h+20>>2]+x*+g[h+24>>2];v=y*+g[h+32>>2]+z*+g[h+36>>2]+x*+g[h+40>>2];g[C+176>>2]=+g[h>>2]*y+ +g[h+4>>2]*z+ +g[h+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();r=24644+(p<<4)|0;c[r>>2]=c[C+176>>2];c[r+4>>2]=c[C+176+4>>2];c[r+8>>2]=c[C+176+8>>2];c[r+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(p<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(p<<4)+4>>2]=z;g[C+1248+(p<<4)+8>>2]=y;g[C+1248+(p<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(p<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(p<<4)+4>>2]=y;g[C+256+(p<<4)+8>>2]=z;g[C+256+(p<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(q|0))break;else p=p+1|0}p=q+42|0}else p=42;r=xb[c[(c[f>>2]|0)+84>>2]&127](f)|0;if((r|0)>0){b=0;q=p;while(1){Sb[c[(c[f>>2]|0)+88>>2]&127](f,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[i+16>>2]+z*+g[i+20>>2]+x*+g[i+24>>2];v=y*+g[i+32>>2]+z*+g[i+36>>2]+x*+g[i+40>>2];g[C+176>>2]=+g[i>>2]*y+ +g[i+4>>2]*z+ +g[i+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();D=24644+(q<<4)|0;c[D>>2]=c[C+176>>2];c[D+4>>2]=c[C+176+4>>2];c[D+8>>2]=c[C+176+8>>2];c[D+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(q<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(q<<4)+4>>2]=z;g[C+1248+(q<<4)+8>>2]=y;g[C+1248+(q<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(q<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(q<<4)+4>>2]=y;g[C+256+(q<<4)+8>>2]=z;g[C+256+(q<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(r|0))break;else q=q+1|0}p=r+p|0}Vb[c[(c[e>>2]|0)+76>>2]&127](e,C+1248|0,C+3232|0,p);Vb[c[(c[f>>2]|0)+76>>2]&127](f,C+256|0,C+2240|0,p);if((p|0)>0){v=999999984306749440.0;b=0;y=0.0;z=0.0;x=0.0;s=0.0;while(1){Qe();u=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];t=+g[24644+(b<<4)+12>>2];o=A?0.0:+g[24644+(b<<4)+8>>2];if(u*u+w*w+o*o>.01?(F=+g[C+3232+(b<<4)>>2],E=+g[C+3232+(b<<4)+4>>2],B=+g[C+3232+(b<<4)+8>>2],I=+g[C+2240+(b<<4)>>2],H=+g[C+2240+(b<<4)+4>>2],G=+g[C+2240+(b<<4)+8>>2],B=u*(I*+g[i>>2]+H*+g[i+4>>2]+G*+g[i+8>>2]+ +g[i+48>>2]-(F*+g[h>>2]+E*+g[h+4>>2]+B*+g[h+8>>2]+ +g[h+48>>2]))+w*(I*+g[i+16>>2]+H*+g[i+20>>2]+G*+g[i+24>>2]+ +g[i+52>>2]-(F*+g[h+16>>2]+E*+g[h+20>>2]+B*+g[h+24>>2]+ +g[h+52>>2]))+o*((A?0.0:I*+g[i+32>>2]+H*+g[i+36>>2]+G*+g[i+40>>2]+ +g[i+56>>2])-(A?0.0:F*+g[h+32>>2]+E*+g[h+36>>2]+B*+g[h+40>>2]+ +g[h+56>>2])),B>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[e>>2]|0)+48>>2]&15](e)}switch(c[f+4>>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[f>>2]|0)+48>>2]&15](f)}if(v<0.0){D=0;l=C;return D|0}switch(c[e+4>>2]|0){case 8:{o=+g[e+32>>2]*+g[e+16>>2];break}case 0:{o=+g[e+48>>2];break}case 1:{o=+g[e+48>>2];break}case 13:{o=+g[e+48>>2];break}case 11:{o=+g[e+48>>2];break}case 10:{o=+g[e+48>>2];break}case 4:case 5:{o=+g[e+48>>2];break}default:o=+nb[c[(c[e>>2]|0)+48>>2]&15](e)}b=c[f+4>>2]|0;switch(b|0){case 8:{s=+g[f+32>>2]*+g[f+16>>2];b=8;break}case 0:{s=+g[f+48>>2];b=0;break}case 1:{s=+g[f+48>>2];b=1;break}case 13:{s=+g[f+48>>2];b=13;break}case 11:{s=+g[f+48>>2];b=11;break}case 10:{s=+g[f+48>>2];b=10;break}case 4:case 5:{s=+g[f+48>>2];break}default:{s=+nb[c[(c[f>>2]|0)+48>>2]&15](f);b=c[f+4>>2]|0}}o=v+(o+s+.5);c[C+176>>2]=9552;c[C+176+4>>2]=0;c[C+176+8>>2]=1065353216;c[C+176+12>>2]=0;g[C+176+16>>2]=0.0;c[C+176+20>>2]=0;c[C+176+24>>2]=d;c[C+176+28>>2]=e;c[C+176+32>>2]=f;c[C+176+36>>2]=c[e+4>>2];c[C+176+40>>2]=b;g[C+176+44>>2]=+nb[c[(c[e>>2]|0)+48>>2]&15](e);g[C+176+48>>2]=+nb[c[(c[f>>2]|0)+48>>2]&15](f);a[C+176+52>>0]=0;c[C+176+60>>2]=-1;c[C+176+72>>2]=1;c[C+176+76>>2]=1;G=u*o+ +g[h+48>>2];H=w*o+ +g[h+52>>2];I=x*o+ +g[h+56>>2];c[C+44>>2]=c[h>>2];c[C+44+4>>2]=c[h+4>>2];c[C+44+8>>2]=c[h+8>>2];c[C+44+12>>2]=c[h+12>>2];c[C+44+16>>2]=c[h+16>>2];c[C+44+16+4>>2]=c[h+16+4>>2];c[C+44+16+8>>2]=c[h+16+8>>2];c[C+44+16+12>>2]=c[h+16+12>>2];c[C+44+32>>2]=c[h+32>>2];c[C+44+32+4>>2]=c[h+32+4>>2];c[C+44+32+8>>2]=c[h+32+8>>2];c[C+44+32+12>>2]=c[h+32+12>>2];g[C+44+48>>2]=G;g[C+44+52>>2]=H;g[C+44+56>>2]=I;g[C+44+60>>2]=0.0;c[C+44+64>>2]=c[i>>2];c[C+44+64+4>>2]=c[i+4>>2];c[C+44+64+8>>2]=c[i+8>>2];c[C+44+64+12>>2]=c[i+12>>2];c[C+44+80>>2]=c[i+16>>2];c[C+44+80+4>>2]=c[i+16+4>>2];c[C+44+80+8>>2]=c[i+16+8>>2];c[C+44+80+12>>2]=c[i+16+12>>2];c[C+44+96>>2]=c[i+32>>2];c[C+44+96+4>>2]=c[i+32+4>>2];c[C+44+96+8>>2]=c[i+32+8>>2];c[C+44+96+12>>2]=c[i+32+12>>2];c[C+44+112>>2]=c[i+48>>2];c[C+44+112+4>>2]=c[i+48+4>>2];c[C+44+112+8>>2]=c[i+48+8>>2];c[C+44+112+12>>2]=c[i+48+12>>2];g[C+44+128>>2]=999999984306749440.0;c[C>>2]=9436;a[C+40>>0]=0;g[C+176+4>>2]=-u;g[C+176+8>>2]=-w;g[C+176+12>>2]=-x;g[C+176+16>>2]=0.0;Dc(C+176|0,C+44|0,C,n,0);o=o-+g[C+36>>2];b=a[C+40>>0]|0;if(b<<24>>24){H=+g[C+24>>2]-w*o;I=+g[C+28>>2]-x*o;g[k>>2]=+g[C+20>>2]-u*o;g[k+4>>2]=H;g[k+8>>2]=I;g[k+12>>2]=0.0;c[m>>2]=c[C+20>>2];c[m+4>>2]=c[C+20+4>>2];c[m+8>>2]=c[C+20+8>>2];c[m+12>>2]=c[C+20+12>>2];g[j>>2]=u;g[j+4>>2]=w;g[j+8>>2]=x;g[j+12>>2]=t}D=b<<24>>24!=0;l=C;return D|0}function Sc(){var a=0;a=Ds(8)|0;c[6994]=a;eb(a|0,0)|0;c[6417]=19310;c[6418]=0;c[6419]=0;c[6420]=0;c[6421]=0;c[6422]=0;c[6423]=0;c[6424]=0;c[6425]=0;Pr(25668);c[6426]=19310;c[6427]=0;c[6428]=0;c[6429]=0;c[6430]=0;c[6431]=0;c[6432]=0;c[6433]=0;c[6434]=0;Pr(25704);c[6435]=19310;c[6436]=0;c[6437]=0;c[6438]=0;c[6439]=0;c[6440]=0;c[6441]=0;c[6442]=0;c[6443]=0;Pr(25740);c[6444]=19310;c[6445]=0;c[6446]=0;c[6447]=0;c[6448]=0;c[6449]=0;c[6450]=0;c[6451]=0;c[6452]=0;Pr(25776);c[6453]=19310;c[6454]=0;c[6455]=0;c[6456]=0;c[6457]=0;c[6458]=0;c[6459]=0;c[6460]=0;c[6461]=0;Pr(25812);c[6462]=19310;c[6463]=0;c[6464]=0;c[6465]=0;c[6466]=0;c[6467]=0;c[6468]=0;c[6469]=0;c[6470]=0;Pr(25848);c[6471]=19310;c[6472]=0;c[6473]=0;c[6474]=0;c[6475]=0;c[6476]=0;c[6477]=0;c[6478]=0;c[6479]=0;Pr(25884);c[6480]=19310;c[6481]=0;c[6482]=0;c[6483]=0;c[6484]=0;c[6485]=0;c[6486]=0;c[6487]=0;c[6488]=0;Pr(25920);c[6489]=19310;c[6490]=0;c[6491]=0;c[6492]=0;c[6493]=0;c[6494]=0;c[6495]=0;c[6496]=0;c[6497]=0;Pr(25956);c[6498]=19310;c[6499]=0;c[6500]=0;c[6501]=0;c[6502]=0;c[6503]=0;c[6504]=0;c[6505]=0;c[6506]=0;Pr(25992);c[6507]=19310;c[6508]=0;c[6509]=0;c[6510]=0;c[6511]=0;c[6512]=0;c[6513]=0;c[6514]=0;c[6515]=0;Pr(26028);c[6516]=19310;c[6517]=0;c[6518]=0;c[6519]=0;c[6520]=0;c[6521]=0;c[6522]=0;c[6523]=0;c[6524]=0;Pr(26064);c[6525]=19310;c[6526]=0;c[6527]=0;c[6528]=0;c[6529]=0;c[6530]=0;c[6531]=0;c[6532]=0;c[6533]=0;Pr(26100);c[6534]=19310;c[6535]=0;c[6536]=0;c[6537]=0;c[6538]=0;c[6539]=0;c[6540]=0;c[6541]=0;c[6542]=0;Pr(26136);c[6543]=19310;c[6544]=0;c[6545]=0;c[6546]=0;c[6547]=0;c[6548]=0;c[6549]=0;c[6550]=0;c[6551]=0;Pr(26172);c[6552]=19310;c[6553]=0;c[6554]=0;c[6555]=0;c[6556]=0;c[6557]=0;c[6558]=0;c[6559]=0;c[6560]=0;Pr(26208);c[6561]=19310;c[6562]=0;c[6563]=0;c[6564]=0;c[6565]=0;c[6566]=0;c[6567]=0;c[6568]=0;c[6569]=0;Pr(26244);c[6570]=19310;c[6571]=0;c[6572]=0;c[6573]=0;c[6574]=0;c[6575]=0;c[6576]=0;c[6577]=0;c[6578]=0;Pr(26280);c[6579]=19310;c[6580]=0;c[6581]=0;c[6582]=0;c[6583]=0;c[6584]=0;c[6585]=0;c[6586]=0;c[6587]=0;Pr(26316);c[6588]=19310;c[6589]=0;c[6590]=0;c[6591]=0;c[6592]=0;c[6593]=0;c[6594]=0;c[6595]=0;c[6596]=0;Pr(26352);c[6597]=19310;c[6598]=0;c[6599]=0;c[6600]=0;c[6601]=0;c[6602]=0;c[6603]=0;c[6604]=0;c[6605]=0;Pr(26388);c[6606]=19310;c[6607]=0;c[6608]=0;c[6609]=0;c[6610]=0;c[6611]=0;c[6612]=0;c[6613]=0;c[6614]=0;Pr(26424);c[6615]=19310;c[6616]=0;c[6617]=0;c[6618]=0;c[6619]=0;c[6620]=0;c[6621]=0;c[6622]=0;c[6623]=0;Pr(26460);c[6624]=19310;c[6625]=0;c[6626]=0;c[6627]=0;c[6628]=0;c[6629]=0;c[6630]=0;c[6631]=0;c[6632]=0;Pr(26496);c[6633]=19310;c[6634]=0;c[6635]=0;c[6636]=0;c[6637]=0;c[6638]=0;c[6639]=0;c[6640]=0;c[6641]=0;Pr(26532);c[6642]=19310;c[6643]=0;c[6644]=0;c[6645]=0;c[6646]=0;c[6647]=0;c[6648]=0;c[6649]=0;c[6650]=0;Pr(26568);c[6651]=19310;c[6652]=0;c[6653]=0;c[6654]=0;c[6655]=0;c[6656]=0;c[6657]=0;c[6658]=0;c[6659]=0;Pr(26604);c[6660]=19310;c[6661]=0;c[6662]=0;c[6663]=0;c[6664]=0;c[6665]=0;c[6666]=0;c[6667]=0;c[6668]=0;Pr(26640);c[6669]=19310;c[6670]=0;c[6671]=0;c[6672]=0;c[6673]=0;c[6674]=0;c[6675]=0;c[6676]=0;c[6677]=0;Pr(26676);c[6678]=19310;c[6679]=0;c[6680]=0;c[6681]=0;c[6682]=0;c[6683]=0;c[6684]=0;c[6685]=0;c[6686]=0;Pr(26712);c[6687]=19310;c[6688]=0;c[6689]=0;c[6690]=0;c[6691]=0;c[6692]=0;c[6693]=0;c[6694]=0;c[6695]=0;Pr(26748);c[6696]=19310;c[6697]=0;c[6698]=0;c[6699]=0;c[6700]=0;c[6701]=0;c[6702]=0;c[6703]=0;c[6704]=0;Pr(26784);c[6705]=19310;c[6706]=0;c[6707]=0;c[6708]=0;c[6709]=0;c[6710]=0;c[6711]=0;c[6712]=0;c[6713]=0;Pr(26820);c[6714]=19310;c[6715]=0;c[6716]=0;c[6717]=0;c[6718]=0;c[6719]=0;c[6720]=0;c[6721]=0;c[6722]=0;Pr(26856);c[6723]=19310;c[6724]=0;c[6725]=0;c[6726]=0;c[6727]=0;c[6728]=0;c[6729]=0;c[6730]=0;c[6731]=0;Pr(26892);c[6732]=19310;c[6733]=0;c[6734]=0;c[6735]=0;c[6736]=0;c[6737]=0;c[6738]=0;c[6739]=0;c[6740]=0;Pr(26928);c[6741]=19310;c[6742]=0;c[6743]=0;c[6744]=0;c[6745]=0;c[6746]=0;c[6747]=0;c[6748]=0;c[6749]=0;Pr(26964);c[6750]=19310;c[6751]=0;c[6752]=0;c[6753]=0;c[6754]=0;c[6755]=0;c[6756]=0;c[6757]=0;c[6758]=0;Pr(27e3);c[6759]=19310;c[6760]=0;c[6761]=0;c[6762]=0;c[6763]=0;c[6764]=0;c[6765]=0;c[6766]=0;c[6767]=0;Pr(27036);c[6768]=19310;c[6769]=0;c[6770]=0;c[6771]=0;c[6772]=0;c[6773]=0;c[6774]=0;c[6775]=0;c[6776]=0;Pr(27072);c[6777]=19310;c[6778]=0;c[6779]=0;c[6780]=0;c[6781]=0;c[6782]=0;c[6783]=0;c[6784]=0;c[6785]=0;Pr(27108);c[6786]=19310;c[6787]=0;c[6788]=0;c[6789]=0;c[6790]=0;c[6791]=0;c[6792]=0;c[6793]=0;c[6794]=0;Pr(27144);c[6795]=19310;c[6796]=0;c[6797]=0;c[6798]=0;c[6799]=0;c[6800]=0;c[6801]=0;c[6802]=0;c[6803]=0;Pr(27180);c[6804]=19310;c[6805]=0;c[6806]=0;c[6807]=0;c[6808]=0;c[6809]=0;c[6810]=0;c[6811]=0;c[6812]=0;Pr(27216);c[6813]=19310;c[6814]=0;c[6815]=0;c[6816]=0;c[6817]=0;c[6818]=0;c[6819]=0;c[6820]=0;c[6821]=0;Pr(27252);c[6822]=19310;c[6823]=0;c[6824]=0;c[6825]=0;c[6826]=0;c[6827]=0;c[6828]=0;c[6829]=0;c[6830]=0;Pr(27288);c[6831]=19310;c[6832]=0;c[6833]=0;c[6834]=0;c[6835]=0;c[6836]=0;c[6837]=0;c[6838]=0;c[6839]=0;Pr(27324);c[6840]=19310;c[6841]=0;c[6842]=0;c[6843]=0;c[6844]=0;c[6845]=0;c[6846]=0;c[6847]=0;c[6848]=0;Pr(27360);c[6849]=19310;c[6850]=0;c[6851]=0;c[6852]=0;c[6853]=0;c[6854]=0;c[6855]=0;c[6856]=0;c[6857]=0;Pr(27396);c[6858]=19310;c[6859]=0;c[6860]=0;c[6861]=0;c[6862]=0;c[6863]=0;c[6864]=0;c[6865]=0;c[6866]=0;Pr(27432);c[6867]=19310;c[6868]=0;c[6869]=0;c[6870]=0;c[6871]=0;c[6872]=0;c[6873]=0;c[6874]=0;c[6875]=0;Pr(27468);c[6876]=19310;c[6877]=0;c[6878]=0;c[6879]=0;c[6880]=0;c[6881]=0;c[6882]=0;c[6883]=0;c[6884]=0;Pr(27504);c[6885]=19310;c[6886]=0;c[6887]=0;c[6888]=0;c[6889]=0;c[6890]=0;c[6891]=0;c[6892]=0;c[6893]=0;Pr(27540);c[6894]=19310;c[6895]=0;c[6896]=0;c[6897]=0;c[6898]=0;c[6899]=0;c[6900]=0;c[6901]=0;c[6902]=0;Pr(27576);c[6903]=19310;c[6904]=0;c[6905]=0;c[6906]=0;c[6907]=0;c[6908]=0;c[6909]=0;c[6910]=0;c[6911]=0;Pr(27612);c[6912]=19310;c[6913]=0;c[6914]=0;c[6915]=0;c[6916]=0;c[6917]=0;c[6918]=0;c[6919]=0;c[6920]=0;Pr(27648);c[6921]=19310;c[6922]=0;c[6923]=0;c[6924]=0;c[6925]=0;c[6926]=0;c[6927]=0;c[6928]=0;c[6929]=0;Pr(27684);c[6930]=19310;c[6931]=0;c[6932]=0;c[6933]=0;c[6934]=0;c[6935]=0;c[6936]=0;c[6937]=0;c[6938]=0;Pr(27720);c[6939]=19310;c[6940]=0;c[6941]=0;c[6942]=0;c[6943]=0;c[6944]=0;c[6945]=0;c[6946]=0;c[6947]=0;Pr(27756);c[6948]=19310;c[6949]=0;c[6950]=0;c[6951]=0;c[6952]=0;c[6953]=0;c[6954]=0;c[6955]=0;c[6956]=0;Pr(27792);c[6957]=19310;c[6958]=0;c[6959]=0;c[6960]=0;c[6961]=0;c[6962]=0;c[6963]=0;c[6964]=0;c[6965]=0;Pr(27828);c[6966]=19310;c[6967]=0;c[6968]=0;c[6969]=0;c[6970]=0;c[6971]=0;c[6972]=0;c[6973]=0;c[6974]=0;Pr(27864);c[6975]=19310;c[6976]=0;c[6977]=0;c[6978]=0;c[6979]=0;c[6980]=0;c[6981]=0;c[6982]=0;c[6983]=0;Pr(27900);c[6984]=19310;c[6985]=0;c[6986]=0;c[6987]=0;c[6988]=0;c[6989]=0;c[6990]=0;c[6991]=0;c[6992]=0;Pr(27936);return}function Tc(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0;H=l;l=l+192|0;d=c[b+1112>>2]|0;if((d|0)<=0){l=H;return}G=0;do{F=c[(c[b+1120>>2]|0)+(G<<2)>>2]|0;E=c[F+24>>2]|0;if(E){i=H+144+4|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));g[H+144>>2]=9.999999747378752e-05;g[H+144+20>>2]=1.9999999494757503e-04;g[H+144+40>>2]=2.9999998514540493e-04;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;d=0;e=0.0;f=0.0;h=0.0;do{D=c[i+(d<<2)>>2]|0;C=+g[j+(d<<2)>>2];e=e+ +g[D+8>>2]*C;f=f+C*+g[D+12>>2];h=h+C*+g[D+16>>2];d=d+1|0}while((d|0)!=(E|0))}else{h=0.0;f=0.0;e=0.0}r=+g[F+128>>2];t=e*r;s=f*r;r=h*r;g[F+228>>2]=t;g[F+232>>2]=s;g[F+236>>2]=r;g[F+240>>2]=0.0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+52>>2]|0;d=0;e=9.999999747378752e-05;f=0.0;h=0.0;k=0.0;m=1.9999999494757503e-04;n=0.0;o=0.0;p=0.0;q=2.9999998514540493e-04;do{D=c[i+(d<<2)>>2]|0;x=+g[D+8>>2]-t;y=+g[D+12>>2]-s;B=+g[D+16>>2]-r;z=+g[j+(d<<4)>>2];A=+g[j+(d<<4)+4>>2];C=+g[j+(d<<4)+8>>2];e=x*z+e;f=x*A+f;h=x*C+h;k=y*z+k;m=y*A+m;n=y*C+n;o=B*z+o;p=B*A+p;q=B*C+q;d=d+1|0}while((d|0)!=(E|0));g[H+144>>2]=e;g[H+144+4>>2]=f;g[H+144+8>>2]=h;g[H+144+16>>2]=k;g[H+144+20>>2]=m;g[H+144+24>>2]=n;g[H+144+32>>2]=o;g[H+144+36>>2]=p;g[H+144+40>>2]=q}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(H+144|0,H+96|0,H+48|0);c[F+108>>2]=c[F+228>>2];c[F+108+4>>2]=c[F+228+4>>2];c[F+108+8>>2]=c[F+228+8>>2];c[F+108+12>>2]=c[F+228+12>>2];c[F+60>>2]=c[H+96>>2];c[F+60+4>>2]=c[H+96+4>>2];c[F+60+8>>2]=c[H+96+8>>2];c[F+60+12>>2]=c[H+96+12>>2];c[F+76>>2]=c[H+96+16>>2];c[F+76+4>>2]=c[H+96+16+4>>2];c[F+76+8>>2]=c[H+96+16+8>>2];c[F+76+12>>2]=c[H+96+16+12>>2];c[F+92>>2]=c[H+96+32>>2];c[F+92+4>>2]=c[H+96+32+4>>2];c[F+92+8>>2]=c[H+96+32+8>>2];c[F+92+12>>2]=c[H+96+32+12>>2];m=+g[F+132>>2];K=+g[F+60>>2];n=+g[F+148>>2];J=+g[F+64>>2];o=+g[F+164>>2];A=+g[F+68>>2];p=+g[F+136>>2];q=+g[F+152>>2];r=+g[F+168>>2];s=+g[F+140>>2];t=+g[F+156>>2];C=+g[F+172>>2];I=+g[F+76>>2];e=+g[F+80>>2];B=+g[F+84>>2];k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];u=(m*K+n*J+o*A)*K+(K*p+J*q+A*r)*J+(K*s+J*t+A*C)*A;v=(m*K+n*J+o*A)*I+(K*p+J*q+A*r)*e+(K*s+J*t+A*C)*B;w=(m*K+n*J+o*A)*k+(K*p+J*q+A*r)*h+(K*s+J*t+A*C)*f;x=(m*I+n*e+o*B)*K+(p*I+q*e+r*B)*J+(s*I+t*e+C*B)*A;y=(m*I+n*e+o*B)*I+(p*I+q*e+r*B)*e+(s*I+t*e+C*B)*B;z=(m*I+n*e+o*B)*k+(p*I+q*e+r*B)*h+(s*I+t*e+C*B)*f;A=K*(m*k+n*h+o*f)+(p*k+q*h+r*f)*J+(s*k+t*h+C*f)*A;B=I*(m*k+n*h+o*f)+(p*k+q*h+r*f)*e+(s*k+t*h+C*f)*B;C=(m*k+n*h+o*f)*k+(p*k+q*h+r*f)*h+(s*k+t*h+C*f)*f;g[F+180>>2]=u;g[F+184>>2]=v;g[F+188>>2]=w;g[F+192>>2]=0.0;g[F+196>>2]=x;g[F+200>>2]=y;g[F+204>>2]=z;g[F+208>>2]=0.0;g[F+212>>2]=A;g[F+216>>2]=B;g[F+220>>2]=C;g[F+224>>2]=0.0;c[F+316>>2]=0;c[F+316+4>>2]=0;c[F+316+8>>2]=0;c[F+316+12>>2]=0;c[F+316+16>>2]=0;c[F+316+20>>2]=0;c[F+316+24>>2]=0;c[F+316+28>>2]=0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;r=+g[F+228>>2];s=+g[F+232>>2];t=+g[F+236>>2];d=0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0;do{D=c[i+(d<<2)>>2]|0;M=+g[j+(d<<2)>>2];J=+g[D+40>>2]*M;L=M*+g[D+44>>2];M=M*+g[D+48>>2];q=J+q;g[F+316>>2]=q;p=L+p;g[F+320>>2]=p;o=M+o;g[F+324>>2]=o;I=+g[D+8>>2]-r;K=+g[D+12>>2]-s;N=+g[D+16>>2]-t;n=n+(M*K-L*N);g[F+332>>2]=n;m=J*N-M*I+m;g[F+336>>2]=m;e=L*I-J*K+e;g[F+340>>2]=e;d=d+1|0}while((d|0)!=(E|0));D=F+316|0;d=F+332|0}else{D=F+316|0;d=F+332|0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0}M=+g[F+128>>2];N=1.0-+g[F+356>>2];g[F+316>>2]=q*M*N;g[F+320>>2]=M*p*N;g[F+324>>2]=M*o*N;g[F+328>>2]=0.0;N=1.0-+g[F+360>>2];g[d>>2]=(u*n+v*m+w*e)*N;g[F+336>>2]=(n*x+m*y+e*z)*N;g[F+340>>2]=N*(n*A+m*B+e*C);g[F+344>>2]=0.0;i=F+244|0;j=i+72|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));e=+g[F+364>>2];a:do if(e>0.0?(c[F+24>>2]|0)>0:0){d=0;while(1){j=c[(c[F+32>>2]|0)+(d<<2)>>2]|0;i=c[F+52>>2]|0;I=+g[i+(d<<4)>>2];J=+g[i+(d<<4)+4>>2];K=+g[i+(d<<4)+8>>2];L=+g[j+8>>2];M=+g[j+12>>2];N=+g[j+16>>2];M=M+e*(I*+g[F+76>>2]+J*+g[F+80>>2]+K*+g[F+84>>2]+ +g[F+112>>2]-M);N=N+e*(I*k+J*h+K*f+ +g[F+116>>2]-N);g[j+8>>2]=L+e*(I*+g[F+60>>2]+J*+g[F+64>>2]+K*+g[F+68>>2]+ +g[F+108>>2]-L);g[j+12>>2]=M;g[j+16>>2]=N;g[j+20>>2]=0.0;d=d+1|0;if((d|0)>=(c[F+24>>2]|0))break a;k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];e=+g[F+364>>2]}}while(0);if(a[F+377>>0]|0){i=c[F+32>>2]|0;j=c[i>>2]|0;e=+g[j+8>>2];q=+g[j+12>>2];r=+g[j+16>>2];f=+g[j+20>>2];if((E|0)>1){d=1;m=e;p=e;n=f;o=r;k=f;h=q;f=q;e=r;do{j=c[i+(d<<2)>>2]|0;K=+g[j+8>>2];p=K>2];f=L>2];o=M>2];k=N>2]=p;g[H+16+4>>2]=f;g[H+16+8>>2]=o;g[H+16+12>>2]=k;g[H+16+16>>2]=m;g[H+16+20>>2]=h;g[H+16+24>>2]=e;g[H+16+28>>2]=n;d=c[F+348>>2]|0;if(!d){d=c[b+1072>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+1072>>2]=0;c[d+32>>2]=0;c[d+36>>2]=F;c[d+40>>2]=0;c[d>>2]=c[H+16>>2];c[d+4>>2]=c[H+16+4>>2];c[d+8>>2]=c[H+16+8>>2];c[d+12>>2]=c[H+16+12>>2];c[d+16>>2]=c[H+16+16>>2];c[d+20>>2]=c[H+16+20>>2];c[d+24>>2]=c[H+16+24>>2];c[d+28>>2]=c[H+16+28>>2];Pe(b+1068|0,c[b+1068>>2]|0,d);c[b+1080>>2]=(c[b+1080>>2]|0)+1;c[F+348>>2]=d}else{L=+g[b+512>>2];M=L*+g[F+320>>2]*3.0;N=L*+g[F+324>>2]*3.0;g[H>>2]=+g[D>>2]*L*3.0;g[H+4>>2]=M;g[H+8>>2]=N;g[H+12>>2]=0.0;uh(b+1068|0,d,H+16|0,H,+g[b+524>>2])|0}}d=c[b+1112>>2]|0}G=G+1|0}while((G|0)<(d|0));l=H;return}function Uc(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;o=l;l=l+48|0;d=c[a+24>>2]|0;if((d|0)<=0){l=o;return}n=0;a:while(1){m=c[(c[a+32>>2]|0)+(n<<2)>>2]|0;switch(c[m+220>>2]|0){case 2:case 5:break;default:{ee(m,0);e=c[m+792>>2]|0;if((e|0)>0){d=0;do{k=c[m+800>>2]|0;i=c[k+(d*52|0)+28>>2]|0;j=c[k+(d*52|0)+24>>2]|0;y=+g[i+24>>2]-+g[j+24>>2];x=+g[i+28>>2]-+g[j+28>>2];b=+g[i+32>>2]-+g[j+32>>2];g[k+(d*52|0)+8>>2]=y;g[k+(d*52|0)+12>>2]=x;g[k+(d*52|0)+16>>2]=b;g[k+(d*52|0)+20>>2]=0.0;g[k+(d*52|0)+48>>2]=1.0/(+g[k+(d*52|0)+40>>2]*(y*y+x*x+b*b));d=d+1|0}while((d|0)!=(e|0))}f=c[m+852>>2]|0;if((f|0)>0){d=0;b=+g[m+512>>2];do{k=c[m+860>>2]|0;e=k+(d*96|0)+20|0;i=c[e>>2]|0;H=+g[k+(d*96|0)+4>>2];J=+g[k+(d*96|0)+8>>2];y=+g[k+(d*96|0)+12>>2];z=+g[i+4>>2]*H+ +g[i+8>>2]*J+ +g[i+12>>2]*y;x=H*+g[i+20>>2]+J*+g[i+24>>2]+y*+g[i+28>>2];y=H*+g[i+36>>2]+J*+g[i+40>>2]+y*+g[i+44>>2];j=k+(d*96|0)|0;J=+g[(c[j>>2]|0)+88>>2];H=1.0/b;Uh(o,+g[i+404>>2],i+324|0,z,x,y);C=J+ +g[o>>2];G=+g[o+4>>2]+0.0;E=+g[o+8>>2]+0.0;D=+g[o+16>>2]+0.0;F=J+ +g[o+20>>2];B=+g[o+24>>2]+0.0;I=+g[o+32>>2]+0.0;K=+g[o+36>>2]+0.0;J=J+ +g[o+40>>2];A=1.0/(E*(D*K-F*I)+(C*(F*J-B*K)+G*(B*I-D*J)));g[k+(d*96|0)+28>>2]=(D*K-F*I)*A*0.0+(H*(F*J-B*K)*A+(B*I-D*J)*A*0.0);g[k+(d*96|0)+32>>2]=(G*I-C*K)*A*0.0+(H*(E*K-G*J)*A+(C*J-E*I)*A*0.0);g[k+(d*96|0)+36>>2]=(C*F-G*D)*A*0.0+(H*(G*B-E*F)*A+(E*D-C*B)*A*0.0);g[k+(d*96|0)+40>>2]=0.0;g[k+(d*96|0)+44>>2]=(D*K-F*I)*A*0.0+((F*J-B*K)*A*0.0+H*(B*I-D*J)*A);g[k+(d*96|0)+48>>2]=(G*I-C*K)*A*0.0+((E*K-G*J)*A*0.0+H*(C*J-E*I)*A);g[k+(d*96|0)+52>>2]=(C*F-G*D)*A*0.0+((G*B-E*F)*A*0.0+H*(E*D-C*B)*A);g[k+(d*96|0)+56>>2]=0.0;g[k+(d*96|0)+60>>2]=H*(D*K-F*I)*A+((F*J-B*K)*A*0.0+(B*I-D*J)*A*0.0);g[k+(d*96|0)+64>>2]=H*(G*I-C*K)*A+((E*K-G*J)*A*0.0+(C*J-E*I)*A*0.0);g[k+(d*96|0)+68>>2]=H*(C*F-G*D)*A+((G*B-E*F)*A*0.0+(E*D-C*B)*A*0.0);g[k+(d*96|0)+72>>2]=0.0;g[k+(d*96|0)+76>>2]=z;g[k+(d*96|0)+80>>2]=x;g[k+(d*96|0)+84>>2]=y;g[k+(d*96|0)+88>>2]=0.0;b=+g[m+512>>2];g[k+(d*96|0)+92>>2]=b*+g[(c[j>>2]|0)+88>>2];e=c[e>>2]|0;if(!(c[e+204>>2]&3)){if((c[e+220>>2]&-2|0)!=4)c[e+220>>2]=1;g[e+224>>2]=0.0}d=d+1|0}while((d|0)!=(f|0))}d=c[m+432>>2]|0;if((d|0)>0){f=0;e=c[m+456>>2]|0;do{if((e|0)>0){d=0;do{Jb[((c[(c[m+464>>2]|0)+(d<<2)>>2]|0)==0?25:0)&31](m,1.0);d=d+1|0;e=c[m+456>>2]|0}while((d|0)<(e|0));d=c[m+432>>2]|0}f=f+1|0}while((f|0)<(d|0));e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;I=+g[m+512>>2];J=I*+g[k+(d*104|0)+44>>2]+ +g[k+(d*104|0)+28>>2];K=I*+g[k+(d*104|0)+48>>2]+ +g[k+(d*104|0)+32>>2];g[k+(d*104|0)+8>>2]=+g[k+(d*104|0)+40>>2]*I+ +g[k+(d*104|0)+24>>2];g[k+(d*104|0)+12>>2]=J;g[k+(d*104|0)+16>>2]=K;g[k+(d*104|0)+20>>2]=0.0;d=d+1|0}while((d|0)!=(e|0))}}d=c[m+436>>2]|0;if((d|0)>0){h=0;e=c[m+476>>2]|0;do{b=+(h|0)/+(d|0);if((e|0)>0){f=0;do{switch(c[(c[m+484>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=35;break a}}Kb[d&7](m,1.0,b);f=f+1|0;e=c[m+476>>2]|0}while((f|0)<(e|0));d=c[m+436>>2]|0}h=h+1|0}while((h|0)<(d|0));b=+g[m+516>>2]*(1.0-+g[m+356>>2]);e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;J=b*(+g[k+(d*104|0)+12>>2]-+g[k+(d*104|0)+28>>2]);K=b*(+g[k+(d*104|0)+16>>2]-+g[k+(d*104|0)+32>>2]);g[k+(d*104|0)+40>>2]=b*(+g[k+(d*104|0)+8>>2]-+g[k+(d*104|0)+24>>2]);g[k+(d*104|0)+44>>2]=J;g[k+(d*104|0)+48>>2]=K;k=k+(d*104|0)+52|0;d=d+1|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0}while((d|0)!=(e|0))}}d=c[m+440>>2]|0;if((d|0)>0){b=+g[m+352>>2]*+g[m+516>>2];e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;j=k+(d*104|0)+8|0;k=k+(d*104|0)+24|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(e|0));d=c[m+440>>2]|0;if((d|0)>0)w=42}else w=42;if((w|0)==42){w=0;h=0;e=c[m+496>>2]|0;do{if((e|0)>0){f=0;do{switch(c[(c[m+504>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=53;break a}}Kb[d&7](m,1.0,0.0);f=f+1|0;e=c[m+496>>2]|0}while((f|0)<(e|0));d=c[m+440>>2]|0}h=h+1|0}while((h|0)<(d|0))}e=c[m+772>>2]|0;if((e|0)>0){f=c[m+780>>2]|0;d=0;do{J=b*(+g[f+(d*104|0)+12>>2]-+g[f+(d*104|0)+28>>2]);K=b*(+g[f+(d*104|0)+16>>2]-+g[f+(d*104|0)+32>>2]);k=f+(d*104|0)+40|0;g[k>>2]=b*(+g[f+(d*104|0)+8>>2]-+g[f+(d*104|0)+24>>2])+ +g[k>>2];k=f+(d*104|0)+44|0;g[k>>2]=J+ +g[k>>2];k=f+(d*104|0)+48|0;g[k>>2]=K+ +g[k>>2];d=d+1|0}while((d|0)!=(e|0))}}f=c[m+1112>>2]|0;if((f|0)>0){h=c[m+1120>>2]|0;e=0;do{i=c[h+(e<<2)>>2]|0;if(+g[i+352>>2]>0.0?(p=c[i+24>>2]|0,(p|0)>0):0){j=c[i+32>>2]|0;d=0;do{k=c[j+(d<<2)>>2]|0;if(+g[k+88>>2]>0.0?(t=+g[k+24>>2]-+g[i+228>>2],v=+g[k+28>>2]-+g[i+232>>2],r=+g[k+32>>2]-+g[i+236>>2],s=+g[i+336>>2],K=+g[i+340>>2],u=+g[i+332>>2],q=+g[i+316>>2]+(s*r-v*K),r=+g[i+320>>2]+(t*K-r*u),s=v*u-t*s+ +g[i+324>>2],t=+g[k+40>>2],u=+g[k+44>>2],v=+g[k+48>>2],q*q+r*r+s*s<=t*t+u*u+v*v):0){K=+g[i+352>>2];g[k+40>>2]=t+(q-t)*K;g[k+44>>2]=(r-u)*K+u;g[k+48>>2]=(s-v)*K+v}d=d+1|0}while((d|0)!=(p|0))}e=e+1|0}while((e|0)!=(f|0))}ee(m,1);d=c[a+24>>2]|0}}n=n+1|0;if((n|0)>=(d|0)){w=3;break}}if((w|0)==3){l=o;return}}function Vc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0;q=l;l=l+80|0;i=c[b+28>>2]|0;d=c[f+72>>2]|0;if((d&4|0)!=0&(i|0)>0){e=c[b+36>>2]|0;h=c[b+76>>2]|0;if(!(d&16)){d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];c[m+128>>2]=c[h+((c[e+(d*152|0)+140>>2]|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}else{d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];k=c[e+(d*152|0)+140>>2]|0;c[m+128>>2]=c[h+(k*152|0)+100>>2];c[m+132>>2]=c[h+((k+1|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}}h=c[b+48>>2]|0;if((h|0)>0){d=0;do{i=c[b+56>>2]|0;k=c[i+(d*152|0)+132>>2]|0;m=c[k+44>>2]|0;e=i+(d*152|0)+100|0;if(m|0){p=+g[e>>2];s=c[k+28>>2]|0;o=1.0/+g[f+12>>2];n=p*+g[i+(d*152|0)+20>>2]*+g[s+412>>2]*o;r=p*+g[i+(d*152|0)+24>>2]*+g[s+416>>2]*o;g[m>>2]=+g[m>>2]+ +g[i+(d*152|0)+16>>2]*p*+g[s+408>>2]*o;g[m+4>>2]=n+ +g[m+4>>2];g[m+8>>2]=r+ +g[m+8>>2];r=+g[e>>2];s=c[k+32>>2]|0;n=1.0/+g[f+12>>2];o=r*+g[i+(d*152|0)+52>>2]*+g[s+412>>2]*n;p=r*+g[i+(d*152|0)+56>>2]*+g[s+416>>2]*n;g[m+32>>2]=+g[m+32>>2]+ +g[i+(d*152|0)+48>>2]*r*+g[s+408>>2]*n;g[m+36>>2]=o+ +g[m+36>>2];g[m+40>>2]=p+ +g[m+40>>2];s=c[k+28>>2]|0;p=+g[e>>2];o=1.0/+g[f+12>>2];n=+g[i+(d*152|0)+4>>2]*+g[s+608>>2]*p*o;r=p*+g[i+(d*152|0)+8>>2]*+g[s+612>>2]*o;g[m+16>>2]=+g[m+16>>2]+ +g[i+(d*152|0)>>2]*+g[s+604>>2]*p*o;g[m+20>>2]=n+ +g[m+20>>2];g[m+24>>2]=r+ +g[m+24>>2];s=c[k+32>>2]|0;r=+g[e>>2];n=1.0/+g[f+12>>2];o=+g[i+(d*152|0)+36>>2]*+g[s+608>>2]*r*n;p=r*+g[i+(d*152|0)+40>>2]*+g[s+612>>2]*n;g[m+48>>2]=+g[m+48>>2]+ +g[i+(d*152|0)+32>>2]*+g[s+604>>2]*r*n;g[m+52>>2]=o+ +g[m+52>>2];g[m+56>>2]=p+ +g[m+56>>2]}s=c[e>>2]|0;c[k+36>>2]=s;r=+C(+(c[j>>2]=s,+g[j>>2]));if(r>=+g[k+16>>2])a[k+20>>0]=0;d=d+1|0}while((d|0)!=(h|0))}e=c[b+8>>2]|0;if((e|0)>0){k=0;d=c[b+16>>2]|0;do{h=d+(k*244|0)|0;i=c[d+(k*244|0)+240>>2]|0;if(i){if(!(c[f+52>>2]|0)){h=d+(k*244|0)+176|0;o=+g[d+(k*244|0)+64>>2]+ +g[h>>2];g[h>>2]=o;h=d+(k*244|0)+180|0;p=+g[d+(k*244|0)+68>>2]+ +g[h>>2];g[h>>2]=p;h=d+(k*244|0)+184|0;n=+g[d+(k*244|0)+72>>2]+ +g[h>>2];g[h>>2]=n;h=d+(k*244|0)+192|0;g[h>>2]=+g[d+(k*244|0)+80>>2]+ +g[h>>2];h=d+(k*244|0)+196|0;g[h>>2]=+g[d+(k*244|0)+84>>2]+ +g[h>>2];h=d+(k*244|0)+200|0;g[h>>2]=+g[d+(k*244|0)+88>>2]+ +g[h>>2];h=d;d=i}else{n=+g[f+12>>2];o=+g[f+60>>2];e=d+(k*244|0)+176|0;g[e>>2]=+g[d+(k*244|0)+64>>2]+ +g[e>>2];e=d+(k*244|0)+180|0;g[e>>2]=+g[d+(k*244|0)+68>>2]+ +g[e>>2];e=d+(k*244|0)+184|0;g[e>>2]=+g[d+(k*244|0)+72>>2]+ +g[e>>2];e=d+(k*244|0)+192|0;g[e>>2]=+g[d+(k*244|0)+80>>2]+ +g[e>>2];e=d+(k*244|0)+196|0;g[e>>2]=+g[d+(k*244|0)+84>>2]+ +g[e>>2];e=d+(k*244|0)+200|0;g[e>>2]=+g[d+(k*244|0)+88>>2]+ +g[e>>2];p=+g[d+(k*244|0)+144>>2];e=d+(k*244|0)+148|0;if(((((!(p!=0.0)?!(+g[e>>2]!=0.0):0)?!(+g[d+(k*244|0)+152>>2]!=0.0):0)?!(+g[d+(k*244|0)+160>>2]!=0.0):0)?!(+g[d+(k*244|0)+164>>2]!=0.0):0)?!(+g[d+(k*244|0)+168>>2]!=0.0):0)e=i;else{t=+g[d+(k*244|0)+164>>2]*o;r=+g[d+(k*244|0)+168>>2]*o;g[q>>2]=+g[d+(k*244|0)+160>>2]*o;g[q+4>>2]=t;g[q+8>>2]=r;g[q+12>>2]=0.0;Af(h,p,+g[e>>2],+g[d+(k*244|0)+152>>2],q,n,q+16|0);c[h>>2]=c[q+16>>2];c[h+4>>2]=c[q+16+4>>2];c[h+8>>2]=c[q+16+8>>2];c[h+12>>2]=c[q+16+12>>2];e=d+(k*244|0)+16|0;c[e>>2]=c[q+16+16>>2];c[e+4>>2]=c[q+16+16+4>>2];c[e+8>>2]=c[q+16+16+8>>2];c[e+12>>2]=c[q+16+16+12>>2];e=d+(k*244|0)+32|0;c[e>>2]=c[q+16+32>>2];c[e+4>>2]=c[q+16+32+4>>2];c[e+8>>2]=c[q+16+32+8>>2];c[e+12>>2]=c[q+16+32+12>>2];e=d+(k*244|0)+48|0;c[e>>2]=c[q+16+48>>2];c[e+4>>2]=c[q+16+48+4>>2];c[e+8>>2]=c[q+16+48+8>>2];c[e+12>>2]=c[q+16+48+12>>2];e=c[b+16>>2]|0;d=e;e=c[e+(k*244|0)+240>>2]|0}h=d;o=+g[d+(k*244|0)+176>>2];p=+g[d+(k*244|0)+180>>2];n=+g[d+(k*244|0)+184>>2];d=e}t=o+ +g[h+(k*244|0)+208>>2];r=p+ +g[h+(k*244|0)+212>>2];p=n+ +g[h+(k*244|0)+216>>2];m=d+304|0;c[m>>2]=(c[m>>2]|0)+1;g[d+372>>2]=t;g[d+376>>2]=r;g[d+380>>2]=p;g[d+384>>2]=0.0;m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;p=+g[m+(k*244|0)+192>>2]+ +g[m+(k*244|0)+224>>2];r=+g[m+(k*244|0)+196>>2]+ +g[m+(k*244|0)+228>>2];t=+g[m+(k*244|0)+200>>2]+ +g[m+(k*244|0)+232>>2];c[s+304>>2]=(c[s+304>>2]|0)+1;g[s+388>>2]=p;g[s+392>>2]=r;g[s+396>>2]=t;g[s+400>>2]=0.0;if(c[f+52>>2]|0){m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;i=m+(k*244|0)|0;c[s+304>>2]=(c[s+304>>2]|0)+1;c[s+4>>2]=c[i>>2];c[s+4+4>>2]=c[i+4>>2];c[s+4+8>>2]=c[i+8>>2];c[s+4+12>>2]=c[i+12>>2];i=m+(k*244|0)+16|0;c[s+20>>2]=c[i>>2];c[s+20+4>>2]=c[i+4>>2];c[s+20+8>>2]=c[i+8>>2];c[s+20+12>>2]=c[i+12>>2];i=m+(k*244|0)+32|0;c[s+36>>2]=c[i>>2];c[s+36+4>>2]=c[i+4>>2];c[s+36+8>>2]=c[i+8>>2];c[s+36+12>>2]=c[i+12>>2];m=m+(k*244|0)+48|0;c[s+52>>2]=c[m>>2];c[s+52+4>>2]=c[m+4>>2];c[s+52+8>>2]=c[m+8>>2];c[s+52+12>>2]=c[m+12>>2]}d=c[b+16>>2]|0;c[(c[d+(k*244|0)+240>>2]|0)+212>>2]=-1;e=c[b+8>>2]|0}k=k+1|0}while((k|0)<(e|0))}if((c[b+28>>2]|0)<0?(c[b+32>>2]|0)<0:0){d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+32>>2]=0}c[b+28>>2]=0;if((c[b+48>>2]|0)<0?(c[b+52>>2]|0)<0:0){d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+52>>2]=0}c[b+48>>2]=0;if((c[b+68>>2]|0)<0?(c[b+72>>2]|0)<0:0){d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+72>>2]=0}c[b+68>>2]=0;if((c[b+88>>2]|0)<0?(c[b+92>>2]|0)<0:0){d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+92>>2]=0}c[b+88>>2]=0;if((c[b+8>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}if((c[b+12>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0;c[b+8>>2]=0;l=q;return 0.0}function Wc(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0;D=l;l=l+560|0;C=D+524|0;c[D>>2]=0;B=D+512+12|0;lw(e)|0;if((A|0)<0){e=-e;y=1;x=19796}else{y=(h&2049|0)!=0&1;x=(h&2048|0)==0?((h&1|0)==0?19797:19802):19799}lw(e)|0;z=A&2146435072;do if(z>>>0<2146435072|(z|0)==2146435072&0<0){p=+dI(e,D)*2.0;if(p!=0.0)c[D>>2]=(c[D>>2]|0)+-1;if((i|32|0)==97){o=(i&32|0)==0?x:x+9|0;n=y|2;do if(!(g>>>0>11|(12-g|0)==0)){e=8.0;j=12-g|0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[o>>0]|0)==45){e=-(e+(-p-e));break}else{e=p+e-e;break}}else e=p;while(0);k=c[D>>2]|0;j=(k|0)<0?0-k|0:k;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((j|0)==(B|0)){a[D+512+11>>0]=48;j=D+512+11|0}a[j+-1>>0]=(k>>31&2)+43;m=j+-2|0;a[m>>0]=i+15;j=D+524|0;do{z=~~e;k=j+1|0;a[j>>0]=d[19831+z>>0]|i&32;e=(e-+(z|0))*16.0;if((k-C|0)==1?!((h&8|0)==0&((g|0)<1&e==0.0)):0){a[k>>0]=46;j=j+2|0}else j=k}while(e!=0.0);C=j-C|0;j=(g|0)!=0&(C+-2|0)<(g|0)?g+2|0:C;un(b,32,f,B-m+n+j|0,h);fA(b,o,n);un(b,48,f,B-m+n+j|0,h^65536);fA(b,D+524|0,C);un(b,48,j-C|0,0,0);fA(b,m,B-m|0);un(b,32,f,B-m+n+j|0,h^8192);j=B-m+n+j|0;break}k=(g|0)<0?6:g;if(p!=0.0){n=(c[D>>2]|0)+-28|0;c[D>>2]=n;e=p*268435456.0}else{e=p;n=c[D>>2]|0}z=(n|0)<0?D+8|0:D+8+288|0;j=z;do{v=~~e>>>0;c[j>>2]=v;j=j+4|0;e=(e-+(v>>>0))*1.0e9}while(e!=0.0);if((n|0)>0){m=z;do{g=(n|0)<29?n:29;n=j+-4|0;if(n>>>0>=m>>>0){o=0;do{u=wu(c[n>>2]|0,0,g|0)|0;u=Ow(u|0,A|0,o|0,0)|0;v=A;t=xs(u|0,v|0,1e9,0)|0;c[n>>2]=t;o=rB(u|0,v|0,1e9,0)|0;n=n+-4|0}while(n>>>0>=m>>>0);if(o){m=m+-4|0;c[m>>2]=o}}while(1){if(j>>>0<=m>>>0)break;n=j+-4|0;if(!(c[n>>2]|0))j=n;else break}n=(c[D>>2]|0)-g|0;c[D>>2]=n}while((n|0)>0)}else m=z;if((n|0)<0)do{g=0-n|0;g=(g|0)<9?g:9;if(m>>>0>>0){o=0;n=m;do{v=c[n>>2]|0;c[n>>2]=(v>>>g)+o;o=P(v&(1<>>g)|0;n=n+4|0}while(n>>>0>>0);m=(c[m>>2]|0)==0?m+4|0:m;if(o){c[j>>2]=o;j=j+4|0}}else m=(c[m>>2]|0)==0?m+4|0:m;n=(i|32|0)==102?z:m;j=(j-n>>2|0)>(((k+25|0)/9|0)+1|0)?n+(((k+25|0)/9|0)+1<<2)|0:j;n=(c[D>>2]|0)+g|0;c[D>>2]=n}while((n|0)<0);if(m>>>0>>0){n=(z-m>>2)*9|0;g=c[m>>2]|0;if(g>>>0<10)s=n;else{o=10;do{o=o*10|0;n=n+1|0}while(g>>>0>=o>>>0);s=n}}else s=0;o=k-((i|32|0)!=102?s:0)+(((k|0)!=0&(i|32|0)==103)<<31>>31)|0;if((o|0)<(((j-z>>2)*9|0)+-9|0)){n=z+4+(((o+9216|0)/9|0)+-1024<<2)|0;if((((o+9216|0)%9|0)+1|0)<9){g=((o+9216|0)%9|0)+1|0;o=10;do{o=o*10|0;g=g+1|0}while((g|0)!=9)}else o=10;q=c[n>>2]|0;r=(q>>>0)%(o>>>0)|0;g=(n+4|0)==(j|0);if(!(g&(r|0)==0)){p=(((q>>>0)/(o>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;v=(o|0)/2|0;e=r>>>0>>0?.5:g&(r|0)==(v|0)?1.0:1.5;if(y){v=(a[x>>0]|0)==45;e=v?-e:e;p=v?-p:p}c[n>>2]=q-r;if(p+e!=p){v=q-r+o|0;c[n>>2]=v;if(v>>>0>999999999)while(1){o=n+-4|0;c[n>>2]=0;if(o>>>0>>0){m=m+-4|0;c[m>>2]=0}v=(c[o>>2]|0)+1|0;c[o>>2]=v;if(v>>>0>999999999)n=o;else{n=o;break}}o=(z-m>>2)*9|0;q=c[m>>2]|0;if(q>>>0>=10){g=10;do{g=g*10|0;o=o+1|0}while(q>>>0>=g>>>0)}}else o=s}else o=s;u=n+4|0;j=j>>>0>u>>>0?u:j;u=m}else{o=s;u=m}v=j;while(1){if(v>>>0<=u>>>0){t=0;break}j=v+-4|0;if(!(c[j>>2]|0))v=j;else{t=1;break}}q=0-o|0;do if((i|32|0)==103){if((o|0)>-5?((((k|0)!=0^1)&1)+k|0)>(o|0):0){n=i+-1|0;k=(((k|0)!=0^1)&1)+k+-1-o|0}else{n=i+-2|0;k=(((k|0)!=0^1)&1)+k+-1|0}if(!(h&8)){if(t?(w=c[v+-4>>2]|0,(w|0)!=0):0)if(!((w>>>0)%10|0)){j=0;m=10;do{m=m*10|0;j=j+1|0}while(!((w>>>0)%(m>>>0)|0|0))}else j=0;else j=9;m=((v-z>>2)*9|0)+-9|0;if((n|32|0)==102){g=m-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}else{g=m+o-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}}else g=h&8}else{n=i;g=h&8}while(0);s=k|g;m=(n|32|0)==102;if(m){r=0;j=(o|0)>0?o:0}else{j=(o|0)<0?q:o;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((B-j|0)<2)do{j=j+-1|0;a[j>>0]=48}while((B-j|0)<2);a[j+-1>>0]=(o>>31&2)+43;j=j+-2|0;a[j>>0]=n;r=j;j=B-j|0}j=y+1+k+((s|0)!=0&1)+j|0;un(b,32,f,j,h);fA(b,x,y);un(b,48,f,j,h^65536);if(m){o=u>>>0>z>>>0?z:u;n=o;do{m=Om(c[n>>2]|0,0,D+524+9|0)|0;if((n|0)==(o|0)){if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}}else if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,D+524+9-m|0);n=n+4|0}while(n>>>0<=z>>>0);if(s|0)fA(b,19847,1);if(n>>>0>>0&(k|0)>0)while(1){m=Om(c[n>>2]|0,0,D+524+9|0)|0;if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0>>0&(k|0)>9)){k=m;break}else k=m}un(b,48,k+9|0,9,0)}else{q=t?v:u+4|0;if((k|0)>-1){g=(g|0)==0;o=u;do{m=Om(c[o>>2]|0,0,D+524+9|0)|0;if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}do if((o|0)==(u|0)){n=m+1|0;fA(b,m,1);if(g&(k|0)<1){m=n;break}fA(b,19847,1);m=n}else{if(m>>>0<=(D+524|0)>>>0)break;Yk(D+524|0,48,m+(0-C)|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}while(0);z=D+524+9-m|0;fA(b,m,(k|0)>(z|0)?z:k);k=k-z|0;o=o+4|0}while(o>>>0>>0&(k|0)>-1)}un(b,48,k+18|0,18,0);fA(b,r,B-r|0)}un(b,32,f,j,h^8192)}else{j=y+3|0;un(b,32,f,j,h&-65537);fA(b,x,y);fA(b,e!=e|0.0!=0.0?(i&32|0?19823:19827):i&32|0?19815:19819,3);un(b,32,f,j,h^8192)}while(0);l=D;return ((j|0)<(f|0)?f:j)|0}function Xc(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;x=l;l=l+64|0;c[x+16>>2]=e;w=x+24+40|0;k=0;j=0;p=0;a:while(1){do if((j|0)>-1)if((k|0)>(2147483647-j|0)){c[7137]=75;j=-1;break}else{j=k+j|0;break}while(0);k=a[e>>0]|0;if(!(k<<24>>24)){v=87;break}else m=e;b:while(1){switch(k<<24>>24){case 37:{k=m;v=9;break b}case 0:{k=m;break b}default:{}}u=m+1|0;c[x+16>>2]=u;k=a[u>>0]|0;m=u}c:do if((v|0)==9)while(1){v=0;if((a[m+1>>0]|0)!=37)break c;k=k+1|0;m=m+2|0;c[x+16>>2]=m;if((a[m>>0]|0)==37)v=9;else break}while(0);k=k-e|0;if(d|0)fA(d,e,k);if(k|0){e=m;continue}n=m+1|0;k=(a[n>>0]|0)+-48|0;if(k>>>0<10){u=(a[m+2>>0]|0)==36;s=u?k:-1;p=u?1:p;n=u?m+3|0:n}else s=-1;c[x+16>>2]=n;k=a[n>>0]|0;d:do if(((k<<24>>24)+-32|0)>>>0<32){m=0;q=k;o=(k<<24>>24)+-32|0;while(1){k=1<>2]=n;k=a[n>>0]|0;o=(k<<24>>24)+-32|0;if(o>>>0>=32)break;else q=k}}else m=0;while(0);if(k<<24>>24==42){o=n+1|0;k=(a[o>>0]|0)+-48|0;if(k>>>0<10?(a[n+2>>0]|0)==36:0){c[i+(k<<2)>>2]=10;k=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;p=1;n=n+3|0}else{if(p|0){j=-1;break}if(d|0){p=(c[f>>2]|0)+(4-1)&~(4-1);k=c[p>>2]|0;c[f>>2]=p+4;p=0;n=o}else{k=0;p=0;n=o}}c[x+16>>2]=n;t=(k|0)<0;k=t?0-k|0:k;t=t?m|8192:m}else{k=gq(x+16|0)|0;if((k|0)<0){j=-1;break}t=m;n=c[x+16>>2]|0}do if((a[n>>0]|0)==46){m=n+1|0;if((a[m>>0]|0)!=42){c[x+16>>2]=m;m=gq(x+16|0)|0;n=c[x+16>>2]|0;break}o=n+2|0;m=(a[o>>0]|0)+-48|0;if(m>>>0<10?(a[n+3>>0]|0)==36:0){c[i+(m<<2)>>2]=10;m=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;n=n+4|0;c[x+16>>2]=n;break}if(p|0){j=-1;break a}if(d|0){u=(c[f>>2]|0)+(4-1)&~(4-1);m=c[u>>2]|0;c[f>>2]=u+4}else m=0;c[x+16>>2]=o;n=o}else m=-1;while(0);r=0;while(1){if(((a[n>>0]|0)+-65|0)>>>0>57){j=-1;break a}u=n+1|0;c[x+16>>2]=u;o=a[(a[n>>0]|0)+-65+(19315+(r*58|0))>>0]|0;if(((o&255)+-1|0)>>>0<8){r=o&255;n=u}else break}if(!(o<<24>>24)){j=-1;break}q=(s|0)>-1;do if(o<<24>>24==19)if(q){j=-1;break a}else v=49;else{if(q){c[i+(s<<2)>>2]=o&255;s=g+(s<<3)|0;v=c[s+4>>2]|0;c[x>>2]=c[s>>2];c[x+4>>2]=v;v=49;break}if(!d){j=0;break a}Ug(x,o&255,f)}while(0);if((v|0)==49?(v=0,(d|0)==0):0){k=0;e=u;continue}n=a[n>>0]|0;n=(r|0)!=0&(n&15|0)==3?n&-33:n;s=t&-65537;t=(t&8192|0)==0?t:s;e:do switch(n|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 1:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 2:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}case 3:{b[c[x>>2]>>1]=j;k=0;e=u;continue a}case 4:{a[c[x>>2]>>0]=j;k=0;e=u;continue a}case 6:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 7:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}default:{k=0;e=u;continue a}}case 112:{n=120;m=m>>>0>8?m:8;e=t|8;v=61;break}case 88:case 120:{e=t;v=61;break}case 111:{e=c[x>>2]|0;n=c[x+4>>2]|0;s=sr(e,n,w)|0;r=s;o=0;q=19779;m=(t&8|0)==0|(m|0)>(w-s|0)?m:w-s+1|0;s=t;v=67;break}case 105:case 100:{e=c[x>>2]|0;n=c[x+4>>2]|0;if((n|0)<0){e=sw(0,0,e|0,n|0)|0;n=A;c[x>>2]=e;c[x+4>>2]=n;o=1;q=19779;v=66;break e}else{o=(t&2049|0)!=0&1;q=(t&2048|0)==0?((t&1|0)==0?19779:19781):19780;v=66;break e}}case 117:{o=0;q=19779;e=c[x>>2]|0;n=c[x+4>>2]|0;v=66;break}case 99:{a[x+24+39>>0]=c[x>>2];e=x+24+39|0;o=0;q=19779;r=w;n=1;m=s;break}case 109:{n=pI(c[7137]|0)|0;v=71;break}case 115:{n=c[x>>2]|0;n=n|0?n:19789;v=71;break}case 67:{c[x+8>>2]=c[x>>2];c[x+8+4>>2]=0;c[x>>2]=x+8;r=-1;n=x+8|0;v=75;break}case 83:{e=c[x>>2]|0;if(!m){un(d,32,k,0,t);e=0;v=84}else{r=m;n=e;v=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{k=Wc(d,+h[x>>3],k,m,t,n)|0;e=u;continue a}default:{o=0;q=19779;r=w;n=m;m=t}}while(0);f:do if((v|0)==61){y=c[x>>2]|0;t=c[x+4>>2]|0;r=qq(y,t,w,n&32)|0;q=(e&8|0)==0|(y|0)==0&(t|0)==0;o=q?0:2;q=q?19779:19779+(n>>4)|0;s=e;e=y;n=t;v=67}else if((v|0)==66){r=Om(e,n,w)|0;s=t;v=67}else if((v|0)==71){v=0;y=Kj(n,m)|0;e=n;o=0;q=19779;r=(y|0)==0?n+m|0:y;n=(y|0)==0?m:y-n|0;m=s}else if((v|0)==75){v=0;q=n;e=0;m=0;while(1){o=c[q>>2]|0;if(!o)break;m=OA(x+20|0,o)|0;if((m|0)<0|m>>>0>(r-e|0)>>>0)break;e=m+e|0;if(r>>>0>e>>>0)q=q+4|0;else break}if((m|0)<0){j=-1;break a}un(d,32,k,e,t);if(!e){e=0;v=84}else{o=0;while(1){m=c[n>>2]|0;if(!m){v=84;break f}m=OA(x+20|0,m)|0;o=m+o|0;if((o|0)>(e|0)){v=84;break f}fA(d,x+20|0,m);if(o>>>0>=e>>>0){v=84;break}else n=n+4|0}}}while(0);if((v|0)==67){v=0;n=(e|0)!=0|(n|0)!=0;y=(m|0)!=0|n;n=((n^1)&1)+(w-r)|0;e=y?r:w;r=w;n=y?((m|0)>(n|0)?m:n):m;m=(m|0)>-1?s&-65537:s}else if((v|0)==84){v=0;un(d,32,k,e,t^8192);k=(k|0)>(e|0)?k:e;e=u;continue}t=r-e|0;s=(n|0)<(t|0)?t:n;y=s+o|0;k=(k|0)<(y|0)?y:k;un(d,32,k,y,m);fA(d,q,o);un(d,48,k,y,m^65536);un(d,48,s,t,0);fA(d,e,t);un(d,32,k,y,m^8192);e=u}g:do if((v|0)==87)if(!d)if(!p)j=0;else{j=1;while(1){e=c[i+(j<<2)>>2]|0;if(!e){k=0;break}Ug(g+(j<<3)|0,e,f);j=j+1|0;if((j|0)>=10){j=1;break g}}while(1){e=j+1|0;if(k|0){j=-1;break g}if((e|0)>=10){j=1;break g}j=e;k=c[i+(e<<2)>>2]|0}}while(0);l=x;return j|0}function Yc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0;u=l;l=l+672|0;c[u+448+8>>2]=0;c[u+448+12>>2]=-1;m=u+448+28|0;c[u+448>>2]=7020;c[u+448+4>>2]=8;c[u+448+16>>2]=1065353216;c[u+448+20>>2]=1065353216;c[u+448+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;g[u+384>>2]=1.0;m=u+384+4|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;g[u+384+20>>2]=1.0;n=u+384+24|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[u+384+40>>2]=1.0;g[u+384+44>>2]=0.0;c[u+384+48>>2]=c[a>>2];c[u+384+48+4>>2]=c[a+4>>2];c[u+384+48+8>>2]=c[a+8>>2];c[u+384+48+12>>2]=c[a+12>>2];a=e;k=a+36|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(k|0));c[u+504>>2]=b;c[u+504+4>>2]=u+448;w=+g[d>>2];v=+g[d+16>>2];f=+g[d+32>>2];h=+g[d+4>>2];i=+g[d+20>>2];j=+g[d+36>>2];s=+g[d+8>>2];q=+g[d+24>>2];o=+g[d+40>>2];g[u+504+8>>2]=w+v*0.0+f*0.0;g[u+504+12>>2]=h+i*0.0+j*0.0;g[u+504+16>>2]=s+q*0.0+o*0.0;g[u+504+20>>2]=0.0;g[u+504+24>>2]=w*0.0+v+f*0.0;g[u+504+28>>2]=h*0.0+i+j*0.0;g[u+504+32>>2]=s*0.0+q+o*0.0;g[u+504+36>>2]=0.0;g[u+504+40>>2]=w*0.0+v*0.0+f;g[u+504+44>>2]=h*0.0+i*0.0+j;g[u+504+48>>2]=s*0.0+q*0.0+o;g[u+504+52>>2]=0.0;o=+g[u+384+48>>2]-+g[d+48>>2];q=+g[u+384+52>>2]-+g[d+52>>2];s=+g[u+384+56>>2]-+g[d+56>>2];G=+g[u+384>>2];F=+g[u+384+16>>2];E=+g[u+384+32>>2];C=+g[m>>2];B=+g[u+384+20>>2];A=+g[u+384+36>>2];z=+g[u+384+8>>2];y=+g[n>>2];x=+g[u+384+40>>2];p=+g[d+8>>2];r=+g[d+24>>2];t=+g[d+40>>2];g[u+504+56>>2]=w*G+v*F+f*E;g[u+504+60>>2]=w*C+v*B+f*A;g[u+504+64>>2]=w*z+v*y+f*x;g[u+504+68>>2]=0.0;g[u+504+72>>2]=G*h+F*i+E*j;g[u+504+76>>2]=C*h+B*i+A*j;g[u+504+80>>2]=z*h+y*i+x*j;g[u+504+84>>2]=0.0;g[u+504+88>>2]=G*p+F*r+E*t;g[u+504+92>>2]=C*p+B*r+A*t;g[u+504+96>>2]=z*p+y*r+x*t;g[u+504+100>>2]=0.0;g[u+504+104>>2]=o*w+q*v+s*f;g[u+504+108>>2]=o*h+q*i+s*j;g[u+504+112>>2]=o*p+q*r+s*t;g[u+504+116>>2]=0.0;c[u+504+120>>2]=80;c[u+504+124>>2]=0;c[u+364>>2]=0;c[u+128>>2]=0;c[u+128+4>>2]=0;c[u+128+8>>2]=0;c[u+128+12>>2]=0;c[u+376>>2]=2;c[u+368>>2]=0;g[u+144>>2]=0.0;c[u+648>>2]=1065353216;c[u+648+4>>2]=1065353216;c[u+648+8>>2]=1065353216;g[u+648+12>>2]=0.0;switch(Jc(u,u+504|0,u+648|0)|0){case 0:{a=c[u+372>>2]|0;if(!(c[a+32>>2]|0)){j=0.0;i=0.0;f=0.0;r=0.0;q=0.0;h=0.0}else{n=0;f=0.0;i=0.0;j=0.0;h=0.0;q=0.0;r=0.0;do{t=+g[a+16+(n<<2)>>2];k=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;m=(c[u+504>>2]|0)+(H>>1)|0;if(H&1)k=c[(c[m>>2]|0)+k>>2]|0;Sb[k&127](u+648|0,m,c[a+(n<<2)>>2]|0);f=f+t*+g[u+648>>2];i=i+t*+g[u+648+4>>2];j=j+t*+g[u+648+8>>2];a=c[(c[u+372>>2]|0)+(n<<2)>>2]|0;o=-+g[a>>2];p=-+g[a+4>>2];s=-+g[a+8>>2];a=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;k=(c[u+504+4>>2]|0)+(H>>1)|0;if(H&1)a=c[(c[k>>2]|0)+a>>2]|0;F=+g[u+504+24>>2]*o+ +g[u+504+28>>2]*p+ +g[u+504+32>>2]*s;E=+g[u+504+40>>2]*o+ +g[u+504+44>>2]*p+ +g[u+504+48>>2]*s;g[u+632>>2]=+g[u+504+8>>2]*o+ +g[u+504+12>>2]*p+ +g[u+504+16>>2]*s;g[u+632+4>>2]=F;g[u+632+8>>2]=E;g[u+632+12>>2]=0.0;Sb[a&127](u+648|0,k,u+632|0);E=+g[u+648>>2];F=+g[u+648+4>>2];G=+g[u+648+8>>2];h=h+t*(E*+g[u+504+56>>2]+F*+g[u+504+60>>2]+G*+g[u+504+64>>2]+ +g[u+504+104>>2]);q=q+t*(E*+g[u+504+72>>2]+F*+g[u+504+76>>2]+G*+g[u+504+80>>2]+ +g[u+504+108>>2]);r=r+t*(E*+g[u+504+88>>2]+F*+g[u+504+92>>2]+G*+g[u+504+96>>2]+ +g[u+504+112>>2]);n=n+1|0;a=c[u+372>>2]|0}while(n>>>0<(c[a+32>>2]|0)>>>0)}s=f*+g[d>>2]+i*+g[d+4>>2]+j*+g[d+8>>2]+ +g[d+48>>2];t=f*+g[d+16>>2]+i*+g[d+20>>2]+j*+g[d+24>>2]+ +g[d+52>>2];j=f*+g[d+32>>2]+i*+g[d+36>>2]+j*+g[d+40>>2]+ +g[d+56>>2];g[e+4>>2]=s;g[e+8>>2]=t;g[e+12>>2]=j;g[e+16>>2]=0.0;o=h*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2]+ +g[d+48>>2];p=h*+g[d+16>>2]+q*+g[d+20>>2]+r*+g[d+24>>2]+ +g[d+52>>2];i=h*+g[d+32>>2]+q*+g[d+36>>2]+r*+g[d+40>>2]+ +g[d+56>>2];g[e+20>>2]=o;g[e+24>>2]=p;g[e+28>>2]=i;g[e+32>>2]=0.0;switch(c[b+4>>2]|0){case 8:{f=+g[b+32>>2]*+g[b+16>>2];break}case 0:{f=+g[b+48>>2];break}case 1:{f=+g[b+48>>2];break}case 13:{f=+g[b+48>>2];break}case 11:{f=+g[b+48>>2];break}case 10:{f=+g[b+48>>2];break}case 4:case 5:{f=+g[b+48>>2];break}default:f=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}switch(c[u+448+4>>2]|0){case 8:{h=+g[u+448+32>>2]*+g[u+448+16>>2];break}case 0:{h=+g[u+448+48>>2];break}case 1:{h=+g[u+448+48>>2];break}case 13:{h=+g[u+448+48>>2];break}case 11:{h=+g[u+448+48>>2];break}case 10:{h=+g[u+448+48>>2];break}case 4:case 5:{h=+g[u+448+48>>2];break}default:h=+nb[c[(c[u+448>>2]|0)+48>>2]&15](u+448|0)}G=f+h;F=+D(+((o-s)*(o-s)+(p-t)*(p-t)+(i-j)*(i-j)));g[e+36>>2]=(o-s)*(1.0/F);g[e+40>>2]=(p-t)*(1.0/F);g[e+44>>2]=(i-j)*(1.0/F);g[e+48>>2]=0.0;g[e+4>>2]=G*(o-s)*(1.0/F)+ +g[e+4>>2];g[e+8>>2]=G*(p-t)*(1.0/F)+ +g[e+8>>2];g[e+12>>2]=G*(i-j)*(1.0/F)+ +g[e+12>>2];G=F-G;l=u;return +G}case 1:{if(!(Hc(b,d,u+448|0,u+384|0,u+128|0,e,1)|0)){G=3402823466385288598117041.0e14;l=u;return +G}f=+g[e+4>>2]-+g[e+20>>2];h=+g[e+8>>2]-+g[e+24>>2];i=+g[e+12>>2]-+g[e+28>>2];j=+D(+(f*f+h*h+i*i));if(j>=1.1920928955078125e-07){g[e+36>>2]=f*(1.0/j);g[e+40>>2]=h*(1.0/j);g[e+44>>2]=i*(1.0/j);g[e+48>>2]=0.0}G=-j;l=u;return +G}default:{G=3402823466385288598117041.0e14;l=u;return +G}}return 0.0}function Zc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)!=0:0){r=+g[b+116>>2];h=+g[e>>2];I=+g[b+132>>2];f=+g[e+4>>2];J=+g[b+148>>2];y=+g[e+8>>2];s=+g[b+120>>2];G=+g[b+136>>2];H=+g[b+152>>2];t=+g[b+124>>2];F=+g[b+140>>2];u=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];z=+g[e+24>>2];E=+g[e+32>>2];v=+g[e+36>>2];A=+g[e+40>>2];m=+g[b+164>>2];i=+g[b+168>>2];D=+g[b+172>>2];C=+g[e+48>>2]+(h*m+f*i+y*D);B=w*m+x*i+z*D+ +g[e+52>>2];D=E*m+v*i+A*D+ +g[e+56>>2];g[b+824>>2]=r*h+I*f+J*y;g[b+828>>2]=h*s+f*G+y*H;g[b+832>>2]=h*t+f*F+y*u;g[b+836>>2]=0.0;g[b+840>>2]=r*w+I*x+J*z;g[b+844>>2]=s*w+G*x+H*z;g[b+848>>2]=t*w+F*x+u*z;g[b+852>>2]=0.0;g[b+856>>2]=r*E+I*v+J*A;g[b+860>>2]=s*E+G*v+H*A;g[b+864>>2]=t*E+F*v+u*A;g[b+868>>2]=0.0;g[b+872>>2]=C;g[b+876>>2]=B;g[b+880>>2]=D;g[b+884>>2]=0.0;D=+g[b+52>>2];B=+g[d>>2];C=+g[b+68>>2];A=+g[d+4>>2];u=+g[b+84>>2];v=+g[d+8>>2];F=+g[b+56>>2];E=+g[b+72>>2];t=+g[b+88>>2];H=+g[b+60>>2];G=+g[b+76>>2];s=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];r=+g[d+24>>2];z=+g[d+32>>2];x=+g[d+36>>2];w=+g[d+40>>2];y=+g[b+100>>2];f=+g[b+104>>2];h=+g[b+108>>2];k=b+856|0;l=b+840|0;i=J*y+I*f+r*h;m=H*z+G*x+s*w;n=F*z+E*x+t*w;o=D*z+C*x+u*w;p=H*J+G*I+s*r;q=F*J+E*I+t*r;r=D*J+C*I+u*r;s=B*H+A*G+v*s;t=B*F+A*E+v*t;u=D*B+C*A+u*v;v=B*y+A*f+v*h;f=z*y+x*f;h=w*h}else{r=+g[b+52>>2];h=+g[d>>2];x=+g[b+68>>2];f=+g[d+4>>2];w=+g[b+84>>2];H=+g[d+8>>2];s=+g[b+56>>2];z=+g[b+72>>2];y=+g[b+88>>2];t=+g[b+60>>2];A=+g[b+76>>2];u=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];G=+g[d+24>>2];B=+g[d+32>>2];v=+g[d+36>>2];F=+g[d+40>>2];m=+g[b+100>>2];i=+g[b+104>>2];C=+g[b+108>>2];D=+g[d+48>>2]+(h*m+f*i+H*C);E=J*m+I*i+G*C+ +g[d+52>>2];C=B*m+v*i+F*C+ +g[d+56>>2];g[b+824>>2]=r*h+x*f+w*H;g[b+828>>2]=h*s+f*z+H*y;g[b+832>>2]=h*t+f*A+H*u;g[b+836>>2]=0.0;g[b+840>>2]=r*J+x*I+w*G;g[b+844>>2]=s*J+z*I+y*G;g[b+848>>2]=t*J+A*I+u*G;g[b+852>>2]=0.0;g[b+856>>2]=r*B+x*v+w*F;g[b+860>>2]=s*B+z*v+y*F;g[b+864>>2]=t*B+A*v+u*F;g[b+868>>2]=0.0;g[b+872>>2]=D;g[b+876>>2]=E;g[b+880>>2]=C;g[b+884>>2]=0.0;C=+g[b+116>>2];E=+g[e>>2];D=+g[b+132>>2];F=+g[e+4>>2];u=+g[b+148>>2];v=+g[e+8>>2];A=+g[b+120>>2];B=+g[b+136>>2];t=+g[b+152>>2];y=+g[b+124>>2];z=+g[b+140>>2];s=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];r=+g[e+24>>2];G=+g[e+32>>2];I=+g[e+36>>2];J=+g[e+40>>2];H=+g[b+164>>2];f=+g[b+168>>2];h=+g[b+172>>2];k=b+856|0;l=b+840|0;i=w*H+x*f+r*h;m=y*G+z*I+s*J;n=A*G+B*I+t*J;o=C*G+D*I+u*J;p=y*w+z*x+s*r;q=A*w+B*x+t*r;r=C*w+D*x+u*r;s=E*y+F*z+v*s;t=E*A+F*B+v*t;u=C*E+D*F+u*v;v=E*H+F*f+v*h;d=e;f=G*H+I*f;h=J*h}J=v+ +g[d+48>>2];i=i+ +g[d+52>>2];f=h+f+ +g[d+56>>2];g[b+888>>2]=u;g[b+892>>2]=t;g[b+896>>2]=s;g[b+900>>2]=0.0;g[b+904>>2]=r;g[b+908>>2]=q;g[b+912>>2]=p;g[b+916>>2]=0.0;g[b+920>>2]=o;g[b+924>>2]=n;g[b+928>>2]=m;g[b+932>>2]=0.0;g[b+936>>2]=J;g[b+940>>2]=i;g[b+944>>2]=f;g[b+948>>2]=0.0;c[b+968>>2]=c[b+872>>2];c[b+968+4>>2]=c[b+872+4>>2];c[b+968+8>>2]=c[b+872+8>>2];c[b+968+12>>2]=c[b+872+12>>2];c[b+984>>2]=c[b+936>>2];c[b+984+4>>2]=c[b+936+4>>2];c[b+984+8>>2]=c[b+936+8>>2];c[b+984+12>>2]=c[b+936+12>>2];d=c[b+824>>2]|0;e=c[l>>2]|0;l=c[k>>2]|0;c[b+952>>2]=d;c[b+956>>2]=e;c[b+960>>2]=l;g[b+964>>2]=0.0;f=(c[j>>2]=d,+g[j>>2]);h=(c[j>>2]=e,+g[j>>2]);i=(c[j>>2]=l,+g[j>>2]);if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)==0:0){l=b+984|0;k=b+968|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}l=b+968|0;k=b+984|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}function _c(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0;if((d|0)<=1){x=0;return x|0}w=c[b+772>>2]|0;x=P(w,w)|0;x=$I(x>>>0>1073741823?-1:x<<2)|0;if((w|0)>0){h=0;do{i=P(h,w)|0;f=0;do{p=x+((P(f,w)|0)+h<<2)|0;t=(f|0)==(h|0)?0:2147483647;c[p>>2]=t;c[x+(f+i<<2)>>2]=t;f=f+1|0}while((f|0)!=(w|0));h=h+1|0}while((h|0)!=(w|0))}h=c[b+792>>2]|0;if((h|0)>0){i=c[b+800>>2]|0;j=c[b+780>>2]|0;f=0;do{p=((c[i+(f*52|0)+24>>2]|0)-j|0)/104|0;t=((c[i+(f*52|0)+28>>2]|0)-j|0)/104|0;c[x+((P(t,w)|0)+p<<2)>>2]=1;c[x+((P(p,w)|0)+t<<2)>>2]=1;f=f+1|0}while((f|0)!=(h|0))}do if((d|0)!=2)if((w|0)>0){f=0;do{k=P(f,w)|0;h=0;do{i=h;h=h+1|0;if((h|0)<(w|0)){n=P(i,w)|0;l=x+(n+f<<2)|0;j=h;do{m=(c[l>>2]|0)+(c[x+(j+k<<2)>>2]|0)|0;o=x+(j+n<<2)|0;if((c[o>>2]|0)>>>0>m>>>0){c[x+((P(j,w)|0)+i<<2)>>2]=m;c[o>>2]=m}j=j+1|0}while((j|0)!=(w|0))}}while((h|0)!=(w|0));f=f+1|0}while((f|0)!=(w|0));q=79}else f=0;else{if((w|0)<0)gb();if(!w)t=0;else{c[6995]=(c[6995]|0)+1;f=sc((w*20|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=0;do{a[f+(h*20|0)+16>>0]=1;t=f+(h*20|0)+4|0;h=h+1|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0}while((h|0)!=(w|0));t=f}if((c[b+792>>2]|0)>0){n=0;do{m=c[b+800>>2]|0;p=c[b+780>>2]|0;o=((c[m+(n*52|0)+24>>2]|0)-p|0)/104|0;p=((c[m+(n*52|0)+28>>2]|0)-p|0)/104|0;m=t+(o*20|0)+4|0;f=c[m>>2]|0;a:do if((f|0)>0){i=c[t+(o*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(p|0))break;h=h+1|0;if((h|0)>=(f|0)){q=34;break a}}if((h|0)==(f|0))q=34}else q=34;while(0);if((q|0)==34){q=0;l=t+(o*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(o*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(o*20|0)+16|0;else q=44;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=44}if((q|0)==44){q=0;f=t+(o*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=r}c[(c[t+(o*20|0)+12>>2]|0)+(f<<2)>>2]=p;c[m>>2]=(c[m>>2]|0)+1}m=t+(p*20|0)+4|0;f=c[m>>2]|0;b:do if((f|0)>0){i=c[t+(p*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(o|0))break;h=h+1|0;if((h|0)>=(f|0)){q=54;break b}}if((h|0)==(f|0))q=54}else q=54;while(0);if((q|0)==54){q=0;l=t+(p*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(s=f|0?f<<1:1,(f|0)<(s|0)):0){if(!s)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(p*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(p*20|0)+16|0;else q=64;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=64}if((q|0)==64){q=0;f=t+(p*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=s}c[(c[t+(p*20|0)+12>>2]|0)+(f<<2)>>2]=o;c[m>>2]=(c[m>>2]|0)+1}n=n+1|0}while((n|0)<(c[b+792>>2]|0))}if((w|0)<=0){if(!t){f=0;break}}else{o=0;do{q=t+(o*20|0)+4|0;f=c[q>>2]|0;if((f|0)>0){r=P(o,w)|0;p=c[t+(o*20|0)+12>>2]|0;n=0;do{l=c[p+(n<<2)>>2]|0;m=t+(l*20|0)+4|0;h=c[m>>2]|0;if((h|0)>0){k=x+((P(l,w)|0)+o<<2)|0;j=c[t+(l*20|0)+12>>2]|0;i=0;f=h;do{h=c[j+(i<<2)>>2]|0;if((o|0)!=(h|0)?(v=P(h,w)|0,u=(c[x+(v+l<<2)>>2]|0)+(c[k>>2]|0)|0,v=x+(v+o<<2)|0,(c[v>>2]|0)>>>0>u>>>0):0){c[x+(h+r<<2)>>2]=u;c[v>>2]=u;f=c[m>>2]|0}i=i+1|0}while((i|0)<(f|0));f=c[q>>2]|0}n=n+1|0}while((n|0)<(f|0))}o=o+1|0}while((o|0)!=(w|0));f=0;do{i=t+(f*20|0)+4|0;j=t+(f*20|0)+12|0;k=c[j>>2]|0;h=t+(f*20|0)+16|0;if(k|0){if(a[h>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[h>>0]=1;c[j>>2]=0;c[i>>2]=0;c[t+(f*20|0)+8>>2]=0;f=f+1|0}while((f|0)!=(w|0))}c[6996]=(c[6996]|0)+1;Cd(c[t+-4>>2]|0);q=79}while(0);if((q|0)==79)if((w|0)>0){f=0;k=0;do{i=k;k=k+1|0;if((k|0)<(w|0)){j=P(i,w)|0;h=k;do{if((c[x+(h+j<<2)>>2]|0)==(d|0)){t=c[b+780>>2]|0;Xh(b,e);v=(c[b+792>>2]|0)+-1|0;u=c[b+800>>2]|0;c[u+(v*52|0)+24>>2]=t+(h*104|0);c[u+(v*52|0)+28>>2]=t+(i*104|0);A=+g[t+(h*104|0)+8>>2]-+g[t+(i*104|0)+8>>2];z=+g[t+(h*104|0)+12>>2]-+g[t+(i*104|0)+12>>2];y=+g[t+(h*104|0)+16>>2]-+g[t+(i*104|0)+16>>2];g[u+(v*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[b+984>>0]=1;v=(c[b+800>>2]|0)+(v*52|0)+36|0;a[v>>0]=a[v>>0]|1;f=f+1|0}h=h+1|0}while((h|0)!=(w|0))}}while((k|0)!=(w|0))}else f=0;aJ(x);x=f;return x|0}function $c(b,d,e){b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0,s=0;s=l;l=l+112|0;j=c[b+776>>2]|0;if((j|0)==(c[b+772>>2]|0)){a:do if(j){i=c[b+780>>2]|0;if((j|0)>0){f=0;h=i;while(1){h=c[h+(f*104|0)+96>>2]|0;if(h|0)c[h+36>>2]=f;f=f+1|0;if((f|0)==(j|0)){o=i;break a}h=c[b+780>>2]|0}}else o=i}else o=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=c[(c[b+820>>2]|0)+(f*44|0)+40>>2]|0;if(i|0)c[i+36>>2]=f;f=f+1|0}while((f|0)!=(h|0))}h=c[b+852>>2]|0;if((h|0)>0){i=c[b+860>>2]|0;f=0;do{p=i+(f*96|0)|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}k=c[b+752>>2]|0;if((k|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=((c[f>>2]|0)-o|0)/104|0;h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(k|0))}if((j|0)<(j<<1|1|0)){c[6995]=(c[6995]|0)+1;f=sc(((j<<1|1)*104|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[b+772>>2]|0;if((h|0)>0){f=0;do{o=i+(f*104|0)|0;k=(c[b+780>>2]|0)+(f*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));f=f+1|0}while((f|0)!=(h|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=j<<1|1;j=c[b+772>>2]|0}b:do if(j){k=c[b+780>>2]|0;if((j|0)>0){f=0;h=k;while(1){i=c[h+(f*104|0)+96>>2]|0;if(i|0)c[i+36>>2]=h+(f*104|0);f=f+1|0;if((f|0)==(j|0))break b;h=c[b+780>>2]|0}}}else k=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=k+((c[p>>2]|0)*104|0);p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=c[b+820>>2]|0;j=c[i+(f*44|0)+40>>2]|0;if(j|0)c[j+36>>2]=i+(f*44|0);f=f+1|0}while((f|0)!=(h|0))}i=c[b+852>>2]|0;if((i|0)>0){h=c[b+860>>2]|0;f=0;do{p=h+(f*96|0)|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(i|0))}j=c[b+752>>2]|0;if((j|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=k+((c[f>>2]|0)*104|0);h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(j|0))}}o=c[b+192>>2]|0;q=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=s;p=o+100|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));f=c[b+772>>2]|0;if((f|0)==(c[b+776>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((r*104|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+772>>2]|0}if((f|0)>0){h=0;do{o=i+(h*104|0)|0;k=(c[b+780>>2]|0)+(h*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=h+1|0}while((h|0)!=(f|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=r;f=c[b+772>>2]|0}o=c[b+780>>2]|0;c[o+(f*104|0)>>2]=0;o=o+(f*104|0)+4|0;k=s;p=o+100|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=c[b+772>>2]|0;c[b+772>>2]=h+1;i=c[b+780>>2]|0;o=i+(h*104|0)|0;p=o+104|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[i+(h*104|0)+8>>2]=c[d>>2];c[i+(h*104|0)+8+4>>2]=c[d+4>>2];c[i+(h*104|0)+8+8>>2]=c[d+8>>2];c[i+(h*104|0)+8+12>>2]=c[d+12>>2];$p(i+(h*104|0)+24|0,d|0,16)|0;g[i+(h*104|0)+88>>2]=e>0.0?1.0/e:0.0;c[i+(h*104|0)+4>>2]=c[c[b+940>>2]>>2];e=+g[i+(h*104|0)+8>>2];m=+g[i+(h*104|0)+12>>2];n=+g[i+(h*104|0)+16>>2];f=c[b+992>>2]|0;if(f|0){c[b+992>>2]=0;d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}o=f;p=o+44|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}function ad(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0;s=l;l=l+752|0;c[s+136+8>>2]=0;c[s+136+12>>2]=-1;q=s+136+28|0;c[s+136>>2]=7020;c[s+136+4>>2]=8;c[s+136+16>>2]=1065353216;c[s+136+20>>2]=1065353216;c[s+136+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;q=c[e+4>>2]|0;r=c[e+12>>2]|0;h=c[q+4>>2]|0;if((h|0)<20){c[s+568>>2]=3896;c[s+568+168>>2]=0;g[s+568+172>>2]=0.0;c[s+568+164>>2]=c[f+4>>2];g[s+208+308>>2]=9.999999747378752e-05;a[s+208+332>>0]=0;c[s+192>>2]=5276;c[s+192+4>>2]=s+208;c[s+192+8>>2]=s+136;c[s+192+12>>2]=q;c[s+120>>2]=9484;c[s+120+4>>2]=s+208;c[s+120+8>>2]=s+136;c[s+120+12>>2]=q;q=(c[f+20>>2]&8|0)==0?s+192|0:s+120|0;if((Eb[c[(c[q>>2]|0)+8>>2]&3](q,b,d,r,r,s+568|0)|0?(i=s+568+132|0,j=+g[i>>2],k=+g[s+568+136>>2],m=+g[s+568+140>>2],j*j+k*k+m*m>9.999999747378752e-05):0)?(n=+g[s+568+164>>2],n<+g[f+4>>2]):0){p=1.0/+D(+(j*j+k*k+m*m));g[i>>2]=j*p;g[s+568+136>>2]=k*p;g[s+568+140>>2]=m*p;c[s>>2]=c[e+8>>2];c[s+4>>2]=0;c[s+8>>2]=c[i>>2];c[s+8+4>>2]=c[i+4>>2];c[s+8+8>>2]=c[i+8>>2];c[s+8+12>>2]=c[i+12>>2];g[s+24>>2]=n;+qb[c[(c[f>>2]|0)+12>>2]&31](f,s,1)}l=s;return}if((h+-21|0)>>>0>=9){if((h|0)!=31){l=s;return}h=c[q+68>>2]|0;e=c[e+8>>2]|0;c[s+568>>2]=6072;c[s+568+4>>2]=e;c[s+568+8>>2]=q;c[s+568+12>>2]=r;c[s+568+16>>2]=b;c[s+568+20>>2]=d;c[s+568+24>>2]=f;if(!h){i=c[q+20>>2]|0;if((i|0)>0){h=0;do{Wf(s+568|0,h);h=h+1|0}while((h|0)<(i|0))}}else{j=+g[r+48>>2];B=+g[b+48>>2]-j;m=+g[r+52>>2];A=+g[b+52>>2]-m;o=+g[r+56>>2];z=+g[b+56>>2]-o;y=+g[r>>2];x=+g[r+16>>2];w=+g[r+32>>2];v=+g[r+4>>2];u=+g[r+20>>2];t=+g[r+36>>2];k=+g[r+8>>2];n=+g[r+24>>2];p=+g[r+40>>2];g[s+208>>2]=B*y+A*x+z*w;g[s+208+4>>2]=B*v+A*u+z*t;g[s+208+8>>2]=B*k+A*n+z*p;g[s+208+12>>2]=0.0;j=+g[d+48>>2]-j;m=+g[d+52>>2]-m;o=+g[d+56>>2]-o;g[s+192>>2]=j*y+m*x+o*w;g[s+192+4>>2]=j*v+m*u+o*t;g[s+192+8>>2]=j*k+m*n+o*p;g[s+192+12>>2]=0.0;Ue(c[h>>2]|0,s+208|0,s+192|0,s+568|0)}l=s;return}F=+g[r>>2];E=+g[r+16>>2];n=+g[r+32>>2];C=+g[r+4>>2];t=+g[r+20>>2];o=+g[r+36>>2];x=+g[r+8>>2];z=+g[r+24>>2];B=+g[r+40>>2];u=-+g[r+48>>2];v=-+g[r+52>>2];w=-+g[r+56>>2];A=+g[b+48>>2];y=+g[b+52>>2];m=+g[b+56>>2];j=F*u+E*v+n*w+(F*A+E*y+n*m);k=C*u+t*v+o*w+(C*A+t*y+o*m);m=x*u+z*v+B*w+(x*A+z*y+B*m);g[s+120>>2]=j;g[s+120+4>>2]=k;g[s+120+8>>2]=m;g[s+120+12>>2]=0.0;y=+g[d+48>>2];A=+g[d+52>>2];p=+g[d+56>>2];n=F*u+E*v+n*w+(F*y+E*A+n*p);o=C*u+t*v+o*w+(C*y+t*A+o*p);p=x*u+z*v+B*w+(x*y+z*A+B*p);if((c[q+4>>2]|0)==21){h=c[e+8>>2]|0;e=c[f+20>>2]|0;c[s+4>>2]=c[s+120>>2];c[s+4+4>>2]=c[s+120+4>>2];c[s+4+8>>2]=c[s+120+8>>2];c[s+4+12>>2]=c[s+120+12>>2];g[s+20>>2]=n;g[s+24>>2]=o;g[s+28>>2]=p;g[s+32>>2]=0.0;c[s+36>>2]=e;g[s+40>>2]=1.0;c[s>>2]=6024;c[s+44>>2]=f;c[s+48>>2]=h;c[s+52>>2]=q;c[s+56>>2]=c[r>>2];c[s+56+4>>2]=c[r+4>>2];c[s+56+8>>2]=c[r+8>>2];c[s+56+12>>2]=c[r+12>>2];c[s+72>>2]=c[r+16>>2];c[s+72+4>>2]=c[r+16+4>>2];c[s+72+8>>2]=c[r+16+8>>2];c[s+72+12>>2]=c[r+16+12>>2];c[s+88>>2]=c[r+32>>2];c[s+88+4>>2]=c[r+32+4>>2];c[s+88+8>>2]=c[r+32+8>>2];c[s+88+12>>2]=c[r+32+12>>2];c[s+104>>2]=c[r+48>>2];c[s+104+4>>2]=c[r+48+4>>2];c[s+104+8>>2]=c[r+48+8>>2];c[s+104+12>>2]=c[r+48+12>>2];c[s+40>>2]=c[f+4>>2];h=c[q+52>>2]|0;c[s+192>>2]=7232;c[s+192+4>>2]=h;c[s+192+8>>2]=s;h=c[q+56>>2]|0;c[s+568>>2]=0;c[s+568+4>>2]=0;c[s+568+8>>2]=0;c[s+568+12>>2]=0;c[s+208>>2]=0;c[s+208+4>>2]=0;c[s+208+8>>2]=0;c[s+208+12>>2]=0;if(!(a[h+60>>0]|0))Re(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0);else ue(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0,c[h+56>>2]|0)}else{e=c[e+8>>2]|0;d=c[f+20>>2]|0;g[s+568+4>>2]=j;g[s+568+8>>2]=k;g[s+568+12>>2]=m;g[s+568+16>>2]=0.0;g[s+568+20>>2]=n;g[s+568+24>>2]=o;g[s+568+28>>2]=p;g[s+568+32>>2]=0.0;c[s+568+36>>2]=d;g[s+568+40>>2]=1.0;c[s+568>>2]=6048;c[s+568+44>>2]=f;c[s+568+48>>2]=e;c[s+568+52>>2]=q;c[s+568+56>>2]=c[r>>2];c[s+568+56+4>>2]=c[r+4>>2];c[s+568+56+8>>2]=c[r+8>>2];c[s+568+56+12>>2]=c[r+12>>2];c[s+568+72>>2]=c[r+16>>2];c[s+568+72+4>>2]=c[r+16+4>>2];c[s+568+72+8>>2]=c[r+16+8>>2];c[s+568+72+12>>2]=c[r+16+12>>2];c[s+568+88>>2]=c[r+32>>2];c[s+568+88+4>>2]=c[r+32+4>>2];c[s+568+88+8>>2]=c[r+32+8>>2];c[s+568+88+12>>2]=c[r+32+12>>2];c[s+568+104>>2]=c[r+48>>2];c[s+568+104+4>>2]=c[r+48+4>>2];c[s+568+104+8>>2]=c[r+48+8>>2];c[s+568+104+12>>2]=c[r+48+12>>2];c[s+568+40>>2]=c[f+4>>2];g[s+208>>2]=j;g[s+208+4>>2]=k;g[s+208+8>>2]=m;g[s+208+12>>2]=0.0;if(n>2]=n;if(o>2]=o;if(p>2]=p;g[s+192>>2]=j;g[s+192+4>>2]=k;g[s+192+8>>2]=m;g[s+192+12>>2]=0.0;if(j>2]=n;if(k>2]=o;if(m>2]=p;Vb[c[(c[q>>2]|0)+64>>2]&127](q,s+568|0,s+208|0,s+192|0)}l=s;return}function bd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];c[b+16>>2]=c[a+16>>2];c[b+16+4>>2]=c[a+16+4>>2];c[b+16+8>>2]=c[a+16+8>>2];c[b+16+12>>2]=c[a+16+12>>2];c[b+32>>2]=c[a+32>>2];c[b+32+4>>2]=c[a+32+4>>2];c[b+32+8>>2]=c[a+32+8>>2];c[b+32+12>>2]=c[a+32+12>>2];q=+g[a+20>>2];m=+g[a+40>>2];r=+g[a+24>>2];n=+g[a+36>>2];o=+g[a+32>>2];s=+g[a+16>>2];t=+g[a>>2];p=+g[a+4>>2];u=+g[a+8>>2];v=1.0/((q*m-r*n)*t+p*(r*o-m*s)+(n*s-q*o)*u);g[d>>2]=(q*m-r*n)*v;g[d+4>>2]=(n*u-m*p)*v;g[d+8>>2]=(r*p-q*u)*v;g[d+12>>2]=0.0;g[d+16>>2]=(r*o-m*s)*v;g[d+20>>2]=(m*t-o*u)*v;g[d+24>>2]=(s*u-r*t)*v;g[d+28>>2]=0.0;g[d+32>>2]=(n*s-q*o)*v;g[d+36>>2]=(o*p-n*t)*v;g[d+40>>2]=(q*t-s*p)*v;g[d+44>>2]=0.0;a:do if(!(c[5759]|0)){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0}else{e=0;D=(q*t-s*p)*v;F=(q*m-r*n)*v;G=(r*o-m*s)*v;H=(n*s-q*o)*v;I=(n*u-m*p)*v;B=(m*t-o*u)*v;A=(o*p-n*t)*v;z=(r*p-q*u)*v;y=(s*u-r*t)*v;while(1){o=+C(+F);n=+C(+G);N=+C(+H);W=+C(+I);O=+C(+B);M=+C(+A);Q=+C(+z);P=+C(+y);w=+C(+D);R=o+n+N>W+O+M?o+n+N:W+O+M;O=o+W+Q>n+O+P?o+W+Q:n+O+P;n=+g[b>>2];W=+C(+n);o=+g[b+16>>2];T=+C(+o);p=+g[b+32>>2];K=+C(+p);q=+g[b+4>>2];V=+C(+q);r=+g[b+20>>2];S=+C(+r);s=+g[b+36>>2];J=+C(+s);t=+g[b+8>>2];U=+C(+t);u=+g[b+24>>2];L=+C(+u);v=+g[b+40>>2];x=+C(+v);m=W+T+K>V+S+J?W+T+K:V+S+J;m=m>U+L+x?m:U+L+x;L=W+V+U>T+S+L?W+V+U:T+S+L;w=(R>Q+P+w?R:Q+P+w)*(O>N+M+w?O:N+M+w);x=m*(L>K+J+x?L:K+J+x);if(+C(+w)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}if(+C(+x)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}W=+E(+(w/x),.25);O=(n*(W+-2.0)+F*(1.0/W))*.5;Q=(q*(W+-2.0)+1.0/W*G)*.5;S=(t*(W+-2.0)+1.0/W*H)*.5;P=(o*(W+-2.0)+1.0/W*I)*.5;R=(r*(W+-2.0)+1.0/W*B)*.5;T=(u*(W+-2.0)+1.0/W*A)*.5;U=(p*(W+-2.0)+1.0/W*z)*.5;V=(s*(W+-2.0)+1.0/W*y)*.5;W=(v*(W+-2.0)+1.0/W*D)*.5;g[b>>2]=n+O;g[b+4>>2]=q+Q;g[b+8>>2]=t+S;g[b+12>>2]=0.0;g[b+16>>2]=o+P;g[b+20>>2]=r+R;g[b+24>>2]=u+T;g[b+28>>2]=0.0;g[b+32>>2]=p+U;g[b+36>>2]=s+V;g[b+40>>2]=v+W;g[b+44>>2]=0.0;N=1.0/(((v+W)*(r+R)-(u+T)*(s+V))*(n+O)+(q+Q)*((u+T)*(p+U)-(v+W)*(o+P))+((s+V)*(o+P)-(r+R)*(p+U))*(t+S));F=((v+W)*(r+R)-(u+T)*(s+V))*N;I=((s+V)*(t+S)-(v+W)*(q+Q))*N;z=((u+T)*(q+Q)-(r+R)*(t+S))*N;G=((u+T)*(p+U)-(v+W)*(o+P))*N;B=((v+W)*(n+O)-(p+U)*(t+S))*N;y=((o+P)*(t+S)-(u+T)*(n+O))*N;H=((s+V)*(o+P)-(r+R)*(p+U))*N;A=((p+U)*(q+Q)-(s+V)*(n+O))*N;D=((r+R)*(n+O)-(o+P)*(q+Q))*N;g[d>>2]=F;g[d+4>>2]=I;g[d+8>>2]=z;g[d+12>>2]=0.0;g[d+16>>2]=G;g[d+20>>2]=B;g[d+24>>2]=y;g[d+28>>2]=0.0;g[d+32>>2]=H;g[d+36>>2]=A;g[d+40>>2]=D;g[d+44>>2]=0.0;U=+C(+O)+ +C(+P)+ +C(+U);V=+C(+Q)+ +C(+R)+ +C(+V);W=+C(+S)+ +C(+T)+ +C(+W);V=U>V?U:V;if((V>W?V:W)<=m*+g[5758])break;e=e+1|0;if(e>>>0>=(c[5759]|0)>>>0){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}}M=+g[b>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[b+4>>2];J=+g[b+20>>2];L=+g[b+36>>2];A=+g[b+8>>2];D=+g[b+24>>2];G=+g[b+40>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}while(0);M=+g[k>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[l>>2];J=+g[e>>2];L=+g[f>>2];A=+g[h>>2];D=+g[i>>2];G=+g[j>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}function cd(a,b,f,i){a=a|0;b=b|0;f=f|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0;o=l;l=l+80|0;n=xb[c[(c[a>>2]|0)+28>>2]&127](a)|0;j=+g[a+4>>2];k=+g[a+8>>2];m=+g[a+12>>2];if((n|0)<=0){l=o;return}i=0;do{cc[c[(c[a>>2]|0)+16>>2]&3](a,o+76|0,o+52|0,o+64|0,o+56|0,o+72|0,o+68|0,o+48|0,o+60|0,i);a:do switch(c[o+64>>2]|0){case 0:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{r=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;t=c[o+76>>2]|0;s=c[o+56>>2]|0;u=t+(P(s,c[r>>2]|0)|0)|0;q=k*+g[u+4>>2];p=m*+g[u+8>>2];g[o>>2]=j*+g[u>>2];g[o+4>>2]=q;g[o+8>>2]=p;g[o+12>>2]=0.0;u=t+(P(s,c[r+4>>2]|0)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+16>>2]=j*+g[u>>2];g[o+20>>2]=p;g[o+24>>2]=q;g[o+28>>2]=0.0;r=t+(P(s,c[r+8>>2]|0)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+32>>2]=j*+g[r>>2];g[o+36>>2]=q;g[o+40>>2]=p;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}case 1:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{u=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;t=c[o+56>>2]|0;r=s+(P(t,c[u>>2]|0)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(t,c[u+4>>2]|0)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(t,c[u+8>>2]|0)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}default:{}}while(0);Ob[c[(c[a>>2]|0)+24>>2]&127](a,i);i=i+1|0}while((i|0)!=(n|0));l=o;return}function dd(d,e,f,h,i){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;y=l;l=l+128|0;a[d+60>>0]=f&1;if(f){r=+g[h>>2]+-1.0;u=+g[h+4>>2]+-1.0;v=+g[h+8>>2]+-1.0;g[d+4>>2]=r;g[d+8>>2]=u;g[d+12>>2]=v;g[d+16>>2]=0.0;x=+g[i>>2]+1.0;m=+g[i+4>>2]+1.0;j=+g[i+8>>2]+1.0;g[d+20>>2]=x;g[d+24>>2]=m;g[d+28>>2]=j;g[d+32>>2]=0.0;g[d+36>>2]=65533.0/(x-r);g[d+40>>2]=65533.0/(m-u);g[d+44>>2]=65533.0/(j-v);g[d+48>>2]=0.0;a[d+60>>0]=1;n=r+ +(~~((r-r)*(65533.0/(x-r)))&65535&-2&65535)/(65533.0/(x-r))+-1.0;o=u+ +(~~((u-u)*(65533.0/(m-u)))&65535&-2&65535)/(65533.0/(m-u))+-1.0;t=v+ +(~~((v-v)*(65533.0/(j-v)))&65535&-2&65535)/(65533.0/(j-v))+-1.0;if(n>2]=n;else n=r;if(o>2]=o;w=o}else w=u;if(t>2]=t;else t=v;o=x-n;r=m-w;u=j-t;g[d+36>>2]=65533.0/o;g[d+40>>2]=65533.0/r;g[d+44>>2]=65533.0/u;g[d+48>>2]=0.0;o=n+ +((~~(o*(65533.0/o)+1.0)&65535|1)&65535)/(65533.0/o)+1.0;r=w+ +((~~(r*(65533.0/r)+1.0)&65535|1)&65535)/(65533.0/r)+1.0;u=t+ +((~~(u*(65533.0/u)+1.0)&65535|1)&65535)/(65533.0/u)+1.0;if(x>2]=o;else o=x;if(m>2]=r;m=r}if(j>2]=u;j=u}g[d+36>>2]=65533.0/(o-n);g[d+40>>2]=65533.0/(m-w);g[d+44>>2]=65533.0/(j-t);g[d+48>>2]=0.0;c[y+96>>2]=8364;c[y+96+4>>2]=d+104;c[y+96+8>>2]=d;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,d+4|0,d+20|0);f=c[d+108>>2]|0;c[y+80>>2]=0;c[y+80+4>>2]=0;c[y+80+8>>2]=0;c[y+80+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(f<<1|0)){if((c[d+132>>2]|0)<(f<<1|0)){if(!f){h=0;e=k}else{c[6995]=(c[6995]|0)+1;h=sc(f<<5|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+128>>2]|0}if((e|0)>0){i=0;do{s=h+(i<<4)|0;q=(c[d+136>>2]|0)+(i<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=i+1|0}while((i|0)!=(e|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=h;c[d+132>>2]=f<<1;i=d+136|0}else i=d+136|0;h=k;do{s=(c[i>>2]|0)+(h<<4)|0;c[s>>2]=c[y+80>>2];c[s+4>>2]=c[y+80+4>>2];c[s+8>>2]=c[y+80+8>>2];c[s+12>>2]=c[y+80+12>>2];h=h+1|0}while((h|0)!=(f<<1|0))}c[d+128>>2]=f<<1}else{c[y+96>>2]=8384;c[y+96+4>>2]=d+64;c[y+80>>2]=-581039253;c[y+80+4>>2]=-581039253;c[y+80+8>>2]=-581039253;g[y+80+12>>2]=0.0;c[y+64>>2]=1566444395;c[y+64+4>>2]=1566444395;c[y+64+8>>2]=1566444395;g[y+64+12>>2]=0.0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,y+80|0,y+64|0);f=c[d+68>>2]|0;k=y;q=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(q|0));s=c[d+88>>2]|0;if((s|0)<(f<<1|0)){if((c[d+92>>2]|0)<(f<<1|0)){if(!f){h=0;e=s}else{c[6995]=(c[6995]|0)+1;h=sc(f<<7|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+88>>2]|0}if((e|0)>0){i=0;do{k=h+(i<<6)|0;p=(c[d+96>>2]|0)+(i<<6)|0;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));i=i+1|0}while((i|0)!=(e|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=h;c[d+92>>2]=f<<1;i=d+96|0}else i=d+96|0;h=s;do{k=(c[i>>2]|0)+(h<<6)|0;p=y;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));h=h+1|0}while((h|0)!=(f<<1|0))}c[d+88>>2]=f<<1}c[d+56>>2]=0;Cc(d,0,f);if(a[d+60>>0]|0?(c[d+152>>2]|0)==0:0){if(!(c[d+156>>2]|0)){c[6995]=(c[6995]|0)+1;f=sc(51)|0;if(!f)e=0;else{c[(f+4+15&-16)+-4>>2]=f;e=f+4+15&-16}h=c[d+152>>2]|0;if((h|0)>0){f=0;do{s=e+(f<<5)|0;q=(c[d+160>>2]|0)+(f<<5)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[s+16>>2]=c[q+16>>2];c[s+20>>2]=c[q+20>>2];c[s+24>>2]=c[q+24>>2];c[s+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[d+160>>2]|0;if(f|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=e;c[d+156>>2]=1;h=d+160|0;i=(c[d+152>>2]|0)+1|0;f=e}else{h=d+160|0;i=1;f=c[d+160>>2]|0}c[d+152>>2]=i;c[f>>2]=c[y+96>>2];c[f+4>>2]=c[y+96+4>>2];c[f+8>>2]=c[y+96+8>>2];c[f+12>>2]=c[y+96+12>>2];c[f+16>>2]=c[y+96+16>>2];c[f+20>>2]=c[y+96+20>>2];c[f+24>>2]=c[y+96+24>>2];c[f+28>>2]=c[y+96+28>>2];s=c[h>>2]|0;q=c[d+136>>2]|0;b[s>>1]=b[q>>1]|0;b[s+2>>1]=b[q+2>>1]|0;b[s+4>>1]=b[q+4>>1]|0;b[s+6>>1]=b[q+6>>1]|0;b[s+8>>1]=b[q+8>>1]|0;b[s+10>>1]=b[q+10>>1]|0;c[s+12>>2]=0;q=c[q+12>>2]|0;c[s+16>>2]=(q|0)>-1?1:0-q|0}c[d+168>>2]=c[d+152>>2];f=c[d+116>>2]|0;if(f|0){if(a[d+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+116>>2]=0}a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;f=c[d+76>>2]|0;if(!f){a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}if(a[d+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+76>>2]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}function ed(b,d,e,f,h,i,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;m=+m;n=n|0;o=+o;p=+p;var q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,R=0.0,S=0.0;Q=c[b+68>>2]|0;if((Q|0)==(c[b+72>>2]|0)?(u=Q|0?Q<<1:1,(Q|0)<(u|0)):0){if(!u){r=0;t=Q}else{c[6995]=(c[6995]|0)+1;r=sc((u*152|3)+16|0)|0;if(!r)r=0;else{c[(r+4+15&-16)+-4>>2]=r;r=r+4+15&-16}t=c[b+68>>2]|0}if((t|0)>0){s=0;do{gi(r+(s*152|0)|0,(c[b+76>>2]|0)+(s*152|0)|0,152)|0;s=s+1|0}while((s|0)!=(t|0))}s=c[b+76>>2]|0;if(s|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[s+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=r;c[b+72>>2]=u;r=c[b+68>>2]|0}else r=Q;c[b+68>>2]=r+1;P=c[b+76>>2]|0;c[P+(Q*152|0)+140>>2]=h;t=c[b+16>>2]|0;r=c[t+(e*244|0)+240>>2]|0;s=c[t+(f*244|0)+240>>2]|0;c[P+(Q*152|0)+144>>2]=e;c[P+(Q*152|0)+148>>2]=f;u=c[i+84>>2]|0;c[P+(Q*152|0)+104>>2]=u;c[P+(Q*152|0)+132>>2]=0;g[P+(Q*152|0)+100>>2]=0.0;g[P+(Q*152|0)+96>>2]=0.0;O=(c[j>>2]=u,+g[j>>2]);if(r|0){c[P+(Q*152|0)+16>>2]=c[d>>2];c[P+(Q*152|0)+16+4>>2]=c[d+4>>2];c[P+(Q*152|0)+16+8>>2]=c[d+8>>2];c[P+(Q*152|0)+16+12>>2]=c[d+12>>2];N=+g[k+4>>2];J=+g[P+(Q*152|0)+24>>2];H=+g[k+8>>2];L=+g[P+(Q*152|0)+20>>2];K=+g[P+(Q*152|0)+16>>2];M=+g[k>>2];g[P+(Q*152|0)>>2]=N*J-H*L;g[P+(Q*152|0)+4>>2]=H*K-J*M;g[P+(Q*152|0)+8>>2]=L*M-N*K;g[P+(Q*152|0)+12>>2]=0.0;w=((N*J-H*L)*+g[r+324>>2]+(H*K-J*M)*+g[r+328>>2]+(L*M-N*K)*+g[r+332>>2])*+g[r+604>>2];q=((N*J-H*L)*+g[r+340>>2]+(H*K-J*M)*+g[r+344>>2]+(L*M-N*K)*+g[r+348>>2])*+g[r+608>>2];v=((N*J-H*L)*+g[r+356>>2]+(H*K-J*M)*+g[r+360>>2]+(L*M-N*K)*+g[r+364>>2])*+g[r+612>>2];g[P+(Q*152|0)+64>>2]=w;g[P+(Q*152|0)+68>>2]=q;g[P+(Q*152|0)+72>>2]=v;g[P+(Q*152|0)+76>>2]=0.0;C=K;D=L;E=J;I=N*J-H*L;J=H*K-J*M;K=L*M-N*K}else{c[P+(Q*152|0)+64>>2]=0;c[P+(Q*152|0)+64+4>>2]=0;c[P+(Q*152|0)+64+8>>2]=0;c[P+(Q*152|0)+64+12>>2]=0;c[P+(Q*152|0)>>2]=0;c[P+(Q*152|0)+4>>2]=0;c[P+(Q*152|0)+8>>2]=0;c[P+(Q*152|0)+12>>2]=0;c[P+(Q*152|0)+16>>2]=0;c[P+(Q*152|0)+20>>2]=0;c[P+(Q*152|0)+24>>2]=0;c[P+(Q*152|0)+28>>2]=0;q=0.0;v=0.0;w=0.0;C=0.0;D=0.0;E=0.0;I=0.0;J=0.0;K=0.0}if(s|0){N=-+g[d>>2];A=-+g[d+4>>2];M=-+g[d+8>>2];g[P+(Q*152|0)+48>>2]=N;g[P+(Q*152|0)+52>>2]=A;g[P+(Q*152|0)+56>>2]=M;g[P+(Q*152|0)+60>>2]=0.0;B=+g[l+4>>2];S=+g[l+8>>2];R=+g[l>>2];g[P+(Q*152|0)+32>>2]=B*M-S*A;g[P+(Q*152|0)+36>>2]=S*N-R*M;g[P+(Q*152|0)+40>>2]=R*A-B*N;g[P+(Q*152|0)+44>>2]=0.0;x=((B*M-S*A)*+g[s+324>>2]+(S*N-R*M)*+g[s+328>>2]+(R*A-B*N)*+g[s+332>>2])*+g[s+604>>2];y=((B*M-S*A)*+g[s+340>>2]+(S*N-R*M)*+g[s+344>>2]+(R*A-B*N)*+g[s+348>>2])*+g[s+608>>2];z=((B*M-S*A)*+g[s+356>>2]+(S*N-R*M)*+g[s+360>>2]+(R*A-B*N)*+g[s+364>>2])*+g[s+612>>2];g[P+(Q*152|0)+80>>2]=x;g[P+(Q*152|0)+84>>2]=y;g[P+(Q*152|0)+88>>2]=z;g[P+(Q*152|0)+92>>2]=0.0;F=N;G=A;H=M;L=B*M-S*A;M=S*N-R*M;N=R*A-B*N}else{c[P+(Q*152|0)+80>>2]=0;c[P+(Q*152|0)+80+4>>2]=0;c[P+(Q*152|0)+80+8>>2]=0;c[P+(Q*152|0)+80+12>>2]=0;c[P+(Q*152|0)+32>>2]=0;c[P+(Q*152|0)+32+4>>2]=0;c[P+(Q*152|0)+32+8>>2]=0;c[P+(Q*152|0)+32+12>>2]=0;c[P+(Q*152|0)+32+16>>2]=0;c[P+(Q*152|0)+32+20>>2]=0;c[P+(Q*152|0)+32+24>>2]=0;c[P+(Q*152|0)+32+28>>2]=0;x=0.0;y=0.0;z=0.0;F=0.0;G=0.0;H=0.0;L=0.0;M=0.0;N=0.0}if(r|0){B=+g[k+8>>2];R=+g[k+4>>2];S=+g[k>>2];v=+g[r+404>>2]+((q*B-v*R)*+g[d>>2]+(v*S-B*w)*+g[d+4>>2]+(R*w-q*S)*+g[d+8>>2])}else v=0.0;if(s|0){R=-x;q=-y;z=-z;A=+g[l+8>>2];B=+g[l+4>>2];S=+g[l>>2];q=+g[s+404>>2]+((A*q-B*z)*+g[d>>2]+(S*z-A*R)*+g[d+4>>2]+(B*R-S*q)*+g[d+8>>2])}else q=0.0;B=m/(v+q);g[P+(Q*152|0)+108>>2]=B;if(r|0){z=+g[t+(e*244|0)+192>>2];m=+g[t+(e*244|0)+196>>2];A=+g[t+(e*244|0)+200>>2];y=(+g[t+(e*244|0)+176>>2]+ +g[t+(e*244|0)+208>>2])*C+(+g[t+(e*244|0)+180>>2]+ +g[t+(e*244|0)+212>>2])*D+(+g[t+(e*244|0)+184>>2]+ +g[t+(e*244|0)+216>>2])*E}else{z=0.0;m=0.0;A=0.0;y=C*0.0+D*0.0+E*0.0}if(s|0){v=+g[t+(f*244|0)+192>>2];w=+g[t+(f*244|0)+196>>2];x=+g[t+(f*244|0)+200>>2];q=(+g[t+(f*244|0)+176>>2]+ +g[t+(f*244|0)+208>>2])*F+(+g[t+(f*244|0)+180>>2]+ +g[t+(f*244|0)+212>>2])*G+(+g[t+(f*244|0)+184>>2]+ +g[t+(f*244|0)+216>>2])*H}else{v=0.0;w=0.0;x=0.0;q=F*0.0+G*0.0+H*0.0}q=B*(o-(y+(z*I+m*J+A*K)+(q+(v*L+w*M+x*N))));if(!(c[i+120>>2]&16)){S=0.0;S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}S=B*(-(+g[n+44>>2]*((+g[i+48>>2]-+g[i+32>>2])*+g[d>>2]+(+g[i+52>>2]-+g[i+36>>2])*+g[d+4>>2]+(+g[i+56>>2]-+g[i+40>>2])*+g[d+8>>2]))/+g[n+12>>2]);S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}function fd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0;ea=l;l=l+32|0;J=c[b+4>>2]|0;a[J+312>>0]=0;c[J>>2]=0;a[J+356>>0]=1;c[J+292>>2]=1566444395;c[J+296>>2]=1566444395;c[J+300>>2]=1566444395;g[J+304>>2]=0.0;c[J+336>>2]=0;c[J+336+4>>2]=0;c[J+336+8>>2]=0;c[J+336+12>>2]=0;a[J+336+16>>0]=0;a[J+332>>0]=a[J+332>>0]&-16;p=+g[d+48>>2];r=+g[d+52>>2];u=+g[d+56>>2];o=+g[f+48>>2];q=+g[f+52>>2];t=+g[f+56>>2];L=+g[d>>2];X=+g[d+4>>2];Z=+g[d+8>>2];$=+g[d+16>>2];N=+g[d+20>>2];P=+g[d+24>>2];R=+g[d+32>>2];T=+g[d+36>>2];V=+g[d+40>>2];K=+g[f>>2];W=+g[f+4>>2];Y=+g[f+8>>2];_=+g[f+16>>2];M=+g[f+20>>2];O=+g[f+24>>2];Q=+g[f+32>>2];S=+g[f+36>>2];U=+g[f+40>>2];ba=+g[e+48>>2]-p-(+g[h+48>>2]-o);ca=+g[e+52>>2]-r-(+g[h+52>>2]-q);da=+g[e+56>>2]-u-(+g[h+56>>2]-t);J=c[b+8>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;g[ea>>2]=L*-ba+$*-ca+R*-da;g[ea+4>>2]=X*-ba+N*-ca+T*-da;g[ea+8>>2]=Z*-ba+P*-ca+V*-da;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];G=+g[ea+16+8>>2];m=H*+g[d>>2]+I*+g[d+4>>2]+G*+g[d+8>>2]+ +g[d+48>>2];w=H*+g[d+16>>2]+I*+g[d+20>>2]+G*+g[d+24>>2]+ +g[d+52>>2];G=H*+g[d+32>>2]+I*+g[d+36>>2]+G*+g[d+40>>2]+ +g[d+56>>2];J=c[b+12>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;I=ba*+g[f+4>>2]+ca*+g[f+20>>2]+da*+g[f+36>>2];H=ba*+g[f+8>>2]+ca*+g[f+24>>2]+da*+g[f+40>>2];g[ea>>2]=ba*+g[f>>2]+ca*+g[f+16>>2]+da*+g[f+32>>2];g[ea+4>>2]=I;g[ea+8>>2]=H;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];n=+g[ea+16+8>>2];m=m-(H*+g[f>>2]+I*+g[f+4>>2]+n*+g[f+8>>2]+ +g[f+48>>2]);w=w-(H*+g[f+16>>2]+I*+g[f+20>>2]+n*+g[f+24>>2]+ +g[f+52>>2]);n=G-(H*+g[f+32>>2]+I*+g[f+36>>2]+n*+g[f+40>>2]+ +g[f+56>>2]);a:do if(m*m+w*w+n*n>9.999999747378752e-05){k=0.0;J=32;I=m;j=0;H=n;s=0;z=o;o=0.0;n=0.0;m=0.0;while(1){if(!J)break a;J=J+-1|0;x=c[b+8>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;C=-I;fa=-w;y=-H;g[ea>>2]=L*C+$*fa+R*y;g[ea+4>>2]=X*C+N*fa+T*y;g[ea+8>>2]=Z*C+P*fa+V*y;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);y=+g[ea+16>>2];fa=+g[ea+16+4>>2];C=+g[ea+16+8>>2];A=p+(L*y+X*fa+Z*C);B=r+($*y+N*fa+P*C);C=u+(R*y+T*fa+V*C);x=c[b+12>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;g[ea>>2]=K*I+_*w+Q*H;g[ea+4>>2]=W*I+M*w+S*H;g[ea+8>>2]=Y*I+O*w+U*H;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);fa=+g[ea+16>>2];y=+g[ea+16+4>>2];G=+g[ea+16+8>>2];E=z+(K*fa+W*y+Y*G);F=q+(_*fa+M*y+O*G);G=t+(Q*fa+S*y+U*G);y=I*(A-E)+w*(B-F)+H*(C-G);if(k>1.0){j=0;aa=25;break}if(y>0.0){m=ba*I+ca*w+da*H;if(m>=-1.4210854715202004e-14){j=0;aa=25;break}u=k-y/m;k=u;j=s;y=(1.0-u)*+g[f+48>>2]+u*+g[h+48>>2];p=(1.0-u)*+g[d+48>>2]+u*+g[e+48>>2];q=(1.0-u)*+g[f+52>>2]+u*+g[h+52>>2];r=(1.0-u)*+g[d+52>>2]+u*+g[e+52>>2];t=(1.0-u)*+g[f+56>>2]+u*+g[h+56>>2];u=(1.0-u)*+g[d+56>>2]+u*+g[e+56>>2];m=I;n=w;o=H}else y=z;s=c[b+4>>2]|0;x=c[s>>2]|0;b:do if((x|0)>0){w=+g[s+308>>2];v=0;while(1){H=A-E-+g[s+4+(v<<4)>>2];I=B-F-+g[s+4+(v<<4)+4>>2];fa=C-G-+g[s+4+(v<<4)+8>>2];v=v+1|0;if(H*H+I*I+fa*fa<=w){v=1;break b}if((v|0)>=(x|0)){v=0;break}}}else v=0;while(0);if((+g[s+304>>2]==0.0?C-G==+g[s+300>>2]:0)?B-F==+g[s+296>>2]:0){if(!(A-E==+g[s+292>>2]|v))aa=17}else if(!v)aa=17;if((aa|0)==17){aa=0;g[s+292>>2]=A-E;g[s+296>>2]=B-F;g[s+300>>2]=C-G;g[s+304>>2]=0.0;a[s+356>>0]=1;g[s+4+(x<<4)>>2]=A-E;g[s+4+(x<<4)+4>>2]=B-F;g[s+4+(x<<4)+8>>2]=C-G;g[s+4+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+84+(x<<4)>>2]=A;g[s+84+(x<<4)+4>>2]=B;g[s+84+(x<<4)+8>>2]=C;g[s+84+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+164+(x<<4)>>2]=E;g[s+164+(x<<4)+4>>2]=F;g[s+164+(x<<4)+8>>2]=G;g[s+164+(x<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;s=c[b+4>>2]|0}x=wc(s)|0;I=+g[s+276>>2];w=+g[s+280>>2];H=+g[s+284>>2];if(!x)break a;if(!(I*I+w*w+H*H>9.999999747378752e-05))break a;else{s=c[s+288>>2]|0;z=y}}if((aa|0)==25){l=ea;return j|0}}else{k=0.0;o=0.0;n=0.0;m=0.0;j=0}while(0);g[i+164>>2]=k;k=m*m+n*n+o*o;if(!(k>=1.4210854715202004e-14)){c[i+132>>2]=0;c[i+132+4>>2]=0;c[i+132+8>>2]=0;c[i+132+12>>2]=0;k=0.0;m=0.0;n=0.0}else{fa=1.0/+D(+k);k=m*fa;m=n*fa;n=o*fa;g[i+132>>2]=k;g[i+136>>2]=m;g[i+140>>2]=n;c[i+144>>2]=j}if(ba*k+ca*m+da*n>=-+g[i+172>>2]){i=0;l=ea;return i|0}b=c[b+4>>2]|0;wc(b)|0;$p(i+148|0,b+260|0,16)|0;i=1;l=ea;return i|0}function gd(b,d,e,f,h,i,j,k,l,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,E=0.0,F=0,G=0,H=0;if((j|0)<2|(k|0)<2){m=0;return m|0}y=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(y>>>0>268435455?18:(y<<4|3)+16|0)|0;if(!b)q=0;else{c[(b+4+15&-16)+-4>>2]=b;q=b+4+15&-16}s=$I(y>>>0>1073741823?-1:y<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{E=+(b|0)/+(k+-1|0);r=+g[e>>2];r=r+E*(+g[h>>2]-r);t=+g[e+4>>2];t=t+E*(+g[h+4>>2]-t);u=+g[e+8>>2];u=u+E*(+g[h+8>>2]-u);v=+g[f>>2];w=+g[f+4>>2];x=+g[f+8>>2];v=v+E*(+g[i>>2]-v)-r;w=w+E*(+g[i+4>>2]-w)-t;x=x+E*(+g[i+8>>2]-x)-u;p=P(b,j)|0;o=0;do{E=+(o|0)/+(j+-1|0);C=o+p|0;g[q+(C<<4)>>2]=r+v*E;g[q+(C<<4)+4>>2]=t+w*E;g[q+(C<<4)+8>>2]=u+x*E;g[q+(C<<4)+12>>2]=0.0;g[s+(C<<2)>>2]=1.0;o=o+1|0}while((o|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,y,q,s);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){C=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){C=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&16|0){g[(c[b+780>>2]|0)+(((j+-1|0)/2|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&32|0){C=P((k+-1|0)/2|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&64|0){C=j+-1+(P((k+-1|0)/2|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&128|0){C=(P(k+-1|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&256|0){C=(P((k+-1|0)/2|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(q|0){c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0)}aJ(s);if((k|0)<=0){m=b;return m|0}d=b+780|0;l=b+792|0;z=b+800|0;A=b+984|0;o=0;y=0;B=j+-1|0;C=(j<<1)+-1|0;while(1){p=y;y=y+1|0;a:do if((j|0)>0){i=P(p,j)|0;h=P(y,j)|0;t=1.0/+(k+-1|0)*+(k+-1-p|0);r=1.0/+(k+-1|0)*+(k+-2-p|0);if((y|0)<(k|0)){p=0;q=o}else{p=0;while(1){q=p;p=p+1|0;if((p|0)<(j|0)){s=p+i|0;e=c[d>>2]|0;Xh(b,0);h=(c[l>>2]|0)+-1|0;f=c[z>>2]|0;c[f+(h*52|0)+24>>2]=e+((q+i|0)*104|0);c[f+(h*52|0)+28>>2]=e+(s*104|0);w=+g[e+((q+i|0)*104|0)+8>>2]-+g[e+(s*104|0)+8>>2];x=+g[e+((q+i|0)*104|0)+12>>2]-+g[e+(s*104|0)+12>>2];E=+g[e+((q+i|0)*104|0)+16>>2]-+g[e+(s*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}if((p|0)==(j|0))break a}}while(1){e=p+1|0;s=p+i|0;f=p+h|0;if((p|0)==(j+-1|0))break;G=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;F=c[z>>2]|0;c[F+(H*52|0)+24>>2]=G+(s*104|0);c[F+(H*52|0)+28>>2]=G+((e+i|0)*104|0);E=+g[G+(s*104|0)+8>>2]-+g[G+((e+i|0)*104|0)+8>>2];x=+g[G+(s*104|0)+12>>2]-+g[G+((e+i|0)*104|0)+12>>2];w=+g[G+(s*104|0)+16>>2]-+g[G+((e+i|0)*104|0)+16>>2];g[F+(H*52|0)+32>>2]=+D(+(E*E+x*x+w*w));a[A>>0]=1;H=c[d>>2]|0;Xh(b,0);F=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(F*52|0)+24>>2]=H+(s*104|0);c[G+(F*52|0)+28>>2]=H+(f*104|0);w=+g[H+(s*104|0)+8>>2]-+g[H+(f*104|0)+8>>2];x=+g[H+(s*104|0)+12>>2]-+g[H+(f*104|0)+12>>2];E=+g[H+(s*104|0)+16>>2]-+g[H+(f*104|0)+16>>2];g[G+(F*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;bg(b,s,f,e+h|0,0);if(!n)bg(b,e+h|0,e+i|0,s,0);else{E=1.0/+(j+-1|0)*+(p|0);g[n+(q<<2)>>2]=E;g[n+(q+1<<2)>>2]=t;g[n+(q+2<<2)>>2]=E;g[n+(q+3<<2)>>2]=r;x=1.0/+(j+-1|0)*+(e|0);g[n+(q+4<<2)>>2]=x;g[n+(q+5<<2)>>2]=r;bg(b,e+h|0,e+i|0,s,0);g[n+(q+6<<2)>>2]=x;g[n+(q+7<<2)>>2]=r;g[n+(q+8<<2)>>2]=x;g[n+(q+9<<2)>>2]=t;g[n+(q+10<<2)>>2]=E;g[n+(q+11<<2)>>2]=t}if(m){F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(s*104|0);c[G+(H*52|0)+28>>2]=F+((e+h|0)*104|0);w=+g[F+(s*104|0)+8>>2]-+g[F+((e+h|0)*104|0)+8>>2];x=+g[F+(s*104|0)+12>>2]-+g[F+((e+h|0)*104|0)+12>>2];E=+g[F+(s*104|0)+16>>2]-+g[F+((e+h|0)*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}p=e;q=q+12|0}F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(B*104|0);c[G+(H*52|0)+28>>2]=F+(C*104|0);w=+g[F+(B*104|0)+8>>2]-+g[F+(C*104|0)+8>>2];x=+g[F+(B*104|0)+12>>2]-+g[F+(C*104|0)+12>>2];E=+g[F+(B*104|0)+16>>2]-+g[F+(C*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;o=(j*12|0)+-12+o|0}while(0);if((y|0)==(k|0))break;else{B=B+j|0;C=C+j|0}}return b|0}function hd(b,d,e,f,h){b=b|0;d=d|0;e=+e;f=+f;h=+h;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0;y=l;l=l+240|0;n=+g[b+136>>2]+f;o=+g[b+140>>2]+h;g[b+152>>2]=+g[b+132>>2]+e;g[b+156>>2]=n;g[b+160>>2]=o;g[b+164>>2]=0.0;c[y+176>>2]=1065353216;q=y+176+4|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[y+176+20>>2]=1065353216;r=y+176+24|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[y+176+40>>2]=1065353216;s=y+176+44|0;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[s+16>>2]=0;c[y+112>>2]=1065353216;t=y+112+4|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[y+112+20>>2]=1065353216;u=y+112+24|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[y+112+40>>2]=1065353216;v=y+112+44|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;o=1.0;p=10;while(1){if((p|0)<=0){x=29;break}p=p+-1|0;c[y+176+48>>2]=c[b+132>>2];c[y+176+48+4>>2]=c[b+132+4>>2];c[y+176+48+8>>2]=c[b+132+8>>2];c[y+176+48+12>>2]=c[b+132+12>>2];c[y+112+48>>2]=c[b+152>>2];c[y+112+48+4>>2]=c[b+152+4>>2];c[y+112+48+8>>2]=c[b+152+8>>2];c[y+112+48+12>>2]=c[b+152+12>>2];m=+g[b+132>>2]-+g[b+152>>2];n=+g[b+136>>2]-+g[b+156>>2];e=+g[b+140>>2]-+g[b+160>>2];z=+g[b+168>>2];j=+g[b+172>>2];A=+g[b+176>>2];h=+g[b+180>>2];B=z*(2.0/(z*z+j*j+A*A+h*h));f=j*(2.0/(z*z+j*j+A*A+h*h));k=A*(2.0/(z*z+j*j+A*A+h*h));g[y+176>>2]=1.0-(j*f+A*k);g[q>>2]=z*f-h*k;g[y+176+8>>2]=z*k+h*f;g[y+176+12>>2]=0.0;g[y+176+16>>2]=z*f+h*k;g[y+176+20>>2]=1.0-(z*B+A*k);g[r>>2]=j*k-h*B;g[y+176+28>>2]=0.0;g[y+176+32>>2]=z*k-h*f;g[y+176+36>>2]=j*k+h*B;g[y+176+40>>2]=1.0-(z*B+j*f);g[s>>2]=0.0;f=+g[b+184>>2];j=+g[b+188>>2];B=+g[b+192>>2];z=+g[b+196>>2];h=f*(2.0/(f*f+j*j+B*B+z*z));k=j*(2.0/(f*f+j*j+B*B+z*z));A=B*(2.0/(f*f+j*j+B*B+z*z));g[y+112>>2]=1.0-(j*k+B*A);g[t>>2]=f*k-z*A;g[y+112+8>>2]=f*A+z*k;g[y+112+12>>2]=0.0;g[y+112+16>>2]=f*k+z*A;g[y+112+20>>2]=1.0-(f*h+B*A);g[u>>2]=j*A-z*h;g[y+112+28>>2]=0.0;g[y+112+32>>2]=f*A-z*k;g[y+112+36>>2]=j*A+z*h;g[y+112+40>>2]=1.0-(f*h+j*k);g[v>>2]=0.0;i=c[b+8>>2]|0;g[y+4>>2]=1.0;c[y+80>>2]=0;c[y+16>>2]=0;c[y+16+4>>2]=0;c[y+16+8>>2]=0;c[y+16+12>>2]=0;c[y+16+16>>2]=0;c[y+16+20>>2]=0;c[y+16+24>>2]=0;c[y+16+28>>2]=0;c[y>>2]=5252;c[y+84>>2]=i;g[y+88>>2]=m;g[y+92>>2]=n;g[y+96>>2]=e;g[y+100>>2]=0.0;g[y+104>>2]=0.0;i=c[i+188>>2]|0;c[y+8>>2]=c[i+4>>2];c[y+12>>2]=c[i+8>>2];i=c[b+12>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e+ +g[b+64>>2]);if(!((((((((((((+g[y+176>>2]==+g[y+112>>2]?+g[y+176+16>>2]==+g[y+112+16>>2]:0)?+g[y+176+32>>2]==+g[y+112+32>>2]:0)?+g[q>>2]==+g[t>>2]:0)?+g[y+176+20>>2]==+g[y+112+20>>2]:0)?+g[y+176+36>>2]==+g[y+112+36>>2]:0)?+g[y+176+8>>2]==+g[y+112+8>>2]:0)?+g[r>>2]==+g[u>>2]:0)?+g[y+176+40>>2]==+g[y+112+40>>2]:0)?+g[y+176+60>>2]==+g[y+112+60>>2]:0)?+g[y+176+56>>2]==+g[y+112+56>>2]:0)?+g[y+176+52>>2]==+g[y+112+52>>2]:0)?+g[y+176+48>>2]==+g[y+112+48>>2]:0))x=16;do if((x|0)==16){x=0;i=c[b+12>>2]|0;if(!(a[b+250>>0]|0)){Ud(d,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}else{pd(c[b+8>>2]|0,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}}while(0);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e);B=+g[y+4>>2];o=o-B;if((B<1.0?(w=c[b+8>>2]|0,(c[w+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,w,c[y+80>>2]|0)|0:0){e=+g[b+152>>2];k=+g[b+132>>2];h=+g[b+156>>2];m=+g[b+136>>2];j=+g[b+160>>2];n=+g[b+140>>2];f=+D(+((e-k)*(e-k)+(h-m)*(h-m)+(j-n)*(j-n)));if(f>1.1920928955078125e-07){E=+g[y+48>>2];z=+g[y+52>>2];F=+g[y+56>>2];B=((e-k)*(1.0/f)*E+(h-m)*(1.0/f)*z+(j-n)*(1.0/f)*F)*2.0;C=(e-k)*(1.0/f)-E*B;A=(h-m)*(1.0/f)-z*B;h=(j-n)*(1.0/f)-F*B;j=1.0/+D(+(h*h+(C*C+A*A)));c[b+152>>2]=c[b+132>>2];c[b+152+4>>2]=c[b+132+4>>2];c[b+152+8>>2]=c[b+132+8>>2];c[b+152+12>>2]=c[b+132+12>>2];e=f*(j*C-E*(F*j*h+(E*j*C+z*j*A)))+ +g[b+152>>2];g[b+152>>2]=e;B=f*(j*A-z*(F*j*h+(E*j*C+z*j*A)))+ +g[b+156>>2];g[b+156>>2]=B;j=f*(j*h-F*(F*j*h+(E*j*C+z*j*A)))+ +g[b+160>>2];g[b+160>>2]=j;f=B}else f=h;h=e-k;f=f-m;e=j-n;if(!(h*h+f*f+e*e>1.1920928955078125e-07)){x=26;break}F=1.0/+D(+(h*h+f*f+e*e));if(+g[b+84>>2]*h*F+f*F*+g[b+88>>2]+e*F*+g[b+92>>2]<=0.0){x=26;break}}else{c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(o>.009999999776482582)){x=29;break}}if((x|0)==26){l=y;return}else if((x|0)==29){l=y;return}}function id(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+80|0;a[x+16>>0]=1;c[x+12>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;a[x+36>>0]=1;c[x+32>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;a[x+56>>0]=1;c[x+52>>2]=0;c[x+44>>2]=0;c[x+48>>2]=0;a[x+76>>0]=1;c[x+72>>2]=0;c[x+64>>2]=0;c[x+68>>2]=0;e=c[b+8>>2]|0;if((e|0)<=0){kj(x);l=x;return}f=0;o=0;i=0;h=0;n=0;while(1){r=c[(c[(c[b+16>>2]|0)+(f<<2)>>2]|0)+192>>2]|0;q=((r+~(r<<15)|0)>>>10^r+~(r<<15))*9|0;q=((q>>>6^q)+~((q>>>6^q)<<11)|0)>>>16^(q>>>6^q)+~((q>>>6^q)<<11);g=q&o+-1;k=g>>>0>>0;a:do if(k){i=c[h+(g<<2)>>2]|0;if((i|0)!=-1){m=c[x+72>>2]|0;while(1){if((r|0)==(c[m+(i<<3)>>2]|0)){p=9;break}j=c[n+(i<<2)>>2]|0;if((j|0)==-1)break;else i=j}if((p|0)==9?(p=0,(c[x+52>>2]|0)+(i<<2)|0):0){i=o;g=n;break}if(!k){p=16;break}}e=c[h+(g<<2)>>2]|0;if((e|0)!=-1){i=c[x+72>>2]|0;while(1){if((r|0)==(c[i+(e<<3)>>2]|0))break;e=c[n+(e<<2)>>2]|0;if((e|0)==-1){p=16;break a}}c[(c[x+52>>2]|0)+(e<<2)>>2]=r;e=o;g=n;p=74}else p=16}else p=16;while(0);if((p|0)==16){p=0;n=c[x+44>>2]|0;if((n|0)==(o|0)){e=o|0?o<<1:1;if((o|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((e<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;if((o|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[x+52>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0))}h=c[x+52>>2]|0;if(h|0){if(a[x+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[x+52>>2]=0}a[x+56>>0]=1;c[x+52>>2]=i;c[x+48>>2]=e;h=o}else{h=o;e=o}}else{h=n;e=o}c[(c[x+52>>2]|0)+(h<<2)>>2]=r;c[x+44>>2]=h+1;h=c[x+64>>2]|0;if((h|0)==(c[x+68>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if((s|0)!=0?(c[6995]=(c[6995]|0)+1,t=sc((s<<3|3)+16|0)|0,(t|0)!=0):0){c[(t+4+15&-16)+-4>>2]=t;i=t+4+15&-16}else i=0;if((h|0)>0){e=0;do{j=(c[x+72>>2]|0)+(e<<3)|0;k=c[j+4>>2]|0;m=i+(e<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;e=e+1|0}while((e|0)!=(h|0))}e=c[x+72>>2]|0;if(e|0){if(a[x+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[x+72>>2]=0}a[x+76>>0]=1;c[x+72>>2]=i;c[x+68>>2]=s;h=c[x+64>>2]|0;e=c[x+48>>2]|0}m=(c[x+72>>2]|0)+(h<<3)|0;c[m>>2]=r;c[m+4>>2]=0;c[x+64>>2]=h+1;if((o|0)<(e|0)){m=c[x+4>>2]|0;do if((m|0)<(e|0)){if((c[x+8>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((e<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;g=u+4+15&-16}else g=0;i=c[x+12>>2]|0;if((m|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(a[x+16>>0]|0)p=51}else if(!((i|0)==0|(a[x+16>>0]|0)==0))p=51;if((p|0)==51){p=0;c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+16>>0]=1;c[x+12>>2]=g;c[x+8>>2]=e}else g=c[x+12>>2]|0;k=e<<2;Yk(g+(m<<2)|0,0,k-(m<<2)|0)|0;c[x+4>>2]=e;j=c[x+24>>2]|0;if((j|0)<(e|0)){if((c[x+28>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((k|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;g=v+4+15&-16}else g=0;i=c[x+32>>2]|0;if((j|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(j|0));if(a[x+36>>0]|0)p=63}else if(!((i|0)==0|(a[x+36>>0]|0)==0))p=63;if((p|0)==63){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+36>>0]=1;c[x+32>>2]=g;c[x+28>>2]=e}else g=c[x+32>>2]|0;Yk(g+(j<<2)|0,0,k-(j<<2)|0)|0}c[x+24>>2]=e;if((e|0)>0){Yk(c[x+12>>2]|0,-1,k|0)|0;Yk(c[x+32>>2]|0,-1,k|0)|0}if((m|0)<=0){e=c[x+48>>2]|0;break}h=c[x+72>>2]|0;i=c[x+12>>2]|0;j=c[x+32>>2]|0;e=c[x+48>>2]|0;g=0;do{p=c[h+(g<<3)>>2]|0;p=((p+~(p<<15)|0)>>>10^p+~(p<<15))*9|0;p=i+(((((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11))&e+-1)<<2)|0;c[j+(g<<2)>>2]=c[p>>2];c[p>>2]=g;g=g+1|0}while((g|0)!=(m|0))}while(0);g=q&e+-1}h=c[x+12>>2]|0;p=h+(g<<2)|0;g=c[x+32>>2]|0;c[g+(n<<2)>>2]=c[p>>2];c[p>>2]=n;p=74}if((p|0)==74){p=0;Ob[c[(c[r>>2]|0)+60>>2]&127](r,d);i=e;e=c[b+8>>2]|0}f=f+1|0;if((f|0)>=(e|0))break;o=i;i=c[x+4>>2]|0;n=g}if((e|0)>0)g=0;else{kj(x);l=x;return}do{f=c[(c[b+16>>2]|0)+(g<<2)>>2]|0;switch(c[f+252>>2]|0){case 64:case 1:{Ob[c[(c[f>>2]|0)+24>>2]&127](f,d);e=c[b+8>>2]|0;break}default:{}}g=g+1|0}while((g|0)<(e|0));kj(x);l=x;return}function jd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;A=+g[b+48>>2];i=+g[d>>2];B=+g[b+64>>2];j=+g[d+4>>2];H=+g[b+80>>2];p=+g[d+8>>2];s=+g[b+52>>2];r=+g[b+68>>2];q=+g[b+84>>2];w=+g[b+56>>2];G=+g[b+72>>2];x=+g[b+88>>2];v=+g[d+16>>2];u=+g[d+20>>2];t=+g[d+24>>2];F=+g[d+32>>2];C=+g[d+36>>2];E=+g[d+40>>2];k=+g[b+96>>2];h=+g[b+100>>2];z=+g[b+104>>2];y=+g[d+48>>2]+(i*k+j*h+p*z);f=v*k+u*h+t*z+ +g[d+52>>2];z=F*k+C*h+E*z+ +g[d+56>>2];g[b+1064>>2]=A*i+B*j+H*p;g[b+1068>>2]=i*s+j*r+p*q;g[b+1072>>2]=i*w+j*G+p*x;g[b+1076>>2]=0.0;g[b+1080>>2]=A*v+B*u+H*t;g[b+1084>>2]=s*v+r*u+q*t;g[b+1088>>2]=w*v+G*u+x*t;g[b+1092>>2]=0.0;g[b+1096>>2]=A*F+B*C+H*E;g[b+1100>>2]=s*F+r*C+q*E;g[b+1104>>2]=w*F+G*C+x*E;g[b+1108>>2]=0.0;g[b+1112>>2]=y;g[b+1116>>2]=f;g[b+1120>>2]=z;g[b+1124>>2]=0.0;z=+g[b+112>>2];f=+g[e>>2];y=+g[b+128>>2];E=+g[e+4>>2];x=+g[b+144>>2];C=+g[e+8>>2];G=+g[b+116>>2];F=+g[b+132>>2];w=+g[b+148>>2];q=+g[b+120>>2];r=+g[b+136>>2];s=+g[b+152>>2];H=+g[e+16>>2];B=+g[e+20>>2];A=+g[e+24>>2];t=+g[e+32>>2];u=+g[e+36>>2];v=+g[e+40>>2];p=+g[b+160>>2];j=+g[b+164>>2];i=+g[b+168>>2];h=+g[e+48>>2]+(f*p+E*j+C*i);k=H*p+B*j+A*i+ +g[e+52>>2];i=t*p+u*j+v*i+ +g[e+56>>2];g[b+1128>>2]=z*f+y*E+x*C;g[b+1132>>2]=f*G+E*F+C*w;g[b+1136>>2]=f*q+E*r+C*s;g[b+1140>>2]=0.0;g[b+1144>>2]=z*H+y*B+x*A;g[b+1148>>2]=G*H+F*B+w*A;g[b+1152>>2]=q*H+r*B+s*A;g[b+1156>>2]=0.0;g[b+1160>>2]=z*t+y*u+x*v;g[b+1164>>2]=G*t+F*u+w*v;g[b+1168>>2]=q*t+r*u+s*v;g[b+1172>>2]=0.0;g[b+1176>>2]=h;g[b+1180>>2]=k;g[b+1184>>2]=i;g[b+1188>>2]=0.0;h=h-+g[b+1112>>2];k=k-+g[b+1116>>2];i=i-+g[b+1120>>2];w=+g[b+1084>>2];F=+g[b+1104>>2];G=+g[b+1088>>2];x=+g[b+1100>>2];y=+g[b+1096>>2];z=+g[b+1080>>2];A=+g[b+1064>>2];B=+g[b+1068>>2];H=+g[b+1072>>2];C=1.0/((w*F-G*x)*A+B*(G*y-F*z)+(x*z-w*y)*H);E=(x*z-w*y)*C;f=i*(G*B-w*H)*C+(h*(w*F-G*x)*C+k*(x*H-F*B)*C);j=i*(z*H-G*A)*C+(h*(G*y-F*z)*C+k*(F*A-y*H)*C);k=i*(w*A-z*B)*C+(h*E+k*(y*B-x*A)*C);g[b+1256>>2]=f;g[b+1260>>2]=j;g[b+1264>>2]=k;g[b+1268>>2]=0.0;g[b+840>>2]=f;h=+g[b+680>>2];i=+g[b+696>>2];do if(!(h>i)){if(h>f){c[b+856>>2]=2;f=f-h;break}if(i>2]=1;f=f-i;break}else{c[b+856>>2]=0;f=0.0;break}}else{c[b+856>>2]=0;f=0.0}while(0);g[b+824>>2]=f;g[b+844>>2]=j;f=+g[b+684>>2];h=+g[b+700>>2];do if(!(f>h)){if(f>j){c[b+860>>2]=2;f=j-f;break}if(h>2]=1;f=j-h;break}else{c[b+860>>2]=0;f=0.0;break}}else{c[b+860>>2]=0;f=0.0}while(0);g[b+828>>2]=f;g[b+848>>2]=k;f=+g[b+688>>2];h=+g[b+704>>2];do if(!(f>h)){if(f>k){c[b+864>>2]=2;f=k-f;break}if(h>2]=1;f=k-h;break}else{c[b+864>>2]=0;f=0.0;break}}else{c[b+864>>2]=0;f=0.0}while(0);g[b+832>>2]=f;n=+g[b+1128>>2];o=+g[b+1144>>2];p=+g[b+1160>>2];h=+g[b+1132>>2];i=+g[b+1148>>2];j=+g[b+1164>>2];k=(w*F-G*x)*C*h+(x*H-F*B)*C*i+(G*B-w*H)*C*j;l=h*(G*y-F*z)*C+(F*A-y*H)*C*i+(z*H-G*A)*C*j;m=p*(w*A-z*B)*C+(n*E+o*(y*B-x*A)*C);f=E*+g[b+1136>>2]+(y*B-x*A)*C*+g[b+1152>>2]+(w*A-z*B)*C*(q*t+r*u+s*v);do if(m<1.0)if(m>-1.0){g[b+1192>>2]=+L(+-(h*E+(y*B-x*A)*C*i+(w*A-z*B)*C*j),+f);f=m<-1.0?-1.0:m;g[b+1196>>2]=+J(+(f>1.0?1.0:f));f=+L(+-(p*(z*H-G*A)*C+(n*(G*y-F*z)*C+o*(F*A-y*H)*C)),+(p*(G*B-w*H)*C+(n*(w*F-G*x)*C+o*(x*H-F*B)*C)));break}else{g[b+1192>>2]=-+L(+k,+l);g[b+1196>>2]=-1.5707963705062866;f=0.0;break}else{g[b+1192>>2]=+L(+k,+l);g[b+1196>>2]=1.5707963705062866;f=0.0}while(0);g[b+1200>>2]=f;g[b+1236>>2]=0.0;x=F*(n*F-p*H)-G*(o*H-n*G);y=H*(o*H-n*G)-F*(p*G-o*F);z=G*(p*G-o*F)-H*(n*F-p*H);g[b+1220>>2]=0.0;B=o*(o*H-n*G)-p*(n*F-p*H);C=p*(p*G-o*F)-n*(o*H-n*G);E=n*(n*F-p*H)-o*(p*G-o*F);g[b+1252>>2]=0.0;A=1.0/+D(+(x*x+y*y+z*z));g[b+1208>>2]=x*A;g[b+1212>>2]=y*A;g[b+1216>>2]=z*A;A=1.0/+D(+((p*G-o*F)*(p*G-o*F)+(n*F-p*H)*(n*F-p*H)+(o*H-n*G)*(o*H-n*G)));g[b+1224>>2]=(p*G-o*F)*A;g[b+1228>>2]=(n*F-p*H)*A;g[b+1232>>2]=(o*H-n*G)*A;H=1.0/+D(+(B*B+C*C+E*E));g[b+1240>>2]=B*H;g[b+1244>>2]=C*H;g[b+1248>>2]=E*H;if(!(a[b+1301>>0]|0))return;G=+g[(c[b+28>>2]|0)+404>>2];H=+g[(c[b+32>>2]|0)+404>>2];a[b+1280>>0]=(G<1.1920928955078125e-07|H<1.1920928955078125e-07)&1;H=G+H>0.0?H/(G+H):.5;g[b+1272>>2]=H;g[b+1276>>2]=1.0-H;return}function kd(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;E=l;l=l+480|0;e=c[b+332>>2]|0;if((c[b+324>>2]|0)>0){f=0;do{v=c[b+24>>2]|0;Ob[c[(c[v>>2]|0)+16>>2]&127](v,c[e+(f<<2)>>2]|0);f=f+1|0;e=c[b+332>>2]|0}while((f|0)<(c[b+324>>2]|0))}if(e|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;q=c[b+248>>2]|0;if((q|0)<=0){l=E;return}r=c[b+256>>2]|0;s=E+416+48|0;t=E+256+28|0;u=E+312+48|0;o=0;do{v=c[r+(o<<2)>>2]|0;g[v+268>>2]=1.0;switch(c[v+220>>2]|0){case 2:case 5:break;default:if(((((c[v+204>>2]&3|0)==0?(Af(v+4|0,+g[v+372>>2],+g[v+376>>2],+g[v+380>>2],v+388|0,d,E+416|0),y=+g[s>>2],z=y-+g[v+52>>2],A=+g[E+416+52>>2],B=A-+g[v+56>>2],C=+g[E+416+56>>2],D=C-+g[v+60>>2],a[b+44>>0]|0):0)?(n=+g[v+276>>2],n*n!=0.0?n*n>2]|0)+4>>2]|0)<20:0)?(c[5787]=(c[5787]|0)+1,i=c[b+68>>2]|0,i=xb[c[(c[i>>2]|0)+36>>2]&127](i)|0,p=c[b+24>>2]|0,g[E+312+4>>2]=1.0,c[E+312+16>>2]=c[v+52>>2],c[E+312+16+4>>2]=c[v+52+4>>2],c[E+312+16+8>>2]=c[v+52+8>>2],c[E+312+16+12>>2]=c[v+52+12>>2],c[E+312+32>>2]=c[s>>2],c[E+312+32+4>>2]=c[s+4>>2],c[E+312+32+8>>2]=c[s+8>>2],c[E+312+32+12>>2]=c[s+12>>2],c[E+312+80>>2]=0,c[E+312>>2]=4556,c[E+312+84>>2]=v,c[E+312+92>>2]=i,c[E+312+96>>2]=p,p=c[v+272>>2]|0,c[E+256+8>>2]=0,c[E+256+12>>2]=-1,c[E+256>>2]=7020,c[E+256+4>>2]=8,c[E+256+16>>2]=1065353216,c[E+256+20>>2]=1065353216,c[E+256+24>>2]=1065353216,c[t>>2]=0,c[t+4>>2]=0,c[t+8>>2]=0,c[t+12>>2]=0,c[t+16>>2]=0,c[E+256+32>>2]=p,c[E+256+48>>2]=p,g[E+256+52>>2]=0.0,c[E+312+88>>2]=c[b+56>>2],p=c[v+188>>2]|0,c[E+312+8>>2]=c[p+4>>2],c[E+312+12>>2]=c[p+8>>2],c[E+192+48>>2]=c[s>>2],c[E+192+48+4>>2]=c[s+4>>2],c[E+192+48+8>>2]=c[s+8>>2],c[E+192+48+12>>2]=c[s+12>>2],c[E+192>>2]=c[v+4>>2],c[E+192+4>>2]=c[v+4+4>>2],c[E+192+8>>2]=c[v+4+8>>2],c[E+192+12>>2]=c[v+4+12>>2],c[E+192+16>>2]=c[v+20>>2],c[E+192+16+4>>2]=c[v+20+4>>2],c[E+192+16+8>>2]=c[v+20+8>>2],c[E+192+16+12>>2]=c[v+20+12>>2],c[E+192+32>>2]=c[v+36>>2],c[E+192+32+4>>2]=c[v+36+4>>2],c[E+192+32+8>>2]=c[v+36+8>>2],c[E+192+32+12>>2]=c[v+36+12>>2],Ud(b,E+256|0,v+4|0,E+192|0,E+312|0,0.0),w=+g[E+312+4>>2],w<1.0):0){h=w*(y-+g[v+52>>2]);j=w*(A-+g[v+56>>2]);m=w*(C-+g[v+60>>2]);n=-(j*+g[E+312+52>>2])-h*+g[u>>2]-m*+g[E+312+56>>2];p=c[b+24>>2]|0;p=Bb[c[(c[p>>2]|0)+12>>2]&63](p,v,c[E+312+80>>2]|0)|0;f=c[b+324>>2]|0;if((f|0)==(c[b+328>>2]|0)?(x=f|0?f<<1:1,(f|0)<(x|0)):0){if(!x)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((x<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+324>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+332>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+332>>2]|0;if(i){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+324>>2]|0}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=e;c[b+328>>2]=x;e=f}else e=f;c[(c[b+332>>2]|0)+(e<<2)>>2]=p;c[b+324>>2]=e+1;k=h+ +g[v+52>>2];j=j+ +g[v+56>>2];h=m+ +g[v+60>>2];e=c[E+312+80>>2]|0;P=+g[e+4>>2];O=+g[e+20>>2];N=+g[e+36>>2];M=+g[e+8>>2];L=+g[e+24>>2];K=+g[e+40>>2];J=+g[e+12>>2];H=+g[e+28>>2];F=+g[e+44>>2];I=-+g[e+52>>2];G=-+g[e+56>>2];m=-+g[e+60>>2];c[E>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;c[E+12>>2]=0;g[E+16>>2]=k*P+j*O+h*N+(P*I+O*G+N*m);g[E+20>>2]=k*M+j*L+h*K+(M*I+L*G+K*m);g[E+24>>2]=k*J+j*H+h*F+(J*I+H*G+F*m);g[E+28>>2]=0.0;c[E+64>>2]=c[u>>2];c[E+64+4>>2]=c[u+4>>2];c[E+64+8>>2]=c[u+8>>2];c[E+64+12>>2]=c[u+12>>2];g[E+80>>2]=n;c[E+84>>2]=0;c[E+84+4>>2]=0;c[E+84+8>>2]=0;c[E+84+12>>2]=0;e=E+116|0;f=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));i=kf(p,E)|0;g[p+4+(i*192|0)+96>>2]=0.0;P=+g[v+228>>2]*+g[(c[E+312+80>>2]|0)+228>>2];P=P<-10.0?-10.0:P;g[p+4+(i*192|0)+84>>2]=P>10.0?10.0:P;c[p+4+(i*192|0)+48>>2]=c[v+52>>2];c[p+4+(i*192|0)+48+4>>2]=c[v+52+4>>2];c[p+4+(i*192|0)+48+8>>2]=c[v+52+8>>2];c[p+4+(i*192|0)+48+12>>2]=c[v+52+12>>2];g[p+4+(i*192|0)+32>>2]=k;g[p+4+(i*192|0)+36>>2]=j;g[p+4+(i*192|0)+40>>2]=h;g[p+4+(i*192|0)+44>>2]=0.0}}o=o+1|0}while((o|0)<(q|0));l=E;return}function ld(a,d,f,h,i,j,k,l){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0;v=+g[a+8>>2];x=+g[a+12>>2];A=+g[a+16>>2];w=+g[a+40>>2];p=(+g[d>>2]-v)*w;y=+g[a+44>>2];s=(+g[d+4>>2]-x)*y;B=+g[a+48>>2];u=(+g[d+8>>2]-A)*B;if(!(p<=0.0)){t=b[a+6>>1]|0;t=(!(p>=+(t&65535))?~~p&65535:t)&b[a+4>>1]}else t=0;if(!(s<=0.0)){r=b[a+6>>1]|0;r=(!(s>=+(r&65535))?~~s&65535:r)&b[a+4>>1]}else r=0;if(!(u<=0.0)){q=b[a+6>>1]|0;q=(!(u>=+(q&65535))?~~u&65535:q)&b[a+4>>1]}else q=0;u=(+g[f>>2]-v)*w;s=(+g[f+4>>2]-x)*y;p=(+g[f+8>>2]-A)*B;if(!(u<=0.0)){o=b[a+6>>1]|0;o=(!(u>=+(o&65535))?~~u&65535:o)&b[a+4>>1]|1}else o=1;if(!(s<=0.0)){n=b[a+6>>1]|0;n=(!(s>=+(n&65535))?~~s&65535:n)&b[a+4>>1]|1}else n=1;if(!(p<=0.0)){m=b[a+6>>1]|0;m=(!(p>=+(m&65535))?~~p&65535:m)&b[a+4>>1]|1}else m=1;D=b[a+64>>1]|0;C=c[a+60>>2]|0;b[a+64>>1]=b[C+((D&65535)<<6)+48>>1]|0;z=(b[a+56>>1]|0)+1<<16>>16;b[a+56>>1]=z;c[C+((D&65535)<<6)+12>>2]=D&65535;c[C+((D&65535)<<6)>>2]=i;c[C+((D&65535)<<6)+4>>2]=j;c[C+((D&65535)<<6)+8>>2]=k;E=(z&65535)<<1&65534;b[C+54>>1]=(e[C+54>>1]|0)+2;F=c[a+68>>2]|0;G=e[F+(E+-1<<2)>>1]|e[F+(E+-1<<2)+2>>1]<<16;b[F+((E|1)<<2)>>1]=G;b[F+((E|1)<<2)+2>>1]=G>>>16;F=c[a+68>>2]|0;b[F+(E+-1<<2)>>1]=t;b[F+(E+-1<<2)+2>>1]=D;b[F+(E<<2)>>1]=o;b[F+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+48>>1]=E+-1;b[C+((D&65535)<<6)+54>>1]=(z&65535)<<1;o=(c[a+60>>2]|0)+56|0;b[o>>1]=(e[o>>1]|0)+2;o=c[a+72>>2]|0;t=e[o+(E+-1<<2)>>1]|e[o+(E+-1<<2)+2>>1]<<16;b[o+((E|1)<<2)>>1]=t;b[o+((E|1)<<2)+2>>1]=t>>>16;o=c[a+72>>2]|0;b[o+(E+-1<<2)>>1]=r;b[o+(E+-1<<2)+2>>1]=D;b[o+(E<<2)>>1]=n;b[o+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+50>>1]=E+-1;b[C+((D&65535)<<6)+56>>1]=(z&65535)<<1;n=(c[a+60>>2]|0)+58|0;b[n>>1]=(e[n>>1]|0)+2;n=c[a+76>>2]|0;o=e[n+(E+-1<<2)>>1]|e[n+(E+-1<<2)+2>>1]<<16;b[n+((E|1)<<2)>>1]=o;b[n+((E|1)<<2)+2>>1]=o>>>16;n=c[a+76>>2]|0;b[n+(E+-1<<2)>>1]=q;b[n+(E+-1<<2)+2>>1]=D;b[n+(E<<2)>>1]=m;b[n+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+52>>1]=E+-1;b[C+((D&65535)<<6)+58>>1]=(z&65535)<<1;n=c[a+68>>2]|0;o=e[C+((D&65535)<<6)+48>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+48|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+48|0:n+(G<<6)+54|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+68>>2]|0}m=e[C+((D&65535)<<6)+54>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;a:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+54|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+48|0:o+(G<<6)+54|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break a;q=o;o=c[a+60>>2]|0}}while(0);n=c[a+72>>2]|0;o=e[C+((D&65535)<<6)+50>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+50|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+50|0:n+(G<<6)+56|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+72>>2]|0}m=e[C+((D&65535)<<6)+56>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;b:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+56|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+50|0:o+(G<<6)+56|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break b;q=o;o=c[a+60>>2]|0}}while(0);xh(a,2,b[C+((D&65535)<<6)+52>>1]|0);sh(a,2,b[C+((D&65535)<<6)+58>>1]|0,l);n=c[a+60>>2]|0;m=c[a+108>>2]|0;if(!m){G=n+((D&65535)<<6)|0;return G|0}c[n+((D&65535)<<6)+60>>2]=Fb[c[(c[m>>2]|0)+8>>2]&3](m,d,f,h,i,j,k,l)|0;G=n+((D&65535)<<6)|0;return G|0}function md(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+32|0;ng(b+4|0,((P(c[b+112>>2]|0,c[b+16>>2]|0)|0)/100|0)+1|0);if(c[b+124>>2]|0){o=((P(c[b+108>>2]|0,c[b+56>>2]|0)|0)/100|0)+1|0;ng(b+44|0,o);o=(c[b+124>>2]|0)-o|0;c[b+124>>2]=(o|0)>0?o:0}f=((c[b+104>>2]|0)+1|0)%2|0;c[b+104>>2]=f;f=c[b+84+(f<<2)>>2]|0;if(f|0){do{h=f+56|0;k=f;f=c[h>>2]|0;i=c[k+52>>2]|0;c[((i|0)==0?b+84+(c[k+60>>2]<<2)|0:i+56|0)>>2]=f;i=c[h>>2]|0;if(i|0)c[i+52>>2]=c[k+52>>2];c[k+52>>2]=0;c[h>>2]=c[b+92>>2];h=c[b+92>>2]|0;if(h|0)c[h+52>>2]=k;c[b+92>>2]=k;h=c[k+48>>2]|0;Ag(b+4|0,h)|0;i=c[b+8>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+8>>2]=h;c[b+16>>2]=(c[b+16>>2]|0)+-1;c[q>>2]=c[k+16>>2];c[q+4>>2]=c[k+16+4>>2];c[q+8>>2]=c[k+16+8>>2];c[q+12>>2]=c[k+16+12>>2];c[q+16>>2]=c[k+32>>2];c[q+16+4>>2]=c[k+32+4>>2];c[q+16+8>>2]=c[k+32+8>>2];c[q+16+12>>2]=c[k+32+12>>2];h=c[b+48>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+48>>2]=0;c[h+32>>2]=0;c[h+36>>2]=k;c[h+40>>2]=0;c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[h+16>>2]=c[q+16>>2];c[h+20>>2]=c[q+20>>2];c[h+24>>2]=c[q+24>>2];c[h+28>>2]=c[q+28>>2];Pe(b+44|0,c[b+44>>2]|0,h);i=(c[b+56>>2]|0)+1|0;c[b+56>>2]=i;c[k+48>>2]=h;c[k+60>>2]=2}while((f|0)!=0);c[b+124>>2]=i;a[b+154>>0]=1}c[q>>2]=9248;c[q+4>>2]=b;if(a[b+153>>0]|0?(ne(b+4|0,c[b+4>>2]|0,c[b+44>>2]|0,q),a[b+153>>0]|0):0){o=c[b+4>>2]|0;ne(b+4|0,o,o,q)}if(a[b+154>>0]|0?(m=c[b+96>>2]|0,m=xb[c[(c[m>>2]|0)+28>>2]&127](m)|0,e=c[m+4>>2]|0,(e|0)>0):0){f=(P(c[b+116>>2]|0,e)|0)/100|0;o=c[b+120>>2]|0;f=(o|0)>(f|0)?o:f;f=(e|0)<(f|0)?e:f;if((f|0)>0){h=0;do{j=((c[b+144>>2]|0)+h|0)%(e|0)|0;n=c[m+12>>2]|0;i=c[n+(j<<4)>>2]|0;j=c[n+(j<<4)+4>>2]|0;n=c[i+48>>2]|0;o=c[j+48>>2]|0;if(!(((((+g[n>>2]<=+g[o+16>>2]?+g[n+16>>2]>=+g[o>>2]:0)?+g[n+4>>2]<=+g[o+20>>2]:0)?+g[n+20>>2]>=+g[o+4>>2]:0)?+g[n+8>>2]<=+g[o+24>>2]:0)?+g[n+24>>2]>=+g[o+8>>2]:0)){e=c[b+96>>2]|0;Cb[c[(c[e>>2]|0)+12>>2]&31](e,i,j,d)|0;f=f+-1|0;h=h+-1|0;e=c[m+4>>2]|0}h=h+1|0}while((h|0)<(f|0));if((e|0)>0)p=34;else e=0}else p=34;if((p|0)==34)e=((c[b+144>>2]|0)+f|0)%(e|0)|0;c[b+144>>2]=e}c[b+140>>2]=(c[b+140>>2]|0)+1;c[b+120>>2]=1;a[b+154>>0]=0;o=c[b+128>>2]|0;n=c[b+132>>2]|0;g[b+136>>2]=(o|0)==0?0.0:+(n>>>0)/+(o>>>0);c[b+132>>2]=n>>>1;c[b+128>>2]=o>>>1;o=c[b+96>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0)){l=q;return}o=c[b+96>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;e=c[o+4>>2]|0;if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}if((e|0)>0){m=0;k=0;n=0;f=0;while(1){i=c[o+12>>2]|0;h=i+(m<<4)|0;r=n;n=c[h>>2]|0;i=i+(m<<4)+4|0;j=c[i>>2]|0;if(!((n|0)==(r|0)&(j|0)==(f|0))){f=c[n+48>>2]|0;r=c[j+48>>2]|0;if(((((+g[f>>2]<=+g[r+16>>2]?+g[f+16>>2]>=+g[r>>2]:0)?+g[f+4>>2]<=+g[r+20>>2]:0)?+g[f+20>>2]>=+g[r+4>>2]:0)?+g[f+8>>2]<=+g[r+24>>2]:0)?+g[f+24>>2]>=+g[r+8>>2]:0){h=k;f=j}else{f=j;p=48}}else p=48;if((p|0)==48){p=0;e=c[b+96>>2]|0;Sb[c[(c[e>>2]|0)+32>>2]&127](e,h,d);c[h>>2]=0;c[i>>2]=0;h=k+1|0;e=c[o+4>>2]|0}m=m+1|0;if((m|0)>=(e|0))break;else k=h}if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}j=e-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(j|0)){if(!j){f=0;i=e}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{r=c[o+12>>2]|0;c[f+(h<<4)>>2]=c[r+(h<<4)>>2];c[f+(h<<4)+4>>2]=c[r+(h<<4)+4>>2];c[f+(h<<4)+8>>2]=c[r+(h<<4)+8>>2];c[f+(h<<4)+12>>2]=c[r+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=f;c[o+8>>2]=j}do{r=(c[o+12>>2]|0)+(e<<4)|0;e=e+1|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0}while((e|0)!=(j|0));e=j}else e=j}c[o+4>>2]=e;l=q;return}function nd(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;r=c[b+28>>2]|0;k=c[b+32>>2]|0;xc(b,r+4|0,k+4|0,r+324|0,k+324|0);j=c[d+8>>2]|0;g[j>>2]=1.0;l=c[d+24>>2]|0;g[j+(l+1<<2)>>2]=1.0;g[j+((l<<1)+2<<2)>>2]=1.0;n=+g[b+348>>2];v=+g[b+352>>2];p=+g[b+356>>2];t=+g[r+4>>2]*n+ +g[r+8>>2]*v+ +g[r+12>>2]*p;o=n*+g[r+20>>2]+v*+g[r+24>>2]+p*+g[r+28>>2];p=n*+g[r+36>>2]+v*+g[r+40>>2]+p*+g[r+44>>2];j=c[d+12>>2]|0;c[j>>2]=0;g[j+4>>2]=p;g[j+8>>2]=-o;g[j+12>>2]=0.0;g[j+(l<<2)>>2]=-p;c[j+(l<<2)+4>>2]=0;g[j+(l<<2)+8>>2]=t;g[j+(l<<2)+12>>2]=0.0;g[j+(l<<1<<2)>>2]=o;g[j+(l<<1<<2)+4>>2]=-t;c[j+(l<<1<<2)+8>>2]=0;g[j+(l<<1<<2)+12>>2]=0.0;j=c[d+16>>2]|0;g[j>>2]=-1.0;g[j+(l+1<<2)>>2]=-1.0;g[j+((l<<1)+2<<2)>>2]=-1.0;v=+g[b+412>>2];n=+g[b+416>>2];m=+g[b+420>>2];u=+g[k+4>>2]*v+ +g[k+8>>2]*n+ +g[k+12>>2]*m;f=v*+g[k+20>>2]+n*+g[k+24>>2]+m*+g[k+28>>2];m=v*+g[k+36>>2]+n*+g[k+40>>2]+m*+g[k+44>>2];l=c[d+20>>2]|0;j=c[d+24>>2]|0;c[l>>2]=0;g[l+4>>2]=-m;g[l+8>>2]=f;g[l+12>>2]=0.0;g[l+(j<<2)>>2]=m;c[l+(j<<2)+4>>2]=0;g[l+(j<<2)+8>>2]=-u;g[l+(j<<2)+12>>2]=0.0;g[l+(j<<1<<2)>>2]=-f;g[l+(j<<1<<2)+4>>2]=u;c[l+(j<<1<<2)+8>>2]=0;g[l+(j<<1<<2)+12>>2]=0.0;q=c[b+592>>2]|0;n=+g[(q&2|0?b+600|0:d+4|0)>>2]*+g[d>>2];i=c[d+28>>2]|0;s=c[d+36>>2]|0;h=c[d+40>>2]|0;g[i>>2]=n*(u+ +g[k+52>>2]-t-+g[r+52>>2]);g[s>>2]=-3402823466385288598117041.0e14;g[h>>2]=3402823466385288598117041.0e14;if(!(q&1)){g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14}else{w=c[d+32>>2]|0;c[w>>2]=c[b+596>>2];g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<2)>>2]=c[b+596>>2];g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<1<<2)>>2]=c[b+596>>2]}if(!(a[b+526>>0]|0)){l=j*3|0;j=s}else{k=c[d+12>>2]|0;v=+g[b+456>>2];if(+g[b+444>>2]>2]>2];y=+g[r+8>>2];x=+g[r+12>>2];D=+g[b+304>>2];C=+g[b+320>>2];B=+g[b+336>>2];o=+g[b+308>>2];t=+g[b+324>>2];v=+g[b+340>>2];f=+g[r+20>>2];m=+g[r+24>>2];n=+g[r+28>>2];p=+g[r+36>>2];u=+g[r+40>>2];e=+g[r+44>>2];g[k+(j*3<<2)>>2]=z*D+y*C+x*B;g[k+((j*3|0)+1<<2)>>2]=D*f+C*m+B*n;g[k+((j*3|0)+2<<2)>>2]=D*p+C*u+B*e;g[k+(j<<2<<2)>>2]=z*o+y*t+x*v;g[k+((j<<2|1)<<2)>>2]=o*f+t*m+v*n;g[k+((j<<2|2)<<2)>>2]=o*p+t*u+v*e;g[l+(j*3<<2)>>2]=-(z*D+y*C+x*B);g[l+((j*3|0)+1<<2)>>2]=-(D*f+C*m+B*n);g[l+((j*3|0)+2<<2)>>2]=-(D*p+C*u+B*e);g[l+(j<<2<<2)>>2]=-(z*o+y*t+x*v);g[l+((j<<2|1)<<2)>>2]=-(o*f+t*m+v*n);g[l+((j<<2|2)<<2)>>2]=-(o*p+t*u+v*e);A=+g[d>>2]*+g[b+436>>2];i=c[d+28>>2]|0;g[i+(j*3<<2)>>2]=A*((z*D+y*C+x*B)*+g[b+460>>2]+(D*f+C*m+B*n)*+g[b+464>>2]+(D*p+C*u+B*e)*+g[b+468>>2]);g[i+(j<<2<<2)>>2]=A*((z*o+y*t+x*v)*+g[b+460>>2]+(o*f+t*m+v*n)*+g[b+464>>2]+(o*p+t*u+v*e)*+g[b+468>>2]);k=c[d+36>>2]|0;g[k+(j*3<<2)>>2]=-3402823466385288598117041.0e14;h=c[d+40>>2]|0;g[h+(j*3<<2)>>2]=3402823466385288598117041.0e14;g[k+(j<<2<<2)>>2]=-3402823466385288598117041.0e14;e=3402823466385288598117041.0e14;l=j<<2;j=c[d+24>>2]|0}else{D=+g[b+436>>2];B=D*+g[b+460>>2]*D;C=D*D*+g[b+464>>2];D=D*D*+g[b+468>>2];g[k+(j*3<<2)>>2]=B;g[k+((j*3|0)+1<<2)>>2]=C;g[k+((j*3|0)+2<<2)>>2]=D;g[l+(j*3<<2)>>2]=-B;g[l+((j*3|0)+1<<2)>>2]=-C;g[l+((j*3|0)+2<<2)>>2]=-D;g[i+(j*3<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+504>>2];if(q&4|0)c[(c[d+32>>2]|0)+(j*3<<2)>>2]=c[b+604>>2];g[s+(j*3<<2)>>2]=0.0;if((a[b+552>>0]|0)!=0?(e=+g[b+572>>2],e>=0.0):0){l=j*3|0;k=s}else{e=3402823466385288598117041.0e14;l=j*3|0;k=s}}g[h+(l<<2)>>2]=e;l=j+l|0;j=k}if(!(a[b+525>>0]|0))return;D=+g[b+436>>2];B=D*+g[b+476>>2]*D;C=D*D*+g[b+480>>2];D=D*D*+g[b+484>>2];q=c[d+12>>2]|0;s=c[d+20>>2]|0;g[q+(l<<2)>>2]=B;r=l+1|0;g[q+(r<<2)>>2]=C;w=l+2|0;g[q+(w<<2)>>2]=D;g[s+(l<<2)>>2]=-B;g[s+(r<<2)>>2]=-C;g[s+(w<<2)>>2]=-D;g[i+(l<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+508>>2];if(c[b+592>>2]&4|0)c[(c[d+32>>2]|0)+(l<<2)>>2]=c[b+604>>2];if(+g[b+452>>2]>0.0){w=+g[b+508>>2]>0.0;e=w?0.0:-3402823466385288598117041.0e14;f=w?3402823466385288598117041.0e14:0.0}else{e=-3402823466385288598117041.0e14;f=3402823466385288598117041.0e14}g[j+(l<<2)>>2]=e;g[h+(l<<2)>>2]=f;return}function od(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0;if((j|0)<2|(k|0)<2){m=0;return m|0}r=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(r>>>0>268435455?18:(r<<4|3)+16|0)|0;if(!b)p=0;else{c[(b+4+15&-16)+-4>>2]=b;p=b+4+15&-16}q=$I(r>>>0>1073741823?-1:r<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{A=+(b|0)/+(k+-1|0);u=+g[e>>2];u=u+A*(+g[h>>2]-u);v=+g[e+4>>2];v=v+A*(+g[h+4>>2]-v);w=+g[e+8>>2];w=w+A*(+g[h+8>>2]-w);x=+g[f>>2];y=+g[f+4>>2];z=+g[f+8>>2];x=x+A*(+g[i>>2]-x)-u;y=y+A*(+g[i+4>>2]-y)-v;z=z+A*(+g[i+8>>2]-z)-w;o=P(b,j)|0;n=0;do{A=+(n|0)/+(j+-1|0);t=n+o|0;g[p+(t<<4)>>2]=u+x*A;g[p+(t<<4)+4>>2]=v+y*A;g[p+(t<<4)+8>>2]=w+z*A;g[p+(t<<4)+12>>2]=0.0;g[q+(t<<2)>>2]=1.0;n=n+1|0}while((n|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,r,p,q);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){t=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){t=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(p|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}aJ(q);if((k|0)<=0){m=b;return m|0}r=b+780|0;d=b+792|0;l=b+800|0;s=b+984|0;i=0;do{p=i;i=i+1|0;a:do if((j|0)>0){t=P(p,j)|0;e=P(i,j)|0;if((i|0)<(k|0))n=0;else{n=0;while(1){o=n;n=n+1|0;if((n|0)<(j|0)){q=n+t|0;e=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;f=c[l>>2]|0;c[f+(h*52|0)+24>>2]=e+((o+t|0)*104|0);c[f+(h*52|0)+28>>2]=e+(q*104|0);y=+g[e+((o+t|0)*104|0)+8>>2]-+g[e+(q*104|0)+8>>2];z=+g[e+((o+t|0)*104|0)+12>>2]-+g[e+(q*104|0)+12>>2];A=+g[e+((o+t|0)*104|0)+16>>2]-+g[e+(q*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}if((n|0)==(j|0))break a}}do{q=n+t|0;o=n;n=n+1|0;do if((n|0)<(j|0)){f=n+t|0;B=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;h=c[l>>2]|0;c[h+(C*52|0)+24>>2]=B+(q*104|0);c[h+(C*52|0)+28>>2]=B+(f*104|0);A=+g[B+(q*104|0)+8>>2]-+g[B+(f*104|0)+8>>2];z=+g[B+(q*104|0)+12>>2]-+g[B+(f*104|0)+12>>2];y=+g[B+(q*104|0)+16>>2]-+g[B+(f*104|0)+16>>2];g[h+(C*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[s>>0]=1;C=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(h*52|0)+24>>2]=C+(q*104|0);c[B+(h*52|0)+28>>2]=C+((o+e|0)*104|0);y=+g[C+(q*104|0)+8>>2]-+g[C+((o+e|0)*104|0)+8>>2];z=+g[C+(q*104|0)+12>>2]-+g[C+((o+e|0)*104|0)+12>>2];A=+g[C+(q*104|0)+16>>2]-+g[C+((o+e|0)*104|0)+16>>2];g[B+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;if(!(o+p&1)){bg(b,o+e|0,q,f,0);bg(b,o+e|0,f,n+e|0,0);if(!m)break;h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(f*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(f*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(f*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(f*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}else{h=n+e|0;bg(b,q,f,h,0);bg(b,q,h,o+e|0,0);if(!m)break;f=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=f+(q*104|0);c[B+(C*52|0)+28>>2]=f+(h*104|0);y=+g[f+(q*104|0)+8>>2]-+g[f+(h*104|0)+8>>2];z=+g[f+(q*104|0)+12>>2]-+g[f+(h*104|0)+12>>2];A=+g[f+(q*104|0)+16>>2]-+g[f+(h*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}}else{h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(q*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(q*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(q*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(q*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}while(0)}while((n|0)!=(j|0))}while(0)}while((i|0)!=(k|0));return b|0}function pd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0;B=l;l=l+272|0;c[B+128>>2]=c[d>>2];c[B+128+4>>2]=c[d+4>>2];c[B+128+8>>2]=c[d+8>>2];c[B+128+12>>2]=c[d+12>>2];c[B+128+16>>2]=c[d+16>>2];c[B+128+16+4>>2]=c[d+16+4>>2];c[B+128+16+8>>2]=c[d+16+8>>2];c[B+128+16+12>>2]=c[d+16+12>>2];c[B+128+32>>2]=c[d+32>>2];c[B+128+32+4>>2]=c[d+32+4>>2];c[B+128+32+8>>2]=c[d+32+8>>2];c[B+128+32+12>>2]=c[d+32+12>>2];c[B+128+48>>2]=c[d+48>>2];c[B+128+48+4>>2]=c[d+48+4>>2];c[B+128+48+8>>2]=c[d+48+8>>2];c[B+128+48+12>>2]=c[d+48+12>>2];c[B+64>>2]=c[e>>2];c[B+64+4>>2]=c[e+4>>2];c[B+64+8>>2]=c[e+8>>2];c[B+64+12>>2]=c[e+12>>2];c[B+64+16>>2]=c[e+16>>2];c[B+64+16+4>>2]=c[e+16+4>>2];c[B+64+16+8>>2]=c[e+16+8>>2];c[B+64+16+12>>2]=c[e+16+12>>2];c[B+64+32>>2]=c[e+32>>2];c[B+64+32+4>>2]=c[e+32+4>>2];c[B+64+32+8>>2]=c[e+32+8>>2];c[B+64+32+12>>2]=c[e+32+12>>2];c[B+64+48>>2]=c[e+48>>2];c[B+64+48+4>>2]=c[e+48+4>>2];c[B+64+48+8>>2]=c[e+48+8>>2];c[B+64+48+12>>2]=c[e+48+12>>2];i=+g[B+64+52>>2]-+g[B+128+52>>2];G=+g[B+64+56>>2]-+g[B+128+56>>2];g[B+16>>2]=+g[B+64+48>>2]-+g[B+128+48>>2];g[B+16+4>>2]=i;g[B+16+8>>2]=G;g[B+16+12>>2]=0.0;If(B+128|0,B+64|0,B+208|0,B+192|0);G=+g[B+192>>2];i=G*+g[B+208+4>>2];D=G*+g[B+208+8>>2];g[B>>2]=+g[B+208>>2]*G;g[B+4>>2]=i;g[B+8>>2]=D;g[B+12>>2]=0.0;c[B+208+48>>2]=0;c[B+208+48+4>>2]=0;c[B+208+48+8>>2]=0;c[B+208+48+12>>2]=0;yh(B+128|0,B+192|0);D=+g[B+192>>2];i=+g[B+192+4>>2];G=+g[B+192+8>>2];E=+g[B+192+12>>2];C=D*(2.0/(D*D+i*i+G*G+E*E));j=i*(2.0/(D*D+i*i+G*G+E*E));F=G*(2.0/(D*D+i*i+G*G+E*E));g[B+208>>2]=1.0-(i*j+G*F);g[B+208+4>>2]=D*j-E*F;g[B+208+8>>2]=D*F+E*j;g[B+208+12>>2]=0.0;g[B+208+16>>2]=D*j+E*F;g[B+208+20>>2]=1.0-(D*C+G*F);g[B+208+24>>2]=i*F-E*C;g[B+208+28>>2]=0.0;g[B+208+32>>2]=D*F-E*j;g[B+208+36>>2]=i*F+E*C;g[B+208+40>>2]=1.0-(D*C+i*j);g[B+208+44>>2]=0.0;kh(b,B+208|0,B+16|0,B,B+48|0,B+32|0);if((c[a+328>>2]|0)<=0){l=B;return}k=0;do{m=c[(c[a+336>>2]|0)+(k<<2)>>2]|0;if(zb[c[(c[f>>2]|0)+8>>2]&31](f,c[m+188>>2]|0)|0?(z=c[m+192>>2]|0,Vb[c[(c[z>>2]|0)+8>>2]&127](z,m+4|0,B+192|0,B+16|0),n=+g[B+192>>2]+ +g[B+48>>2],o=+g[B+192+4>>2]+ +g[B+48+4>>2],p=+g[B+192+8>>2]+ +g[B+48+8>>2],g[B+192>>2]=n,g[B+192+4>>2]=o,g[B+192+8>>2]=p,g[B+192+12>>2]=0.0,q=+g[B+16>>2]+ +g[B+32>>2],r=+g[B+16+4>>2]+ +g[B+32+4>>2],s=+g[B+16+8>>2]+ +g[B+32+8>>2],g[B+16>>2]=q,g[B+16+4>>2]=r,g[B+16+8>>2]=s,g[B+16+12>>2]=0.0,t=+g[d+48>>2]-(q+n)*.5,u=+g[d+52>>2]-(r+o)*.5,v=+g[d+56>>2]-(s+p)*.5,w=+g[e+48>>2]-(q+n)*.5,x=+g[e+52>>2]-(r+o)*.5,y=+g[e+56>>2]-(s+p)*.5,z=t<-((q-n)*.5)|(t>(q-n)*.5?8:0)|(u<-((r-o)*.5)?2:0)|(u>(r-o)*.5?16:0)|(v<-((s-p)*.5)?4:0)|(v>(s-p)*.5?32:0),A=w<-((q-n)*.5)|(w>(q-n)*.5?8:0)|(x<-((r-o)*.5)?2:0)|(x>(r-o)*.5?16:0)|(y<-((s-p)*.5)?4:0)|(y>(s-p)*.5?32:0),(z&A|0)==0):0){if(t<-((q-n)*.5))if(!((-t-(q-n)*.5)/(w-t)>=0.0)){i=0.0;j=1.0}else{i=(-t-(q-n)*.5)/(w-t);j=1.0}else if(w<-((q-n)*.5)?(-t-(q-n)*.5)/(w-t)<1.0:0){i=0.0;j=(-t-(q-n)*.5)/(w-t)}else{i=0.0;j=1.0}if(u<-((r-o)*.5)){if(i<=(-u-(r-o)*.5)/(x-u))i=(-u-(r-o)*.5)/(x-u)}else if(x<-((r-o)*.5)?(-u-(r-o)*.5)/(x-u)(q-n)*.5){if(i<=((q-n)*.5-t)/(w-t))i=((q-n)*.5-t)/(w-t)}else if(w>(q-n)*.5?((q-n)*.5-t)/(w-t)(r-o)*.5){if(i<=((r-o)*.5-u)/(x-u))i=((r-o)*.5-u)/(x-u)}else if(x>(r-o)*.5?((r-o)*.5-u)/(x-u)>2]|0;c[B+208>>2]=0;c[B+208+4>>2]=H;c[B+208+8>>2]=m;c[B+208+12>>2]=m+4;c[B+208+16>>2]=-1;c[B+208+20>>2]=-1;vc(b,B+128|0,B+64|0,B+208|0,f,h)}}k=k+1|0}while((k|0)<(c[a+328>>2]|0));l=B;return}function qd(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;h=c[b+48>>2]|0;r=c[b+28>>2]|0;s=c[b+68>>2]|0;if(c[l+72>>2]&1|0){if((h|0)>0){i=c[b+136>>2]|0;f=0;q=c[b+232>>2]|0;do{m=i+(f<<2)|0;p=c[m>>2]|0;f=f+1|0;q=(P(q,1664525)|0)+1013904223|0;if(f>>>0<65537){e=q>>>16^q;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=q;e=i+(((e>>>0)%(f>>>0)|0)<<2)|0;c[m>>2]=c[e>>2];c[e>>2]=p}while((f|0)!=(h|0));c[b+232>>2]=q}if((c[l+20>>2]|0)>(d|0)){if((r|0)>0){h=c[b+116>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;q=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[q>>2];c[q>>2]=m}while((f|0)!=(r|0));c[b+232>>2]=p}if((s|0)>0){h=c[b+156>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;r=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[r>>2];c[r>>2]=m}while((f|0)!=(s|0));c[b+232>>2]=p}}}e=c[b+48>>2]|0;if((e|0)>0){i=0;n=0.0;do{f=c[(c[b+136>>2]|0)+(i<<2)>>2]|0;h=c[b+56>>2]|0;if((c[h+(f*152|0)+136>>2]|0)>(d|0)){e=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](e+((c[h+(f*152|0)+144>>2]|0)*244|0)|0,e+((c[h+(f*152|0)+148>>2]|0)*244|0)|0,h+(f*152|0)|0);n=n+o*o;e=c[b+48>>2]|0}i=i+1|0}while((i|0)<(e|0))}else n=0.0;if((c[l+20>>2]|0)<=(d|0)){o=n;return +o}if((k|0)>0){e=0;do{f=j+(e<<2)|0;h=c[f>>2]|0;if(a[h+20>>0]|0){r=Rj(b,c[h+28>>2]|0,+g[l+12>>2])|0;d=Rj(b,c[(c[f>>2]|0)+32>>2]|0,+g[l+12>>2])|0;s=c[b+16>>2]|0;q=c[f>>2]|0;Tb[c[(c[q>>2]|0)+24>>2]&15](q,s+(r*244|0)|0,s+(d*244|0)|0,+g[l+12>>2])}e=e+1|0}while((e|0)!=(k|0))}m=c[l+72>>2]|0;p=c[b+28>>2]|0;if(!(m&512)){if((p|0)>0){e=0;do{l=c[(c[b+116>>2]|0)+(e<<2)>>2]|0;u=c[b+36>>2]|0;t=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](t+((c[u+(l*152|0)+144>>2]|0)*244|0)|0,t+((c[u+(l*152|0)+148>>2]|0)*244|0)|0,u+(l*152|0)|0);n=n+o*o;e=e+1|0}while((e|0)!=(p|0))}i=c[b+68>>2]|0;if((i|0)>0){h=0;do{e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;o=+g[(c[b+36>>2]|0)+((c[f+(e*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){o=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-o;g[f+(e*152|0)+124>>2]=o;l=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](l+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,l+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+o*o}h=h+1|0}while((h|0)!=(i|0))}}else if((p|0)>0){i=0;do{h=c[(c[b+116>>2]|0)+(i<<2)>>2]|0;e=c[b+36>>2]|0;f=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](f+((c[e+(h*152|0)+144>>2]|0)*244|0)|0,f+((c[e+(h*152|0)+148>>2]|0)*244|0)|0,e+(h*152|0)|0);n=n+o*o;o=+g[e+(h*152|0)+100>>2];h=P(i,(m>>>4&1)+1|0)|0;e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;if(o>0.0){v=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-v;g[f+(e*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,k+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+v*v}if((c[l+72>>2]&16|0)!=0?(t=c[(c[b+156>>2]|0)+(h+1<<2)>>2]|0,u=c[b+76>>2]|0,o>0.0):0){v=o*+g[u+(t*152|0)+104>>2];g[u+(t*152|0)+120>>2]=-v;g[u+(t*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[u+(t*152|0)+144>>2]|0)*244|0)|0,k+((c[u+(t*152|0)+148>>2]|0)*244|0)|0,u+(t*152|0)|0);n=n+v*v}i=i+1|0}while((i|0)!=(p|0))}h=c[b+88>>2]|0;if((h|0)<=0){v=n;return +v}f=0;do{e=c[b+96>>2]|0;o=+g[(c[b+36>>2]|0)+((c[e+(f*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){v=+g[e+(f*152|0)+104>>2];v=o*v>v?v:o*v;g[e+(f*152|0)+120>>2]=-v;g[e+(f*152|0)+124>>2]=v;l=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](l+((c[e+(f*152|0)+144>>2]|0)*244|0)|0,l+((c[e+(f*152|0)+148>>2]|0)*244|0)|0,e+(f*152|0)|0);n=n+v*v}f=f+1|0}while((f|0)!=(h|0));return +n}function rd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=3356;d=c[b+192>>2]|0;if(d|0)Ib[c[(c[d>>2]|0)+4>>2]&511](d);if((c[b+1112>>2]|0)>0)do{g=c[c[b+1120>>2]>>2]|0;d=c[g+348>>2]|0;if(d|0){Ag(b+1068|0,d)|0;e=c[b+1072>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+1072>>2]=d;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}d=c[g+52>>2]|0;if(d|0){if(a[g+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+52>>2]=0}a[g+56>>0]=1;c[g+52>>2]=0;c[g+44>>2]=0;c[g+48>>2]=0;d=c[g+32>>2]|0;if(d|0){if(a[g+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+32>>2]=0}a[g+36>>0]=1;c[g+32>>2]=0;c[g+24>>2]=0;c[g+28>>2]=0;d=c[g+12>>2]|0;if(d|0){if(a[g+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+12>>2]=0}a[g+16>>0]=1;c[g+12>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);d=c[b+1112>>2]|0;a:do if((d|0)>0){f=c[b+1120>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){h=c[b+1120>>2]|0;f=h+(e<<2)|0;g=c[f>>2]|0;c[f>>2]=c[h+(d+-1<<2)>>2];c[(c[b+1120>>2]|0)+(d+-1<<2)>>2]=g;c[b+1112>>2]=d+-1;d=d+-1|0}}while((d|0)>0);d=c[b+932>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+940>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+932>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+912>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+920>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+912>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+1244>>2]|0;if(d|0){if(a[b+1248>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1244>>2]=0}a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;d=c[b+1140>>2]|0;if(d|0){if(a[b+1144>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1140>>2]=0}a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;d=c[b+1120>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;Bl(b+1068|0);Bl(b+1028|0);Bl(b+988|0);d=c[b+940>>2]|0;if(d|0){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;d=c[b+920>>2]|0;if(d|0){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;d=c[b+900>>2]|0;if(d|0){if(a[b+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+900>>2]=0}a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;d=c[b+880>>2]|0;if(d|0){if(a[b+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+880>>2]=0}a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;d=c[b+860>>2]|0;if(d|0){if(a[b+864>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+860>>2]=0}a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;d=c[b+840>>2]|0;if(d|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;d=c[b+820>>2]|0;if(d|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;d=c[b+780>>2]|0;if(d|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;d=c[b+760>>2]|0;if(d|0){if(a[b+764>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+760>>2]=0}a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;d=c[b+572>>2]|0;if(d|0){if(a[b+576>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+572>>2]=0}a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;d=c[b+552>>2]|0;if(d|0){if(a[b+556>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+552>>2]=0}a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;Ju(b+348|0);d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}function sd(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0;n=l;l=l+16|0;i=c[a+372>>2]|0;a:do switch(c[i+32>>2]|0){case 1:{b=0;d=1;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;o=i+32|0;g[i+16+(d<<2)>>2]=0.0;d=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=d;c[i+(c[o>>2]<<2)>>2]=c[a+348+(d<<2)>>2];d=c[o>>2]|0;c[o>>2]=d+1;e=+g[n>>2];f=+g[n+4>>2];h=+g[n+8>>2];Fh(a,e,f,h,c[i+(d<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-e,-f,-h,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;b=b+1|0;if(b>>>0>=3)break a;d=c[a+372>>2]|0;i=d;d=c[d+32>>2]|0}o=1;l=n;return o|0}case 2:{o=c[i+4>>2]|0;b=c[i>>2]|0;e=+g[o+16>>2]-+g[b+16>>2];f=+g[o+20>>2]-+g[b+20>>2];h=+g[o+24>>2]-+g[b+24>>2];b=0;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;j=+g[n+8>>2];k=+g[n+4>>2];m=+g[n>>2];if((f*j-h*k)*(f*j-h*k)+(h*m-e*j)*(h*m-e*j)+(e*k-f*m)*(e*k-f*m)>0.0){i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*j-h*k,h*m-e*j,e*k-f*m,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*j-h*k),-(h*m-e*j),-(e*k-f*m),c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i}b=b+1|0;if(b>>>0>=3)break a}o=1;l=n;return o|0}case 3:{o=c[i+4>>2]|0;d=c[i>>2]|0;j=+g[d+16>>2];e=+g[o+16>>2]-j;k=+g[d+20>>2];f=+g[o+20>>2]-k;m=+g[d+24>>2];h=+g[o+24>>2]-m;o=c[i+8>>2]|0;j=+g[o+16>>2]-j;k=+g[o+20>>2]-k;m=+g[o+24>>2]-m;if((f*m-h*k)*(f*m-h*k)+(h*j-e*m)*(h*j-e*m)+(e*k-f*j)*(e*k-f*j)>0.0){g[i+28>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+12>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*m-h*k,h*j-e*m,e*k-f*j,c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*m-h*k),-(h*j-e*m),-(e*k-f*j),c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}else{o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;break a}}break}case 4:{o=c[i>>2]|0;a=c[i+12>>2]|0;m=+g[a+16>>2];r=+g[o+16>>2]-m;p=+g[a+20>>2];e=+g[o+20>>2]-p;h=+g[a+24>>2];j=+g[o+24>>2]-h;o=c[i+4>>2]|0;f=+g[o+16>>2]-m;k=+g[o+20>>2]-p;q=+g[o+24>>2]-h;o=c[i+8>>2]|0;m=+g[o+16>>2]-m;p=+g[o+20>>2]-p;h=+g[o+24>>2]-h;if(!((0.0!=0.0?1:r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m!=r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m)|r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m==0.0)){o=1;l=n;return o|0}break}default:{}}while(0);o=0;l=n;return o|0}function td(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0,Y=0,Z=0;Z=c[d+36>>2]|0;X=c[e+36>>2]|0;L=+g[Z+8>>2];N=+g[Z+12>>2];M=+g[Z+16>>2];h=c[X+8>>2]|0;R=+g[h+8>>2];S=+g[h+12>>2];T=+g[h+16>>2];d=c[X+12>>2]|0;O=+g[d+8>>2];P=+g[d+12>>2];Q=+g[d+16>>2];e=c[X+16>>2]|0;U=+g[e+8>>2];V=+g[e+12>>2];W=+g[e+16>>2];t=O-L-(R-L);A=P-N-(S-N);v=Q-M-(T-M);u=A*(W-M-(T-M))-v*(V-N-(S-N));B=v*(U-L-(R-L))-t*(W-M-(T-M));w=t*(V-N-(S-N))-A*(U-L-(R-L));do if(w*w+(u*u+B*B)>1.1920928955078125e-07?(E=1.0/+D(+(w*w+(u*u+B*B))),F=(T-M)*w*E+((R-L)*u*E+(S-N)*B*E),F*F<3402823466385288598117041.0e14):0){f=R-L-u*E*F;k=S-N-B*E*F;n=T-M-w*E*F;p=O-L-u*E*F;r=P-N-B*E*F;s=Q-M-w*E*F;if((w*(r*f-k*p)+(u*(k*s-n*r)+B*(n*p-s*f))>0.0?(x=U-L-u*E*F,y=V-N-B*E*F,z=W-M-w*E*F,w*(y*p-r*x)+(u*(r*z-s*y)+B*(s*x-z*p))>0.0):0)?w*(k*x-y*f)+(u*(y*n-z*k)+B*(z*f-n*x))>0.0:0){q=F*F;p=u*E*F;n=w*E*F;m=B*E*F;break}if(t*t+A*A+v*v>1.1920928955078125e-07?(C=-((R-L)*t+(S-N)*A+(T-M)*v)/(t*t+A*A+v*v),C=C<0.0?0.0:C>1.0?1.0:C,q=(T-M+v*C)*(T-M+v*C)+((R-L+t*C)*(R-L+t*C)+(S-N+A*C)*(S-N+A*C)),q<3402823466385288598117041.0e14):0){p=R-L+t*C;n=T-M+v*C;k=S-N+A*C}else{q=3402823466385288598117041.0e14;p=0.0;n=0.0;k=0.0}f=(U-L-(O-L))*(U-L-(O-L))+(V-N-(P-N))*(V-N-(P-N))+(W-M-(Q-M))*(W-M-(Q-M));if(f>1.1920928955078125e-07?(H=-((O-L)*(U-L-(O-L))+(P-N)*(V-N-(P-N))+(Q-M)*(W-M-(Q-M)))/f,H=H<0.0?0.0:H>1.0?1.0:H,G=O-L+(U-L-(O-L))*H,I=P-N+(V-N-(P-N))*H,H=Q-M+(W-M-(Q-M))*H,H*H+(G*G+I*I)1.1920928955078125e-07?(K=-((U-L)*(R-L-(U-L))+(V-N)*(S-N-(V-N))+(W-M)*(T-M-(W-M)))/f,K=K<0.0?0.0:K>1.0?1.0:K,J=U-L+(R-L-(U-L))*K,m=V-N+(S-N-(V-N))*K,K=W-M+(T-M-(W-M))*K,K*K+(J*J+m*m)>2];K=N-+g[Z+28>>2];u=M-+g[Z+32>>2];u=+g[b+12>>2]+ +D(+(J*J+K*K+u*u))*2.0;if(!(q>2];V=+g[h+88>>2];W=+g[d+88>>2];f=+g[e+88>>2];f=!(V<=0.0)&!(W<=0.0)&!(f<=0.0)?V*s*(1.0/(t+s+r))+W*r*(1.0/(t+s+r))+t*(1.0/(t+s+r))*f:0.0;if(!(k+f>0.0))return;W=1.0/-+D(+q);q=p*W;p=m*W;n=n*W;o=c[b+4>>2]|0;d=c[b+8>>2]|0;l=c[(+g[o+376>>2]>+g[d+376>>2]?o+376|0:d+376|0)>>2]|0;m=k/(k+f)*+g[o+392>>2];f=f/(k+f)*+g[d+392>>2];d=c[o+892>>2]|0;if((d|0)==(c[o+896>>2]|0)?(Y=d|0?d<<1:1,(d|0)<(Y|0)):0){if(!Y)j=0;else{c[6995]=(c[6995]|0)+1;d=sc((Y*56|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=d;d=c[o+892>>2]|0}if((d|0)>0){e=0;do{h=j+(e*56|0)|0;b=(c[o+900>>2]|0)+(e*56|0)|0;i=h+56|0;do{c[h>>2]=c[b>>2];h=h+4|0;b=b+4|0}while((h|0)<(i|0));e=e+1|0}while((e|0)!=(d|0))}d=c[o+900>>2]|0;if(d|0){if(a[o+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+900>>2]=0}a[o+904>>0]=1;c[o+900>>2]=j;c[o+896>>2]=Y;d=c[o+892>>2]|0}Y=c[o+900>>2]|0;c[Y+(d*56|0)>>2]=Z;c[Y+(d*56|0)+4>>2]=X;g[Y+(d*56|0)+8>>2]=s*(1.0/(t+s+r));g[Y+(d*56|0)+12>>2]=r*(1.0/(t+s+r));g[Y+(d*56|0)+16>>2]=t*(1.0/(t+s+r));g[Y+(d*56|0)+20>>2]=0.0;g[Y+(d*56|0)+24>>2]=q;g[Y+(d*56|0)+28>>2]=p;g[Y+(d*56|0)+32>>2]=n;g[Y+(d*56|0)+36>>2]=0.0;g[Y+(d*56|0)+40>>2]=u;c[Y+(d*56|0)+44>>2]=l;g[Y+(d*56|0)+48>>2]=m;g[Y+(d*56|0)+52>>2]=f;c[o+892>>2]=(c[o+892>>2]|0)+1;return}function ud(d,e){d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+64|0;g[d+20>>2]=+h[e+32>>3];g[d+24>>2]=+h[e+40>>3];g[d+28>>2]=+h[e+48>>3];g[d+32>>2]=+h[e+56>>3];g[d+4>>2]=+h[e>>3];g[d+8>>2]=+h[e+8>>3];g[d+12>>2]=+h[e+16>>3];g[d+16>>2]=+h[e+24>>3];g[d+36>>2]=+h[e+64>>3];g[d+40>>2]=+h[e+72>>3];g[d+44>>2]=+h[e+80>>3];g[d+48>>2]=+h[e+88>>3];c[d+56>>2]=c[e+96>>2];a[d+60>>0]=(c[e+100>>2]|0)!=0&1;p=c[e+104>>2]|0;k=q;n=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(n|0));o=c[d+88>>2]|0;if((o|0)<(p|0)){if((c[d+92>>2]|0)<(p|0)){if(!p){f=0;j=o}else{c[6995]=(c[6995]|0)+1;f=sc(p<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+88>>2]|0}if((j|0)>0){i=0;do{k=f+(i<<6)|0;m=(c[d+96>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(j|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=p;i=d+96|0}else i=d+96|0;f=o;do{k=(c[i>>2]|0)+(f<<6)|0;m=q;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));f=f+1|0}while((f|0)!=(p|0))}c[d+88>>2]=p;if((p|0)>0){j=c[d+96>>2]|0;f=c[e+112>>2]|0;i=0;while(1){g[j+(i<<6)+16>>2]=+h[f+32>>3];g[j+(i<<6)+20>>2]=+h[f+40>>3];g[j+(i<<6)+24>>2]=+h[f+48>>3];g[j+(i<<6)+28>>2]=+h[f+56>>3];g[j+(i<<6)>>2]=+h[f>>3];g[j+(i<<6)+4>>2]=+h[f+8>>3];g[j+(i<<6)+8>>2]=+h[f+16>>3];g[j+(i<<6)+12>>2]=+h[f+24>>3];c[j+(i<<6)+32>>2]=c[f+64>>2];c[j+(i<<6)+36>>2]=c[f+68>>2];c[j+(i<<6)+40>>2]=c[f+72>>2];i=i+1|0;if((i|0)==(p|0))break;else f=f+80|0}}m=c[e+108>>2]|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(m|0)){if((c[d+132>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc((m<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+128>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<4)|0;o=(c[d+136>>2]|0)+(i<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=m;i=d+136|0}else i=d+136|0;f=k;do{p=(c[i>>2]|0)+(f<<4)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+128>>2]=m;if((m|0)>0){j=c[d+136>>2]|0;f=0;i=c[e+116>>2]|0;while(1){c[j+(f<<4)+12>>2]=c[i+12>>2];b[j+(f<<4)+6>>1]=b[i+6>>1]|0;b[j+(f<<4)+8>>1]=b[i+8>>1]|0;b[j+(f<<4)+10>>1]=b[i+10>>1]|0;b[j+(f<<4)>>1]=b[i>>1]|0;b[j+(f<<4)+2>>1]=b[i+2>>1]|0;b[j+(f<<4)+4>>1]=b[i+4>>1]|0;f=f+1|0;if((f|0)==(m|0))break;else i=i+16|0}}c[d+144>>2]=c[e+120>>2];m=c[e+124>>2]|0;k=c[d+152>>2]|0;if((k|0)<(m|0)){if((c[d+156>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc(m<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+152>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<5)|0;o=(c[d+160>>2]|0)+(i<<5)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[p+16>>2]=c[o+16>>2];c[p+20>>2]=c[o+20>>2];c[p+24>>2]=c[o+24>>2];c[p+28>>2]=c[o+28>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+160>>2]|0;if(i|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=m;i=d+160|0}else i=d+160|0;f=k;do{p=(c[i>>2]|0)+(f<<5)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];c[p+16>>2]=c[q+16>>2];c[p+20>>2]=c[q+20>>2];c[p+24>>2]=c[q+24>>2];c[p+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+152>>2]=m;if((m|0)<=0){l=q;return}j=c[d+160>>2]|0;i=0;f=c[e+128>>2]|0;while(1){b[j+(i<<5)+6>>1]=b[f+14>>1]|0;b[j+(i<<5)+8>>1]=b[f+16>>1]|0;b[j+(i<<5)+10>>1]=b[f+18>>1]|0;b[j+(i<<5)>>1]=b[f+8>>1]|0;b[j+(i<<5)+2>>1]=b[f+10>>1]|0;b[j+(i<<5)+4>>1]=b[f+12>>1]|0;c[j+(i<<5)+12>>2]=c[f>>2];c[j+(i<<5)+16>>2]=c[f+4>>2];i=i+1|0;if((i|0)==(m|0))break;else f=f+20|0}l=q;return}function vd(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;c[d+20>>2]=c[e+16>>2];c[d+24>>2]=c[e+20>>2];c[d+28>>2]=c[e+24>>2];c[d+32>>2]=c[e+28>>2];c[d+4>>2]=c[e>>2];c[d+8>>2]=c[e+4>>2];c[d+12>>2]=c[e+8>>2];c[d+16>>2]=c[e+12>>2];c[d+36>>2]=c[e+32>>2];c[d+40>>2]=c[e+36>>2];c[d+44>>2]=c[e+40>>2];c[d+48>>2]=c[e+44>>2];c[d+56>>2]=c[e+48>>2];a[d+60>>0]=(c[e+52>>2]|0)!=0&1;n=c[e+56>>2]|0;i=o;k=i+64|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(k|0));m=c[d+88>>2]|0;if((m|0)<(n|0)){if((c[d+92>>2]|0)<(n|0)){if(!n){f=0;h=m}else{c[6995]=(c[6995]|0)+1;f=sc(n<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+88>>2]|0}if((h|0)>0){g=0;do{i=f+(g<<6)|0;j=(c[d+96>>2]|0)+(g<<6)|0;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));g=g+1|0}while((g|0)!=(h|0))}g=c[d+96>>2]|0;if(g|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=n;g=d+96|0}else g=d+96|0;f=m;do{i=(c[g>>2]|0)+(f<<6)|0;j=o;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));f=f+1|0}while((f|0)!=(n|0))}c[d+88>>2]=n;if((n|0)>0){h=c[d+96>>2]|0;f=c[e+64>>2]|0;g=0;while(1){c[h+(g<<6)+16>>2]=c[f+16>>2];c[h+(g<<6)+20>>2]=c[f+20>>2];c[h+(g<<6)+24>>2]=c[f+24>>2];c[h+(g<<6)+28>>2]=c[f+28>>2];c[h+(g<<6)>>2]=c[f>>2];c[h+(g<<6)+4>>2]=c[f+4>>2];c[h+(g<<6)+8>>2]=c[f+8>>2];c[h+(g<<6)+12>>2]=c[f+12>>2];c[h+(g<<6)+32>>2]=c[f+32>>2];c[h+(g<<6)+36>>2]=c[f+36>>2];c[h+(g<<6)+40>>2]=c[f+40>>2];g=g+1|0;if((g|0)==(n|0))break;else f=f+48|0}}j=c[e+60>>2]|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;i=c[d+128>>2]|0;if((i|0)<(j|0)){if((c[d+132>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+128>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<4)|0;m=(c[d+136>>2]|0)+(g<<4)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+136>>2]|0;if(g|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=j;g=d+136|0}else g=d+136|0;f=i;do{n=(c[g>>2]|0)+(f<<4)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+128>>2]=j;if((j|0)>0){h=c[d+136>>2]|0;f=0;g=c[e+68>>2]|0;while(1){c[h+(f<<4)+12>>2]=c[g+12>>2];b[h+(f<<4)+6>>1]=b[g+6>>1]|0;b[h+(f<<4)+8>>1]=b[g+8>>1]|0;b[h+(f<<4)+10>>1]=b[g+10>>1]|0;b[h+(f<<4)>>1]=b[g>>1]|0;b[h+(f<<4)+2>>1]=b[g+2>>1]|0;b[h+(f<<4)+4>>1]=b[g+4>>1]|0;f=f+1|0;if((f|0)==(j|0))break;else g=g+16|0}}c[d+144>>2]=c[e+76>>2];j=c[e+80>>2]|0;i=c[d+152>>2]|0;if((i|0)<(j|0)){if((c[d+156>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc(j<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+152>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<5)|0;m=(c[d+160>>2]|0)+(g<<5)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];c[n+16>>2]=c[m+16>>2];c[n+20>>2]=c[m+20>>2];c[n+24>>2]=c[m+24>>2];c[n+28>>2]=c[m+28>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+160>>2]|0;if(g|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=j;g=d+160|0}else g=d+160|0;f=i;do{n=(c[g>>2]|0)+(f<<5)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+152>>2]=j;if((j|0)<=0){l=o;return}h=c[d+160>>2]|0;g=0;f=c[e+72>>2]|0;while(1){b[h+(g<<5)+6>>1]=b[f+14>>1]|0;b[h+(g<<5)+8>>1]=b[f+16>>1]|0;b[h+(g<<5)+10>>1]=b[f+18>>1]|0;b[h+(g<<5)>>1]=b[f+8>>1]|0;b[h+(g<<5)+2>>1]=b[f+10>>1]|0;b[h+(g<<5)+4>>1]=b[f+12>>1]|0;c[h+(g<<5)+12>>2]=c[f>>2];c[h+(g<<5)+16>>2]=c[f+4>>2];g=g+1|0;if((g|0)==(j|0))break;else f=f+20|0}l=o;return} +function nc(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ea=l;l=l+240|0;e=c[b+24>>2]|0;if((e|0)<=0){l=ea;return}K=ea+128+76|0;L=ea+80+16|0;P=ea+80+32|0;J=0;do{I=c[(c[b+32>>2]|0)+(J<<2)>>2]|0;switch(c[I+220>>2]|0){case 2:case 5:break;default:{if(a[I+984>>0]|0){a[I+984>>0]=0;f=c[I+792>>2]|0;if((f|0)>0){h=c[I+800>>2]|0;e=0;do{x=c[h+(e*52|0)+24>>2]|0;H=c[h+(e*52|0)+28>>2]|0;E=+g[x+8>>2]-+g[H+8>>2];F=+g[x+12>>2]-+g[H+12>>2];G=+g[x+16>>2]-+g[H+16>>2];G=+D(+(E*E+F*F+G*G));g[h+(e*52|0)+32>>2]=G;g[h+(e*52|0)+44>>2]=G*G;e=e+1|0}while((e|0)!=(f|0));e=0;do{g[h+(e*52|0)+40>>2]=(+g[(c[h+(e*52|0)+24>>2]|0)+88>>2]+ +g[(c[h+(e*52|0)+28>>2]|0)+88>>2])/+g[(c[h+(e*52|0)+4>>2]|0)+4>>2];e=e+1|0}while((e|0)!=(f|0))}Vf(I);Dl(I+1028|0);if(c[I+448>>2]&16|0)$g(I)}m=+g[I+428>>2]*d;g[I+512>>2]=m;g[I+516>>2]=1.0/m;g[I+520>>2]=m*3.0;x=c[I+192>>2]|0;m=+nb[c[(c[x>>2]|0)+48>>2]&15](x);g[I+524>>2]=m;g[I+528>>2]=m*.25;x=c[I+744>>2]|0;m=+g[I+512>>2];i=+g[x+40>>2]*m;k=m*+g[x+44>>2];m=m*+g[x+48>>2];H=c[I+772>>2]|0;if((H|0)>0){f=c[I+780>>2]|0;e=0;do{if(+g[f+(e*104|0)+88>>2]>0.0){n=f+(e*104|0)+40|0;g[n>>2]=i+ +g[n>>2];n=f+(e*104|0)+44|0;g[n>>2]=k+ +g[n>>2];n=f+(e*104|0)+48|0;g[n>>2]=m+ +g[n>>2]}e=e+1|0}while((e|0)!=(H|0))}F=+g[I+368>>2];G=+g[I+372>>2];n=+g[I+364>>2]>0.0?1:+g[I+360>>2]>0.0;if(F!=0.0|G>0.0){if((H|0)>0){f=c[I+780>>2]|0;k=+g[f+8>>2];m=+g[f+12>>2];o=+g[f+16>>2];f=c[I+812>>2]|0;if((f|0)>0){h=c[I+820>>2]|0;e=0;i=0.0;do{fa=c[h+(e*44|0)+8>>2]|0;ga=c[h+(e*44|0)+12>>2]|0;B=+g[ga+8>>2]-k;w=+g[ga+12>>2]-m;z=+g[ga+16>>2]-o;ga=c[h+(e*44|0)+16>>2]|0;A=+g[ga+8>>2]-k;y=+g[ga+12>>2]-m;E=+g[ga+16>>2]-o;i=i+((+g[fa+16>>2]-o)*(B*y-w*A)+((+g[fa+8>>2]-k)*(w*E-z*y)+(+g[fa+12>>2]-m)*(z*A-B*E)));e=e+1|0}while((e|0)!=(f|0))}else i=0.0;i=i/6.0}else i=0.0;E=F*(1.0/+C(+i));B=G*(+g[I+536>>2]-i)}else{B=0.0;E=0.0}a:do if((H|0)>0){if(!n){f=c[I+780>>2]|0;e=0;while(1){if(+g[f+(e*104|0)+88>>2]>0.0){if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0;if((e|0)==(H|0))break a}}f=c[I+780>>2]|0;e=0;do{w=+g[f+(e*104|0)+88>>2];if(w>0.0){y=+g[I+512>>2];u=+g[I+364>>2];s=+g[I+360>>2];b:do if((u>0.0|s>0.0?(M=c[x>>2]|0,(c[I+348>>2]|0)<4):0)?(N=+g[f+(e*104|0)+40>>2],O=N-+g[I+1212>>2],Q=+g[f+(e*104|0)+44>>2],R=Q-+g[I+1216>>2],S=+g[f+(e*104|0)+48>>2],T=S-+g[I+1220>>2],U=+D(+(O*O+R*R+T*T)),O*O+R*R+T*T>1.1920928955078125e-07):0){v=O*(1.0/U);z=R*(1.0/U);A=T*(1.0/U);k=+g[f+(e*104|0)+72>>2];o=+g[f+(e*104|0)+76>>2];p=+g[f+(e*104|0)+80>>2];switch(c[I+348>>2]|0){case 2:{r=O*k+R*o+T*p<0.0?-1.0:1.0;i=A*p*r+(v*k*r+z*o*r);m=+g[f+(e*104|0)+92>>2]*.5;q=(c[j>>2]=M,+g[j>>2]);t=i*s*.5*q*(O*O+R*R+T*T)*m;if(i>0.0&i<.9847999811172485){u=u*.5*q*U*m*+D(+(1.0-i*i));q=(A*(v*p*r-A*k*r)-z*(z*k*r-v*o*r))*u;s=(v*(z*k*r-v*o*r)-A*(A*o*r-z*p*r))*u;o=(z*(A*o*r-z*p*r)-v*(v*p*r-A*k*r))*u}else{q=0.0;s=0.0;o=0.0}i=y*w*-(A*t)*y*w*-(A*t)+(w*-(v*t)*y*w*-(v*t)*y+y*w*-(z*t)*y*w*-(z*t));if(i>0.0?i>=N*N+Q*Q+S*S:0){i=+D(+(N*N+Q*Q+S*S))/+D(+i)*.800000011920929;m=i*-(v*t);k=i*-(A*t);i=i*-(z*t)}else{m=-(v*t);k=-(A*t);i=-(z*t)}n=f+(e*104|0)+56|0;fa=f+(e*104|0)+60|0;z=i+ +g[fa>>2];ga=f+(e*104|0)+64|0;A=k+ +g[ga>>2];g[n>>2]=q+(m+ +g[n>>2]);g[fa>>2]=s+z;g[ga>>2]=o+A;break b}case 1:{t=O*k+R*o+T*p<0.0?-1.0:1.0;k=k*t;o=o*t;p=p*t;break}case 3:case 0:break;default:break b}i=O*k+R*o+T*p;if(i>0.0){i=-((c[j>>2]=M,+g[j>>2])*(O*O+R*R+T*T)*i*+g[f+(e*104|0)+92>>2]*.5);m=v*s*i+(k*u*i+0.0);k=z*s*i+(o*u*i+0.0);i=A*s*i+(p*u*i+0.0);if(y*w*i*y*w*i+(y*w*m*y*w*m+y*w*k*y*w*k)>N*N+Q*Q+S*S){A=1.0/+D(+(i*i+(m*m+k*k)));ga=f+(e*104|0)+56|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*m*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+60|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*k*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+64|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*i*A*(S*i*A+(N*m*A+Q*k*A));break}else{ga=f+(e*104|0)+56|0;g[ga>>2]=m+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=k+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=i+ +g[ga>>2];break}}}while(0);if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0}while((e|0)!=(H|0))}while(0);n=c[I+812>>2]|0;if((n|0)>0){h=0;do{u=+g[I+512>>2];t=+g[I+364>>2];s=+g[I+360>>2];c:do if((t>0.0|s>0.0?(V=c[I+348>>2]|0,(V|0)>3):0)?(W=c[I+820>>2]|0,X=c[W+(h*44|0)+8>>2]|0,fa=c[W+(h*44|0)+12>>2]|0,Y=+g[X+40>>2],Z=+g[X+44>>2],_=+g[X+48>>2],ga=c[W+(h*44|0)+16>>2]|0,$=c[x>>2]|0,aa=(Y+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408-+g[I+1212>>2],ba=(Z+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408-+g[I+1216>>2],ca=(_+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408-+g[I+1220>>2],da=+D(+(aa*aa+ba*ba+ca*ca)),aa*aa+ba*ba+ca*ca>1.1920928955078125e-07):0){v=aa*(1.0/da);w=ba*(1.0/da);z=ca*(1.0/da);k=+g[W+(h*44|0)+20>>2];m=+g[W+(h*44|0)+24>>2];o=+g[W+(h*44|0)+28>>2];switch(V|0){case 5:{r=aa*k+ba*m+ca*o<0.0?-1.0:1.0;i=z*o*r+(v*k*r+w*m*r);p=+g[W+(h*44|0)+36>>2]*.5;q=(c[j>>2]=$,+g[j>>2]);s=i*(aa*aa+ba*ba+ca*ca)*s*.5*q*p;if(i>0.0&i<.9847999811172485){A=da*t*.5*q*p*+D(+(1.0-i*i));B=(z*(v*o*r-z*k*r)-w*(w*k*r-v*m*r))*A*.3333333432674408;E=(v*(w*k*r-v*m*r)-z*(z*m*r-w*o*r))*A*.3333333432674408;A=(w*(z*m*r-w*o*r)-v*(v*o*r-z*k*r))*A*.3333333432674408}else{B=0.0;E=0.0;A=0.0}f=0;i=z*s*-.3333333432674408;m=w*s*-.3333333432674408;y=v*s*-.3333333432674408;e=X;o=v*s*-.3333333432674408;p=w*s*-.3333333432674408;v=z*s*-.3333333432674408;while(1){k=+g[e+88>>2];if(k>0.0){q=+g[I+512>>2];t=o*k*q;u=p*k*q;k=v*k*q;q=+g[e+40>>2];r=+g[e+44>>2];s=+g[e+48>>2];if(k*k+(t*t+u*u)>0.0?k*k+(t*t+u*u)>=q*q+r*r+s*s:0){i=+D(+(q*q+r*r+s*s))/+D(+(k*k+(t*t+u*u)))*.800000011920929;k=o*i;m=p*i;i=v*i;o=k;p=m;q=i}else{q=v;k=y}ha=e+56|0;fa=e+60|0;F=m+ +g[fa>>2];ga=e+64|0;G=i+ +g[ga>>2];g[ha>>2]=B+(k+ +g[ha>>2]);g[fa>>2]=E+F;g[ga>>2]=A+G}else{k=y;q=v}e=f+1|0;if((e|0)==3)break c;f=e;y=k;e=c[W+(h*44|0)+8+(e<<2)>>2]|0;v=q}}case 4:{G=aa*k+ba*m+ca*o<0.0?-1.0:1.0;k=k*G;m=m*G;o=o*G;break}case 6:break;default:break c}i=aa*k+ba*m+ca*o;if(i>0.0){p=-((c[j>>2]=$,+g[j>>2])*(aa*aa+ba*ba+ca*ca)*i*+g[W+(h*44|0)+36>>2]);r=(v*s*p+(k*t*p+0.0))*.3333333432674408;q=(w*s*p+(m*t*p+0.0))*.3333333432674408;p=(z*s*p+(o*t*p+0.0))*.3333333432674408;e=0;f=X;k=Y;m=Z;o=_;while(1){i=u*+g[f+88>>2];if(p*i*p*i+(r*i*r*i+q*i*q*i)>k*k+m*m+o*o){F=1.0/+D(+(p*p+(r*r+q*q)));G=o*p*F+(k*r*F+m*q*F);ha=f+56|0;g[ha>>2]=+g[ha>>2]-1.0/i*r*F*G;ha=f+60|0;g[ha>>2]=+g[ha>>2]-1.0/i*q*F*G;ha=f+64|0;g[ha>>2]=+g[ha>>2]-1.0/i*p*F*G}else{ha=f+56|0;g[ha>>2]=r+ +g[ha>>2];ha=f+60|0;g[ha>>2]=q+ +g[ha>>2];ha=f+64|0;g[ha>>2]=p+ +g[ha>>2]}e=e+1|0;if((e|0)==3)break c;ha=c[W+(h*44|0)+8+(e<<2)>>2]|0;f=ha;k=+g[ha+40>>2];m=+g[ha+44>>2];o=+g[ha+48>>2]}}}while(0);h=h+1|0}while((h|0)!=(n|0))}if((H|0)>0){e=0;do{ga=c[I+780>>2]|0;fa=ga+(e*104|0)+8|0;ha=ga+(e*104|0)+24|0;c[ha>>2]=c[fa>>2];c[ha+4>>2]=c[fa+4>>2];c[ha+8>>2]=c[fa+8>>2];c[ha+12>>2]=c[fa+12>>2];ha=ga+(e*104|0)+56|0;F=+g[ga+(e*104|0)+88>>2];G=+g[I+512>>2];B=+g[ha>>2]*F*G;E=F*+g[ga+(e*104|0)+60>>2]*G;F=G*F*+g[ga+(e*104|0)+64>>2];G=+g[(c[I+744>>2]|0)+12>>2]/G;B=B>G?G:B;E=E>G?G:E;F=F>G?G:F;x=ga+(e*104|0)+40|0;B=(B<-G?-G:B)+ +g[x>>2];g[x>>2]=B;x=ga+(e*104|0)+44|0;E=(E<-G?-G:E)+ +g[x>>2];g[x>>2]=E;x=ga+(e*104|0)+48|0;F=(F<-G?-G:F)+ +g[x>>2];g[x>>2]=F;G=+g[I+512>>2];g[fa>>2]=B*G+ +g[fa>>2];fa=ga+(e*104|0)+12|0;g[fa>>2]=G*E+ +g[fa>>2];ga=ga+(e*104|0)+16|0;g[ga>>2]=F*G+ +g[ga>>2];c[ha>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;c[ha+12>>2]=0;e=e+1|0}while((e|0)!=(H|0))}Tc(I);e=c[I+988>>2]|0;if(e){ha=c[I+192>>2]|0;E=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);G=+g[e+4>>2]-E;F=+g[e+8>>2]-E;g[I+952>>2]=+g[e>>2]-E;g[I+956>>2]=G;g[I+960>>2]=F;g[I+964>>2]=0.0;F=E+ +g[e+20>>2];G=E+ +g[e+24>>2];g[I+968>>2]=E+ +g[e+16>>2];g[I+972>>2]=F;g[I+976>>2]=G;g[I+980>>2]=0.0;e=c[I+188>>2]|0;if(e|0){ha=c[I+744>>2]|0;ga=c[ha+32>>2]|0;Zb[c[(c[ga>>2]|0)+16>>2]&31](ga,e,I+952|0,I+968|0,c[ha+36>>2]|0)}}else{c[I+952>>2]=0;c[I+952+4>>2]=0;c[I+952+8>>2]=0;c[I+952+12>>2]=0;c[I+952+16>>2]=0;c[I+952+20>>2]=0;c[I+952+24>>2]=0;c[I+952+28>>2]=0}f=c[I+772>>2]|0;if((f|0)>0){e=0;do{ga=c[I+780>>2]|0;F=+g[I+524>>2];B=+g[ga+(e*104|0)+8>>2];G=+g[ga+(e*104|0)+12>>2];E=+g[ga+(e*104|0)+16>>2];g[ea>>2]=B-F;g[ea+4>>2]=G-F;g[ea+8>>2]=E-F;g[ea+12>>2]=0.0;g[ea+16>>2]=F+B;g[ea+20>>2]=F+G;g[ea+24>>2]=F+E;g[ea+28>>2]=0.0;ha=c[ga+(e*104|0)+96>>2]|0;E=+g[I+520>>2];F=E*+g[ga+(e*104|0)+44>>2];G=E*+g[ga+(e*104|0)+48>>2];g[ea+128>>2]=+g[ga+(e*104|0)+40>>2]*E;g[ea+128+4>>2]=F;g[ea+128+8>>2]=G;g[ea+128+12>>2]=0.0;uh(I+988|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)!=(f|0))}if(c[I+1028>>2]|0?(c[I+812>>2]|0)>0:0){e=0;do{ha=c[I+820>>2]|0;H=c[ha+(e*44|0)+8>>2]|0;fa=c[ha+(e*44|0)+12>>2]|0;ga=c[ha+(e*44|0)+16>>2]|0;B=(+g[H+40>>2]+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408;E=(+g[H+44>>2]+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408;F=(+g[H+48>>2]+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408;w=+g[I+524>>2];t=+g[H+8>>2];v=+g[H+12>>2];z=+g[H+16>>2];G=+g[H+20>>2];A=+g[fa+8>>2];o=A>2];p=y>2];q=u>2];r=s>2];u=+g[ga+12>>2];y=+g[ga+16>>2];A=+g[ga+20>>2];g[ea>>2]=(s>2]=(u>2]=(y>2]=A>2]=w+(t>2]=w+(v>2]=w+(z>2]=G>2]|0;G=+g[I+520>>2];g[ea+128>>2]=B*G;g[ea+128+4>>2]=E*G;g[ea+128+8>>2]=F*G;g[ea+128+12>>2]=0.0;uh(I+1028|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)<(c[I+812>>2]|0))}do if(a[I+533>>0]|0){x=c[I+772>>2]|0;if((x|0)>0){f=c[I+780>>2]|0;h=c[I+572>>2]|0;e=0;i=0.0;k=0.0;m=0.0;do{G=+g[h+(e<<2)>>2];i=i+ +g[f+(e*104|0)+8>>2]*G;k=k+G*+g[f+(e*104|0)+12>>2];m=m+G*+g[f+(e*104|0)+16>>2];e=e+1|0}while((e|0)!=(x|0))}else{i=0.0;k=0.0;m=0.0}g[I+580>>2]=i;g[I+584>>2]=k;g[I+588>>2]=m;g[I+592>>2]=0.0;h=ea+128+4|0;n=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));g[ea+128>>2]=1.1920928955078125e-07;g[ea+128+20>>2]=2.384185791015625e-07;g[ea+128+40>>2]=3.5762786865234375e-07;if((x|0)>0){f=c[I+572>>2]|0;h=c[I+780>>2]|0;n=c[I+552>>2]|0;e=0;o=1.1920928955078125e-07;p=0.0;q=0.0;r=0.0;s=2.384185791015625e-07;t=0.0;u=0.0;v=0.0;w=3.5762786865234375e-07;do{F=+g[f+(e<<2)>>2];z=(+g[h+(e*104|0)+8>>2]-i)*F;A=(+g[h+(e*104|0)+12>>2]-k)*F;F=F*(+g[h+(e*104|0)+16>>2]-m);B=+g[n+(e<<4)>>2];E=+g[n+(e<<4)+4>>2];G=+g[n+(e<<4)+8>>2];o=z*B+o;p=z*E+p;q=z*G+q;r=A*B+r;s=A*E+s;t=A*G+t;u=F*B+u;v=F*E+v;w=F*G+w;e=e+1|0}while((e|0)!=(x|0));g[ea+128>>2]=o;g[ea+128+4>>2]=p;g[ea+128+8>>2]=q;g[ea+128+16>>2]=r;g[ea+128+20>>2]=s;g[ea+128+24>>2]=t;g[ea+128+32>>2]=u;g[ea+128+36>>2]=v;g[ea+128+40>>2]=w}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(ea+128|0,ea+80|0,ea+32|0);c[I+596>>2]=c[ea+80>>2];c[I+596+4>>2]=c[ea+80+4>>2];c[I+596+8>>2]=c[ea+80+8>>2];c[I+596+12>>2]=c[ea+80+12>>2];c[I+612>>2]=c[L>>2];c[I+612+4>>2]=c[L+4>>2];c[I+612+8>>2]=c[L+8>>2];c[I+612+12>>2]=c[L+12>>2];c[I+628>>2]=c[P>>2];c[I+628+4>>2]=c[P+4>>2];c[I+628+8>>2]=c[P+8>>2];c[I+628+12>>2]=c[P+12>>2];la=+g[ea+80>>2];v=+g[L>>2];A=+g[P>>2];ka=+g[ea+80+4>>2];w=+g[ea+80+20>>2];E=+g[ea+80+36>>2];ja=+g[ea+80+8>>2];y=+g[ea+80+24>>2];G=+g[ea+80+40>>2];p=+g[I+692>>2];o=+g[I+696>>2];m=+g[I+700>>2];ra=+g[I+708>>2];qa=+g[I+712>>2];q=+g[I+716>>2];B=+g[I+724>>2];F=+g[I+728>>2];u=+g[I+732>>2];pa=+g[ea+128>>2];oa=+g[ea+128+16>>2];r=+g[ea+128+32>>2];i=(la*p+ka*o+ja*m)*pa+(v*p+w*o+y*m)*oa+(A*p+E*o+G*m)*r;na=+g[ea+128+4>>2];ma=+g[ea+128+20>>2];s=+g[ea+128+36>>2];k=(la*p+ka*o+ja*m)*na+(v*p+w*o+y*m)*ma+(A*p+E*o+G*m)*s;ia=+g[ea+128+8>>2];z=+g[ea+128+24>>2];t=+g[ea+128+40>>2];m=(la*p+ka*o+ja*m)*ia+(v*p+w*o+y*m)*z+(A*p+E*o+G*m)*t;o=(la*ra+ka*qa+ja*q)*pa+(v*ra+w*qa+y*q)*oa+(A*ra+E*qa+G*q)*r;p=(la*ra+ka*qa+ja*q)*na+(v*ra+w*qa+y*q)*ma+(A*ra+E*qa+G*q)*s;q=(la*ra+ka*qa+ja*q)*ia+(v*ra+w*qa+y*q)*z+(A*ra+E*qa+G*q)*t;r=pa*(la*B+ka*F+ja*u)+oa*(v*B+w*F+y*u)+(A*B+E*F+G*u)*r;s=(la*B+ka*F+ja*u)*na+(v*B+w*F+y*u)*ma+(A*B+E*F+G*u)*s;t=(la*B+ka*F+ja*u)*ia+(v*B+w*F+y*u)*z+(A*B+E*F+G*u)*t;g[I+644>>2]=i;g[I+648>>2]=k;g[I+652>>2]=m;g[I+656>>2]=0.0;g[I+660>>2]=o;g[I+664>>2]=p;g[I+668>>2]=q;g[I+672>>2]=0.0;g[I+676>>2]=r;g[I+680>>2]=s;g[I+684>>2]=t;g[I+688>>2]=0.0;u=+g[I+424>>2];if(u>1.0){ra=1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))<1.0?1.0:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))>u?u:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)));g[I+644>>2]=i*ra;g[I+648>>2]=k*ra;g[I+652>>2]=m*ra;g[I+656>>2]=0.0;g[I+660>>2]=o*ra;g[I+664>>2]=p*ra;g[I+668>>2]=q*ra;g[I+672>>2]=0.0;g[I+676>>2]=r*ra;g[I+680>>2]=s*ra;g[I+684>>2]=ra*t;g[I+688>>2]=0.0}if(a[I+533>>0]|0?+g[I+380>>2]>0.0:0){i=+g[I+596>>2];p=+g[I+600>>2];q=+g[I+604>>2];r=+g[I+612>>2];s=+g[I+616>>2];t=+g[I+620>>2];k=+g[I+628>>2];m=+g[I+632>>2];o=+g[I+636>>2];f=c[I+772>>2]|0;if((f|0)<=0)break;e=0;do{h=c[I+780>>2]|0;if(+g[h+(e*104|0)+88>>2]>0.0){fa=c[I+552>>2]|0;ma=+g[fa+(e<<4)>>2];na=+g[fa+(e<<4)+4>>2];oa=+g[fa+(e<<4)+8>>2];la=+g[I+380>>2];fa=h+(e*104|0)+8|0;pa=+g[fa>>2];ga=h+(e*104|0)+12|0;qa=+g[ga>>2];ha=h+(e*104|0)+16|0;ra=+g[ha>>2];qa=qa+la*(r*ma+s*na+t*oa+ +g[I+584>>2]-qa);ra=ra+la*(k*ma+m*na+o*oa+ +g[I+588>>2]-ra);g[fa>>2]=pa+la*(+g[I+580>>2]+(i*ma+p*na+q*oa)-pa);g[ga>>2]=qa;g[ha>>2]=ra;g[h+(e*104|0)+20>>2]=0.0}e=e+1|0}while((e|0)!=(f|0))}}while(0);h=ea+128|0;n=h+104|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+872>>2]|0;if((e|0)<0){if((c[I+876>>2]|0)<0){f=c[I+880>>2]|0;if(f|0){if(a[I+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+880>>2]=0}a[I+884>>0]=1;c[I+880>>2]=0;c[I+876>>2]=0}do{ha=c[I+880>>2]|0;ga=ha+(e*104|0)|0;c[ga>>2]=c[ea+128>>2];c[ga+4>>2]=c[ea+128+4>>2];c[ga+8>>2]=c[ea+128+8>>2];c[ga+12>>2]=c[ea+128+12>>2];c[ga+16>>2]=c[ea+128+16>>2];c[ga+20>>2]=c[ea+128+20>>2];c[ga+24>>2]=c[ea+128+24>>2];ga=ha+(e*104|0)+28|0;c[ga>>2]=c[ea+128+28>>2];c[ga+4>>2]=c[ea+128+28+4>>2];c[ga+8>>2]=c[ea+128+28+8>>2];c[ga+12>>2]=c[ea+128+28+12>>2];ga=ha+(e*104|0)+44|0;c[ga>>2]=c[ea+128+44>>2];c[ga+4>>2]=c[ea+128+44+4>>2];c[ga+8>>2]=c[ea+128+44+8>>2];c[ga+12>>2]=c[ea+128+44+12>>2];ga=ha+(e*104|0)+60|0;c[ga>>2]=c[ea+128+60>>2];c[ga+4>>2]=c[ea+128+60+4>>2];c[ga+8>>2]=c[ea+128+60+8>>2];c[ga+12>>2]=c[ea+128+60+12>>2];ha=ha+(e*104|0)+76|0;c[ha>>2]=c[K>>2];c[ha+4>>2]=c[K+4>>2];c[ha+8>>2]=c[K+8>>2];c[ha+12>>2]=c[K+12>>2];c[ha+16>>2]=c[K+16>>2];c[ha+20>>2]=c[K+20>>2];c[ha+24>>2]=c[K+24>>2];e=e+1|0}while((e|0)!=0)}c[I+872>>2]=0;h=ea+128|0;n=h+56|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+892>>2]|0;if((e|0)<0){if((c[I+896>>2]|0)<0){f=c[I+900>>2]|0;if(f|0){if(a[I+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+900>>2]=0}a[I+904>>0]=1;c[I+900>>2]=0;c[I+896>>2]=0}do{h=(c[I+900>>2]|0)+(e*56|0)|0;f=ea+128|0;n=h+56|0;do{c[h>>2]=c[f>>2];h=h+4|0;f=f+4|0}while((h|0)<(n|0));e=e+1|0}while((e|0)!=0)}c[I+892>>2]=0;ng(I+988|0,1);ng(I+1028|0,1);ng(I+1068|0,1);e=c[b+24>>2]|0}}J=J+1|0}while((J|0)<(e|0));l=ea;return}function oc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0;Q=l;l=l+448|0;if(!(a[b+527>>0]|0)){l=Q;return}P=c[b+28>>2]|0;C=+g[b+348>>2];B=+g[b+352>>2];J=+g[b+356>>2];E=+g[P+52>>2];F=C*+g[P+4>>2]+B*+g[P+8>>2]+J*+g[P+12>>2]+E;G=+g[P+56>>2];H=C*+g[P+20>>2]+B*+g[P+24>>2]+J*+g[P+28>>2]+G;I=+g[P+60>>2];J=C*+g[P+36>>2]+B*+g[P+40>>2]+J*+g[P+44>>2]+I;P=c[b+32>>2]|0;B=+g[b+412>>2];C=+g[b+416>>2];r=+g[b+420>>2];k=+g[P+52>>2];m=B*+g[P+4>>2]+C*+g[P+8>>2]+r*+g[P+12>>2]+k;n=+g[P+56>>2];o=B*+g[P+20>>2]+C*+g[P+24>>2]+r*+g[P+28>>2]+n;q=+g[P+60>>2];r=B*+g[P+36>>2]+C*+g[P+40>>2]+r*+g[P+44>>2]+q;if(!(a[b+524>>0]|0)){A=+g[d+192>>2]+ +g[d+80>>2];B=+g[d+196>>2]+ +g[d+84>>2];z=+g[d+200>>2]+ +g[d+88>>2];C=+g[e+192>>2]+ +g[e+80>>2];y=+g[e+196>>2]+ +g[e+84>>2];w=+g[e+200>>2]+ +g[e+88>>2];s=+g[d+176>>2]+ +g[d+64>>2]+((J-I)*B-(H-G)*z)-(+g[e+176>>2]+ +g[e+64>>2]+((r-q)*y-(o-n)*w));w=+g[d+180>>2]+ +g[d+68>>2]+((F-E)*z-(J-I)*A)-(+g[e+180>>2]+ +g[e+68>>2]+((m-k)*w-(r-q)*C));y=+g[d+184>>2]+ +g[d+72>>2]+((H-G)*A-(F-E)*B)-(+g[e+184>>2]+ +g[e+72>>2]+((o-n)*C-(m-k)*y));t=(c[d+240>>2]|0)==0;p=0;do{C=1.0/+g[b+48+(p*84|0)+80>>2];u=b+48+(p*84|0)|0;B=+g[u>>2];v=b+48+(p*84|0)+4|0;A=+g[v>>2];x=b+48+(p*84|0)+8|0;z=+g[x>>2];z=C*(((F-m)*B+(H-o)*A+(J-r)*z)*-.30000001192092896/f)-C*(s*B+w*A+y*z);g[b+36>>2]=+g[b+36>>2]+z;A=+g[x>>2];B=+g[v>>2];C=+g[u>>2];h=c[b+28>>2]|0;i=+g[h+404>>2];if(!t){T=((H-G)*A-(J-I)*B)*+g[h+356>>2]+((J-I)*C-(F-E)*A)*+g[h+360>>2]+((F-E)*B-(H-G)*C)*+g[h+364>>2];R=((H-G)*A-(J-I)*B)*+g[h+340>>2]+((J-I)*C-(F-E)*A)*+g[h+344>>2]+((F-E)*B-(H-G)*C)*+g[h+348>>2];S=((H-G)*A-(J-I)*B)*+g[h+324>>2]+((J-I)*C-(F-E)*A)*+g[h+328>>2]+((F-E)*B-(H-G)*C)*+g[h+332>>2];V=z*B*i*+g[d+116>>2];U=z*A*i*+g[d+120>>2];g[d+64>>2]=z*C*i*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];R=R*z*+g[d+100>>2];i=T*z*+g[d+104>>2];g[d+80>>2]=S*z*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=R+ +g[d+84>>2];g[d+88>>2]=i+ +g[d+88>>2]}h=c[b+32>>2]|0;i=+g[h+404>>2];if(c[e+240>>2]|0){V=((o-n)*A-(r-q)*B)*+g[h+356>>2]+((r-q)*C-(m-k)*A)*+g[h+360>>2]+((m-k)*B-(o-n)*C)*+g[h+364>>2];U=((o-n)*A-(r-q)*B)*+g[h+340>>2]+((r-q)*C-(m-k)*A)*+g[h+344>>2]+((m-k)*B-(o-n)*C)*+g[h+348>>2];T=((o-n)*A-(r-q)*B)*+g[h+324>>2]+((r-q)*C-(m-k)*A)*+g[h+328>>2]+((m-k)*B-(o-n)*C)*+g[h+332>>2];R=i*+g[v>>2]*-z*+g[e+116>>2];S=i*+g[x>>2]*-z*+g[e+120>>2];g[e+64>>2]=+g[e+112>>2]*i*+g[u>>2]*-z+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-z;V=V*+g[e+104>>2]*-z;g[e+80>>2]=T*+g[e+96>>2]*-z+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2]}p=p+1|0}while((p|0)!=3)}do if(!(a[b+552>>0]|0)){i=+g[b+440>>2];if(!(i>1.1920928955078125e-07)){K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0;break}k=+g[e+192>>2]+ +g[e+80>>2]-(+g[d+192>>2]+ +g[d+80>>2]);m=+g[e+196>>2]+ +g[e+84>>2]-(+g[d+196>>2]+ +g[d+84>>2]);n=+g[e+200>>2]+ +g[e+88>>2]-(+g[d+200>>2]+ +g[d+88>>2]);if(k*k+m*m+n*n>1.1920928955078125e-07){E=1.0/+D(+(k*k+m*m+n*n));h=c[b+28>>2]|0;q=+g[h+324>>2];r=+g[h+340>>2];s=+g[h+356>>2];w=+g[h+328>>2];y=+g[h+344>>2];z=+g[h+360>>2];A=+g[h+332>>2];B=+g[h+348>>2];C=+g[h+364>>2];h=c[b+32>>2]|0;i=i*(1.0/(k*E*(q*k*E+m*E*r+n*E*s)+m*E*(k*E*w+m*E*y+n*E*z)+n*E*(k*E*A+m*E*B+n*E*C)+(k*E*(k*E*+g[h+324>>2]+m*E*+g[h+340>>2]+n*E*+g[h+356>>2])+m*E*(k*E*+g[h+328>>2]+m*E*+g[h+344>>2]+n*E*+g[h+360>>2])+n*E*(k*E*+g[h+332>>2]+m*E*+g[h+348>>2]+n*E*+g[h+364>>2]))));E=+D(+(n*i*n*i+(k*i*k*i+m*i*m*i)));o=1.0/E*k*i;k=1.0/E*m*i;i=1.0/E*n*i;if(c[d+240>>2]|0){V=E*0.0*+g[d+116>>2];U=E*0.0*+g[d+120>>2];g[d+64>>2]=E*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];U=(o*r+k*y+i*B)*E*+g[d+100>>2];V=(o*s+k*z+i*C)*E*+g[d+104>>2];g[d+80>>2]=(o*q+k*w+i*A)*E*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=U+ +g[d+84>>2];g[d+88>>2]=V+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){V=o*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];U=o*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];T=o*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];R=E*-0.0*+g[e+116>>2];S=E*-0.0*+g[e+120>>2];g[e+64>>2]=E*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-E;V=V*+g[e+104>>2]*-E;g[e+80>>2]=T*+g[e+96>>2]*-E+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2];K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{O=c[b+28>>2]|0;c[Q+352>>2]=c[O+4>>2];c[Q+352+4>>2]=c[O+4+4>>2];c[Q+352+8>>2]=c[O+4+8>>2];c[Q+352+12>>2]=c[O+4+12>>2];c[Q+352+16>>2]=c[O+20>>2];c[Q+352+16+4>>2]=c[O+20+4>>2];c[Q+352+16+8>>2]=c[O+20+8>>2];c[Q+352+16+12>>2]=c[O+20+12>>2];c[Q+352+32>>2]=c[O+36>>2];c[Q+352+32+4>>2]=c[O+36+4>>2];c[Q+352+32+8>>2]=c[O+36+8>>2];c[Q+352+32+12>>2]=c[O+36+12>>2];c[Q+352+48>>2]=c[O+52>>2];c[Q+352+48+4>>2]=c[O+52+4>>2];c[Q+352+48+8>>2]=c[O+52+8>>2];c[Q+352+48+12>>2]=c[O+52+12>>2];O=c[b+32>>2]|0;c[Q+288>>2]=c[O+4>>2];c[Q+288+4>>2]=c[O+4+4>>2];c[Q+288+8>>2]=c[O+4+8>>2];c[Q+288+12>>2]=c[O+4+12>>2];c[Q+288+16>>2]=c[O+20>>2];c[Q+288+16+4>>2]=c[O+20+4>>2];c[Q+288+16+8>>2]=c[O+20+8>>2];c[Q+288+16+12>>2]=c[O+20+12>>2];c[Q+288+32>>2]=c[O+36>>2];c[Q+288+32+4>>2]=c[O+36+4>>2];c[Q+288+32+8>>2]=c[O+36+8>>2];c[Q+288+32+12>>2]=c[O+36+12>>2];c[Q+288+48>>2]=c[O+52>>2];c[Q+288+48+4>>2]=c[O+52+4>>2];c[Q+288+48+8>>2]=c[O+52+8>>2];c[Q+288+48+12>>2]=c[O+52+12>>2];T=+g[d+196>>2]+ +g[d+84>>2];s=+g[d+200>>2]+ +g[d+88>>2];g[Q+272>>2]=+g[d+192>>2]+ +g[d+80>>2];g[Q+272+4>>2]=T;g[Q+272+8>>2]=s;g[Q+272+12>>2]=0.0;s=+g[e+196>>2]+ +g[e+84>>2];T=+g[e+200>>2]+ +g[e+88>>2];g[Q+256>>2]=+g[e+192>>2]+ +g[e+80>>2];g[Q+256+4>>2]=s;g[Q+256+8>>2]=T;g[Q+256+12>>2]=0.0;c[Q+192>>2]=1065353216;O=Q+192+4|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;c[Q+192+20>>2]=1065353216;P=Q+192+24|0;c[P>>2]=0;c[P+4>>2]=0;c[P+8>>2]=0;c[P+12>>2]=0;c[Q+192+40>>2]=1065353216;M=Q+192+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;Af(Q+352|0,0.0,0.0,0.0,Q+272|0,f,Q+192|0);c[Q+128>>2]=1065353216;M=Q+128+4|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[Q+128+20>>2]=1065353216;N=Q+128+24|0;c[N>>2]=0;c[N+4>>2]=0;c[N+8>>2]=0;c[N+12>>2]=0;c[Q+128+40>>2]=1065353216;L=Q+128+44|0;c[L>>2]=0;c[L+4>>2]=0;c[L+8>>2]=0;c[L+12>>2]=0;c[L+16>>2]=0;Af(Q+288|0,0.0,0.0,0.0,Q+256|0,f,Q+128|0);T=+g[b+556>>2];s=+g[b+560>>2];U=+g[b+564>>2];w=+g[b+568>>2];H=T*(2.0/(T*T+s*s+U*U+w*w));B=s*(2.0/(T*T+s*s+U*U+w*w));I=U*(2.0/(T*T+s*s+U*U+w*w));X=+g[b+364>>2];W=+g[b+368>>2];_=+g[b+372>>2];k=_*(T*I-w*B)+(W*(T*B+w*I)+X*(1.0-(s*B+U*I)));m=_*(s*I+w*H)+(X*(T*B-w*I)+W*(1.0-(T*H+U*I)));n=X*(T*I+w*B)+W*(s*I-w*H)+_*(1.0-(T*H+s*B));i=+g[b+380>>2];G=+g[b+384>>2];C=+g[b+388>>2];o=(T*I-w*B)*C+(G*(T*B+w*I)+i*(1.0-(s*B+U*I)));q=(s*I+w*H)*C+(i*(T*B-w*I)+G*(1.0-(T*H+U*I)));r=i*(T*I+w*B)+G*(s*I-w*H)+C*(1.0-(T*H+s*B));R=+g[b+396>>2];E=+g[b+400>>2];A=+g[b+404>>2];S=(1.0-(s*B+U*I))*R+(T*B+w*I)*E+(T*I-w*B)*A;U=(T*B-w*I)*R+(1.0-(T*H+U*I))*E+(s*I+w*H)*A;B=(T*I+w*B)*R+(s*I-w*H)*E+(1.0-(T*H+s*B))*A;s=+g[b+300>>2];H=+g[b+316>>2];T=+g[b+332>>2];w=+g[b+304>>2];I=+g[b+320>>2];V=+g[b+336>>2];F=+g[b+308>>2];J=+g[b+324>>2];z=+g[b+340>>2];y=-+g[b+348>>2];ba=-+g[b+352>>2];Z=-+g[b+356>>2];_=X*0.0+W*0.0+_*0.0+ +g[b+412>>2]+(n*(F*y+J*ba+z*Z)+(k*(s*y+H*ba+T*Z)+m*(w*y+I*ba+V*Z)));C=i*0.0+G*0.0+C*0.0+ +g[b+416>>2]+(r*(F*y+J*ba+z*Z)+(o*(s*y+H*ba+T*Z)+q*(w*y+I*ba+V*Z)));Z=R*0.0+E*0.0+A*0.0+ +g[b+420>>2]+(B*(F*y+J*ba+z*Z)+(S*(s*y+H*ba+T*Z)+U*(w*y+I*ba+V*Z)));ba=+g[Q+128>>2];y=+g[M>>2];A=+g[Q+128+8>>2];E=+g[Q+128+16>>2];R=+g[Q+128+20>>2];G=+g[N>>2];i=+g[Q+128+32>>2];W=+g[Q+128+36>>2];X=+g[Q+128+40>>2];Y=A*Z+(ba*_+y*C)+ +g[Q+128+48>>2];$=E*_+C*R+Z*G+ +g[Q+128+52>>2];aa=_*i+C*W+Z*X+ +g[Q+128+56>>2];g[Q+64>>2]=(k*s+m*w+n*F)*ba+(o*s+q*w+r*F)*y+(S*s+U*w+B*F)*A;g[Q+64+4>>2]=(k*H+m*I+n*J)*ba+(o*H+q*I+r*J)*y+(S*H+U*I+B*J)*A;g[Q+64+8>>2]=(k*T+m*V+n*z)*ba+(o*T+q*V+r*z)*y+(S*T+U*V+B*z)*A;g[Q+64+12>>2]=0.0;g[Q+64+16>>2]=(k*s+m*w+n*F)*E+(o*s+q*w+r*F)*R+(S*s+U*w+B*F)*G;g[Q+64+20>>2]=(k*H+m*I+n*J)*E+(o*H+q*I+r*J)*R+(S*H+U*I+B*J)*G;g[Q+64+24>>2]=(k*T+m*V+n*z)*E+(o*T+q*V+r*z)*R+(S*T+U*V+B*z)*G;g[Q+64+28>>2]=0.0;g[Q+64+32>>2]=(k*s+m*w+n*F)*i+(o*s+q*w+r*F)*W+(S*s+U*w+B*F)*X;g[Q+64+36>>2]=(k*H+m*I+n*J)*i+(o*H+q*I+r*J)*W+(S*H+U*I+B*J)*X;g[Q+64+40>>2]=(k*T+m*V+n*z)*i+(o*T+q*V+r*z)*W+(S*T+U*V+B*z)*X;g[Q+64+44>>2]=0.0;g[Q+64+48>>2]=Y;g[Q+64+52>>2]=$;g[Q+64+56>>2]=aa;g[Q+64+60>>2]=0.0;aa=(S*s+U*w+B*F)*-Z+((k*s+m*w+n*F)*-_+(o*s+q*w+r*F)*-C);$=(S*H+U*I+B*J)*-Z+((k*H+m*I+n*J)*-_+(o*H+q*I+r*J)*-C);C=(S*T+U*V+B*z)*-Z+((k*T+m*V+n*z)*-_+(o*T+q*V+r*z)*-C);_=+g[Q+192>>2];Z=+g[O>>2];Y=+g[Q+192+8>>2];X=+g[Q+192+16>>2];W=+g[Q+192+20>>2];i=+g[P>>2];G=+g[Q+192+32>>2];R=+g[Q+192+36>>2];E=+g[Q+192+40>>2];A=aa*_+$*Z+C*Y+ +g[Q+192+48>>2];y=aa*X+$*W+C*i+ +g[Q+192+52>>2];C=aa*G+$*R+C*E+ +g[Q+192+56>>2];g[Q>>2]=(k*s+m*w+n*F)*_+(k*H+m*I+n*J)*Z+(k*T+m*V+n*z)*Y;g[Q+4>>2]=(o*s+q*w+r*F)*_+(o*H+q*I+r*J)*Z+(o*T+q*V+r*z)*Y;g[Q+8>>2]=(S*s+U*w+B*F)*_+(S*H+U*I+B*J)*Z+(S*T+U*V+B*z)*Y;g[Q+12>>2]=0.0;g[Q+16>>2]=(k*s+m*w+n*F)*X+(k*H+m*I+n*J)*W+(k*T+m*V+n*z)*i;g[Q+20>>2]=(o*s+q*w+r*F)*X+(o*H+q*I+r*J)*W+(o*T+q*V+r*z)*i;g[Q+24>>2]=(S*s+U*w+B*F)*X+(S*H+U*I+B*J)*W+(S*T+U*V+B*z)*i;g[Q+28>>2]=0.0;g[Q+32>>2]=(k*s+m*w+n*F)*G+(k*H+m*I+n*J)*R+(k*T+m*V+n*z)*E;g[Q+36>>2]=(o*s+q*w+r*F)*G+(o*H+q*I+r*J)*R+(o*T+q*V+r*z)*E;g[Q+40>>2]=(S*s+U*w+B*F)*G+(S*H+U*I+B*J)*R+(S*T+U*V+B*z)*E;g[Q+44>>2]=0.0;g[Q+48>>2]=A;g[Q+52>>2]=y;g[Q+56>>2]=C;g[Q+60>>2]=0.0;If(Q+352|0,Q+64|0,Q+424|0,Q+416|0);C=+g[Q+416>>2];y=1.0/f*+g[Q+424>>2]*C;A=1.0/f*C*+g[Q+424+4>>2];C=1.0/f*C*+g[Q+424+8>>2];If(Q+288|0,Q,Q+424|0,Q+416|0);E=+g[Q+416>>2];y=y-+g[Q+272>>2];A=A-+g[Q+272+4>>2];C=C-+g[Q+272+8>>2];z=1.0/f*+g[Q+424>>2]*E-+g[Q+256>>2];B=1.0/f*E*+g[Q+424+4>>2]-+g[Q+256+4>>2];E=1.0/f*E*+g[Q+424+8>>2]-+g[Q+256+8>>2];if(y*y+A*A+C*C>1.1920928955078125e-07){s=1.0/+D(+(y*y+A*A+C*C));P=c[b+28>>2]|0;o=y*s*(+g[P+324>>2]*y*s+A*s*+g[P+340>>2]+C*s*+g[P+356>>2])+A*s*(y*s*+g[P+328>>2]+A*s*+g[P+344>>2]+C*s*+g[P+360>>2])+C*s*(y*s*+g[P+332>>2]+A*s*+g[P+348>>2]+C*s*+g[P+364>>2]);k=y*s;n=A*s;s=C*s}else{o=0.0;k=0.0;n=0.0;s=0.0}if(z*z+B*B+E*E>1.1920928955078125e-07){r=1.0/+D(+(z*z+B*B+E*E));P=c[b+32>>2]|0;q=z*r*(+g[P+324>>2]*z*r+B*r*+g[P+340>>2]+E*r*+g[P+356>>2])+B*r*(z*r*+g[P+328>>2]+B*r*+g[P+344>>2]+E*r*+g[P+360>>2])+E*r*(z*r*+g[P+332>>2]+B*r*+g[P+348>>2]+E*r*+g[P+364>>2]);i=z*r;m=B*r;r=E*r}else{q=0.0;i=0.0;m=0.0;r=0.0}w=o*k+q*i;k=o*n+q*m;i=o*s+q*r;if(w*w+k*k+i*i>1.1920928955078125e-07){n=1.0/+D(+(w*w+k*k+i*i));p=c[b+28>>2]|0;m=w*n*(+g[p+324>>2]*w*n+k*n*+g[p+340>>2]+i*n*+g[p+356>>2])+k*n*(w*n*+g[p+328>>2]+k*n*+g[p+344>>2]+i*n*+g[p+360>>2])+i*n*(w*n*+g[p+332>>2]+k*n*+g[p+348>>2]+i*n*+g[p+364>>2]);h=c[b+32>>2]|0;n=w*n*(w*n*+g[h+324>>2]+k*n*+g[h+340>>2]+i*n*+g[h+356>>2])+k*n*(w*n*+g[h+328>>2]+k*n*+g[h+344>>2]+i*n*+g[h+360>>2])+i*n*(w*n*+g[h+332>>2]+k*n*+g[h+348>>2]+i*n*+g[h+364>>2]);w=(y*m-z*n)*(1.0/((m+n)*(m+n)));i=(A*m-B*n)*(1.0/((m+n)*(m+n)));n=(C*m-E*n)*(1.0/((m+n)*(m+n)));k=+g[b+572>>2];if(!(k>=0.0))k=w;else{m=(a[b+553>>0]|0)==0?k:k/m;q=+g[b+576>>2];r=+g[b+580>>2];s=+g[b+584>>2];o=+D(+((w+q)*(w+q)+(i+r)*(i+r)+(n+s)*(n+s)));if(o>m){k=m*(w+q)*(1.0/o)-q;n=m*(n+s)*(1.0/o)-s;i=m*(i+r)*(1.0/o)-r}else k=w;g[b+576>>2]=k+q;g[b+580>>2]=i+r;g[b+584>>2]=n+s}o=+D(+(k*k+i*i+n*n));m=k*(1.0/o);k=i*(1.0/o);i=n*(1.0/o);if(c[d+240>>2]|0){ba=m*+g[p+356>>2]+k*+g[p+360>>2]+i*+g[p+364>>2];aa=m*+g[p+340>>2]+k*+g[p+344>>2]+i*+g[p+348>>2];$=m*+g[p+324>>2]+k*+g[p+328>>2]+i*+g[p+332>>2];Z=o*0.0*+g[d+116>>2];_=o*0.0*+g[d+120>>2];g[d+64>>2]=o*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*o*+g[d+100>>2];ba=ba*o*+g[d+104>>2];g[d+80>>2]=$*o*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=aa+ +g[d+84>>2];g[d+88>>2]=ba+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=o*-0.0*+g[e+116>>2];_=o*-0.0*+g[e+120>>2];g[e+64>>2]=o*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-o;ba=ba*+g[e+104>>2]*-o;g[e+80>>2]=$*+g[e+96>>2]*-o+ +g[e+80>>2];g[e+84>>2]=aa+ +g[e+84>>2];g[e+88>>2]=ba+ +g[e+88>>2]}}K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}while(0);z=+g[h>>2]+ +g[K>>2];y=+g[p>>2]+ +g[L>>2];w=+g[t>>2]+ +g[M>>2];s=+g[u>>2]+ +g[N>>2];r=+g[v>>2]+ +g[O>>2];q=+g[x>>2]+ +g[P>>2];if(a[b+526>>0]|0){k=+g[b+528>>2];i=k*+g[b+504>>2]*+g[b+432>>2]/f;m=+g[b+460>>2];n=+g[b+464>>2];o=+g[b+468>>2];if((s-z)*m+(r-y)*n+(q-w)*o>0.0)i=i+k*((s-z)*m+(r-y)*n+(q-w)*o)*+g[b+436>>2];aa=+g[b+516>>2];_=aa+i*+g[b+492>>2];g[Q+424>>2]=_;g[Q+416>>2]=0.0;h=c[(_>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+516>>2]=h;aa=(c[j>>2]=h,+g[j>>2])-aa;_=+g[b+536>>2];$=+g[b+540>>2];i=+g[b+544>>2];k=aa*m-_*(aa*m*_+aa*n*$+aa*o*i);ba=aa*n-$*(aa*m*_+aa*n*$+aa*o*i);n=aa*o-i*(aa*m*_+aa*n*$+aa*o*i);i=+D(+(n*n+(k*k+ba*ba)));k=1.0/i*k;m=1.0/i*ba;n=1.0/i*n;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*0.0*+g[d+116>>2];_=i*0.0*+g[d+120>>2];g[d+64>>2]=i*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*i*+g[d+100>>2];ba=ba*i*+g[d+104>>2];g[K>>2]=$*i*+g[d+96>>2]+ +g[K>>2];g[L>>2]=aa+ +g[L>>2];g[M>>2]=ba+ +g[M>>2]}h=c[b+32>>2]|0;if(c[e+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*-0.0*+g[e+116>>2];_=i*-0.0*+g[e+120>>2];g[e+64>>2]=i*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-i;ba=ba*+g[e+104>>2]*-i;g[N>>2]=$*+g[e+96>>2]*-i+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2]}}if(!(a[b+525>>0]|0)){l=Q;return}o=+g[b+532>>2];n=o*+g[b+508>>2]*+g[b+432>>2]/f;m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2];if((s-z)*m+(r-y)*k+(q-w)*i>0.0)n=n+o*((s-z)*m+(r-y)*k+(q-w)*i)*+g[b+436>>2];ba=+g[b+520>>2];n=ba+n*+g[b+496>>2];g[Q+424>>2]=n;g[Q+416>>2]=0.0;h=c[(n>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+520>>2]=h;n=(c[j>>2]=h,+g[j>>2])-ba;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];i=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];m=n*0.0*+g[d+116>>2];k=n*0.0*+g[d+120>>2];g[d+64>>2]=n*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=m+ +g[d+68>>2];g[d+72>>2]=k+ +g[d+72>>2];k=aa*n*+g[d+100>>2];m=ba*n*+g[d+104>>2];g[K>>2]=i*n*+g[d+96>>2]+ +g[K>>2];g[L>>2]=k+ +g[L>>2];g[M>>2]=m+ +g[M>>2];m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2]}h=c[b+32>>2]|0;if(!(c[e+240>>2]|0)){l=Q;return}ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=n*-0.0*+g[e+116>>2];_=n*-0.0*+g[e+120>>2];g[e+64>>2]=n*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-n;ba=ba*+g[e+104>>2]*-n;g[N>>2]=$*+g[e+96>>2]*-n+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2];l=Q;return}function pc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0.0,_=0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0;Ea=l;l=l+528|0;c[Ea+56>>2]=c[b>>2];c[Ea+8>>2]=c[b+64>>2];k=Ea+56+4|0;c[k>>2]=c[b+4>>2];c[Ea+8+4>>2]=c[b+68>>2];c[Ea+56+8>>2]=c[b+8>>2];c[Ea+8+8>>2]=c[b+72>>2];c[Ea+56+16>>2]=c[b+16>>2];c[Ea+8+16>>2]=c[b+80>>2];c[Ea+56+20>>2]=c[b+20>>2];c[Ea+8+20>>2]=c[b+84>>2];c[Ea+56+24>>2]=c[b+24>>2];c[Ea+8+24>>2]=c[b+88>>2];c[Ea+56+32>>2]=c[b+32>>2];c[Ea+8+32>>2]=c[b+96>>2];c[Ea+56+36>>2]=c[b+36>>2];c[Ea+8+36>>2]=c[b+100>>2];c[Ea+56+40>>2]=c[b+40>>2];c[Ea+8+40>>2]=c[b+104>>2];Aa=c[a+4>>2]|0;ia=+g[Aa+32>>2];ja=+g[Aa+36>>2];ma=+g[Aa+40>>2];ka=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);la=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);ma=(ma+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;Aa=c[a+8>>2]|0;qa=+g[Aa+32>>2];ra=+g[Aa+36>>2];wa=+g[Aa+40>>2];ta=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);sa=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);wa=(wa+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;R=+g[b+112>>2]-+g[b+48>>2];S=+g[b+116>>2]-+g[b+52>>2];T=+g[b+120>>2]-+g[b+56>>2];da=+g[Ea+56>>2];ba=+g[Ea+56+16>>2];ca=+g[Ea+56+32>>2];aa=+g[k>>2];Z=+g[Ea+56+20>>2];$=+g[Ea+56+36>>2];fa=+g[Ea+56+8>>2];ha=+g[Ea+56+24>>2];na=+g[Ea+56+40>>2];g[Ea+412>>2]=(ia+ka)*2.0*.5;g[Ea+412+4>>2]=(ja+la)*2.0*.5;g[Ea+412+8>>2]=ma*.5;g[Ea+400>>2]=(qa+ta)*2.0*.5;g[Ea+400+4>>2]=(ra+sa)*2.0*.5;g[Ea+400+8>>2]=wa*.5;za=+g[Ea+8>>2];pa=+g[Ea+8+16>>2];va=+g[Ea+8+32>>2];ya=+g[Ea+8+4>>2];oa=+g[Ea+8+20>>2];ua=+g[Ea+8+36>>2];xa=+g[Ea+8+8>>2];Ba=+g[Ea+8+24>>2];Ca=+g[Ea+8+40>>2];B=+C(+(da*za+ba*pa+ca*va));O=+C(+(da*ya+ba*oa+ca*ua));U=+C(+(da*xa+ba*Ba+ca*Ca));N=+C(+(za*aa+pa*Z+va*$));P=+C(+(ya*aa+oa*Z+ua*$));V=+C(+(xa*aa+Ba*Z+Ca*$));W=+C(+(za*fa+pa*ha+va*na));X=+C(+(ya*fa+oa*ha+ua*na));Q=+C(+(xa*fa+Ba*ha+Ca*na));i=+C(+(R*da+S*ba+T*ca))-(wa*.5*U+((ia+ka)*2.0*.5+B*(qa+ta)*2.0*.5+O*(ra+sa)*2.0*.5));if(i>0.0){l=Ea;return}if(i>-3402823466385288598117041.0e14){a=Ea+56|0;e=1;f=R*da+S*ba+T*ca<0.0&1}else{a=0;e=0;f=0;i=-3402823466385288598117041.0e14}h=+C(+(R*aa+S*Z+T*$))-((ja+la)*2.0*.5+N*(qa+ta)*2.0*.5+P*(ra+sa)*2.0*.5+V*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=k;e=2;f=R*aa+S*Z+T*$<0.0&1;i=h}h=+C(+(R*fa+S*ha+T*na))-(ma*.5+W*(qa+ta)*2.0*.5+X*(ra+sa)*2.0*.5+Q*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=Ea+56+8|0;e=3;f=R*fa+S*ha+T*na<0.0&1;i=h}h=+C(+(R*za+S*pa+T*va))-((qa+ta)*2.0*.5+(B*(ia+ka)*2.0*.5+N*(ja+la)*2.0*.5+W*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8|0;e=4;f=R*za+S*pa+T*va<0.0&1;i=h}h=+C(+(R*ya+S*oa+T*ua))-((ra+sa)*2.0*.5+(O*(ia+ka)*2.0*.5+P*(ja+la)*2.0*.5+X*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+4|0;e=5;f=R*ya+S*oa+T*ua<0.0&1;i=h}h=+C(+(R*xa+S*Ba+T*Ca))-(wa*.5+(U*(ia+ka)*2.0*.5+V*(ja+la)*2.0*.5+Q*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+8|0;e=6;f=R*xa+S*Ba+T*Ca<0.0&1;i=h}h=(R*fa+S*ha+T*na)*(za*aa+pa*Z+va*$)-(R*aa+S*Z+T*$)*(za*fa+pa*ha+va*na);n=+C(+h)-((W+9.999999747378752e-06)*(ja+la)*2.0*.5+(N+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(ra+sa)*2.0*.5+(O+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}s=(za*fa+pa*ha+va*na)*(za*fa+pa*ha+va*na)+0.0;x=(za*aa+pa*Z+va*$)*(za*aa+pa*Z+va*$);q=+D(+(x+s));if(q>1.1920928955078125e-07?n/q*1.0499999523162842>i:0){a=0;e=7;f=h<0.0&1;i=n/q;p=0.0/q;o=-(za*fa+pa*ha+va*na)/q;h=(za*aa+pa*Z+va*$)/q}else{p=0.0;o=0.0;h=0.0}n=(R*fa+S*ha+T*na)*(ya*aa+oa*Z+ua*$)-(R*aa+S*Z+T*$)*(ya*fa+oa*ha+ua*na);q=+C(+n)-((X+9.999999747378752e-06)*(ja+la)*2.0*.5+(P+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}t=(ya*fa+oa*ha+ua*na)*(ya*fa+oa*ha+ua*na)+0.0;y=(ya*aa+oa*Z+ua*$)*(ya*aa+oa*Z+ua*$);r=+D(+(y+t));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=8;f=n<0.0&1;i=q/r;p=0.0/r;o=-(ya*fa+oa*ha+ua*na)/r;h=(ya*aa+oa*Z+ua*$)/r}n=(R*fa+S*ha+T*na)*(xa*aa+Ba*Z+Ca*$)-(R*aa+S*Z+T*$)*(xa*fa+Ba*ha+Ca*na);q=+C(+n)-((Q+9.999999747378752e-06)*(ja+la)*2.0*.5+(V+9.999999747378752e-06)*ma*.5+(O+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}v=(xa*fa+Ba*ha+Ca*na)*(xa*fa+Ba*ha+Ca*na)+0.0;z=(xa*aa+Ba*Z+Ca*$)*(xa*aa+Ba*Z+Ca*$);r=+D(+(z+v));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=9;f=n<0.0&1;i=q/r;p=0.0/r;o=-(xa*fa+Ba*ha+Ca*na)/r;h=(xa*aa+Ba*Z+Ca*$)/r}n=(R*da+S*ba+T*ca)*(za*fa+pa*ha+va*na)-(R*fa+S*ha+T*na)*(da*za+ba*pa+ca*va);q=+C(+n)-((W+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(ra+sa)*2.0*.5+(P+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}w=(da*za+ba*pa+ca*va)*(da*za+ba*pa+ca*va);r=+D(+(w+s));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=10;f=n<0.0&1;i=q/r;p=(za*fa+pa*ha+va*na)/r;o=0.0/r;h=-(da*za+ba*pa+ca*va)/r}while(0);n=(R*da+S*ba+T*ca)*(ya*fa+oa*ha+ua*na)-(R*fa+S*ha+T*na)*(da*ya+ba*oa+ca*ua);q=+C(+n)-((X+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}u=(da*ya+ba*oa+ca*ua)*(da*ya+ba*oa+ca*ua);r=+D(+(u+t));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=11;f=n<0.0&1;i=q/r;p=(ya*fa+oa*ha+ua*na)/r;o=0.0/r;h=-(da*ya+ba*oa+ca*ua)/r}while(0);n=(R*da+S*ba+T*ca)*(xa*fa+Ba*ha+Ca*na)-(R*fa+S*ha+T*na)*(da*xa+ba*Ba+ca*Ca);q=+C(+n)-((Q+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*ma*.5+(P+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}s=(da*xa+ba*Ba+ca*Ca)*(da*xa+ba*Ba+ca*Ca);r=+D(+(s+v));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=12;f=n<0.0&1;i=q/r;p=(xa*fa+Ba*ha+Ca*na)/r;o=0.0/r;h=-(da*xa+ba*Ba+ca*Ca)/r}while(0);q=(R*aa+S*Z+T*$)*(da*za+ba*pa+ca*va)-(R*da+S*ba+T*ca)*(za*aa+pa*Z+va*$);n=+C(+q)-((N+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(ra+sa)*2.0*.5+(X+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}r=+D(+(w+x+0.0));do if(r>1.1920928955078125e-07){if(!(n/r*1.0499999523162842>i))break;a=0;e=13;f=q<0.0&1;i=n/r;p=-(za*aa+pa*Z+va*$)/r;o=(da*za+ba*pa+ca*va)/r;h=0.0/r}while(0);r=(R*aa+S*Z+T*$)*(da*ya+ba*oa+ca*ua)-(R*da+S*ba+T*ca)*(ya*aa+oa*Z+ua*$);n=+C(+r)-((P+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(u+y+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i))break;a=0;e=14;f=r<0.0&1;i=n/q;p=-(ya*aa+oa*Z+ua*$)/q;o=(da*ya+ba*oa+ca*ua)/q;h=0.0/q}while(0);r=(R*aa+S*Z+T*$)*(da*xa+ba*Ba+ca*Ca)-(R*da+S*ba+T*ca)*(xa*aa+Ba*Z+Ca*$);n=+C(+r)-((V+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*(ja+la)*2.0*.5+(X+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(s+z+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i)){Aa=55;break}e=15;f=r<0.0&1;i=n/q;p=-(xa*aa+Ba*Z+Ca*$)/q;o=(da*xa+ba*Ba+ca*Ca)/q;h=0.0/q;Aa=58}else Aa=55;while(0);do if((Aa|0)==55){if(!e){l=Ea;return}if(!a){Aa=58;break}m=c[a>>2]|0;c[Ea>>2]=m;ga=c[a+16>>2]|0;n=(c[j>>2]=m,+g[j>>2]);m=e;B=i;e=ga;i=(c[j>>2]=ga,+g[j>>2]);h=+g[a+32>>2]}while(0);if((Aa|0)==58){n=p*+g[Ea+56>>2]+o*+g[k>>2]+h*fa;g[Ea>>2]=n;Da=p*+g[Ea+56+16>>2]+o*+g[Ea+56+20>>2]+h*ha;m=e;B=i;e=(g[j>>2]=Da,c[j>>2]|0);i=Da;h=p*+g[Ea+56+32>>2]+o*+g[Ea+56+36>>2]+h*na}if(!f)Da=h;else{n=-n;g[Ea>>2]=n;Da=-h;e=(g[j>>2]=-i,c[j>>2]|0)}if((m|0)>6){z=(c[j>>2]=e,+g[j>>2]);i=+g[Ea+56>>2];t=+g[Ea+56+16>>2];v=+g[Ea+56+32>>2];u=(n*i+z*t+Da*v>0.0?1.0:-1.0)*(ia+ka)*2.0*.5;y=+g[k>>2];x=+g[Ea+56+20>>2];h=+g[Ea+56+36>>2];s=(n*y+z*x+Da*h>0.0?1.0:-1.0)*(ja+la)*2.0*.5;w=(n*fa+z*ha+Da*na>0.0?1.0:-1.0)*ma*.5;y=+g[b+48>>2]+u*i+s*y+w*fa;x=+g[b+52>>2]+u*t+s*x+w*ha;w=+g[b+56>>2]+u*v+s*h+w*na;c[Ea+456>>2]=c[b+112>>2];c[Ea+456+4>>2]=c[b+112+4>>2];c[Ea+456+8>>2]=c[b+112+8>>2];h=(n*za+z*pa+Da*va>0.0?-1.0:1.0)*(qa+ta)*2.0*.5;s=(n*ya+z*oa+Da*ua>0.0?-1.0:1.0)*(ra+sa)*2.0*.5;v=+g[Ea+456+4>>2]+h*pa+s*oa;u=+g[Ea+456+8>>2]+h*va+s*ua;t=(n*xa+z*Ba+Da*Ca>0.0?-1.0:1.0)*wa*.5;s=+g[Ea+456>>2]+h*za+s*ya+t*xa;g[Ea+456>>2]=s;g[Ea+456+4>>2]=v+t*Ba;g[Ea+456+8>>2]=u+t*Ca;Aa=m+-7|0;h=+g[Ea+56+(((Aa|0)/3|0)<<2)>>2];i=+g[Ea+56+(((Aa|0)/3|0)+4<<2)>>2];n=+g[Ea+56+(((Aa|0)/3|0)+8<<2)>>2];p=+g[Ea+8+(((Aa|0)%3|0)<<2)>>2];q=+g[Ea+8+(((Aa|0)%3|0)+4<<2)>>2];r=+g[Ea+8+(((Aa|0)%3|0)+8<<2)>>2];o=1.0-(h*p+i*q+n*r)*(h*p+i*q+n*r);if(!(o<=9.999999747378752e-05))h=(((s-y)*h+(v+t*Ba-x)*i+(u+t*Ca-w)*n)*(h*p+i*q+n*r)-((s-y)*p+(v+t*Ba-x)*q+(u+t*Ca-w)*r))*(1.0/o);else h=0.0;g[Ea+456>>2]=s+h*p;g[Ea+456+4>>2]=v+t*Ba+h*q;g[Ea+456+8>>2]=u+t*Ca+h*r;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-z;g[Ea+424+8>>2]=-Da;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,B);l=Ea;return}ea=(m|0)<4;ga=ea?b+48|0:b+112|0;f=ea?b+112|0:b+48|0;a=ea?Ea+56|0:Ea+8|0;_=ea?Ea+8|0:Ea+56|0;M=ea?Ea+412|0:Ea+400|0;k=ea?Ea+400|0:Ea+412|0;fa=(c[j>>2]=e,+g[j>>2]);if(ea){da=Da;ba=n;ca=fa}else{da=-Da;ba=-n;ca=-fa}U=ba*+g[_>>2]+ca*+g[_+16>>2]+da*+g[_+32>>2];g[Ea+384>>2]=U;V=ba*+g[_+4>>2]+ca*+g[_+20>>2]+da*+g[_+36>>2];g[Ea+384+4>>2]=V;W=ba*+g[_+8>>2]+ca*+g[_+24>>2]+da*+g[_+40>>2];g[Ea+384+8>>2]=W;U=+C(+U);V=+C(+V);W=+C(+W);e=V>U?(V>W?1:2):U>W?0:2;Y=(V>U?V>W:U>W)?2:1;n=+g[k+(e<<2)>>2];h=+g[f>>2]-+g[ga>>2];i=n*+g[_+(e<<2)>>2];o=+g[f+4>>2];p=+g[ga+4>>2];if(+g[Ea+384+(e<<2)>>2]<0.0){aa=+g[f+8>>2]-+g[ga+8>>2]+n*+g[_+((e|8)<<2)>>2];$=h+i;Z=o-p+n*+g[_+((e|4)<<2)>>2]}else{aa=+g[f+8>>2]-+g[ga+8>>2]-n*+g[_+((e|8)<<2)>>2];$=h-i;Z=o-p-n*+g[_+((e|4)<<2)>>2]}J=(ea?-1:-4)+m|0;switch(J|0){case 0:{e=2;f=1;break}case 1:{e=2;f=0;break}default:{e=1;f=0}}K=a+(f<<2)|0;T=+g[K>>2];R=+g[K+16>>2];S=+g[K+32>>2];X=$*T+Z*R+aa*S;K=a+(e<<2)|0;N=+g[K>>2];v=+g[K+16>>2];w=+g[K+32>>2];Q=$*N+Z*v+aa*w;K=_+((U>W&(V>U^1)&1)<<2)|0;P=+g[K>>2];z=+g[K+16>>2];B=+g[K+32>>2];O=+g[_+(Y<<2)>>2];x=+g[_+(Y<<2)+16>>2];y=+g[_+(Y<<2)+32>>2];Ba=+g[k+((U>W&(V>U^1)&1)<<2)>>2];Ca=+g[k+(Y<<2)>>2];za=(T*O+R*x+S*y)*Ca;Ca=(N*O+v*x+w*y)*Ca;g[Ea+352>>2]=X-(T*P+R*z+S*B)*Ba-za;g[Ea+352+4>>2]=Q-(N*P+v*z+w*B)*Ba-Ca;g[Ea+352+8>>2]=X-(T*P+R*z+S*B)*Ba+za;g[Ea+352+12>>2]=Q-(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+16>>2]=X+(T*P+R*z+S*B)*Ba+za;g[Ea+352+20>>2]=Q+(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+24>>2]=X+(T*P+R*z+S*B)*Ba-za;g[Ea+352+28>>2]=Q+(N*P+v*z+w*B)*Ba-Ca;c[Ea+344>>2]=c[M+(f<<2)>>2];c[Ea+344+4>>2]=c[M+(e<<2)>>2];H=0;I=Ea+280|0;e=Ea+352|0;f=4;a:while(1){F=Ea+344+(H<<2)|0;G=1-H|0;do if((f|0)>0){a=I;E=e;k=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(i>-h){c[a>>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];k=k+1|0;if(k&8|0){e=I;f=k;break a}a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(f|0)>1;m=E;E=E+8|0;b=A?E:e;n=+g[b+(H<<2)>>2];if(i>-h^i>-n){Ca=+g[m+(G<<2)>>2];g[a+(G<<2)>>2]=Ca+(-i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));g[a+(H<<2)>>2]=-+g[F>>2];k=k+1|0;if(!(k&8))a=a+8|0;else{e=I;f=k;break a}}if(!A)break;else f=f+-1|0}e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0;if((k|0)<=0){f=0;break}a=e;E=I;f=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(h>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];f=f+1|0;if(f&8|0)break a;a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(k|0)>1;m=E;E=E+8|0;b=A?E:I;n=+g[b+(H<<2)>>2];if(h>2];g[a+(G<<2)>>2]=Ca+(i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));c[a+(H<<2)>>2]=c[F>>2];f=f+1|0;if(!(f&8))a=a+8|0;else break a}if(!A)break;else k=k+-1|0}}else{f=0;e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}while(0);H=H+1|0;if((H|0)>=2)break;else I=(e|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}if((e|0)!=(Ea+280|0))gi(Ea+280|0,e|0,f<<3|0)|0;if((f|0)>=1){u=1.0/((T*P+R*z+S*B)*(N*O+v*x+w*y)-(N*P+v*z+w*B)*(T*O+R*x+S*y));t=+g[M+(J<<2)>>2];p=+g[K>>2];q=+g[_+(Y<<2)>>2];r=+g[_+((U>W&(V>U^1)&1|4)<<2)>>2];s=+g[_+((Y|4)<<2)>>2];o=+g[_+((U>W&(V>U^1)&1|8)<<2)>>2];n=+g[_+((Y|8)<<2)>>2];b=0;a=0;do{e=a<<1;i=+g[Ea+280+(e<<2)>>2];h=+g[Ea+280+((e|1)<<2)>>2];ya=(N*O+v*x+w*y)*u*(i-X)-(T*O+R*x+S*y)*u*(h-Q);Ca=(T*P+R*z+S*B)*u*(h-Q)-(N*P+v*z+w*B)*u*(i-X);e=b*3|0;za=$+ya*p+Ca*q;g[Ea+184+(e<<2)>>2]=za;Ba=Z+ya*r+Ca*s;g[Ea+184+(e+1<<2)>>2]=Ba;Ca=aa+ya*o+Ca*n;g[Ea+184+(e+2<<2)>>2]=Ca;Ca=t-(ba*za+ca*Ba+da*Ca);g[Ea+152+(b<<2)>>2]=Ca;e=b<<1;if(Ca>=0.0){g[Ea+280+(e<<2)>>2]=i;g[Ea+280+((e|1)<<2)>>2]=h;b=b+1|0}a=a+1|0}while((a|0)!=(f|0));b:do if((b|0)>=1){A=(b|0)<4?b:4;E=(A|0)>1?A:1;if((b|0)<=(E|0))if(ea){h=-Da;e=0;while(1){Aa=e*3|0;g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2];Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(e<<2)>>2]);e=e+1|0;if((e|0)==(b|0))break b}}else{h=-Da;e=0;while(1){Aa=e*3|0;Ca=+g[Ea+152+(e<<2)>>2];Ba=+g[Ea>>2];g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2]-Ba*Ca;g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2]-fa*Ca;g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2]-Da*Ca;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-Ba;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-Ca);e=e+1|0;if((e|0)==(b|0))break b}}c:do if((b|0)>1){h=+g[Ea+152>>2];e=0;f=1;while(1){i=+g[Ea+152+(f<<2)>>2];a=i>h;e=a?f:e;f=f+1|0;if((f|0)==(b|0))break;else h=a?i:h}switch(b|0){case 1:{f=1;a=Ea+120|0;k=Ea+120|0;Aa=111;break c}case 2:{h=(+g[Ea+280+4>>2]+ +g[Ea+280+12>>2])*.5;i=(+g[Ea+280>>2]+ +g[Ea+280+8>>2])*.5;f=2;a=Ea+120|0;k=Ea+120|0;Aa=114;break c}default:{}}a=b+-1|0;r=0.0;s=0.0;h=0.0;f=0;do{_=f<<1;ya=+g[Ea+280+(_<<2)>>2];za=+g[Ea+280+(_+3<<2)>>2];Ba=+g[Ea+280+(_+2<<2)>>2];Ca=+g[Ea+280+((_|1)<<2)>>2];h=h+(ya*za-Ba*Ca);s=s+(ya+Ba)*(ya*za-Ba*Ca);r=r+(za+Ca)*(ya*za-Ba*Ca);f=f+1|0}while((f|0)!=(a|0));_=b<<1;n=+g[Ea+280+(_+-2<<2)>>2];o=+g[Ea+280+4>>2];p=+g[Ea+280>>2];q=+g[Ea+280+(_+-1<<2)>>2];i=h+(n*o-p*q);_=+C(+i)>1.1920928955078125e-07;i=_?1.0/(i*3.0):999999984306749440.0;if((b|0)>0){h=i*(r+(n*o-p*q)*(q+o));i=i*(s+(n*o-p*q)*(n+p));a=Ea+120|0;k=Ea+120|0;m=Ea+456|0;Aa=117;break}m=e;e=Ea+120|0;f=0}else{e=0;f=b;a=Ea+120|0;k=Ea+120|0;Aa=111}while(0);if((Aa|0)==111){h=+g[Ea+280+4>>2];i=+g[Ea+280>>2];Aa=114}if((Aa|0)==114){b=f;m=Ea+456|0;Aa=117}if((Aa|0)==117){f=0;do{Aa=f<<1;g[Ea+456+(f<<2)>>2]=+L(+(+g[Ea+280+((Aa|1)<<2)>>2]-h),+(+g[Ea+280+(Aa<<2)>>2]-i));f=f+1|0}while((f|0)!=(b|0));f=0;do{c[Ea+424+(f<<2)>>2]=1;f=f+1|0}while((f|0)!=(b|0));m=e;e=a;f=1}a=Ea+424+(m<<2)|0;c[a>>2]=0;c[e>>2]=m;d:do if((A|0)>1){o=+g[Ea+456+(m<<2)>>2];if(f){f=1;a=Ea+120+4|0}else{e=1;f=Ea+120+4|0;while(1){c[f>>2]=m;c[a>>2]=0;e=e+1|0;if((e|0)==(E|0))break d;else f=f+4|0}}while(1){n=6.2831854820251465/+(E|0)*+(f|0)+o;n=n>3.1415927410125732?n+-6.2831854820251465:n;c[a>>2]=m;i=1.0e9;k=0;e=m;while(1){do if(!(c[Ea+424+(k<<2)>>2]|0))h=i;else{h=+C(+(+g[Ea+456+(k<<2)>>2]-n));h=h>3.1415927410125732?6.2831854820251465-h:h;if(!(h>2]=k;e=k}while(0);k=k+1|0;if((k|0)==(b|0))break;else i=h}c[Ea+424+(e<<2)>>2]=0;f=f+1|0;if((f|0)==(E|0))break;else a=a+4|0}}while(0);if((E|0)>0){h=-Da;if(ea){e=0;do{Aa=c[Ea+120+(e<<2)>>2]|0;g[Ea+456>>2]=+g[Ea+184+(Aa*3<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+((Aa*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+((Aa*3|0)+2<<2)>>2]+ +g[ga+8>>2];ea=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[ea&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(Aa<<2)>>2]);e=e+1|0}while((e|0)<(E|0))}else{e=0;do{ea=c[Ea+120+(e<<2)>>2]|0;xa=+g[Ea+184+(ea*3<<2)>>2]+ +g[ga>>2];g[Ea+456>>2]=xa;za=+g[Ea+184+((ea*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+4>>2]=za;Ba=+g[Ea+184+((ea*3|0)+2<<2)>>2]+ +g[ga+8>>2];g[Ea+456+8>>2]=Ba;Aa=c[(c[d>>2]|0)+16>>2]|0;ya=+g[Ea>>2];g[Ea+424>>2]=-ya;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Ca=+g[Ea+152+(ea<<2)>>2];g[Ea+104>>2]=xa-ya*Ca;g[Ea+104+4>>2]=za-Ca*fa;g[Ea+104+8>>2]=Ba-Ca*Da;g[Ea+104+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+104|0,-Ca);e=e+1|0}while((e|0)<(E|0))}}}while(0)}l=Ea;return}function qc(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0;Y=l;l=l+256|0;c[b+188>>2]=-1;m=c[k+72>>2]|0;if((m|0)!=(c[b+224>>2]|0)){c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;c[b+224>>2]=m}c[b+184>>2]=0;if((e|0)>0){m=0;do{c[(c[d+(m<<2)>>2]|0)+212>>2]=-1;m=m+1|0}while((m|0)!=(e|0))}m=c[b+12>>2]|0;if((m|0)>(e|0)){o=b+8|0;n=m}else{if((e+1|0)!=0?(c[6995]=(c[6995]|0)+1,n=sc(((e+1|0)*244|3)+16|0)|0,(n|0)!=0):0){c[(n+4+15&-16)+-4>>2]=n;o=n+4+15&-16}else o=0;n=c[b+8>>2]|0;if((n|0)>0){m=0;do{V=o+(m*244|0)|0;W=c[b+16>>2]|0;U=W+(m*244|0)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=W+(m*244|0)+16|0;U=o+(m*244|0)+16|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];U=W+(m*244|0)+32|0;V=o+(m*244|0)+32|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=o+(m*244|0)+48|0;U=W+(m*244|0)+48|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];gi(o+(m*244|0)+64|0,W+(m*244|0)+64|0,180)|0;m=m+1|0}while((m|0)!=(n|0))}m=c[b+16>>2]|0;if(m|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=o;c[b+12>>2]=e+1;o=b+8|0;n=e+1|0}Yk(Y|0,0,244)|0;m=c[o>>2]|0;if((m|0)<0){if((n|0)<0){n=c[b+16>>2]|0;if(n|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0}do{W=c[b+16>>2]|0;V=W+(m*244|0)|0;c[V>>2]=c[Y>>2];c[V+4>>2]=c[Y+4>>2];c[V+8>>2]=c[Y+8>>2];c[V+12>>2]=c[Y+12>>2];V=W+(m*244|0)+16|0;c[V>>2]=c[Y+16>>2];c[V+4>>2]=c[Y+16+4>>2];c[V+8>>2]=c[Y+16+8>>2];c[V+12>>2]=c[Y+16+12>>2];V=W+(m*244|0)+32|0;c[V>>2]=c[Y+32>>2];c[V+4>>2]=c[Y+32+4>>2];c[V+8>>2]=c[Y+32+8>>2];c[V+12>>2]=c[Y+32+12>>2];V=W+(m*244|0)+48|0;c[V>>2]=c[Y+48>>2];c[V+4>>2]=c[Y+48+4>>2];c[V+8>>2]=c[Y+48+8>>2];c[V+12>>2]=c[Y+48+12>>2];gi(W+(m*244|0)+64|0,Y+64|0,180)|0;m=m+1|0}while((m|0)!=0)}c[o>>2]=0;if((e|0)>0){n=0;do{p=d+(n<<2)|0;o=Rj(b,c[p>>2]|0,+g[k+12>>2])|0;p=c[p>>2]|0;if(!((p|0)==0?1:(c[p+252>>2]&2|0)==0)?+g[p+404>>2]!=0.0:0){r=c[b+16>>2]|0;m=c[p+564>>2]|0;if(m&2){q=+g[k+84>>2];M=+g[p+456>>2];O=+g[p+460>>2];s=+g[p+464>>2];G=+g[p+4>>2];M=M!=0.0?1.0/M:0.0;H=+g[p+8>>2];O=O!=0.0?1.0/O:0.0;I=+g[p+12>>2];s=s!=0.0?1.0/s:0.0;J=+g[p+20>>2];K=+g[p+24>>2];L=+g[p+28>>2];N=+g[p+36>>2];P=+g[p+40>>2];v=+g[p+44>>2];w=+g[p+388>>2];x=+g[p+392>>2];u=+g[p+396>>2];y=(M*G*G+O*H*H+s*I*I)*w+(M*G*J+O*H*K+s*I*L)*x+(M*G*N+O*H*P+s*I*v)*u;z=(M*J*G+O*K*H+s*L*I)*w+(M*J*J+O*K*K+s*L*L)*x+(M*J*N+O*K*P+s*L*v)*u;v=(M*N*G+O*P*H+s*v*I)*w+(M*N*J+O*P*K+s*v*L)*x+(M*N*N+O*P*P+s*v*v)*u;s=(x*v-u*z)*(x*v-u*z)+(u*y-w*v)*(u*y-w*v)+(w*z-x*y)*(w*z-x*y);if(s>q*q){q=1.0/+D(+s)*q;t=(x*v-u*z)*q;s=q*(u*y-w*v);q=q*(w*z-x*y)}else{t=x*v-u*z;s=u*y-w*v;q=w*z-x*y}N=+g[k+12>>2];O=(t*+g[p+328>>2]+s*+g[p+344>>2]+q*+g[p+360>>2])*N;P=N*(t*+g[p+332>>2]+s*+g[p+348>>2]+q*+g[p+364>>2]);g[r+(o*244|0)+224>>2]=+g[r+(o*244|0)+224>>2]-(t*+g[p+324>>2]+s*+g[p+340>>2]+q*+g[p+356>>2])*N;g[r+(o*244|0)+228>>2]=+g[r+(o*244|0)+228>>2]-O;g[r+(o*244|0)+232>>2]=+g[r+(o*244|0)+232>>2]-P;m=c[p+564>>2]|0}if(m&4){H=+g[k+12>>2];s=+g[p+456>>2];N=+g[p+460>>2];L=+g[p+464>>2];E=+g[p+388>>2];x=+g[p+392>>2];P=+g[p+396>>2];K=+g[p+4>>2];s=s!=0.0?1.0/s:0.0;w=+g[p+8>>2];N=N!=0.0?1.0/N:0.0;y=+g[p+12>>2];L=L!=0.0?1.0/L:0.0;q=+g[p+20>>2];J=+g[p+24>>2];B=+g[p+28>>2];M=+g[p+36>>2];I=+g[p+40>>2];t=+g[p+44>>2];z=s*K*K+N*w*w+L*y*y;G=s*K*q+N*w*J+L*y*B;u=s*K*M+N*w*I+L*y*t;A=s*q*K+N*J*w+L*B*y;F=s*q*q+N*J*J+L*B*B;v=s*q*M+N*J*I+L*B*t;y=s*M*K+N*I*w+L*t*y;B=s*M*q+N*I*J+L*t*B;t=s*M*M+N*I*I+L*t*t;L=E*z+x*G+P*u+(x*(E*y+x*B+P*t)-P*(E*A+x*F+P*v))*H-(H*0.0+(E*z+x*G+P*u));I=E*A+x*F+P*v+(P*(E*z+x*G+P*u)-E*(E*y+x*B+P*t))*H-(H*0.0+(E*A+x*F+P*v));N=E*y+x*B+P*t+(E*(E*A+x*F+P*v)-x*(E*z+x*G+P*u))*H-(H*0.0+(E*y+x*B+P*t));M=G+(E*y+x*B+P*t+(x*B+(G*0.0+F*-P)))*H;s=u+(x*t+(u*0.0+v*-P)-(E*A+x*F+P*v))*H;J=A+(y*-E+(A*0.0+P*z)-(E*y+x*B+P*t))*H;q=v+(E*z+x*G+P*u+(t*-E+(v*0.0+P*u)))*H;w=y+(y*0.0+(z*-x+E*A)+(E*A+x*F+P*v))*H;K=B+(B*0.0+(G*-x+E*F)-(E*z+x*G+P*u))*H;_=(F+(B*-E+(F*0.0+P*G))*H)*(t+(t*0.0+(u*-x+E*v))*H)-K*q;Z=K*s-M*(t+(t*0.0+(u*-x+E*v))*H);$=M*q-(F+(B*-E+(F*0.0+P*G))*H)*s;O=w*$+((z+(x*y+(z*0.0+A*-P))*H)*_+J*Z);m=+C(+O)>1.1920928955078125e-07;O=m?1.0/O:O;g[r+(o*244|0)+224>>2]=E-(N*$+(L*_+I*Z))*O-E+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=x-(w*(q*L-s*I)+((z+(x*y+(z*0.0+A*-P))*H)*((t+(t*0.0+(u*-x+E*v))*H)*I-q*N)+J*(s*N-(t+(t*0.0+(u*-x+E*v))*H)*L)))*O-x+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=P-(w*(M*I-(F+(B*-E+(F*0.0+P*G))*H)*L)+((z+(x*y+(z*0.0+A*-P))*H)*((F+(B*-E+(F*0.0+P*G))*H)*N-K*I)+J*(K*L-M*N)))*O-P+ +g[r+(o*244|0)+232>>2];m=c[p+564>>2]|0}if(m&8|0){O=+g[k+12>>2];z=+g[p+456>>2];A=+g[p+460>>2];w=+g[p+464>>2];J=+g[p+388>>2];K=+g[p+392>>2];$=+g[p+396>>2];yh(p+4|0,Y);_=+g[Y>>2];L=+g[Y+4>>2];M=+g[Y+8>>2];B=+g[Y+12>>2];F=M*(J*-M+K*B-$*-_)+(_*(-(J*-_)-K*-L-$*-M)+B*($*-L+J*B-K*-M))-L*(K*-_+$*B-J*-L);H=_*(K*-_+$*B-J*-L)+(L*(-(J*-_)-K*-L-$*-M)+B*(J*-M+K*B-$*-_))-M*($*-L+J*B-K*-M);B=L*($*-L+J*B-K*-M)+(M*(-(J*-_)-K*-L-$*-M)+B*(K*-_+$*B-J*-L))-_*(J*-M+K*B-$*-_);z=z!=0.0?1.0/z:0.0;I=B*0.0+(z*F+H*0.0);A=A!=0.0?1.0/A:0.0;G=B*0.0+(F*0.0+A*H);w=w!=0.0?1.0/w:0.0;E=w*B+(F*0.0+H*0.0);x=z+(H*0.0+(z*0.0+B*-0.0))*O;y=A+(F*-0.0+(A*0.0+B*0.0))*O;P=w+(w*0.0+(H*-0.0+F*0.0))*O;v=y*P-((H*-0.0+A*F+0.0-I)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0);N=((H*-0.0+A*F+0.0-I)*O+0.0)*((w*H+(B*-0.0+0.0)-G)*O+0.0)-P*((H*0.0+(0.0-A*B)+E)*O+0.0);u=((H*0.0+(0.0-A*B)+E)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0)-y*((w*H+(B*-0.0+0.0)-G)*O+0.0);Z=((F*0.0-z*H+0.0+G)*O+0.0)*u+(x*v+((F*-0.0+(z*B+0.0)-E)*O+0.0)*N);W=+C(+Z)>1.1920928955078125e-07;Z=W?1.0/Z:Z;N=F-((F*G-H*I)*O*u+((H*E-B*G)*O*v+(B*I-F*E)*O*N))*Z;P=H-(((F*0.0-z*H+0.0+G)*O+0.0)*(((B*0.0+0.0-w*F+I)*O+0.0)*(H*E-B*G)*O-((w*H+(B*-0.0+0.0)-G)*O+0.0)*(B*I-F*E)*O)+(x*(P*(B*I-F*E)*O-((B*0.0+0.0-w*F+I)*O+0.0)*(F*G-H*I)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((w*H+(B*-0.0+0.0)-G)*O+0.0)*(F*G-H*I)*O-P*(H*E-B*G)*O)))*Z;Z=B-(((F*0.0-z*H+0.0+G)*O+0.0)*(((H*0.0+(0.0-A*B)+E)*O+0.0)*(B*I-F*E)*O-y*(H*E-B*G)*O)+(x*(y*(F*G-H*I)*O-((H*-0.0+A*F+0.0-I)*O+0.0)*(B*I-F*E)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((H*-0.0+A*F+0.0-I)*O+0.0)*(H*E-B*G)*O-((H*0.0+(0.0-A*B)+E)*O+0.0)*(F*G-H*I)*O)))*Z;O=+g[Y+12>>2];g[r+(o*244|0)+224>>2]=(M*N+O*P-_*Z)*-M+(O*(O*N+L*Z-M*P)+(-(_*N)-L*P-M*Z)*-_)-(O*Z+_*P-L*N)*-L-J+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=(O*Z+_*P-L*N)*-_+(O*(M*N+O*P-_*Z)+(-(_*N)-L*P-M*Z)*-L)-(O*N+L*Z-M*P)*-M-K+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=(O*N+L*Z-M*P)*-L+((-(_*N)-L*P-M*Z)*-M+O*(O*Z+_*P-L*N))-(M*N+O*P-_*Z)*-_-$+ +g[r+(o*244|0)+232>>2]}}n=n+1|0}while((n|0)!=(e|0))}if((j|0)>0){m=0;do{W=c[i+(m<<2)>>2]|0;Ib[c[(c[W>>2]|0)+8>>2]&511](W);g[W+36>>2]=0.0;m=m+1|0}while((m|0)<(j|0))}n=c[b+168>>2]|0;if((n|0)<(j|0)?(c[b+172>>2]|0)<(j|0):0){if(!j)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((j<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+168>>2]|0}if((n|0)>0){o=0;do{U=(c[b+176>>2]|0)+(o<<3)|0;V=c[U+4>>2]|0;W=m+(o<<3)|0;c[W>>2]=c[U>>2];c[W+4>>2]=V;o=o+1|0}while((o|0)!=(n|0))}n=c[b+176>>2]|0;if(n|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=m;c[b+172>>2]=j}c[b+168>>2]=j;if((j|0)>0){m=0;e=0;do{r=c[b+176>>2]|0;d=r+(e<<3)|0;p=i+(e<<2)|0;n=c[p>>2]|0;o=c[n+44>>2]|0;if(o){n=o+64|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(n|0));n=c[p>>2]|0}if(!(a[n+20>>0]|0)){c[d>>2]=0;c[r+(e<<3)+4>>2]=0;n=0}else{Ob[c[(c[n>>2]|0)+16>>2]&127](n,d);n=c[d>>2]|0}m=n+m|0;e=e+1|0}while((e|0)<(j|0));p=m}else p=0;n=c[b+48>>2]|0;if((n|0)<(p|0)?(c[b+52>>2]|0)<(p|0):0){if(!p)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((p*152|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+48>>2]|0}if((n|0)>0){o=0;do{gi(m+(o*152|0)|0,(c[b+56>>2]|0)+(o*152|0)|0,152)|0;o=o+1|0}while((o|0)!=(n|0))}n=c[b+56>>2]|0;if(n|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=m;c[b+52>>2]=p}c[b+48>>2]=p;if((j|0)>0){V=0;W=0;m=c[b+176>>2]|0;while(1){U=m+(W<<3)|0;if(!(c[U>>2]|0))n=0;else{n=c[b+56>>2]|0;p=n+(V*152|0)|0;r=i+(W<<2)|0;d=c[r>>2]|0;e=c[d+28>>2]|0;Q=c[d+32>>2]|0;R=Rj(b,e,+g[k+12>>2])|0;S=Rj(b,Q,+g[k+12>>2])|0;T=c[b+16>>2]|0;o=c[d+24>>2]|0;o=(o|0)>0?o:c[k+20>>2]|0;if((o|0)>(c[b+184>>2]|0))c[b+184>>2]=o;if((c[U>>2]|0)>0){m=0;do{Yk(p+(m*152|0)|0,0,152)|0;g[p+(m*152|0)+120>>2]=-3402823466385288598117041.0e14;g[p+(m*152|0)+124>>2]=3402823466385288598117041.0e14;g[p+(m*152|0)+100>>2]=0.0;g[p+(m*152|0)+96>>2]=0.0;c[p+(m*152|0)+144>>2]=R;c[p+(m*152|0)+148>>2]=S;c[p+(m*152|0)+136>>2]=o;m=m+1|0}while((m|0)<(c[U>>2]|0))}c[T+(R*244|0)+64>>2]=0;c[T+(R*244|0)+64+4>>2]=0;c[T+(R*244|0)+64+8>>2]=0;c[T+(R*244|0)+64+12>>2]=0;c[T+(R*244|0)+64+16>>2]=0;c[T+(R*244|0)+64+20>>2]=0;c[T+(R*244|0)+64+24>>2]=0;c[T+(R*244|0)+64+28>>2]=0;c[T+(R*244|0)+144>>2]=0;c[T+(R*244|0)+144+4>>2]=0;c[T+(R*244|0)+144+8>>2]=0;c[T+(R*244|0)+144+12>>2]=0;c[T+(R*244|0)+144+16>>2]=0;c[T+(R*244|0)+144+20>>2]=0;c[T+(R*244|0)+144+24>>2]=0;c[T+(R*244|0)+144+28>>2]=0;c[T+(S*244|0)+64>>2]=0;c[T+(S*244|0)+64+4>>2]=0;c[T+(S*244|0)+64+8>>2]=0;c[T+(S*244|0)+64+12>>2]=0;c[T+(S*244|0)+64+16>>2]=0;c[T+(S*244|0)+64+20>>2]=0;c[T+(S*244|0)+64+24>>2]=0;c[T+(S*244|0)+64+28>>2]=0;c[T+(S*244|0)+144>>2]=0;c[T+(S*244|0)+144+4>>2]=0;c[T+(S*244|0)+144+8>>2]=0;c[T+(S*244|0)+144+12>>2]=0;c[T+(S*244|0)+144+16>>2]=0;c[T+(S*244|0)+144+20>>2]=0;c[T+(S*244|0)+144+24>>2]=0;c[T+(S*244|0)+144+28>>2]=0;g[Y>>2]=1.0/+g[k+12>>2];c[Y+4>>2]=c[k+32>>2];c[Y+8>>2]=n+(V*152|0)+16;c[Y+12>>2]=p;c[Y+16>>2]=n+(V*152|0)+48;c[Y+20>>2]=n+(V*152|0)+32;c[Y+24>>2]=38;c[Y+28>>2]=n+(V*152|0)+112;o=n+(V*152|0)+116|0;c[o>>2]=c[k+40>>2];c[Y+48>>2]=c[k+4>>2];c[Y+32>>2]=o;c[Y+36>>2]=n+(V*152|0)+120;c[Y+40>>2]=n+(V*152|0)+124;c[Y+44>>2]=c[k+20>>2];o=c[r>>2]|0;Ob[c[(c[o>>2]|0)+20>>2]&127](o,Y);if((c[U>>2]|0)>0){n=0;do{m=p+(n*152|0)+124|0;q=+g[(c[r>>2]|0)+16>>2];if(+g[m>>2]>=q)g[m>>2]=q;m=p+(n*152|0)+120|0;if(+g[m>>2]<=-q)g[m>>2]=-q;c[p+(n*152|0)+132>>2]=d;aa=p+(n*152|0)|0;ba=c[d+28>>2]|0;$=+g[aa>>2];Z=+g[aa+4>>2];_=+g[aa+8>>2];q=($*+g[ba+340>>2]+Z*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];s=($*+g[ba+356>>2]+Z*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];o=p+(n*152|0)+64|0;g[o>>2]=(+g[ba+324>>2]*$+ +g[ba+328>>2]*Z+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[o+4>>2]=q;g[o+8>>2]=s;g[o+12>>2]=0.0;o=p+(n*152|0)+32|0;ba=c[d+32>>2]|0;s=+g[o>>2];q=+g[o+4>>2];_=+g[o+8>>2];Z=(s*+g[ba+340>>2]+q*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];$=(s*+g[ba+356>>2]+q*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];m=p+(n*152|0)+80|0;g[m>>2]=(+g[ba+324>>2]*s+ +g[ba+328>>2]*q+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[m+4>>2]=Z;g[m+8>>2]=$;g[m+12>>2]=0.0;m=p+(n*152|0)+16|0;$=+g[e+404>>2];Z=+g[m>>2];_=+g[m+4>>2];q=+g[m+8>>2];s=+g[aa>>2];t=+g[aa+4>>2];u=+g[aa+8>>2];aa=p+(n*152|0)+48|0;B=+g[Q+404>>2];v=+g[aa>>2];w=+g[aa+4>>2];x=+g[aa+8>>2];y=+g[o>>2];z=+g[o+4>>2];A=+g[o+8>>2];B=Z*$*Z+_*$*_+q*$*q+(s*(+g[e+324>>2]*s+ +g[e+328>>2]*t+ +g[e+332>>2]*u)+t*(s*+g[e+340>>2]+t*+g[e+344>>2]+u*+g[e+348>>2])+u*(s*+g[e+356>>2]+t*+g[e+360>>2]+u*+g[e+364>>2]))+(v*B*v+w*B*w+x*B*x)+(y*(+g[Q+324>>2]*y+ +g[Q+328>>2]*z+ +g[Q+332>>2]*A)+z*(y*+g[Q+340>>2]+z*+g[Q+344>>2]+A*+g[Q+348>>2])+A*(y*+g[Q+356>>2]+z*+g[Q+360>>2]+A*+g[Q+364>>2]));o=+C(+B)>1.1920928955078125e-07;B=o?1.0/B:0.0;g[p+(n*152|0)+108>>2]=B;if(!(c[T+(R*244|0)+240>>2]|0)){E=0.0;F=0.0;G=0.0;H=0.0;I=0.0;J=0.0}else{E=+g[T+(R*244|0)+208>>2];F=+g[T+(R*244|0)+212>>2];G=+g[T+(R*244|0)+216>>2];H=+g[T+(R*244|0)+224>>2];I=+g[T+(R*244|0)+228>>2];J=+g[T+(R*244|0)+232>>2]}if(!(c[T+(S*244|0)+240>>2]|0)){K=0.0;L=0.0;M=0.0;N=0.0;O=0.0;P=0.0}else{K=+g[T+(S*244|0)+208>>2];L=+g[T+(S*244|0)+212>>2];M=+g[T+(S*244|0)+216>>2];N=+g[T+(S*244|0)+224>>2];O=+g[T+(S*244|0)+228>>2];P=+g[T+(S*244|0)+232>>2]}ba=p+(n*152|0)+112|0;g[ba>>2]=+g[ba>>2]*B+B*(0.0-+g[Y+48>>2]*((E+ +g[e+372>>2])*+g[m>>2]+(F+ +g[e+376>>2])*+g[m+4>>2]+(G+ +g[e+380>>2])*q+((H+ +g[e+388>>2])*s+(I+ +g[e+392>>2])*t+(J+ +g[e+396>>2])*u)+((K+ +g[Q+372>>2])*v+(L+ +g[Q+376>>2])*w+(M+ +g[Q+380>>2])*x+((N+ +g[Q+388>>2])*y+(O+ +g[Q+392>>2])*z+(P+ +g[Q+396>>2])*A))));g[p+(n*152|0)+100>>2]=0.0;n=n+1|0}while((n|0)<(c[U>>2]|0))}m=c[b+176>>2]|0;n=c[m+(W<<3)>>2]|0}W=W+1|0;if((W|0)>=(j|0))break;else V=n+V|0}}Vb[c[(c[b>>2]|0)+28>>2]&127](b,f,h,k);r=c[b+48>>2]|0;d=c[b+28>>2]|0;e=c[b+68>>2]|0;n=c[b+128>>2]|0;if((n|0)<(r|0)?(c[b+132>>2]|0)<(r|0):0){if(!r)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((r<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+128>>2]|0}p=c[b+136>>2]|0;if((n|0)<=0)if(!p)n=b+140|0;else X=105;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=105}if((X|0)==105){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+136>>2]=0;n=b+140|0}a[n>>0]=1;c[b+136>>2]=m;c[b+132>>2]=r}c[b+128>>2]=r;if(!(c[k+72>>2]&16)){n=c[b+108>>2]|0;if((n|0)<(d|0)?(c[b+112>>2]|0)<(d|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=135;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=135}if((X|0)==135){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d}c[b+108>>2]=d}else{n=c[b+108>>2]|0;if((n|0)<(d<<1|0)?(c[b+112>>2]|0)<(d<<1|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=120;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=120}if((X|0)==120){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d<<1}c[b+108>>2]=d<<1}n=c[b+148>>2]|0;if((n|0)<(e|0)?(c[b+152>>2]|0)<(e|0):0){if(!e)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((e<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+148>>2]|0}p=c[b+156>>2]|0;if((n|0)<=0)if(!p)n=b+160|0;else X=150;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=150}if((X|0)==150){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+156>>2]=0;n=b+160|0}a[n>>0]=1;c[b+156>>2]=m;c[b+152>>2]=e}c[b+148>>2]=e;if((r|0)>0){n=c[b+136>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(r|0))}if((d|0)>0){n=c[b+116>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(d|0))}if((e|0)<=0){l=Y;return 0.0}n=c[b+156>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(e|0));l=Y;return 0.0}function rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;V=c[e>>2]|0;fa=c[f>>2]|0;if(V|0)g=c[V+12>>2]|0;else g=b;h=c[g+88>>2]|0;i=c[g+92>>2]|0;j=c[g+96>>2]|0;if(!fa)g=d;else g=c[fa+12>>2]|0;r=c[g+88>>2]|0;p=c[g+92>>2]|0;q=c[g+96>>2]|0;Z=c[b+88>>2]|0;da=(c[d+88>>2]|0)-Z|0;u=c[b+92>>2]|0;ea=(c[d+92>>2]|0)-u|0;l=c[b+96>>2]|0;W=(c[d+96>>2]|0)-l|0;Y=c[(V|0?V:fa)+12>>2]|0;_=(c[Y+88>>2]|0)-Z|0;U=(c[Y+92>>2]|0)-u|0;Y=(c[Y+96>>2]|0)-l|0;X=(P(U,W)|0)-(P(Y,ea)|0)|0;Y=(P(Y,da)|0)-(P(_,W)|0)|0;U=(P(_,ea)|0)-(P(U,da)|0)|0;Z=ct(X|0,((X|0)<0)<<31>>31|0,Z|0,((Z|0)<0)<<31>>31|0)|0;_=A;u=ct(Y|0,((Y|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=A;l=ct(U|0,((U|0)<0)<<31>>31|0,l|0,((l|0)<0)<<31>>31|0)|0;l=Ow(Z|0,_|0,l|0,A|0)|0;t=Ow(l|0,A|0,u|0,t|0)|0;u=A;l=ct(U|0,((U|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;_=A;Z=ct(Y|0,((Y|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;Z=sw(l|0,_|0,Z|0,A|0)|0;_=A;l=ct(X|0,((X|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;aa=A;$=ct(U|0,((U|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;$=sw(l|0,aa|0,$|0,A|0)|0;aa=A;l=ct(Y|0,((Y|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;ca=A;ba=ct(X|0,((X|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;ba=sw(l|0,ca|0,ba|0,A|0)|0;ca=A;l=ct(Z|0,_|0,h|0,((h|0)<0)<<31>>31|0)|0;T=A;k=ct($|0,aa|0,i|0,((i|0)<0)<<31>>31|0)|0;T=Ow(k|0,A|0,l|0,T|0)|0;l=A;k=ct(ba|0,ca|0,j|0,((j|0)<0)<<31>>31|0)|0;k=Ow(T|0,l|0,k|0,A|0)|0;l=A;if((V|0)!=0?(c[V+12>>2]|0)!=0:0){g=h;b=i;d=j;n=V;o=l;m=k;while(1){n=c[(c[n+8>>2]|0)+4>>2]|0;l=n+12|0;j=c[l>>2]|0;h=c[j+88>>2]|0;S=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;i=c[j+92>>2]|0;T=ct(i|0,((i|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;j=c[j+96>>2]|0;T=ct(j|0,((j|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0){k=m;j=o;break}if((c[n+20>>2]|0)==(c[a+100>>2]|0)){k=m;j=o;break}T=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;S=A;k=ct(i|0,((i|0)<0)<<31>>31|0,$|0,aa|0)|0;S=Ow(k|0,A|0,T|0,S|0)|0;T=A;k=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(S|0,T|0,k|0,A|0)|0;j=A;if(!((j|0)>(o|0)|(j|0)==(o|0)&k>>>0>m>>>0)){k=m;j=o;break}c[e>>2]=n;T=c[l>>2]|0;g=c[T+88>>2]|0;b=c[T+92>>2]|0;d=c[T+96>>2]|0;if(!T)break;else{o=j;m=k}}h=g;i=c[f>>2]|0;s=j}else{b=i;d=j;i=fa;s=l}g=ct(Z|0,_|0,r|0,((r|0)<0)<<31>>31|0)|0;T=A;j=ct($|0,aa|0,p|0,((p|0)<0)<<31>>31|0)|0;T=Ow(j|0,A|0,g|0,T|0)|0;g=A;j=ct(ba|0,ca|0,q|0,((q|0)<0)<<31>>31|0)|0;j=Ow(T|0,g|0,j|0,A|0)|0;g=A;a:do if(i)if(!(c[i+12>>2]|0))o=q;else{o=q;while(1){q=c[c[i+8>>2]>>2]|0;n=c[q+12>>2]|0;l=c[n+88>>2]|0;S=ct(l|0,((l|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;m=c[n+92>>2]|0;T=ct(m|0,((m|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;n=c[n+96>>2]|0;T=ct(n|0,((n|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0)break a;if((c[q+20>>2]|0)==(c[a+100>>2]|0))break a;l=ct(l|0,((l|0)<0)<<31>>31|0,Z|0,_|0)|0;T=A;m=ct(m|0,((m|0)<0)<<31>>31|0,$|0,aa|0)|0;T=Ow(m|0,A|0,l|0,T|0)|0;m=A;l=ct(n|0,((n|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(T|0,m|0,l|0,A|0)|0;m=A;if(!((m|0)>(g|0)|(m|0)==(g|0)&l>>>0>j>>>0))break a;c[f>>2]=q;T=c[q+12>>2]|0;g=c[T+88>>2]|0;i=c[T+92>>2]|0;j=c[T+96>>2]|0;if(!T){r=g;p=i;o=j;i=q;j=l;g=m;break}else{r=g;p=i;o=j;i=q;g=m;j=l}}}else{o=q;i=0}while(0);j=sw(j|0,g|0,k|0,s|0)|0;T=A;if((T|0)>0|(T|0)==0&j>>>0>0){R=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;S=A;N=r;k=h;O=p;m=b;Q=o;n=d;l=i;u=j;q=T;while(1){s=(P(O-m|0,ea)|0)+(P(N-k|0,da)|0)+(P(Q-n|0,W)|0)|0;g=c[e>>2]|0;if(!g){E=s;I=k;H=m;B=s;g=((s|0)<0)<<31>>31;C=q;z=u}else{K=k;t=s;M=s;L=((s|0)<0)<<31>>31;b:while(1){if(!(c[g+12>>2]|0)){s=K;k=M;g=L;break}G=c[(c[g>>2]|0)+8>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){s=K;k=M;g=L;break}J=c[G+12>>2]|0;H=c[J+88>>2]|0;F=H-K|0;I=c[J+92>>2]|0;E=I-m|0;J=c[J+96>>2]|0;k=J-n|0;s=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;D=A;l=ct(E|0,((E|0)<0)<<31>>31|0,$|0,aa|0)|0;D=Ow(l|0,A|0,s|0,D|0)|0;s=A;l=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(D|0,s|0,l|0,A|0)|0;s=A;k=(P(E,ea)|0)+(P(F,da)|0)+(P(k,W)|0)|0;do if((l|0)==0&(s|0)==0){if((k|0)>=0){s=K;k=M;g=L;break b}}else{if((s|0)>=0){s=K;k=M;g=L;break b}if((k|0)>0){w=1;x=k;v=((k|0)<0)<<31>>31}else{x=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;w=((k|0)!=0)<<31>>31;x=k|0?x:0;v=k|0?A:0}B=sw(0,0,l|0,s|0)|0;C=A;F=0-w|0;if((t|0)>0){k=1;D=M;E=L}else{E=(t|0)!=0;D=sw(0,0,M|0,L|0)|0;k=E<<31>>31;D=E?D:0;E=E?A:0}if((q|0)>0|(q|0)==0&u>>>0>0){l=u;s=q}else{s=(u|0)!=0|(q|0)!=0;l=sw(0,0,u|0,q|0)|0;k=s?0-k|0:k;l=s?l:0;s=s?A:0}if((k|0)==(F|0)){if(!w)break;k=ct(l|0,0,x|0,0)|0;w=A;ja=ct(s|0,0,x|0,0)|0;ia=A;y=ct(l|0,0,v|0,0)|0;z=A;ha=ct(s|0,0,v|0,0)|0;x=A;y=Ow(ja|0,0,y|0,0)|0;l=A;x=Ow(ia|0,0,ha|0,x|0)|0;z=Ow(x|0,A|0,z|0,0)|0;l=Ow(z|0,A|0,l|0,0)|0;z=A;w=Ow(0,y|0,k|0,w|0)|0;x=A;y=Ow(l|0,z|0,(x>>>0>>0|(x|0)==(y|0)&w>>>0<0)&1|0,0)|0;z=A;l=ct(D|0,0,B|0,0)|0;k=A;ha=ct(E|0,0,B|0,0)|0;B=A;s=ct(D|0,0,C|0,0)|0;v=A;C=ct(E|0,0,C|0,0)|0;D=A;s=Ow(ha|0,0,s|0,0)|0;E=A;D=Ow(B|0,0,C|0,D|0)|0;v=Ow(D|0,A|0,v|0,0)|0;E=Ow(v|0,A|0,E|0,0)|0;v=A;k=Ow(0,s|0,l|0,k|0)|0;l=A;s=Ow(E|0,v|0,(l>>>0>>0|(l|0)==(s|0)&k>>>0<0)&1|0,0)|0;v=A;if(z>>>0>>0|(z|0)==(v|0)&y>>>0>>0)k=-1;else k=z>>>0>v>>>0|(z|0)==(v|0)&y>>>0>s>>>0?1:x>>>0>>0|(x|0)==(l|0)&w>>>0>>0?-1:(x>>>0>l>>>0|(x|0)==(l|0)&w>>>0>k>>>0)&1;k=P(k,F)|0}else k=F-k|0;if((k|0)<=-1){s=K;k=M;g=L;break b}}while(0);ja=N-H|0;ia=O-I|0;l=Q-J|0;q=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,q|0,ha|0)|0;q=A;k=ct(l|0,((l|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,q|0,k|0,A|0)|0;q=A;g=(g|0)==(V|0)?0:G;c[e>>2]=g;l=(P(ia,ea)|0)+(P(ja,da)|0)+(P(l,W)|0)|0;if(!g){t=l;s=H;m=I;n=J;u=k;k=l;g=((l|0)<0)<<31>>31;break}else{K=H;m=I;n=J;t=l;M=l;L=((l|0)<0)<<31>>31;u=k}}E=t;I=s;H=m;l=c[f>>2]|0;B=k;C=q;z=u}if(!l){g=110;break}if(!(c[l+12>>2]|0)){g=110;break}G=c[c[l+8>>2]>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break}q=c[G+12>>2]|0;t=c[q+88>>2]|0;m=t-N|0;s=c[q+92>>2]|0;l=s-O|0;q=c[q+96>>2]|0;k=q-Q|0;ja=ct(m|0,((m|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(l|0,((l|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(k|0,((k|0)<0)<<31>>31|0,R|0,S|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break}v=ct(m|0,((m|0)<0)<<31>>31|0,Z|0,_|0)|0;F=A;u=ct(l|0,((l|0)<0)<<31>>31|0,$|0,aa|0)|0;F=Ow(u|0,A|0,v|0,F|0)|0;v=A;u=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;u=Ow(F|0,v|0,u|0,A|0)|0;v=A;k=(P(l,ea)|0)+(P(m,da)|0)+(P(k,W)|0)|0;F=t-I|0;ia=s-H|0;D=q-n|0;F=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,F|0,ja|0)|0;F=A;D=ct(D|0,((D|0)<0)<<31>>31|0,ba|0,ca|0)|0;D=Ow(ja|0,F|0,D|0,A|0)|0;F=A;if(!((F|0)>0|(F|0)==0&D>>>0>0)){g=110;break}if((u|0)==0&(v|0)==0){if((k|0)>=0){g=110;break}}else{if((v|0)>=0){g=110;break}if((k|0)>0){s=1;t=k;q=((k|0)<0)<<31>>31}else{t=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;s=((k|0)!=0)<<31>>31;t=k|0?t:0;q=k|0?A:0}w=sw(0,0,u|0,v|0)|0;x=A;y=0-s|0;if((E|0)>0){k=1;v=B}else{ja=(E|0)!=0;v=sw(0,0,B|0,g|0)|0;k=ja<<31>>31;v=ja?v:0;g=ja?A:0}if((C|0)>0|(C|0)==0&z>>>0>0){m=k;l=z;k=C}else{ja=(z|0)!=0|(C|0)!=0;l=sw(0,0,z|0,C|0)|0;m=ja?0-k|0:k;l=ja?l:0;k=ja?A:0}if((m|0)==(y|0)){if(!s){g=110;break}ja=ct(l|0,0,t|0,0)|0;s=A;ia=ct(k|0,0,t|0,0)|0;Q=A;t=ct(l|0,0,q|0,0)|0;u=A;k=ct(k|0,0,q|0,0)|0;q=A;t=Ow(ia|0,0,t|0,0)|0;ia=A;q=Ow(Q|0,0,k|0,q|0)|0;u=Ow(q|0,A|0,u|0,0)|0;ia=Ow(u|0,A|0,ia|0,0)|0;u=A;q=Ow(0,t|0,ja|0,s|0)|0;s=A;t=Ow(ia|0,u|0,(s>>>0>>0|(s|0)==(t|0)&q>>>0<0)&1|0,0)|0;u=A;ia=ct(v|0,0,w|0,0)|0;k=A;ja=ct(g|0,0,w|0,0)|0;Q=A;l=ct(v|0,0,x|0,0)|0;m=A;ha=ct(g|0,0,x|0,0)|0;g=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;g=Ow(Q|0,0,ha|0,g|0)|0;m=Ow(g|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,ia|0,k|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(u>>>0>>0|(u|0)==(m|0)&t>>>0>>0)g=-1;else g=u>>>0>m>>>0|(u|0)==(m|0)&t>>>0>l>>>0?1:s>>>0>>0|(s|0)==(k|0)&q>>>0>>0?-1:(s>>>0>k>>>0|(s|0)==(k|0)&q>>>0>g>>>0)&1;g=P(g,y)|0}else g=y-m|0;if((g|0)<=0){g=110;break}}c[f>>2]=G;Q=c[G+12>>2]|0;N=c[Q+88>>2]|0;k=I;O=c[Q+92>>2]|0;m=H;Q=c[Q+96>>2]|0;l=G;u=D;q=F}if((g|0)==110)return}if((T|0)>=0)return;F=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;G=A;E=r;g=T;c:while(1){D=g;d:while(1){C=(P(p-b|0,ea)|0)+(P(E-h|0,da)|0)+(P(o-d|0,W)|0)|0;do if((i|0?c[i+12>>2]|0:0)?(ga=c[(c[i+4>>2]|0)+8>>2]|0,(c[ga+20>>2]|0)>(c[a+100>>2]|0)):0){B=c[ga+12>>2]|0;y=c[B+88>>2]|0;ja=y-E|0;z=c[B+92>>2]|0;ia=z-p|0;B=c[B+96>>2]|0;g=B-o|0;l=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,l|0,ha|0)|0;l=A;k=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,l|0,k|0,A|0)|0;l=A;g=(P(ia,ea)|0)+(P(ja,da)|0)+(P(g,W)|0)|0;if((k|0)==0&(l|0)==0)if((g|0)>0)break d;else break;if((l|0)<0){if((g|0)>0){n=1;q=g;m=((g|0)<0)<<31>>31}else{q=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;n=((g|0)!=0)<<31>>31;q=g|0?q:0;m=g|0?A:0}t=sw(0,0,k|0,l|0)|0;u=A;x=0-n|0;if((C|0)>0){g=1;v=C;w=((C|0)<0)<<31>>31}else{v=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;g=((C|0)!=0)<<31>>31;v=C|0?v:0;w=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){k=j;l=D}else{l=(j|0)!=0|(D|0)!=0;k=sw(0,0,j|0,D|0)|0;g=l?0-g|0:g;k=l?k:0;l=l?A:0}if((g|0)==(x|0)){if(!n)break d;g=ct(k|0,0,q|0,0)|0;n=A;ha=ct(l|0,0,q|0,0)|0;V=A;r=ct(k|0,0,m|0,0)|0;s=A;ja=ct(l|0,0,m|0,0)|0;q=A;r=Ow(ha|0,0,r|0,0)|0;k=A;q=Ow(V|0,0,ja|0,q|0)|0;s=Ow(q|0,A|0,s|0,0)|0;k=Ow(s|0,A|0,k|0,0)|0;s=A;n=Ow(0,r|0,g|0,n|0)|0;q=A;r=Ow(k|0,s|0,(q>>>0>>0|(q|0)==(r|0)&n>>>0<0)&1|0,0)|0;s=A;k=ct(v|0,0,t|0,0)|0;g=A;ja=ct(w|0,0,t|0,0)|0;V=A;l=ct(v|0,0,u|0,0)|0;m=A;ha=ct(w|0,0,u|0,0)|0;ia=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;m=Ow(ia|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,k|0,g|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(s>>>0>>0|(s|0)==(m|0)&r>>>0>>0)g=-1;else g=s>>>0>m>>>0|(s|0)==(m|0)&r>>>0>l>>>0?1:q>>>0>>0|(q|0)==(k|0)&n>>>0>>0?-1:(q>>>0>k>>>0|(q|0)==(k|0)&n>>>0>g>>>0)&1;g=P(g,x)|0}else g=x-g|0;if((g|0)<1)break d}}while(0);g=c[e>>2]|0;if(!g){g=110;break c}if(!(c[g+12>>2]|0)){g=110;break c}v=c[(c[g+8>>2]|0)+4>>2]|0;if((c[v+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break c}i=c[v+12>>2]|0;l=c[i+88>>2]|0;h=l-h|0;k=c[i+92>>2]|0;b=k-b|0;i=c[i+96>>2]|0;g=i-d|0;ja=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(b|0,((b|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(g|0,((g|0)<0)<<31>>31|0,F|0,G|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break c}m=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;u=A;d=ct(b|0,((b|0)<0)<<31>>31|0,$|0,aa|0)|0;u=Ow(d|0,A|0,m|0,u|0)|0;m=A;d=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;d=Ow(u|0,m|0,d|0,A|0)|0;m=A;g=(P(b,ea)|0)+(P(h,da)|0)+(P(g,W)|0)|0;u=E-l|0;ia=p-k|0;t=o-i|0;u=ct(u|0,((u|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,u|0,ja|0)|0;u=A;t=ct(t|0,((t|0)<0)<<31>>31|0,ba|0,ca|0)|0;t=Ow(ja|0,u|0,t|0,A|0)|0;u=A;if((u|0)>=0){g=110;break c}if((d|0)==0&(m|0)==0){if((g|0)<=0){g=110;break c}}else{if((m|0)>=0){g=110;break c}if((g|0)>0){h=((g|0)<0)<<31>>31;i=1}else{ja=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;h=g|0?A:0;i=((g|0)!=0)<<31>>31;g=g|0?ja:0}q=sw(0,0,d|0,m|0)|0;r=A;s=0-i|0;if((C|0)>0){b=1;n=C;m=((C|0)<0)<<31>>31}else{n=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;b=((C|0)!=0)<<31>>31;n=C|0?n:0;m=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){d=b;b=D}else{ja=(j|0)!=0|(D|0)!=0;j=sw(0,0,j|0,D|0)|0;d=ja?0-b|0:b;j=ja?j:0;b=ja?A:0}if((d|0)==(s|0)){if(!i){g=110;break c}ja=ct(j|0,0,g|0,0)|0;i=A;d=ct(b|0,0,g|0,0)|0;V=A;k=ct(j|0,0,h|0,0)|0;l=A;g=ct(b|0,0,h|0,0)|0;j=A;k=Ow(d|0,0,k|0,0)|0;b=A;j=Ow(V|0,0,g|0,j|0)|0;l=Ow(j|0,A|0,l|0,0)|0;b=Ow(l|0,A|0,b|0,0)|0;l=A;i=Ow(0,k|0,ja|0,i|0)|0;j=A;k=Ow(b|0,l|0,(j>>>0>>0|(j|0)==(k|0)&i>>>0<0)&1|0,0)|0;l=A;b=ct(n|0,0,q|0,0)|0;g=A;ja=ct(m|0,0,q|0,0)|0;V=A;d=ct(n|0,0,r|0,0)|0;h=A;ha=ct(m|0,0,r|0,0)|0;ia=A;d=Ow(ja|0,0,d|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;h=Ow(ia|0,A|0,h|0,0)|0;ja=Ow(h|0,A|0,ja|0,0)|0;h=A;g=Ow(0,d|0,b|0,g|0)|0;b=A;d=Ow(ja|0,h|0,(b>>>0>>0|(b|0)==(d|0)&g>>>0<0)&1|0,0)|0;h=A;if(l>>>0>>0|(l|0)==(h|0)&k>>>0>>0)g=-1;else g=l>>>0>h>>>0|(l|0)==(h|0)&k>>>0>d>>>0?1:j>>>0>>0|(j|0)==(b|0)&i>>>0>>0?-1:(j>>>0>b>>>0|(j|0)==(b|0)&i>>>0>g>>>0)&1;g=P(g,s)|0}else g=s-d|0;if((g|0)>=0){g=110;break c}}c[e>>2]=v;d=c[v+12>>2]|0;h=c[d+88>>2]|0;b=c[d+92>>2]|0;d=c[d+96>>2]|0;i=c[f>>2]|0;D=u;j=t}E=y-h|0;o=z-b|0;j=B-d|0;E=ct(E|0,((E|0)<0)<<31>>31|0,Z|0,_|0)|0;p=A;o=ct(o|0,((o|0)<0)<<31>>31|0,$|0,aa|0)|0;p=Ow(o|0,A|0,E|0,p|0)|0;E=A;j=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;j=Ow(p|0,E|0,j|0,A|0)|0;i=(i|0)==(fa|0)?0:ga;c[f>>2]=i;E=y;p=z;o=B;g=A}if((g|0)==110)return}function sc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;m=c[6997]|0;if(m>>>(o>>>3)&3|0){a=28028+((m>>>(o>>>3)&1^1)+(o>>>3)<<1<<2)|0;b=c[a+8>>2]|0;d=c[b+8>>2]|0;if((a|0)==(d|0))c[6997]=m&~(1<<(m>>>(o>>>3)&1^1)+(o>>>3));else{c[d+12>>2]=a;c[a+8>>2]=d}v=(m>>>(o>>>3)&1^1)+(o>>>3)<<3;c[b+4>>2]=v|3;c[b+v+4>>2]=c[b+v+4>>2]|1;v=b+8|0;l=w;return v|0}n=c[6999]|0;if(o>>>0>n>>>0){if(m>>>(o>>>3)|0){a=m>>>(o>>>3)<<(o>>>3)&(2<<(o>>>3)|0-(2<<(o>>>3)));f=((a&0-a)+-1|0)>>>(((a&0-a)+-1|0)>>>12&16);e=f>>>(f>>>5&8)>>>(f>>>(f>>>5&8)>>>2&4);e=(f>>>5&8|((a&0-a)+-1|0)>>>12&16|f>>>(f>>>5&8)>>>2&4|e>>>1&2|e>>>(e>>>1&2)>>>1&1)+(e>>>(e>>>1&2)>>>(e>>>(e>>>1&2)>>>1&1))|0;f=c[28028+(e<<1<<2)+8>>2]|0;a=c[f+8>>2]|0;if((28028+(e<<1<<2)|0)==(a|0)){c[6997]=m&~(1<>2]=28028+(e<<1<<2);c[28028+(e<<1<<2)+8>>2]=a;a=m}c[f+4>>2]=o|3;c[f+o+4>>2]=(e<<3)-o|1;c[f+o+((e<<3)-o)>>2]=(e<<3)-o;if(n|0){d=c[7002]|0;if(!(a&1<<(n>>>3))){c[6997]=a|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=(e<<3)-o;c[7002]=f+o;v=f+8|0;l=w;return v|0}k=c[6998]|0;if(k){b=((k&0-k)+-1|0)>>>(((k&0-k)+-1|0)>>>12&16);a=b>>>(b>>>5&8)>>>(b>>>(b>>>5&8)>>>2&4);a=c[28292+((b>>>5&8|((k&0-k)+-1|0)>>>12&16|b>>>(b>>>5&8)>>>2&4|a>>>1&2|a>>>(a>>>1&2)>>>1&1)+(a>>>(a>>>1&2)>>>(a>>>(a>>>1&2)>>>1&1))<<2)>>2]|0;b=(c[a+4>>2]&-8)-o|0;d=c[a+16+(((c[a+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=a;h=b}else{do{i=(c[d+4>>2]&-8)-o|0;j=i>>>0>>0;b=j?i:b;a=j?d:a;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=a;h=b}i=j+o|0;if(j>>>0>>0){f=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){b=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);do if(f|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=k&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=f;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+20>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);if(h>>>0<16){v=h+o|0;c[j+4>>2]=v|3;v=j+v+4|0;c[v>>2]=c[v>>2]|1}else{c[j+4>>2]=o|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(n|0){d=c[7002]|0;if(!(m&1<<(n>>>3))){c[6997]=m|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=h;c[7002]=i}v=j+8|0;l=w;return v|0}}}}else if(a>>>0<=4294967231){o=a+11&-8;j=c[6998]|0;if(j){if((a+11|0)>>>8)if(o>>>0>16777215)i=31;else{i=(a+11|0)>>>8<<((((a+11|0)>>>8)+1048320|0)>>>16&8);i=14-((i+520192|0)>>>16&4|(((a+11|0)>>>8)+1048320|0)>>>16&8|((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)+(i<<((i+520192|0)>>>16&4)<<(((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;i=o>>>(i+7|0)&1|i<<1}else i=0;b=c[28292+(i<<2)>>2]|0;a:do if(!b){b=0;a=0;d=0-o|0;u=57}else{a=0;d=0-o|0;h=o<<((i|0)==31?0:25-(i>>>1)|0);f=0;while(1){e=(c[b+4>>2]&-8)-o|0;if(e>>>0>>0)if(!e){a=b;d=0;e=b;u=61;break a}else{a=b;d=e}e=c[b+20>>2]|0;b=c[b+16+(h>>>31<<2)>>2]|0;f=(e|0)==0|(e|0)==(b|0)?f:e;e=(b|0)==0;if(e){b=f;u=57;break}else h=h<<((e^1)&1)}}while(0);if((u|0)==57){if((b|0)==0&(a|0)==0){a=2<>>(m>>>12&16)>>>(m>>>(m>>>12&16)>>>5&8);b=n>>>(n>>>2&4)>>>(n>>>(n>>>2&4)>>>1&2);a=0;b=c[28292+((m>>>(m>>>12&16)>>>5&8|m>>>12&16|n>>>2&4|n>>>(n>>>2&4)>>>1&2|b>>>1&1)+(b>>>(b>>>1&1))<<2)>>2]|0}if(!b){i=a;h=d}else{e=b;u=61}}if((u|0)==61)while(1){u=0;b=(c[e+4>>2]&-8)-o|0;n=b>>>0>>0;b=n?b:d;a=n?e:a;e=c[e+16+(((c[e+16>>2]|0)==0&1)<<2)>>2]|0;if(!e){i=a;h=b;break}else{d=b;u=61}}if((i|0)!=0?h>>>0<((c[6999]|0)-o|0)>>>0:0){g=i+o|0;if(i>>>0>=g>>>0){v=0;l=w;return v|0}f=c[i+24>>2]|0;a=c[i+12>>2]|0;do if((a|0)==(i|0)){b=i+20|0;a=c[b>>2]|0;if(!a){b=i+16|0;a=c[b>>2]|0;if(!a){a=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0}else{v=c[i+8>>2]|0;c[v+12>>2]=a;c[a+8>>2]=v}while(0);do if(f){b=c[i+28>>2]|0;if((i|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=j&~(1<>2]|0)!=(i|0)&1)<<2)>>2]=a;if(!a){e=j;break}}c[a+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[i+20>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;e=j}else e=j}else e=j;while(0);do if(h>>>0>=16){c[i+4>>2]=o|3;c[g+4>>2]=h|1;c[g+h>>2]=h;d=h>>>3;if(h>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=g;c[a+12>>2]=g;c[g+8>>2]=a;c[g+12>>2]=28028+(d<<1<<2);break}a=h>>>8;if(a)if(h>>>0>16777215)a=31;else{v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=h>>>(a+7|0)&1|a<<1}else a=0;d=28292+(a<<2)|0;c[g+28>>2]=a;c[g+16+4>>2]=0;c[g+16>>2]=0;b=1<>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}b=h<<((a|0)==31?0:25-(a>>>1)|0);d=c[d>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(h|0)){u=97;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=96;break}else{b=b<<1;d=a}}if((u|0)==96){c[e>>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}else if((u|0)==97){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=g;c[u>>2]=g;c[g+8>>2]=v;c[g+12>>2]=d;c[g+24>>2]=0;break}}else{v=h+o|0;c[i+4>>2]=v|3;v=i+v+4|0;c[v>>2]=c[v>>2]|1}while(0);v=i+8|0;l=w;return v|0}}}else o=-1;while(0);d=c[6999]|0;if(d>>>0>=o>>>0){a=d-o|0;b=c[7002]|0;if(a>>>0>15){v=b+o|0;c[7002]=v;c[6999]=a;c[v+4>>2]=a|1;c[v+a>>2]=a;c[b+4>>2]=o|3}else{c[6999]=0;c[7002]=0;c[b+4>>2]=d|3;c[b+d+4>>2]=c[b+d+4>>2]|1}v=b+8|0;l=w;return v|0}f=c[7e3]|0;if(f>>>0>o>>>0){t=f-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}if(!(c[7115]|0)){c[7117]=4096;c[7116]=4096;c[7118]=-1;c[7119]=-1;c[7120]=0;c[7108]=0;c[w>>2]=w&-16^1431655768;c[7115]=w&-16^1431655768;a=4096}else a=c[7117]|0;h=o+48|0;i=o+47|0;k=a+i|0;j=0-a|0;if((k&j)>>>0<=o>>>0){v=0;l=w;return v|0}a=c[7107]|0;if(a|0?(n=c[7105]|0,(n+(k&j)|0)>>>0<=n>>>0?1:(n+(k&j)|0)>>>0>a>>>0):0){v=0;l=w;return v|0}b:do if(!(c[7108]&4)){d=c[7003]|0;c:do if(d){b=28436;while(1){a=c[b>>2]|0;if(a>>>0<=d>>>0?(p=b+4|0,(a+(c[p>>2]|0)|0)>>>0>d>>>0):0)break;a=c[b+8>>2]|0;if(!a){u=118;break c}else b=a}if((k-f&j)>>>0<2147483647){a=_o(k-f&j|0)|0;if((a|0)==((c[b>>2]|0)+(c[p>>2]|0)|0))if((a|0)==(-1|0))a=k-f&j;else{h=k-f&j;g=a;u=135;break b}else{e=a;d=k-f&j;u=126}}else a=0}else u=118;while(0);do if((u|0)==118){b=_o(0)|0;if((b|0)!=(-1|0)?(r=c[7116]|0,r=((r+-1&b|0)==0?0:(r+-1+b&0-r)-b|0)+(k&j)|0,q=c[7105]|0,r>>>0>o>>>0&r>>>0<2147483647):0){p=c[7107]|0;if(p|0?(r+q|0)>>>0<=q>>>0|(r+q|0)>>>0>p>>>0:0){a=0;break}a=_o(r|0)|0;if((a|0)==(b|0)){h=r;g=b;u=135;break b}else{e=a;d=r;u=126}}else a=0}while(0);do if((u|0)==126){b=0-d|0;if(!(h>>>0>d>>>0&(d>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){a=0;break}else{h=d;g=e;u=135;break b}a=c[7117]|0;a=i-d+a&0-a;if(a>>>0>=2147483647){h=d;g=e;u=135;break b}if((_o(a|0)|0)==(-1|0)){_o(b|0)|0;a=0;break}else{h=a+d|0;g=e;u=135;break b}}while(0);c[7108]=c[7108]|4;u=133}else{a=0;u=133}while(0);if(((u|0)==133?(k&j)>>>0<2147483647:0)?(g=_o(k&j|0)|0,s=_o(0)|0,t=(s-g|0)>>>0>(o+40|0)>>>0,!((g|0)==(-1|0)|t^1|g>>>0>>0&((g|0)!=(-1|0)&(s|0)!=(-1|0))^1)):0){h=t?s-g|0:a;u=135}if((u|0)==135){a=(c[7105]|0)+h|0;c[7105]=a;if(a>>>0>(c[7106]|0)>>>0)c[7106]=a;j=c[7003]|0;do if(j){a=28436;while(1){b=c[a>>2]|0;d=a+4|0;e=c[d>>2]|0;if((g|0)==(b+e|0)){u=145;break}f=c[a+8>>2]|0;if(!f)break;else a=f}if(((u|0)==145?(c[a+12>>2]&8|0)==0:0)?j>>>0>>0&j>>>0>=b>>>0:0){c[d>>2]=e+h;u=(j+8&7|0)==0?0:0-(j+8)&7;v=(c[7e3]|0)+(h-u)|0;c[7003]=j+u;c[7e3]=v;c[j+u+4>>2]=v|1;c[j+u+v+4>>2]=40;c[7004]=c[7119];break}if(g>>>0<(c[7001]|0)>>>0)c[7001]=g;d=g+h|0;a=28436;while(1){if((c[a>>2]|0)==(d|0)){u=153;break}b=c[a+8>>2]|0;if(!b)break;else a=b}if((u|0)==153?(c[a+12>>2]&8|0)==0:0){c[a>>2]=g;m=a+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;a=d+((d+8&7|0)==0?0:0-(d+8)&7)|0;k=m+o|0;i=a-m-o|0;c[m+4>>2]=o|3;do if((a|0)!=(j|0)){if((a|0)==(c[7002]|0)){v=(c[6999]|0)+i|0;c[6999]=v;c[7002]=k;c[k+4>>2]=v|1;c[k+v>>2]=v;break}h=c[a+4>>2]|0;if((h&3|0)==1){d:do if(h>>>0<256){b=c[a+8>>2]|0;d=c[a+12>>2]|0;if((d|0)==(b|0)){c[6997]=c[6997]&~(1<<(h>>>3));break}else{c[b+12>>2]=d;c[d+8>>2]=b;break}}else{g=c[a+24>>2]|0;b=c[a+12>>2]|0;do if((b|0)==(a|0)){b=c[a+16+4>>2]|0;if(!b){b=c[a+16>>2]|0;if(!b){b=0;break}else f=a+16|0}else f=a+16+4|0;while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;f=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;f=d}}c[f>>2]=0}else{v=c[a+8>>2]|0;c[v+12>>2]=b;c[b+8>>2]=v}while(0);if(!g)break;d=c[a+28>>2]|0;do if((a|0)!=(c[28292+(d<<2)>>2]|0)){c[g+16+(((c[g+16>>2]|0)!=(a|0)&1)<<2)>>2]=b;if(!b)break d}else{c[28292+(d<<2)>>2]=b;if(b|0)break;c[6998]=c[6998]&~(1<>2]=g;d=c[a+16>>2]|0;if(d|0){c[b+16>>2]=d;c[d+24>>2]=b}d=c[a+16+4>>2]|0;if(!d)break;c[b+20>>2]=d;c[d+24>>2]=b}while(0);a=a+(h&-8)|0;f=(h&-8)+i|0}else f=i;d=a+4|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=k;c[a+12>>2]=k;c[k+8>>2]=a;c[k+12>>2]=28028+(d<<1<<2);break}a=f>>>8;do if(!a)a=0;else{if(f>>>0>16777215){a=31;break}v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}while(0);e=28292+(a<<2)|0;c[k+28>>2]=a;c[k+16+4>>2]=0;c[k+16>>2]=0;b=c[6998]|0;d=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}b=f<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){u=194;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=193;break}else{b=b<<1;d=a}}if((u|0)==193){c[e>>2]=k;c[k+24>>2]=d;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((u|0)==194){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=k;c[u>>2]=k;c[k+8>>2]=v;c[k+12>>2]=d;c[k+24>>2]=0;break}}else{v=(c[7e3]|0)+i|0;c[7e3]=v;c[7003]=k;c[k+4>>2]=v|1}while(0);v=m+8|0;l=w;return v|0}a=28436;while(1){b=c[a>>2]|0;if(b>>>0<=j>>>0?(v=b+(c[a+4>>2]|0)|0,v>>>0>j>>>0):0)break;a=c[a+8>>2]|0}f=v+-47+((v+-47+8&7|0)==0?0:0-(v+-47+8)&7)|0;f=f>>>0<(j+16|0)>>>0?j:f;a=g+8|0;a=(a&7|0)==0?0:0-a&7;u=g+a|0;a=h+-40-a|0;c[7003]=u;c[7e3]=a;c[u+4>>2]=a|1;c[u+a+4>>2]=40;c[7004]=c[7119];c[f+4>>2]=27;c[f+8>>2]=c[7109];c[f+8+4>>2]=c[7110];c[f+8+8>>2]=c[7111];c[f+8+12>>2]=c[7112];c[7109]=g;c[7110]=h;c[7112]=0;c[7111]=f+8;a=f+24|0;do{u=a;a=a+4|0;c[a>>2]=7}while((u+8|0)>>>0>>0);if((f|0)!=(j|0)){c[f+4>>2]=c[f+4>>2]&-2;c[j+4>>2]=f-j|1;c[f>>2]=f-j;if((f-j|0)>>>0<256){d=28028+((f-j|0)>>>3<<1<<2)|0;a=c[6997]|0;if(!(a&1<<((f-j|0)>>>3))){c[6997]=a|1<<((f-j|0)>>>3);a=d;b=d+8|0}else{a=c[d+8>>2]|0;b=d+8|0}c[b>>2]=j;c[a+12>>2]=j;c[j+8>>2]=a;c[j+12>>2]=d;break}if((f-j|0)>>>8)if((f-j|0)>>>0>16777215)a=31;else{a=(f-j|0)>>>8<<((((f-j|0)>>>8)+1048320|0)>>>16&8);a=14-((a+520192|0)>>>16&4|(((f-j|0)>>>8)+1048320|0)>>>16&8|((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)+(a<<((a+520192|0)>>>16&4)<<(((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;a=(f-j|0)>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[j+28>>2]=a;c[j+20>>2]=0;c[j+16>>2]=0;b=c[6998]|0;d=1<>2]=j;c[j+24>>2]=e;c[j+12>>2]=j;c[j+8>>2]=j;break}b=f-j<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f-j|0)){u=216;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=215;break}else{b=b<<1;d=a}}if((u|0)==215){c[e>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}else if((u|0)==216){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=j;c[u>>2]=j;c[j+8>>2]=v;c[j+12>>2]=d;c[j+24>>2]=0;break}}}else{v=c[7001]|0;if((v|0)==0|g>>>0>>0)c[7001]=g;c[7109]=g;c[7110]=h;c[7112]=0;c[7006]=c[7115];c[7005]=-1;a=0;do{v=28028+(a<<1<<2)|0;c[v+12>>2]=v;c[v+8>>2]=v;a=a+1|0}while((a|0)!=32);v=g+8|0;v=(v&7|0)==0?0:0-v&7;u=g+v|0;v=h+-40-v|0;c[7003]=u;c[7e3]=v;c[u+4>>2]=v|1;c[u+v+4>>2]=40;c[7004]=c[7119]}while(0);a=c[7e3]|0;if(a>>>0>o>>>0){t=a-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}}c[7137]=12;v=0;l=w;return v|0}function tc(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,H=0.0,I=0.0,J=0.0,K=0.0;x=l;l=l+544|0;f=+g[b+100>>2];k=+g[b+104>>2];h=+g[b+108>>2];if(f*f+k*k+h*h>0.0){m=+E(+(1.0-+g[b+244>>2]),+e);g[b+100>>2]=f*m;g[b+104>>2]=m*k;g[b+108>>2]=m*h;f=f*m;k=m*k;h=m*h}m=f*f+k*k+h*h;if(m>0.0){q=c[b+8>>2]|0;c[x+472>>2]=c[q+4>>2];c[x+472+4>>2]=c[q+4+4>>2];c[x+472+8>>2]=c[q+4+8>>2];c[x+472+12>>2]=c[q+4+12>>2];i=x+472+16|0;c[i>>2]=c[q+20>>2];c[i+4>>2]=c[q+20+4>>2];c[i+8>>2]=c[q+20+8>>2];c[i+12>>2]=c[q+20+12>>2];j=x+472+32|0;c[j>>2]=c[q+36>>2];c[j+4>>2]=c[q+36+4>>2];c[j+8>>2]=c[q+36+8>>2];c[j+12>>2]=c[q+36+12>>2];o=x+472+48|0;c[o>>2]=c[q+52>>2];c[o+4>>2]=c[q+52+4>>2];c[o+8>>2]=c[q+52+8>>2];c[o+12>>2]=c[q+52+12>>2];K=+D(+m);I=f*(1.0/K);B=k*(1.0/K);m=h*(1.0/K);h=+G(+(K*e*.5))/+D(+(m*m+(I*I+B*B)));K=+F(+(K*e*.5));yh(x+472|0,x+408|0);H=+g[x+408>>2];J=+g[x+408+12>>2];y=+g[x+408+8>>2];z=+g[x+408+4>>2];f=K*H+I*h*J+B*h*y-m*h*z;k=m*h*H+(B*h*J+K*z)-I*h*y;A=m*h*J+K*y+I*h*z-B*h*H;y=K*J-I*h*H-B*h*z-m*h*y;h=f*(2.0/(y*y+(A*A+(f*f+k*k))));m=k*(2.0/(y*y+(A*A+(f*f+k*k))));z=A*(2.0/(y*y+(A*A+(f*f+k*k))));g[x+472>>2]=1.0-(k*m+A*z);g[x+472+4>>2]=f*m-y*z;g[x+472+8>>2]=f*z+y*m;g[x+472+12>>2]=0.0;g[x+472+16>>2]=f*m+y*z;g[x+472+20>>2]=1.0-(f*h+A*z);g[x+472+24>>2]=k*z-y*h;g[x+472+28>>2]=0.0;g[x+472+32>>2]=f*z-y*m;g[x+472+36>>2]=k*z+y*h;g[x+472+40>>2]=1.0-(f*h+k*m);g[x+472+44>>2]=0.0;q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[x+472>>2];c[q+4+4>>2]=c[x+472+4>>2];c[q+4+8>>2]=c[x+472+8>>2];c[q+4+12>>2]=c[x+472+12>>2];c[q+20>>2]=c[i>>2];c[q+20+4>>2]=c[i+4>>2];c[q+20+8>>2]=c[i+8>>2];c[q+20+12>>2]=c[i+12>>2];c[q+36>>2]=c[j>>2];c[q+36+4>>2]=c[j+4>>2];c[q+36+8>>2]=c[j+8>>2];c[q+36+12>>2]=c[j+12>>2];c[q+52>>2]=c[o>>2];c[q+52+4>>2]=c[o+4>>2];c[q+52+8>>2]=c[o+8>>2];c[q+52+12>>2]=c[o+12>>2];q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];$p(b+152|0,q+52|0,16)|0;yh(q+4|0,x+408|0);c[b+168>>2]=c[x+408>>2];c[b+168+4>>2]=c[x+408+4>>2];c[b+168+8>>2]=c[x+408+8>>2];c[b+168+12>>2]=c[x+408+12>>2];c[b+184>>2]=c[b+168>>2];c[b+184+4>>2]=c[b+168+4>>2];c[b+184+8>>2]=c[b+168+8>>2];c[b+184+12>>2]=c[b+168+12>>2]}if((a[b+251>>0]|0)==0?+g[b+252>>2]<=0.0:0){l=x;return}a[b+248>>0]=(xb[c[(c[b>>2]|0)+48>>2]&127](b)|0)&1;f=+g[b+68>>2];h=+g[b+72>>2];k=+g[b+76>>2];m=+E(+(1.0-+g[b+240>>2]),+e);if(f*f+h*h+k*k>0.0){g[b+68>>2]=f*m;g[b+72>>2]=m*h;g[b+76>>2]=m*k}f=m*+g[b+20>>2]-+g[b+52>>2]*e;g[b+20>>2]=f;if(f>0.0?(p=+g[b+32>>2],f>p):0){g[b+20>>2]=p;f=p}if(f<0.0?(K=+C(+f),r=+C(+(+g[b+28>>2])),K>r):0){g[b+20>>2]=-r;f=-r}h=f*e;g[b+24>>2]=h;q=c[b+8>>2]|0;c[x>>2]=c[q+4>>2];c[x+4>>2]=c[q+4+4>>2];c[x+8>>2]=c[q+4+8>>2];c[x+12>>2]=c[q+4+12>>2];c[x+16>>2]=c[q+20>>2];c[x+16+4>>2]=c[q+20+4>>2];c[x+16+8>>2]=c[q+20+8>>2];c[x+16+12>>2]=c[q+20+12>>2];c[x+32>>2]=c[q+36>>2];c[x+32+4>>2]=c[q+36+4>>2];c[x+32+8>>2]=c[q+36+8>>2];c[x+32+12>>2]=c[q+36+12>>2];c[x+48>>2]=c[q+52>>2];c[x+48+4>>2]=c[q+52+4>>2];c[x+48+8>>2]=c[q+52+8>>2];c[x+48+12>>2]=c[q+52+12>>2];if(f<0.0)k=+g[b+60>>2];else k=0.0;c[x+472>>2]=1065353216;o=x+472+4|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[x+472+20>>2]=1065353216;q=x+472+24|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[x+472+40>>2]=1065353216;c[x+472+44>>2]=0;c[x+408>>2]=1065353216;j=x+408+4|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[x+408+20>>2]=1065353216;i=x+408+24|0;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];A=h>0.0?h:0.0;J=k*+g[b+260>>2]+ +g[b+136>>2]+A*+g[b+276>>2];B=k*+g[b+264>>2]+ +g[b+140>>2]+A*+g[b+280>>2];g[b+152>>2]=k*+g[b+256>>2]+ +g[b+132>>2]+ +g[b+272>>2]*A;g[b+156>>2]=J;g[b+160>>2]=B;g[b+164>>2]=0.0;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];J=+g[b+172>>2];A=+g[b+176>>2];K=+g[b+180>>2];z=B*(2.0/(B*B+J*J+A*A+K*K));H=J*(2.0/(B*B+J*J+A*A+K*K));I=A*(2.0/(B*B+J*J+A*A+K*K));g[x+472>>2]=1.0-(J*H+A*I);g[o>>2]=B*H-K*I;g[x+472+8>>2]=B*I+K*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+K*I;g[x+472+20>>2]=1.0-(B*z+A*I);g[q>>2]=J*I-K*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*I-K*H;g[x+472+36>>2]=J*I+K*z;g[x+472+40>>2]=1.0-(B*z+J*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];J=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];K=H*(2.0/(H*H+J*J+z*z+B*B));I=J*(2.0/(H*H+J*J+z*z+B*B));A=z*(2.0/(H*H+J*J+z*z+B*B));g[x+408>>2]=1.0-(J*I+z*A);g[j>>2]=H*I-B*A;g[x+408+8>>2]=H*A+B*I;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*I+B*A;g[x+408+20>>2]=1.0-(H*K+z*A);g[i>>2]=J*A-B*K;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*I;g[x+408+36>>2]=J*A+B*K;g[x+408+40>>2]=1.0-(H*K+J*I);g[x+408+44>>2]=0.0;i=c[b+8>>2]|0;I=-+g[b+256>>2];J=-+g[b+260>>2];K=-+g[b+264>>2];j=c[b+48>>2]|0;g[x+296+4>>2]=1.0;q=x+296+16|0;c[x+296+80>>2]=0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;c[q+28>>2]=0;c[x+296>>2]=5252;c[x+296+84>>2]=i;g[x+296+88>>2]=I;g[x+296+92>>2]=J;g[x+296+96>>2]=K;g[x+296+100>>2]=0.0;c[x+296+104>>2]=j;j=c[i+188>>2]|0;c[x+296+8>>2]=c[j+4>>2];c[x+296+12>>2]=c[j+8>>2];j=c[b+12>>2]|0;if(!(a[b+250>>0]|0))Ud(d,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);else pd(i,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);if((+g[x+296+4>>2]<1.0?(n=c[b+8>>2]|0,(c[n+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,n,c[x+296+80>>2]|0)|0:0){do if(+g[x+296+48>>2]*+g[b+256>>2]+ +g[x+296+52>>2]*+g[b+260>>2]+ +g[x+296+56>>2]*+g[b+264>>2]>0.0){f=+g[x+296+4>>2];g[b+148>>2]=k*f;if(!(a[b+288>>0]|0)){c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];break}else{g[b+132>>2]=(1.0-f)*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=(1.0-f)*+g[b+136>>2]+f*+g[b+156>>2];g[b+140>>2]=(1.0-f)*+g[b+140>>2]+f*+g[b+160>>2];break}}while(0);o=c[b+8>>2]|0;c[o+52>>2]=c[b+132>>2];c[o+52+4>>2]=c[b+132+4>>2];c[o+52+8>>2]=c[b+132+8>>2];c[o+52+12>>2]=c[b+132+12>>2];q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[o+4>>2];c[q+4+4>>2]=c[o+4+4>>2];c[q+4+8>>2]=c[o+4+8>>2];c[q+4+12>>2]=c[o+4+12>>2];c[q+20>>2]=c[o+20>>2];c[q+20+4>>2]=c[o+20+4>>2];c[q+20+8>>2]=c[o+20+8>>2];c[q+20+12>>2]=c[o+20+12>>2];c[q+36>>2]=c[o+36>>2];c[q+36+4>>2]=c[o+36+4>>2];c[q+36+8>>2]=c[o+36+8>>2];c[q+36+12>>2]=c[o+36+12>>2];c[q+52>>2]=c[o+52>>2];c[q+52+4>>2]=c[o+52+4>>2];c[q+52+8>>2]=c[o+52+8>>2];c[q+52+12>>2]=c[o+52+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;q=(c[b+8>>2]|0)+52|0;c[b+152>>2]=c[q>>2];c[b+152+4>>2]=c[q+4>>2];c[b+152+8>>2]=c[q+8>>2];c[b+152+12>>2]=c[q+12>>2];$p(b+132|0,q|0,16)|0;if(+g[b+24>>2]>0.0){g[b+24>>2]=0.0;g[b+20>>2]=0.0;c[b+148>>2]=c[b+60>>2]}}else{g[b+148>>2]=k;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(a[b+251>>0]|0)){J=+g[b+252>>2];K=J>e?e:J;g[b+252>>2]=J-e;hd(b,d,K*+g[b+68>>2],K*+g[b+72>>2],K*+g[b+76>>2])}else hd(b,d,+g[b+68>>2],+g[b+72>>2],+g[b+76>>2]);c[x+280>>2]=c[b+152>>2];c[x+280+4>>2]=c[b+152+4>>2];c[x+280+8>>2]=c[b+152+8>>2];c[x+280+12>>2]=c[b+152+12>>2];K=+g[b+20>>2];f=(K<0.0?-K:0.0)*e;if(!(K>0.0)){do if(f>0.0?(s=+g[b+28>>2],f>s):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;f=s}while(0);p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=c[b+8>>2]|0;o=c[b+48>>2]|0;q=x+172+4|0;g[q>>2]=1.0;n=x+172+16|0;c[x+172+80>>2]=0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;c[n+28>>2]=0;c[x+172>>2]=5252;c[x+172+84>>2]=i;c[x+172+88>>2]=c[b+256>>2];c[x+172+88+4>>2]=c[b+256+4>>2];c[x+172+88+8>>2]=c[b+256+8>>2];c[x+172+88+12>>2]=c[b+256+12>>2];c[x+172+104>>2]=o;n=c[i+188>>2]|0;c[x+172+8>>2]=c[n+4>>2];c[x+172+12>>2]=c[n+8>>2];g[x+64+4>>2]=1.0;j=x+64+16|0;c[x+64+80>>2]=0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[x+64>>2]=5252;c[x+64+84>>2]=i;c[x+64+88>>2]=c[b+256>>2];c[x+64+88+4>>2]=c[b+256+4>>2];c[x+64+88+8>>2]=c[b+256+8>>2];c[x+64+88+12>>2]=c[b+256+12>>2];c[x+64+104>>2]=o;c[x+64+8>>2]=c[n+4>>2];c[x+64+12>>2]=c[n+8>>2];n=x+408+24|0;o=x+296+44|0;i=0;while(1){c[x+408+12>>2]=0;c[x+408+12+4>>2]=0;c[x+408+20>>2]=1065353216;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+296>>2]=1065353216;c[x+296+4>>2]=0;c[x+296+4+4>>2]=0;c[x+296+4+8>>2]=0;c[x+296+4+12>>2]=0;c[x+296+20>>2]=1065353216;c[x+296+24>>2]=0;c[x+296+24+4>>2]=0;c[x+296+24+8>>2]=0;c[x+296+24+12>>2]=0;c[x+296+40>>2]=1065353216;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];K=+g[b+172>>2];A=+g[b+176>>2];I=+g[b+180>>2];z=B*(2.0/(B*B+K*K+A*A+I*I));H=K*(2.0/(B*B+K*K+A*A+I*I));J=A*(2.0/(B*B+K*K+A*A+I*I));g[x+472>>2]=1.0-(K*H+A*J);g[x+472+4>>2]=B*H-I*J;g[x+472+8>>2]=B*J+I*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+I*J;g[x+472+20>>2]=1.0-(B*z+A*J);g[x+472+24>>2]=K*J-I*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*J-I*H;g[x+472+36>>2]=K*J+I*z;g[x+472+40>>2]=1.0-(B*z+K*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];K=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];I=H*(2.0/(H*H+K*K+z*z+B*B));J=K*(2.0/(H*H+K*K+z*z+B*B));A=z*(2.0/(H*H+K*K+z*z+B*B));g[x+408>>2]=1.0-(K*J+z*A);g[x+408+4>>2]=H*J-B*A;g[x+408+8>>2]=H*A+B*J;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*J+B*A;g[x+408+20>>2]=1.0-(H*I+z*A);g[n>>2]=K*A-B*I;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*J;g[x+408+36>>2]=K*A+B*I;g[x+408+40>>2]=1.0-(H*I+K*J);g[x+408+44>>2]=0.0;J=+g[b+156>>2]-m;K=+g[b+160>>2]-p;g[x+296+48>>2]=+g[b+152>>2]-k;g[x+296+52>>2]=J;g[x+296+56>>2]=K;g[x+296+60>>2]=0.0;if(!(a[b+250>>0]|0)){Ud(d,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(c[(c[b+8>>2]|0)+204>>2]&4|0)==0:0)Ud(d,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}else{pd(c[b+8>>2]|0,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(t=c[b+8>>2]|0,(c[t+204>>2]&4|0)==0):0)pd(t,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}h=+g[b+20>>2];h=(h<0.0?-h:0.0)*e;if(!(a[b+290>>0]|0))if(+g[x+64+4>>2]<1.0?(v=c[b+8>>2]|0,(c[v+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,v,c[x+64+80>>2]|0)|0;else j=0;else if((+g[q>>2]<1.0?1:+g[x+64+4>>2]<1.0)?(u=c[b+8>>2]|0,(c[u+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,u,c[x+172+80>>2]|0)|0;else j=0;if(+g[b+20>>2]<0.0)f=+g[b+60>>2];else f=0.0;if(i|(!(h>0.0)|!(h>0]|0)==0?a[b+249>>0]|0:0){i=0;break}c[b+152>>2]=c[x+280>>2];c[b+152+4>>2]=c[x+280+4>>2];c[b+152+8>>2]=c[x+280+8>>2];c[b+152+12>>2]=c[x+280+12>>2];p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=1}j=c[b+8>>2]|0;if(+g[q>>2]<1.0?(c[j+204>>2]&4|0)==0:0)if(i|(Bb[c[(c[b>>2]|0)+56>>2]&63](b,j,c[x+172+80>>2]|0)|0))i=69;else i=73;else if(i)i=69;else i=73;if((i|0)==69){if(!(a[b+290>>0]|0)){i=b+289|0;f=+g[q>>2];h=+g[b+136>>2]}else{h=+g[b+136>>2];i=b+289|0;f=(a[b+289>>0]|0)==0?(h-+g[x+172+68>>2])*.5:+g[q>>2]}K=1.0-f;g[b+132>>2]=K*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=K*h+f*+g[b+156>>2];g[b+140>>2]=K*+g[b+140>>2]+f*+g[b+160>>2];a[i>>0]=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+249>>0]=0}else if((i|0)==73){a[b+289>>0]=1;do if(a[b+290>>0]|0?(K=+g[b+20>>2],w=+g[b+28>>2],(K<0.0?-K:0.0)*e>w):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;H=m+ +g[b+156>>2];J=p+ +g[b+160>>2];B=w+ +g[b+148>>2];I=B*+g[b+260>>2];K=B*+g[b+264>>2];g[b+152>>2]=k+ +g[b+152>>2]-+g[b+256>>2]*B;g[b+156>>2]=H-I;g[b+160>>2]=J-K}while(0);c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}}c[x+48>>2]=c[b+132>>2];c[x+48+4>>2]=c[b+132+4>>2];c[x+48+8>>2]=c[b+132+8>>2];c[x+48+12>>2]=c[b+132+12>>2];v=c[b+8>>2]|0;c[v+304>>2]=(c[v+304>>2]|0)+1;c[v+4>>2]=c[x>>2];c[v+4+4>>2]=c[x+4>>2];c[v+4+8>>2]=c[x+8>>2];c[v+4+12>>2]=c[x+12>>2];c[v+20>>2]=c[x+16>>2];c[v+20+4>>2]=c[x+16+4>>2];c[v+20+8>>2]=c[x+16+8>>2];c[v+20+12>>2]=c[x+16+12>>2];c[v+36>>2]=c[x+32>>2];c[v+36+4>>2]=c[x+32+4>>2];c[v+36+8>>2]=c[x+32+8>>2];c[v+36+12>>2]=c[x+32+12>>2];c[v+52>>2]=c[x+48>>2];c[v+52+4>>2]=c[x+48+4>>2];c[v+52+8>>2]=c[x+48+8>>2];c[v+52+12>>2]=c[x+48+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;l=x;return}function uc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+192|0;if((e|0)<1){f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;f=c[b+32>>2]|0;if(f|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;f=c[b+52>>2]|0;if(f|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;l=I;return}c[I+32>>2]=0;c[I+36>>2]=0;c[I+40>>2]=0;c[I+44>>2]=256;c[I+48>>2]=0;c[I+52>>2]=0;c[I+56>>2]=0;c[I+60>>2]=256;c[I+64>>2]=0;c[I+68>>2]=0;c[I+72>>2]=0;c[I+76>>2]=256;a[I+96>>0]=1;c[I+92>>2]=0;c[I+84>>2]=0;c[I+88>>2]=0;f=0;h=d;i=-246811958;s=1900671690;v=-246811958;w=1900671690;y=-246811958;A=1900671690;while(1){k=c[h>>2]|0;p=c[h+4>>2]|0;q=c[h+8>>2]|0;m=(c[j>>2]=k,+g[j>>2]);s=m<(c[j>>2]=s,+g[j>>2])?k:s;n=(c[j>>2]=p,+g[j>>2]);w=n<(c[j>>2]=w,+g[j>>2])?p:w;o=(c[j>>2]=q,+g[j>>2]);A=o<(c[j>>2]=A,+g[j>>2])?q:A;i=(c[j>>2]=i,+g[j>>2])>2]=v,+g[j>>2])>2]=y,+g[j>>2])>2]=i,+g[j>>2]);z=(c[j>>2]=s,+g[j>>2]);x=(c[j>>2]=v,+g[j>>2]);u=(c[j>>2]=w,+g[j>>2]);t=(c[j>>2]=y,+g[j>>2]);r=(c[j>>2]=A,+g[j>>2]);g[I+168>>2]=B-z;s=I+168+4|0;g[s>>2]=x-u;v=I+168+8|0;g[v>>2]=t-r;g[I+168+12>>2]=0.0;h=+g[I+168+((B-z>2]>2]=h;f=+g[I+168+((!(B-z>2]>>0)%3|0;c[I+104>>2]=f;G=(h^3)-f|0;c[I+108>>2]=G;g[I+168>>2]=(B-z)*9.788566967472434e-05;g[s>>2]=(x-u)*9.788566967472434e-05;g[v>>2]=(t-r)*9.788566967472434e-05;if(((G+1|0)%3|0|0)==(h|0)){m=(B-z)*9.788566967472434e-05;n=(x-u)*9.788566967472434e-05;o=(t-r)*9.788566967472434e-05}else{g[I+168>>2]=-((B-z)*9.788566967472434e-05);g[s>>2]=-((x-u)*9.788566967472434e-05);g[v>>2]=-((t-r)*9.788566967472434e-05);m=-((B-z)*9.788566967472434e-05);n=-((x-u)*9.788566967472434e-05);o=-((t-r)*9.788566967472434e-05)}c[I>>2]=c[I+168>>2];c[I+4>>2]=c[I+168+4>>2];c[I+8>>2]=c[I+168+8>>2];c[I+12>>2]=c[I+168+12>>2];if(m!=0.0)g[I+168>>2]=1.0/m;if(n!=0.0)g[s>>2]=1.0/n;if(o!=0.0)g[v>>2]=1.0/o;g[I+16>>2]=(B+z)*.5;g[I+20>>2]=(x+u)*.5;g[I+24>>2]=(t+r)*.5;g[I+28>>2]=0.0;w=I+144+16|0;a[w>>0]=1;y=I+144+12|0;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((e<<4|3)+16|0)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}i=c[I+144+4>>2]|0;k=c[y>>2]|0;if((i|0)<=0){if(k|0)H=32}else{f=0;do{H=h+(f<<4)|0;G=k+(f<<4)|0;c[H>>2]=c[G>>2];c[H+4>>2]=c[G+4>>2];c[H+8>>2]=c[G+8>>2];c[H+12>>2]=c[G+12>>2];f=f+1|0}while((f|0)!=(i|0));H=32}if((H|0)==32){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=h;c[I+144+8>>2]=e;c[h>>2]=c[I+128>>2];c[h+4>>2]=c[I+128+4>>2];c[h+8>>2]=c[I+128+8>>2];c[h+12>>2]=c[I+128+12>>2];if((e|0)!=1){f=1;do{G=(c[y>>2]|0)+(f<<4)|0;c[G>>2]=c[I+128>>2];c[G+4>>2]=c[I+128+4>>2];c[G+8>>2]=c[I+128+8>>2];c[G+12>>2]=c[I+128+12>>2];f=f+1|0}while((f|0)!=(e|0))}c[I+144+4>>2]=e;i=I+128+(c[I+108>>2]<<2)|0;k=c[y>>2]|0;p=I+128+(c[I+112>>2]<<2)|0;q=I+128+(c[I+104>>2]<<2)|0;o=+g[I+16>>2];r=+g[I+20>>2];t=+g[I+24>>2];u=+g[I+168>>2];n=+g[s>>2];m=+g[v>>2];h=0;f=d;while(1){z=(+g[f+4>>2]-r)*n;B=(+g[f+8>>2]-t)*m;g[I+128>>2]=(+g[f>>2]-o)*u;g[I+128+4>>2]=z;g[I+128+8>>2]=B;g[I+128+12>>2]=0.0;c[k+(h<<4)>>2]=~~+g[i>>2];c[k+(h<<4)+4>>2]=~~+g[p>>2];c[k+(h<<4)+8>>2]=~~+g[q>>2];c[k+(h<<4)+12>>2]=h;h=h+1|0;if((h|0)==(e|0))break;else f=f+16|0}if((e|0)>1)ah(I+144|0,0,e+-1|0);c[I+36>>2]=c[I+32>>2];c[I+40>>2]=0;c[I+44>>2]=e;f=c[I+84>>2]|0;if((f|0)<(e|0)){if((c[I+88>>2]|0)<(e|0)){if(!e){h=0;k=f}else{c[6995]=(c[6995]|0)+1;h=sc((e<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[I+84>>2]|0}if((k|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[I+92>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[I+92>>2]|0;if(i|0){if(a[I+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[I+92>>2]=0}a[I+96>>0]=1;c[I+92>>2]=h;c[I+88>>2]=e}do{c[(c[I+92>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(e|0))}c[I+84>>2]=e;p=0;do{f=c[I+40>>2]|0;if(!f){f=c[I+36>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(31)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}f=c[I+44>>2]|0;c[h+4>>2]=f;i=h+8|0;c[i>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*112|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[h>>2]=f;c[i>>2]=c[I+32>>2];c[I+32>>2]=h}else{c[I+36>>2]=c[f+8>>2];h=f}f=c[h>>2]|0;k=c[h+4>>2]|0;if((k|0)>0){h=0;i=f;do{h=h+1|0;G=i;i=i+112|0;c[G>>2]=(h|0)<(k|0)?i:0}while((h|0)!=(k|0))}}c[I+40>>2]=c[f>>2];G=f+104|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[G>>2]=-1;c[f+8>>2]=0;E=(c[y>>2]|0)+(p<<4)|0;F=f+88|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[G>>2]=-1;c[(c[I+92>>2]|0)+(p<<2)>>2]=f;p=p+1|0}while((p|0)<(e|0));f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[I+52>>2]=c[I+48>>2];c[I+56>>2]=0;c[I+60>>2]=e*6;c[I+116>>2]=0;c[I+120>>2]=0;c[I+100>>2]=-3;c[I+128>>2]=0;c[I+128+4>>2]=0;c[I+128+8>>2]=0;c[I+128+12>>2]=0;mc(I,0,e,I+128|0);c[I+124>>2]=c[I+128>>2];f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}f=c[b+4>>2]|0;if((f|0)<0){if((c[b+8>>2]|0)<0){h=c[b+12>>2]|0;if(h|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+8>>2]=0}do{G=(c[b+12>>2]|0)+(f<<4)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];c[G+12>>2]=c[I+168+12>>2];f=f+1|0}while((f|0)!=0)}c[b+4>>2]=0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;f=c[b+24>>2]|0;if((f|0)<0){if((c[b+28>>2]|0)<0){h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+28>>2]=0}do{G=(c[b+32>>2]|0)+(f*12|0)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];f=f+1|0}while((f|0)!=0)}c[b+24>>2]=0;h=c[b+44>>2]|0;if((h|0)<0){f=c[b+52>>2]|0;if((c[b+48>>2]|0)<0){do if(f|0){if(!(a[b+56>>0]|0))break;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}while(0);a[b+56>>0]=1;c[b+52>>2]=0;c[b+48>>2]=0;f=0}Yk(f+(h<<2)|0,0,P(h,-4)|0)|0}c[b+44>>2]=0;h=c[I+124>>2]|0;do if((c[h+104>>2]|0)<0){c[h+104>>2]=0;c[6995]=(c[6995]|0)+1;f=sc(23)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[f>>2]=h;G=0;s=1;v=f;w=1;i=f;y=f;while(1){if((c[h+100>>2]|0)>-1){g[I+168+(c[I+108>>2]<<2)>>2]=+(c[h+88>>2]|0);g[I+168+(c[I+112>>2]<<2)>>2]=+(c[h+92>>2]|0);m=+(c[h+96>>2]|0)}else{F=h+24|0;E=h+32|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0);E=h+72|0;F=h+80|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0);g[I+168+(c[I+108>>2]<<2)>>2]=B/m;F=h+40|0;E=h+48|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0)/m;g[I+168+(c[I+112>>2]<<2)>>2]=B;E=h+56|0;F=h+64|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0)/m}g[I+168+(c[I+104>>2]<<2)>>2]=m;m=+g[I+168>>2]*+g[I>>2]+ +g[I+16>>2];n=+g[I+168+4>>2]*+g[I+4>>2]+ +g[I+20>>2];o=+g[I+168+8>>2]*+g[I+8>>2]+ +g[I+24>>2];f=c[b+4>>2]|0;do if((f|0)==(c[b+8>>2]|0)){q=f|0?f<<1:1;if((f|0)>=(q|0))break;if(!q)p=0;else{c[6995]=(c[6995]|0)+1;f=sc((q<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}p=f;f=c[b+4>>2]|0}if((f|0)>0){k=0;do{F=p+(k<<4)|0;E=(c[b+12>>2]|0)+(k<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];k=k+1|0}while((k|0)!=(f|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=p;c[b+8>>2]=q;f=c[b+4>>2]|0}while(0);F=c[b+12>>2]|0;g[F+(f<<4)>>2]=m;g[F+(f<<4)+4>>2]=n;g[F+(f<<4)+8>>2]=o;g[F+(f<<4)+12>>2]=0.0;c[b+4>>2]=(c[b+4>>2]|0)+1;F=c[h+8>>2]|0;if(!F){k=s;A=v;h=w}else{D=F;E=-1;f=-1;A=s;e=v;h=w;while(1){C=D+20|0;p=c[C>>2]|0;if((p|0)<0){d=c[b+24>>2]|0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((d|0)==(c[b+28>>2]|0)){s=d|0?d<<1:1;if((d|0)>=(s|0)){k=d;break}if(!s){k=0;q=d}else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=c[b+24>>2]|0}if((q|0)>0){p=0;do{w=k+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(q|0))}p=c[b+32>>2]|0;if(p|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=k;c[b+28>>2]=s;k=c[b+24>>2]|0}else k=d;while(0);k=(c[b+32>>2]|0)+(k*12|0)|0;c[k>>2]=c[I+168>>2];c[k+4>>2]=c[I+168+4>>2];c[k+8>>2]=c[I+168+8>>2];k=(c[b+24>>2]|0)+1|0;c[b+24>>2]=k;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((k|0)==(c[b+28>>2]|0)){s=k|0?k<<1:1;if((k|0)>=(s|0))break;if(!s)q=0;else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=k;k=c[b+24>>2]|0}if((k|0)>0){p=0;do{w=q+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(k|0))}k=c[b+32>>2]|0;if(k|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=q;c[b+28>>2]=s;k=c[b+24>>2]|0}while(0);w=(c[b+32>>2]|0)+(k*12|0)|0;c[w>>2]=c[I+168>>2];c[w+4>>2]=c[I+168+4>>2];c[w+8>>2]=c[I+168+8>>2];c[b+24>>2]=(c[b+24>>2]|0)+1;w=c[b+32>>2]|0;c[C>>2]=d;c[(c[D+8>>2]|0)+20>>2]=d+1;c[w+(d*12|0)+4>>2]=1;c[w+((d+1|0)*12|0)+4>>2]=-1;v=c[D+12>>2]|0;k=c[v+104>>2]|0;if((k|0)<0){c[v+104>>2]=h;do if((h|0)==(A|0)){k=A|0?A<<1:1;if((A|0)>=(k|0)){k=A;p=e;s=y;break}do if(!k)q=0;else{c[6995]=(c[6995]|0)+1;p=sc((k<<2|3)+16|0)|0;if(!p){q=0;break}c[(p+4+15&-16)+-4>>2]=p;q=p+4+15&-16}while(0);if((A|0)>0){p=0;do{c[q+(p<<2)>>2]=c[e+(p<<2)>>2];p=p+1|0}while((p|0)!=(A|0));if(!i){p=q;s=q;i=q;break}}else if((e|0)==0|(i|0)==0){p=q;s=q;i=q;break}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);p=q;s=q;i=q}else{k=A;p=e;s=y}while(0);c[p+(h<<2)>>2]=v;v=h;h=h+1|0;q=s}else{v=k;k=A;p=e;q=y}c[w+(d*12|0)+8>>2]=v;c[w+((d+1|0)*12|0)+8>>2]=G;s=p;p=c[C>>2]|0}else{k=A;s=e;q=y}if((E|0)>-1)c[(c[b+32>>2]|0)+(p*12|0)>>2]=E-p;else f=p;D=c[D>>2]|0;if((D|0)==(F|0))break;else{E=p;A=k;e=s;y=q}}c[(c[b+32>>2]|0)+(f*12|0)>>2]=p-f;A=s;y=q}f=G+1|0;if((f|0)>=(h|0))break;G=f;s=k;v=A;w=h;h=c[A+(f<<2)>>2]|0}if((G|0)>-1){v=0;while(1){w=c[(c[A+(v<<2)>>2]|0)+8>>2]|0;if(w|0){s=w;do{q=s+20|0;f=c[q>>2]|0;if((f|0)>-1){h=c[b+44>>2]|0;do if((h|0)==(c[b+48>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[b+44>>2]|0}k=c[b+52>>2]|0;if((h|0)<=0){if(k)H=180}else{i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));H=180}if((H|0)==180){H=0;if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+52>>2]=0;h=c[b+44>>2]|0}a[b+56>>0]=1;c[b+52>>2]=f;c[b+48>>2]=p;f=c[q>>2]|0}while(0);c[(c[b+52>>2]|0)+(h<<2)>>2]=f;c[b+44>>2]=(c[b+44>>2]|0)+1;f=s;do{c[f+20>>2]=-1;f=c[(c[f+8>>2]|0)+4>>2]|0}while((f|0)!=(s|0))}s=c[s>>2]|0}while((s|0)!=(w|0))}if((v|0)==(G|0))break;else v=v+1|0}}if((A|0)==0|(y|0)==0)break;c[6996]=(c[6996]|0)+1;Cd(c[y+-4>>2]|0)}while(0);Ri(I);l=I;return}function vc(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;F=l;l=l+960|0;E=c[f+4>>2]|0;C=c[f+12>>2]|0;j=c[E+4>>2]|0;if((j|0)<20){c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];g[F+416+308>>2]=9.999999747378752e-05;a[F+416+332>>0]=0;c[F+352>>2]=9464;c[F+128>>2]=9532;c[F+128+4>>2]=F+416;c[F+128+8>>2]=F+352;c[F+128+12>>2]=b;c[F+128+16>>2]=E;c[F+128+20>>2]=0;if((Wd(F+128|0,d,e,C,C,F+776|0)|0?(u=F+776+132|0,p=+g[u>>2],q=+g[F+776+136>>2],r=+g[F+776+140>>2],p*p+q*q+r*r>9.999999747378752e-05):0)?(s=+g[F+776+164>>2],s<+g[h+4>>2]):0){i=1.0/+D(+(p*p+q*q+r*r));g[u>>2]=p*i;g[F+776+136>>2]=q*i;g[F+776+140>>2]=r*i;c[F+64>>2]=c[f+8>>2];c[F+64+4>>2]=0;c[F+64+8>>2]=c[u>>2];c[F+64+8+4>>2]=c[u+4>>2];c[F+64+8+8>>2]=c[u+8>>2];c[F+64+8+12>>2]=c[u+12>>2];c[F+64+24>>2]=c[F+776+148>>2];c[F+64+24+4>>2]=c[F+776+148+4>>2];c[F+64+24+8>>2]=c[F+776+148+8>>2];c[F+64+24+12>>2]=c[F+776+148+12>>2];g[F+64+40>>2]=s;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+64|0,1)}l=F;return}if((j+-21|0)>>>0>=9){if((j|0)!=31){l=F;return}u=c[(c[b>>2]|0)+8>>2]|0;M=+g[C>>2];N=+g[C+16>>2];O=+g[C+32>>2];w=+g[C+4>>2];v=+g[C+20>>2];s=+g[C+36>>2];r=+g[C+8>>2];p=+g[C+24>>2];n=+g[C+40>>2];B=-+g[C+48>>2];z=-+g[C+52>>2];x=-+g[C+56>>2];k=+g[d>>2];A=+g[d+16>>2];y=+g[d+32>>2];G=+g[d+4>>2];H=+g[d+20>>2];I=+g[d+36>>2];J=+g[d+8>>2];K=+g[d+24>>2];L=+g[d+40>>2];q=+g[d+48>>2];o=+g[d+52>>2];m=+g[d+56>>2];g[F+64>>2]=M*k+N*A+O*y;g[F+64+4>>2]=M*G+N*H+O*I;g[F+64+8>>2]=M*J+N*K+O*L;g[F+64+12>>2]=0.0;g[F+64+16>>2]=w*k+v*A+s*y;g[F+64+20>>2]=w*G+v*H+s*I;g[F+64+24>>2]=w*J+v*K+s*L;g[F+64+28>>2]=0.0;g[F+64+32>>2]=r*k+p*A+n*y;g[F+64+36>>2]=r*G+p*H+n*I;g[F+64+40>>2]=r*J+p*K+n*L;g[F+64+44>>2]=0.0;g[F+64+48>>2]=M*B+N*z+O*x+(M*q+N*o+O*m);g[F+64+52>>2]=w*B+v*z+s*x+(w*q+v*o+s*m);g[F+64+56>>2]=r*B+p*z+n*x+(r*q+p*o+n*m);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+776|0,F+416|0);u=c[(c[b>>2]|0)+8>>2]|0;m=+g[C>>2];n=+g[C+16>>2];o=+g[C+32>>2];p=+g[C+4>>2];q=+g[C+20>>2];r=+g[C+36>>2];x=+g[C+8>>2];z=+g[C+24>>2];B=+g[C+40>>2];s=-+g[C+48>>2];v=-+g[C+52>>2];w=-+g[C+56>>2];O=+g[e>>2];N=+g[e+16>>2];M=+g[e+32>>2];L=+g[e+4>>2];K=+g[e+20>>2];J=+g[e+36>>2];I=+g[e+8>>2];H=+g[e+24>>2];G=+g[e+40>>2];y=+g[e+48>>2];A=+g[e+52>>2];k=+g[e+56>>2];g[F+64>>2]=m*O+n*N+o*M;g[F+64+4>>2]=m*L+n*K+o*J;g[F+64+8>>2]=m*I+n*H+o*G;g[F+64+12>>2]=0.0;g[F+64+16>>2]=p*O+q*N+r*M;g[F+64+20>>2]=p*L+q*K+r*J;g[F+64+24>>2]=p*I+q*H+r*G;g[F+64+28>>2]=0.0;g[F+64+32>>2]=x*O+z*N+B*M;g[F+64+36>>2]=x*L+z*K+B*J;g[F+64+40>>2]=x*I+z*H+B*G;g[F+64+44>>2]=0.0;g[F+64+48>>2]=m*s+n*v+o*w+(m*y+n*A+o*k);g[F+64+52>>2]=p*s+q*v+r*w+(p*y+q*A+r*k);g[F+64+56>>2]=x*s+z*v+B*w+(x*y+z*A+B*k);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+352|0,F+128|0);k=+g[F+352>>2];if(k<+g[F+776>>2])g[F+776>>2]=k;k=+g[F+352+4>>2];if(k<+g[F+776+4>>2])g[F+776+4>>2]=k;k=+g[F+352+8>>2];if(k<+g[F+776+8>>2])g[F+776+8>>2]=k;k=+g[F+352+12>>2];if(k<+g[F+776+12>>2])g[F+776+12>>2]=k;k=+g[F+128>>2];if(+g[F+416>>2]>2]=k;k=+g[F+128+4>>2];if(+g[F+416+4>>2]>2]=k;k=+g[F+128+8>>2];if(+g[F+416+8>>2]>2]=k;k=+g[F+128+12>>2];if(+g[F+416+12>>2]>2]=k;c[F+64>>2]=6224;c[F+64+4>>2]=f;c[F+64+8>>2]=b;c[F+64+12>>2]=d;c[F+64+16>>2]=e;g[F+64+20>>2]=i;c[F+64+24>>2]=E;c[F+64+28>>2]=C;c[F+64+32>>2]=h;j=c[E+68>>2]|0;if(!j){if((c[E+20>>2]|0)>0){j=0;do{f=c[E+28>>2]|0;h=c[f+(j*80|0)+64>>2]|0;e=f+(j*80|0)|0;c[F>>2]=c[e>>2];c[F+4>>2]=c[e+4>>2];c[F+8>>2]=c[e+8>>2];c[F+12>>2]=c[e+12>>2];e=f+(j*80|0)+16|0;c[F+16>>2]=c[e>>2];c[F+16+4>>2]=c[e+4>>2];c[F+16+8>>2]=c[e+8>>2];c[F+16+12>>2]=c[e+12>>2];e=f+(j*80|0)+32|0;c[F+32>>2]=c[e>>2];c[F+32+4>>2]=c[e+4>>2];c[F+32+8>>2]=c[e+8>>2];c[F+32+12>>2]=c[e+12>>2];f=f+(j*80|0)+48|0;c[F+48>>2]=c[f>>2];c[F+48+4>>2]=c[f+4>>2];c[F+48+8>>2]=c[f+8>>2];c[F+48+12>>2]=c[f+12>>2];jg(F+64|0,j,F,h);j=j+1|0}while((j|0)<(c[E+20>>2]|0))}}else{c[F>>2]=c[F+776>>2];c[F+4>>2]=c[F+776+4>>2];c[F+8>>2]=c[F+776+8>>2];c[F+12>>2]=c[F+776+12>>2];c[F+16>>2]=c[F+416>>2];c[F+16+4>>2]=c[F+416+4>>2];c[F+16+8>>2]=c[F+416+8>>2];c[F+16+12>>2]=c[F+416+12>>2];Bf(c[j>>2]|0,F,F+64|0)}l=F;return}switch(j|0){case 21:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];r=+g[C+4>>2];s=+g[C+20>>2];v=+g[C+36>>2];w=+g[C+8>>2];x=+g[C+24>>2];y=+g[C+40>>2];z=-+g[C+48>>2];A=-+g[C+52>>2];B=-+g[C+56>>2];n=+g[d+48>>2];m=+g[d+52>>2];k=+g[d+56>>2];g[F+416>>2]=o*z+p*A+q*B+(o*n+p*m+q*k);g[F+416+4>>2]=r*z+s*A+v*B+(r*n+s*m+v*k);g[F+416+8>>2]=w*z+x*A+y*B+(w*n+x*m+y*k);g[F+416+12>>2]=0.0;k=+g[e+48>>2];m=+g[e+52>>2];n=+g[e+56>>2];G=+g[e>>2];H=+g[e+16>>2];I=+g[e+32>>2];J=+g[e+4>>2];K=+g[e+20>>2];L=+g[e+36>>2];M=+g[e+8>>2];N=+g[e+24>>2];O=+g[e+40>>2];g[F+352>>2]=o*G+p*H+q*I;g[F+352+4>>2]=o*J+p*K+q*L;g[F+352+8>>2]=o*M+p*N+q*O;g[F+352+12>>2]=0.0;g[F+352+16>>2]=r*G+s*H+v*I;g[F+352+20>>2]=r*J+s*K+v*L;g[F+352+24>>2]=r*M+s*N+v*O;g[F+352+28>>2]=0.0;g[F+352+32>>2]=w*G+x*H+y*I;g[F+352+36>>2]=w*J+x*K+y*L;g[F+352+40>>2]=w*M+x*N+y*O;j=F+352+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;j=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+128>>2]=9392;c[F+128+4>>2]=b;c[F+128+8>>2]=c[d>>2];c[F+128+8+4>>2]=c[d+4>>2];c[F+128+8+8>>2]=c[d+8>>2];c[F+128+8+12>>2]=c[d+12>>2];c[F+128+24>>2]=c[d+16>>2];c[F+128+24+4>>2]=c[d+16+4>>2];c[F+128+24+8>>2]=c[d+16+8>>2];c[F+128+24+12>>2]=c[d+16+12>>2];c[F+128+40>>2]=c[d+32>>2];c[F+128+40+4>>2]=c[d+32+4>>2];c[F+128+40+8>>2]=c[d+32+8>>2];c[F+128+40+12>>2]=c[d+32+12>>2];c[F+128+56>>2]=c[d+48>>2];c[F+128+56+4>>2]=c[d+48+4>>2];c[F+128+56+8>>2]=c[d+48+8>>2];c[F+128+56+12>>2]=c[d+48+12>>2];c[F+128+72>>2]=c[e>>2];c[F+128+72+4>>2]=c[e+4>>2];c[F+128+72+8>>2]=c[e+8>>2];c[F+128+72+12>>2]=c[e+12>>2];c[F+128+88>>2]=c[e+16>>2];c[F+128+88+4>>2]=c[e+16+4>>2];c[F+128+88+8>>2]=c[e+16+8>>2];c[F+128+88+12>>2]=c[e+16+12>>2];c[F+128+104>>2]=c[e+32>>2];c[F+128+104+4>>2]=c[e+32+4>>2];c[F+128+104+8>>2]=c[e+32+8>>2];c[F+128+104+12>>2]=c[e+32+12>>2];c[F+128+120>>2]=c[e+48>>2];c[F+128+120+4>>2]=c[e+48+4>>2];c[F+128+120+8>>2]=c[e+48+8>>2];c[F+128+120+12>>2]=c[e+48+12>>2];c[F+128+136>>2]=c[C>>2];c[F+128+136+4>>2]=c[C+4>>2];c[F+128+136+8>>2]=c[C+8>>2];c[F+128+136+12>>2]=c[C+12>>2];c[F+128+152>>2]=c[C+16>>2];c[F+128+152+4>>2]=c[C+16+4>>2];c[F+128+152+8>>2]=c[C+16+8>>2];c[F+128+152+12>>2]=c[C+16+12>>2];c[F+128+168>>2]=c[C+32>>2];c[F+128+168+4>>2]=c[C+32+4>>2];c[F+128+168+8>>2]=c[C+32+8>>2];c[F+128+168+12>>2]=c[C+32+12>>2];c[F+128+184>>2]=c[C+48>>2];c[F+128+184+4>>2]=c[C+48+4>>2];c[F+128+184+8>>2]=c[C+48+8>>2];c[F+128+184+12>>2]=c[C+48+12>>2];g[F+128+204>>2]=O;c[F+128>>2]=6176;c[F+128+212>>2]=h;c[F+128+216>>2]=j;c[F+128+220>>2]=E;c[F+128+200>>2]=c[h+4>>2];g[F+128+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+352|0,F+64|0,F);j=c[E+52>>2]|0;c[F+776>>2]=7252;c[F+776+4>>2]=j;c[F+776+8>>2]=F+128;j=c[E+56>>2]|0;if(!(a[j+60>>0]|0))Re(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F);else ue(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F,c[j+56>>2]|0);l=F;return}case 28:{c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];c[F+416>>2]=9532;c[F+416+4>>2]=0;c[F+416+8>>2]=0;c[F+416+12>>2]=b;c[F+416+16>>2]=0;c[F+416+20>>2]=E;if((Wd(F+416|0,d,e,C,C,F+776|0)|0?(t=F+776+132|0,k=+g[t>>2],m=+g[F+776+136>>2],n=+g[F+776+140>>2],k*k+m*m+n*n>9.999999747378752e-05):0)?(o=+g[F+776+164>>2],o<+g[h+4>>2]):0){O=1.0/+D(+(k*k+m*m+n*n));g[t>>2]=k*O;g[F+776+136>>2]=m*O;g[F+776+140>>2]=n*O;c[F+352>>2]=c[f+8>>2];c[F+352+4>>2]=0;c[F+352+8>>2]=c[t>>2];c[F+352+8+4>>2]=c[t+4>>2];c[F+352+8+8>>2]=c[t+8>>2];c[F+352+8+12>>2]=c[t+12>>2];c[F+352+24>>2]=c[F+776+148>>2];c[F+352+24+4>>2]=c[F+776+148+4>>2];c[F+352+24+8>>2]=c[F+776+148+8>>2];c[F+352+24+12>>2]=c[F+776+148+12>>2];g[F+352+40>>2]=o;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+352|0,1)}l=F;return}default:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];w=+g[C+4>>2];x=+g[C+20>>2];y=+g[C+36>>2];J=+g[C+8>>2];L=+g[C+24>>2];N=+g[C+40>>2];H=-+g[C+48>>2];G=-+g[C+52>>2];B=-+g[C+56>>2];z=+g[d+48>>2];A=+g[d+52>>2];k=+g[d+56>>2];n=o*H+p*G+q*B+(o*z+p*A+q*k);m=w*H+x*G+y*B+(w*z+x*A+y*k);k=J*H+L*G+N*B+(J*z+L*A+N*k);A=+g[e+48>>2];z=+g[e+52>>2];v=+g[e+56>>2];r=o*H+p*G+q*B+(o*A+p*z+q*v);s=w*H+x*G+y*B+(w*A+x*z+y*v);v=J*H+L*G+N*B+(J*A+L*z+N*v);z=+g[e>>2];A=+g[e+16>>2];B=+g[e+32>>2];G=+g[e+4>>2];H=+g[e+20>>2];I=+g[e+36>>2];K=+g[e+8>>2];M=+g[e+24>>2];O=+g[e+40>>2];g[F+776>>2]=o*z+p*A+q*B;g[F+776+4>>2]=o*G+p*H+q*I;g[F+776+8>>2]=o*K+p*M+q*O;g[F+776+12>>2]=0.0;g[F+776+16>>2]=w*z+x*A+y*B;g[F+776+20>>2]=w*G+x*H+y*I;g[F+776+24>>2]=w*K+x*M+y*O;g[F+776+28>>2]=0.0;g[F+776+32>>2]=J*z+L*A+N*B;g[F+776+36>>2]=J*G+L*H+N*I;g[F+776+40>>2]=J*K+L*M+N*O;u=F+776+44|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;f=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+416>>2]=9392;c[F+416+4>>2]=b;c[F+416+8>>2]=c[d>>2];c[F+416+8+4>>2]=c[d+4>>2];c[F+416+8+8>>2]=c[d+8>>2];c[F+416+8+12>>2]=c[d+12>>2];c[F+416+24>>2]=c[d+16>>2];c[F+416+24+4>>2]=c[d+16+4>>2];c[F+416+24+8>>2]=c[d+16+8>>2];c[F+416+24+12>>2]=c[d+16+12>>2];c[F+416+40>>2]=c[d+32>>2];c[F+416+40+4>>2]=c[d+32+4>>2];c[F+416+40+8>>2]=c[d+32+8>>2];c[F+416+40+12>>2]=c[d+32+12>>2];c[F+416+56>>2]=c[d+48>>2];c[F+416+56+4>>2]=c[d+48+4>>2];c[F+416+56+8>>2]=c[d+48+8>>2];c[F+416+56+12>>2]=c[d+48+12>>2];c[F+416+72>>2]=c[e>>2];c[F+416+72+4>>2]=c[e+4>>2];c[F+416+72+8>>2]=c[e+8>>2];c[F+416+72+12>>2]=c[e+12>>2];c[F+416+88>>2]=c[e+16>>2];c[F+416+88+4>>2]=c[e+16+4>>2];c[F+416+88+8>>2]=c[e+16+8>>2];c[F+416+88+12>>2]=c[e+16+12>>2];c[F+416+104>>2]=c[e+32>>2];c[F+416+104+4>>2]=c[e+32+4>>2];c[F+416+104+8>>2]=c[e+32+8>>2];c[F+416+104+12>>2]=c[e+32+12>>2];c[F+416+120>>2]=c[e+48>>2];c[F+416+120+4>>2]=c[e+48+4>>2];c[F+416+120+8>>2]=c[e+48+8>>2];c[F+416+120+12>>2]=c[e+48+12>>2];c[F+416+136>>2]=c[C>>2];c[F+416+136+4>>2]=c[C+4>>2];c[F+416+136+8>>2]=c[C+8>>2];c[F+416+136+12>>2]=c[C+12>>2];c[F+416+152>>2]=c[C+16>>2];c[F+416+152+4>>2]=c[C+16+4>>2];c[F+416+152+8>>2]=c[C+16+8>>2];c[F+416+152+12>>2]=c[C+16+12>>2];c[F+416+168>>2]=c[C+32>>2];c[F+416+168+4>>2]=c[C+32+4>>2];c[F+416+168+8>>2]=c[C+32+8>>2];c[F+416+168+12>>2]=c[C+32+12>>2];c[F+416+184>>2]=c[C+48>>2];c[F+416+184+4>>2]=c[C+48+4>>2];c[F+416+184+8>>2]=c[C+48+8>>2];c[F+416+184+12>>2]=c[C+48+12>>2];g[F+416+204>>2]=O;c[F+416>>2]=6200;c[F+416+212>>2]=h;c[F+416+216>>2]=f;c[F+416+220>>2]=E;c[F+416+200>>2]=c[h+4>>2];g[F+416+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+776|0,F+352|0,F+128|0);g[F+64>>2]=n;g[F+64+4>>2]=m;g[F+64+8>>2]=k;g[F+64+12>>2]=0.0;if(r>2]=r;o=r}else o=n;if(s>2]=s;p=s}else p=m;if(v>2]=v;q=v}else q=k;g[F>>2]=n;g[F+4>>2]=m;g[F+8>>2]=k;g[F+12>>2]=0.0;if(n>2]=r;n=r}if(m>2]=s;m=s}if(k>2]=v;k=v}g[F+64>>2]=+g[F+352>>2]+o;g[F+64+4>>2]=+g[F+352+4>>2]+p;g[F+64+8>>2]=+g[F+352+8>>2]+q;g[F>>2]=+g[F+128>>2]+n;g[F+4>>2]=+g[F+128+4>>2]+m;g[F+8>>2]=+g[F+128+8>>2]+k;Vb[c[(c[E>>2]|0)+64>>2]&127](E,F+416|0,F+64|0,F);l=F;return}}}function wc(b){b=b|0;var d=0,e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0;J=l;l=l+64|0;if(!(a[b+356>>0]|0)){b=a[b+312>>0]|0;b=b<<24>>24!=0;l=J;return b|0}c[b+336>>2]=0;c[b+336+4>>2]=0;c[b+336+8>>2]=0;c[b+336+12>>2]=0;a[b+336+16>>0]=0;p=a[b+332>>0]|0;a[b+332>>0]=p&-16;a[b+356>>0]=0;switch(c[b>>2]|0){case 0:{a[b+312>>0]=0;b=0;b=b<<24>>24!=0;l=J;return b|0}case 1:{c[b+244>>2]=c[b+84>>2];c[b+244+4>>2]=c[b+84+4>>2];c[b+244+8>>2]=c[b+84+8>>2];c[b+244+12>>2]=c[b+84+12>>2];c[b+260>>2]=c[b+164>>2];c[b+260+4>>2]=c[b+164+4>>2];c[b+260+8>>2]=c[b+164+8>>2];c[b+260+12>>2]=c[b+164+12>>2];F=+g[b+248>>2]-+g[b+264>>2];G=+g[b+252>>2]-+g[b+268>>2];g[b+276>>2]=+g[b+244>>2]-+g[b+260>>2];g[b+280>>2]=F;g[b+284>>2]=G;g[b+288>>2]=0.0;a[b+352>>0]=0;a[b+332>>0]=p&-16;g[b+336>>2]=1.0;g[b+340>>2]=0.0;g[b+344>>2]=0.0;g[b+348>>2]=0.0;a[b+312>>0]=1;b=1;b=b<<24>>24!=0;l=J;return b|0}case 2:{f=+g[b+4>>2];i=+g[b+8>>2];j=+g[b+12>>2];k=+g[b+20>>2]-f;m=+g[b+24>>2]-i;n=+g[b+28>>2]-j;if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0.0)if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0]=p&-16|1;e=2;d=p&-16|1;i=((0.0-f)*k+(0.0-i)*m+(0.0-j)*n)/(k*k+m*m+n*n)}else{e=2;d=p&-16;i=1.0}else{e=1;d=p&-16;i=0.0}e=d|e;a[b+332>>0]=e;f=1.0-i;g[b+336>>2]=f;g[b+340>>2]=i;g[b+344>>2]=0.0;g[b+348>>2]=0.0;B=+g[b+84>>2];D=+g[b+88>>2];F=+g[b+92>>2];B=B+i*(+g[b+100>>2]-B);D=D+i*(+g[b+104>>2]-D);F=F+i*(+g[b+108>>2]-F);g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2];E=+g[b+168>>2];G=+g[b+172>>2];C=C+i*(+g[b+180>>2]-C);E=E+i*(+g[b+184>>2]-E);G=G+i*(+g[b+188>>2]-G);g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;if(!(e&2)){c[b>>2]=1;d=0}else d=1;if(!(e&1)){I=b+164+(d<<4)|0;H=b+84+(d<<4)|0;r=b+4+(d<<4)|0;c[b>>2]=d;c[b+4>>2]=c[r>>2];c[b+4+4>>2]=c[r+4>>2];c[b+4+8>>2]=c[r+8>>2];c[b+4+12>>2]=c[r+12>>2];c[b+84>>2]=c[H>>2];c[b+84+4>>2]=c[H+4>>2];c[b+84+8>>2]=c[H+8>>2];c[b+84+12>>2]=c[H+12>>2];c[b+164>>2]=c[I>>2];c[b+164+4>>2]=c[I+4>>2];c[b+164+8>>2]=c[I+8>>2];c[b+164+12>>2]=c[I+12>>2]}I=i>=0.0&f>=0.0&1;a[b+312>>0]=I;b=I;b=b<<24>>24!=0;l=J;return b|0}case 3:{c[J+16>>2]=0;c[J+16+4>>2]=0;c[J+16+8>>2]=0;c[J+16+12>>2]=0;cf(J+16|0,b+4|0,b+20|0,b+36|0,b+316|0);G=+g[b+336>>2];f=+g[b+340>>2];i=+g[b+344>>2];B=+g[b+84>>2]*G+ +g[b+100>>2]*f+ +g[b+116>>2]*i;D=G*+g[b+88>>2]+f*+g[b+104>>2]+i*+g[b+120>>2];F=G*+g[b+92>>2]+f*+g[b+108>>2]+i*+g[b+124>>2];g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2]*G+ +g[b+180>>2]*f+ +g[b+196>>2]*i;E=G*+g[b+168>>2]+f*+g[b+184>>2]+i*+g[b+200>>2];G=G*+g[b+172>>2]+f*+g[b+188>>2]+i*+g[b+204>>2];g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;e=c[b>>2]|0;do if((e|0)>3){d=a[b+332>>0]|0;if(!(d&8)){h=b+164+(e+-1<<4)|0;I=b+84+(e+-1<<4)|0;H=b+4+(e+-1<<4)|0;c[b>>2]=e+-1;c[b+52>>2]=c[H>>2];c[b+52+4>>2]=c[H+4>>2];c[b+52+8>>2]=c[H+8>>2];c[b+52+12>>2]=c[H+12>>2];c[b+132>>2]=c[I>>2];c[b+132+4>>2]=c[I+4>>2];c[b+132+8>>2]=c[I+8>>2];c[b+132+12>>2]=c[I+12>>2];c[b+212>>2]=c[h>>2];c[b+212+4>>2]=c[h+4>>2];c[b+212+8>>2]=c[h+8>>2];c[b+212+12>>2]=c[h+12>>2];h=e+-1|0;I=19}else{h=e;I=19}}else{if((e|0)==3){d=a[b+332>>0]|0;h=3;I=19;break}if((e|0)>1){d=a[b+332>>0]|0;e=2;I=23;break}if((e|0)==1){o=a[b+332>>0]|0;h=1;I=27}}while(0);if((I|0)==19){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=23}else{e=h;I=23}}if((I|0)==23){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];o=d;I=27}else{o=d;h=e;I=27}}if((I|0)==27?(q=h+-1|0,(o&1)==0):0){c[b>>2]=q;c[b+4>>2]=c[b+4+(q<<4)>>2];c[b+4+4>>2]=c[b+4+(q<<4)+4>>2];c[b+4+8>>2]=c[b+4+(q<<4)+8>>2];c[b+4+12>>2]=c[b+4+(q<<4)+12>>2];c[b+84>>2]=c[b+84+(q<<4)>>2];c[b+84+4>>2]=c[b+84+(q<<4)+4>>2];c[b+84+8>>2]=c[b+84+(q<<4)+8>>2];c[b+84+12>>2]=c[b+84+(q<<4)+12>>2];c[b+164>>2]=c[b+164+(q<<4)>>2];c[b+164+4>>2]=c[b+164+(q<<4)+4>>2];c[b+164+8>>2]=c[b+164+(q<<4)+8>>2];c[b+164+12>>2]=c[b+164+(q<<4)+12>>2]}if((f>=0.0?!(+g[b+336>>2]>=0.0):1)|!(i>=0.0))d=0;else d=+g[b+348>>2]>=0.0&1;a[b+312>>0]=d;b=d;b=b<<24>>24!=0;l=J;return b|0}case 4:{c[J>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;r=J+16+16|0;a[r>>0]=0;c[b+316>>2]=0;c[b+316+4>>2]=0;c[b+316+8>>2]=0;c[b+316+12>>2]=0;a[b+332>>0]=p|15;L=+g[b+20>>2];U=+g[b+4>>2];R=+g[b+24>>2];K=+g[b+8>>2];N=+g[b+28>>2];V=+g[b+12>>2];Q=+g[b+36>>2];S=+g[b+40>>2];O=+g[b+44>>2];M=+g[b+52>>2];T=+g[b+56>>2];P=+g[b+60>>2];W=((R-K)*(O-V)-(N-V)*(S-K))*(M-U)+((N-V)*(Q-U)-(L-U)*(O-V))*(T-K)+((L-U)*(S-K)-(R-K)*(Q-U))*(P-V);h=W*W<9.99999905104687e-09?-1:((0.0-U)*((R-K)*(O-V)-(N-V)*(S-K))+(0.0-K)*((N-V)*(Q-U)-(L-U)*(O-V))+((L-U)*(S-K)-(R-K)*(Q-U))*(0.0-V))*W<0.0&1;W=(N-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((L-U)*((S-K)*(P-V)-(O-V)*(T-K))+(R-K)*((O-V)*(M-U)-(Q-U)*(P-V)));o=W*W<9.99999905104687e-09?-1:((0.0-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((0.0-U)*((S-K)*(P-V)-(O-V)*(T-K))+(0.0-K)*((O-V)*(M-U)-(Q-U)*(P-V))))*W<0.0&1;W=(O-V)*((R-K)*(M-U)-(L-U)*(T-K))+((Q-U)*((N-V)*(T-K)-(R-K)*(P-V))+(S-K)*((L-U)*(P-V)-(N-V)*(M-U)));p=W*W<9.99999905104687e-09?-1:((0.0-V)*((R-K)*(M-U)-(L-U)*(T-K))+((0.0-U)*((N-V)*(T-K)-(R-K)*(P-V))+(0.0-K)*((L-U)*(P-V)-(N-V)*(M-U))))*W<0.0&1;K=(V-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((U-L)*((O-N)*(T-R)-(S-R)*(P-N))+(K-R)*((Q-L)*(P-N)-(O-N)*(M-L)));q=K*K<9.99999905104687e-09?-1:((0.0-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((0.0-L)*((O-N)*(T-R)-(S-R)*(P-N))+(0.0-R)*((Q-L)*(P-N)-(O-N)*(M-L))))*K<0.0&1;do if((o|h|p|q|0)<0){a[b+352>>0]=1;d=b+312|0;I=68}else{if(!(o|h|p|q)){if(a[b+352>>0]|0){d=b+312|0;I=68;break}a[b+312>>0]=1;c[b+276>>2]=0;c[b+276+4>>2]=0;c[b+276+8>>2]=0;c[b+276+12>>2]=0;d=1;break}if((h|0)!=0?(cf(J,b+4|0,b+20|0,b+36|0,J+16|0),f=+g[J+16>>2],i=+g[J+16+4>>2],j=+g[J+16+8>>2],k=f-+g[J>>2],m=i-+g[J+4>>2],n=j-+g[J+8>>2],k*k+m*m+n*n<3402823466385288598117041.0e14):0){X=c[J+16+12>>2]|0;g[b+316>>2]=f;g[b+320>>2]=i;g[b+324>>2]=j;c[b+328>>2]=X;X=a[r>>0]|0;a[b+332>>0]=X&1|a[b+332>>0]&-16|X&2|X&4;X=c[J+16+24>>2]|0;h=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=X;c[b+344>>2]=h;g[b+348>>2]=0.0;f=k*k+m*m+n*n}else f=3402823466385288598117041.0e14;if((o|0)!=0?(cf(J,b+4|0,b+36|0,b+52|0,J+16|0),s=+g[J+16>>2],t=+g[J+16+4>>2],u=+g[J+16+8>>2],v=s-+g[J>>2],w=t-+g[J+4>>2],x=u-+g[J+8>>2],v*v+w*w+x*x>2]|0;g[b+316>>2]=s;g[b+320>>2]=t;g[b+324>>2]=u;c[b+328>>2]=o;o=a[r>>0]|0;a[b+332>>0]=o<<1&8|(o&1|a[b+332>>0]&-16|o<<1&4);o=c[J+16+24>>2]|0;X=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];g[b+340>>2]=0.0;c[b+344>>2]=o;c[b+348>>2]=X;f=v*v+w*w+x*x}if((p|0)!=0?(cf(J,b+4|0,b+52|0,b+20|0,J+16|0),y=+g[J+16>>2],z=+g[J+16+4>>2],A=+g[J+16+8>>2],B=y-+g[J>>2],C=z-+g[J+4>>2],D=A-+g[J+8>>2],B*B+C*C+D*D>2]|0;g[b+316>>2]=y;g[b+320>>2]=z;g[b+324>>2]=A;c[b+328>>2]=p;p=a[r>>0]|0;a[b+332>>0]=p<<2&8|(p&1|a[b+332>>0]&-16|(p&255)>>>1&2);p=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=p;g[b+344>>2]=0.0;c[b+348>>2]=X;f=B*B+C*C+D*D}if(q|0?(cf(J,b+20|0,b+52|0,b+36|0,J+16|0),E=+g[J+16>>2],F=+g[J+16+4>>2],G=+g[J+16+8>>2],U=E-+g[J>>2],V=F-+g[J+4>>2],W=G-+g[J+8>>2],U*U+V*V+W*W>2]|0;g[b+316>>2]=E;g[b+320>>2]=F;g[b+324>>2]=G;c[b+328>>2]=q;q=a[r>>0]|0;a[b+332>>0]=q&4|a[b+332>>0]&-16|q<<1&2|q<<2&8;q=c[J+16+20>>2]|0;r=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;g[b+336>>2]=0.0;c[b+340>>2]=q;c[b+344>>2]=r;c[b+348>>2]=X}P=+g[b+336>>2];Q=+g[b+340>>2];W=+g[b+344>>2];f=+g[b+348>>2];R=+g[b+84>>2]*P+ +g[b+100>>2]*Q+ +g[b+116>>2]*W+ +g[b+132>>2]*f;T=P*+g[b+88>>2]+Q*+g[b+104>>2]+W*+g[b+120>>2]+f*+g[b+136>>2];V=P*+g[b+92>>2]+Q*+g[b+108>>2]+W*+g[b+124>>2]+f*+g[b+140>>2];g[b+244>>2]=R;g[b+248>>2]=T;g[b+252>>2]=V;g[b+256>>2]=0.0;S=+g[b+164>>2]*P+ +g[b+180>>2]*Q+ +g[b+196>>2]*W+ +g[b+212>>2]*f;U=P*+g[b+168>>2]+Q*+g[b+184>>2]+W*+g[b+200>>2]+f*+g[b+216>>2];W=P*+g[b+172>>2]+Q*+g[b+188>>2]+W*+g[b+204>>2]+f*+g[b+220>>2];g[b+260>>2]=S;g[b+264>>2]=U;g[b+268>>2]=W;g[b+272>>2]=0.0;g[b+276>>2]=R-S;g[b+280>>2]=T-U;g[b+284>>2]=V-W;g[b+288>>2]=0.0;h=c[b>>2]|0;do if((h|0)>3){d=a[b+332>>0]|0;if(!(d&8)){I=b+164+(h+-1<<4)|0;X=b+84+(h+-1<<4)|0;r=b+4+(h+-1<<4)|0;c[b>>2]=h+-1;c[b+52>>2]=c[r>>2];c[b+52+4>>2]=c[r+4>>2];c[b+52+8>>2]=c[r+8>>2];c[b+52+12>>2]=c[r+12>>2];c[b+132>>2]=c[X>>2];c[b+132+4>>2]=c[X+4>>2];c[b+132+8>>2]=c[X+8>>2];c[b+132+12>>2]=c[X+12>>2];c[b+212>>2]=c[I>>2];c[b+212+4>>2]=c[I+4>>2];c[b+212+8>>2]=c[I+8>>2];c[b+212+12>>2]=c[I+12>>2];h=h+-1|0;I=52}else I=52}else{if((h|0)==3){d=a[b+332>>0]|0;h=3;I=52;break}if((h|0)>1){d=a[b+332>>0]|0;e=2;I=56;break}if((h|0)==1){d=a[b+332>>0]|0;e=1;I=60}}while(0);if((I|0)==52){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=56}else{e=h;I=56}}if((I|0)==56){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];e=h;I=60}else I=60}if((I|0)==60?(H=e+-1|0,(d&1)==0):0){c[b>>2]=H;c[b+4>>2]=c[b+4+(H<<4)>>2];c[b+4+4>>2]=c[b+4+(H<<4)+4>>2];c[b+4+8>>2]=c[b+4+(H<<4)+8>>2];c[b+4+12>>2]=c[b+4+(H<<4)+12>>2];c[b+84>>2]=c[b+84+(H<<4)>>2];c[b+84+4>>2]=c[b+84+(H<<4)+4>>2];c[b+84+8>>2]=c[b+84+(H<<4)+8>>2];c[b+84+12>>2]=c[b+84+(H<<4)+12>>2];c[b+164>>2]=c[b+164+(H<<4)>>2];c[b+164+4>>2]=c[b+164+(H<<4)+4>>2];c[b+164+8>>2]=c[b+164+(H<<4)+8>>2];c[b+164+12>>2]=c[b+164+(H<<4)+12>>2]}if((+g[b+336>>2]>=0.0?+g[b+340>>2]>=0.0:0)?+g[b+344>>2]>=0.0:0)d=f>=0.0&1;else d=0;a[b+312>>0]=d}while(0);if((I|0)==68){a[d>>0]=0;d=0}X=d;X=X<<24>>24!=0;l=J;return X|0}default:{a[b+312>>0]=0;X=0;X=X<<24>>24!=0;l=J;return X|0}}return 0}function xc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,J=0.0,K=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0;la=l;l=l+80|0;g[b+504>>2]=0.0;g[b+500>>2]=0.0;a[b+525>>0]=0;a[b+526>>0]=0;if(a[b+552>>0]|0?(a[b+527>>0]|0)==0:0){sa=+g[b+556>>2];qa=+g[b+560>>2];ka=+g[b+564>>2];pa=+g[b+568>>2];$=sa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));ra=qa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));oa=ka*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));aa=+g[b+300>>2];S=+g[d>>2];ba=+g[b+316>>2];T=+g[d+4>>2];ca=+g[b+332>>2];U=+g[d+8>>2];ea=+g[b+304>>2];ga=+g[b+320>>2];ia=+g[b+336>>2];Y=+g[b+308>>2];Z=+g[b+324>>2];_=+g[b+340>>2];V=+g[d+16>>2];W=+g[d+20>>2];X=+g[d+24>>2];fa=+g[d+32>>2];ha=+g[d+36>>2];ja=+g[d+40>>2];q=+g[b+348>>2];p=+g[b+352>>2];o=+g[b+356>>2];u=+g[b+364>>2];na=+g[e>>2];v=+g[b+380>>2];ma=+g[e+4>>2];w=+g[b+396>>2];k=+g[e+8>>2];x=+g[b+368>>2];y=+g[b+384>>2];z=+g[b+400>>2];r=+g[b+372>>2];s=+g[b+388>>2];t=+g[b+404>>2];m=+g[e+16>>2];n=+g[e+20>>2];j=+g[e+24>>2];A=+g[e+32>>2];E=+g[e+36>>2];J=+g[e+40>>2];B=+g[b+412>>2];H=+g[b+416>>2];i=+g[b+420>>2];M=(1.0-(qa*ra+ka*oa))*(u*na+v*ma+w*k)+(sa*ra+pa*oa)*(na*x+ma*y+k*z)+(sa*oa-pa*ra)*(na*r+ma*s+k*t);N=(sa*ra-pa*oa)*(u*na+v*ma+w*k)+(1.0-(sa*$+ka*oa))*(na*x+ma*y+k*z)+(qa*oa+pa*$)*(na*r+ma*s+k*t);K=(sa*oa+pa*ra)*(u*na+v*ma+w*k)+(qa*oa-pa*$)*(na*x+ma*y+k*z)+(1.0-(sa*$+qa*ra))*(na*r+ma*s+k*t);P=(sa*oa-pa*ra)*(r*m+s*n+t*j)+((1.0-(qa*ra+ka*oa))*(u*m+v*n+w*j)+(sa*ra+pa*oa)*(x*m+y*n+z*j));R=(qa*oa+pa*$)*(r*m+s*n+t*j)+((sa*ra-pa*oa)*(u*m+v*n+w*j)+(1.0-(sa*$+ka*oa))*(x*m+y*n+z*j));O=(1.0-(sa*$+qa*ra))*(r*m+s*n+t*j)+((sa*oa+pa*ra)*(u*m+v*n+w*j)+(qa*oa-pa*$)*(x*m+y*n+z*j));da=(sa*oa-pa*ra)*(r*A+s*E+t*J)+((1.0-(qa*ra+ka*oa))*(u*A+v*E+w*J)+(sa*ra+pa*oa)*(x*A+y*E+z*J));ka=(qa*oa+pa*$)*(r*A+s*E+t*J)+((sa*ra-pa*oa)*(u*A+v*E+w*J)+(1.0-(sa*$+ka*oa))*(x*A+y*E+z*J));$=(1.0-(sa*$+qa*ra))*(r*A+s*E+t*J)+((sa*oa+pa*ra)*(u*A+v*E+w*J)+(qa*oa-pa*$)*(x*A+y*E+z*J));pa=-(+g[d+48>>2]+(S*q+T*p+U*o));oa=-(V*q+W*p+X*o+ +g[d+52>>2]);o=-(fa*q+ha*p+ja*o+ +g[d+56>>2]);p=(aa*S+ba*T+ca*U)*pa+(aa*V+ba*W+ca*X)*oa+(aa*fa+ba*ha+ca*ja)*o;q=(S*ea+T*ga+U*ia)*pa+(ea*V+ga*W+ia*X)*oa+(ea*fa+ga*ha+ia*ja)*o;o=(S*Y+T*Z+U*_)*pa+(Y*V+Z*W+_*X)*oa+(Y*fa+Z*ha+_*ja)*o;k=o*K+(p*M+q*N)+((u*na+v*ma+w*k)*0.0+(na*x+ma*y+k*z)*0.0+(na*r+ma*s+k*t)*0.0+(+g[e+48>>2]+(na*B+ma*H+k*i)));j=o*O+(p*P+q*R)+((r*m+s*n+t*j)*0.0+((u*m+v*n+w*j)*0.0+(x*m+y*n+z*j)*0.0)+(m*B+n*H+j*i+ +g[e+52>>2]));i=o*$+(p*da+q*ka)+((r*A+s*E+t*J)*0.0+((u*A+v*E+w*J)*0.0+(x*A+y*E+z*J)*0.0)+(A*B+E*H+J*i+ +g[e+56>>2]));g[la+16>>2]=(S*Y+T*Z+U*_)*K+((aa*S+ba*T+ca*U)*M+(S*ea+T*ga+U*ia)*N);g[la+16+4>>2]=(Y*V+Z*W+_*X)*K+((aa*V+ba*W+ca*X)*M+(ea*V+ga*W+ia*X)*N);g[la+16+8>>2]=(Y*fa+Z*ha+_*ja)*K+((aa*fa+ba*ha+ca*ja)*M+(ea*fa+ga*ha+ia*ja)*N);g[la+16+12>>2]=0.0;g[la+16+16>>2]=(S*Y+T*Z+U*_)*O+((aa*S+ba*T+ca*U)*P+(S*ea+T*ga+U*ia)*R);g[la+16+20>>2]=(Y*V+Z*W+_*X)*O+((aa*V+ba*W+ca*X)*P+(ea*V+ga*W+ia*X)*R);g[la+16+24>>2]=(Y*fa+Z*ha+_*ja)*O+((aa*fa+ba*ha+ca*ja)*P+(ea*fa+ga*ha+ia*ja)*R);g[la+16+28>>2]=0.0;g[la+16+32>>2]=(S*Y+T*Z+U*_)*$+((aa*S+ba*T+ca*U)*da+(S*ea+T*ga+U*ia)*ka);g[la+16+36>>2]=(Y*V+Z*W+_*X)*$+((aa*V+ba*W+ca*X)*da+(ea*V+ga*W+ia*X)*ka);g[la+16+40>>2]=(Y*fa+Z*ha+_*ja)*$+((aa*fa+ba*ha+ca*ja)*da+(ea*fa+ga*ha+ia*ja)*ka);g[la+16+44>>2]=0.0;g[la+16+48>>2]=k;g[la+16+52>>2]=j;g[la+16+56>>2]=i;g[la+16+60>>2]=0.0;yh(la+16|0,la);i=+g[la>>2];j=+g[la+4>>2];k=+g[la+8>>2];if(!(+C(+(i*i+j*j+k*k))<1.1920928955078125e-07)?(g[b+472>>2]=0.0,sa=1.0/+D(+(i*i+j*j+k*k)),g[b+460>>2]=i*sa,g[b+464>>2]=j*sa,g[b+468>>2]=k*sa,sa=+g[la+12>>2],sa=sa<-1.0?-1.0:sa,sa=+I(+(sa>1.0?1.0:sa))*2.0,g[b+504>>2]=sa,!(+C(+sa)<1.1920928955078125e-07)):0)a[b+526>>0]=1;l=la;return}yh(d,la+16|0);yh(b+300|0,la);U=+g[la+16+12>>2];V=+g[la>>2];W=+g[la+16>>2];X=+g[la+12>>2];Y=+g[la+16+4>>2];Z=+g[la+8>>2];_=+g[la+16+8>>2];$=+g[la+4>>2];yh(e,la+16|0);yh(b+364|0,la);aa=+g[la+16+12>>2];ba=+g[la>>2];ca=+g[la+16>>2];da=+g[la+12>>2];ea=+g[la+16+4>>2];fa=+g[la+8>>2];ga=+g[la+16+8>>2];ha=+g[la+4>>2];ia=-(aa*ba+ca*da+ea*fa-ga*ha);ja=-(ba*ga+(da*ea+aa*ha)-ca*fa);ka=-(aa*fa+da*ga+ca*ha-ba*ea);s=(U*X-V*W-Y*$-Z*_)*ia+(U*V+W*X+Y*Z-_*$)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*Z+X*_+W*$-V*Y)*ja-(V*_+(X*Y+U*$)-W*Z)*ka;t=(U*V+W*X+Y*Z-_*$)*ka+((V*_+(X*Y+U*$)-W*Z)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ja)-(U*Z+X*_+W*$-V*Y)*ia;u=(V*_+(X*Y+U*$)-W*Z)*ia+((U*Z+X*_+W*$-V*Y)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ka)-(U*V+W*X+Y*Z-_*$)*ja;v=(U*X-V*W-Y*$-Z*_)*(aa*da-ba*ca-ea*ha-fa*ga)-(U*V+W*X+Y*Z-_*$)*ia-(V*_+(X*Y+U*$)-W*Z)*ja-(U*Z+X*_+W*$-V*Y)*ka;k=+g[5957];i=+g[5959];m=+g[5958];n=(k*u+m*v-i*s)*-u+(v*(k*v+i*t-m*u)+(-(k*s)-m*t-i*u)*-s)-(i*v+m*s-k*t)*-t;o=(i*v+m*s-k*t)*-s+(v*(k*u+m*v-i*s)+(-(k*s)-m*t-i*u)*-t)-(k*v+i*t-m*u)*-u;j=(k*v+i*t-m*u)*-t+(v*(i*v+m*s-k*t)+(-(k*s)-m*t-i*u)*-u)-(k*u+m*v-i*s)*-s;p=1.0/+D(+(j*j+(n*n+o*o)));do if(i*p*j+(m*p*o+k*p*n)<-.9999998807907104)if(+C(+i)>.7071067690849304){j=1.0/+D(+(i*i+m*m));r=-(i*j);q=0.0;i=m*j;j=0.0;break}else{q=1.0/+D(+(k*k+m*m));r=k*q;q=-(m*q);i=0.0;j=0.0;break}else{sa=+D(+((i*p*j+(m*p*o+k*p*n)+1.0)*2.0));r=(i*p*n-k*p*j)*(1.0/sa);q=(m*p*j-i*p*o)*(1.0/sa);i=(k*p*o-m*p*n)*(1.0/sa);j=sa*.5}while(0);m=1.0/+D(+(q*q+r*r+i*i+j*j));o=q*m;r=r*m;q=i*m;m=j*m;T=1.0/+D(+((v*m-s*-o-t*-r-u*-q)*(v*m-s*-o-t*-r-u*-q)+((t*-o+(u*m+v*-q)-s*-r)*(t*-o+(u*m+v*-q)-s*-r)+((u*-r+(s*m+v*-o)-t*-q)*(u*-r+(s*m+v*-o)-t*-q)+(s*-q+(v*-r+t*m)-u*-o)*(s*-q+(v*-r+t*m)-u*-o)))));k=T*(u*-r+(s*m+v*-o)-t*-q);n=T*(s*-q+(v*-r+t*m)-u*-o);j=T*(t*-o+(u*m+v*-q)-s*-r);T=T*(v*m-s*-o-t*-r-u*-q);t=+g[b+444>>2];i=+g[b+456>>2];if(t>=i?(w=+g[b+448>>2],w>=i):0){s=m<-1.0?-1.0:m;s=+I(+(s>1.0?1.0:s))*2.0;if(s>1.1920928955078125e-07){p=1.0/+D(+(q*q+(o*o+r*r)));if(+C(+(r*p))>1.1920928955078125e-07){o=o*p;m=q*p;i=r*p;q=+D(+((q*p*q*p/(r*p*r*p)+1.0)/(1.0/(w*w)+q*p*q*p/(r*p*r*p)/(t*t))))}else{o=o*p;m=q*p;i=r*p;q=t}}else{o=0.0;m=0.0;i=0.0;q=0.0}p=+g[b+428>>2];r=q*p;if(s>r){a[b+526>>0]=1;if(s>2]=p;g[b+504>>2]=s-r;if(+C(+i)>1.1920928955078125e-07){sa=+C(+(i*-m/i*(w/t)));m=m<-0.0?sa:-sa;sa=1.0/+D(+(o*o+i*i+m*m));o=o*sa;m=-(m*sa);i=i*sa}ra=-o;qa=-i;oa=-m;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+460>>2]=qa;g[b+464>>2]=ra;g[b+468>>2]=sa;g[b+472>>2]=0.0;c[b+536>>2]=0;c[b+536+4>>2]=0;c[b+536+8>>2]=0;c[b+536+12>>2]=0;g[b+492>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}}else Q=23;a:do if((Q|0)==23){J=+g[b+300>>2];K=+g[b+316>>2];M=+g[b+332>>2];r=+g[d>>2];s=+g[d+4>>2];t=+g[d+8>>2];u=+g[d+16>>2];v=+g[d+20>>2];w=+g[d+24>>2];N=+g[d+32>>2];O=+g[d+36>>2];x=+g[d+40>>2];y=+g[b+304>>2];z=+g[b+320>>2];A=+g[b+336>>2];B=+g[b+308>>2];E=+g[b+324>>2];H=+g[b+340>>2];o=+g[b+364>>2];q=+g[b+380>>2];P=+g[b+396>>2];R=o*+g[e>>2]+q*+g[e+4>>2]+P*+g[e+8>>2];S=o*+g[e+16>>2]+q*+g[e+20>>2]+P*+g[e+24>>2];P=o*+g[e+32>>2]+q*+g[e+36>>2]+P*+g[e+40>>2];q=(J*r+K*s+M*t)*R+(J*u+K*v+M*w)*S+(J*N+K*O+M*x)*P;o=(r*y+s*z+t*A)*R+(u*y+v*z+w*A)*S+(N*y+O*z+x*A)*P;m=(r*B+s*E+t*H)*R+(u*B+v*E+w*H)*S+(N*B+O*E+x*H)*P;p=+g[b+444>>2];i=+g[b+456>>2];do if(p>2];if(p>0]=1;g[b+460>>2]=-((J*N+K*O+M*x)*S-(J*u+K*v+M*w)*P);g[b+464>>2]=-((J*r+K*s+M*t)*P-(J*N+K*O+M*x)*R);g[b+468>>2]=-((J*u+K*v+M*w)*R-(J*r+K*s+M*t)*S);g[b+472>>2]=0.0;break a}if(+C(+q)<1.1920928955078125e-07?+C(+m)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+m,+q);if(i>p){m=+G(+p);o=0.0;i=+F(+p);break}if(i<-p){m=-+G(+p);o=0.0;i=+F(+p)}else{o=0.0;i=q}}else i=q}else{if(+C(+q)<1.1920928955078125e-07?+C(+o)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+o,+q);if(i>p){m=0.0;o=+G(+p);i=+F(+p);break}if(i<-p){m=0.0;o=-+G(+p);i=+F(+p)}else{m=0.0;i=q}}else i=q}while(0);q=(r*B+s*E+t*H)*m+((r*y+s*z+t*A)*o+(J*r+K*s+M*t)*i);p=(u*B+v*E+w*H)*m+((u*y+v*z+w*A)*o+(J*u+K*v+M*w)*i);i=(N*B+O*E+x*H)*m+((N*y+O*z+x*A)*o+(J*N+K*O+M*x)*i);m=1.0/+D(+(i*i+(q*q+p*p)));g[b+460>>2]=-(S*m*i-P*m*p);g[b+464>>2]=-(P*m*q-R*m*i);g[b+468>>2]=-(R*m*p-S*m*q);g[b+472>>2]=0.0;o=+D(+((S*m*i-P*m*p)*(S*m*i-P*m*p)+(P*m*q-R*m*i)*(P*m*q-R*m*i)+(R*m*p-S*m*q)*(R*m*p-S*m*q)));g[b+504>>2]=o;if(!(+C(+o)<1.1920928955078125e-07)){g[b+460>>2]=1.0/o*-(S*m*i-P*m*p);g[b+464>>2]=1.0/o*-(P*m*q-R*m*i);g[b+468>>2]=1.0/o*-(R*m*p-S*m*q)}}while(0);p=+g[b+452>>2];if(!(p>=0.0)){g[b+512>>2]=0.0;l=la;return}i=T<-1.0?-1.0:T;i=+I(+(i>1.0?1.0:i))*2.0;if(i>3.1415927410125732){i=-T<-1.0?-1.0:-T;i=+I(+(i>1.0?1.0:i))*2.0;k=-k;n=-n;j=-j}g[b+512>>2]=i;if(i>1.1920928955078125e-07){sa=1.0/+D(+(k*k+n*n+j*j));k=k*sa;j=j*sa;n=n*sa}m=+g[b+428>>2];if(i>p*m){a[b+525>>0]=1;o=i-p*m;if(i>2]=i;g[b+508>>2]=o;ra=-k;qa=-n;oa=-j;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+476>>2]=qa;g[b+480>>2]=ra;g[b+484>>2]=sa;g[b+488>>2]=0.0;g[b+496>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}if(!(a[b+526>>0]|0)){l=la;return}na=-k;sa=-n;oa=-j;ma=(U*X-V*W-Y*$-Z*_)*na+(V*_+(X*Y+U*$)-W*Z)*oa-(U*Z+X*_+W*$-V*Y)*sa;ra=(U*Z+X*_+W*$-V*Y)*na+(U*X-V*W-Y*$-Z*_)*sa-(U*V+W*X+Y*Z-_*$)*oa;qa=(U*V+W*X+Y*Z-_*$)*sa+(U*X-V*W-Y*$-Z*_)*oa-(V*_+(X*Y+U*$)-W*Z)*na;oa=-((U*V+W*X+Y*Z-_*$)*na)-(V*_+(X*Y+U*$)-W*Z)*sa-(U*Z+X*_+W*$-V*Y)*oa;sa=-(U*V+W*X+Y*Z-_*$);na=-(V*_+(X*Y+U*$)-W*Z);pa=-(U*Z+X*_+W*$-V*Y);g[b+536>>2]=ra*pa+(oa*sa+(U*X-V*W-Y*$-Z*_)*ma)-qa*na;g[b+540>>2]=qa*sa+((U*X-V*W-Y*$-Z*_)*ra+oa*na)-ma*pa;g[b+544>>2]=ma*na+(oa*pa+(U*X-V*W-Y*$-Z*_)*qa)-ra*sa;g[b+548>>2]=0.0;l=la;return}function yc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ga=l;l=l+4352|0;da=c[d+4>>2]|0;ea=c[e+4>>2]|0;s=c[da+68>>2]|0;t=c[ea+68>>2]|0;if(!((s|0)!=0&(t|0)!=0)){Ic(b,d,e,f,h);l=ga;return}if(!((c[da+72>>2]|0)==(c[b+108>>2]|0)?(c[ea+72>>2]|0)==(c[b+112>>2]|0):0)){i=c[b+84>>2]|0;k=c[i+8>>2]|0;if((k|0)>0){j=0;do{m=c[(c[i+16>>2]|0)+(j*12|0)+8>>2]|0;if(m|0){Ib[c[c[m>>2]>>2]&511](m);u=c[b+4>>2]|0;Ob[c[(c[u>>2]|0)+60>>2]&127](u,m)}j=j+1|0}while((j|0)!=(k|0));i=c[b+84>>2]|0}Rh(i);c[b+108>>2]=c[da+72>>2];c[b+112>>2]=c[ea+72>>2]}a[ga+3328+16>>0]=1;r=ga+3328+12|0;c[r>>2]=0;q=ga+3328+4|0;c[q>>2]=0;c[ga+3328+8>>2]=0;c[ga+112>>2]=1025;i=ga+112+120|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+312|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+504|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+696|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+772>>2]=0;c[ga+112+776>>2]=0;c[ga+112+780>>2]=0;c[ga+112+800>>2]=0;c[ga+112+804>>2]=1025;i=ga+112+924|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1116|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1308|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1500|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+1576>>2]=0;c[ga+112+1580>>2]=0;c[ga+112+1584>>2]=0;c[ga+112+1604>>2]=0;c[ga+112+1608>>2]=1025;i=ga+112+1728|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1920|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2112|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2304|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+2380>>2]=0;c[ga+112+2384>>2]=0;c[ga+112+2388>>2]=0;c[ga+112+2408>>2]=0;c[ga+112+2412>>2]=1025;i=ga+112+2532|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2724|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2916|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+3108|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+3184>>2]=0;c[ga+112+3188>>2]=0;c[ga+112+3192>>2]=0;c[ga+112+3212>>2]=0;a[q+12>>0]=0;c[r>>2]=ga+112;c[q>>2]=0;c[ga+3328+8>>2]=4;p=c[b+84>>2]|0;i=c[p+8>>2]|0;if((i|0)>0){o=0;do{j=c[(c[p+16>>2]|0)+(o*12|0)+8>>2]|0;if(j){Ob[c[(c[j>>2]|0)+16>>2]&127](j,ga+3328|0);i=c[q>>2]|0;if((i|0)>0){n=0;do{m=c[(c[r>>2]|0)+(n<<2)>>2]|0;if(c[m+780>>2]|0){c[h+4>>2]=m;j=c[m+772>>2]|0;k=c[(c[h+8>>2]|0)+8>>2]|0;i=c[(c[h+12>>2]|0)+8>>2]|0;if((j|0)==(k|0))af(m,j+4|0,i+4|0);else af(m,i+4|0,k+4|0);c[h+4>>2]=0;i=c[q>>2]|0}n=n+1|0}while((n|0)<(i|0))}if((i|0)<0){if((c[ga+3328+8>>2]|0)<0){j=c[r>>2]|0;if(j|0){if(a[ga+3328+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[r>>2]=0}a[ga+3328+16>>0]=1;c[r>>2]=0;c[ga+3328+8>>2]=0}do{c[(c[r>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[q>>2]=0;i=c[p+8>>2]|0}o=o+1|0}while((o|0)<(i|0));i=c[r>>2]|0;if(i|0)if((a[ga+3328+16>>0]|0)==0|(i|0)==0)ca=35;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);ca=35}}else ca=35;if((ca|0)==35)c[r>>2]=0;u=c[b+4>>2]|0;i=c[b+84>>2]|0;j=c[b+72>>2]|0;c[ga+112>>2]=6604;c[ga+112+4>>2]=0;c[ga+112+8>>2]=d;c[ga+112+12>>2]=e;c[ga+112+16>>2]=u;c[ga+112+20>>2]=f;c[ga+112+24>>2]=h;c[ga+112+28>>2]=i;c[ga+112+32>>2]=j;j=c[d+12>>2]|0;G=+g[j>>2];H=+g[j+16>>2];I=+g[j+32>>2];J=+g[j+4>>2];K=+g[j+20>>2];L=+g[j+36>>2];M=+g[j+8>>2];N=+g[j+24>>2];O=+g[j+40>>2];P=-+g[j+48>>2];Q=-+g[j+52>>2];R=-+g[j+56>>2];j=c[e+12>>2]|0;S=+g[j>>2];T=+g[j+16>>2];U=+g[j+32>>2];V=+g[j+4>>2];W=+g[j+20>>2];X=+g[j+36>>2];Y=+g[j+8>>2];Z=+g[j+24>>2];_=+g[j+40>>2];$=+g[j+48>>2];aa=+g[j+52>>2];ba=+g[j+56>>2];j=c[s>>2]|0;i=c[t>>2]|0;F=+g[h+32>>2];if((j|0)!=0&(i|0)!=0){c[ga+3328>>2]=j;c[ga+3328+4>>2]=i;v=+C(+(G*S+H*T+I*U));w=+C(+(G*V+H*W+I*X));x=+C(+(G*Y+H*Z+I*_));y=+C(+(J*S+K*T+L*U));z=+C(+(J*V+K*W+L*X));A=+C(+(J*Y+K*Z+L*_));B=+C(+(M*S+N*T+O*U));D=+C(+(M*V+N*W+O*X));E=+C(+(M*Y+N*Z+O*_));o=1;m=124;n=128;r=ga+3328|0;k=128;t=0;while(1){u=o+-1|0;f=c[r+(u<<3)>>2]|0;s=c[r+(u<<3)+4>>2]|0;ra=+g[s+16>>2];qa=+g[s>>2];pa=+g[s+20>>2];oa=+g[s+4>>2];na=+g[s+24>>2];ha=+g[s+8>>2];ma=G*P+H*Q+I*R+(G*$+H*aa+I*ba)+((G*S+H*T+I*U)*(ra+qa)*.5+(G*V+H*W+I*X)*(pa+oa)*.5+(G*Y+H*Z+I*_)*(na+ha)*.5);ka=J*P+K*Q+L*R+(J*$+K*aa+L*ba)+((J*S+K*T+L*U)*(ra+qa)*.5+(J*V+K*W+L*X)*(pa+oa)*.5+(J*Y+K*Z+L*_)*(na+ha)*.5);ia=M*P+N*Q+O*R+(M*$+N*aa+O*ba)+((M*S+N*T+O*U)*(ra+qa)*.5+(M*V+N*W+O*X)*(pa+oa)*.5+(M*Y+N*Z+O*_)*(na+ha)*.5);la=((ra-qa)*.5+0.0)*v+((pa-oa)*.5+0.0)*w+((na-ha)*.5+0.0)*x;ja=((ra-qa)*.5+0.0)*y+((pa-oa)*.5+0.0)*z+((na-ha)*.5+0.0)*A;ha=((ra-qa)*.5+0.0)*B+((pa-oa)*.5+0.0)*D+((na-ha)*.5+0.0)*E;do if(((((+g[f>>2]<=F+(la+ma)?+g[f+16>>2]>=ma-la-F:0)?+g[f+4>>2]<=F+(ka+ja):0)?+g[f+20>>2]>=ka-ja-F:0)?+g[f+8>>2]<=F+(ia+ha):0)?+g[f+24>>2]>=ia-ha-F:0){if((u|0)>(m|0)){p=k<<1;a:do if((k|0)<(p|0)&(n|0)<(p|0)){do if(k){c[6995]=(c[6995]|0)+1;i=sc((k<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}if((k|0)>0)j=0;else{ca=51;break}do{m=r+(j<<3)|0;n=c[m+4>>2]|0;q=i+(j<<3)|0;c[q>>2]=c[m>>2];c[q+4>>2]=n;j=j+1|0}while((j|0)!=(k|0));if(!(t<<24>>24)){k=p;j=1;break a}}else{i=0;ca=51}while(0);if((ca|0)==51){ca=0;if((r|0)==0|t<<24>>24==0){k=p;j=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);k=p;j=1}else{k=n;i=r;j=t}while(0);q=p+-4|0;n=k}else{q=m;i=r;p=k;j=t}k=(c[s+40>>2]|0)!=0;if(!(c[f+40>>2]|0))if(k){m=c[s+36>>2]|0;c[i+(u<<3)>>2]=f;c[i+(u<<3)+4>>2]=m;m=c[s+40>>2]|0;c[i+(o<<3)>>2]=f;c[i+(o<<3)+4>>2]=m;o=o+1|0;m=q;k=p;break}else{Sb[c[(c[ga+112>>2]|0)+8>>2]&127](ga+112|0,f,s);o=u;m=q;k=p;break}else{m=c[f+36>>2]|0;if(k){k=c[s+36>>2]|0;c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=k;u=c[s+36>>2]|0;k=o+1|0;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=u;u=c[s+40>>2]|0;m=o+2|0;c[i+(k<<3)>>2]=c[f+36>>2];c[i+(k<<3)+4>>2]=u;k=c[s+40>>2]|0;c[i+(m<<3)>>2]=c[f+40>>2];c[i+(m<<3)+4>>2]=k;o=o+3|0;m=q;k=p;break}else{c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=s;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=s;o=o+1|0;m=q;k=p;break}}}else{o=u;i=r;j=t}while(0);if(!o)break;else{r=i;t=j}}if(!((i|0)==0|j<<24>>24==0)){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}}p=c[b+84>>2]|0;if((c[p+8>>2]|0)>0){o=0;do{i=c[p+16>>2]|0;j=c[i+(o*12|0)+8>>2]|0;do if(j|0){ca=c[i+(o*12|0)>>2]|0;u=c[da+28>>2]|0;t=c[u+(ca*80|0)+64>>2]|0;s=c[d+12>>2]|0;S=+g[s>>2];R=+g[s+4>>2];qa=+g[s+8>>2];la=+g[s+16>>2];ja=+g[s+20>>2];ha=+g[s+24>>2];ka=+g[s+32>>2];Y=+g[s+36>>2];W=+g[s+40>>2];ba=+g[u+(ca*80|0)>>2];aa=+g[u+(ca*80|0)+16>>2];$=+g[u+(ca*80|0)+32>>2];_=+g[u+(ca*80|0)+4>>2];Z=+g[u+(ca*80|0)+20>>2];ma=+g[u+(ca*80|0)+36>>2];ia=+g[u+(ca*80|0)+8>>2];X=+g[u+(ca*80|0)+24>>2];V=+g[u+(ca*80|0)+40>>2];pa=+g[u+(ca*80|0)+48>>2];ra=+g[u+(ca*80|0)+52>>2];oa=+g[u+(ca*80|0)+56>>2];U=+g[s+48>>2]+(S*pa+R*ra+qa*oa);T=+g[s+52>>2]+(la*pa+ja*ra+ha*oa);oa=+g[s+56>>2]+(ka*pa+Y*ra+W*oa);g[ga>>2]=S*ba+R*aa+qa*$;g[ga+4>>2]=S*_+R*Z+qa*ma;g[ga+8>>2]=S*ia+R*X+qa*V;g[ga+12>>2]=0.0;g[ga+16>>2]=la*ba+ja*aa+ha*$;g[ga+20>>2]=la*_+ja*Z+ha*ma;g[ga+24>>2]=la*ia+ja*X+ha*V;g[ga+28>>2]=0.0;g[ga+32>>2]=ka*ba+Y*aa+W*$;g[ga+36>>2]=ka*_+Y*Z+W*ma;g[ga+40>>2]=ka*ia+Y*X+W*V;g[ga+44>>2]=0.0;g[ga+48>>2]=U;g[ga+52>>2]=T;g[ga+56>>2]=oa;g[ga+60>>2]=0.0;Vb[c[(c[t>>2]|0)+8>>2]&127](t,ga,ga+3328|0,ga+96|0);oa=+g[h+32>>2];g[ga+3328>>2]=+g[ga+3328>>2]-oa;g[ga+3328+4>>2]=+g[ga+3328+4>>2]-oa;g[ga+3328+8>>2]=+g[ga+3328+8>>2]-oa;g[ga+96>>2]=oa+ +g[ga+96>>2];g[ga+96+4>>2]=oa+ +g[ga+96+4>>2];g[ga+96+8>>2]=oa+ +g[ga+96+8>>2];t=c[(c[p+16>>2]|0)+(o*12|0)+4>>2]|0;s=c[ea+28>>2]|0;ca=c[s+(t*80|0)+64>>2]|0;u=c[e+12>>2]|0;T=+g[u>>2];U=+g[u+4>>2];V=+g[u+8>>2];W=+g[u+16>>2];X=+g[u+20>>2];Y=+g[u+24>>2];ia=+g[u+32>>2];ka=+g[u+36>>2];ma=+g[u+40>>2];Z=+g[s+(t*80|0)>>2];_=+g[s+(t*80|0)+16>>2];$=+g[s+(t*80|0)+32>>2];aa=+g[s+(t*80|0)+4>>2];ba=+g[s+(t*80|0)+20>>2];ha=+g[s+(t*80|0)+36>>2];ja=+g[s+(t*80|0)+8>>2];la=+g[s+(t*80|0)+24>>2];qa=+g[s+(t*80|0)+40>>2];R=+g[s+(t*80|0)+48>>2];S=+g[s+(t*80|0)+52>>2];ra=+g[s+(t*80|0)+56>>2];pa=+g[u+48>>2]+(T*R+U*S+V*ra);na=+g[u+52>>2]+(W*R+X*S+Y*ra);ra=+g[u+56>>2]+(ia*R+ka*S+ma*ra);g[ga>>2]=T*Z+U*_+V*$;g[ga+4>>2]=T*aa+U*ba+V*ha;g[ga+8>>2]=T*ja+U*la+V*qa;g[ga+12>>2]=0.0;g[ga+16>>2]=W*Z+X*_+Y*$;g[ga+20>>2]=W*aa+X*ba+Y*ha;g[ga+24>>2]=W*ja+X*la+Y*qa;g[ga+28>>2]=0.0;g[ga+32>>2]=ia*Z+ka*_+ma*$;g[ga+36>>2]=ia*aa+ka*ba+ma*ha;g[ga+40>>2]=ia*ja+ka*la+ma*qa;g[ga+44>>2]=0.0;g[ga+48>>2]=pa;g[ga+52>>2]=na;g[ga+56>>2]=ra;g[ga+60>>2]=0.0;Vb[c[(c[ca>>2]|0)+8>>2]&127](ca,ga,ga+80|0,ga+64|0);ra=+g[ga+80>>2]-oa;g[ga+80>>2]=ra;na=+g[ga+80+4>>2]-oa;g[ga+80+4>>2]=na;pa=+g[ga+80+8>>2]-oa;g[ga+80+8>>2]=pa;qa=oa+ +g[ga+64>>2];g[ga+64>>2]=qa;ma=oa+ +g[ga+64+4>>2];g[ga+64+4>>2]=ma;oa=oa+ +g[ga+64+8>>2];g[ga+64+8>>2]=oa;if(!(+g[ga+3328+4>>2]>ma)?!(+g[ga+96+4>>2]>2]>oa?1:+g[ga+96+8>>2]>2]>qa?1:+g[ga+96>>2]>2]>>2]&511](j);n=c[b+4>>2]|0;Ob[c[(c[n>>2]|0)+60>>2]&127](n,j);n=c[p+16>>2]|0;m=c[n+(o*12|0)>>2]|0;n=c[n+(o*12|0)+4>>2]|0;j=c[b+92>>2]|0;if((j|0)==(c[b+96>>2]|0)?(fa=j|0?j<<1:1,(j|0)<(fa|0)):0){if(!fa)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((fa*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+92>>2]|0}if((j|0)>0){k=0;do{ca=i+(k*12|0)|0;u=(c[b+100>>2]|0)+(k*12|0)|0;c[ca>>2]=c[u>>2];c[ca+4>>2]=c[u+4>>2];c[ca+8>>2]=c[u+8>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[b+100>>2]|0;if(j|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+100>>2]=0}a[b+104>>0]=1;c[b+100>>2]=i;c[b+96>>2]=fa;i=c[b+92>>2]|0}else i=j;ca=c[b+100>>2]|0;c[ca+(i*12|0)>>2]=m;c[ca+(i*12|0)+4>>2]=n;c[ca+(i*12|0)+8>>2]=0;c[b+92>>2]=(c[b+92>>2]|0)+1}while(0);o=o+1|0}while((o|0)<(c[p+8>>2]|0));j=b+100|0;k=b+92|0}else{j=b+100|0;k=b+92|0}if((c[k>>2]|0)>0){i=0;do{h=c[b+84>>2]|0;fa=c[j>>2]|0;Bb[c[(c[h>>2]|0)+8>>2]&63](h,c[fa+(i*12|0)>>2]|0,c[fa+(i*12|0)+4>>2]|0)|0;i=i+1|0}while((i|0)<(c[k>>2]|0))}i=c[j>>2]|0;if(i|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+104>>0]=1;c[j>>2]=0;c[k>>2]=0;c[b+96>>2]=0;l=ga;return}function zc(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0,ra=0;qa=c[b+28>>2]|0;ra=c[b+32>>2]|0;n=c[d+24>>2]|0;if(!(a[b+739>>0]|0)){z=+g[b+552>>2];U=+g[qa+4>>2];A=+g[b+568>>2];V=+g[qa+8>>2];B=+g[b+584>>2];W=+g[qa+12>>2];C=+g[b+556>>2];E=+g[b+572>>2];F=+g[b+588>>2];X=+g[b+560>>2];Y=+g[b+576>>2];Z=+g[b+592>>2];_=+g[qa+20>>2];$=+g[qa+24>>2];aa=+g[qa+28>>2];ba=+g[qa+36>>2];ca=+g[qa+40>>2];da=+g[qa+44>>2];k=+g[b+600>>2];o=+g[b+604>>2];p=+g[b+608>>2];t=+g[qa+52>>2];u=+g[qa+56>>2];v=+g[qa+60>>2];G=+g[ra+4>>2];H=+g[ra+8>>2];I=+g[ra+12>>2];J=+g[b+624>>2];K=+g[b+640>>2];L=+g[b+656>>2];M=+g[ra+20>>2];N=+g[ra+24>>2];O=+g[ra+28>>2];P=+g[ra+36>>2];Q=+g[ra+40>>2];R=+g[ra+44>>2];oa=+g[b+664>>2];pa=+g[b+668>>2];y=+g[b+672>>2];w=+g[ra+52>>2]+(G*oa+H*pa+I*y);x=M*oa+N*pa+O*y+ +g[ra+56>>2];y=P*oa+Q*pa+R*y+ +g[ra+60>>2];l=(a[b+736>>0]|0)==0;if(l){e=c[d+8>>2]|0;g[e>>2]=1.0;g[e+(n+1<<2)>>2]=1.0;g[e+((n<<1)+2<<2)>>2]=1.0;e=c[d+16>>2]|0;g[e>>2]=-1.0;g[e+(n+1<<2)>>2]=-1.0;g[e+((n<<1)+2<<2)>>2]=-1.0;e=n<<1;f=+g[qa+52>>2];h=+g[qa+56>>2];i=+g[qa+60>>2]}else{e=n<<1;f=t;h=u;i=v}j=t+(U*k+V*o+W*p)-f;f=_*k+$*o+aa*p+u-h;pa=ba*k+ca*o+da*p+v-i;m=c[d+12>>2]|0;r=m+(e<<2)|0;c[m>>2]=0;g[m+4>>2]=pa;g[m+8>>2]=-f;g[m+12>>2]=0.0;g[m+(n<<2)>>2]=-pa;c[m+(n<<2)+4>>2]=0;g[m+(n<<2)+8>>2]=j;g[m+(n<<2)+12>>2]=0.0;g[r>>2]=f;g[r+4>>2]=-j;c[r+8>>2]=0;g[r+12>>2]=0.0;j=w-+g[ra+52>>2];f=x-+g[ra+56>>2];pa=y-+g[ra+60>>2];r=c[d+20>>2]|0;S=r+(e<<2)|0;c[r>>2]=0;g[r+4>>2]=-pa;g[r+8>>2]=f;g[r+12>>2]=0.0;g[r+(n<<2)>>2]=pa;c[r+(n<<2)+4>>2]=0;g[r+(n<<2)+8>>2]=-j;g[r+(n<<2)+12>>2]=0.0;g[S>>2]=-f;g[S+4>>2]=j;c[S+8>>2]=0;g[S+12>>2]=0.0;S=c[b+748>>2]|0;j=+g[(S&8|0?b+756|0:d+4|0)>>2];f=j*+g[d>>2];e=c[d+28>>2]|0;if(l){g[e>>2]=f*(w-(t+(U*k+V*o+W*p)));g[e+(n<<2)>>2]=f*(x-(_*k+$*o+aa*p+u));g[e+(n<<1<<2)>>2]=f*(y-(ba*k+ca*o+da*p+v))}s=c[d+24>>2]|0;g[m+(s*3<<2)>>2]=z*U+A*V+B*W;g[m+((s*3|0)+1<<2)>>2]=z*_+A*$+B*aa;g[m+((s*3|0)+2<<2)>>2]=z*ba+A*ca+B*da;g[m+(s<<2<<2)>>2]=U*C+V*E+W*F;g[m+((s<<2|1)<<2)>>2]=C*_+E*$+F*aa;g[m+((s<<2|2)<<2)>>2]=C*ba+E*ca+F*da;g[r+(s*3<<2)>>2]=-(z*U+A*V+B*W);g[r+((s*3|0)+1<<2)>>2]=-(z*_+A*$+B*aa);g[r+((s*3|0)+2<<2)>>2]=-(z*ba+A*ca+B*da);g[r+(s<<2<<2)>>2]=-(U*C+V*E+W*F);g[r+((s<<2|1)<<2)>>2]=-(C*_+E*$+F*aa);g[r+((s<<2|2)<<2)>>2]=-(C*ba+E*ca+F*da);oa=(X*_+Y*$+Z*aa)*(J*P+K*Q+L*R)-(X*ba+Y*ca+Z*da)*(J*M+K*N+L*O);pa=(X*ba+Y*ca+Z*da)*(G*J+H*K+I*L)-(U*X+V*Y+W*Z)*(J*P+K*Q+L*R);na=(U*X+V*Y+W*Z)*(J*M+K*N+L*O)-(X*_+Y*$+Z*aa)*(G*J+H*K+I*L);g[e+(s*3<<2)>>2]=((z*ba+A*ca+B*da)*na+((z*U+A*V+B*W)*oa+(z*_+A*$+B*aa)*pa))*f;g[e+(s<<2<<2)>>2]=((C*ba+E*ca+F*da)*na+((U*C+V*E+W*F)*oa+(C*_+E*$+F*aa)*pa))*f;if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;q=0;n=0;l=1}else{pa=+g[b+708>>2]*+g[b+732>>2];p=pa;q=pa>0.0?1:2;n=1;l=(a[b+737>>0]|0)!=0}g[m+(s*5<<2)>>2]=U*X+V*Y+W*Z;g[m+((s*5|0)+1<<2)>>2]=X*_+Y*$+Z*aa;g[m+((s*5|0)+2<<2)>>2]=X*ba+Y*ca+Z*da;g[r+(s*5<<2)>>2]=-(U*X+V*Y+W*Z);g[r+((s*5|0)+1<<2)>>2]=-(X*_+Y*$+Z*aa);g[r+((s*5|0)+2<<2)>>2]=-(X*ba+Y*ca+Z*da);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)k=f+-6.2831854820251465;else k=f;else k=f+6.2831854820251465;m=o==k;e=e+(s*5<<2)|0;g[e>>2]=0.0;if(S&2)j=+g[b+764>>2];if(l&(n&m^1)){if(S&4|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+752>>2];h=+g[b+728>>2];i=+g[b+680>>2];f=o>k?1.0:0.0;do if(!(o>=k)){f=i/(j*+g[d>>2]);if(f<0.0)if(h>=o&o-f>h){f=(o-h)/f;break}else{f=h0.0)if(h<=k&k-fk?0.0:1.0;break}else f=0.0}while(0);g[e>>2]=f*i*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s*5<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s*5<<2)>>2]=c[b+684>>2]}if(!n)return;g[e>>2]=+g[e>>2]+p*j*+g[d>>2];if(S&1|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+760>>2];e=c[d+40>>2]|0;if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{T=(q|0)==1;f=T?3402823466385288598117041.0e14:0.0;h=T?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s*5<<2)>>2]=h;g[e+(s*5<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=(U*X+V*Y+W*Z)*+g[qa+388>>2]+(X*_+Y*$+Z*aa)*+g[qa+392>>2]+(X*ba+Y*ca+Z*da)*+g[qa+396>>2]-((U*X+V*Y+W*Z)*+g[ra+388>>2]+(X*_+Y*$+Z*aa)*+g[ra+392>>2]+(X*ba+Y*ca+Z*da)*+g[ra+396>>2]);if((q|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(s*5<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}X=+g[qa+4>>2];Y=+g[qa+8>>2];Z=+g[qa+12>>2];v=+g[b+556>>2];x=+g[b+572>>2];y=+g[b+588>>2];_=+g[b+560>>2];$=+g[b+576>>2];aa=+g[b+592>>2];ba=+g[qa+20>>2];ca=+g[qa+24>>2];da=+g[qa+28>>2];ea=+g[qa+36>>2];fa=+g[qa+40>>2];ga=+g[qa+44>>2];ia=+g[b+600>>2];ha=+g[b+604>>2];o=+g[b+608>>2];h=+g[qa+52>>2]+(X*ia+Y*ha+Z*o);u=ba*ia+ca*ha+da*o+ +g[qa+56>>2];o=ea*ia+fa*ha+ga*o+ +g[qa+60>>2];ha=+g[ra+4>>2];ia=+g[ra+8>>2];ja=+g[ra+12>>2];ka=+g[b+624>>2];la=+g[b+640>>2];O=+g[b+656>>2];P=+g[ra+20>>2];Q=+g[ra+24>>2];R=+g[ra+28>>2];U=+g[ra+36>>2];V=+g[ra+40>>2];W=+g[ra+44>>2];p=+g[b+664>>2];w=+g[b+668>>2];i=+g[b+672>>2];f=+g[ra+52>>2];t=+g[ra+56>>2];k=+g[ra+60>>2];J=f+(ha*p+ia*w+ja*i)-h;K=P*p+Q*w+R*i+t-u;L=U*p+V*w+W*i+k-o;z=+g[(c[b+28>>2]|0)+404>>2];A=+g[(c[b+32>>2]|0)+404>>2];I=z+A>0.0?A/(z+A):.5;ma=(X*_+Y*$+Z*aa)*I+(ha*ka+ia*la+ja*O)*(1.0-I);na=(_*ba+$*ca+aa*da)*I+(ka*P+la*Q+O*R)*(1.0-I);oa=(_*ea+$*fa+aa*ga)*I+(ka*U+la*V+O*W)*(1.0-I);pa=1.0/+D(+(ma*ma+na*na+oa*oa));F=(f+(ha*p+ia*w+ja*i)-f)*ma*pa+(P*p+Q*w+R*i+t-t)*na*pa+(U*p+V*w+W*i+k-k)*oa*pa;f=f+(ha*p+ia*w+ja*i)-f-ma*pa*F;t=P*p+Q*w+R*i+t-t-na*pa*F;k=U*p+V*w+W*i+k-k-oa*pa*F;h=h-+g[qa+52>>2];u=u-+g[qa+56>>2];o=o-+g[qa+60>>2];i=ma*pa*(h*ma*pa+u*na*pa+o*oa*pa);w=na*pa*(h*ma*pa+u*na*pa+o*oa*pa);p=oa*pa*(h*ma*pa+u*na*pa+o*oa*pa);C=h-i+I*(i-ma*pa*F);E=u-w+I*(w-na*pa*F);B=o-p+I*(p-oa*pa*F);G=f-(1.0-I)*(i-ma*pa*F);H=t-(1.0-I)*(w-na*pa*F);F=k-(1.0-I)*(p-oa*pa*F);j=(I*f+(1.0-I)*(h-i))*(I*f+(1.0-I)*(h-i))+(I*t+(1.0-I)*(u-w))*(I*t+(1.0-I)*(u-w))+(I*k+(1.0-I)*(o-p))*(I*k+(1.0-I)*(o-p));if(j>1.1920928955078125e-07){y=1.0/+D(+j);N=(I*f+(1.0-I)*(h-i))*y;M=y*(I*k+(1.0-I)*(o-p));p=y*(I*t+(1.0-I)*(u-w))}else{N=X*v+Y*x+Z*y;M=v*ea+x*fa+y*ga;p=v*ba+x*ca+y*da}t=na*pa*M-oa*pa*p;u=oa*pa*N-M*ma*pa;v=p*ma*pa-na*pa*N;T=c[d+12>>2]|0;g[T>>2]=E*M-B*p;g[T+4>>2]=B*N-C*M;g[T+8>>2]=C*p-E*N;T=c[d+20>>2]|0;g[T>>2]=-(H*M-F*p);g[T+4>>2]=-(F*N-G*M);g[T+8>>2]=-(G*p-H*N);if(z<1.1920928955078125e-07|A<1.1920928955078125e-07?(a[b+716>>0]|0)!=0:0){f=I*(E*v-B*u);h=I*(B*t-C*v);i=I*(C*u-E*t);j=(1.0-I)*(H*v-F*u);k=(1.0-I)*(F*t-G*v);o=(1.0-I)*(G*u-H*t)}else{f=E*v-B*u;h=B*t-C*v;i=C*u-E*t;j=H*v-F*u;k=F*t-G*v;o=G*u-H*t}T=(c[d+12>>2]|0)+(n<<2)|0;g[T>>2]=f;g[T+4>>2]=h;g[T+8>>2]=i;T=c[d+20>>2]|0;g[T+(n<<2)>>2]=-j;g[T+(n+1<<2)>>2]=-k;g[T+(n+2<<2)>>2]=-o;if(z<1.1920928955078125e-07|A<1.1920928955078125e-07){o=I*(E*oa*pa-B*na*pa);k=I*(B*ma*pa-C*oa*pa);h=I*(C*na*pa-E*ma*pa);j=(1.0-I)*(H*oa*pa-F*na*pa);i=(1.0-I)*(F*ma*pa-G*oa*pa);f=(1.0-I)*(G*na*pa-H*ma*pa)}else{o=E*oa*pa-B*na*pa;k=B*ma*pa-C*oa*pa;h=C*na*pa-E*ma*pa;j=H*oa*pa-F*na*pa;i=F*ma*pa-G*oa*pa;f=G*na*pa-H*ma*pa}e=(c[d+12>>2]|0)+(n<<1<<2)|0;g[e>>2]=o;g[e+4>>2]=k;g[e+8>>2]=h;e=c[d+20>>2]|0;g[e+(n<<1<<2)>>2]=-j;g[e+((n<<1|1)<<2)>>2]=-i;g[e+((n<<1)+2<<2)>>2]=-f;k=+g[(c[b+748>>2]&8|0?b+756|0:d+4|0)>>2];f=k*+g[d>>2];if(!(a[b+736>>0]|0)){S=c[d+8>>2]|0;g[S>>2]=N;g[S+4>>2]=p;g[S+8>>2]=M;S=(c[d+8>>2]|0)+(n<<2)|0;g[S>>2]=t;g[S+4>>2]=u;g[S+8>>2]=v;S=(c[d+8>>2]|0)+(n<<1<<2)|0;g[S>>2]=ma*pa;g[S+4>>2]=na*pa;g[S+8>>2]=oa*pa;S=c[d+16>>2]|0;h=-N;g[S>>2]=h;g[S+4>>2]=-p;g[S+8>>2]=-M;g[S+(n<<2)>>2]=-t;g[S+(n+1<<2)>>2]=-u;g[S+(n+2<<2)>>2]=-v;g[S+(n<<1<<2)>>2]=-(ma*pa);g[S+((n<<1|1)<<2)>>2]=-(na*pa);g[S+((n<<1)+2<<2)>>2]=-(oa*pa);S=c[d+28>>2]|0;g[S>>2]=f*(J*N+K*p+L*M);g[S+(n<<2)>>2]=f*(J*t+K*u+L*v);g[S+(n<<1<<2)>>2]=f*(J*ma*pa+K*na*pa+L*oa*pa);f=h;h=-t;i=-u;j=-v;T=d+28|0;e=c[d+20>>2]|0}else{f=-N;h=-t;i=-u;j=-v;T=d+28|0;S=c[d+28>>2]|0}l=c[d+12>>2]|0;g[l+(n*3<<2)>>2]=N;g[l+((n*3|0)+1<<2)>>2]=p;g[l+((n*3|0)+2<<2)>>2]=M;g[l+(n<<2<<2)>>2]=t;g[l+((n<<2|1)<<2)>>2]=u;g[l+((n<<2|2)<<2)>>2]=v;g[e+(n*3<<2)>>2]=f;g[e+((n*3|0)+1<<2)>>2]=-p;g[e+((n*3|0)+2<<2)>>2]=-M;g[e+(n<<2<<2)>>2]=h;g[e+((n<<2|1)<<2)>>2]=i;g[e+((n<<2|2)<<2)>>2]=j;K=k*+g[d>>2];L=(_*ba+$*ca+aa*da)*(ka*U+la*V+O*W)-(_*ea+$*fa+aa*ga)*(ka*P+la*Q+O*R);ga=(_*ea+$*fa+aa*ga)*(ha*ka+ia*la+ja*O)-(X*_+Y*$+Z*aa)*(ka*U+la*V+O*W);la=(X*_+Y*$+Z*aa)*(ka*P+la*Q+O*R)-(_*ba+$*ca+aa*da)*(ha*ka+ia*la+ja*O);g[S+(n*3<<2)>>2]=K*(L*N+ga*p+la*M);g[S+(n<<2<<2)>>2]=K*(L*t+ga*u+la*v);if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;r=0;q=0;n=1}else{la=+g[b+708>>2]*+g[b+732>>2];p=la;r=la>0.0?1:2;q=1;n=(a[b+737>>0]|0)!=0}s=(c[d+24>>2]|0)*5|0;g[l+(s<<2)>>2]=ma*pa;g[l+(s+1<<2)>>2]=na*pa;g[l+(s+2<<2)>>2]=oa*pa;g[e+(s<<2)>>2]=-(ma*pa);g[e+(s+1<<2)>>2]=-(na*pa);g[e+(s+2<<2)>>2]=-(oa*pa);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;m=o==f;e=S+(s<<2)|0;g[e>>2]=0.0;l=c[b+748>>2]|0;if(l&2)k=+g[b+764>>2];if(n&(q&m^1)){if(l&4|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+752>>2];i=+g[b+728>>2];j=+g[b+680>>2];h=o>f?1.0:0.0;do if(!(o>=f)){h=j/(k*+g[d>>2]);if(h<0.0)if(i>=o&o-h>i){f=(o-i)/h;break}else{f=i0.0)if(i<=f&f-hf?0.0:1.0;break}else f=0.0}else f=h;while(0);g[e>>2]=f*j*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s<<2)>>2]=c[b+684>>2]}if(!q)return;g[e>>2]=+g[e>>2]+p*k*+g[d>>2];if(l&1|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+760>>2];if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{S=(r|0)==1;f=S?3402823466385288598117041.0e14:0.0;h=S?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s<<2)>>2]=h;g[(c[d+40>>2]|0)+(s<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=+g[qa+388>>2]*ma*pa+ +g[qa+392>>2]*na*pa+ +g[qa+396>>2]*oa*pa-(ma*pa*+g[ra+388>>2]+na*pa*+g[ra+392>>2]+oa*pa*+g[ra+396>>2]);if((r|0)==1){if(!(f<0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[T>>2]|0)+(s<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}function Ac(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ia=l;l=l+32|0;da=c[b+28>>2]|0;ea=c[b+32>>2]|0;$=+g[da+404>>2];_=+g[ea+404>>2];W=c[d+24>>2]|0;ca=a[b+180>>0]|0?1.0:-1.0;X=+g[b+936>>2]-+g[b+872>>2];Y=+g[b+940>>2]-+g[b+876>>2];Z=+g[b+944>>2]-+g[b+880>>2];aa=$+_>0.0?_/($+_):.5;A=c[b+824>>2]|0;B=c[b+840>>2]|0;E=c[b+856>>2]|0;F=c[b+888>>2]|0;G=c[b+904>>2]|0;H=c[b+920>>2]|0;S=(a[b+49>>0]|0)==0;do if(!S){f=aa*(c[j>>2]=A,+g[j>>2]);k=aa*(c[j>>2]=B,+g[j>>2]);i=aa*(c[j>>2]=E,+g[j>>2]);h=(1.0-aa)*(c[j>>2]=F,+g[j>>2]);n=(1.0-aa)*(c[j>>2]=G,+g[j>>2]);i=i+(1.0-aa)*(c[j>>2]=H,+g[j>>2]);o=1.0/+D(+((f+h)*(f+h)+(k+n)*(k+n)+i*i));e=(g[j>>2]=(f+h)*o,c[j>>2]|0);m=(g[j>>2]=(k+n)*o,c[j>>2]|0);v=(g[j>>2]=i*o,c[j>>2]|0);if(+C(+(i*o))>.7071067690849304){R=1.0/+D(+(i*o*i*o+(k+n)*o*(k+n)*o));c[ia+24>>2]=0;g[ia+20>>2]=-(i*o*R);g[ia+16>>2]=(k+n)*o*R;g[ia>>2]=(i*o*i*o+(k+n)*o*(k+n)*o)*R;g[ia+4>>2]=-((f+h)*o*(k+n)*o*R);U=ia;V=ia+4|0;f=(f+h)*o*-(i*o*R);q=2;fa=e;ga=m;ha=v;e=0;h=0.0;break}else{Q=(f+h)*o*(f+h)*o+(k+n)*o*(k+n)*o;R=1.0/+D(+Q);T=(g[j>>2]=-((k+n)*o*R),c[j>>2]|0);g[ia+24>>2]=-((k+n)*o*R);g[ia+20>>2]=(f+h)*o*R;c[ia+16>>2]=0;g[ia>>2]=-(i*o*(f+h)*o*R);g[ia+4>>2]=i*o*-((k+n)*o*R);U=ia;V=ia+4|0;f=Q*R;q=2;fa=e;ga=m;ha=v;e=T;h=-((k+n)*o*R);break}}else{T=c[b+828>>2]|0;U=c[b+844>>2]|0;V=c[b+860>>2]|0;c[ia+24>>2]=T;c[ia+20>>2]=U;c[ia+16>>2]=V;V=c[b+848>>2]|0;U=c[b+864>>2]|0;c[ia>>2]=c[b+832>>2];c[ia+4>>2]=V;c[ia+8>>2]=U;U=ia;V=ia+4|0;f=0.0;q=3;fa=A;ga=B;ha=E;e=T;h=(c[j>>2]=T,+g[j>>2])}while(0);g[ia+(q<<2)>>2]=f;T=c[d+12>>2]|0;c[T>>2]=e;m=c[ia+20>>2]|0;c[T+4>>2]=m;q=c[ia+16>>2]|0;c[T+8>>2]=q;v=c[ia>>2]|0;c[T+(W<<2)>>2]=v;x=c[V>>2]|0;c[T+(W+1<<2)>>2]=x;y=c[ia+8>>2]|0;c[T+(W+2<<2)>>2]=y;z=c[d+20>>2]|0;g[z>>2]=-h;s=(c[j>>2]=m,+g[j>>2]);g[z+4>>2]=-s;w=(c[j>>2]=q,+g[j>>2]);g[z+8>>2]=-w;t=(c[j>>2]=v,+g[j>>2]);g[z+(W<<2)>>2]=-t;p=(c[j>>2]=x,+g[j>>2]);g[z+(W+1<<2)>>2]=-p;u=(c[j>>2]=y,+g[j>>2]);g[z+(W+2<<2)>>2]=-u;e=c[b+300>>2]|0;f=+g[b+280>>2];if(!(e&128))f=f*+g[d+4>>2];K=f*+g[d>>2];Q=(c[j>>2]=B,+g[j>>2]);M=(c[j>>2]=H,+g[j>>2]);L=(c[j>>2]=E,+g[j>>2]);O=(c[j>>2]=G,+g[j>>2]);R=(c[j>>2]=F,+g[j>>2]);N=(c[j>>2]=A,+g[j>>2]);H=c[d+28>>2]|0;g[H>>2]=K*((Q*M-L*O)*h+(L*R-N*M)*s+(N*O-Q*R)*w);g[H+(W<<2)>>2]=K*((Q*M-L*O)*t+(L*R-N*M)*p+(N*O-Q*R)*u);if(e&64|0){H=c[d+32>>2]|0;c[H>>2]=c[b+292>>2];c[H+(W<<2)>>2]=c[b+292>>2]}R=+g[da+52>>2];L=+g[da+56>>2];O=+g[da+60>>2];J=+g[ea+52>>2];f=+g[ea+56>>2];i=+g[ea+60>>2];if(S){N=(i-O)*h-(J-R)*w;r=(J-R)*s-(f-L)*h;g[T+(W<<1<<2)>>2]=aa*((f-L)*w-(i-O)*s);g[T+((W<<1|1)<<2)>>2]=aa*N;g[T+((W<<1)+2<<2)>>2]=aa*r;g[z+(W<<1<<2)>>2]=(1.0-aa)*((f-L)*w-(i-O)*s);g[z+((W<<1|1)<<2)>>2]=(1.0-aa)*N;g[z+((W<<1)+2<<2)>>2]=(1.0-aa)*r;g[T+(W*3<<2)>>2]=aa*((f-L)*u-(i-O)*p);g[T+((W*3|0)+1<<2)>>2]=aa*((i-O)*t-(J-R)*u);g[T+((W*3|0)+2<<2)>>2]=aa*((J-R)*p-(f-L)*t);g[z+(W*3<<2)>>2]=(1.0-aa)*((f-L)*u-(i-O)*p);g[z+((W*3|0)+1<<2)>>2]=(1.0-aa)*((i-O)*t-(J-R)*u);g[z+((W*3|0)+2<<2)>>2]=(1.0-aa)*((J-R)*p-(f-L)*t);e=c[d+8>>2]|0;V=c[ia+24>>2]|0;c[e+(W<<1<<2)>>2]=V;c[e+((W<<1|1)<<2)>>2]=m;c[e+((W<<1)+2<<2)>>2]=q;c[e+(W*3<<2)>>2]=v;c[e+((W*3|0)+1<<2)>>2]=x;c[e+((W*3|0)+2<<2)>>2]=y;q=c[d+16>>2]|0;r=(c[j>>2]=V,+g[j>>2]);g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;Q=0.0;M=0.0;K=0.0;I=0.0;o=0.0;n=0.0;k=f-L;i=i-O;h=J-R}else{u=+g[b+936>>2]-J;w=+g[b+940>>2]-f;M=+g[b+944>>2]-i;n=(c[j>>2]=fa,+g[j>>2]);k=(c[j>>2]=ga,+g[j>>2]);o=(c[j>>2]=ha,+g[j>>2]);N=+g[b+872>>2]-R;Q=+g[b+876>>2]-L;i=+g[b+880>>2]-O;O=+g[b+1080>>2]-+g[b+1032>>2];R=n*(n*N+k*Q+o*i)+n*O-n*(n*u+k*w+o*M);I=k*(n*N+k*Q+o*i)+k*O-k*(n*u+k*w+o*M);O=o*(n*N+k*Q+o*i)+o*O-o*(n*u+k*w+o*M);K=N-n*(n*N+k*Q+o*i)+aa*R;J=Q-k*(n*N+k*Q+o*i)+aa*I;L=i-o*(n*N+k*Q+o*i)+aa*O;R=u-n*(n*u+k*w+o*M)-(1.0-aa)*R;I=w-k*(n*u+k*w+o*M)-(1.0-aa)*I;O=M-o*(n*u+k*w+o*M)-(1.0-aa)*O;h=aa*(u-n*(n*u+k*w+o*M))+(1.0-aa)*(N-n*(n*N+k*Q+o*i));f=aa*(w-k*(n*u+k*w+o*M))+(1.0-aa)*(Q-k*(n*N+k*Q+o*i));i=aa*(M-o*(n*u+k*w+o*M))+(1.0-aa)*(i-o*(n*N+k*Q+o*i));g[ia+24>>2]=h;g[ia+20>>2]=f;g[ia+16>>2]=i;if(i*i+(h*h+f*f)>1.1920928955078125e-07){Q=1.0/+D(+(i*i+(h*h+f*f)));g[ia+24>>2]=h*Q;g[ia+20>>2]=Q*f;g[ia+16>>2]=Q*i;m=(g[j>>2]=h*Q,c[j>>2]|0);q=(g[j>>2]=Q*f,c[j>>2]|0);w=Q*i;s=Q*f;r=h*Q;e=(g[j>>2]=Q*i,c[j>>2]|0)}else{m=c[b+828>>2]|0;q=c[b+844>>2]|0;e=c[b+860>>2]|0;c[ia+24>>2]=m;c[ia+20>>2]=q;c[ia+16>>2]=e;w=(c[j>>2]=e,+g[j>>2]);s=(c[j>>2]=q,+g[j>>2]);r=(c[j>>2]=m,+g[j>>2])}t=k*w-o*s;u=n*s-k*r;g[U>>2]=t;g[V>>2]=o*r-n*w;g[ia+8>>2]=u;g[ia+12>>2]=0.0;g[T+(W<<1<<2)>>2]=J*w-L*s;g[T+(W<<1<<2)+4>>2]=L*r-K*w;g[T+(W<<1<<2)+8>>2]=K*s-J*r;U=c[d+20>>2]|0;g[U+(W<<1<<2)>>2]=-(I*w-O*s);g[U+((W<<1|1)<<2)>>2]=-(O*r-R*w);g[U+((W<<1)+2<<2)>>2]=-(R*s-I*r);p=+g[V>>2];if($<1.1920928955078125e-07|_<1.1920928955078125e-07?(a[b+297>>0]|0)!=0:0){f=aa*(J*u-L*p);h=aa*(K*p-J*t);i=aa*(L*t-K*u);k=(1.0-aa)*(I*u-O*p);n=(1.0-aa)*(O*t-R*u);o=(1.0-aa)*(R*p-I*t)}else{f=J*u-L*p;h=K*p-J*t;i=L*t-K*u;k=I*u-O*p;n=O*t-R*u;o=R*p-I*t}V=(c[d+12>>2]|0)+(W*3<<2)|0;g[V>>2]=f;g[V+4>>2]=i;g[V+8>>2]=h;V=c[d+20>>2]|0;g[V+(W*3<<2)>>2]=-k;g[V+((W*3|0)+1<<2)>>2]=-n;g[V+((W*3|0)+2<<2)>>2]=-o;V=c[d+8>>2]|0;c[V+(W<<1<<2)>>2]=m;c[V+((W<<1|1)<<2)>>2]=q;c[V+((W<<1)+2<<2)>>2]=e;g[V+(W*3<<2)>>2]=t;g[V+((W*3|0)+1<<2)>>2]=p;g[V+((W*3|0)+2<<2)>>2]=u;q=c[d+16>>2]|0;g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;e=V;Q=J;M=L;o=O;n=R;k=0.0;i=0.0;h=0.0}g[m>>2]=N;A=c[b+300>>2]|0;f=+g[b+264>>2];if(!(A&32))f=f*+g[d+4>>2];R=f*+g[d>>2];B=c[d+28>>2]|0;g[B+(W<<1<<2)>>2]=R*(X*r+Y*s+Z*w);g[B+(W*3<<2)>>2]=R*(X*t+Y*p+Z*u);if(A&16|0){V=c[d+32>>2]|0;c[V+(W<<1<<2)>>2]=c[b+276>>2];c[V+(W*3<<2)>>2]=c[b+276>>2]}if(!(a[b+296>>0]|0))if(!(a[b+1096>>0]|0))e=4;else{p=0.0;y=0;x=0;v=1;ba=26}else{Z=ca*+g[b+1032>>2];p=Z;y=Z>0.0?2:1;x=1;v=(a[b+1096>>0]|0)!=0;ba=26}if((ba|0)==26){z=c[d+24>>2]<<2;c[e+(z<<2)>>2]=fa;c[e+((z|1)<<2)>>2]=ga;c[e+((z|2)<<2)>>2]=ha;r=(c[j>>2]=fa,+g[j>>2]);g[q+(z<<2)>>2]=-r;s=(c[j>>2]=ga,+g[j>>2]);g[q+((z|1)<<2)>>2]=-s;t=(c[j>>2]=ha,+g[j>>2]);g[q+((z|2)<<2)>>2]=-t;if(a[b+49>>0]|0){if(!($<1.1920928955078125e-07|_<1.1920928955078125e-07)){e=c[d+12>>2]|0;g[e+(z<<2)>>2]=t*Q-s*M;g[e+((z|1)<<2)>>2]=r*M-t*K;g[e+((z|2)<<2)>>2]=s*K-r*Q;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=-(t*I-s*o);g[e+((z|1)<<2)>>2]=-(r*o-t*n);f=-(s*n-r*I);ba=30}}else{_=t*k-s*i;$=r*i-t*h;f=s*h-r*k;e=c[d+12>>2]|0;g[e+(z<<2)>>2]=aa*_;g[e+((z|1)<<2)>>2]=aa*$;g[e+((z|2)<<2)>>2]=aa*f;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=(1.0-aa)*_;g[e+((z|1)<<2)>>2]=(1.0-aa)*$;f=(1.0-aa)*f;ba=30}if((ba|0)==30)g[e+((z|2)<<2)>>2]=f;e=+g[b+184>>2]==+g[b+188>>2];g[B+(z<<2)>>2]=0.0;m=(c[d+36>>2]|0)+(z<<2)|0;g[m>>2]=0.0;q=(c[d+40>>2]|0)+(z<<2)|0;g[q>>2]=0.0;o=+g[(A&512|0?b+232|0:d+4|0)>>2];if(v&(x&e^1)){if(A&1|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+212>>2];n=+g[b+1100>>2];f=+g[b+1080>>2];h=+g[b+184>>2];i=+g[b+188>>2];k=o*+g[d>>2];do if(!(h>i))if(!(h==i)){if(n/k<0.0)if(f>=h?h-n/k>f:0){f=(h-f)/(n/k);break}else{f=f0.0)if(f<=i?i-n/ki?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]-ca*f*n;g[m>>2]=-+g[b+1104>>2]/+g[d>>2]+ +g[m>>2];g[q>>2]=+g[b+1104>>2]/+g[d>>2]+ +g[q>>2]}if(x){g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]+p*o*+g[d>>2];if(A&256|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+244>>2];if(e){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ba=(y|0)==1;f=ba?-3402823466385288598117041.0e14:0.0;h=ba?0.0:3402823466385288598117041.0e14}g[m>>2]=f;g[q>>2]=h;aa=1.0-+g[b+240>>2];h=+C(+aa);do if(!(aa!=aa|0.0!=0.0|aa==0.0)){f=ca*(r*+g[da+372>>2]+s*+g[da+376>>2]+t*+g[da+380>>2]-(r*+g[ea+372>>2]+s*+g[ea+376>>2]+t*+g[ea+380>>2]));if((y|0)==1){if(!(f<0.0))break;if(!(+g[B+(z<<2)>>2]<-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}else{if(!(f>0.0))break;if(!(+g[B+(z<<2)>>2]>-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}}while(0);g[B+(z<<2)>>2]=+g[b+232>>2]*+g[B+(z<<2)>>2];e=5}else e=5}if(!(a[b+297>>0]|0))if(!(a[b+1112>>0]|0)){l=ia;return}else{t=0.0;x=0;v=0;m=1}else{ca=+g[b+1088>>2];t=ca;x=ca>0.0?1:2;v=1;m=(a[b+1112>>0]|0)!=0}y=P(c[d+24>>2]|0,e)|0;q=c[d+12>>2]|0;c[q+(y<<2)>>2]=fa;c[q+(y+1<<2)>>2]=ga;c[q+(y+2<<2)>>2]=ha;w=(c[j>>2]=fa,+g[j>>2]);q=c[d+20>>2]|0;g[q+(y<<2)>>2]=-w;u=(c[j>>2]=ga,+g[j>>2]);g[q+(y+1<<2)>>2]=-u;s=(c[j>>2]=ha,+g[j>>2]);g[q+(y+2<<2)>>2]=-s;o=+g[b+192>>2];p=+g[b+196>>2];q=c[b+300>>2]|0;r=+g[(q&2048|0?b+248|0:d+4|0)>>2];if(m&(v&o==p^1)){if(!(q&4)){i=o;k=p}else{c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+228>>2];i=+g[b+192>>2];k=+g[b+196>>2]}f=+g[b+1084>>2];n=+g[b+1116>>2];h=r*+g[d>>2];do if(!(i>k))if(!(i==k)){if(n/h<0.0)if(f>=i?i-n/h>f:0){f=(i-f)/(n/h);break}else{f=f0.0)if(f<=k?k-n/hk?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);e=c[d+28>>2]|0;g[e+(y<<2)>>2]=f*n;g[(c[d+36>>2]|0)+(y<<2)>>2]=-+g[b+1120>>2]/+g[d>>2];g[(c[d+40>>2]|0)+(y<<2)>>2]=+g[b+1120>>2]/+g[d>>2]}else e=B;if(!v){l=ia;return}ha=e+(y<<2)|0;g[ha>>2]=+g[ha>>2]+t*r*+g[d>>2];if(q&1024|0)c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+260>>2];if(o==p){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ha=(x|0)==1;f=ha?0.0:-3402823466385288598117041.0e14;h=ha?3402823466385288598117041.0e14:0.0}g[(c[d+36>>2]|0)+(y<<2)>>2]=f;g[(c[d+40>>2]|0)+(y<<2)>>2]=h;ca=1.0-+g[b+256>>2];h=+C(+ca);do if(!(ca!=ca|0.0!=0.0|ca==0.0)){ga=c[b+28>>2]|0;ha=c[b+32>>2]|0;f=w*+g[ga+388>>2]+u*+g[ga+392>>2]+s*+g[ga+396>>2]-(w*+g[ha+388>>2]+u*+g[ha+392>>2]+s*+g[ha+396>>2]);if((x|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(y<<2)|0;g[d>>2]=+g[b+248>>2]*+g[d>>2];l=ia;return}function Bc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0.0,B=0;B=l;l=l+112|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=3356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+344>>2]=0;a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;c[b+744>>2]=d;a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;a[b+1024>>0]=1;c[b+1020>>2]=0;c[b+1012>>2]=0;c[b+1016>>2]=0;c[b+988>>2]=0;c[b+992>>2]=0;c[b+996>>2]=-1;c[b+1e3>>2]=0;c[b+1004>>2]=0;a[b+1064>>0]=1;c[b+1060>>2]=0;c[b+1052>>2]=0;c[b+1056>>2]=0;c[b+1028>>2]=0;c[b+1032>>2]=0;c[b+1036>>2]=-1;c[b+1040>>2]=0;c[b+1044>>2]=0;a[b+1104>>0]=1;c[b+1100>>2]=0;c[b+1092>>2]=0;c[b+1096>>2]=0;c[b+1068>>2]=0;c[b+1072>>2]=0;c[b+1076>>2]=-1;c[b+1080>>2]=0;c[b+1084>>2]=0;a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;c[b+252>>2]=8;c[b+348>>2]=0;g[b+352>>2]=1.0;c[b+356>>2]=0;c[b+356+4>>2]=0;c[b+356+8>>2]=0;c[b+356+12>>2]=0;c[b+356+16>>2]=0;g[b+376>>2]=.20000000298023224;g[b+380>>2]=0.0;g[b+384>>2]=1.0;g[b+388>>2]=.10000000149011612;g[b+392>>2]=1.0;g[b+396>>2]=.699999988079071;g[b+400>>2]=.10000000149011612;g[b+404>>2]=1.0;g[b+408>>2]=.5;g[b+412>>2]=.5;g[b+416>>2]=.5;g[b+420>>2]=.5;g[b+424>>2]=1.0;g[b+428>>2]=1.0;c[b+432>>2]=0;c[b+436>>2]=1;c[b+440>>2]=0;c[b+444>>2]=4;c[b+448>>2]=1;a[b+532>>0]=0;a[b+533>>0]=0;g[b+536>>2]=0.0;c[b+580>>2]=0;c[b+580+4>>2]=0;c[b+580+8>>2]=0;c[b+580+12>>2]=0;c[b+596>>2]=1065353216;c[b+600>>2]=0;c[b+600+4>>2]=0;c[b+600+8>>2]=0;c[b+600+12>>2]=0;c[b+616>>2]=1065353216;c[b+620>>2]=0;c[b+620+4>>2]=0;c[b+620+8>>2]=0;c[b+620+12>>2]=0;c[b+636>>2]=1065353216;g[b+640>>2]=0.0;c[b+644>>2]=1065353216;c[b+648>>2]=0;c[b+648+4>>2]=0;c[b+648+8>>2]=0;c[b+648+12>>2]=0;c[b+664>>2]=1065353216;c[b+668>>2]=0;c[b+668+4>>2]=0;c[b+668+8>>2]=0;c[b+668+12>>2]=0;c[b+684>>2]=1065353216;g[b+688>>2]=0.0;c[b+740>>2]=0;g[b+948>>2]=0.0;a[b+984>>0]=1;c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;d=c[b+464>>2]|0;if(d|0){if(a[b+468>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+464>>2]=0}a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;d=c[b+484>>2]|0;if(d|0){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;d=c[b+504>>2]|0;do if(d)if(a[b+508>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+476>>2]|0;i=c[b+480>>2]|0;c[b+504>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;if((d|0)==(i|0)){w=14;break}else break}else{c[b+504>>2]=0;w=13;break}else w=13;while(0);if((w|0)==13){a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;i=0;w=14}if((w|0)==14){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0}k=c[b+484>>2]|0;if((i|0)<=0){if(k)w=22}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=22}if((w|0)==22){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;d=i;i=n}else d=i}k=c[b+484>>2]|0;c[k+(d<<2)>>2]=1;d=d+1|0;c[b+476>>2]=d;if((d|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=35}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=35}if((w|0)==35){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;o=d;j=i;i=n}else{o=k;j=i;d=k}}else{o=k;j=d;d=k}c[o+(j<<2)>>2]=2;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){d=0;k=o}else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=48}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=48}if((w|0)==48){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;k=d;j=i;i=n}else{k=o;j=i}}else k=o;c[k+(j<<2)>>2]=3;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=61}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=61}if((w|0)==61){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n}}else i=j;c[d+(i<<2)>>2]=0;c[b+476>>2]=i+1;c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+8>>2]=0;c[d+12>>2]=-1;c[d>>2]=3496;c[d+4>>2]=32;c[d+20>>2]=b;c[b+192>>2]=d;g[d+16>>2]=.25;c[b+1148>>2]=1065353216;c[b+1152>>2]=0;c[b+1152+4>>2]=0;c[b+1152+8>>2]=0;c[b+1152+12>>2]=0;c[b+1168>>2]=1065353216;c[b+1172>>2]=0;c[b+1172+4>>2]=0;c[b+1172+8>>2]=0;c[b+1172+12>>2]=0;c[b+1188>>2]=1065353216;x=b+1192|0;y=x+36|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));g[b+1228>>2]=1.0;z=hh(b)|0;g[z+4>>2]=1.0;g[z+8>>2]=1.0;g[z+12>>2]=1.0;c[z+16>>2]=1;x=c[b+192>>2]|0;A=+nb[c[(c[x>>2]|0)+48>>2]&15](x);x=B;y=x+100|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));n=c[b+772>>2]|0;if((n|0)<(e|0)){if((c[b+776>>2]|0)<(e|0)){if(!e){d=0;j=n}else{c[6995]=(c[6995]|0)+1;d=sc((e*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=c[b+772>>2]|0}if((j|0)>0){i=0;do{x=d+(i*104|0)|0;k=(c[b+780>>2]|0)+(i*104|0)|0;y=x+104|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));i=i+1|0}while((i|0)!=(j|0))}i=c[b+780>>2]|0;if(i|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=d;c[b+776>>2]=e;d=n}else d=n;do{x=c[b+780>>2]|0;c[x+(d*104|0)>>2]=0;x=x+(d*104|0)+4|0;k=B;y=x+100|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));d=d+1|0}while((d|0)!=(e|0))}c[b+772>>2]=e;if((e|0)>0){d=f;i=h;k=0;while(1){o=c[b+780>>2]|0;w=o+(k*104|0)|0;x=w;y=x+104|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));if(!d){n=0;m=0.0;p=0.0;q=0.0;r=0.0}else{n=d+16|0;m=+g[d+12>>2];p=+g[d>>2];q=+g[d+4>>2];r=+g[d+8>>2]}f=o+(k*104|0)+8|0;g[f>>2]=p;g[o+(k*104|0)+12>>2]=q;g[o+(k*104|0)+16>>2]=r;g[o+(k*104|0)+20>>2]=m;h=o+(k*104|0)+24|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];if(!i){j=0;m=1.0}else{j=i+4|0;m=+g[i>>2]}g[o+(k*104|0)+88>>2]=m>0.0?1.0/m:0.0;t=p-A;u=q-A;v=r-A;s=A+p;p=A+q;m=A+r;d=c[b+992>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}x=d;y=x+44|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0))}else c[b+992>>2]=0;c[d+32>>2]=0;c[d+36>>2]=w;c[d+40>>2]=0;g[d>>2]=t;g[d+4>>2]=u;g[d+8>>2]=v;g[d+12>>2]=0.0;g[d+16>>2]=s;g[d+20>>2]=p;g[d+24>>2]=m;g[d+28>>2]=0.0;Pe(b+988|0,c[b+988>>2]|0,d);c[b+1e3>>2]=(c[b+1e3>>2]|0)+1;c[o+(k*104|0)+96>>2]=d;c[o+(k*104|0)+4>>2]=z;k=k+1|0;if((k|0)==(e|0))break;else{d=n;i=j}}}d=c[b+988>>2]|0;if(!d){c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;l=B;return}e=c[b+192>>2]|0;u=+nb[c[(c[e>>2]|0)+48>>2]&15](e);A=+g[d+4>>2]-u;v=+g[d+8>>2]-u;g[b+952>>2]=+g[d>>2]-u;g[b+956>>2]=A;g[b+960>>2]=v;g[b+964>>2]=0.0;v=u+ +g[d+20>>2];A=u+ +g[d+24>>2];g[b+968>>2]=u+ +g[d+16>>2];g[b+972>>2]=v;g[b+976>>2]=A;g[b+980>>2]=0.0;d=c[b+188>>2]|0;if(!d){l=B;return}e=c[b+744>>2]|0;h=c[e+32>>2]|0;Zb[c[(c[h>>2]|0)+16>>2]&31](h,d,b+952|0,b+968|0,c[e+36>>2]|0);l=B;return}function Cc(d,f,h){d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0;K=l;l=l+96|0;H=c[d+56>>2]|0;if((h-f|0)==1){if(!(a[d+60>>0]|0)){q=(c[d+96>>2]|0)+(H<<6)|0;r=(c[d+76>>2]|0)+(f<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{I=(c[d+116>>2]|0)+(f<<4)|0;J=(c[d+136>>2]|0)+(H<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2]}c[d+56>>2]=(c[d+56>>2]|0)+1;l=K;return}c[K+32>>2]=0;c[K+32+4>>2]=0;c[K+32+8>>2]=0;c[K+32+12>>2]=0;if((h|0)>(f|0)){m=(a[d+60>>0]|0)==0;if(m){j=c[d+76>>2]|0;i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5;n=n+(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5;o=o+(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5;n=n+(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5;o=o+(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5;i=i+1|0}while((i|0)!=(h|0))}C=1.0/+(h-f|0);E=C*k;D=C*n;C=C*o;if(m){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{x=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5-E;y=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5-D;z=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5-C;o=o+x*x;n=y*y+n;k=z*z+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{N=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5-E;M=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5-D;L=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5-C;o=o+N*N;n=M*M+n;k=L*L+k;i=i+1|0}while((i|0)!=(h|0))}g[K+32>>2]=o;g[K+32+4>>2]=n;g[K+32+8>>2]=k;i=K+32|0;p=+(h-f|0)}else{i=K+32|0;p=+(h-f|0);o=0.0;n=0.0;k=0.0}L=1.0/(p+-1.0);M=L*o;g[i>>2]=M;N=L*n;g[K+32+4>>2]=N;L=L*k;g[K+32+8>>2]=L;w=+g[K+32+((M>2]>2]=0;c[K+16+4>>2]=0;c[K+16+8>>2]=0;c[K+16+12>>2]=0;if((h|0)>(f|0)){if(!(a[d+60>>0]|0)){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{o=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5+o;n=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5+n;k=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{o=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5+o;n=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5+n;k=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5+k;i=i+1|0}while((i|0)!=(h|0))}g[K+16>>2]=o;g[K+16+4>>2]=n;g[K+16+8>>2]=k;i=K+16|0}else{i=K+16|0;o=0.0;n=0.0;k=0.0}g[i>>2]=1.0/+(h-f|0)*o;g[K+16+4>>2]=1.0/+(h-f|0)*n;g[K+16+8>>2]=1.0/+(h-f|0)*k;x=+g[K+16+(w<<2)>>2];if((h|0)>(f|0)){i=f;v=f;do{j=(a[d+60>>0]|0)==0;if(j){G=c[d+76>>2]|0;k=+g[G+(v<<6)>>2];n=+g[G+(v<<6)+16>>2];o=+g[G+(v<<6)+4>>2];p=+g[G+(v<<6)+20>>2];t=+g[G+(v<<6)+8>>2];u=+g[G+(v<<6)+24>>2]}else{G=c[d+116>>2]|0;o=+g[d+36>>2];t=+g[d+40>>2];N=+g[d+44>>2];n=+g[d+4>>2];p=+g[d+8>>2];u=+g[d+12>>2];k=+(e[G+(v<<4)>>1]|0)/o+n;n=+(e[G+(v<<4)+6>>1]|0)/o+n;o=+(e[G+(v<<4)+2>>1]|0)/t+p;p=+(e[G+(v<<4)+8>>1]|0)/t+p;t=+(e[G+(v<<4)+4>>1]|0)/N+u;u=+(e[G+(v<<4)+10>>1]|0)/N+u}g[K>>2]=(n+k)*.5;g[K+4>>2]=(p+o)*.5;g[K+8>>2]=(u+t)*.5;g[K+12>>2]=0.0;if(+g[K+(w<<2)>>2]>x){if(j){j=c[d+76>>2]|0;m=j+(v<<6)|0;q=K+32|0;r=m;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=m;r=j+(i<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=(c[d+76>>2]|0)+(i<<6)|0;r=K+32|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{F=c[d+116>>2]|0;G=F+(v<<4)|0;c[K+32>>2]=c[G>>2];c[K+32+4>>2]=c[G+4>>2];c[K+32+8>>2]=c[G+8>>2];c[K+32+12>>2]=c[G+12>>2];F=F+(i<<4)|0;c[G>>2]=c[F>>2];c[G+4>>2]=c[F+4>>2];c[G+8>>2]=c[F+8>>2];c[G+12>>2]=c[F+12>>2];G=(c[d+116>>2]|0)+(i<<4)|0;c[G>>2]=c[K+32>>2];c[G+4>>2]=c[K+32+4>>2];c[G+8>>2]=c[K+32+8>>2];c[G+12>>2]=c[K+32+12>>2]}i=i+1|0}v=v+1|0}while((v|0)!=(h|0))}else i=f;if(!((i|0)>(((h-f|0)/3|0)+f|0)?(i|0)<(h+-1-((h-f|0)/3|0)|0):0))i=(h-f>>1)+f|0;G=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(G<<6)|0;c[F>>2]=c[d+20>>2];c[F+4>>2]=c[d+20+4>>2];c[F+8>>2]=c[d+20+8>>2];c[F+12>>2]=c[d+20+12>>2]}else{F=c[d+136>>2]|0;M=(+g[d+24>>2]-+g[d+8>>2])*+g[d+40>>2];N=(+g[d+28>>2]-+g[d+12>>2])*+g[d+44>>2];b[F+(G<<4)>>1]=~~((+g[d+20>>2]-+g[d+4>>2])*+g[d+36>>2])&65535&-2;b[F+(G<<4)+2>>1]=~~M&65535&-2;b[F+(G<<4)+4>>1]=~~N&65535&-2}j=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(j<<6)+16|0;c[F>>2]=c[d+4>>2];c[F+4>>2]=c[d+4+4>>2];c[F+8>>2]=c[d+4+8>>2];c[F+12>>2]=c[d+4+12>>2]}else{F=c[d+136>>2]|0;L=+g[d+4>>2];M=+g[d+8>>2];N=+g[d+12>>2];M=(M-M)*+g[d+40>>2];N=(N-N)*+g[d+44>>2];b[F+(j<<4)+6>>1]=~~((L-L)*+g[d+36>>2]+1.0)&65535|1;b[F+(j<<4)+8>>1]=~~(M+1.0)&65535|1;b[F+(j<<4)+10>>1]=~~(N+1.0)&65535|1}F=c[d+56>>2]|0;if((h|0)>(f|0)){B=a[d+60>>0]|0;A=f;do{if(!(B<<24>>24)){j=c[d+76>>2]|0;n=+g[j+(A<<6)>>2];u=+g[j+(A<<6)+4>>2];y=+g[j+(A<<6)+8>>2];p=+g[j+(A<<6)+12>>2];k=+g[j+(A<<6)+16>>2];x=+g[j+(A<<6)+20>>2];o=+g[j+(A<<6)+24>>2];t=+g[j+(A<<6)+28>>2];j=c[d+96>>2]|0;if(n<+g[j+(F<<6)>>2])g[j+(F<<6)>>2]=n;if(u<+g[j+(F<<6)+4>>2])g[j+(F<<6)+4>>2]=u;if(y<+g[j+(F<<6)+8>>2])g[j+(F<<6)+8>>2]=y;if(p<+g[j+(F<<6)+12>>2])g[j+(F<<6)+12>>2]=p;if(+g[j+(F<<6)+16>>2]>2]=k;if(+g[j+(F<<6)+20>>2]>2]=x;if(+g[j+(F<<6)+24>>2]>2]=o;if(+g[j+(F<<6)+28>>2]>2]=t}else{v=c[d+116>>2]|0;p=+g[d+36>>2];y=+g[d+40>>2];E=+g[d+44>>2];t=+g[d+4>>2];z=+g[d+8>>2];L=+g[d+12>>2];u=+g[d+4>>2];C=+g[d+8>>2];M=+g[d+12>>2];x=+g[d+36>>2];D=+g[d+40>>2];N=+g[d+44>>2];j=~~((+(e[v+(A<<4)>>1]|0)/p+t-u)*x)&65535&-2;m=~~((+(e[v+(A<<4)+2>>1]|0)/y+z-C)*D)&65535&-2;q=~~((+(e[v+(A<<4)+4>>1]|0)/E+L-M)*N)&65535&-2;r=~~((+(e[v+(A<<4)+6>>1]|0)/p+t-u)*x+1.0)&65535|1;s=~~((+(e[v+(A<<4)+8>>1]|0)/y+z-C)*D+1.0)&65535|1;v=~~((+(e[v+(A<<4)+10>>1]|0)/E+L-M)*N+1.0)&65535|1;w=c[d+136>>2]|0;if((e[w+(F<<4)>>1]|0)>(j&65535))b[w+(F<<4)>>1]=j;if((e[w+(F<<4)+6>>1]|0)<(r&65535))b[w+(F<<4)+6>>1]=r;if((e[w+(F<<4)+2>>1]|0)>(m&65535))b[w+(F<<4)+2>>1]=m;if((e[w+(F<<4)+8>>1]|0)<(s&65535))b[w+(F<<4)+8>>1]=s;if((e[w+(F<<4)+4>>1]|0)>(q&65535))b[w+(F<<4)+4>>1]=q;if((e[w+(F<<4)+10>>1]|0)<(v&65535))b[w+(F<<4)+10>>1]=v}A=A+1|0}while((A|0)!=(h|0))}c[d+56>>2]=F+1;Cc(d,f,i);A=c[d+56>>2]|0;Cc(d,i,h);w=(c[d+56>>2]|0)-H|0;i=a[d+60>>0]|0;if(i<<24>>24!=0&(w<<4|0)>2048){s=c[d+136>>2]|0;q=c[s+(F+1<<4)+12>>2]|0;q=(q|0)>-1?1:0-q|0;v=c[s+(A<<4)+12>>2]|0;v=(v|0)>-1?1:0-v|0;if((q<<4|0)<2049){r=c[d+152>>2]|0;if((r|0)==(c[d+156>>2]|0)?(I=r|0?r<<1:1,(r|0)<(I|0)):0){if(!I){i=0;m=r}else{c[6995]=(c[6995]|0)+1;i=sc(I<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{H=i+(j<<5)|0;h=(c[d+160>>2]|0)+(j<<5)|0;c[H>>2]=c[h>>2];c[H+4>>2]=c[h+4>>2];c[H+8>>2]=c[h+8>>2];c[H+12>>2]=c[h+12>>2];c[H+16>>2]=c[h+16>>2];c[H+20>>2]=c[h+20>>2];c[H+24>>2]=c[h+24>>2];c[H+28>>2]=c[h+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=I;i=c[d+152>>2]|0}else i=r;c[d+152>>2]=i+1;I=(c[d+160>>2]|0)+(r<<5)|0;c[I>>2]=c[K+32>>2];c[I+4>>2]=c[K+32+4>>2];c[I+8>>2]=c[K+32+8>>2];c[I+12>>2]=c[K+32+12>>2];c[I+16>>2]=c[K+32+16>>2];c[I+20>>2]=c[K+32+20>>2];c[I+24>>2]=c[K+32+24>>2];c[I+28>>2]=c[K+32+28>>2];I=c[d+160>>2]|0;b[I+(r<<5)>>1]=b[s+(F+1<<4)>>1]|0;b[I+(r<<5)+2>>1]=b[s+(F+1<<4)+2>>1]|0;b[I+(r<<5)+4>>1]=b[s+(F+1<<4)+4>>1]|0;b[I+(r<<5)+6>>1]=b[s+(F+1<<4)+6>>1]|0;b[I+(r<<5)+8>>1]=b[s+(F+1<<4)+8>>1]|0;b[I+(r<<5)+10>>1]=b[s+(F+1<<4)+10>>1]|0;c[I+(r<<5)+12>>2]=F+1;c[I+(r<<5)+16>>2]=q}if((v<<4|0)<2049){q=c[d+152>>2]|0;if((q|0)==(c[d+156>>2]|0)?(J=q|0?q<<1:1,(q|0)<(J|0)):0){if(!J){i=0;m=q}else{c[6995]=(c[6995]|0)+1;i=sc(J<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{I=i+(j<<5)|0;H=(c[d+160>>2]|0)+(j<<5)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[I+16>>2]=c[H+16>>2];c[I+20>>2]=c[H+20>>2];c[I+24>>2]=c[H+24>>2];c[I+28>>2]=c[H+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=J;i=c[d+152>>2]|0}else i=q;c[d+152>>2]=i+1;i=(c[d+160>>2]|0)+(q<<5)|0;c[i>>2]=c[K+32>>2];c[i+4>>2]=c[K+32+4>>2];c[i+8>>2]=c[K+32+8>>2];c[i+12>>2]=c[K+32+12>>2];c[i+16>>2]=c[K+32+16>>2];c[i+20>>2]=c[K+32+20>>2];c[i+24>>2]=c[K+32+24>>2];c[i+28>>2]=c[K+32+28>>2];i=c[d+160>>2]|0;b[i+(q<<5)>>1]=b[s+(A<<4)>>1]|0;b[i+(q<<5)+2>>1]=b[s+(A<<4)+2>>1]|0;b[i+(q<<5)+4>>1]=b[s+(A<<4)+4>>1]|0;b[i+(q<<5)+6>>1]=b[s+(A<<4)+6>>1]|0;b[i+(q<<5)+8>>1]=b[s+(A<<4)+8>>1]|0;b[i+(q<<5)+10>>1]=b[s+(A<<4)+10>>1]|0;c[i+(q<<5)+12>>2]=A;c[i+(q<<5)+16>>2]=v;i=d+152|0}else i=d+152|0;c[d+168>>2]=c[i>>2];i=a[d+60>>0]|0}if(!(i<<24>>24)){c[(c[d+96>>2]|0)+(G<<6)+32>>2]=w;l=K;return}else{c[(c[d+136>>2]|0)+(G<<4)+12>>2]=0-w;l=K;return}}function Dc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0.0,T=0;T=l;l=l+208|0;g[b+56>>2]=0.0;H=T+192+4|0;I=T+192+8|0;c[T+192>>2]=0;c[T+192+4>>2]=0;c[T+192+8>>2]=0;c[T+192+12>>2]=0;c[T+128>>2]=c[d>>2];c[T+128+4>>2]=c[d+4>>2];c[T+128+8>>2]=c[d+8>>2];c[T+128+12>>2]=c[d+12>>2];c[T+128+16>>2]=c[d+16>>2];c[T+128+16+4>>2]=c[d+16+4>>2];c[T+128+16+8>>2]=c[d+16+8>>2];c[T+128+16+12>>2]=c[d+16+12>>2];c[T+128+32>>2]=c[d+32>>2];c[T+128+32+4>>2]=c[d+32+4>>2];c[T+128+32+8>>2]=c[d+32+8>>2];c[T+128+32+12>>2]=c[d+32+12>>2];C=T+128+48|0;c[C>>2]=c[d+48>>2];c[C+4>>2]=c[d+48+4>>2];c[C+8>>2]=c[d+48+8>>2];c[C+12>>2]=c[d+48+12>>2];c[T+64>>2]=c[d+64>>2];c[T+64+4>>2]=c[d+64+4>>2];c[T+64+8>>2]=c[d+64+8>>2];c[T+64+12>>2]=c[d+64+12>>2];c[T+64+16>>2]=c[d+80>>2];c[T+64+16+4>>2]=c[d+80+4>>2];c[T+64+16+8>>2]=c[d+80+8>>2];c[T+64+16+12>>2]=c[d+80+12>>2];c[T+64+32>>2]=c[d+96>>2];c[T+64+32+4>>2]=c[d+96+4>>2];c[T+64+32+8>>2]=c[d+96+8>>2];c[T+64+32+12>>2]=c[d+96+12>>2];E=T+64+48|0;c[E>>2]=c[d+112>>2];c[E+4>>2]=c[d+112+4>>2];c[E+8>>2]=c[d+112+8>>2];c[E+12>>2]=c[d+112+12>>2];J=+g[C>>2];K=+g[E>>2];L=T+128+52|0;M=+g[L>>2];N=T+64+52|0;O=+g[N>>2];P=T+128+56|0;Q=+g[P>>2];R=T+64+56|0;S=+g[R>>2];g[C>>2]=J-(J+K)*.5;g[L>>2]=M-(M+O)*.5;g[P>>2]=Q-(Q+S)*.5;g[E>>2]=K-(J+K)*.5;g[N>>2]=O-(M+O)*.5;g[R>>2]=S-(Q+S)*.5;if(((c[(c[b+28>>2]|0)+4>>2]|0)+-17|0)>>>0<2)C=((c[(c[b+32>>2]|0)+4>>2]|0)+-17|0)>>>0<2;else C=0;v=+g[b+44>>2];u=+g[b+48>>2];c[6413]=(c[6413]|0)+1;E=a[b+52>>0]|0;c[b+64>>2]=0;c[b+4>>2]=0;c[b+8>>2]=1065353216;c[b+12>>2]=0;g[b+16>>2]=0.0;c[b+68>>2]=0;c[b+60>>2]=-1;n=c[b+24>>2]|0;a[n+312>>0]=0;c[n>>2]=0;a[n+356>>0]=1;c[n+292>>2]=1566444395;c[n+296>>2]=1566444395;c[n+300>>2]=1566444395;g[n+304>>2]=0.0;c[n+336>>2]=0;c[n+336+4>>2]=0;c[n+336+8>>2]=0;c[n+336+12>>2]=0;a[n+336+16>>0]=0;a[n+332>>0]=a[n+332>>0]&-16;n=0;p=999999984306749440.0;do{q=+g[b+4>>2];o=+g[b+8>>2];j=+g[b+12>>2];k=+g[d+4>>2]*-q+ +g[d+20>>2]*-o+ +g[d+36>>2]*-j;m=+g[d+8>>2]*-q+ +g[d+24>>2]*-o+ +g[d+40>>2]*-j;g[T+48>>2]=+g[d>>2]*-q+ +g[d+16>>2]*-o+ +g[d+32>>2]*-j;g[T+48+4>>2]=k;g[T+48+8>>2]=m;g[T+48+12>>2]=0.0;m=q*+g[d+68>>2]+o*+g[d+84>>2]+j*+g[d+100>>2];k=q*+g[d+72>>2]+o*+g[d+88>>2]+j*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*q+ +g[d+80>>2]*o+ +g[d+96>>2]*j;g[T+32+4>>2]=m;g[T+32+8>>2]=k;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);k=+g[T+16>>2];m=+g[T+16+4>>2];j=+g[T+16+8>>2];o=k*+g[T+128>>2]+m*+g[T+128+4>>2]+j*+g[T+128+8>>2]+ +g[T+128+48>>2];q=k*+g[T+128+16>>2]+m*+g[T+128+20>>2]+j*+g[T+128+24>>2]+ +g[L>>2];j=k*+g[T+128+32>>2]+m*+g[T+128+36>>2]+j*+g[T+128+40>>2]+ +g[P>>2];m=+g[T>>2];k=+g[T+4>>2];t=+g[T+8>>2];r=m*+g[T+64>>2]+k*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2];s=m*+g[T+64+16>>2]+k*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2];t=m*+g[T+64+32>>2]+k*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2];k=C?0.0:t;m=C?0.0:j;t=(C?0.0:j)-(C?0.0:t);j=+g[b+4>>2]*(o-r)+ +g[b+8>>2]*(q-s)+ +g[b+12>>2]*t;if(j>0.0?j*j>p*+g[d+128>>2]:0){c[b+68>>2]=10;n=1;h=0}else G=7;do if((G|0)==7){G=0;z=c[b+24>>2]|0;A=c[z>>2]|0;a:do if((A|0)>0){i=+g[z+308>>2];h=0;while(1){x=o-r-+g[z+4+(h<<4)>>2];y=q-s-+g[z+4+(h<<4)+4>>2];B=t-+g[z+4+(h<<4)+8>>2];h=h+1|0;if(x*x+y*y+B*B<=i){h=1;break a}if((h|0)>=(A|0)){h=0;break}}}else h=0;while(0);if((+g[z+304>>2]==0.0?t==+g[z+300>>2]:0)?q-s==+g[z+296>>2]:0){if(o-r==+g[z+292>>2]|h)G=16}else G=15;if((G|0)==15?(G=0,h):0)G=16;if((G|0)==16){G=0;c[b+68>>2]=1;n=1;h=0;break}i=p-j;if(i<=p*9.999999974752427e-07){c[b+68>>2]=i<=0.0?2:11;n=1;h=0;break}g[z+292>>2]=o-r;g[z+296>>2]=q-s;g[z+300>>2]=t;g[z+304>>2]=0.0;a[z+356>>0]=1;g[z+4+(A<<4)>>2]=o-r;g[z+4+(A<<4)+4>>2]=q-s;g[z+4+(A<<4)+8>>2]=t;g[z+4+(A<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+84+(h<<4)>>2]=o;g[z+84+(h<<4)+4>>2]=q;g[z+84+(h<<4)+8>>2]=m;g[z+84+(h<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+164+(h<<4)>>2]=r;g[z+164+(h<<4)+4>>2]=s;g[z+164+(h<<4)+8>>2]=k;g[z+164+(h<<4)+12>>2]=0.0;c[z>>2]=(c[z>>2]|0)+1;h=c[b+24>>2]|0;A=wc(h)|0;i=+g[h+276>>2];j=+g[h+280>>2];k=+g[h+284>>2];h=c[h+288>>2]|0;if(!A){c[b+68>>2]=3;n=1;h=0;break}if(i*i+j*j+k*k<9.999999974752427e-07){g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;c[b+68>>2]=6;n=1;h=0;break}if(p-(i*i+j*j+k*k)<=p*1.1920928955078125e-07){c[b+68>>2]=12;p=i*i+j*j+k*k;n=1;h=0;break}g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;A=c[b+64>>2]|0;c[b+64>>2]=A+1;if((A|0)<=1e3)if((c[c[b+24>>2]>>2]|0)==4){c[b+68>>2]=13;p=i*i+j*j+k*k;h=0}else{p=i*i+j*j+k*k;h=1}else{p=i*i+j*j+k*k;h=0}}while(0)}while(h);w=E<<24>>24==0?u:0.0;v=(E<<24>>24==0?v:0.0)+w;if(n){E=c[b+24>>2]|0;wc(E)|0;i=+g[E+260>>2];o=+g[E+264>>2];m=+g[E+268>>2];c[T+192>>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];j=+g[b+4>>2];k=+g[b+8>>2];q=+g[b+12>>2];if(j*j+k*k+q*q<9.999999974752427e-07)c[b+68>>2]=5;if(j*j+k*k+q*q>1.4210854715202004e-14){y=1.0/+D(+(j*j+k*k+q*q));g[T+192>>2]=y*+g[T+192>>2];g[H>>2]=y*+g[H>>2];g[I>>2]=y*+g[I>>2];B=w/+D(+p);p=1.0/y-v;n=1;h=1;i=B*j+i;o=B*k+o;m=B*q+m}else{p=0.0;n=0;h=2}c[b+60>>2]=h}else{p=0.0;n=0;i=0.0;o=0.0;m=0.0}if(((c[b+72>>2]|0)!=0?(c[b+20>>2]|0)!=0:0)?(c[b+68>>2]|0)!=0:0)h=v+p<1.0000000474974513e-03;else h=0;z=n^1;do if(h|z?(F=c[b+20>>2]|0,(F|0)!=0):0){c[6412]=(c[6412]|0)+1;c[b+4>>2]=0;c[b+4+4>>2]=0;c[b+4+8>>2]=0;c[b+4+12>>2]=0;if(!(Gb[c[(c[F>>2]|0)+8>>2]&3](F,c[b+24>>2]|0,c[b+28>>2]|0,c[b+32>>2]|0,T+128|0,T+64|0,b+4|0,T+48|0,T+32|0,f)|0)){k=+g[b+4>>2];r=+g[b+8>>2];t=+g[b+12>>2];if(!(k*k+r*r+t*t>0.0)){if(n){q=i;break}l=T;return}q=+g[T+32>>2];y=+g[T+48>>2]-q;s=+g[T+32+4>>2];B=+g[T+48+4>>2]-s;u=+g[T+32+8>>2];j=+g[T+48+8>>2]-u;j=+D(+(y*y+B*B+j*j))-v;if(j>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];B=+g[T+192>>2];m=+g[H>>2];o=+g[I>>2];p=1.0/+D(+(B*B+m*m+o*o));g[T+192>>2]=B*p;g[H>>2]=m*p;g[I>>2]=o*p;c[b+60>>2]=6;p=j;q=w*k+q;o=w*r+s;m=w*t+u;break}c[b+60>>2]=5;if(n){q=i;break}l=T;return}q=+g[T+32>>2];k=+g[T+48>>2];y=+g[T+32+4>>2];r=+g[T+48+4>>2];B=+g[T+32+8>>2];s=+g[T+48+8>>2];if(!((q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s)<=1.4210854715202004e-14)){j=(q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s);u=q-k;v=B-s;w=0.0;x=y-r}else{u=+g[b+4>>2];x=+g[b+8>>2];v=+g[b+12>>2];j=u*u+x*x+v*v;w=+g[b+16>>2]}if(!(j>1.4210854715202004e-14)){c[b+60>>2]=9;if(n){q=i;break}l=T;return}t=1.0/+D(+j);j=-+D(+((k-q)*(k-q)+(r-y)*(r-y)+(s-B)*(s-B)));c[b+60>>2]=3;if(p>j|z){g[T+192>>2]=u*t;g[H>>2]=x*t;g[I>>2]=v*t;g[T+192+12>>2]=w;p=j;o=y;m=B;break}c[b+60>>2]=8;if(n)q=i;else{l=T;return}}else G=54;while(0);if((G|0)==54)if(n)q=i;else{l=T;return}if(!(p<0.0)?!(p*p<+g[d+128>>2]):0){l=T;return}c[b+4>>2]=c[T+192>>2];c[b+4+4>>2]=c[T+192+4>>2];c[b+4+8>>2]=c[T+192+8>>2];c[b+4+12>>2]=c[T+192+12>>2];g[b+56>>2]=p;u=+g[T+192>>2];v=+g[H>>2];B=+g[I>>2];j=u*+g[d+4>>2]+v*+g[d+20>>2]+B*+g[d+36>>2];i=u*+g[d+8>>2]+v*+g[d+24>>2]+B*+g[d+40>>2];g[T+48>>2]=+g[d>>2]*u+ +g[d+16>>2]*v+ +g[d+32>>2]*B;g[T+48+4>>2]=j;g[T+48+8>>2]=i;g[T+48+12>>2]=0.0;i=+g[d+68>>2]*-u+ +g[d+84>>2]*-v+ +g[d+100>>2]*-B;j=+g[d+72>>2]*-u+ +g[d+88>>2]*-v+ +g[d+104>>2]*-B;g[T+32>>2]=+g[d+64>>2]*-u+ +g[d+80>>2]*-v+ +g[d+96>>2]*-B;g[T+32+4>>2]=i;g[T+32+8>>2]=j;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);j=+g[T+16>>2];i=+g[T+16+4>>2];B=+g[T+16+8>>2];v=+g[T>>2];u=+g[T+4>>2];t=+g[T+8>>2];y=+g[T+192>>2];x=+g[H>>2];w=+g[I>>2];t=-((j*+g[T+128+16>>2]+i*+g[T+128+20>>2]+B*+g[T+128+24>>2]+ +g[L>>2]-(v*+g[T+64+16>>2]+u*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2]))*x)-(j*+g[T+128>>2]+i*+g[T+128+4>>2]+B*+g[T+128+8>>2]+ +g[T+128+48>>2]-(v*+g[T+64>>2]+u*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2]))*y-(j*+g[T+128+32>>2]+i*+g[T+128+36>>2]+B*+g[T+128+40>>2]+ +g[P>>2]-(v*+g[T+64+32>>2]+u*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2]))*w;u=+g[d+4>>2]*-y+ +g[d+20>>2]*-x+ +g[d+36>>2]*-w;v=+g[d+8>>2]*-y+ +g[d+24>>2]*-x+ +g[d+40>>2]*-w;g[T+48>>2]=+g[d>>2]*-y+ +g[d+16>>2]*-x+ +g[d+32>>2]*-w;g[T+48+4>>2]=u;g[T+48+8>>2]=v;g[T+48+12>>2]=0.0;v=y*+g[d+68>>2]+x*+g[d+84>>2]+w*+g[d+100>>2];u=y*+g[d+72>>2]+x*+g[d+88>>2]+w*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*y+ +g[d+80>>2]*x+ +g[d+96>>2]*w;g[T+32+4>>2]=v;g[T+32+8>>2]=u;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);u=+g[T+16>>2];v=+g[T+16+4>>2];w=+g[T+16+8>>2];x=+g[T>>2];y=+g[T+4>>2];B=+g[T+8>>2];i=+g[T+192>>2];j=+g[H>>2];k=+g[I>>2];if(t>(u*+g[T+128>>2]+v*+g[T+128+4>>2]+w*+g[T+128+8>>2]+ +g[T+128+48>>2]-(x*+g[T+64>>2]+y*+g[T+64+4>>2]+B*+g[T+64+8>>2]+ +g[T+64+48>>2]))*i+(u*+g[T+128+16>>2]+v*+g[T+128+20>>2]+w*+g[T+128+24>>2]+ +g[L>>2]-(x*+g[T+64+16>>2]+y*+g[T+64+20>>2]+B*+g[T+64+24>>2]+ +g[N>>2]))*j+(u*+g[T+128+32>>2]+v*+g[T+128+36>>2]+w*+g[T+128+40>>2]+ +g[P>>2]-(x*+g[T+64+32>>2]+y*+g[T+64+36>>2]+B*+g[T+64+40>>2]+ +g[R>>2]))*k){c[b+60>>2]=10;g[T+192>>2]=-i;g[H>>2]=-j;g[I>>2]=-k}b=c[(c[e>>2]|0)+16>>2]|0;g[T+48>>2]=(J+K)*.5+q;g[T+48+4>>2]=(M+O)*.5+o;g[T+48+8>>2]=(Q+S)*.5+m;g[T+48+12>>2]=0.0;Tb[b&15](e,T+192|0,T+48|0,p);l=T;return}function Ec(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,O=0;t=l;l=l+208|0;if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&32768|0):0){r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Pb[c[(c[r>>2]|0)+64>>2]&7](r,b,.10000000149011612)}f=c[d+4>>2]|0;switch(f|0){case 31:{f=c[d+20>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+28>>2]|0;E=+g[r+(f*80|0)>>2];B=+g[r+(f*80|0)+4>>2];y=+g[r+(f*80|0)+8>>2];D=+g[r+(f*80|0)+16>>2];A=+g[r+(f*80|0)+20>>2];w=+g[r+(f*80|0)+24>>2];C=+g[r+(f*80|0)+32>>2];z=+g[r+(f*80|0)+36>>2];u=+g[r+(f*80|0)+40>>2];M=+g[r+(f*80|0)+48>>2];L=+g[r+(f*80|0)+52>>2];k=+g[r+(f*80|0)+56>>2];r=c[r+(f*80|0)+64>>2]|0;q=c[(c[a>>2]|0)+28>>2]|0;K=+g[b>>2];J=+g[b+4>>2];I=+g[b+8>>2];H=+g[b+16>>2];G=+g[b+20>>2];F=+g[b+24>>2];x=+g[b+32>>2];v=+g[b+36>>2];h=+g[b+40>>2];i=M*K+L*J+k*I+ +g[b+48>>2];j=M*H+L*G+k*F+ +g[b+52>>2];k=M*x+L*v+k*h+ +g[b+56>>2];g[t+144>>2]=E*K+D*J+C*I;g[t+144+4>>2]=B*K+A*J+z*I;g[t+144+8>>2]=y*K+w*J+u*I;g[t+144+12>>2]=0.0;g[t+144+16>>2]=E*H+D*G+C*F;g[t+144+20>>2]=B*H+A*G+z*F;g[t+144+24>>2]=y*H+w*G+u*F;g[t+144+28>>2]=0.0;g[t+144+32>>2]=E*x+D*v+C*h;g[t+144+36>>2]=B*x+A*v+z*h;g[t+144+40>>2]=y*x+w*v+u*h;g[t+144+44>>2]=0.0;g[t+144+48>>2]=i;g[t+144+52>>2]=j;g[t+144+56>>2]=k;g[t+144+60>>2]=0.0;Vb[q&127](a,t+144|0,r,e)}while((s|0)>1);l=t;return}case 0:{c[t+144>>2]=c[d+32>>2];c[t+144+4>>2]=c[d+32+4>>2];c[t+144+8>>2]=c[d+32+8>>2];c[t+144+12>>2]=c[d+32+12>>2];K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);L=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=K+ +g[t+144>>2];g[t+144>>2]=K;L=L+ +g[t+144+4>>2];g[t+144+4>>2]=L;M=M+ +g[t+144+8>>2];g[t+144+8>>2]=M;d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;a=c[(c[d>>2]|0)+80>>2]|0;g[t+112>>2]=-K;g[t+112+4>>2]=-L;g[t+112+8>>2]=-M;g[t+112+12>>2]=0.0;Zb[a&31](d,t+112|0,t+144|0,b,e);l=t;return}case 8:{M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Nb[c[(c[d>>2]|0)+24>>2]&0](d,M,b,e);l=t;return}case 9:{f=c[d+96>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+104>>2]|0;y=+g[r+(f<<4)>>2];z=+g[r+(f<<4)+4>>2];L=+g[r+(f<<4)+8>>2];r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;q=c[(c[r>>2]|0)+24>>2]|0;M=+g[(c[d+124>>2]|0)+(f<<2)>>2];B=+g[b>>2];C=+g[b+4>>2];A=+g[b+8>>2];E=+g[b+16>>2];F=+g[b+20>>2];D=+g[b+24>>2];H=+g[b+32>>2];I=+g[b+36>>2];G=+g[b+40>>2];J=y*B+z*C+L*A+ +g[b+48>>2];K=y*E+z*F+L*D+ +g[b+52>>2];L=y*H+z*I+L*G+ +g[b+56>>2];g[t+144>>2]=B+C*0.0+A*0.0;g[t+144+4>>2]=B*0.0+C+A*0.0;g[t+144+8>>2]=A+(B*0.0+C*0.0);g[t+144+12>>2]=0.0;g[t+144+16>>2]=E+F*0.0+D*0.0;g[t+144+20>>2]=E*0.0+F+D*0.0;g[t+144+24>>2]=D+(E*0.0+F*0.0);g[t+144+28>>2]=0.0;g[t+144+32>>2]=H+I*0.0+G*0.0;g[t+144+36>>2]=H*0.0+I+G*0.0;g[t+144+40>>2]=G+(H*0.0+I*0.0);g[t+144+44>>2]=0.0;g[t+144+48>>2]=J;g[t+144+52>>2]=K;g[t+144+56>>2]=L;g[t+144+60>>2]=0.0;Nb[q&0](r,M,t+144|0,e)}while((s|0)>1);l=t;return}case 10:{s=c[d+56>>2]|0;L=+g[d+32+(((s+2|0)%3|0)<<2)>>2];M=+g[d+32+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+84>>2]&0](d,L,M,s,b,e);l=t;return}case 11:{L=+g[d+60>>2];M=+g[d+64>>2];d=c[d+72>>2]|0;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[a>>2]|0)+92>>2]&0](a,L,M,d,b,e);l=t;return}case 13:{s=c[d+56>>2]|0;L=+nb[c[(c[d>>2]|0)+92>>2]&15](d);c[t+128>>2]=c[d+32>>2];c[t+128+4>>2]=c[d+32+4>>2];c[t+128+8>>2]=c[d+32+8>>2];c[t+128+12>>2]=c[d+32+12>>2];J=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[t+128>>2]=J+ +g[t+128>>2];g[t+128+4>>2]=K+ +g[t+128+4>>2];g[t+128+8>>2]=M+ +g[t+128+8>>2];M=+g[t+128+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+88>>2]&0](d,L,M,s,b,e);l=t;return}case 28:{M=+g[d+68>>2];a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Rb[c[(c[a>>2]|0)+96>>2]&0](a,d+52|0,M,b,e);l=t;return}default:{a:do if((f|0)<7){r=c[d+56>>2]|0;if(!r){if((xb[c[(c[d>>2]|0)+100>>2]&127](d)|0)<=0)break;f=0;while(1){Vb[c[(c[d>>2]|0)+104>>2]&127](d,f,t+144|0,t+112|0);K=+g[t+144>>2];y=+g[b>>2];I=+g[t+144+4>>2];z=+g[b+4>>2];G=+g[t+144+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+16>>2]=K*y+I*z+G*A+B;g[t+16+4>>2]=K*C+I*D+G*E+F;g[t+16+8>>2]=K*H+I*J+G*L+M;g[t+16+12>>2]=0.0;G=+g[t+112>>2];I=+g[t+112+4>>2];K=+g[t+112+8>>2];g[t>>2]=G*y+I*z+K*A+B;g[t+4>>2]=G*C+I*D+K*E+F;g[t+8>>2]=G*H+I*J+K*L+M;g[t+12>>2]=0.0;s=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Vb[c[(c[s>>2]|0)+16>>2]&127](s,t+16|0,t,e);f=f+1|0;if((f|0)>=(xb[c[(c[d>>2]|0)+100>>2]&127](d)|0))break a}}if((c[r+28>>2]|0)>0){q=0;do{f=c[r+36>>2]|0;p=c[f+(q*36|0)+4>>2]|0;b:do if((p|0)!=0?(s=c[f+(q*36|0)+12>>2]|0,(p|0)>0):0){f=0;n=c[s+(p+-1<<2)>>2]|0;m=s;h=0.0;i=0.0;k=0.0;while(1){o=c[m+(f<<2)>>2]|0;m=c[r+16>>2]|0;h=h+ +g[m+(o<<4)>>2];i=i+ +g[m+(o<<4)+4>>2];k=k+ +g[m+(o<<4)+8>>2];m=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[m>>2]|0)+16>>2]|0;O=c[r+16>>2]|0;K=+g[O+(n<<4)>>2];y=+g[b>>2];I=+g[O+(n<<4)+4>>2];z=+g[b+4>>2];G=+g[O+(n<<4)+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+144>>2]=K*y+I*z+G*A+B;g[t+144+4>>2]=K*C+I*D+G*E+F;g[t+144+8>>2]=K*H+I*J+G*L+M;g[t+144+12>>2]=0.0;G=+g[O+(o<<4)>>2];I=+g[O+(o<<4)+4>>2];K=+g[O+(o<<4)+8>>2];g[t+112>>2]=G*y+I*z+K*A+B;g[t+112+4>>2]=G*C+I*D+K*E+F;g[t+112+8>>2]=G*H+I*J+K*L+M;g[t+112+12>>2]=0.0;Vb[N&127](m,t+144|0,t+112|0,e);f=f+1|0;m=c[r+36>>2]|0;if((f|0)>=(c[m+(q*36|0)+4>>2]|0))break b;n=o;m=c[m+(q*36|0)+12>>2]|0}}else{h=0.0;i=0.0;k=0.0}while(0);j=1.0/+(p|0)*h;i=1.0/+(p|0)*i;h=1.0/+(p|0)*k;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;if((xb[c[(c[O>>2]|0)+56>>2]&127](O)|0)&16384|0){c[t+144>>2]=1065353216;c[t+144+4>>2]=1065353216;c[t+144+8>>2]=0;g[t+144+12>>2]=0.0;O=c[r+36>>2]|0;G=+g[O+(q*36|0)+20>>2];I=+g[O+(q*36|0)+24>>2];K=+g[O+(q*36|0)+28>>2];O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[O>>2]|0)+16>>2]|0;y=+g[b>>2];z=+g[b+4>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+112>>2]=j*y+i*z+h*A+B;g[t+112+4>>2]=j*C+i*D+h*E+F;g[t+112+8>>2]=j*H+i*J+h*L+M;g[t+112+12>>2]=0.0;g[t+16>>2]=(j+G)*y+(i+I)*z+(h+K)*A+B;g[t+16+4>>2]=(j+G)*C+(i+I)*D+(h+K)*E+F;g[t+16+8>>2]=(j+G)*H+(i+I)*J+(h+K)*L+M;g[t+16+12>>2]=0.0;Vb[N&127](O,t+112|0,t+16|0,t+144|0)}q=q+1|0}while((q|0)<(c[r+28>>2]|0))}}while(0);f=c[d+4>>2]|0;if((f+-21|0)>>>0<9){c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;f=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=f;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];Vb[c[(c[d>>2]|0)+64>>2]&127](d,t+16|0,t+112|0,t+144|0);f=c[d+4>>2]|0}if((f|0)!=3){l=t;return}c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=O;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];O=c[d+96>>2]|0;Vb[c[(c[O>>2]|0)+8>>2]&127](O,t+16+4|0,t+112|0,t+144|0);l=t;return}}}function Fc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0;T=l;l=l+144|0;R=c[d+36>>2]|0;o=+g[(+g[R+88>>2]>0.0?b+16|0:b+20|0)>>2];if(a[R+100>>0]&1){l=T;return}P=c[b+8>>2]|0;t=c[P+4>>2]|0;Q=c[P+12>>2]|0;L=c[(c[b+4>>2]|0)+744>>2]|0;N=+g[R+8>>2]-+g[Q+48>>2];q=+g[R+12>>2]-+g[Q+52>>2];O=+g[R+16>>2]-+g[Q+56>>2];F=1.0/+g[L+76>>2];E=(N*+g[Q>>2]+q*+g[Q+16>>2]+O*+g[Q+32>>2])*F/3.0;I=E<0.0?~~(1.0-E):0;M=~~((E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0);u=(E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0-+(M|0);I=~~(E+ +(I|0))-I|0;E=F*(N*+g[Q+4>>2]+q*+g[Q+20>>2]+O*+g[Q+36>>2])/3.0;G=E<0.0?~~(1.0-E):0;J=~~((E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0);n=(E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0-+(J|0);G=~~(E+ +(G|0))-G|0;O=F*(N*+g[Q+8>>2]+q*+g[Q+24>>2]+O*+g[Q+40>>2])/3.0;H=O<0.0?~~(1.0-O):0;K=~~((O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0);q=(O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0-+(K|0);H=~~(O+ +(H|0))-H|0;p=(I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)+(G&65535)+((I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)>>>11)|0;p=(p^G>>>16<<11^p<<16)+(H&65535)+((p^G>>>16<<11^p<<16)>>>11)|0;p=(p^H>>>16<<11^p<<16)+(t&65535)+((p^H>>>16<<11^p<<16)>>>11)|0;p=((p^t>>>16<<11^p<<16)>>>11)+(p^t>>>16<<11^p<<16)|0;p=((p<<3^p)>>>5)+(p<<3^p)<<4^((p<<3^p)>>>5)+(p<<3^p);p=(((p>>>17)+p<<25^(p>>>17)+p)>>>6)+((p>>>17)+p<<25^(p>>>17)+p)|0;r=c[L+60>>2]|0;s=c[L+68>>2]|0;d=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]|0;c[L+96>>2]=(c[L+96>>2]|0)+1;e=(c[L+92>>2]|0)+1|0;c[L+92>>2]=e;a:do if(!d)f=9;else while(1){if(((((c[d+272>>2]|0)==(p|0)?(c[d+256>>2]|0)==(I|0):0)?(c[d+260>>2]|0)==(G|0):0)?(c[d+264>>2]|0)==(H|0):0)?(c[d+276>>2]|0)==(t|0):0)break a;d=c[d+280>>2]|0;e=e+1|0;c[L+92>>2]=e;if(!d){f=9;break}}while(0);b:do if((f|0)==9){f=c[L+84>>2]|0;c[L+84>>2]=f+1;if((f|0)>=(c[L+88>>2]|0)){c[5760]=(c[5760]|0)+1;c:do if((r|0)>0){d=0;e=s;while(1){f=e+(d<<2)|0;e=c[f>>2]|0;c[f>>2]=0;if(e|0)do{f=e;e=c[e+280>>2]|0;cJ(f)}while((e|0)!=0);d=d+1|0;if((d|0)==(r|0))break c;e=c[L+68>>2]|0}}while(0);g[L+76>>2]=.25;c[L+80>>2]=0;c[L+84>>2]=0;c[L+92>>2]=1;c[L+96>>2]=1}d=Ds(284)|0;Yk(d|0,0,284)|0;c[d+280>>2]=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2];c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]=d;c[d+276>>2]=t;c[d+272>>2]=p;c[d+256>>2]=I;c[d+260>>2]=G;c[d+264>>2]=H;k=+g[L+76>>2];r=T+72+4|0;s=T+72+24|0;t=T+72+44|0;e=0;h=k;while(1){j=k*+(H|0)*3.0+ +(e|0)*h;f=0;while(1){i=k*+(G|0)*3.0+ +(f|0)*h;g[T>>2]=+(I|0)*3.0*k+h*0.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2];g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+64+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*2.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+128+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*3.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+192+(f<<4)+(e<<2)>>2]=h;f=f+1|0;if((f|0)==4)break;h=+g[L+76>>2]}e=e+1|0;if((e|0)==4)break b;h=+g[L+76>>2]}}while(0);c[d+268>>2]=c[L+80>>2];h=+g[d+(M<<6)+(J<<4)+(K<<2)>>2];C=+g[d+(M+1<<6)+(J<<4)+(K<<2)>>2];A=+g[d+(M+1<<6)+(J+1<<4)+(K<<2)>>2];B=+g[d+(M<<6)+(J+1<<4)+(K<<2)>>2];O=+g[d+(M<<6)+(J<<4)+(K+1<<2)>>2];N=+g[d+(M+1<<6)+(J<<4)+(K+1<<2)>>2];E=+g[d+(M+1<<6)+(J+1<<4)+(K+1<<2)>>2];F=+g[d+(M<<6)+(J+1<<4)+(K+1<<2)>>2];i=C-h+n*(A-B-(C-h))+q*(N-O+n*(E-F-(N-O))-(C-h+n*(A-B-(C-h))));j=B-h+u*(A-C-(B-h))+q*(F-O+u*(E-N-(F-O))-(B-h+u*(A-C-(B-h))));k=O-h+u*(N-C-(O-h))+n*(F-B+u*(E-A-(F-B))-(O-h+u*(N-C-(O-h))));m=1.0/+D(+(i*i+j*j+k*k));h=h+u*(C-h)+n*(B+u*(A-B)-(h+u*(C-h)));h=h+q*(O+u*(N-O)+n*(F+u*(E-F)-(O+u*(N-O)))-h)-o;if(!(h<0.0)){l=T;return}s=c[P+8>>2]|0;N=+g[Q>>2]*i*m+ +g[Q+4>>2]*j*m+ +g[Q+8>>2]*k*m;O=i*m*+g[Q+16>>2]+j*m*+g[Q+20>>2]+k*m*+g[Q+24>>2];F=i*m*+g[Q+32>>2]+j*m*+g[Q+36>>2]+k*m*+g[Q+40>>2];E=-(N*(+g[R+8>>2]-h*N)+O*(+g[R+12>>2]-h*O)+F*(+g[R+16>>2]-h*F));z=+g[R+88>>2];d=c[b+12>>2]|0;if(!d)q=0.0;else q=+g[d+404>>2];if(!(z+q>0.0)){l=T;return}if(!d)d=c[(c[b+8>>2]|0)+8>>2]|0;if((a[22464]|0)==0?Uz(22464)|0:0){e=23044;f=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0))}e=c[b+12>>2]|0;m=+g[R+8>>2];B=m-+g[d+52>>2];n=+g[R+12>>2];C=n-+g[d+56>>2];o=+g[R+16>>2];A=o-+g[d+60>>2];if(!e){Q=c[b+4>>2]|0;h=0.0;i=0.0;j=0.0;d=Q;k=+g[Q+512>>2]}else{j=+g[e+392>>2];i=+g[e+396>>2];y=+g[e+388>>2];d=c[b+4>>2]|0;k=+g[d+512>>2];h=(j*A-i*C+ +g[e+372>>2])*k;i=(+g[e+376>>2]+(i*B-A*y))*k;j=(C*y-j*B+ +g[e+380>>2])*k}W=m-+g[R+24>>2]-h;V=n-+g[R+28>>2]-i;U=o-+g[R+32>>2]-j;i=+g[d+376>>2]*+g[(c[(c[b+8>>2]|0)+8>>2]|0)+228>>2];y=1.0/k;Uh(T+72|0,q,(e|0)==0?23044:e+324|0,B,C,A);j=z+ +g[T+72>>2];k=+g[T+72+4>>2]+0.0;m=+g[T+72+8>>2]+0.0;n=+g[T+72+16>>2]+0.0;o=z+ +g[T+72+20>>2];q=+g[T+72+24>>2]+0.0;u=+g[T+72+32>>2]+0.0;v=+g[T+72+36>>2]+0.0;w=z+ +g[T+72+40>>2];x=1.0/(m*(n*v-o*u)+(j*(o*w-q*v)+k*(q*u-n*w)));r=c[b+4>>2]|0;h=z*+g[r+512>>2];i=(U-F*(W*N+V*O+U*F))*(U-F*(W*N+V*O+U*F))+((W-N*(W*N+V*O+U*F))*(W-N*(W*N+V*O+U*F))+(V-O*(W*N+V*O+U*F))*(V-O*(W*N+V*O+U*F)))>2]|0)+8>>2]|0)+204>>2]&3|0?r+388|0:r+384|0)>>2]|0;d=c[r+872>>2]|0;if((d|0)==(c[r+876>>2]|0)?(S=d|0?d<<1:1,(d|0)<(S|0)):0){if(!S)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((S*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[r+872>>2]|0}if((d|0)>0){e=0;do{Q=f+(e*104|0)|0;P=c[r+880>>2]|0;M=P+(e*104|0)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];c[Q+16>>2]=c[M+16>>2];c[Q+20>>2]=c[M+20>>2];c[Q+24>>2]=c[M+24>>2];Q=f+(e*104|0)+28|0;M=P+(e*104|0)+28|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=P+(e*104|0)+44|0;M=f+(e*104|0)+44|0;c[M>>2]=c[Q>>2];c[M+4>>2]=c[Q+4>>2];c[M+8>>2]=c[Q+8>>2];c[M+12>>2]=c[Q+12>>2];M=P+(e*104|0)+60|0;Q=f+(e*104|0)+60|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=f+(e*104|0)+76|0;P=P+(e*104|0)+76|0;c[Q>>2]=c[P>>2];c[Q+4>>2]=c[P+4>>2];c[Q+8>>2]=c[P+8>>2];c[Q+12>>2]=c[P+12>>2];c[Q+16>>2]=c[P+16>>2];c[Q+20>>2]=c[P+20>>2];c[Q+24>>2]=c[P+24>>2];e=e+1|0}while((e|0)!=(d|0))}d=c[r+880>>2]|0;if(d|0){if(a[r+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[r+880>>2]=0}a[r+884>>0]=1;c[r+880>>2]=f;c[r+876>>2]=S;d=c[r+872>>2]|0}Q=c[r+880>>2]|0;c[Q+(d*104|0)>>2]=s;g[Q+(d*104|0)+4>>2]=N;g[Q+(d*104|0)+8>>2]=O;g[Q+(d*104|0)+12>>2]=F;g[Q+(d*104|0)+16>>2]=0.0;g[Q+(d*104|0)+20>>2]=E;c[Q+(d*104|0)+24>>2]=R;g[Q+(d*104|0)+28>>2]=(n*v-o*u)*x*0.0+(y*(o*w-q*v)*x+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+32>>2]=(k*u-j*v)*x*0.0+(y*(m*v-k*w)*x+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+36>>2]=(j*o-k*n)*x*0.0+(y*(k*q-m*o)*x+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+40>>2]=0.0;g[Q+(d*104|0)+44>>2]=(n*v-o*u)*x*0.0+((o*w-q*v)*x*0.0+y*(q*u-n*w)*x);g[Q+(d*104|0)+48>>2]=(k*u-j*v)*x*0.0+((m*v-k*w)*x*0.0+y*(j*w-m*u)*x);g[Q+(d*104|0)+52>>2]=(j*o-k*n)*x*0.0+((k*q-m*o)*x*0.0+y*(m*n-j*q)*x);g[Q+(d*104|0)+56>>2]=0.0;g[Q+(d*104|0)+60>>2]=y*(n*v-o*u)*x+((o*w-q*v)*x*0.0+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+64>>2]=y*(k*u-j*v)*x+((m*v-k*w)*x*0.0+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+68>>2]=y*(j*o-k*n)*x+((k*q-m*o)*x*0.0+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+72>>2]=0.0;S=Q+(d*104|0)+76|0;g[S>>2]=B;g[Q+(d*104|0)+80>>2]=C;g[Q+(d*104|0)+84>>2]=A;g[Q+(d*104|0)+88>>2]=0.0;g[S+16>>2]=h;g[S+20>>2]=i;c[S+24>>2]=p;c[r+872>>2]=(c[r+872>>2]|0)+1;d=c[b+12>>2]|0;if(!d){l=T;return}if(c[d+204>>2]&3|0){l=T;return}if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=1;g[d+224>>2]=0.0;l=T;return} +function Ki(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9184;if(a[b+152>>0]|0?(d=c[b+96>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+96>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}f=c[b+160>>2]|0;if((f|0)>0){d=0;do{g=c[b+168>>2]|0;h=g+(d*20|0)+4|0;i=g+(d*20|0)+12|0;j=c[i>>2]|0;e=g+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+168>>2]|0;if(!d){a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}function Li(b){b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=9068;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;c[b+68>>2]=0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=c[b+16>>2]|0;c[f+(d<<4)>>2]=c[g+(d<<4)>>2];c[f+(d<<4)+4>>2]=c[g+(d<<4)+4>>2];c[f+(d<<4)+8>>2]=c[g+(d<<4)+8>>2];c[f+(d<<4)+12>>2]=c[g+(d<<4)+12>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}function Mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[d>>2]|0;d=c[b+328>>2]|0;a:do if((d|0)>0){f=c[b+336>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break;e=e+1|0;if((e|0)>=(d|0))break a}if((e|0)!=(d|0))return}while(0);if((d|0)==(c[b+332>>2]|0)?(h=d|0?d<<1:1,(d|0)<(h|0)):0){if(!h)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((h<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[b+328>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[b+336>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+336>>2]|0;if(e){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=f;c[b+332>>2]=h}c[(c[b+336>>2]|0)+(d<<2)>>2]=g;c[b+328>>2]=d+1;return}function Ni(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+28>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+32>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+28>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+32>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+28>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+32>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ni(a,b,e);if((f|0)<(d|0))b=f;else break}return}function Oi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){h=c[b+8>>2]|0;Zb[c[(c[h>>2]|0)+24>>2]&31](h,d,e,f,g);break}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;a[d+52>>0]=0;a[d+53>>0]=0;f=c[b+8>>2]|0;$b[c[(c[f>>2]|0)+20>>2]&7](f,d,e,e,1,g);if(a[d+53>>0]|0)if(!(a[d+52>>0]|0)){b=3;h=11}else b=3;else{b=4;h=11}if((h|0)==11){c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1}c[d+44>>2]=b;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function Pi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0,i=0,k=0.0,m=0.0,n=0.0;i=l;l=l+16|0;c[i>>2]=c[a+32>>2];c[i+4>>2]=c[a+32+4>>2];c[i+8>>2]=c[a+32+8>>2];c[i+12>>2]=c[a+32+12>>2];n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[i>>2]=n+ +g[i>>2];g[i+4>>2]=m+ +g[i+4>>2];g[i+8>>2]=k+ +g[i+8>>2];f=c[a+56>>2]|0;switch(f|0){case 0:{a=0;e=1;break}case 2:{a=2;e=0;break}default:{a=1;e=0}}n=+g[i+(e<<2)>>2];m=+g[i+(a<<2)>>2];h=(g[j>>2]=b*.25*n*n+b/12.0*m*m*4.0,c[j>>2]|0);a=(g[j>>2]=b*.5*n*n,c[j>>2]|0);switch(f|0){case 0:{e=h;f=h;break}case 2:{e=a;f=h;a=h;break}default:{e=h;f=a;a=h}}c[d>>2]=a;c[d+4>>2]=f;c[d+8>>2]=e;g[d+12>>2]=0.0;l=i;return}function Qi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[a>>2]=4060;if((c[a+104>>2]|0)<=0){a=a+60|0;gj(a);kj(a);return}k=0;do{j=c[(c[a+4>>2]|0)+744>>2]|0;h=(c[a+112>>2]|0)+(k<<3)+4|0;b=c[h>>2]|0;if((c[j+60>>2]|0)>0){g=0;do{i=(c[j+68>>2]|0)+(g<<2)|0;d=c[i>>2]|0;a:do if(d|0){e=0;do{f=e|0?e+280|0:i;e=d;while(1){d=c[e+280>>2]|0;if((c[e+276>>2]|0)!=(b|0))break;c[f>>2]=d;cJ(e);if(!d)break a;else e=d}}while((d|0)!=0)}while(0);g=g+1|0}while((g|0)<(c[j+60>>2]|0));b=c[h>>2]|0}if(b|0)Ib[c[(c[b>>2]|0)+4>>2]&511](b);k=k+1|0}while((k|0)<(c[a+104>>2]|0));a=a+60|0;gj(a);kj(a);return}function Ri(b){b=b|0;var d=0,e=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+64>>2]|0;if(d|0)do{c[b+64>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+64>>2]|0}while((d|0)!=0);d=c[b+48>>2]|0;if(d|0)do{c[b+48>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+48>>2]|0}while((d|0)!=0);d=c[b+32>>2]|0;if(!d)return;do{c[b+32>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+32>>2]|0}while((d|0)!=0);return}function Si(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=c[d>>2]|0;i=zb[c[(c[i>>2]|0)+56>>2]&31](i,28)|0;j=(a[b+4>>0]|0)==0;h=c[b+8>>2]|0;g=c[b+12>>2]|0;b=c[d>>2]|0;c[i+4>>2]=b;c[i>>2]=5792;a[i+8>>0]=0;c[i+12>>2]=0;if(j){a[i+16>>0]=0;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[i+8>>0]=1;return i|0}else{a[i+16>>0]=1;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[f+8>>2]|0,c[e+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[f+8>>2]|0,c[e+8>>2]|0)|0;a[i+8>>0]=1;return i|0}return 0}function Ti(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if(qD(b,c[d+8>>2]|0)|0)ml(d,e,f,g);else{j=a[d+52>>0]|0;k=a[d+53>>0]|0;l=c[b+12>>2]|0;a[d+52>>0]=0;a[d+53>>0]=0;ao(b+16|0,d,e,f,g,h);a:do if((l|0)>1){i=b+24|0;do{if(a[d+54>>0]|0)break a;if(!(a[d+52>>0]|0)){if(a[d+53>>0]|0?(c[b+8>>2]&1|0)==0:0)break a}else{if((c[d+24>>2]|0)==1)break a;if(!(c[b+8>>2]&2))break a}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,f,g,h);i=i+8|0}while(i>>>0<(b+16+(l<<3)|0)>>>0)}while(0);a[d+52>>0]=j;a[d+53>>0]=k}return}function Ui(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=(c[b>>2]|0)+1794895138|0;f=mB(c[b+8>>2]|0,n)|0;k=mB(c[b+12>>2]|0,n)|0;m=mB(c[b+16>>2]|0,n)|0;a:do if((f>>>0>>2>>>0?k>>>0<(d-(f<<2)|0)>>>0&m>>>0<(d-(f<<2)|0)>>>0:0)?((m|k)&3|0)==0:0){j=0;while(1){i=f>>>1;l=j+i|0;g=mB(c[b+((l<<1)+(k>>>2)<<2)>>2]|0,n)|0;h=mB(c[b+((l<<1)+(k>>>2)+1<<2)>>2]|0,n)|0;if(!(h>>>0>>0&g>>>0<(d-h|0)>>>0)){f=0;break a}if(a[b+(h+g)>>0]|0){f=0;break a}g=Vo(e,b+h|0)|0;if(!g)break;if((f|0)==1){f=0;break a}else{j=(g|0)<0?j:l;f=(g|0)<0?i:f-i|0}}g=mB(c[b+((l<<1)+(m>>>2)<<2)>>2]|0,n)|0;f=mB(c[b+((l<<1)+(m>>>2)+1<<2)>>2]|0,n)|0;if(f>>>0>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Vi(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0,m=0;f=l;l=l+48|0;if((c[b+128>>2]|0)<=0){l=f;return}e=0;do{m=c[b+136>>2]|0;c[f+32>>2]=(a[m+(e*284|0)+84>>0]|0)==0?1065353216:0;c[f+32+4>>2]=0;c[f+32+8>>2]=1065353216;g[f+32+12>>2]=0.0;k=m+(e*284|0)+140|0;c[f+16>>2]=c[k>>2];c[f+16+4>>2]=c[k+4>>2];c[f+16+8>>2]=c[k+8>>2];c[f+16+12>>2]=c[k+12>>2];k=c[b+112>>2]|0;h=c[(c[d>>2]|0)+16>>2]|0;j=+g[m+(e*284|0)+108+(k<<2)>>2]+ +g[f+16+4>>2];i=+g[m+(e*284|0)+124+(k<<2)>>2]+ +g[f+16+8>>2];g[f>>2]=+g[m+(e*284|0)+92+(k<<2)>>2]+ +g[f+16>>2];g[f+4>>2]=j;g[f+8>>2]=i;g[f+12>>2]=0.0;Vb[h&127](d,f+16|0,f,f+32|0);Vb[c[(c[d>>2]|0)+16>>2]&127](d,f+16|0,(c[b+136>>2]|0)+(e*284|0)+16|0,f+32|0);e=e+1|0}while((e|0)<(c[b+128>>2]|0));l=f;return}function Wi(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:{if((e|0)<1){g[a+232>>2]=d;c[a+300>>2]=c[a+300>>2]|512;return}if((e|0)<3){g[a+264>>2]=d;c[a+300>>2]=c[a+300>>2]|32;return}if((e|0)==3){g[a+248>>2]=d;c[a+300>>2]=c[a+300>>2]|2048;return}if((e|0)>=6)return;g[a+280>>2]=d;c[a+300>>2]=c[a+300>>2]|128;return}case 3:{if((e|0)<1){g[a+212>>2]=d;c[a+300>>2]=c[a+300>>2]|1;return}if((e|0)!=3)return;g[a+228>>2]=d;c[a+300>>2]=c[a+300>>2]|4;return}case 4:{if((e|0)<1){g[a+244>>2]=d;c[a+300>>2]=c[a+300>>2]|256;return}if((e|0)<3){g[a+276>>2]=d;c[a+300>>2]=c[a+300>>2]|16;return}if((e|0)==3){g[a+260>>2]=d;c[a+300>>2]=c[a+300>>2]|1024;return}if((e|0)>=6)return;g[a+292>>2]=d;c[a+300>>2]=c[a+300>>2]|64;return}default:return}}function Xi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;k=e+32+44|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);i=(+g[e>>2]-+g[e+16>>2])*.5;h=(+g[e+4>>2]-+g[e+16+4>>2])*.5;j=(+g[e+8>>2]-+g[e+16+8>>2])*.5;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b*.0833333283662796*((h+f)*2.0*(h+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+4>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+8>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(h+f)*2.0*(h+f)*2.0);g[d+12>>2]=0.0;l=e;return}function Yi(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0;l=c[b+780>>2]|0;a:do if(h?(k=c[b+792>>2]|0,(k|0)>0):0){i=c[b+800>>2]|0;h=0;while(1){j=c[i+(h*52|0)+24>>2]|0;if((j|0)==(l+(d*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(e*104|0)|0):0){h=10;break}if((j|0)==(l+(e*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(d*104|0)|0):0){h=10;break}h=h+1|0;if((h|0)>=(k|0))break a}if((h|0)==10)return}while(0);Xh(b,f);f=(c[b+792>>2]|0)+-1|0;k=c[b+800>>2]|0;c[k+(f*52|0)+24>>2]=l+(d*104|0);c[k+(f*52|0)+28>>2]=l+(e*104|0);o=+g[l+(d*104|0)+8>>2]-+g[l+(e*104|0)+8>>2];n=+g[l+(d*104|0)+12>>2]-+g[l+(e*104|0)+12>>2];m=+g[l+(d*104|0)+16>>2]-+g[l+(e*104|0)+16>>2];g[k+(f*52|0)+32>>2]=+D(+(o*o+n*n+m*m));a[b+984>>0]=1;return}function Zi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=+g[b+52>>2];i=+g[b+56>>2];f=+g[b+60>>2];if(!(a[b+84>>0]|0)){c[b+32>>2]=c[b+204>>2];g[b>>2]=-h;g[b+4>>2]=-i;g[b+8>>2]=-f;g[b+12>>2]=0.0;h=0.0;i=1.0;d=b+272|0;g[d>>2]=h;d=b+268|0;g[d>>2]=i;return}else{m=+g[b>>2];l=+g[b+4>>2];k=+g[b+8>>2];n=+g[b+16>>2]-+g[d+52>>2];p=+g[b+20>>2]-+g[d+56>>2];q=+g[b+24>>2]-+g[d+60>>2];j=+g[d+392>>2];r=+g[d+396>>2];o=+g[d+388>>2];j=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f)*(m*(j*q-p*r+ +g[d+372>>2])+l*(+g[d+376>>2]+(n*r-q*o))+k*(p*o-n*j+ +g[d+380>>2])):0.0;i=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f):10.0;d=b+272|0;g[d>>2]=j;d=b+268|0;g[d>>2]=i;return}}function _i(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;e=l;l=l+96|0;j=+g[c>>2];k=+g[c+4>>2];m=+g[c+8>>2];Qq(e+80|0,j,k,m,+Iy(j,k,m,+g[b>>2],+g[b+4>>2],+g[b+8>>2]));m=+g[e+80>>2];k=+g[e+80+4>>2];j=+g[e+80+8>>2];kq(e+64|0,+g[b>>2],+g[b+4>>2],+g[b+8>>2],m,k,j);Ap(e+48|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]);i=+g[e+48>>2];h=+g[e+48+4>>2];f=+g[e+48+8>>2];n=+XI(d);Qq(e+16|0,+g[e+64>>2],+g[e+64+4>>2],+g[e+64+8>>2],n);iq(e+32|0,m,k,j,+g[e+16>>2],+g[e+16+4>>2],+g[e+16+8>>2]);Qq(e,i,h,f,+WI(d));iq(a,+g[e+32>>2],+g[e+32+4>>2],+g[e+32+8>>2],+g[e>>2],+g[e+4>>2],+g[e+8>>2]);l=e;return}function $i(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c[b+228>>2]|0;if((f|0)==(c[b+232>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+228>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+236>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+236>>2]|0;if(g){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+228>>2]|0}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=h;c[b+232>>2]=i}c[(c[b+236>>2]|0)+(f<<2)>>2]=d;c[b+228>>2]=f+1;if(!e)return;ff(c[d+28>>2]|0,d);ff(c[d+32>>2]|0,d);return}function aj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[a+4>>2]|0;if(e|0)ll(e,b,d);a=c[a>>2]|0;if(!a)return;m=+g[b>>2];k=+g[a+128>>2];l=+g[b+4>>2];j=+g[b+8>>2];f=+g[d+4>>2];o=+g[d+8>>2];n=+g[d>>2];i=+g[a+180>>2]*(j*f-l*o)+ +g[a+184>>2]*(m*o-j*n)+(l*n-m*f)*+g[a+188>>2];h=(j*f-l*o)*+g[a+196>>2]+(m*o-j*n)*+g[a+200>>2]+(l*n-m*f)*+g[a+204>>2];f=(j*f-l*o)*+g[a+212>>2]+(m*o-j*n)*+g[a+216>>2]+(l*n-m*f)*+g[a+220>>2];g[a+276>>2]=m*k+ +g[a+276>>2];g[a+280>>2]=k*l+ +g[a+280>>2];g[a+284>>2]=k*j+ +g[a+284>>2];g[a+292>>2]=i+ +g[a+292>>2];g[a+296>>2]=h+ +g[a+296>>2];g[a+300>>2]=f+ +g[a+300>>2];c[a+312>>2]=(c[a+312>>2]|0)+1;return}function bj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;v=+g[a+552>>2];u=+g[a+568>>2];t=+g[a+584>>2];s=+g[b>>2];r=+g[b+4>>2];q=+g[b+8>>2];o=+g[b+16>>2];n=+g[b+20>>2];m=+g[b+24>>2];k=+g[b+32>>2];i=+g[b+36>>2];f=+g[b+40>>2];j=+g[a+556>>2];h=+g[a+572>>2];e=+g[a+588>>2];x=+g[a+620>>2];w=+g[a+636>>2];d=+g[a+652>>2];p=x*+g[c>>2]+w*+g[c+4>>2]+d*+g[c+8>>2];l=x*+g[c+16>>2]+w*+g[c+20>>2]+d*+g[c+24>>2];d=x*+g[c+32>>2]+w*+g[c+36>>2]+d*+g[c+40>>2];d=+L(+((v*s+u*r+t*q)*p+(v*o+u*n+t*m)*l+(v*k+u*i+t*f)*d),+((s*j+r*h+q*e)*p+(o*j+n*h+m*e)*l+(k*j+i*h+f*e)*d));return +(d*+g[a+732>>2])}function cj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=6576;d=c[b+84>>2]|0;g=c[d+8>>2]|0;if((g|0)>0){e=0;do{f=c[(c[d+16>>2]|0)+(e*12|0)+8>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);h=c[b+4>>2]|0;Ob[c[(c[h>>2]|0)+60>>2]&127](h,f)}e=e+1|0}while((e|0)!=(g|0));d=c[b+84>>2]|0}Rh(d);d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+100>>2]|0;if(!d){a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+100>>2]=0;a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}function dj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[a+8>>2]|0;if((d|0)>0){f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&2){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645650,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0))}if((c[a+228>>2]|0)<=0)return;d=0;do{g=c[(c[a+236>>2]|0)+(d<<2)>>2]|0;e=xb[c[(c[g>>2]|0)+36>>2]&127](g)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;f=Bb[c[(c[g>>2]|0)+40>>2]&63](g,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,f,1397641027,g);d=d+1|0}while((d|0)<(c[a+228>>2]|0));return}function ej(a){a=a|0;var b=0.0,d=0,e=0,f=0,h=0;e=l;l=l+32|0;c[a+36>>2]=1566444395;c[a+40>>2]=1566444395;c[a+44>>2]=1566444395;g[a+48>>2]=0.0;c[a+52>>2]=-581039253;c[a+56>>2]=-581039253;c[a+60>>2]=-581039253;g[a+64>>2]=0.0;if((c[a+20>>2]|0)<=0){l=e;return}d=0;do{f=c[a+28>>2]|0;h=c[f+(d*80|0)+64>>2]|0;Vb[c[(c[h>>2]|0)+8>>2]&127](h,f+(d*80|0)|0,e+16|0,e);b=+g[e+16>>2];if(+g[a+36>>2]>b)g[a+36>>2]=b;b=+g[e>>2];if(+g[a+52>>2]>2]=b;b=+g[e+16+4>>2];if(+g[a+40>>2]>b)g[a+40>>2]=b;b=+g[e+4>>2];if(+g[a+56>>2]>2]=b;b=+g[e+16+8>>2];if(+g[a+44>>2]>b)g[a+44>>2]=b;b=+g[e+8>>2];if(+g[a+60>>2]>2]=b;d=d+1|0}while((d|0)<(c[a+20>>2]|0));l=e;return}function fj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+64|0;h=c[d>>2]|0;g=d+(c[h+-8>>2]|0)|0;h=c[h+-4>>2]|0;c[i>>2]=e;c[i+4>>2]=d;c[i+8>>2]=2808;d=qD(h,e)|0;e=i+12|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));b[i+12+40>>1]=0;a[i+12+42>>0]=0;a:do if(d){c[i+48>>2]=1;$b[c[(c[h>>2]|0)+20>>2]&7](h,i,g,g,1,0);d=(c[i+24>>2]|0)==1?g:0}else{Zb[c[(c[h>>2]|0)+24>>2]&31](h,i,g,1,0);switch(c[i+36>>2]|0){case 0:{d=((c[i+40>>2]|0)==1?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1?c[i+20>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((c[i+24>>2]|0)!=1?!(((c[i+40>>2]|0)==0?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1):0){d=0;break}d=c[i+16>>2]|0}while(0);l=i;return d|0}function gj(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(d|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+72>>2]|0;if(!d){a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0;a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}function hj(){var b=0;b=Os()|0;c[b>>2]=5052;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+232>>2]=0;c[b+224>>2]=0;c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;return b|0}function ij(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=c[b+348>>2]|0;if((g|0)==(c[b+352>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+348>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+356>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+356>>2]|0;if(h){if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+348>>2]|0}c[b+356>>2]=0}a[b+360>>0]=1;c[b+356>>2]=i;c[b+352>>2]=j}c[(c[b+356>>2]|0)+(g<<2)>>2]=d;c[b+348>>2]=g+1;c[d+344>>2]=c[b+472>>2];Og(b,d,e<<16>>16,f<<16>>16);return}function jj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(i+(+g[e>>2]-+g[e+16>>2])*.5)*2.0;f=(i+(+g[e+4>>2]-+g[e+16+4>>2])*.5)*2.0;i=(i+(+g[e+8>>2]-+g[e+16+8>>2])*.5)*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);g[d+12>>2]=0.0;l=e;return}function kj(b){b=b|0;var d=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function lj(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;e=c[a+792>>2]|0;if((e|0)<=0)return;d=c[a+800>>2]|0;a=0;do{n=c[d+(a*52|0)+24>>2]|0;f=c[d+(a*52|0)+28>>2]|0;s=+g[n+40>>2];q=+g[n+44>>2];i=+g[n+48>>2];k=d+(a*52|0)+8|0;r=+g[k>>2];m=d+(a*52|0)+12|0;p=+g[m>>2];l=d+(a*52|0)+16|0;o=+g[l>>2];j=-(+g[d+(a*52|0)+48>>2]*((s-+g[f+40>>2])*r+(q-+g[f+44>>2])*p+(i-+g[f+48>>2])*o)*b);h=+g[n+88>>2]*j;g[n+40>>2]=s+r*h;g[n+44>>2]=q+p*h;g[n+48>>2]=o*h+i;j=+g[f+88>>2]*j;i=j*+g[m>>2];h=j*+g[l>>2];g[f+40>>2]=+g[f+40>>2]-+g[k>>2]*j;g[f+44>>2]=+g[f+44>>2]-i;g[f+48>>2]=+g[f+48>>2]-h;a=a+1|0}while((a|0)!=(e|0));return}function mj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+12>>2]|0;if(!e)return;if(!(a[b+8>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+12>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+56>>2]|0;if(!e)return;if(!(a[b+52>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+56>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function oj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+24>>2];i=+g[a+28>>2];j=+g[a+32>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+20>>2];if(f>h){g[a+20>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+20>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+20>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function pj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;h=c[d+4>>2]|0;if((h|0)<=0){c[b+4>>2]=h;return}c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)g=0;else{c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[g+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=g;c[b+8>>2]=h;e=0;f=g;do{c[f+(e<<2)>>2]=0;e=e+1|0;f=c[b+12>>2]|0}while((e|0)!=(h|0));c[b+4>>2]=h;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));return}function qj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+88>>2];i=+g[a+92>>2];j=+g[a+96>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+84>>2];if(f>h){g[a+84>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+84>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+84>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function rj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=i+ +g[a+32>>2];k=i+ +g[a+36>>2];i=i+ +g[a+40>>2];u=+C(+(+g[b>>2]));t=+C(+(+g[b+4>>2]));s=+C(+(+g[b+8>>2]));q=+C(+(+g[b+16>>2]));p=+C(+(+g[b+20>>2]));o=+C(+(+g[b+24>>2]));l=+C(+(+g[b+32>>2]));j=+C(+(+g[b+36>>2]));h=+C(+(+g[b+40>>2]));r=+g[b+48>>2];n=+g[b+52>>2];f=+g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function sj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+96|0;g=c[b+192>>2]|0;c[f+64>>2]=0;c[f+64+4>>2]=g;c[f+64+8>>2]=b;c[f+64+12>>2]=b+4;c[f+64+16>>2]=-1;c[f+64+20>>2]=-1;b=c[d+192>>2]|0;c[f+40>>2]=0;c[f+40+4>>2]=b;c[f+40+8>>2]=d;c[f+40+12>>2]=d+4;c[f+40+16>>2]=-1;c[f+40+20>>2]=-1;b=c[a+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,f+64|0,f+40|0,0,2)|0;if(!b){l=f;return}c[f+4>>2]=0;c[f+8>>2]=f+64;c[f+12>>2]=f+40;c[f>>2]=6324;c[f+36>>2]=e;c[f+32>>2]=c[e+12>>2];Zb[c[(c[b>>2]|0)+8>>2]&31](b,f+64|0,f+40|0,a+28|0,f);Ib[c[c[b>>2]>>2]&511](b);g=c[a+24>>2]|0;Ob[c[(c[g>>2]|0)+60>>2]&127](g,b);l=f;return}function tj(b){b=b|0;var d=0;c[b>>2]=8928;if(c[b+108>>2]|0){d=c[b+112>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+112>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+108>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+108>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+88>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+60>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}if(!(a[b+100>>0]|0))return;d=c[b+92>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+92>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function uj(b){b=b|0;var d=0,e=0,f=0,h=0.0;e=l;l=l+96|0;a[b+92>>0]=1;if((a[22496]|0)==0?Uz(22496)|0:0){c[6132]=1065353216;c[6133]=0;c[6134]=0;c[6135]=0;c[6136]=0;c[6137]=1065353216;c[6138]=0;c[6139]=0;c[6140]=0;c[6141]=0;c[6142]=1065353216;g[6143]=0.0;c[6144]=-1082130432;c[6145]=0;c[6146]=0;c[6147]=0;c[6148]=0;c[6149]=-1082130432;c[6150]=0;c[6151]=0;c[6152]=0;c[6153]=0;c[6154]=-1082130432;g[6155]=0.0}d=e;f=d+96|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(f|0));Vb[c[(c[b>>2]|0)+76>>2]&127](b,24528,e,6);h=+g[b+48>>2];g[b+76>>2]=+g[e>>2]+h;g[b+60>>2]=+g[e+48>>2]-h;g[b+80>>2]=+g[e+20>>2]+h;g[b+64>>2]=+g[e+68>>2]-h;g[b+84>>2]=+g[e+40>>2]+h;g[b+68>>2]=+g[e+88>>2]-h;l=e;return}function vj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;while(1){i=c[a+12>>2]|0;k=c[i+(((b+d|0)/2|0)<<3)>>2]|0;f=d;e=b;while(1){while(1){j=e+1|0;if((c[i+(e<<3)>>2]|0)<(k|0))e=j;else break}while(1){g=i+(f<<3)|0;h=f+-1|0;if((k|0)<(c[g>>2]|0))f=h;else break}if((e|0)<=(f|0)){l=i+(e<<3)|0;i=c[l>>2]|0;e=c[l+4>>2]|0;m=c[g+4>>2]|0;c[l>>2]=c[g>>2];c[l+4>>2]=m;f=(c[a+12>>2]|0)+(f<<3)|0;c[f>>2]=i;c[f+4>>2]=e;f=h;e=j}if((e|0)>(f|0))break;i=c[a+12>>2]|0}if((f|0)>(b|0))vj(a,b,f);if((e|0)<(d|0))b=e;else break}return}function wj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+72>>2]|0;if(!e)return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+72>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function xj(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;f=c[a+792>>2]|0;if((f|0)<=0)return;e=c[a+800>>2]|0;a=0;do{d=+g[e+(a*52|0)+40>>2];if(d>0.0?(h=c[e+(a*52|0)+24>>2]|0,i=c[e+(a*52|0)+28>>2]|0,j=+g[h+8>>2],k=+g[i+8>>2]-j,l=+g[h+12>>2],m=+g[i+12>>2]-l,n=+g[h+16>>2],o=+g[i+16>>2]-n,p=+g[e+(a*52|0)+44>>2],p+(k*k+m*m+o*o)>1.1920928955078125e-07):0){d=(p-(k*k+m*m+o*o))/(d*(p+(k*k+m*m+o*o)))*b;q=d*+g[h+88>>2];g[h+8>>2]=j-k*q;g[h+12>>2]=l-m*q;g[h+16>>2]=n-o*q;d=d*+g[i+88>>2];g[i+8>>2]=+g[i+8>>2]+k*d;g[i+12>>2]=m*d+ +g[i+12>>2];g[i+16>>2]=o*d+ +g[i+16>>2]}a=a+1|0}while((a|0)!=(f|0));return}function yj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;n=e+32+44|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);k=+g[e>>2];m=+g[e+16>>2];i=+g[e+4>>2];j=+g[e+16+4>>2];f=+g[e+8>>2];h=+g[e+16+8>>2];g[d>>2]=+D(+((k-m)*(k-m)+(i-j)*(i-j)+(f-h)*(f-h)))*.5;g[b>>2]=(m+k)*.5;g[b+4>>2]=(j+i)*.5;g[b+8>>2]=(h+f)*.5;g[b+12>>2]=0.0;l=e;return}function zj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=c[d+48>>2]|0;if((c[d+60>>2]|0)==2){Ag(b+44|0,h)|0;f=c[b+48>>2]|0;if(!f){f=b+48|0;g=1}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+48|0;g=1}}else{Ag(b+4|0,h)|0;f=c[b+8>>2]|0;if(!f){f=b+8|0;g=0}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+8|0;g=0}}c[f>>2]=h;f=b+4+(g*40|0)+12|0;c[f>>2]=(c[f>>2]|0)+-1;f=c[d+52>>2]|0;c[((f|0)==0?b+84+(c[d+60>>2]<<2)|0:f+56|0)>>2]=c[d+56>>2];f=c[d+56>>2]|0;if(f|0)c[f+52>>2]=c[d+52>>2];h=c[b+96>>2]|0;Sb[c[(c[h>>2]|0)+16>>2]&127](h,d,e);c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);a[b+154>>0]=1;return}function Aj(a,d,f,h){a=a|0;d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;i=c[a+108>>2]|0;if(i|0){Vb[c[(c[i>>2]|0)+28>>2]&127](i,d,f,h);return}i=b[a+56>>1]|0;if(!(i<<16>>16))return;m=1;k=1;do{j=c[a+68>>2]|0;if(b[j+(k<<2)>>1]&1){l=c[a+60>>2]|0;k=e[j+(k<<2)+2>>1]|0;if(!(+g[d>>2]>+g[l+(k<<6)+32>>2])?!(+g[f>>2]<+g[l+(k<<6)+16>>2]):0)j=1;else j=0;if(!(!(+g[d+8>>2]>+g[l+(k<<6)+40>>2])?!(+g[f+8>>2]<+g[l+(k<<6)+24>>2]):0))j=0;if(!(+g[d+4>>2]>+g[l+(k<<6)+36>>2])?!(+g[f+4>>2]<+g[l+(k<<6)+20>>2]|j^1):0){zb[c[(c[h>>2]|0)+8>>2]&31](h,l+(k<<6)|0)|0;i=b[a+56>>1]|0}}m=m+1<<16>>16;k=m&65535}while(k>>>0<((i&65535)<<1|1)>>>0);return}function Bj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0;h=+g[b>>2];i=+g[b+16>>2];j=h>2];if((j+g[a+24>>2])return;k=h>i?b:b+16|0;if(+g[(+g[k>>2]>f?k:b+32|0)>>2]<+g[a+8>>2])return;f=+g[b+8>>2];h=+g[b+24>>2];j=f>2];if((j+g[a+32>>2])return;k=f>h?b+8|0:b+24|0;if(+g[(+g[k>>2]>i?k:b+40|0)>>2]<+g[a+16>>2])return;f=+g[b+4>>2];h=+g[b+20>>2];j=f>2];if((j+g[a+28>>2])return;k=f>h?b+4|0:b+20|0;if(+g[(+g[k>>2]>i?k:b+36|0)>>2]<+g[a+12>>2])return;k=c[a+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,b,d,e);return}function Cj(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0;if(!(a[b+738>>0]|0)){c[d>>2]=5;c[d+4>>2]=1;e=+bj(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+728>>2]=e;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(!(h>=0.0))i=13;else{e=+mh(e-+g[b+688>>2],6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(e<-h){a[b+716>>0]=1;f=1.0;e=-(e+h)}else{if(!(e>h)){i=13;break}a[b+716>>0]=1;f=-1.0;e=h-e}g[b+708>>2]=e;g[b+712>>2]=f}while(0);if((i|0)==13?(a[b+737>>0]|0)==0:0)return;c[d>>2]=6;b=d+4|0}else{c[d>>2]=0;b=d+4|0}c[b>>2]=0;return}function Dj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0;f=l;l=l+16|0;c[a+4>>2]=c[b+24>>2];e=c[b>>2]|0;c[a+8>>2]=e;if(d){c[a+56>>2]=c[b+8>>2];c[a+56+4>>2]=c[b+8+4>>2];c[a+56+8>>2]=c[b+8+8>>2];c[a+56+12>>2]=c[b+8+12>>2];i=a+72|0;d=a+24|0;e=a+40|0;h=+g[b+24>>2];hq(i,d,e,h);h=+g[b+24>>2];l=f;return +h}else{d=gJ(OI(e)|0)|0;fm(f,d,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+56>>2]=c[f>>2];c[a+56+4>>2]=c[f+4>>2];c[a+56+8>>2]=c[f+8>>2];c[a+56+12>>2]=c[f+12>>2];d=a+72|0;e=a+24|0;i=a+40|0;h=+g[b+24>>2];hq(d,e,i,h);h=+g[b+24>>2];l=f;return +h}return 0.0}function Ej(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+16|0;g[b+32>>2]=f;c[b+8>>2]=c[d>>2];c[b+8+4>>2]=c[d+4>>2];c[b+8+8>>2]=c[d+8>>2];c[b+8+12>>2]=c[d+12>>2];i=+g[b+28>>2];k=+g[e+4>>2]-i*+g[d+4>>2];j=+g[e+8>>2]-i*+g[d+8>>2];g[h>>2]=+g[e>>2]-+g[d>>2]*i;g[h+4>>2]=k;g[h+8>>2]=j;g[h+12>>2]=0.0;f=+g[b+24>>2]+i+f;g[b+32>>2]=f;if(!(f<0.0)){b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}a[b+36>>0]=1;b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}function Fj(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0;if(!(c[j+52>>2]|0))return;if((c[j+20>>2]|0)<=0)return;e=0;while(1){d=c[a+28>>2]|0;if((d|0)>0){l=0.0;b=0;do{k=c[(c[a+116>>2]|0)+(b<<2)>>2]|0;i=c[a+36>>2]|0;h=c[a+16>>2]|0;m=+qb[c[a+220>>2]&31](h+((c[i+(k*152|0)+144>>2]|0)*244|0)|0,h+((c[i+(k*152|0)+148>>2]|0)*244|0)|0,i+(k*152|0)|0);l=l+m*m;b=b+1|0}while((b|0)!=(d|0))}else l=0.0;if(l<=+g[j+92>>2]){b=8;break}k=c[j+20>>2]|0;i=e;e=e+1|0;if(!((i|0)<(k+-1|0)&(e|0)<(k|0))){b=8;break}}if((b|0)==8)return}function Gj(b,d){b=b|0;d=d|0;c[b+204>>2]=c[d+48>>2];c[b+208>>2]=c[d+52>>2];c[b+212>>2]=c[d+56>>2];c[b+216>>2]=c[d+60>>2];c[b+220>>2]=c[d+64>>2];c[b+224>>2]=c[d+68>>2];c[b+156>>2]=c[d>>2];c[b+156+4>>2]=c[d+4>>2];c[b+156+8>>2]=c[d+8>>2];c[b+156+12>>2]=c[d+12>>2];c[b+172>>2]=c[d+16>>2];c[b+172+4>>2]=c[d+16+4>>2];c[b+172+8>>2]=c[d+16+8>>2];c[b+172+12>>2]=c[d+16+12>>2];c[b+188>>2]=c[d+32>>2];c[b+188+4>>2]=c[d+32+4>>2];c[b+188+8>>2]=c[d+32+8>>2];c[b+188+12>>2]=c[d+32+12>>2];c[b+228>>2]=c[d+72>>2];g[b+232>>2]=0.0;g[b+252>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+256>>2]=0.0;g[b+244>>2]=.10000000149011612;a[b+260>>0]=a[d+80>>0]&1;c[b+248>>2]=c[d+76>>2];return}function Hj(a,b){a=a|0;b=+b;var d=0,e=0;d=c[a+84>>2]|0;if(d|0)Jb[d&31](a,b);Jb[c[(c[a>>2]|0)+140>>2]&31](a,b);g[a+28>>2]=b;c[a+32>>2]=0;c[a+48>>2]=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Jb[c[(c[a>>2]|0)+164>>2]&31](a,b);Ib[c[(c[a>>2]|0)+44>>2]&511](a);Ib[c[(c[a>>2]|0)+148>>2]&511](a);g[a+104>>2]=b;Ob[c[(c[a>>2]|0)+152>>2]&127](a,a+92|0);Jb[c[(c[a>>2]|0)+144>>2]&31](a,b);if((c[a+296>>2]|0)>0){d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0))}Jb[c[(c[a>>2]|0)+156>>2]&31](a,b);d=c[a+80>>2]|0;if(!d)return;Jb[d&31](a,b);return}function Ij(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0;f=l;l=l+16|0;c[b+4>>2]=d;c[b>>2]=4652;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=e;if((a[22480]|0)==0?Uz(22480)|0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;ef(23152,0.0,0,0,f)}c[5839]=c[5839]|1;g[5889]=0.0;h=+g[5899]*0.0;i=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=h;g[5896]=i;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;i=+g[5891]*0.0;h=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=i;g[5945]=h;g[5946]=0.0;c[b+32>>2]=23152;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;l=f;return}function Jj(a){a=a|0;var b=0;c[a>>2]=3244;b=c[a+88>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+88>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+92>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+92>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+96>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+96>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+100>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+100>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+104>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+104>>2]|0;if(!b){nf(a);return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);nf(a);return}function Kj(b,d){b=b|0;d=d|0;var e=0,f=0;a:do if((d|0)!=0&(b&3|0)!=0){e=d;while(1){if(!(a[b>>0]|0))break a;b=b+1|0;d=e+-1|0;if((d|0)!=0&(b&3|0)!=0)e=d;else{e=d;d=(d|0)!=0;f=4;break}}}else{e=d;d=(d|0)!=0;f=4}while(0);b:do if((f|0)==4)if(d){if(a[b>>0]|0){c:do if(e>>>0>3)while(1){d=c[b>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){f=10;break c}}else f=10;while(0);if((f|0)==10)if(!e){e=0;break}while(1){if(!(a[b>>0]|0))break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}else e=0;while(0);return (e|0?b:0)|0}function Lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0;m=c[b+56>>2]|0;l=c[m+32>>2]|0;b=c[l>>2]|0;m=c[m+24>>2]|0;if((m|0)<=1){m=b;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}j=+g[d>>2];k=+g[d+4>>2];i=+g[d+8>>2];d=0;h=1;e=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];while(1){b=c[l+(h<<2)>>2]|0;f=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];b=f>e;d=b?h:d;h=h+1|0;if((h|0)==(m|0))break;else e=b?f:e}m=c[l+(d<<2)>>2]|0;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}function Mj(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;n=+g[a+4>>2];h=+g[a+456>>2];m=+g[a+8>>2];e=+g[a+460>>2];l=+g[a+12>>2];c=+g[a+464>>2];k=+g[a+20>>2];j=+g[a+24>>2];i=+g[a+28>>2];f=+g[a+36>>2];d=+g[a+40>>2];b=+g[a+44>>2];g[a+324>>2]=n*h*n+m*e*m+l*c*l;g[a+328>>2]=n*h*k+m*e*j+l*c*i;g[a+332>>2]=n*h*f+m*e*d+l*c*b;g[a+336>>2]=0.0;g[a+340>>2]=h*k*n+e*j*m+c*i*l;g[a+344>>2]=h*k*k+e*j*j+c*i*i;g[a+348>>2]=h*k*f+e*j*d+c*i*b;g[a+352>>2]=0.0;g[a+356>>2]=h*f*n+e*d*m+c*b*l;g[a+360>>2]=h*f*k+e*d*j+c*b*i;g[a+364>>2]=h*f*f+e*d*d+c*b*b;g[a+368>>2]=0.0;return}function Nj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0;h=l;l=l+16|0;if((e|0)<=0){l=h;return}f=0;do{p=+g[b+(f<<4)>>2];o=+g[b+(f<<4)+4>>2];n=+g[b+(f<<4)+8>>2];m=p*+g[a+60>>2]+o*+g[a+64>>2]+n*+g[a+68>>2];k=p*+g[a+76>>2]+o*+g[a+80>>2]+n*+g[a+84>>2];n=p*+g[a+92>>2]+o*+g[a+96>>2]+n*+g[a+100>>2];g[h>>2]=m;g[h+4>>2]=k;g[h+8>>2]=n;g[h+12>>2]=0.0;j=a+60+((+g[h+((m>2]>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=f+1|0}while((f|0)!=(e|0));l=h;return}function Oj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=5944;e=c[b+8>>2]|0;d=c[b+16>>2]|0;if((e|0)>0){h=0;do{f=(c[d+(h<<2)>>2]|0)+188|0;g=c[f>>2]|0;if(g){e=c[b+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,g,c[b+24>>2]|0);e=c[b+68>>2]|0;Sb[c[(c[e>>2]|0)+12>>2]&127](e,g,c[b+24>>2]|0);c[f>>2]=0;e=c[b+8>>2]|0;d=c[b+16>>2]|0}h=h+1|0}while((h|0)<(e|0))}if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Pj(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0;c[a+264>>2]=c[b>>2];c[a+264+4>>2]=c[b+4>>2];c[a+264+8>>2]=c[b+8>>2];c[a+264+12>>2]=c[b+12>>2];d=c[a+248>>2]|0;if((d|0)<=0)return;h=0;do{f=c[(c[a+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if(!(c[f+564>>2]&1)){e=+g[f+404>>2];if(e!=0.0){j=1.0/e*+g[b+4>>2];i=1.0/e*+g[b+8>>2];g[f+424>>2]=1.0/e*+g[b>>2];g[f+428>>2]=j;g[f+432>>2]=i;g[f+436>>2]=0.0}c[f+440>>2]=c[b>>2];c[f+440+4>>2]=c[b+4>>2];c[f+440+8>>2]=c[b+8>>2];c[f+440+12>>2]=c[b+12>>2];d=c[a+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));return}function Qj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0.0,i=0.0,k=0.0;e=c[a+204>>2]|0;if(b==0.0){c[a+204>>2]=e|1;h=0.0}else{c[a+204>>2]=e&-2;h=1.0/b}g[a+404>>2]=h;k=+g[a+444>>2]*b;i=+g[a+448>>2]*b;g[a+424>>2]=+g[a+440>>2]*b;g[a+428>>2]=k;g[a+432>>2]=i;g[a+436>>2]=0.0;b=+g[d>>2];f=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+4>>2];e=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+8>>2];d=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;c[a+456>>2]=f;c[a+460>>2]=e;c[a+464>>2]=d;g[a+468>>2]=0.0;i=h*+g[a+412>>2];k=h*+g[a+416>>2];g[a+620>>2]=+g[a+408>>2]*h;g[a+624>>2]=i;g[a+628>>2]=k;g[a+632>>2]=0.0;return}function Rj(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0;f=l;l=l+256|0;e=c[b+212>>2]|0;if((e|0)>-1){a=e;l=f;return a|0}h=(c[b+252>>2]&2|0)==0;e=h?0:b;do if(!h){if(!(+g[e+404>>2]!=0.0)?(c[e+204>>2]&2|0)==0:0)break;h=c[a+8>>2]|0;Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,b,d);c[b+212>>2]=h;l=f;return h|0}while(0);e=c[a+188>>2]|0;if((e|0)>=0){h=e;l=f;return h|0}c[a+188>>2]=c[a+8>>2];Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,0,d);h=c[a+188>>2]|0;l=f;return h|0}function Sj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];i=+D(+(e*e+f*f+i*i));h=c[b+68>>2]|0;if(+g[d+(l<<2)>>2]>i*+g[b+56>>2]){g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;k=0.0;l=c[b+76>>2]|0;l=a+(l<<2)|0;g[l>>2]=k;return}i=+g[d+(h<<2)>>2];j=c[b+76>>2]|0;e=+g[d+(j<<2)>>2];f=+D(+(i*i+e*e));if(f>1.1920928955078125e-07){f=+g[b+60>>2]/f;g[a+(h<<2)>>2]=i*f;g[a+(l<<2)>>2]=-k;k=e*f;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;k=0.0;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}}function Tj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+296>>2]|0;if((e|0)==(c[b+300>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+296>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+304>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+304>>2]|0;if(f){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+296>>2]|0}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=g;c[b+300>>2]=h}c[(c[b+304>>2]|0)+(e<<2)>>2]=d;c[b+296>>2]=e+1;return}function Uj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;n=c[b+100>>2]|0;if((n|0)<=0){c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;n=a+12|0;g[n>>2]=0.0;return}o=+g[b+16>>2];p=+g[d>>2]*o;k=+g[b+20>>2];l=+g[d+4>>2]*k;m=+g[b+24>>2];j=+g[d+8>>2]*m;f=c[b+108>>2]|0;d=-1;b=0;e=-3402823466385288598117041.0e14;while(1){h=p*+g[f+(b<<4)>>2]+l*+g[f+(b<<4)+4>>2]+j*+g[f+(b<<4)+8>>2];i=h>e;d=i?b:d;b=b+1|0;if((b|0)==(n|0))break;else e=i?h:e}l=+g[f+(d<<4)+4>>2]*k;p=+g[f+(d<<4)+8>>2]*m;g[a>>2]=+g[f+(d<<4)>>2]*o;g[a+4>>2]=l;g[a+8>>2]=p;n=a+12|0;g[n>>2]=0.0;return}function Vj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(+g[e>>2]-+g[e+16>>2])*.5*2.0;f=(+g[e+4>>2]-+g[e+16+4>>2])*.5*2.0;i=(+g[e+8>>2]-+g[e+16+8>>2])*.5*2.0;g[d>>2]=b/12.0*(f*f+i*i);g[d+4>>2]=b/12.0*(h*h+i*i);g[d+8>>2]=b/12.0*(h*h+f*f);l=e;return}function Wj(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=gt()|0;Ij(e,3,b);c[e>>2]=4828;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+20>>2]+j*+g[b+24>>2]+i*+g[b+28>>2]+ +g[b+56>>2];f=k*+g[b+36>>2]+j*+g[b+40>>2]+i*+g[b+44>>2]+ +g[b+60>>2];g[e+316>>2]=k*+g[b+4>>2]+j*+g[b+8>>2]+i*+g[b+12>>2]+ +g[b+52>>2];g[e+320>>2]=h;g[e+324>>2]=f;g[e+328>>2]=0.0;c[e+332>>2]=0;a[e+344>>0]=0;g[e+348>>2]=.30000001192092896;g[e+352>>2]=1.0;g[e+356>>2]=0.0;return e|0}function Xj(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0,f=0;if(b>=c)return +a;if(a3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(c-a,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=e<+C(+d);a=f?a:a+6.2831854820251465;return +a}if(!(a>c))return +a;d=+mh(a-c,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(a-b,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=+C(+d)>2]|0)>(c[d+12>>2]|0);f=c[(e?d:b)+12>>2]|0;e=c[(e?b:d)+12>>2]|0;b=(((e<<16|f)+~((e<<16|f)<<15)|0)>>>10^(e<<16|f)+~((e<<16|f)<<15))*9|0;b=(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11))&(c[a+12>>2]|0)+-1;if((b|0)>=(c[a+32>>2]|0)){g=0;return g|0}b=c[(c[a+40>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){g=0;return g|0}d=c[a+16>>2]|0;while(1){if((c[(c[d+(b<<4)>>2]|0)+12>>2]|0)==(f|0)?(c[(c[d+(b<<4)+4>>2]|0)+12>>2]|0)==(e|0):0)break;b=c[(c[a+60>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){b=0;g=8;break}}if((g|0)==8)return b|0;g=d+(b<<4)|0;return g|0}function Zj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0)){l=e;return}i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function _j(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0.0,h=0.0;f=+g[a+692>>2];do if(f>0.0){h=+g[a+688>>2];e=+mh(b-h,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(!(e<-f)&e<=f))if(e>0.0){b=+mh(f+h,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}else{b=+mh(h-f,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}}while(0);g[a+680>>2]=(b-+bj(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0))/d;return}function $j(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:{if((c|0)<1){d=+g[a+232>>2];break a}if((c|0)<3){d=+g[a+264>>2];break a}if((c|0)==3){d=+g[a+248>>2];break a}if((c|0)<6)d=+g[a+280>>2];else d=3402823466385288598117041.0e14;break}case 3:{if((c|0)<1){d=+g[a+212>>2];break a}if((c|0)==3)d=+g[a+228>>2];else d=3402823466385288598117041.0e14;break}case 4:{if((c|0)<1){d=+g[a+244>>2];break a}if((c|0)<3){d=+g[a+276>>2];break a}if((c|0)==3){d=+g[a+260>>2];break a}if((c|0)<6)d=+g[a+292>>2];else d=3402823466385288598117041.0e14;break}default:d=3402823466385288598117041.0e14}while(0);return +d}function ak(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0)e=+g[b+36>>2];else e=+D(+(e*e+f*f+h*h));g[b+32>>2]=e;g[b+20>>2]=e;a[b+249>>0]=1;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0){i=+g[b+256>>2];f=+g[b+260>>2];e=+g[b+264>>2];d=b+268|0}else{j=1.0/+D(+(e*e+f*f+h*h));i=e*j;f=f*j;e=h*j;d=d+12|0}d=c[d>>2]|0;g[b+272>>2]=i;g[b+276>>2]=f;g[b+280>>2]=e;c[b+284>>2]=d;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function bk(b){b=b|0;var d=0;c[b>>2]=4080;if(a[b+476>>0]|0?(d=c[b+472>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+472>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+440>>2]|0;if(d|0){if(a[b+444>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+440>>2]=0}a[b+444>>0]=1;c[b+440>>2]=0;c[b+432>>2]=0;c[b+436>>2]=0;d=c[b+356>>2]|0;if(!d){a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+356>>2]=0;a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}function ck(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;d=l;l=l+64|0;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;i=+g[b>>2];f=+g[b+4>>2];m=+g[b+8>>2];j=+g[b+12>>2];h=i*(2.0/(i*i+f*f+m*m+j*j));e=f*(2.0/(i*i+f*f+m*m+j*j));k=m*(2.0/(i*i+f*f+m*m+j*j));g[d>>2]=1.0-(f*e+m*k);g[d+4>>2]=i*e-j*k;g[d+8>>2]=i*k+j*e;g[d+12>>2]=0.0;g[d+16>>2]=i*e+j*k;g[d+20>>2]=1.0-(i*h+m*k);g[d+24>>2]=f*k-j*h;g[d+28>>2]=0.0;g[d+32>>2]=i*k-j*e;g[d+36>>2]=f*k+j*h;g[d+40>>2]=1.0-(i*h+f*e);g[d+44>>2]=0.0;Ld(a,d);l=d;return}function dk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0,n=0,o=0;f=l;l=l+48|0;Sb[c[(c[a>>2]|0)+124>>2]&127](a,f+32|0,e);o=c[f+32>>2]|0;n=c[f+32+4>>2]|0;m=c[f+32+8>>2]|0;c[b>>2]=o;c[b+4>>2]=n;c[b+8>>2]=m;g[b+12>>2]=0.0;e=c[(c[a>>2]|0)+64>>2]|0;k=-(c[j>>2]=o,+g[j>>2]);i=-(c[j>>2]=n,+g[j>>2]);h=-(c[j>>2]=m,+g[j>>2]);g[f>>2]=k;g[f+4>>2]=i;g[f+8>>2]=h;g[f+12>>2]=0.0;Sb[e&127](f+16|0,a,f);c[d>>2]=c[f+16>>2];c[d+4>>2]=c[f+16+4>>2];c[d+8>>2]=c[f+16+8>>2];c[d+12>>2]=c[f+16+12>>2];l=f;return}function ek(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function fk(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;h=l;l=l+48|0;c[h+32>>2]=e;c[h+32+4>>2]=f;n=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];k=+g[a+56>>2]*n+ +g[a+60>>2]*m+ +g[a+64>>2]*i;j=n*+g[a+72>>2]+m*+g[a+76>>2]+i*+g[a+80>>2];i=n*+g[a+88>>2]+m*+g[a+92>>2]+i*+g[a+96>>2];c[h>>2]=c[a+48>>2];c[h+4>>2]=h+32;g[h+8>>2]=k;g[h+12>>2]=j;g[h+16>>2]=i;g[h+20>>2]=0.0;g[h+24>>2]=d;f=c[a+44>>2]|0;d=+qb[c[(c[f>>2]|0)+12>>2]&31](f,h,1);l=h;return +d}function gk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;c[a+4>>2]=c[b+40>>2];e=c[b>>2]|0;c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=gJ(OI(e)|0)|0;fm(f,e,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+48>>2]=c[f>>2];c[a+48+4>>2]=c[f+4>>2];c[a+48+8>>2]=c[f+8>>2];c[a+48+12>>2]=c[f+12>>2]}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];l=f;return +(+g[b+40>>2])}function hk(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if(e>>>0<3)switch(b|0){case 2:{g[a+756+(e<<2)>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>>0>=3)return;switch(b|0){case 2:{g[a+868+(e+-3<<6)+32>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>2]=3;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4828;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[f>>2];c[h+316+4>>2]=c[f+4>>2];c[h+316+8>>2]=c[f+8>>2];c[h+316+12>>2]=c[f+12>>2];c[h+332>>2]=0;a[h+344>>0]=0;g[h+348>>2]=.30000001192092896;g[h+352>>2]=1.0;g[h+356>>2]=0.0;return h|0}function jk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[b+252>>2]|0;if((b|0)==0|(d|0)!=8)if((b|0)==0|(d&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1}ki(a,b);return}function kk(b){b=b|0;var d=0;c[b>>2]=4580;d=c[b+80>>2]|0;if(d|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+72>>2]=0;c[b+76>>2]=0;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(!d){a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}function lk(b){b=b|0;var d=0;c[b>>2]=9068;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function mk(b){b=b|0;var d=0;c[b>>2]=5768;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}function nk(b){b=b|0;var d=0;c[b>>2]=9668;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ok(b){b=b|0;var d=0,e=0,f=0;e=Ds(10448)|0;c[e>>2]=5444;c[e+4>>2]=2;a[e+24>>0]=1;c[e+20>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+28>>2]=5916;g[e+60>>2]=0.0;c[e+10444>>2]=b;c[e+64>>2]=79;c[e+68>>2]=xb[c[(c[b>>2]|0)+12>>2]&127](b)|0;c[e+72>>2]=xb[c[(c[b>>2]|0)+8>>2]&127](b)|0;b=0;do{d=0;do{f=c[e+10444>>2]|0;c[e+76+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+16>>2]&63](f,b,d)|0;f=c[e+10444>>2]|0;c[e+5260+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+20>>2]&63](f,b,d)|0;d=d+1|0}while((d|0)<36);b=b+1|0}while((b|0)<36);return e|0}function pk(){var a=0,b=0,d=0,e=0;e=l;l=l+48|0;a=ts()|0;if(a|0?(d=c[a>>2]|0,d|0):0){b=c[d+48>>2]|0;a=c[d+48+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){c[e+24>>2]=21877;Ww(21827,e+24|0)}if((b|0)==1126902529&(a|0)==1129074247)a=c[d+44>>2]|0;else a=d+80|0;c[e+36>>2]=a;d=c[d>>2]|0;a=c[d+4>>2]|0;if(ql(2784,d,e+36|0)|0){d=c[e+36>>2]|0;d=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;c[e>>2]=21877;c[e+4>>2]=a;c[e+8>>2]=d;Ww(21741,e)}else{c[e+16>>2]=21877;c[e+16+4>>2]=a;Ww(21786,e+16|0)}}Ww(21865,e+32|0)}function qk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=1;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[f+8>>2];c[b+20>>2]=c[e+8>>2];gj(b+72|0);return b|0}function rk(b){b=b|0;var d=0;c[b>>2]=5400;d=c[b+344>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+344>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function sk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=0;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[e+8>>2];c[b+20>>2]=c[f+8>>2];gj(b+72|0);return b|0}function tk(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=h|0;var i=0;i=l;l=l+64|0;c[i+48>>2]=f;c[i+48+4>>2]=h;f=c[a+212>>2]|0;if(!(+g[f+4>>2]>=e)){l=i;return +e}c[i>>2]=c[a+216>>2];c[i+4>>2]=i+48;c[i+8>>2]=c[b>>2];c[i+8+4>>2]=c[b+4>>2];c[i+8+8>>2]=c[b+8>>2];c[i+8+12>>2]=c[b+12>>2];c[i+24>>2]=c[d>>2];c[i+24+4>>2]=c[d+4>>2];c[i+24+8>>2]=c[d+8>>2];c[i+24+12>>2]=c[d+12>>2];g[i+40>>2]=e;e=+qb[c[(c[f>>2]|0)+12>>2]&31](f,i,1);l=i;return +e}function uk(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Ts()|0;He(i,b,d,e,f,h);c[i>>2]=4764;c[i+4>>2]=9;a[i+1309>>0]=0;g[i+1316>>2]=0.0;g[i+1340>>2]=0.0;g[i+1364>>2]=1.0;a[i+1310>>0]=0;g[i+1320>>2]=0.0;g[i+1344>>2]=0.0;g[i+1368>>2]=1.0;a[i+1311>>0]=0;g[i+1324>>2]=0.0;g[i+1348>>2]=0.0;g[i+1372>>2]=1.0;a[i+1312>>0]=0;g[i+1328>>2]=0.0;g[i+1352>>2]=0.0;g[i+1376>>2]=1.0;a[i+1313>>0]=0;g[i+1332>>2]=0.0;g[i+1356>>2]=0.0;g[i+1380>>2]=1.0;a[i+1314>>0]=0;g[i+1336>>2]=0.0;g[i+1360>>2]=0.0;g[i+1384>>2]=1.0;return i|0}function vk(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;c=l;l=l+48|0;d=2.0/+EF(b);f=+g[(gJ(b)|0)>>2];e=+g[(OI(b)|0)>>2];i=+g[(NI(b)|0)>>2];h=+g[(MI(b)|0)>>2];g[c+32>>2]=1.0-(e*e*d+i*i*d);g[c+28>>2]=f*e*d-h*i*d;g[c+24>>2]=f*i*d+h*e*d;g[c+20>>2]=f*e*d+h*i*d;g[c+16>>2]=1.0-(f*f*d+i*i*d);g[c+12>>2]=e*i*d-h*f*d;g[c+8>>2]=f*i*d-h*e*d;g[c+4>>2]=e*i*d+h*f*d;g[c>>2]=1.0-(f*f*d+e*e*d);Ip(a,c+32|0,c+28|0,c+24|0,c+20|0,c+16|0,c+12|0,c+8|0,c+4|0,c);l=c;return}function wk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[e+16>>2]|0;if(!f){if(!(bp(e)|0)){g=c[e+16>>2]|0;h=5}}else{g=f;h=5}a:do if((h|0)==5){f=c[e+20>>2]|0;if((g-f|0)>>>0>>0){Bb[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){h=d;while(1){if(!h){g=b;break b}g=h+-1|0;if((a[b+g>>0]|0)==10)break;else h=g}if((Bb[c[e+36>>2]&63](e,b,h)|0)>>>0>>0)break a;g=b+h|0;d=d-h|0;f=c[e+20>>2]|0}else g=b;while(0);gi(f|0,g|0,d|0)|0;c[e+20>>2]=(c[e+20>>2]|0)+d}while(0);return}function xk(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function yk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function zk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=l;l=l+48|0;e=$G(b,0)|0;g[d+32>>2]=+Dp(c,e);g[d+28>>2]=+ep(c,e);g[d+24>>2]=+dp(c,e);e=$G(b,1)|0;g[d+20>>2]=+Dp(c,e);g[d+16>>2]=+ep(c,e);g[d+12>>2]=+dp(c,e);b=$G(b,2)|0;g[d+8>>2]=+Dp(c,b);g[d+4>>2]=+ep(c,b);g[d>>2]=+dp(c,b);Sq(a,d+32|0,d+28|0,d+24|0,d+20|0,d+16|0,d+12|0,d+8|0,d+4|0,d);l=d;return}function Ak(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+F(+c);h=+G(+c);c=+g[b+444>>2];if(+C(+i)>1.1920928955078125e-07){j=+g[b+448>>2];e=h*h;f=i*i;c=+D(+((h*h/(i*i)+1.0)/(1.0/(j*j)+h*h/(i*i)/(c*c))))}else{e=h*h;f=i*i}c=c*.5;j=+G(+c)/+D(+(f+0.0+e));c=+F(+c);k=c*d+i*j*0.0-h*j*-0.0;f=c*0.0-h*j*d-j*0.0*0.0;e=c*0.0+j*0.0*0.0-i*j*d;d=-(j*0.0*d)-i*j*0.0-h*j*-0.0;g[a>>2]=h*j*f+(c*k+d*-(j*0.0))-e*-(i*j);g[a+4>>2]=e*-(j*0.0)+(c*f+d*-(i*j))-h*j*k;g[a+8>>2]=k*-(i*j)+(h*j*d+c*e)-f*-(j*0.0);g[a+12>>2]=0.0;return}function Bk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+248>>0]=0;a[b+249>>0]=0;g[b+252>>2]=0.0;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;b=c[(c[b+8>>2]|0)+344>>2]|0;if((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)<=0)return;do{f=c[b>>2]|0;h=c[f+12>>2]|0;f=c[c[(xb[c[f+28>>2]&127](b)|0)+12>>2]>>2]|0;e=c[(c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+12>>2]|0)+4>>2]|0;Cb[h&31](b,f,e,c[d+24>>2]|0)|0}while((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)>0);return}function Ck(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[6131]=(c[6131]|0)+-1;Ob[c[(c[a>>2]|0)+20>>2]&127](a,b);e=c[b+800>>2]|0;d=(c[a+12>>2]|0)+-1|0;g=c[a+20>>2]|0;f=c[g+(e<<2)>>2]|0;c[g+(e<<2)>>2]=c[g+(d<<2)>>2];c[(c[a+20>>2]|0)+(d<<2)>>2]=f;c[(c[(c[a+20>>2]|0)+(e<<2)>>2]|0)+800>>2]=e;c[a+12>>2]=d;a=c[a+72>>2]|0;if(!b)return;g=c[a+16>>2]|0;if(g>>>0<=b>>>0?(g+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Dk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=c[b+8>>2]|0;if((k|0)<=0)return;j=c[b+16>>2]|0;i=0;b=0;do{h=c[j+(i<<2)>>2]|0;if(!(c[h+204>>2]&3)){g=c[a+16>>2]|0;e=g+(b<<3)|0;d=c[e>>2]|0;if((d|0)==(b|0))d=b;else{f=d;do{d=g+(f<<3)|0;c[e>>2]=c[d>>2];d=c[d>>2]|0;e=g+(d<<3)|0;f=c[e>>2]|0}while((d|0)!=(f|0))}c[h+208>>2]=d;c[g+(b<<3)+4>>2]=i;c[h+212>>2]=-1;b=b+1|0}else{c[h+208>>2]=-1;c[h+212>>2]=-2}i=i+1|0}while((i|0)!=(k|0));return}function Ek(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0;while(1){g=c[a+12>>2]|0;if(!(((e[f>>1]|0)>=(e[a>>1]|0)?(e[d>>1]|0)<=(e[a+6>>1]|0):0)&(e[d+4>>1]|0)<=(e[a+10>>1]|0)&(e[f+4>>1]|0)>=(e[a+4>>1]|0)&(e[d+2>>1]|0)<=(e[a+8>>1]|0)&(e[f+2>>1]|0)>=(e[a+2>>1]|0))){h=6;break}if((g|0)>-1)break;i=a+16|0;Ek(i,b,d,f);g=c[a+28>>2]|0;a=i+(((g|0)>-1?1:0-g|0)<<4)|0}if((h|0)==6)return;Sb[c[(c[b>>2]|0)+8>>2]&127](b,g>>>21,g&2097151);return}function Fk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=Ts()|0;Yd(f,b,d,e);c[f>>2]=4764;c[f+4>>2]=9;a[f+1309>>0]=0;g[f+1316>>2]=0.0;g[f+1340>>2]=0.0;g[f+1364>>2]=1.0;a[f+1310>>0]=0;g[f+1320>>2]=0.0;g[f+1344>>2]=0.0;g[f+1368>>2]=1.0;a[f+1311>>0]=0;g[f+1324>>2]=0.0;g[f+1348>>2]=0.0;g[f+1372>>2]=1.0;a[f+1312>>0]=0;g[f+1328>>2]=0.0;g[f+1352>>2]=0.0;g[f+1376>>2]=1.0;a[f+1313>>0]=0;g[f+1332>>2]=0.0;g[f+1356>>2]=0.0;g[f+1380>>2]=1.0;a[f+1314>>0]=0;g[f+1336>>2]=0.0;g[f+1360>>2]=0.0;g[f+1384>>2]=1.0;return f|0}function Gk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;h=+g[a+60>>2];k=+g[a+76>>2]-h;j=+g[a+64>>2];i=+g[a+80>>2]-j;l=+g[a+68>>2];m=+g[a+84>>2]-l;h=+g[a+92>>2]-h;j=+g[a+96>>2]-j;l=+g[a+100>>2]-l;g[d+12>>2]=0.0;f=1.0/+D(+((k*j-i*h)*(k*j-i*h)+((i*l-m*j)*(i*l-m*j)+(m*h-k*l)*(m*h-k*l))));g[d>>2]=(i*l-m*j)*f;g[d+4>>2]=(m*h-k*l)*f;g[d+8>>2]=(k*j-i*h)*f;c[e>>2]=c[a+60>>2];c[e+4>>2]=c[a+60+4>>2];c[e+8>>2]=c[a+60+8>>2];c[e+12>>2]=c[a+60+12>>2];return}function Hk(b){b=b|0;var d=0,e=0;c[b>>2]=6400;if(a[b+52>>0]|0?(d=c[b+56>>2]|0,d|0):0){e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d)}d=c[b+44>>2]|0;if(d|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+36>>2]=0;c[b+40>>2]=0;d=c[b+24>>2]|0;if(!d){a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+24>>2]=0;a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}function Ik(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+224|0;e=g+80|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[g+120>>2]=c[d>>2];if((Xc(0,b,g+120|0,g,g+80|0)|0)>=0){e=c[2444]|0;if((a[9850]|0)<1)c[2444]=e&-33;if(!(c[2456]|0)){d=c[2455]|0;c[2455]=g+136;c[2451]=g+136;c[2449]=g+136;c[2456]=80;c[2448]=g+136+80;Xc(9776,b,g+120|0,g,g+80|0)|0;if(d|0){Bb[c[9812>>2]&63](9776,0,0)|0;c[2455]=d;c[2456]=0;c[2448]=0;c[2451]=0;c[2449]=0}}else Xc(9776,b,g+120|0,g,g+80|0)|0;c[2444]=c[2444]|e&32}l=g;return}function Jk(b,d){b=b|0;d=d|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[7131]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[7137]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[7137]=84;b=-1;break}}else b=1;while(0);return b|0}function Kk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+g[a+60>>2];k=+g[a+76>>2]-i;j=+g[a+64>>2];f=+g[a+80>>2]-j;d=+g[a+68>>2];h=+g[a+84>>2]-d;i=+g[a+92>>2]-i;j=+g[a+96>>2]-j;d=+g[a+100>>2]-d;g[c+12>>2]=0.0;e=1.0/+D(+((k*j-f*i)*(k*j-f*i)+((f*d-h*j)*(f*d-h*j)+(h*i-k*d)*(h*i-k*d))));g[c>>2]=(f*d-h*j)*e;g[c+4>>2]=(h*i-k*d)*e;g[c+8>>2]=(k*j-f*i)*e;if(!b)return;g[c>>2]=-((f*d-h*j)*e);g[c+4>>2]=-((h*i-k*d)*e);g[c+8>>2]=-((k*j-f*i)*e);return}function Lk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c[a+780>>2]|0;g=c[a+812>>2]|0;if((g|0)<=0){h=0;return h|0}f=c[a+820>>2]|0;a=0;while(1){i=c[f+(a*44|0)+8>>2]|0;if(((i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))?(i=c[f+(a*44|0)+12>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0)?(i=c[f+(a*44|0)+16>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0){a=1;f=7;break}a=a+1|0;if((a|0)>=(g|0)){a=0;f=7;break}}if((f|0)==7)return a|0;return 0}function Mk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17763}function Nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0,j=0;i=c[a+100>>2]|0;j=c[a+108>>2]|0;f=+g[j+(((b|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];h=+g[j+(((b|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[j+(((b|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=h;g[d+12>>2]=0.0;d=c[a+108>>2]|0;h=+g[d+(((b+1|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];f=+g[d+(((b+1|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[e>>2]=+g[d+(((b+1|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Ok(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17307}function Pk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0,i=0;e=l;l=l+32|0;d=c[a+184>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}h=c[a+192>>2]|0;i=c[b+192>>2]|0;d=c[a+184>>2]|0;f=+g[a+188>>2];c[e>>2]=0;c[e+4>>2]=i;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;vc(h,a+36|0,a+100|0,e,d,f);d=1;l=e;return d|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+72>>2];c[b+56>>2]=0;return 16327}function Rk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+60>>2]+j*+g[b+64>>2]+i*+g[b+68>>2];f=k*+g[b+76>>2]+j*+g[b+80>>2]+i*+g[b+84>>2];i=k*+g[b+92>>2]+j*+g[b+96>>2]+i*+g[b+100>>2];g[e>>2]=h;g[e+4>>2]=f;g[e+8>>2]=i;g[e+12>>2]=0.0;d=b+60+((+g[e+((h>2]>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=e;return}function Sk(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];b=c[a+8>>2]|0;c[b+304>>2]=(c[b+304>>2]|0)+1;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+52>>2]=c[d>>2];c[b+52+4>>2]=c[d+4>>2];c[b+52+8>>2]=c[d+8>>2];c[b+52+12>>2]=c[d+12>>2];l=d;return}function Tk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;do switch(b|0){case 0:{b=1;f=0;break}case 1:{b=2;f=0;break}case 2:{b=3;f=1;break}case 3:{f=2;break}case 4:{f=0;break}case 5:{f=1;break}case 6:{f=2;break}case 7:{f=3;break}case 8:{b=5;f=4;break}case 9:{b=6;f=4;break}case 10:{b=7;f=5;break}case 11:{b=7;f=6;break}default:{b=0;f=0}}while(0);Sb[c[(c[a>>2]|0)+108>>2]&127](a,f,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,e);return}function Uk(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(k+ +g[a+32>>2])/+g[a+16>>2];j=(h+ +g[a+36>>2])/+g[a+20>>2];f=(d+ +g[a+40>>2])/+g[a+24>>2];l=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));e=+C(+(+g[b+8>>2]));g[a+16>>2]=l;g[a+20>>2]=i;g[a+24>>2]=e;g[a+28>>2]=0.0;g[a+32>>2]=m*l-k;g[a+36>>2]=j*i-h;g[a+40>>2]=f*e-d;g[a+44>>2]=0.0;return}function Vk(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0.0,o=0;bc[c[(c[a>>2]|0)+32>>2]&1](a,b,d,e,f,h,i,j,k);l=c[a+184>>2]|0;m=c[j+20>>2]|0;m=(l|0)>(m|0)?l:m;if((m|0)<=0)return 0.0;l=0;do{n=+wb[c[(c[a>>2]|0)+40>>2]&3](a,l,b,d,e,f,h,i,j,k);g[a+228>>2]=n;o=l;l=l+1|0}while(((o|0)<(m+-1|0)?!(n<=+g[j+92>>2]):0)&(l|0)<(m|0));return 0.0}function Wk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0;if(a[b+527>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=3;c[d+4>>2]=3;j=c[b+28>>2]|0;i=c[b+32>>2]|0;xc(b,j+4|0,i+4|0,j+324|0,i+324|0);if((a[b+526>>0]|0?(e=c[d>>2]|0,c[d>>2]=e+1,f=c[d+4>>2]|0,c[d+4>>2]=f+-1,h=+g[b+456>>2],+g[b+444>>2]>2]>2]=e+2;c[d+4>>2]=f+-2}if(!(a[b+525>>0]|0))return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Xk(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;g[b>>2]=d;c[b+4>>2]=e;c[b+72>>2]=f;c[b+76>>2]=c[h>>2];c[b+76+4>>2]=c[h+4>>2];c[b+76+8>>2]=c[h+8>>2];c[b+76+12>>2]=c[h+12>>2];g[b+92>>2]=0.0;g[b+96>>2]=0.0;g[b+100>>2]=.5;g[b+104>>2]=0.0;g[b+108>>2]=0.0;g[b+112>>2]=0.0;g[b+116>>2]=.800000011920929;g[b+120>>2]=1.0;a[b+124>>0]=0;g[b+128>>2]=.004999999888241291;g[b+132>>2]=.009999999776482582;g[b+136>>2]=.009999999776482582;g[b+140>>2]=.009999999776482582;kr(b+8|0);return}function Yk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=d|d<<8|d<<16|d<<24;while((b|0)<=((f&-4)-64|0)){c[b>>2]=g;c[b+4>>2]=g;c[b+8>>2]=g;c[b+12>>2]=g;c[b+16>>2]=g;c[b+20>>2]=g;c[b+24>>2]=g;c[b+28>>2]=g;c[b+32>>2]=g;c[b+36>>2]=g;c[b+40>>2]=g;c[b+44>>2]=g;c[b+48>>2]=g;c[b+52>>2]=g;c[b+56>>2]=g;c[b+60>>2]=g;b=b+64|0}while((b|0)<(f&-4|0)){c[b>>2]=g;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Zk(a,b,c,d,e,f,h,i,j,k){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=k|0;if(!(((h-d)*b-(i-e)*a)*f+(((i-e)*c-(j-f)*b)*d+((j-f)*a-(h-d)*c)*e)<0.0)){k=0;return k|0}do if(!((h-d)*d+(i-e)*e+(j-f)*f>0.0))if((h-d)*h+(i-e)*i+(j-f)*j<0.0){a=h*h+i*i+j*j;break}else{a=((h*h+i*i+j*j)*(d*d+e*e+f*f)-(h*d+i*e+j*f)*(h*d+i*e+j*f))/((h-d)*(h-d)+(i-e)*(i-e)+(j-f)*(j-f));a=a>0.0?a:0.0;break}else a=d*d+e*e+f*f;while(0);g[k>>2]=+D(+a);k=1;return k|0}function _k(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,h=0,i=0;b=c[b+36>>2]|0;i=c[b+8>>2]|0;h=c[b+12>>2]|0;f=c[b+16>>2]|0;e=+g[a+52>>2];d=+Gh(a+4|0,+g[a+36>>2],+g[a+40>>2],+g[a+44>>2],+g[i+8>>2],+g[i+12>>2],+g[i+16>>2],+g[h+8>>2],+g[h+12>>2],+g[h+16>>2],+g[f+8>>2],+g[f+12>>2],+g[f+16>>2],e);if(!(d>0.0&d>2]|0;h=h+1|0;c[i>>2]=h;return}g[a+52>>2]=d;c[a+56>>2]=b;i=a+60|0;h=c[i>>2]|0;h=h+1|0;c[i>>2]=h;return}function $k(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if(c>>>0>=3)if((c+-3|0)>>>0<3)switch(b|0){case 2:{d=+g[a+868+(c+-3<<6)+32>>2];break a}case 4:{d=+g[a+868+(c+-3<<6)+36>>2];break a}case 3:{d=+g[a+868+(c+-3<<6)+28>>2];break a}default:{d=0.0;break a}}else d=0.0;else switch(b|0){case 2:{d=+g[a+756+(c<<2)>>2];break a}case 4:{d=+g[a+772+(c<<2)>>2];break a}case 3:{d=+g[a+740+(c<<2)>>2];break a}default:{d=0.0;break a}}while(0);return +d}function al(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;h=+g[d>>2];f=+g[d+4>>2];e=+g[d+8>>2];j=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:h;i=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:f;e=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:e;f=1.0/+D(+(e*e+(j*j+i*i)));h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+h*f*j;g[a+4>>2]=h*f*i+ +g[a+4>>2];g[a+8>>2]=h*f*e+ +g[a+8>>2];return}function bl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(qD(b,c[d>>2]|0)|0){if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1;c[d+44>>2]=4;break}if((f|0)==1)c[d+32>>2]=1}}else qs(d,e,f);while(0);return}function cl(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0;j=l;l=l+16|0;h=+g[b>>2];i=+g[b+4>>2];e=+g[b+8>>2];if(h*h+i*i+e*e>0.0?(f=+g[a+52>>2],f>0.0):0){c=1.0/+D(+(h*h+i*i+e*e));d=e*c*-f*e*c*-f+(h*c*-f*h*c*-f+i*c*-f*i*c*-f);if(d>0.0){g[j>>2]=-(h*c*-f);g[j+4>>2]=-(i*c*-f);g[j+8>>2]=-(e*c*-f);g[j+12>>2]=0.0;ve(a,j)}g[a+52>>2]=+D(+d);l=j;return}ve(a,b);l=j;return}function dl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){h=c[b+12>>2]|0;Co(b+16|0,d,e,f);if((h|0)>1){g=b+24|0;do{Co(g,d,e,f);if(a[d+54>>0]|0)break a;g=g+8|0}while(g>>>0<(b+16+(h<<3)|0)>>>0)}}else on(d,e,f);while(0);return}function el(a,b){a=a|0;b=b|0;var d=0;b=l;l=l+16|0;d=c[a+8>>2]|0;c[a+132>>2]=c[d+52>>2];c[a+132+4>>2]=c[d+52+4>>2];c[a+132+8>>2]=c[d+52+8>>2];c[a+132+12>>2]=c[d+52+12>>2];$p(a+152|0,d+52|0,16)|0;yh(d+4|0,b);c[a+168>>2]=c[b>>2];c[a+168+4>>2]=c[b+4>>2];c[a+168+8>>2]=c[b+8>>2];c[a+168+12>>2]=c[b+12>>2];c[a+184>>2]=c[a+168>>2];c[a+184+4>>2]=c[a+168+4>>2];c[a+184+8>>2]=c[a+168+8>>2];c[a+184+12>>2]=c[a+168+12>>2];l=b;return}function fl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+228>>2]|0;a:do if((f|0)>0){e=c[a+236>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+236>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+236>>2]|0)+(f+-1<<2)>>2]=e;c[a+228>>2]=f+-1}ch(c[b+28>>2]|0,b);ch(c[b+32>>2]|0,b);return}function gl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;return 11372}function hl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+12>>2]=c[a+72>>2];c[b+16>>2]=c[a+76>>2];c[b+20>>2]=c[a+80>>2];c[b+24>>2]=c[a+84>>2];c[b+28>>2]=c[a+52>>2];c[b+32>>2]=c[a+56>>2];c[b+36>>2]=c[a+60>>2];c[b+40>>2]=c[a+64>>2];c[b+44>>2]=c[a+68>>2];c[b+48>>2]=0;return 17004}function il(b,d,e){b=b|0;d=d|0;e=e|0;b=Ds(144)|0;c[b>>2]=5112;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+92>>2]=e;g[b+96>>2]=0.0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;c[b+108>>2]=d;c[b+112>>2]=0;c[b+116>>2]=2;c[b+120>>2]=1;g[b+104>>2]=0.0;g[b+100>>2]=0.0;return b|0}function jl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,72)|0;h=c[d+4>>2]|0;i=c[b+8>>2]|0;g=c[b+12>>2]|0;e=c[b+16>>2]|0;c[f+4>>2]=c[d>>2];c[f>>2]=6400;c[f+8>>2]=i;a[f+28>>0]=1;c[f+24>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;a[f+48>>0]=1;c[f+44>>2]=0;c[f+36>>2]=0;c[f+40>>2]=0;a[f+52>>0]=0;c[f+56>>2]=h;a[f+60>>0]=0;c[f+64>>2]=g;c[f+68>>2]=e;return f|0}function kl(b,d){b=b|0;d=d|0;var e=0;e=bt()|0;c[e+8>>2]=0;c[e+12>>2]=-1;c[e+16>>2]=1065353216;c[e+20>>2]=1065353216;c[e+24>>2]=1065353216;g[e+28>>2]=0.0;g[e+48>>2]=.03999999910593033;c[e+56>>2]=0;c[e+60>>2]=1065353216;c[e+64>>2]=1065353216;c[e+68>>2]=1065353216;g[e+72>>2]=0.0;c[e+76>>2]=-1082130432;c[e+80>>2]=-1082130432;c[e+84>>2]=-1082130432;g[e+88>>2]=0.0;a[e+92>>0]=0;c[e>>2]=8036;c[e+96>>2]=b;c[e+4>>2]=3;if(!d)return e|0;uj(e);return e|0}function ll(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;if(!(+g[a+404>>2]!=0.0)){l=d;return}wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);if(!(gJ(a+604|0)|0)){l=d;return}jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);xo(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function ml(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;a[b+53>>0]=1;do if((c[b+4>>2]|0)==(e|0)){a[b+52>>0]=1;e=c[b+16>>2]|0;if(!e){c[b+16>>2]=d;c[b+24>>2]=f;c[b+36>>2]=1;if(!((f|0)==1?(c[b+48>>2]|0)==1:0))break;a[b+54>>0]=1;break}if((e|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;a[b+54>>0]=1;break}e=c[b+24>>2]|0;if((e|0)==2){c[b+24>>2]=f;e=f}if((e|0)==1?(c[b+48>>2]|0)==1:0)a[b+54>>0]=1}while(0);return}function nl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+248>>2]|0;a:do if((f|0)>0){e=c[a+256>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+256>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+256>>2]|0)+(f+-1<<2)>>2]=e;c[a+248>>2]=f+-1;ki(a,b);return}function ol(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1;ki(a,b);return}function pl(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;a[b+251>>0]=0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];f=+g[b+68>>2];h=+g[b+72>>2];i=+g[b+76>>2];j=+D(+(f*f+h*h+i*i));if(j>1.1920928955078125e-07){k=f*(1.0/j);h=h*(1.0/j);f=i*(1.0/j);d=c[b+80>>2]|0}else{k=0.0;h=0.0;f=0.0;d=0}g[b+84>>2]=k;g[b+88>>2]=h;g[b+92>>2]=f;c[b+96>>2]=d;g[b+252>>2]=+g[b+252>>2]+e;return}function ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+64|0;if(!(qD(a,b)|0))if((b|0)!=0?(f=fj(b,2792)|0,(f|0)!=0):0){b=g+4|0;e=b+52|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));c[g>>2]=f;c[g+8>>2]=a;c[g+12>>2]=-1;c[g+48>>2]=1;Vb[c[(c[f>>2]|0)+28>>2]&127](f,g,c[d>>2]|0,1);if((c[g+24>>2]|0)==1){c[d>>2]=c[g+16>>2];b=1}else b=0}else b=0;else b=1;l=g;return b|0}function rl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+36>>2];h=+g[a+32>>2];i=b+(m<<4)|0;k=+g[b+(m<<4)+4>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));if(l!=0.0){j=f*(e/l);f=+g[i>>2]<0.0?-h:h;e=k*(e/l)}else{j=0.0;f=+g[i>>2]<0.0?-h:h}g[c+(m<<4)>>2]=f;g[c+(m<<4)+4>>2]=e;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function sl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=c[b>>2]|0;if(!e)e=c[a+188>>2]|0;i=c[a+328>>2]|0;if((i|0)<=0)return;h=c[a+336>>2]|0;f=0;while(1){g=h+(f<<2)|0;if((c[g>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(i|0)){k=9;break}}if((k|0)==9)return;if((f|0)>=(i|0))return;c[g>>2]=c[h+(i+-1<<2)>>2];c[a+328>>2]=i+-1;k=c[a+344>>2]|0;Cb[c[(c[k>>2]|0)+12>>2]&31](k,e,b,d)|0;return}function tl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+32|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}f=c[b+192>>2]|0;d=c[a+216>>2]|0;c[e>>2]=0;c[e+4>>2]=f;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;ad(a+68|0,a+132|0,e,d);d=1;l=e;return d|0}function ul(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;c[b+4>>2]=c[d>>2];c[b>>2]=6512;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;a[b+68>>0]=g&1;c[b+72>>2]=c[d+4>>2];a[b+76>>0]=0;c[b+80>>2]=c[(c[(g?f:e)+4>>2]|0)+72>>2];eh(b,e,f);return}function vl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0,i=0,j=0;j=c[a+72>>2]|0;i=c[a+68>>2]|0;h=c[a+76>>2]|0;e=+g[a+64>>2]*(+g[b+(j<<2)>>2]/+g[a+16+(j<<2)>>2]);g[a+64>>2]=e;f=+g[a+60>>2]*(+g[b+(i<<2)>>2]/+g[a+16+(i<<2)>>2]+ +g[b+(h<<2)>>2]/+g[a+16+(h<<2)>>2])*.5;g[a+60>>2]=f;g[a+56>>2]=f/+D(+(e*e+f*f));f=+C(+(+g[b>>2]));e=+C(+(+g[b+4>>2]));d=+C(+(+g[b+8>>2]));g[a+16>>2]=f;g[a+20>>2]=e;g[a+24>>2]=d;g[a+28>>2]=0.0;return}function wl(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function xl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+40>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+4>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+8>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=j;g[c+(m<<4)+8>>2]=f;m=m+1|0}while((m|0)!=(d|0));return}function yl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+36>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+4>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=f;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function zl(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function Al(b){b=b|0;var d=0;d=bt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d+60>>2]=1065353216;c[d+64>>2]=1065353216;c[d+68>>2]=1065353216;g[d+72>>2]=0.0;c[d+76>>2]=-1082130432;c[d+80>>2]=-1082130432;c[d+84>>2]=-1082130432;g[d+88>>2]=0.0;a[d+92>>0]=0;c[d>>2]=8036;c[d+96>>2]=b;c[d+4>>2]=3;uj(d);return d|0}function Bl(b){b=b|0;var d=0,e=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){d=b+28|0;e=b+16|0;c[e>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[d>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;e=b+28|0;d=b+16|0;c[d>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[e>>2]=0;return}function Cl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f+32>>2]=9284;c[f+32+4>>2]=e;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[d>>2];c[f+16+4>>2]=c[d+4>>2];c[f+16+8>>2]=c[d+8>>2];c[f+16+12>>2]=c[d+12>>2];Bf(c[a+4>>2]|0,f,f+32|0);Bf(c[a+44>>2]|0,f,f+32|0);l=f;return}function Dl(b){b=b|0;var d=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}function El(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0;d=1.0/+g[(c[b+108>>2]|0)+404>>2];if((c[b+128>>2]|0)<=0)return;e=0;do{f=c[b+136>>2]|0;if(!(a[f+(e*284|0)+84>>0]|0))h=0.0;else{h=+g[f+(e*284|0)+272>>2];h=d*(+g[f+(e*284|0)+216>>2]*(+g[f+(e*284|0)+204>>2]-+g[f+(e*284|0)+32>>2])*+g[f+(e*284|0)+268>>2]-h*+g[(h<0.0?f+(e*284|0)+220|0:f+(e*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[f+(e*284|0)+276>>2]=h;e=e+1|0}while((e|0)<(c[b+128>>2]|0));return}function Fl(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+48|0;f=+XI(b);h=+XI(c);i=+XI(d);b=+WI(b);c=+WI(c);d=+WI(d);g[e+32>>2]=h*i;g[e+28>>2]=c*b*i-f*d;g[e+24>>2]=c*f*i+b*d;g[e+20>>2]=h*d;g[e+16>>2]=c*b*d+f*i;g[e+12>>2]=c*f*d-b*i;g[e+8>>2]=-c;g[e+4>>2]=h*b;g[e>>2]=h*f;Ip(a,e+32|0,e+28|0,e+24|0,e+20|0,e+16|0,e+12|0,e+8|0,e+4|0,e);l=e;return}function Gl(a,d,f,g,h,i){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0;j=c[a+108>>2]|0;if(j|0){$b[c[(c[j>>2]|0)+24>>2]&7](j,d,f,g,h,i);return}d=b[a+56>>1]|0;if(!(d<<16>>16))return;h=1;i=1;do{f=c[a+68>>2]|0;if(b[f+(i<<2)>>1]&1){zb[c[(c[g>>2]|0)+8>>2]&31](g,(c[a+60>>2]|0)+((e[f+(i<<2)+2>>1]|0)<<6)|0)|0;d=b[a+56>>1]|0}h=h+1<<16>>16;i=h&65535}while(i>>>0<((d&65535)<<1|1)>>>0);return}function Hl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;f=+g[a+32>>2]/+g[a+16>>2];e=+g[a+36>>2]/+g[a+20>>2];d=+g[a+40>>2]/+g[a+24>>2];j=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));h=+C(+(+g[b+8>>2]));g[a+16>>2]=j;g[a+20>>2]=i;g[a+24>>2]=h;g[a+28>>2]=0.0;e=e*+g[b+4>>2];d=d*+g[b+8>>2];g[a+32>>2]=f*+g[b>>2];g[a+36>>2]=e;g[a+40>>2]=d;g[a+44>>2]=0.0;c[a+48>>2]=c[a+32+((((c[a+56>>2]|0)+2|0)%3|0)<<2)>>2];return}function Il(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=f;c[b+48>>2]=e;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[f+8>>2]|0,c[e+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=1;return b|0}function Jl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;c[h>>2]=a;c[h+4>>2]=e;e=c[(c[b+4>>2]|0)+4>>2]|0;g=c[(c[d+4>>2]|0)+4>>2]|0;if((f|0)==1){f=c[a+76+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}else{f=c[a+5260+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}return 0}function Kl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0;e=+g[a+32>>2];i=+g[a+36>>2];h=+g[a+40>>2];switch(d|0){case 0:{a=0;d=0;f=1065353216;break}case 1:{a=0;d=0;f=-1082130432;break}case 2:{a=0;d=1065353216;f=0;e=i;break}case 3:{a=0;d=-1082130432;f=0;e=i;break}case 4:{a=1065353216;d=0;f=0;e=h;break}case 5:{a=-1082130432;d=0;f=0;e=h;break}default:return}c[b>>2]=f;c[b+4>>2]=d;c[b+8>>2]=a;g[b+12>>2]=-e;return}function Ll(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=e;c[b+48>>2]=f;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=0;return b|0}function Ml(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0;e=c[a+248>>2]|0;if((e|0)<=0)return;b=c[a+256>>2]|0;a=0;do{d=c[b+(a<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:if(!(c[d+204>>2]&3)){h=+g[d+428>>2]*+g[d+412>>2];f=+g[d+432>>2]*+g[d+416>>2];g[d+472>>2]=+g[d+424>>2]*+g[d+408>>2]+ +g[d+472>>2];g[d+476>>2]=h+ +g[d+476>>2];g[d+480>>2]=f+ +g[d+480>>2]}}a=a+1|0}while((a|0)!=(e|0));return}function Nl(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;c=l;l=l+16|0;m=+g[a+12>>2];i=+g[(gJ(b)|0)>>2];j=+g[a>>2];k=+g[b+12>>2];h=+g[a+4>>2];d=+g[(NI(b)|0)>>2];e=+g[a+8>>2];f=+g[(OI(b)|0)>>2];g[c+12>>2]=m*i+j*k+h*d-e*f;g[c+8>>2]=m*f+h*k+e*i-j*d;g[c+4>>2]=m*d+e*k+j*f-h*i;g[c>>2]=m*k-j*i-h*f-e*d;as(a,c+12|0,c+8|0,c+4|0,c);l=c;return a|0}function Ol(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0;e=l;l=l+16|0;j=c[a+56>>2]|0;k=c[a+32+(((j+2|0)%3|0)<<2)>>2]|0;c[e>>2]=k;c[e+4>>2]=k;c[e+8>>2]=k;g[e+12>>2]=0.0;g[e+(j<<2)>>2]=+g[a+32+(j<<2)>>2]+ +g[e+(j<<2)>>2];h=+g[e>>2]*2.0;f=+g[e+4>>2]*2.0;i=+g[e+8>>2]*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);l=e;return}function Pl(a,b){a=a|0;b=+b;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=h+ +g[a+32>>2];e=e+ +g[a+36>>2];i=i+ +g[a+40>>2];g[a+48>>2]=b;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=i-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=h-f;g[a+36>>2]=e-d;g[a+40>>2]=b;g[a+44>>2]=0.0;return}function Ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[a+8>>2]|0)<=0)return;e=0;a:while(1){while(1){f=c[a+16>>2]|0;g=f+(e<<4)|0;if(!(zb[c[(c[b>>2]|0)+8>>2]&31](b,g)|0))break;Cb[c[(c[a>>2]|0)+12>>2]&31](a,c[g>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;c[6156]=(c[6156]|0)+-1;if((e|0)>=(c[a+8>>2]|0)){e=7;break a}}e=e+1|0;if((e|0)>=(c[a+8>>2]|0)){e=7;break}}if((e|0)==7)return}function Rl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5888;a[b+8>>0]=0;c[b+12>>2]=0;if(!(Bb[c[(c[d>>2]|0)+24>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0))return b|0;d=c[b+4>>2]|0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Sl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;f=(a[b+8>>0]|0)!=0;h=c[(f?e:d)+8>>2]|0;f=f?d:e;g=c[f+8>>2]|0;d=c[h+328>>2]|0;a:do if((d|0)>0){e=c[h+336>>2]|0;b=0;while(1){if((c[e+(b<<2)>>2]|0)==(g|0))break;b=b+1|0;if((b|0)>=(d|0))break a}if((b|0)!=(d|0))return}while(0);e=c[h+344>>2]|0;Sb[c[(c[e>>2]|0)+36>>2]&127](e,h,f);return}function Tl(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;a[b+251>>0]=1;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];e=+g[b+68>>2];f=+g[b+72>>2];h=+g[b+76>>2];i=+D(+(e*e+f*f+h*h));if(i>1.1920928955078125e-07){j=e*(1.0/i);f=f*(1.0/i);e=h*(1.0/i);d=c[b+80>>2]|0}else{j=0.0;f=0.0;e=0.0;d=0}g[b+84>>2]=j;g[b+88>>2]=f;g[b+92>>2]=e;c[b+96>>2]=d;return}function Ul(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+g[b+52>>2]-h;j=+g[b+56>>2]-f;g[d>>2]=+g[b+48>>2]-i;g[d+4>>2]=k;g[d+8>>2]=j;g[d+12>>2]=0.0;h=h+ +g[b+52>>2];f=f+ +g[b+56>>2];g[e>>2]=i+ +g[b+48>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Vl(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0.0,h=0.0,i=0.0;d=nt()|0;c[d+4>>2]=35;c[d+8>>2]=0;c[d+12>>2]=-1;g[d+16>>2]=0.0;c[d>>2]=7396;i=+g[a>>2];h=+g[a+4>>2];f=+g[a+8>>2];a=c[a+12>>2]|0;e=1.0/+D(+(i*i+h*h+f*f));g[d+52>>2]=i*e;g[d+56>>2]=h*e;g[d+60>>2]=f*e;c[d+64>>2]=a;g[d+68>>2]=b;c[d+72>>2]=1065353216;c[d+76>>2]=1065353216;c[d+80>>2]=1065353216;g[d+84>>2]=0.0;c[d+4>>2]=28;return d|0}function Wl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=c[a+780>>2]|0;h=c[a+792>>2]|0;if((h|0)<=0){h=0;return h|0}e=c[a+800>>2]|0;a=0;while(1){f=c[e+(a*52|0)+24>>2]|0;if((f|0)==(g+(b*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(d*104|0)|0):0){a=1;e=8;break}if((f|0)==(g+(d*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(b*104|0)|0):0){a=1;e=8;break}a=a+1|0;if((a|0)>=(h|0)){a=0;e=8;break}}if((e|0)==8)return a|0;return 0}function Xl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Rs()|0;Ra(f|0,a|0,b|0,d|0,e|0,0);c[f>>2]=4600;g[f+968>>2]=0.0;g[f+1056>>2]=0.0;g[f+1144>>2]=0.0;g[f+972>>2]=0.0;g[f+1060>>2]=0.0;g[f+1148>>2]=0.0;c[f+680>>2]=0;c[f+680+4>>2]=0;c[f+680+8>>2]=0;c[f+680+12>>2]=0;c[f+680+16>>2]=0;c[f+680+20>>2]=0;c[f+680+24>>2]=0;c[f+680+28>>2]=0;return f|0}function Yl(a){a=a|0;var b=0,d=0,e=0.0,f=0.0;if((c[a+128>>2]|0)<=0)return;b=0;do{d=c[a+136>>2]|0;c[d+(b*284|0)+32>>2]=c[d+(b*284|0)+204>>2];g[d+(b*284|0)+272>>2]=0.0;f=-+g[d+(b*284|0)+56>>2];e=-+g[d+(b*284|0)+60>>2];g[d+(b*284|0)>>2]=-+g[d+(b*284|0)+52>>2];g[d+(b*284|0)+4>>2]=f;g[d+(b*284|0)+8>>2]=e;g[d+(b*284|0)+12>>2]=0.0;g[d+(b*284|0)+268>>2]=1.0;b=b+1|0}while((b|0)<(c[a+128>>2]|0));return}function Zl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[d>>2]|0;g=zb[c[(c[g>>2]|0)+56>>2]&31](g,20)|0;h=c[d+4>>2]|0;i=a[b+4>>0]|0;b=c[d>>2]|0;c[g+4>>2]=b;c[g>>2]=6352;a[g+8>>0]=0;c[g+12>>2]=h;a[g+16>>0]=i;if(h|0)return g|0;c[g+12>>2]=Bb[c[(c[b>>2]|0)+12>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[g+8>>0]=1;return g|0}function _l(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function $l(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function am(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f>>2]=7376;c[f+4>>2]=b;c[f+8>>2]=c[d>>2];c[f+8+4>>2]=c[d+4>>2];c[f+8+8>>2]=c[d+8>>2];c[f+8+12>>2]=c[d+12>>2];c[f+24>>2]=c[e>>2];c[f+24+4>>2]=c[e+4>>2];c[f+24+8>>2]=c[e+8>>2];c[f+24+12>>2]=c[e+12>>2];b=c[a+52>>2]|0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,f,d,e);l=f;return}function bm(a,b,d){a=a|0;b=+b;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[a+32>>2];f=+g[a+36>>2];j=+g[a+40>>2];h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=(j+ +nb[c[(c[a>>2]|0)+48>>2]&15](a))*2.0;g[d>>2]=b/12.0*((f+e)*2.0*(f+e)*2.0+j*j);g[d+4>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+j*j);g[d+8>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+(f+e)*2.0*(f+e)*2.0);g[d+12>>2]=0.0;return}function cm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;d=l;l=l+16|0;c[d>>2]=9320;c[d+4>>2]=e;i=c[a+168>>2]|0;ze(c[a+4>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);ze(c[a+44>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);l=d;return}function dm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);yq(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function em(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+64|0;c[d>>2]=1065353216;c[d+4>>2]=0;c[d+4+4>>2]=0;c[d+4+8>>2]=0;c[d+4+12>>2]=0;c[d+20>>2]=1065353216;c[d+24>>2]=0;c[d+24+4>>2]=0;c[d+24+8>>2]=0;c[d+24+12>>2]=0;c[d+40>>2]=1065353216;c[d+44>>2]=0;c[d+48>>2]=c[b>>2];c[d+48+4>>2]=c[b+4>>2];c[d+48+8>>2]=c[b+8>>2];c[d+48+12>>2]=c[b+12>>2];Ld(a,d);l=d;return}function fm(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0;f=l;l=l+16|0;h=$G(b,0)|0;g[f+8>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);h=$G(b,1)|0;g[f+4>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);b=$G(b,2)|0;g[f>>2]=+Iy(+g[b>>2],+g[b+4>>2],+g[b+8>>2],c,d,e);$s(a,f+8|0,f+4|0,f);l=f;return}function gm(){var a=0,b=0,d=0;a=it()|0;c[a>>2]=1025;b=a+120|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+312|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+504|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+696|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));c[a+772>>2]=0;c[a+776>>2]=0;c[a+780>>2]=0;c[a+800>>2]=0;return a|0}function hm(a,b,d){a=a|0;b=b|0;d=d|0;a:do switch(c[b+220>>2]|0){case 2:case 5:{switch(c[d+220>>2]|0){case 2:case 5:{a=0;break}default:break a}return a|0}default:{}}while(0);if(!((c[b+280>>2]|0)!=0?!(zb[c[(c[b>>2]|0)+12>>2]&31](b,d)|0):0)){if(!(c[d+280>>2]|0)){d=1;return d|0}if(zb[c[(c[d>>2]|0)+12>>2]&31](d,b)|0){d=1;return d|0}}d=0;return d|0}function im(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+296>>2]|0;a:do if((f|0)>0){e=c[a+304>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0))return;g=c[a+304>>2]|0;b=g+(d<<2)|0;e=c[b>>2]|0;c[b>>2]=c[g+(f+-1<<2)>>2];c[(c[a+304>>2]|0)+(f+-1<<2)>>2]=e;c[a+296>>2]=f+-1;return}function jm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;j=+g[a+32>>2];h=+g[a+36>>2];e=+g[a+40>>2];i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=e+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=+(b&1^1|0)*(j+i)-+(b&1|0)*(j+i);g[d+4>>2]=+(b>>>1&1^1|0)*(h+f)-+(b>>>1&1|0)*(h+f);g[d+8>>2]=+(b>>>2&1^1|0)*e-+(b>>>2&1|0)*e;g[d+12>>2]=0.0;return}function km(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0,i=0,j=0;f=l;l=l+16|0;j=$G(b,0)|0;i=$G(b,1)|0;h=$G(b,2)|0;an(f,c,d,e,+g[j>>2],+g[j+4>>2],+g[j+8>>2],+g[i>>2],+g[i+4>>2],+g[i+8>>2],+g[h>>2],+g[h+4>>2],+g[h+8>>2]);iq(a,+g[f>>2],+g[f+4>>2],+g[f+8>>2],+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);l=f;return}function lm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+20>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+16>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+16>>2]|0)+4>>2];l=e;return +f}function mm(b,d){b=b|0;d=d|0;if((c[b+16>>2]|0)!=(0-(c[b+56>>2]|0)|0))return;Dl(b+4|0);Dl(b+44|0);a[b+153>>0]=0;a[b+154>>0]=1;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;c[b+128>>2]=0;c[b+128+4>>2]=0;c[b+128+8>>2]=0;c[b+128+12>>2]=0;c[b+128+16>>2]=0;c[b+128+20>>2]=0;return}function nm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[b+32>>2];j=+g[b+36>>2];e=+g[b+40>>2];h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+nb[c[(c[b>>2]|0)+48>>2]&15](b);e=e+ +nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+g[d+4>>2]>=0.0?j+f:-(j+f);e=+g[d+8>>2]>=0.0?e:-e;g[a>>2]=+g[d>>2]>=0.0?i+h:-(i+h);g[a+4>>2]=f;g[a+8>>2]=e;g[a+12>>2]=0.0;return}function om(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0;if((d|0)<=0)return;e=0;do{i=+g[a+32>>2];h=+g[a+36>>2];h=+g[b+(e<<4)+4>>2]>=0.0?h:-h;f=+g[a+40>>2];f=+g[b+(e<<4)+8>>2]>=0.0?f:-f;g[c+(e<<4)>>2]=+g[b+(e<<4)>>2]>=0.0?i:-i;g[c+(e<<4)+4>>2]=h;g[c+(e<<4)+8>>2]=f;g[c+(e<<4)+12>>2]=0.0;e=e+1|0}while((e|0)!=(d|0));return}function pm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;a=c[a+32>>2]|0;c[d>>2]=c[a+(k<<5)+12>>2];c[b>>2]=c[a+(k<<5)+16>>2];c[e>>2]=c[a+(k<<5)+28>>2];c[f>>2]=c[a+(k<<5)+20>>2];c[i>>2]=c[a+(k<<5)>>2];c[g>>2]=c[a+(k<<5)+4>>2];c[h>>2]=c[a+(k<<5)+8>>2];c[j>>2]=c[a+(k<<5)+24>>2];return}function qm(b){b=b|0;var d=0,e=0;c[b>>2]=6640;d=c[b+68>>2]|0;if(d|0?(Bl(d),e=c[b+68>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}d=c[b+28>>2]|0;if(!d){a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}function rm(b){b=b|0;var d=0,e=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+56>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function sm(a,b){a=a|0;b=+b;var d=0;d=l;l=l+16|0;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=7020;c[a+4>>2]=8;g[d+8>>2]=1.0;g[d+4>>2]=1.0;g[d>>2]=1.0;$s(a+16|0,d+8|0,d+4|0,d);Fs(a+32|0);MG(a+32|0,b);g[a+48>>2]=b;g[a+52>>2]=0.0;l=d;return}function tm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6820;c[d+68>>2]=0;c[d+72>>2]=2;c[d+76>>2]=1;g[d+32>>2]=a;g[d+40>>2]=b;g[d+36>>2]=a;return d|0}function um(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6920;c[d+68>>2]=1;c[d+72>>2]=0;c[d+76>>2]=2;g[d+36>>2]=a;g[d+32>>2]=b;g[d+40>>2]=a;return d|0}function vm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d>>2]=6720;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;c[d+68>>2]=0;c[d+72>>2]=1;c[d+76>>2]=2;g[d+32>>2]=a;g[d+36>>2]=b;g[d+40>>2]=a;g[d+56>>2]=a/+D(+(a*a+b*b));return d|0}function wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;switch(b|0){case 0:{a=0;b=0;e=1065353216;break}case 1:{a=0;b=0;e=-1082130432;break}case 2:{a=0;b=1065353216;e=0;break}case 3:{a=0;b=-1082130432;e=0;break}case 4:{a=1065353216;b=0;e=0;break}case 5:{a=-1082130432;b=0;e=0;break}default:return}c[d>>2]=e;c[d+4>>2]=b;c[d+8>>2]=a;g[d+12>>2]=0.0;return}function xm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;a[b+40>>0]=1;return}function ym(a,e,f){a=a|0;e=e|0;f=f|0;var h=0.0;switch(c[a+100>>2]|0){case 0:{h=+g[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<2)>>2];return +h}case 5:{h=+(d[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e)>>0]|0)*+g[a+92>>2];return +h}case 3:{h=+(b[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<1)>>1]|0)*+g[a+92>>2];return +h}default:{h=0.0;return +h}}return 0.0}function zm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];Vm(a+28|0,b+28|0);c[a+76>>2]=c[b+76>>2];c[a+76+4>>2]=c[b+76+4>>2];c[a+76+8>>2]=c[b+76+8>>2];c[a+76+12>>2]=c[b+76+12>>2];c[a+76+16>>2]=c[b+76+16>>2];return}function Am(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(e|0){case 5:case -1:break;default:return}switch(b|0){case 2:{g[a+764>>2]=d;c[a+748>>2]=c[a+748>>2]|2;return}case 4:{g[a+760>>2]=d;c[a+748>>2]=c[a+748>>2]|1;return}case 3:{g[a+752>>2]=d;c[a+748>>2]=c[a+748>>2]|4;return}case 1:{g[a+756>>2]=d;c[a+748>>2]=c[a+748>>2]|8;return}default:return}}function Bm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))ko(a,b);while(1){if((e|0)>=(b|0))break;f=gJ((c[a+12>>2]|0)+(e*52|0)|0)|0;g=d;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Cm(a,b){a=a|0;b=b|0;var c=0.0,d=0;d=l;l=l+32|0;c=+g[b+12>>2];if(1.0-c*c<1.1920928955078125e-06){g[d+20>>2]=1.0;g[d+16>>2]=0.0;g[d+12>>2]=0.0;$s(a,d+20|0,d+16|0,d+12|0);l=d;return}else{c=1.0/+VI(1.0-c*c);g[d+8>>2]=+g[b>>2]*c;g[d+4>>2]=+g[b+4>>2]*c;g[d>>2]=+g[b+8>>2]*c;$s(a,d+8|0,d+4|0,d);l=d;return}}function Dm(b){b=b|0;var d=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(!d)return;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function Em(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Mu(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+Em(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function Fm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))jo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*104|0)|0;g=d;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Gm(b,e){b=b|0;e=e|0;var f=0,g=0;g=0;while(1){if((d[19849+g>>0]|0)==(b|0)){b=2;break}f=g+1|0;if((f|0)==87){f=19937;g=87;b=5;break}else g=f}if((b|0)==2)if(!g)f=19937;else{f=19937;b=5}if((b|0)==5)while(1){do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);g=g+-1|0;if(!g)break;else b=5}return mH(f,c[e+20>>2]|0)|0}function Hm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))lo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*44|0)|0;g=d;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Im(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[a+408>>2]=c[b>>2];c[a+408+4>>2]=c[b+4>>2];c[a+408+8>>2]=c[b+8>>2];c[a+408+12>>2]=c[b+12>>2];Qq(d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2],+g[a+404>>2]);c[a+620>>2]=c[d>>2];c[a+620+4>>2]=c[d+4>>2];c[a+620+8>>2]=c[d+8>>2];c[a+620+12>>2]=c[d+12>>2];l=d;return}function Jm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0;f=l;l=l+16|0;d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2];if(d*d+e*e+c*c>0.0){g[f>>2]=-d;g[f+4>>2]=-e;g[f+8>>2]=-c;g[f+12>>2]=0.0;ve(a,f);d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2]}g[a+52>>2]=+D(+(d*d+e*e+c*c));l=f;return}function Km(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[a+328>>2]|0;if((g|0)<=0)return;b=c[b>>2]|0;f=c[a+336>>2]|0;d=0;while(1){e=f+(d<<2)|0;if((c[e>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(g|0)){h=7;break}}if((h|0)==7)return;if((d|0)>=(g|0))return;c[e>>2]=c[f+(g+-1<<2)>>2];c[a+328>>2]=g+-1;return}function Lm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=d*h*f-i*c*b;g[e+8>>2]=i*c*f+d*h*b;g[e+4>>2]=i*h*b-d*c*f;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Mm(a){a=a|0;var b=0;b=l;l=l+32|0;g[a>>2]=1.2000000476837158;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=1.0e3;g[b+20>>2]=0.0;g[b+16>>2]=0.0;g[b+12>>2]=0.0;$s(a+16|0,b+20|0,b+16|0,b+12|0);c[a+32>>2]=0;c[a+36>>2]=0;g[b+8>>2]=0.0;g[b+4>>2]=-10.0;g[b>>2]=0.0;$s(a+40|0,b+8|0,b+4|0,b);zC(a+56|0);l=b;return}function Nm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;+vb[c[(c[a>>2]|0)+44>>2]&3](a,b,d,e,f,g,h,i,j);+vb[c[(c[a>>2]|0)+48>>2]&3](a,b,d,e,f,g,h,i,j);+sb[c[(c[a>>2]|0)+36>>2]&1](a,b,d,i);return 0.0}function Om(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){while(1){e=xs(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e&255|48;e=b;b=rB(b|0,c|0,10,0)|0;if(!(c>>>0>9|(c|0)==9&e>>>0>4294967295))break;else c=A}c=b}else c=b;if(c)while(1){d=d+-1|0;a[d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}return d|0}function Pm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=i*c*f+d*h*b;g[e+8>>2]=i*h*b-d*c*f;g[e+4>>2]=d*h*f-i*c*b;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Qm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=c[e>>2];c[a+8+4>>2]=c[e+4>>2];c[a+8+8>>2]=c[e+8>>2];c[a+8+12>>2]=c[e+12>>2];c[a+24>>2]=c[f>>2];c[a+24+4>>2]=c[f+4>>2];c[a+24+8>>2]=c[f+8>>2];c[a+24+12>>2]=c[f+12>>2];g[a+40>>2]=h;return}function Rm(){var b=0;b=l;l=l+48|0;if(a[22392]|0){l=b;return}if(!(Uz(22392)|0)){l=b;return}g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Sq(22792,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Sm(){var b=0,e=0,f=0;f=l;l=l+16|0;a[f>>0]=10;b=c[2448]|0;if(!b)if(!(bp(9776)|0)){b=c[2448]|0;e=4}else b=-1;else e=4;do if((e|0)==4){e=c[2449]|0;if(!(e>>>0>=b>>>0|(a[9851]|0)==10)){c[2449]=e+1;a[e>>0]=10;b=10;break}if((Bb[c[9812>>2]&63](9776,f,1)|0)==1)b=d[f>>0]|0;else b=-1}while(0);l=f;return b|0}function Tm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+28>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+24>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+24>>2]|0)+4>>2];l=e;return +f}function Um(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=l;l=l+16|0;e=+MA(+g[b>>2],+g[b+4>>2],+g[b+8>>2]);e=+WI(c*.5)/e;g[d+12>>2]=+g[(gJ(b)|0)>>2]*e;g[d+8>>2]=+g[(OI(b)|0)>>2]*e;g[d+4>>2]=+g[(NI(b)|0)>>2]*e;g[d>>2]=+XI(c*.5);as(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function Vm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+16+4>>2]=c[b+16+4>>2];c[a+16+8>>2]=c[b+16+8>>2];c[a+16+12>>2]=c[b+16+12>>2];c[a+32>>2]=c[b+32>>2];c[a+32+4>>2]=c[b+32+4>>2];c[a+32+8>>2]=c[b+32+8>>2];c[a+32+12>>2]=c[b+32+12>>2];return}function Wm(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+8>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[b+16>>2]|0)+(f<<2)>>2]|0;if(!(a[b+76>>0]|0))switch(c[e+220>>2]|0){case 2:case 5:break;default:g=6}else g=6;if((g|0)==6){g=0;xf(b,e);d=c[b+8>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Xm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:case 1:{if(c>>>0<3){d=+g[a+600>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+432>>2];else d=0.0;break}case 4:case 3:{if(c>>>0<3){d=+g[a+596>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+604>>2];else d=0.0;break}default:d=0.0}while(0);return +d}function Ym(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=9600;a[b+8>>0]=0;c[b+12>>2]=0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Zm(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+60>>2]|0;d=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346456916,c[a+60>>2]|0);return}function _m(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(c|0){case 5:case -1:switch(b|0){case 2:{d=+g[a+764>>2];break a}case 4:{d=+g[a+760>>2];break a}case 3:{d=+g[a+752>>2];break a}case 1:{d=+g[a+756>>2];break a}default:{d=0.0;break a}}default:d=0.0}while(0);return +d}function $m(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+56>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+12>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+56>>2]|0;d=Bb[c[(c[d>>2]|0)+16>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1213612625,c[a+56>>2]|0);return}function an(a,b,c,d,e,f,h,i,j,k,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;n=+n;o=+o;var p=0;p=l;l=l+16|0;g[p+8>>2]=+Iy(b,c,d,e,f,h);g[p+4>>2]=+Iy(b,c,d,i,j,k);g[p>>2]=+Iy(b,c,d,m,n,o);$s(a,p+8|0,p+4|0,p);l=p;return}function bn(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0,f=0.0,h=0.0;e=+g[a+32>>2];f=+g[a+36>>2];h=+g[a+40>>2];d=+g[b>>2];if(!(d<=e+c)){b=0;return b|0}if(!(d>=-e-c)){b=0;return b|0}d=+g[b+4>>2];if(!(d<=f+c)){b=0;return b|0}if(!(d>=-f-c)){b=0;return b|0}d=+g[b+8>>2];if(!(d<=h+c)){b=0;return b|0}b=d>=-h-c;return b|0}function cn(b,d){b=b|0;d=d|0;c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+24>>2]=c[d+24>>2];c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+56>>2]=c[d+56>>2];c[b+48>>2]=c[d+48>>2];a[b+44>>0]=a[d+44>>0]&1;return}function dn(a,b,d){a=a|0;b=b|0;d=d|0;rw(a);c[a>>2]=3124;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];c[a+32>>2]=c[d>>2];c[a+32+4>>2]=c[d+4>>2];c[a+32+8>>2]=c[d+8>>2];c[a+32+12>>2]=c[d+12>>2];c[a+80>>2]=0;return}function en(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;if(!(+g[b+36>>2]>f))return;a[b+40>>0]=1;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;return}function fn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+40>>2];k=+g[c>>2];e=+g[c+4>>2];j=+D(+(k*k+e*e));f=+g[c+8>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+8>>2]=e;g[a+4>>2]=h;return}function gn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+36>>2];k=+g[c>>2];e=+g[c+8>>2];j=+D(+(k*k+e*e));f=+g[c+4>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+4>>2]=e;g[a+8>>2]=h;return}function hn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;d=+g[b+36>>2];f=+g[b+32>>2];j=+g[c+4>>2];e=+g[c+8>>2];i=+D(+(j*j+e*e));if(i!=0.0){h=e*(d/i);e=+g[c>>2]<0.0?-f:f;d=j*(d/i)}else{h=0.0;e=+g[c>>2]<0.0?-f:f}g[a+4>>2]=d;g[a>>2]=e;g[a+8>>2]=h;return}function jn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+156|0);aj(a+16|0,a+88|0,a+172|0);l=c;return}function kn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+164|0);aj(a+16|0,a+88|0,a+180|0);l=c;return}function ln(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0;if((d|0)>-1|(d|0)==-1&c>>>0>4294967295){e=(+(c>>>0)+4294967296.0*+(d>>>0))*18446744073709551616.0+(+(a>>>0)+4294967296.0*+(b>>>0));return +e}else{g=sw(0,0,a|0,b|0)|0;f=A;d=Ow((a|0)==0&(b|0)==0&1|0,0,~c|0,~d|0)|0;e=-+ln(g,f,d,A);return +e}return 0.0}function mn(a){a=a|0;var b=0.0,d=0.0,e=0.0;d=+g[(c[a+28>>2]|0)+404>>2];e=+g[(c[a+32>>2]|0)+404>>2];e=e==0.0?1.0:d/(d+e);d=+g[a+1116>>2]*e+(1.0-e)*+g[a+1180>>2];b=e*+g[a+1120>>2]+(1.0-e)*+g[a+1184>>2];g[a+1284>>2]=+g[a+1112>>2]*e+ +g[a+1176>>2]*(1.0-e);g[a+1288>>2]=d;g[a+1292>>2]=b;g[a+1296>>2]=0.0;return}function nn(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0;d=+g[a+404>>2];if(d!=0.0){f=1.0/d*+g[b+4>>2];e=1.0/d*+g[b+8>>2];g[a+424>>2]=1.0/d*+g[b>>2];g[a+428>>2]=f;g[a+432>>2]=e;g[a+436>>2]=0.0}c[a+440>>2]=c[b>>2];c[a+440+4>>2]=c[b+4>>2];c[a+440+8>>2]=c[b+8>>2];c[a+440+12>>2]=c[b+12>>2];return}function on(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+16>>2]|0;do if(f){if((f|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;c[b+24>>2]=2;a[b+54>>0]=1;break}if((c[b+24>>2]|0)==2)c[b+24>>2]=e}else{c[b+16>>2]=d;c[b+24>>2]=e;c[b+36>>2]=1}while(0);return}function pn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[a+84>>2]|0;a=c[f+8>>2]|0;if((a|0)<=0)return;e=0;do{d=c[(c[f+16>>2]|0)+(e*12|0)+8>>2]|0;if(d){Ob[c[(c[d>>2]|0)+16>>2]&127](d,b);a=c[f+8>>2]|0}e=e+1|0}while((e|0)<(a|0));return}function qn(a,b,d){a=a|0;b=b|0;d=d|0;Ut(a);c[a>>2]=2952;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];c[a+40>>2]=c[d>>2];c[a+40+4>>2]=c[d+4>>2];c[a+40+8>>2]=c[d+8>>2];c[a+40+12>>2]=c[d+12>>2];return}function rn(){var b=0,d=0,e=0;do if((c[2463]|0)>=0?(kJ()|0)!=0:0){if((a[9851]|0)!=10?(b=c[2449]|0,b>>>0<(c[2448]|0)>>>0):0){c[2449]=b+1;a[b>>0]=10;break}Sm()|0}else e=3;while(0);do if((e|0)==3){if((a[9851]|0)!=10?(d=c[2449]|0,d>>>0<(c[2448]|0)>>>0):0){c[2449]=d+1;a[d>>0]=10;break}Sm()|0}while(0);return}function sn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[d>>2]|0;a=vy(c[b>>2]|0)|0;f=vy(f)|0;if(a|0)Vb[c[(c[a>>2]|0)+32>>2]&127](a,d,e,b);if(!f)return 0;Vb[c[(c[f>>2]|0)+32>>2]&127](f,b,e,d);return 0}function tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+48|0;f=c[b+192>>2]|0;Vb[c[(c[f>>2]|0)+8>>2]&127](f,b+4|0,e+32|0,e+16|0);c[e>>2]=6304;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;d=c[a+68>>2]|0;Vb[c[(c[d>>2]|0)+28>>2]&127](d,e+32|0,e+16|0,e);l=e;return}function un(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=l;l=l+256|0;if((c|0)>(d|0)&(e&73728|0)==0){Yk(f|0,b|0,((c-d|0)>>>0<256?c-d|0:256)|0)|0;if((c-d|0)>>>0>255){b=c-d|0;do{fA(a,f,256);b=b+-256|0}while(b>>>0>255);b=c-d&255}else b=c-d|0;fA(a,f,b)}l=f;return}function vn(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];return 12513}function wn(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b>>2]|0;e=c[a+84>>2]|0;if((d|0)==(e|0)){e=0;return e|0}if(!(c[a+12>>2]&c[b+4>>2])){e=0;return e|0}if(!(c[b+8>>2]&c[a+8>>2])){e=0;return e|0}b=c[a+96>>2]|0;e=Bb[c[(c[b>>2]|0)+28>>2]&63](b,e,d)|0;return e|0}function xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+112|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+104|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Fm(a,d,f);Jo(b,d,c[a+12>>2]|0);l=f;return}function yn(a){a=a|0;c[5650]=c[a>>2];c[5651]=c[a+4>>2];c[5652]=c[a+8>>2];c[5653]=c[a+12>>2];c[5654]=c[a+16>>2];c[5655]=c[a+20>>2];c[5656]=c[a+24>>2];Vm(22628,a+28|0);c[5669]=c[a+76>>2];c[5670]=c[a+76+4>>2];c[5671]=c[a+76+8>>2];c[5672]=c[a+76+12>>2];c[5673]=c[a+76+16>>2];return}function zn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+64|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+52|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Bm(a,d,f);Eo(b,d,c[a+12>>2]|0);l=f;return}function An(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+48|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Hm(a,d,f);Oo(b,d,c[a+12>>2]|0);l=f;return}function Bn(a){a=a|0;var b=0,d=0,e=0;Ib[c[(c[a>>2]|0)+8>>2]&511](a);Ib[c[(c[a>>2]|0)+12>>2]&511](a);b=c[a+24>>2]|0;if(!b)return;e=c[(c[b>>2]|0)+32>>2]|0;d=c[a+68>>2]|0;d=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;Vb[e&127](b,d,a+28|0,c[a+24>>2]|0);return}function Cn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7936;g[d+48>>2]=a;c[d+56>>2]=2;g[d+32>>2]=a;g[d+36>>2]=a;g[d+40>>2]=b*.5;g[d+44>>2]=0.0;return d|0}function Dn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7836;g[d+48>>2]=a;c[d+56>>2]=0;g[d+32>>2]=b*.5;g[d+36>>2]=a;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function En(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;e=l;l=l+32|0;d=Ss()|0;g[e+8>>2]=1.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Hg(d,a,b,c,e+16|0);l=e;return d|0}function Fn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d>>2]=7736;g[d+48>>2]=a;c[d+4>>2]=10;c[d+56>>2]=1;g[d+32>>2]=a;g[d+36>>2]=b*.5;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function Gn(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=gJ(b)|0;i=gJ(b+16|0)|0;h=gJ(b+32|0)|0;g=OI(b)|0;f=OI(b+16|0)|0;e=OI(b+32|0)|0;d=NI(b)|0;c=NI(b+16|0)|0;Sq(a,j,i,h,g,f,e,d,c,NI(b+32|0)|0);return}function Hn(a,b){a=a|0;b=b|0;var d=0;if(c[b+40>>2]|0){Hn(a,c[b+36>>2]|0);Hn(a,c[b+40>>2]|0)}if((c[a>>2]|0)==(b|0))c[a>>2]=0;d=c[a+4>>2]|0;if(!d){c[a+4>>2]=b;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);c[a+4>>2]=b;return}function In(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+32>>2]|0;c[g>>2]=(c[g>>2]|0)+1;qg(a,Qd(a,b,f)|0);qg(a,Qd(a,d,f)|0);qg(a,Qd(a,e,f)|0);return}function Jn(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);else{a=c[a+8>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e,f,g)}return}function Kn(a){a=a|0;var b=0;b=l;l=l+48|0;g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Ip(a,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Ln(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+4>>2]|0;e=gJ(d)|0;if((e|0)==(gJ(c[a+8>>2]|0)|0)){eo(a,$B(e)|0);d=c[a+4>>2]|0}zm((c[a+12>>2]|0)+(d*96|0)|0,b);c[a+4>>2]=(c[a+4>>2]|0)+1;return}function Mn(a,b){a=a|0;b=b|0;var d=0,e=0;c[a+72>>2]=(c[a+72>>2]|0)+1;d=c[a+20>>2]|0;if((d|0)>0)do{e=d;d=d+-1|0;if((c[(c[a+28>>2]|0)+(d*80|0)+64>>2]|0)==(b|0))re(a,d)}while((e|0)>1);Ib[c[(c[a>>2]|0)+68>>2]&511](a);return}function Nn(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:case 1:if(e>>>0<3){g[a+600>>2]=d;c[a+592>>2]=c[a+592>>2]|2;return}else{g[a+432>>2]=d;return}case 4:case 3:{g[(e>>>0<3?a+596|0:a+604|0)>>2]=d;c[a+592>>2]=c[a+592>>2]|(e>>>0<3?1:4);return}default:return}}function On(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;if(!b)return;d=c[a+16>>2]|0;if(d>>>0<=b>>>0?(d+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Pn(a){a=a|0;var b=0,d=0;if((c[a+248>>2]|0)<=0)return;b=0;do{d=(c[(c[a+256>>2]|0)+(b<<2)>>2]|0)+472|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;b=b+1|0}while((b|0)<(c[a+248>>2]|0));return}function Qn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))eo(a,b);while(1){if((e|0)>=(b|0))break;zm((c[a+12>>2]|0)+(e*96|0)|0,d);e=e+1|0}c[a+4>>2]=b;return}function Rn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+96|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+96|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));Qn(a,d,f);Zq(b,d,c[a+12>>2]|0);l=f;return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+52>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[a+60>>2]|0)+(f<<2)>>2]|0;if(e){Ob[c[(c[e>>2]|0)+16>>2]&127](e,b);d=c[a+52>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))$n(a,b);while(1){if((e|0)>=(b|0))break;c[(c[a+12>>2]|0)+(e<<2)>>2]=c[d>>2];e=e+1|0}c[a+4>>2]=b;return}function Un(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[a+32>>2]|0;c[f>>2]=(c[f>>2]|0)+1;qg(a,Qd(a,b,0)|0);qg(a,Qd(a,d,0)|0);qg(a,Qd(a,e,0)|0);return}function Vn(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];c[a+68>>2]=c[d>>2];c[a+68+4>>2]=c[d+4>>2];c[a+68+8>>2]=c[d+8>>2];c[a+68+12>>2]=c[d+12>>2];c[a+48>>2]=1;return}function Wn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[d>>2]|0;a=vy(c[b>>2]|0)|0;e=vy(e)|0;if(a|0)Sb[c[(c[a>>2]|0)+28>>2]&127](a,d,b);if(!e)return 0;Sb[c[(c[e>>2]|0)+28>>2]&127](e,b,d);return 0}function Xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a;e=b;f=d+104|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));Sv(a+104|0,b+104|0);Tv(a+124|0,b+124|0);Tv(a+144|0,b+144|0);return}function Yn(a,d){a=a|0;d=d|0;var e=0,f=0;if(b[a+56>>1]|0)return;b[a+64>>1]=1;d=b[a+58>>1]|0;f=c[a+60>>2]|0;if((d&65535)>1){e=1;do{d=e;e=e+1|0;b[f+(d<<6)+48>>1]=e;d=b[a+58>>1]|0}while(e>>>0<(d&65535)>>>0)}b[f+((d&65535)+-1<<6)+48>>1]=0;return}function Zn(a,b,c){a=+a;b=b|0;c=c|0;var d=0,e=0;e=l;l=l+32|0;d=Ds(144)|0;g[e+8>>2]=0.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Xk(d,a,b,c,e+16|0);l=e;return d|0}function _n(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=c[b+16>>2];c[d+4>>2]=c[b+16+4>>2];c[d+8>>2]=c[b+16+8>>2];c[d+12>>2]=c[b+16+12>>2];c[e>>2]=c[b+32>>2];c[e+4>>2]=c[b+32+4>>2];c[e+8>>2]=c[b+32+8>>2];c[e+12>>2]=c[b+32+12>>2];return}function $n(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=It(d)|0;tr(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ao(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=c[a+4>>2]|0;if(!(i&1))h=i>>8;else h=c[(c[e>>2]|0)+(i>>8)>>2]|0;a=c[a>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e+h|0,i&2|0?f:2,g);return}function bo(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;d=c[a+12>>2]|0;if(d|0){c[a+12>>2]=c[d>>2];c[a+8>>2]=(c[a+8>>2]|0)+-1;b=d;return b|0}c[6995]=(c[6995]|0)+1;a=sc(b+19|0)|0;if(!a){b=0;return b|0}c[(a+4+15&-16)+-4>>2]=a;b=a+4+15&-16;return b|0}function co(b){b=b|0;g[b+60>>2]=0.0;g[b+8>>2]=0.0;g[b+12>>2]=.10000000149011612;g[b+16>>2]=300.0;g[b>>2]=1.0;g[b+4>>2]=-1.0;g[b+28>>2]=0.0;g[b+32>>2]=.20000000298023224;g[b+36>>2]=0.0;g[b+40>>2]=0.0;g[b+20>>2]=1.0;g[b+24>>2]=.5;c[b+56>>2]=0;g[b+48>>2]=0.0;a[b+44>>0]=0;return}function eo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=$t(d)|0;Zq(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function fo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g[a+692>>2]=(c-b)*.5;b=+mh((c-b)*.5+b,6.2831854820251465);if(!(b<-3.1415927410125732)){if(b>3.1415927410125732)b=b+-6.2831854820251465}else b=b+6.2831854820251465;g[a+688>>2]=b;g[a+696>>2]=d;g[a+700>>2]=e;g[a+704>>2]=f;return}function go(a,b,d){a=a|0;b=+b;d=+d;var e=0;e=l;l=l+16|0;g[e+12>>2]=b;g[e+8>>2]=d;g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+504>>2]=c[(b<0.0?e+4|0:b>1.0?e:e+12|0)>>2];g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+508>>2]=c[(d<0.0?e+4|0:d>1.0?e:e+8|0)>>2];l=e;return}function ho(){var b=0;b=l;l=l+32|0;if(a[22384]|0){l=b;return}if(!(Uz(22384)|0)){l=b;return}Rm();g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(b+16|0,b+8|0,b+4|0,b);Xq(22728,22792,b+16|0);l=b;return}function io(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[(c[b>>2]|0)+16>>2]|0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[d&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1497645650,a);return}function jo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=du(d)|0;Jo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ko(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=eu(d)|0;Eo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function lo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=fu(d)|0;Oo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function mo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+52>>2];c[b+4>>2]=c[a+52+4>>2];c[b+8>>2]=c[a+52+8>>2];c[b+12>>2]=c[a+52+12>>2];c[d>>2]=c[a+68>>2];c[d+4>>2]=c[a+68+4>>2];c[d+8>>2]=c[a+68+8>>2];c[d+12>>2]=c[a+68+12>>2];return}function no(a){a=a|0;var b=0,d=0,e=0;b=c[a+24>>2]|0;if((b|0)<=0)return;e=0;do{d=c[(c[a+32>>2]|0)+(e<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:{Eg(d);b=c[a+24>>2]|0}}e=e+1|0}while((e|0)<(b|0));return}function oo(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1245859651,a);return}function po(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);else{a=c[a+8>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d,e)}return}function qo(a,b,c){a=a|0;b=b|0;c=+c;var d=0;d=l;l=l+16|0;g[d+12>>2]=+g[(gJ(b)|0)>>2]*c;g[d+8>>2]=+g[(OI(b)|0)>>2]*c;g[d+4>>2]=+g[(NI(b)|0)>>2]*c;g[d>>2]=+g[b+12>>2]*c;dw(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function ro(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+8>>2];c[b+4>>2]=c[a+8+4>>2];c[b+8>>2]=c[a+8+8>>2];c[b+12>>2]=c[a+8+12>>2];c[d>>2]=c[a+24>>2];c[d+4>>2]=c[a+24+4>>2];c[d+8>>2]=c[a+24+8>>2];c[d+12>>2]=c[a+24+12>>2];return}function so(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+52>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+56>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346455635,a);return}function to(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+80|0;Gn(c+32|0,b);Br(c,+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);fm(c+16|0,c+32|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2]);Xq(a,c+32|0,c+16|0);l=c;return}function uo(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=c[a+4>>2]|0;if(!(h&1))g=h>>8;else g=c[(c[d>>2]|0)+(h>>8)>>2]|0;a=c[a>>2]|0;Zb[c[(c[a>>2]|0)+24>>2]&31](a,b,d+g|0,h&2|0?e:2,f);return}function vo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;return 17123}function wo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Qq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+404>>2]);us(a+372|0,e+16|0)|0;l=e;return}function xo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;fm(e,a+324|0,b,c,d);jq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+388|0,e+16|0)|0;l=e;return}function yo(a,b,d){a=a|0;b=b|0;d=d|0;c[a+164>>2]=c[b>>2];c[a+164+4>>2]=c[b+4>>2];c[a+164+8>>2]=c[b+8>>2];c[a+164+12>>2]=c[b+12>>2];b=gJ(b)|0;if((!(+g[b>>2]!=1.0)?!(+g[b+4>>2]!=1.0):0)?!(+g[b+8>>2]!=1.0):0)d=0;c[a+180>>2]=d;return}function zo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+952>>2];c[b+4>>2]=c[a+952+4>>2];c[b+8>>2]=c[a+952+8>>2];c[b+12>>2]=c[a+952+12>>2];c[d>>2]=c[a+968>>2];c[d+4>>2]=c[a+968+4>>2];c[d+8>>2]=c[a+968+8>>2];c[d+12>>2]=c[a+968+12>>2];return}function Ao(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if((c|0)==-1)switch(b|0){case 2:case 1:{d=+g[a+336>>2];break a}case 4:case 3:{d=+g[a+340>>2];break a}default:{d=3402823466385288598117041.0e14;break a}}else d=3402823466385288598117041.0e14;while(0);return +d}function Bo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+g[b+32>>2];e=+g[b+36>>2];e=+g[c+4>>2]>=0.0?e:-e;d=+g[b+40>>2];d=+g[c+8>>2]>=0.0?d:-d;g[a>>2]=+g[c>>2]>=0.0?f:-f;g[a+4>>2]=e;g[a+8>>2]=d;g[a+12>>2]=0.0;return}function Co(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+4>>2]|0;if(!(g&1))f=g>>8;else f=c[(c[d>>2]|0)+(g>>8)>>2]|0;a=c[a>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d+f|0,g&2|0?e:2);return}function Do(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Eo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=gJ(d+(e*52|0)|0)|0;g=(c[a+12>>2]|0)+(e*52|0)|0;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Fo(a,b){a=a|0;b=b|0;var d=0,e=0;e=c[a+288>>2]|0;a:do if((e|0)>0){d=c[a+296>>2]|0;a=0;while(1){if((c[d+(a<<2)>>2]|0)==(b|0))break a;a=a+1|0;if((a|0)>=(e|0)){a=e;break}}}else a=e;while(0);return (a|0)>=(e|0)|0}function Go(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22368]|0))Uz(22368)|0;Bp(d,c[b+108>>2]|0,c[b+120>>2]|0);c[5674]=c[d>>2];c[5675]=c[d+4>>2];c[5676]=c[d+8>>2];c[5677]=c[d+12>>2];l=d;return 22696}function Ho(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,1);return a|0}function Io(a,b){a=a|0;b=b|0;var d=0;d=c[a+4>>2]|0;if((c[b>>2]|0)!=(d|0)?(c[b+4>>2]|0)!=(d|0):0)return 0;d=c[a+8>>2]|0;Sb[c[(c[d>>2]|0)+32>>2]&127](d,b,c[a+12>>2]|0);return 0}function Jo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*104|0)|0;g=(c[a+12>>2]|0)+(e*104|0)|0;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Ko(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Lo(a){a=a|0;var b=0.0,d=0.0;if(c[a+204>>2]&3|0)return;d=+g[a+428>>2]*+g[a+412>>2];b=+g[a+432>>2]*+g[a+416>>2];g[a+472>>2]=+g[a+424>>2]*+g[a+408>>2]+ +g[a+472>>2];g[a+476>>2]=d+ +g[a+476>>2];g[a+480>>2]=b+ +g[a+480>>2];return}function Mo(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,0);return a|0}function No(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Oo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*44|0)|0;g=(c[a+12>>2]|0)+(e*44|0)|0;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Po(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+12>>2]=-+g[(gJ(b)|0)>>2];g[c+8>>2]=-+g[(OI(b)|0)>>2];g[c+4>>2]=-+g[(NI(b)|0)>>2];g[c>>2]=-+g[b+12>>2];dw(a,c+12|0,c+8|0,c+4|0,c);l=c;return}function Qo(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Ro(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;e=l;l=l+16|0;d=+EF(a);d=+VI(d*+EF(b));c=+Gp(a,b);if(c<0.0){Po(e,b);c=+Gp(a,e)}d=+$A(c/d)*2.0;l=e;return +d}function So(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0;h=c[a+108>>2]|0;f=+g[h+(b<<4)+4>>2]*+g[a+20>>2];e=+g[h+(b<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[h+(b<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=e;g[d+12>>2]=0.0;return}function To(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+32|0;c[e>>2]=c[a+60>>2];c[e+4>>2]=0;c[e+8>>2]=b;c[e+12>>2]=e+20;c[e+16>>2]=d;if((SC(_a(140,e|0)|0)|0)<0){c[e+20>>2]=-1;a=-1}else a=c[e+20>>2]|0;l=e;return a|0}function Uo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,12)|0;e=a[b+4>>0]|0;c[f+4>>2]=c[d>>2];c[f>>2]=3820;a[f+8>>0]=e;return f|0}function Vo(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function Wo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]+c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]+c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]+c;g[a+12>>2]=+g[a+12>>2]+ +g[b+12>>2];return a|0}function Xo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]-c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]-c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]-c;g[a+12>>2]=+g[a+12>>2]-+g[b+12>>2];return a|0}function Yo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22352]|0))Uz(22352)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5646]=c[d>>2];c[5647]=c[d+4>>2];c[5648]=c[d+8>>2];c[5649]=c[d+12>>2];l=d;return 22584}function Zo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22416]|0))Uz(22416)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5718]=c[d>>2];c[5719]=c[d+4>>2];c[5720]=c[d+8>>2];c[5721]=c[d+12>>2];l=d;return 22872}function _o(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){X()|0;Za(12);return -1}c[i>>2]=a;if((a|0)>(W()|0)?(V()|0)==0:0){c[i>>2]=b;Za(12);return -1}return b|0}function $o(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=gJ(c[b+4>>2]|0)|0;c[d>>2]=0;Tn(a,e,d);tr(b,e,c[a+12>>2]|0);l=d;return}function ap(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+g[b+20>>2];d=e*+g[b+260>>2]+ +g[b+72>>2];c=e*+g[b+264>>2]+ +g[b+76>>2];g[a>>2]=+g[b+256>>2]*e+ +g[b+68>>2];g[a+4>>2]=d;g[a+8>>2]=c;g[a+12>>2]=0.0;return}function bp(b){b=b|0;var d=0;d=a[b+74>>0]|0;a[b+74>>0]=d+255|d;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function cp(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if((e|0)!=-1)return;switch(b|0){case 2:case 1:{g[a+336>>2]=d;c[a+332>>2]=c[a+332>>2]|1;return}case 4:case 3:{g[a+340>>2]=d;c[a+332>>2]=c[a+332>>2]|2;return}default:return}}function dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(NI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(NI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function ep(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(OI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(OI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(OI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function fp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22376]|0))Uz(22376)|0;_i(f,b,d,e);c[5678]=c[f>>2];c[5679]=c[f+4>>2];c[5680]=c[f+8>>2];c[5681]=c[f+12>>2];l=f;return 22712}function gp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22424]|0))Uz(22424)|0;_i(f,b,d,e);c[5722]=c[f>>2];c[5723]=c[f+4>>2];c[5724]=c[f+8>>2];c[5725]=c[f+12>>2];l=f;return 22888}function hp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((b|0)==(d|0))return;e=c[(c[a+4>>2]|0)+96>>2]|0;Bb[c[(c[e>>2]|0)+8>>2]&63](e,c[b+36>>2]|0,c[d+36>>2]|0)|0;d=(c[a+4>>2]|0)+120|0;c[d>>2]=(c[d>>2]|0)+1;return}function ip(a){a=a|0;var b=0,d=0.0,e=0.0,f=0.0;b=l;l=l+32|0;Sb[c[(c[a>>2]|0)+12>>2]&127](a,b+8|0,b);f=+g[b+8>>2];e=+g[b+8+4>>2];d=+g[b+8+8>>2];d=+D(+(f*f+e*e+d*d));l=b;return +(d+ +g[b>>2])}function jp(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function kp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;c[f>>2]=5516;c[f+4>>2]=d;c[f+8>>2]=a;Sb[c[(c[b>>2]|0)+48>>2]&127](b,f,e);l=f;return}function lp(a,b,d){a=a|0;b=b|0;d=d|0;a=c[b+8>>2]|0;if(!((d|0)!=0&(a|0)!=0))return;Ib[c[c[a>>2]>>2]&511](a);Ob[c[(c[d>>2]|0)+60>>2]&127](d,c[b+8>>2]|0);c[b+8>>2]=0;return}function mp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9144;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function np(b){b=b|0;var d=0;c[b>>2]=7120;if(a[b+65>>0]|0?(d=c[b+56>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function op(a,b){a=a|0;b=b|0;a=c[a+16>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function pp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Pt()|0;Su(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function qp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Ds(16)|0;dw(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function rp(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);return}function sp(a,b){a=a|0;b=+b;var d=0,e=0;if((c[a+296>>2]|0)<=0)return;d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0));return}function tp(a){a=a|0;var b=0.0,d=0,e=0,f=0.0;e=c[a+772>>2]|0;if((e|0)<=0){b=0.0;return +b}d=c[a+780>>2]|0;a=0;b=0.0;do{f=+g[d+(a*104|0)+88>>2];b=b+(f>0.0?1.0/f:0.0);a=a+1|0}while((a|0)!=(e|0));return +b}function up(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;return}function vp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22344]|0))Uz(22344)|0;BA(d,b);c[5642]=c[d>>2];c[5643]=c[d+4>>2];c[5644]=c[d+8>>2];c[5645]=c[d+12>>2];l=d;return 22568}function wp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22336]|0))Uz(22336)|0;kz(d,b);c[5638]=c[d>>2];c[5639]=c[d+4>>2];c[5640]=c[d+8>>2];c[5641]=c[d+12>>2];l=d;return 22552}function xp(b){b=b|0;var c=0.0,d=0.0,e=0.0;if(!(a[22400]|0))Uz(22400)|0;e=-+g[b+52>>2];d=+g[b+260>>2]*e;c=+g[b+264>>2]*e;g[5710]=+g[b+256>>2]*e;g[5711]=d;g[5712]=c;g[5713]=0.0;return 22840}function yp(a,b,d){a=a|0;b=+b;d=d|0;b=b*.4000000059604645*+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=b*+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b;g[d+4>>2]=b;g[d+8>>2]=b;g[d+12>>2]=0.0;return}function zp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,16)|0;c[e+4>>2]=c[b>>2];c[e>>2]=4296;return e|0}function Ap(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=c*h-d*f;g[i+4>>2]=d*e-b*h;g[i>>2]=b*f-c*e;$s(a,i+8|0,i+4|0,i);l=i;return}function Bp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;b=gJ(b+4|0)|0;e=(gJ($G(b,0)|0)|0)+(c<<2)|0;d=(gJ($G(b,1)|0)|0)+(c<<2)|0;$s(a,e,d,(gJ($G(b,2)|0)|0)+(c<<2)|0);return}function Cp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=-581039253;c[d+4>>2]=-581039253;c[d+8>>2]=-581039253;g[d+12>>2]=0.0;c[e>>2]=1566444395;c[e+4>>2]=1566444395;c[e+8>>2]=1566444395;g[e+12>>2]=0.0;return}function Dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(gJ(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(gJ(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(gJ(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function Ep(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22320]|0))Uz(22320)|0;lq(d,b);c[5630]=c[d>>2];c[5631]=c[d+4>>2];c[5632]=c[d+8>>2];c[5633]=c[d+12>>2];l=d;return 22520}function Fp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22328]|0))Uz(22328)|0;Cm(d,b);c[5634]=c[d>>2];c[5635]=c[d+4>>2];c[5636]=c[d+8>>2];c[5637]=c[d+12>>2];l=d;return 22536}function Gp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[a>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[a+4>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[a+8>>2];c=d+c*+g[(NI(b)|0)>>2];return +(c+ +g[a+12>>2]*+g[b+12>>2])}function Hp(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Ip(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;$s(a,b,c,d);$s(a+16|0,e,f,g);$s(a+32|0,h,i,j);return}function Jp(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;return}function Kp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+64|0;zk(d+16|0,b,c);km(d,b,+g[c+48>>2],+g[c+52>>2],+g[c+56>>2]);Xq(a,d+16|0,d);l=d;return}function Lp(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Mp(a){a=a|0;var b=0,d=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),d=c[a+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Np(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);return}function Op(a,b){a=a|0;b=b|0;var d=0;d=(c[a+96>>2]|0)+4|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];uj(a);return}function Pp(b,d){b=b|0;d=d|0;var e=0;if(a[b+289>>0]|0?(e=c[b+216>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}a[b+289>>0]=0;c[b+216>>2]=d;c[(c[b+212>>2]|0)+8>>2]=d;return}function Qp(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;return}function Rp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,8)|0;c[e+4>>2]=c[b>>2];c[e>>2]=9572;return e|0}function Sp(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;return}function Tp(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+12>>2]=b;g[f+8>>2]=c;g[f+4>>2]=d;g[f>>2]=e;as(a,f+12|0,f+8|0,f+4|0,f);l=f;return}function Up(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[b+8>>2]|0;e=c[f+344>>2]|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,f,c[d+8>>2]|0);return}function Vp(b){b=b|0;var d=0,e=0;c[b>>2]=6352;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Wp(b){b=b|0;var d=0,e=0;c[b>>2]=9600;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Xp(b){b=b|0;var d=0,e=0;c[b>>2]=5792;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Yp(b){b=b|0;var d=0;c[b>>2]=7120;if(!(a[b+65>>0]|0))return;d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);b=c[b+56>>2]|0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Zp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9164;c[e+4>>2]=b;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function _p(b){b=b|0;var d=0,e=0;c[b>>2]=5888;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function $p(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else gi(b,c,d)|0;return b|0}function aq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(108)|0;Xt(b);rg(a,b);l=b;return a|0}function bq(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=P(b&65535,a&65535)|0;e=(c>>>16)+(P(b&65535,a>>>16)|0)|0;d=P(b>>>16,a&65535)|0;return (A=(e>>>16)+(P(b>>>16,a>>>16)|0)+(((e&65535)+d|0)>>>16)|0,e+d<<16|c&65535|0)|0}function cq(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+C(+(+g[b>>2]));d=+C(+(+g[b+4>>2]));c=+C(+(+g[b+8>>2]));g[a+16>>2]=e;g[a+20>>2]=d;g[a+24>>2]=c;g[a+28>>2]=0.0;return}function dq(a,b){a=a|0;b=b|0;Wf(a,c[b+36>>2]|0);return}function eq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);return}function fq(a,b,c,d,e,f,g,h,i,j,k,l,m){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=k|0;l=+l;m=m|0;Xb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,+j,k|0,+l,m|0)}function gq(b){b=b|0;var d=0,e=0,f=0;e=c[b>>2]|0;f=(a[e>>0]|0)+-48|0;if(f>>>0<10){d=0;do{d=f+(d*10|0)|0;e=e+1|0;c[b>>2]=e;f=(a[e>>0]|0)+-48|0}while(f>>>0<10)}else d=0;return d|0}function hq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;g[a>>2]=(1.0-d)*+g[b>>2]+ +g[c>>2]*d;g[a+4>>2]=(1.0-d)*+g[b+4>>2]+ +g[c+4>>2]*d;g[a+8>>2]=(1.0-d)*+g[b+8>>2]+ +g[c+8>>2]*d;return}function iq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b+e;g[i+4>>2]=c+f;g[i>>2]=d+h;$s(a,i+8|0,i+4|0,i);l=i;return}function jq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b*e;g[i+4>>2]=c*f;g[i>>2]=d*h;$s(a,i+8|0,i+4|0,i);l=i;return}function kq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b-e;g[i+4>>2]=c-f;g[i>>2]=d-h;$s(a,i+8|0,i+4|0,i);l=i;return}function lq(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+8>>2]=-+g[b>>2];g[c+4>>2]=-+g[b+4>>2];g[c>>2]=-+g[b+8>>2];dw(a,c+8|0,c+4|0,c,b+12|0);l=c;return}function mq(a){a=a|0;var b=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(!b)return;Ib[c[c[b>>2]>>2]&511](b);a=c[a+56>>2]|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function nq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+188>>2]|0;a=c[d+188>>2]|0;if(!(c[a+8>>2]&c[b+4>>2])){d=0;return d|0}d=(c[b+8>>2]&c[a+4>>2]|0)!=0;return d|0}function oq(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return +(+cb(0,a|0,b|0,c|0,d|0,e|0,f|0,g|0,h|0))}function pq(a,b){a=a|0;b=b|0;if((b|0)==0?1:(c[b+252>>2]&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}}function qq(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[19831+(b&15)>>0]|0|f;b=Mu(b|0,c|0,4)|0;c=A}while(!((b|0)==0&(c|0)==0));return e|0}function rq(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);return}function sq(){var b=0;b=Ds(40)|0;g[b+12>>2]=1.0;c[b+8>>2]=0;c[b+4>>2]=5;c[b>>2]=3172;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;a[b+16>>0]=1;return b|0}function tq(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function uq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);us(a+472|0,e)|0;l=e;return}function vq(a,b,c){a=+a;b=+b;c=+c;var d=0,e=0;e=l;l=l+16|0;g[e+8>>2]=a;g[e+4>>2]=b;g[e>>2]=c;d=Pt()|0;$s(d,e+8|0,e+4|0,e);l=e;return d|0}function wq(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];uj(a);return}function xq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Gb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)|0}function yq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+488|0,e)|0;l=e;return}function zq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return +wb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Aq(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=Ss()|0;Hg(e,a,b,c,d);return e|0}function Bq(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=qt()|0;ye(h,a,b,c,d,e,f,g);return h|0}function Cq(){var a=0,b=0;a=ts()|0;if((a|0?(b=c[a>>2]|0,b|0):0)?((c[b+48>>2]&-256|0)==1126902528?(c[b+48+4>>2]|0)==1129074247:0):0)qy(c[b+12>>2]|0);qy(nF()|0)}function Dq(a,b,d){a=a|0;b=b|0;d=d|0;mA(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Eq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+388>>2]=c[b>>2];c[a+388+4>>2]=c[b+4>>2];c[a+388+8>>2]=c[b+8>>2];c[a+388+12>>2]=c[b+12>>2];return}function Fq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(88)|0;Xt(b);ce(a,b);l=b;return a|0}function Gq(a,b,d){a=a|0;b=b|0;d=d|0;c[d>>2]=c[a+60+(b<<4)>>2];c[d+4>>2]=c[a+60+(b<<4)+4>>2];c[d+8>>2]=c[a+60+(b<<4)+8>>2];c[d+12>>2]=c[a+60+(b<<4)+12>>2];return}function Hq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+372>>2]=c[b>>2];c[a+372+4>>2]=c[b+4>>2];c[a+372+8>>2]=c[b+8>>2];c[a+372+12>>2]=c[b+12>>2];return}function Iq(b,d){b=b|0;d=d|0;if(!(a[22408]|0))Uz(22408)|0;d=$G(b,d)|0;c[5714]=c[d>>2];c[5715]=c[d+4>>2];c[5716]=c[d+8>>2];c[5717]=c[d+12>>2];return 22856}function Jq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+604>>2]=c[b>>2];c[a+604+4>>2]=c[b+4>>2];c[a+604+8>>2]=c[b+8>>2];c[a+604+12>>2]=c[b+12>>2];return}function Kq(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;k=k|0;l=+l;Yb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,j|0,k|0,+l)}function Lq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+36>>2];+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Mq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+32>>2];b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Nq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;cc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Oq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=c[d>>2];a=Bb[c[(c[a>>2]|0)+16>>2]&63](a,b,e)|0;if(a)c[d>>2]=c[e>>2];l=e;return a&1|0}function Pq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+156+(b<<4)>>2]=c[d>>2];c[a+156+(b<<4)+4>>2]=c[d+4>>2];c[a+156+(b<<4)+8>>2]=c[d+8>>2];c[a+156+(b<<4)+12>>2]=c[d+12>>2];return}function Qq(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+8>>2]=b*e;g[f+4>>2]=c*e;g[f>>2]=d*e;$s(a,f+8|0,f+4|0,f);l=f;return}function Rq(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];g[a+12>>2]=+g[a+12>>2]*+g[b>>2];return a|0}function Sq(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;Ip(a,b,c,d,e,f,g,h,i,j);return}function Tq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=Us(344)|0;Vd(d,a,b,c);return d|0}function Uq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+28+(b<<4)>>2]=c[d>>2];c[a+28+(b<<4)+4>>2]=c[d+4>>2];c[a+28+(b<<4)+8>>2]=c[d+8>>2];c[a+28+(b<<4)+12>>2]=c[d+12>>2];return}function Vq(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(!d){cJ(b);return}if(!(a[b+36>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function Wq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+204>>2]|0;if(b&4|0)return 0;a=c[d+204>>2]|0;if(!(a&4))return (b&3|0)==0|(a&3|0)==0|0;else return 0;return 0}function Xq(a,b,d){a=a|0;b=b|0;d=d|0;Vm(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Yq(b){b=b|0;var d=0;c[b>>2]=6352;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function Zq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;zm(d+(e*96|0)|0,(c[a+12>>2]|0)+(e*96|0)|0);e=e+1|0}return}function _q(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(!d){cJ(b);return}if(!(a[b+24>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function $q(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+128|0;to(c,a+68|0);Kp(c+64|0,a+4|0,c);ur(b,c+64|0);l=c;return}function ar(b){b=b|0;var d=0;c[b>>2]=9600;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function br(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=qt()|0;ye(g,a,b,c,d,e,f,0);return g|0}function cr(b){b=b|0;var d=0;c[b>>2]=5792;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function dr(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;return ((c[b>>2]|0)==(a|0)?1:(c[b+4>>2]|0)==(a|0))|0}function er(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=dt()|0;He(f,a,b,c,d,e);return f|0}function fr(a,b){a=a|0;b=b|0;a=c[a+24>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function gr(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(!d){cJ(b);return}if(!(a[b+20>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function hr(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=b;g[e+4>>2]=c;g[e>>2]=d;$s(a,e+8|0,e+4|0,e);l=e;return}function ir(b){b=b|0;var d=0;c[b>>2]=5888;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function jr(a,b,d){a=a|0;b=b|0;d=d|0;TH(a);c[a>>2]=3056;ur(a+4|0,b);ur(a+68|0,d);ur(a+132|0,b);c[a+196>>2]=0;return}function kr(a){a=a|0;var b=0;b=l;l=l+16|0;Kn(a);g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a+48|0,b+8|0,b+4|0,b);l=b;return}function lr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;var f=0;f=Ds(44)|0;Qm(f,a,b,c,d,e);return f|0}function mr(a,b,c){a=a|0;b=b|0;c=+c;switch(b|0){case 3:{a=a+452|0;break}case 4:{a=a+448|0;break}case 5:{a=a+444|0;break}default:return}g[a>>2]=c;return}function nr(a,b){a=a|0;b=b|0;b=c[b+36>>2]|0;we(a,c[(c[(c[(c[a+4>>2]|0)+4>>2]|0)+28>>2]|0)+(b*80|0)+64>>2]|0,b);return}function or(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return +vb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function pr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)+4>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function qr(a,b,c,d){a=+a;b=b|0;c=c|0;d=d|0;var e=0;e=Ds(144)|0;Xk(e,a,b,c,d);return e|0}function rr(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +(+ub[c[(c[a>>2]|0)+12>>2]&1](a,b,d,e,f,g,h,i))}function sr(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Mu(b|0,c|0,3)|0;c=A}while(!((b|0)==0&(c|0)==0));return d|0}function tr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;c[d+(e<<2)>>2]=c[(c[a+12>>2]|0)+(e<<2)>>2];e=e+1|0}return}function ur(a,b){a=a|0;b=b|0;Vm(a,b);c[a+48>>2]=c[b+48>>2];c[a+48+4>>2]=c[b+48+4>>2];c[a+48+8>>2]=c[b+48+8>>2];c[a+48+12>>2]=c[b+48+12>>2];return}function vr(a,b){a=a|0;b=b|0;$s(a,b,b+16|0,b+32|0);$s(a+16|0,b+4|0,b+20|0,b+36|0);$s(a+32|0,b+8|0,b+24|0,b+40|0);return}function wr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function xr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a<<2|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function yr(a,b){a=a|0;b=b|0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);id(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function zr(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;bc[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Ar(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,(b+1|0)%3|0,e);return}function Br(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=-b;g[e+4>>2]=-c;g[e>>2]=-d;$s(a,e+8|0,e+4|0,e);l=e;return}function Cr(a,b){a=a|0;b=b|0;c[a+100>>2]=c[b>>2];c[a+100+4>>2]=c[b+4>>2];c[a+100+8>>2]=c[b+8>>2];c[a+100+12>>2]=c[b+12>>2];return}function Dr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*104|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Er(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*52|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Fr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*44|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Gr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=rt()|0;he(f,a,b,c&65535,d,e);return f|0}function Hr(a,b){a=a|0;b=b|0;c[a+696>>2]=c[b>>2];c[a+696+4>>2]=c[b+4>>2];c[a+696+8>>2]=c[b+8>>2];c[a+696+12>>2]=c[b+12>>2];return}function Ir(a,b){a=a|0;b=b|0;c[a+680>>2]=c[b>>2];c[a+680+4>>2]=c[b+4>>2];c[a+680+8>>2]=c[b+8>>2];c[a+680+12>>2]=c[b+12>>2];return}function Jr(a,b){a=a|0;b=b|0;c[a+156>>2]=c[b>>2];c[a+156+4>>2]=c[b+4>>2];c[a+156+8>>2]=c[b+8>>2];c[a+156+12>>2]=c[b+12>>2];return}function Kr(b,c,d){b=b|0;c=c|0;d=d|0;a[b+1309+c>>0]=d&1;if((c|0)<3){a[b+788+c>>0]=d&1;return}else{a[b+868+(c+-3<<6)+44>>0]=d&1;return}}function Lr(a,b){a=a|0;b=b|0;c[a+112>>2]=c[b>>2];c[a+112+4>>2]=c[b+4>>2];c[a+112+8>>2]=c[b+8>>2];c[a+112+12>>2]=c[b+12>>2];return}function Mr(a,b){a=a|0;b=b|0;c[a+56>>2]=c[b>>2];c[a+56+4>>2]=c[b+4>>2];c[a+56+8>>2]=c[b+8>>2];c[a+56+12>>2]=c[b+12>>2];return}function Nr(b){b=b|0;if(a[22448]|0)return 23016;if(!(Uz(22448)|0))return 23016;c[5754]=1065353216;c[5755]=1065353216;c[5756]=1065353216;g[5757]=0.0;return 23016}function Or(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a*96|19)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Pr(a){a=a|0;var b=0;do{c[a+4>>2]=0;g[a+8>>2]=0.0;b=c[a+24>>2]|0;if(b|0)Pr(b);a=c[a+28>>2]|0}while((a|0)!=0);return}function Qr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Ud(a,b,c,d,e,f);return}function Rr(a,b){a=a|0;b=b|0;c[a+172>>2]=c[b>>2];c[a+172+4>>2]=c[b+4>>2];c[a+172+8>>2]=c[b+8>>2];c[a+172+12>>2]=c[b+12>>2];return}function Sr(a,b){a=a|0;b=b|0;c[a+32>>2]=c[b>>2];c[a+32+4>>2]=c[b+4>>2];c[a+32+8>>2]=c[b+8>>2];c[a+32+12>>2]=c[b+12>>2];return}function Tr(a){a=a|0;g[a>>2]=5.880000114440918;g[a+4>>2]=.8299999833106995;g[a+8>>2]=.8799999952316284;g[a+12>>2]=500.0;g[a+16>>2]=10.5;g[a+20>>2]=6.0e3;return}function Ur(a,b){a=a|0;b=b|0;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];return}function Vr(a,b){a=a|0;b=b|0;c[a+316>>2]=c[b>>2];c[a+316+4>>2]=c[b+4>>2];c[a+316+8>>2]=c[b+8>>2];c[a+316+12>>2]=c[b+12>>2];return}function Wr(a,b){a=a|0;b=b|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];return}function Xr(a,b){a=a|0;b=b|0;c[a+64>>2]=c[b>>2];c[a+64+4>>2]=c[b+4>>2];c[a+64+8>>2]=c[b+8>>2];c[a+64+12>>2]=c[b+12>>2];return}function Yr(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return Fb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Zr(a,b){a=a|0;b=b|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];return}function _r(a,b){a=a|0;b=b|0;c[a+188>>2]=c[b>>2];c[a+188+4>>2]=c[b+4>>2];c[a+188+8>>2]=c[b+8>>2];c[a+188+12>>2]=c[b+12>>2];return}function $r(a,b){a=a|0;b=b|0;c[a+40>>2]=c[b>>2];c[a+40+4>>2]=c[b+4>>2];c[a+40+8>>2]=c[b+8>>2];c[a+40+12>>2]=c[b+12>>2];return}function as(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];c[a+12>>2]=c[f>>2];return}function bs(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +ub[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function cs(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];return}function ds(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+8>>2])){b=0;return b|0}b=(c[a+4>>2]&c[b+8>>2]|0)!=0;return b|0}function es(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+12>>2])){b=0;return b|0}b=(c[a+8>>2]&c[b+8>>2]|0)!=0;return b|0}function fs(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function gs(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+16>>2])){b=0;return b|0}b=(c[a+12>>2]&c[b+8>>2]|0)!=0;return b|0}function hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=rt()|0;he(e,a,b,c&65535,d,0);return e|0}function is(a,b){a=a|0;b=b|0;c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];return}function js(a,b){a=a|0;b=b|0;c[a+36>>2]=c[b>>2];c[a+36+4>>2]=c[b+4>>2];c[a+36+8>>2]=c[b+8>>2];c[a+36+12>>2]=c[b+12>>2];return}function ks(a,b){a=a|0;b=b|0;c[a>>2]=c[b+264>>2];c[a+4>>2]=c[b+264+4>>2];c[a+8>>2]=c[b+264+8>>2];c[a+12>>2]=c[b+264+12>>2];return}function ls(b,d){b=b|0;d=d|0;if(!(a[22360]|0))Uz(22360)|0;yn(aC(c[b+12>>2]|0,d)|0);return 22600}function ms(){var a=0;a=Ds(16)|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Dz(a);return a|0}function ns(a,b){a=a|0;b=+b;dg(a,b);a=c[a+472>>2]|0;Jb[c[(c[a>>2]|0)+24>>2]&31](a,b);return}function os(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=dt()|0;Yd(d,a,b,c);return d|0}function ps(){var a=0;a=jt()|0;ho();ho();jr(a,22728,22728);return a|0}function qs(a,b,d){a=a|0;b=b|0;d=d|0;if((c[a+4>>2]|0)==(b|0)?(c[a+28>>2]|0)!=1:0)c[a+28>>2]=d;return}function rs(){var a=0,b=0;b=ct(c[5628]|0,c[5629]|0,1284865837,1481765933)|0;b=Ow(b|0,A|0,1,0)|0;a=A;c[5628]=b;c[5629]=a;a=Mu(b|0,a|0,33)|0;return a|0}function ss(a,b){a=a|0;b=b|0;c[a+48>>2]=c[b>>2];c[a+48+4>>2]=c[b+4>>2];c[a+48+8>>2]=c[b+8>>2];c[a+48+12>>2]=c[b+12>>2];return}function ts(){var a=0,b=0;a=l;l=l+16|0;if(!(jb(28552,3)|0)){b=hb(c[7139]|0)|0;l=a;return b|0}else Ww(22016,a);return 0}function us(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]+ +g[b>>2];g[a+4>>2]=+g[a+4>>2]+ +g[b+4>>2];g[a+8>>2]=+g[a+8>>2]+ +g[b+8>>2];return a|0}function vs(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]-+g[b>>2];g[a+4>>2]=+g[a+4>>2]-+g[b+4>>2];g[a+8>>2]=+g[a+8>>2]-+g[b+8>>2];return a|0}function ws(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+64|0;Kp(c,b,a+68|0);ur(a+4|0,c);l=c;return}function xs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;Ye(a,b,d,e,f|0)|0;l=f;return (A=c[f+4>>2]|0,c[f>>2]|0)|0}function ys(a,b){a=a|0;b=b|0;c[a+12>>2]=c[b>>2];c[a+12+4>>2]=c[b+4>>2];c[a+12+8>>2]=c[b+8>>2];c[a+12+12>>2]=c[b+12>>2];return}function zs(a,b){a=a|0;b=b|0;c[a+88>>2]=c[b>>2];c[a+88+4>>2]=c[b+4>>2];c[a+88+8>>2]=c[b+8>>2];c[a+88+12>>2]=c[b+12>>2];return}function As(a){a=a|0;var b=0;b=Ds(108)|0;rg(b,a);return b|0}function Bs(a,b){a=a|0;b=b|0;c[a+20>>2]=c[b>>2];c[a+20+4>>2]=c[b+4>>2];c[a+20+8>>2]=c[b+8>>2];c[a+20+12>>2]=c[b+12>>2];return}function Cs(a,b){a=a|0;b=b|0;c[a+76>>2]=c[b>>2];c[a+76+4>>2]=c[b+4>>2];c[a+76+8>>2]=c[b+8>>2];c[a+76+12>>2]=c[b+12>>2];return}function Ds(a){a=a|0;var b=0;b=(a|0)==0?1:a;while(1){a=sc(b)|0;if(a|0)break;a=iF()|0;if(!a){a=0;break}Hb[a&3]()}return a|0}function Es(a,b){a=a|0;b=b|0;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2];return}function Fs(a){a=a|0;var b=0;b=l;l=l+16|0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a,b+8|0,b+4|0,b);l=b;return}function Gs(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function Hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=Us(1252)|0;Bc(e,a,b,c,d);return e|0}function Is(a,b){a=a|0;b=b|0;c[a+72>>2]=c[b>>2];c[a+72+4>>2]=c[b+4>>2];c[a+72+8>>2]=c[b+8>>2];c[a+72+12>>2]=c[b+12>>2];return}function Js(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];return a|0}function Ks(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=rt()|0;he(d,a,b,c&65535,0,0);return d|0}function Ls(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;g[a+(c[b+56>>2]<<2)>>2]=1.0;return}function Ms(a){a=a|0;var b=0;b=l;l=l+16|0;Cd(a);if(!(kb(c[7139]|0,0)|0)){l=b;return}else Ww(22115,b)}function Ns(a,b){a=a|0;b=b|0;c[a+8>>2]=c[b>>2];c[a+8+4>>2]=c[b+4>>2];c[a+8+8>>2]=c[b+8>>2];c[a+8+12>>2]=c[b+12>>2];return}function Os(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(255)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ps(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=Jt()|0;Xe(d,a,b,c);return d|0}function Qs(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ic(b,c,d,e)|0}function Rs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1479)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ss(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(311)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ts(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1407)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Us(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a+19|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Vs(a){a=a|0;if(!(+C(+(+g[a+20>>2]))<1.1920928955078125e-07)){a=0;return a|0}a=+C(+(+g[a+24>>2]))<1.1920928955078125e-07;return a|0}function Ws(a){a=a|0;var b=0;b=jt()|0;ho();jr(b,a,22728);return b|0}function Xs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(191)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ys(a,b){a=a|0;b=b|0;if(!b?c[a+204>>2]&3|0:0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function Zs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a+-4>>2]|0)+8>>2]&127](a+-4|0,b,d,e);return}function _s(a,b){a=a|0;b=b|0;var c=0.0;c=+EF(a);c=+VI(c*+EF(b));return +(+$A(+Gp(a,b)/c))}function $s(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];g[a+12>>2]=0.0;return}function at(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function bt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(119)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ct(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=bq(a,c)|0;f=A;return (A=(P(b,c)|0)+(P(d,a)|0)+f|f&0,e|0|0)|0}function dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1331)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function et(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(!d)return;if(a[b+16>>0]&1)Ey(d);c[b+12>>2]=0;return}function ft(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;ac[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function gt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(379)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ht(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(627)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function it(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(823)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(219)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function kt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+88>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function lt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function mt(a,b){a=a|0;b=b|0;var c=0;c=Ds(84)|0;dn(c,a,b);return c|0}function nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(107)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ot(a){a=+a;a=+$H(a);if(a<-3.1415927410125732){a=a+6.2831854820251465;return +a}if(!(a>3.1415927410125732))return +a;a=a+-6.2831854820251465;return +a}function pt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function qt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(787)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function rt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(135)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function st(a,b){a=a|0;b=b|0;c[a+348>>2]=c[b>>2];c[a+348+4>>2]=c[b+4>>2];c[a+348+8>>2]=c[b+8>>2];return}function tt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)<=0)return;Yk(c|0,0,d<<4|0)|0;return}function ut(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(115)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function vt(a,b){a=a|0;b=b|0;c[a+540>>2]=b;if(!b)return;Ob[c[(c[b>>2]|0)+8>>2]&127](b,a+4|0);return}function wt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;sj(a,b,c,d);return}function xt(a,b){a=a|0;b=b|0;var c=0;c=Jt()|0;Xe(c,a,b,1);return c|0}function yt(a,b){a=a|0;b=b|0;var c=0;c=rt()|0;he(c,a,b,16384,0,0);return c|0}function zt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,a+4|0,b,d);return}function At(a){a=a|0;var b=0;b=Ds(88)|0;ce(b,a);return b|0}function Bt(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=1065353216;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Ct(a,b){a=a|0;b=b|0;var d=0;d=c[a+8>>2]|0;Sb[c[d+64>>2]&127](b,d,c[a+4>>2]|0);return 0}function Dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(75)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Et(a,b){a=a|0;b=b|0;var d=0;d=a+92|0;do{c[a>>2]=c[b>>2];a=a+4|0;b=b+4|0}while((a|0)<(d|0));return}function Ft(a,b){a=a|0;b=b|0;Pa(a|0,b|0)}function Gt(a,b){a=a|0;b=b|0;Oa(a|0,b|0)}function Ht(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Og(a,b,c,d);return}function It(a){a=a|0;if(!a){a=0;return a|0}a=xr(a)|0;return a|0}function Jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(99)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Kt(a,b){a=a|0;b=b|0;return +(+Iy(+g[a>>2],+g[a+4>>2],+g[a+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]))}function Lt(a,b){a=a|0;b=b|0;var c=0;c=Ds(88)|0;qn(c,a,b);return c|0}function Mt(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function Nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(79)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ot(a){a=a|0;var b=0;b=l;l=l+16|0;c[b>>2]=gJ(c[a+60>>2]|0)|0;a=SC(ab(6,b|0)|0)|0;l=b;return a|0}function Pt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(35)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Qt(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Eb[a&3](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Rt(a){a=a|0;var b=0;b=l;l=l+16|0;Ob[c[(c[a>>2]|0)+44>>2]&127](a,b);l=b;return}function St(a){a=a|0;Tf(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Tt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,d,e);return}function Ut(a){a=a|0;c[a>>2]=2976;g[a+4>>2]=1.0;c[a+8>>2]=0;c[a+12>>2]=1;c[a+16>>2]=-1;c[a+20>>2]=0;return}function Vt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8692;c[b+56>>2]=2;return b|0}function Wt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8588;c[b+56>>2]=0;return b|0}function Xt(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=4096;c[a+12>>2]=4096;c[a+16>>2]=0;c[a+20>>2]=1;return}function Yt(a,b,d){a=a|0;b=b|0;d=d|0;xe(c[a+108>>2]|0,c[a+136>>2]|0,b,d);return}function Zt(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Rq(a,c)|0;l=c;return a|0}function _t(a,b){a=a|0;b=b|0;var c=0;c=jt()|0;jr(c,a,b);return c|0}function $t(a){a=a|0;if(!a){a=0;return a|0}a=Or(a)|0;return a|0}function au(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+64>>2]&127](a,b,d);return}function bu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0.0}function cu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+80>>2]&127](a,b,d,e);return}function du(a){a=a|0;if(!a){a=0;return a|0}a=Dr(a)|0;return a|0}function eu(a){a=a|0;if(!a){a=0;return a|0}a=Er(a)|0;return a|0}function fu(a){a=a|0;if(!a){a=0;return a|0}a=Fr(a)|0;return a|0}function gu(){var a=0;a=l;l=l+16|0;if(!(ib(28556,265)|0)){l=a;return}else Ww(22065,a)}function hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;return +rb[a&3](b|0,c|0,d|0,+e,f|0,g|0)}function iu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Js(a,c)|0;l=c;return a|0}function ju(a){a=a|0;if(c[a+204>>2]&3|0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function ku(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;zb[c[(c[a>>2]|0)+8>>2]&31](a,c[b+36>>2]|0)|0;return}function lu(a,b){a=a|0;b=b|0;vr(a,b);$s(a+48|0,b+48|0,b+52|0,b+56|0);return}function mu(a,b,d){a=a|0;b=b|0;d=d|0;Tg(c[a+108>>2]|0,b,d);return}function nu(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+192>>2]=b;c[a+200>>2]=b;return}function ou(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;$b[a&7](b|0,c|0,d|0,e|0,f|0,g|0)}function pu(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=+i;j=j|0;k=+k;l=l|0;T(36)}function qu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+24>>2]&127](a,b,d,e);return}function ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-3);return}function su(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);return}function tu(b,d){b=b|0;d=d|0;b=(a[b+344>>0]|0)==0?3:0;c[d>>2]=b;c[d+4>>2]=b;return}function uu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;a=Rq(a,c)|0;l=c;return a|0}function vu(a,b,d){a=a|0;b=+b;d=d|0;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,.01666666753590107)|0}function wu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b<>>32-c;return a<>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;return}function yu(a){a=a|0;lk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function zu(a){a=a|0;var b=0;b=c[a+68>>2]|0;Ob[c[(c[b>>2]|0)+32>>2]&127](b,c[a+24>>2]|0);return}function Au(a,b){a=a|0;b=b|0;wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Bu(a,b,d,e){a=a|0;b=+b;d=d|0;e=+e;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,e)|0}function Cu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Du(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=0;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Eu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=1065353216;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Fu(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+8>>2]&127](a,b,c[(c[a+8>>2]|0)+48>>2]|0);return}function Gu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;_b[a&0](b|0,c|0,d|0,e|0,f|0,+g)}function Hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;Ub[a&0](b|0,c|0,d|0,+e,f|0,g|0)}function Iu(a,b){a=a|0;b=b|0;xo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ju(a){a=a|0;qC(a+144|0);qC(a+124|0);qC(a+104|0);return}function Ku(b,d,e){b=b|0;d=d|0;e=+e;g[(c[b+780>>2]|0)+(d*104|0)+88>>2]=e>0.0?1.0/e:0.0;a[b+984>>0]=1;return}function Lu(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+20>>2]&7](a,b,d);return}function Mu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Nu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+124>>2]&127](a,e,b,d);return}function Ou(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+112>>2]=b;c[a+116>>2]=d;c[a+120>>2]=e;return}function Pu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Cb[c[(c[a>>2]|0)+8>>2]&31](a,b,d,e)|0;return}function Qu(a,b){a=a|0;b=b|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-1);return}function Su(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;$s(a,b,d,e);c[a+12>>2]=c[f>>2];return}function Tu(b,c,d,e){b=b|0;c=c|0;d=+d;e=+e;a[b+737>>0]=c&1;g[b+680>>2]=d;g[b+684>>2]=e;return}function Uu(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;fo(a,b,c,d,e,f);return}function Vu(a){a=a|0;bk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Wu(a){a=a|0;rk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Xu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;g=g|0;Lb[a&0](b|0,+c,+d,e|0,f|0,g|0)}function Yu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 1.0}function Zu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return}function _u(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(19);return 0}function $u(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,e);return}function av(a){a=a|0;Qg(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function bv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(9);return 0.0}function cv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Yi(a,b,c,d,e);return}function dv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;bg(a,b,c,d,e);return}function ev(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Qa(a|0,b|0,+c,d|0)}function fv(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;Qb[c[(c[a>>2]|0)+28>>2]&7](a,b,d,e);return}function gv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Db[a&1](b|0,c|0,d|0,e|0,f|0)|0}function hv(a,b){a=a|0;b=b|0;Ce(a,b);return}function iv(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=i|0;j=j|0;k=+k;T(37)}function jv(a,b){a=a|0;b=b|0;Tg(c[a+108>>2]|0,b,1);return}function kv(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;ur(a+4|0,b);return}function lv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return +tb[a&15](b|0,c|0,d|0,e|0,f|0)}function mv(a,b){a=a|0;b=b|0;var c=0;c=Xs()|0;ig(c,a,b);return c|0}function nv(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Ui(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (b|0?b:a)|0}function ov(a,b){a=a|0;b=b|0;yq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function pv(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;Js(a,c)|0;l=c;return}function qv(a,b){a=a|0;b=+b;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,1,.01666666753590107)|0}function rv(a){a=a|0;var b=0;b=Ds(8)|0;hw(b,a);return b|0}function sv(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,d);return}function tv(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function uv(b){b=b|0;if((c[b+56>>2]|0)==0?(a[b+44>>0]&1)==0:0){b=0;return b|0}b=1;return b|0}function vv(a){a=a|0;ii(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function wv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(43)}function xv(a){a=a|0;tj(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function yv(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;fo(a,b,c,d,e,1.0);return}function zv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;return +pb[a&3](b|0,c|0,+d,e|0,f|0)}function Av(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Tu(a,b,c,d);return}function Bv(a,b,c){a=a|0;b=b|0;c=c|0;return +Sa(a|0,b|0,c|0)}function Cv(a){a=a|0;c[a>>2]=8404;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Dv(a,b){a=a|0;b=b|0;return c[(bC(c[a+28>>2]|0,b)|0)+64>>2]|0}function Ev(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Zb[a&31](b|0,c|0,d|0,e|0,f|0)}function Fv(a){a=a|0;if(!(c[a+12>>2]|0)){a=0;return a|0}a=c[a+20>>2]|0;return a|0}function Gv(a){a=a|0;et(a);Dw(a);return}function Hv(a){a=a|0;qm(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Iv(a,b){a=a|0;b=b|0;var c=0;c=Ds(64)|0;Dq(c,a,b);return c|0}function Jv(){var a=0;a=Ds(24)|0;Xt(a);return a|0}function Kv(a,b,d){a=a|0;b=b|0;d=+d;Jb[c[(c[a>>2]|0)+16>>2]&31](a,d);return}function Lv(a,b,c){a=a|0;b=b|0;c=c|0;yo(a,b,c);return}function Mv(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,2,-3);return}function Nv(a,b,d){a=a|0;b=+b;d=d|0;Mb[c[(c[a>>2]|0)+32>>2]&15](a,b,d);return}function Ov(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;return}function Pv(a){a=a|0;ji(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Qv(a){a=a|0;ni(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Rv(a,b,d){a=a|0;b=b|0;d=d|0;return +(+qb[c[(c[a>>2]|0)+32>>2]&31](a,b,d))}function Sv(a,b){a=a|0;b=b|0;$o(a,b);return}function Tv(a,b){a=a|0;b=b|0;$o(a,b);return}function Uv(a,b){a=a|0;b=b|0;$o(a,b);return}function Vv(a,b){a=a|0;b=b|0;return c[(aE(c[a+336>>2]|0,b)|0)>>2]|0}function Wv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Wb[a&1](b|0,c|0,d|0,e|0,+f)}function Xv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;Rb[a&0](b|0,c|0,+d,e|0,f|0)}function Yv(a){a=a|0;c[a>>2]=4652;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Zv(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(8);return 0.0}function _v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+16>>2]&127](a,b);return}function $v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+52>>2]&127](a,b);return}function aw(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+8>>2]&7](a,b,d);return}function bw(a,b){a=a|0;b=b|0;wA(a,b);return}function cw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Qc(a,b,c,d)|0;return 1}function dw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;as(a,b,c,d,e);return}function ew(a){a=a|0;var b=0;b=Xs()|0;ig(b,a,1);return b|0}function fw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+232>>2]=b;return}function gw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+252>>2]=b;return}function hw(a,b){a=a|0;b=b|0;CH(a);c[a>>2]=5148;c[a+4>>2]=b;return}function iw(a,b){a=a|0;b=b|0;pr(a,b);return}function jw(a,b){a=a|0;b=b|0;wr(a,b);return}function kw(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,1,-1);return}function lw(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;A=c[j+4>>2]|0;return b|0}function mw(a,b,c){a=a|0;b=b|0;c=c|0;Wh(b,c);return}function nw(a,b){a=a|0;b=b|0;Rn(a,b);return}function ow(a){a=a|0;c[a>>2]=2928;c[a+4>>2]=1;c[a+8>>2]=-1;g[a+12>>2]=0.0;return}function pw(a){a=a|0;rd(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function qw(a){a=a|0;var b=0;b=((c[a+56>>2]|0)+2|0)%3|0;return +(+g[(gJ(a+32|0)|0)+(b<<2)>>2])}function rw(a){a=a|0;c[a>>2]=3148;g[a+4>>2]=1.0;c[a+8>>2]=1;c[a+12>>2]=-1;return}function sw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (A=d,a-c>>>0|0)|0}function tw(a,b){a=a|0;b=b|0;return c[(aE(c[a+12>>2]|0,b)|0)>>2]|0}function uw(a,b){a=a|0;b=b|0;if((c[a+220>>2]&-2|0)==4)return;c[a+220>>2]=b;return}function vw(a,b){a=a|0;b=b|0;Hr(a,b);return}function ww(a,b){a=a|0;b=b|0;Ir(a,b);return}function xw(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,0);return}function yw(a,b){a=a|0;b=+b;ry(a,b);return}function zw(a,b){a=a|0;b=b|0;return BB(a,b)|0}function Aw(a,b){a=a|0;b=b|0;return zb[c[(c[a>>2]|0)+40>>2]&31](a,b)|0}function Bw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+60>>2]&127](a,b);return}function Cw(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function Dw(b){b=b|0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;return}function Ew(a){a=a|0;var b=0;b=Ds(64)|0;cn(b,a);return b|0}function Fw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}function Gw(a,b){a=a|0;b=b|0;xn(a,b);return}function Hw(a,b){a=a|0;b=b|0;zn(a,b);return}function Iw(a,b){a=a|0;b=b|0;An(a,b);return}function Jw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Cb[a&31](b|0,c|0,d|0,e|0)|0}function Kw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);return}function Lw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+128>>2]&127](a,b);return}function Mw(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);return b|0}function Nw(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(42)}function Ow(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return (A=b+d+(a+c>>>0>>>0>>0|0)>>>0,a+c>>>0|0)|0}function Pw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+40>>2]&127](a,b);return}function Qw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+256>>2]=b;return}function Rw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+84>>2]&127](a,b);return}function Sw(a){a=a|0;var b=0;b=ut()|0;Rf(b,a,0);return b|0}function Tw(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Lm(a,b,c,d);return}function Uw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+28>>2]&127](a,b);return}function Vw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+124>>2]&127](a,b);return}function Ww(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;Ik(a,d);rn();bb()}function Xw(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+236>>2]=b;return}function Yw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return +sb[a&1](b|0,c|0,d|0,e|0)}function Zw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+72>>2]&127](a,b);return}function _w(){var a=0;a=rt()|0;lg(a,0,0,16);return a|0}function $w(a){a=a|0;var b=0;b=Ds(284)|0;Gj(b,a);return b|0}function ax(a,b){a=a|0;b=+b;g[a+44>>2]=b;g[a+48>>2]=+F(+b);return}function bx(a,b){a=a|0;b=+b;return +(+nb[c[(c[a>>2]|0)+16>>2]&15](a)*b)}function cx(a){a=a|0;pv(a,+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]));return}function dx(a,b){a=a|0;b=b|0;Uv(a+928|0,b);return}function ex(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function fx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+232>>2]=b;return}function gx(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(18);return 0}function hx(a,b){a=a|0;b=b|0;Oe(a,b);return}function ix(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(7);return 0.0}function jx(a,b,c){a=a|0;b=b|0;c=c|0;xi(a,b,c);return}function kx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Vb[a&127](b|0,c|0,d|0,e|0)}function lx(a,b,c){a=a|0;b=b|0;c=c|0;ll(a,b,c);return}function mx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Pm(a,b,c,d);return}function nx(a,b){a=a|0;b=b|0;xf(a,b);return}function ox(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+68>>2]&127](a,b);return}function px(a){a=a|0;if(!a)return;Ib[c[(c[a>>2]|0)+4>>2]&511](a);return}function qx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+228>>2]=b;return}function rx(){var a=0;a=Xs()|0;ig(a,1,1);return a|0}function sx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+8>>2]&127](a,b);return}function tx(a){a=a|0;return jF(c[a+204>>2]|0)|0}function ux(a,b,c){a=a|0;b=+b;c=+c;my(a,b,c);return}function vx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+20>>2]&31](a,b);return}function wx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Fl(a,b,c,d);return}function xx(a,b){a=a|0;b=b|0;nw(a+848|0,b);return}function yx(a){a=a|0;return MF(+g[a>>2],+g[a+4>>2])|0}function zx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+16>>2]&31](a,b);return}function Ax(a,b){a=a|0;b=b|0;return +(+g[(c[a+136>>2]|0)+(b*284|0)+232>>2])}function Bx(){var a=0;a=Ds(176)|0;Ne(a,0);return a|0}function Cx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+24>>2]&127](a,b);return}function Dx(a,b){a=a|0;b=b|0;c[a+68>>2]=b;return}function Ex(a,b,d){a=a|0;b=b|0;d=d|0;c[a+20>>2]=b;c[a+28>>2]=d;return}function Fx(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16>>2]=b;c[a+24>>2]=d;return}function Gx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function Hx(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=+e;return yb[a&1](b|0,+c,d|0,+e)|0}function Ix(a,b,c){a=a|0;b=b|0;c=+c;Um(a,b,c);return}function Jx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+64>>2]&127](a,b);return}function Kx(a){a=a|0;var b=0;b=((gJ(c[a+252>>2]|0)|0)&2|0)==0;return (b?0:a)|0}function Lx(a,b){a=a|0;b=b|0;return nC(c[a+12>>2]|0,b)|0}function Mx(a,b){a=a|0;b=b|0;return wC(c[a+12>>2]|0,b)|0}function Nx(a,b){a=a|0;b=b|0;return xC(c[a+12>>2]|0,b)|0}function Ox(a,b,c){a=a|0;b=b|0;c=c|0;dm(a,b,c);return}function Px(a,b,c){a=a|0;b=b|0;c=+c;g[a+1340+(b<<2)>>2]=c;return}function Qx(a,b,c){a=a|0;b=b|0;c=c|0;return jc(a,b,c)|0}function Rx(a,b,c){a=a|0;b=b|0;c=+c;mr(a,b,c);return}function Sx(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);cJ(a);return}function Tx(a,b){a=a|0;b=b|0;Ln(a,b);return}function Ux(a,b){a=a|0;b=b|0;Gw(a+768|0,b);return}function Vx(a,b){a=a|0;b=b|0;Hw(a+788|0,b);return}function Wx(a,b){a=a|0;b=b|0;Iw(a+808|0,b);return}function Xx(a){a=a|0;if(!a)return;yF(a);cJ(a);return}function Yx(a,b){a=a|0;b=+b;g[a+32>>2]=b;g[a+36>>2]=b;return}function Zx(a,b,c){a=a|0;b=b|0;c=+c;g[a+1364+(b<<2)>>2]=c;return}function _x(a,b){a=a|0;b=b|0;re(a,b);return}function $x(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;Tb[a&15](b|0,c|0,d|0,+e)}function ay(a){a=a|0;if(!a)return;qC(a);cJ(a);return}function by(a){a=+a;var b=0;b=Dt()|0;sm(b,a);return b|0}function cy(a,b){a=a|0;b=b|0;kv(a,b);return}function dy(a,b){a=a|0;b=+b;g[a+136>>2]=b;return}function ey(a,b){a=a|0;b=+b;uz(a,b);return}function fy(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;Qb[a&7](b|0,c|0,+d,e|0)}function gy(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;Nb[a&0](b|0,+c,d|0,e|0)}function hy(a,b){a=a|0;b=+b;g[a+132>>2]=b;return}function iy(a,b){a=a|0;b=b|0;Vr(a,b);return}function jy(a,b){a=a|0;b=b|0;Wr(a,b);return}function ky(a){a=a|0;var b=0;b=gJ(a+32|0)|0;return +(+g[b+(c[a+56>>2]<<2)>>2])}function ly(a,b){a=a|0;b=b|0;c[a+24>>2]=b;return}function my(a,b,c){a=a|0;b=+b;c=+c;g[a+532>>2]=b;g[a+536>>2]=c;return}function ny(){var a=0;a=ut()|0;Rf(a,1,0);return a|0}function oy(a,b){a=a|0;b=b|0;return IC(a,b)|0}function py(a,b){a=a|0;b=b|0;g[a+56>>2]=+(b|0);return}function qy(a){a=a|0;var b=0;b=l;l=l+16|0;Hb[a&3]();Ww(22168,b)}function ry(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=1;return}function sy(a,b){a=a|0;b=b|0;return c[(c[a+20>>2]|0)+(b<<2)>>2]|0}function ty(a){a=a|0;return +(+rI(+g[a+16>>2]))}function uy(a){a=a|0;return xb[c[(c[a>>2]|0)+40>>2]&127](a)|0}function vy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==4;return (b?a:0)|0}function wy(a){a=a|0;return +(+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]))}function xy(a,b){a=a|0;b=+b;dC(a,b);return}function yy(){var a=0;a=Ds(64)|0;co(a);return a|0}function zy(a,b){a=a|0;b=b|0;_B(a,b);return}function Ay(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+44>>2]&31](a,b);return}function By(a,b){a=a|0;b=b|0;Eq(a,b);return}function Cy(a,b){a=a|0;b=+b;g[a+140>>2]=b;return}function Dy(a){a=a|0;return nG(+g[a+4>>2])|0}function Ey(a){a=a|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Fy(a,b){a=a|0;b=b|0;iD(a,b);return}function Gy(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)+92|0}function Hy(a,b){a=a|0;b=b|0;return Vv(a,b)|0}function Iy(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;return +(a*d+b*e+c*f)}function Jy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==8;return (b?a:0)|0}function Ky(){var a=0;a=Ds(24)|0;Tr(a);return a|0}function Ly(a,b){a=a|0;b=b|0;Hq(a,b);return}function My(a,b){a=a|0;b=+b;UC(a,b);return}function Ny(a){a=a|0;g[a>>2]=.30000001192092896;g[a+4>>2]=1.0;g[a+8>>2]=0.0;return}function Oy(a,b){a=a|0;b=+b;yC(a,b);return}function Py(a,b){a=a|0;b=b|0;jD(a,b);return}function Qy(a,b){a=a|0;b=b|0;ur(a+4|0,b);return}function Ry(a){a=a|0;return QF(c[a+204>>2]|0)|0}function Sy(a,b){a=a|0;b=+b;WC(a,b);return}function Ty(a,b){a=a|0;b=+b;cA(a,b);return}function Uy(a,b){a=a|0;b=+b;XC(a,b);return}function Vy(a,b){a=a|0;b=+b;dA(a,b);return}function Wy(a,b){a=a|0;b=b|0;vt(a,b);return}function Xy(a,b){a=a|0;b=b|0;Jq(a,b);return}function Yy(a){a=a|0;return +(+rI(+g[a+104>>2]))}function Zy(a){a=a|0;return +(+RD(+g[a+12>>2]))}function _y(b,c){b=b|0;c=c|0;a[b+32>>0]=c&1;return}function $y(a){a=a|0;return HF(c[a+8>>2]|0)|0}function az(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Bb[a&63](b|0,c|0,d|0)|0}function bz(a,b){a=a|0;b=b|0;return +(+Ro(a,b))}function cz(a,b){a=a|0;b=b|0;xi(a,b,1);return}function dz(a,b){a=a|0;b=b|0;DC(a,b);return}function ez(a,b){a=a|0;b=b|0;c[a+8>>2]=b<<16>>16;return}function fz(a){a=a|0;if(!a)a=0;else a=(fj(a,2864)|0)!=0;return a&1|0}function gz(a){a=a|0;Jj(a);cJ(a);return}function hz(a,b){a=a|0;b=+b;bF(a,b);return}function iz(a,b){a=a|0;b=b|0;Im(a,b);return}function jz(a,b){a=a|0;b=+b;g[a+120>>2]=b;return}function kz(a,b){a=a|0;b=b|0;kB(a,b,+uE(b));return}function lz(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);return}function mz(a,b){a=a|0;b=b|0;TC(a,b);return}function nz(a,b){a=a|0;b=b|0;lu(a,b);return}function oz(){var a=0;a=Ds(100)|0;Mm(a);return a|0}function pz(a,b){a=a|0;b=+b;g[a+116>>2]=b;return}function qz(a,b){a=a|0;b=+b;g[a+128>>2]=b;return}function rz(a,b){a=a|0;b=b|0;JC(a,b);return}function sz(a,b){a=a|0;b=b|0;c[a+12>>2]=b<<16>>16;return}function tz(a,b){a=a|0;b=b|0;return c[(c[a+236>>2]|0)+(b<<2)>>2]|0}function uz(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=0;return}function vz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +qb[a&31](b|0,c|0,d|0)}function wz(a,b){a=a|0;b=b|0;KC(a,b);return}function xz(a,b){a=a|0;b=b|0;return jc(a,b,8192)|0}function yz(b,c){b=b|0;c=c|0;a[b+124>>0]=c&1;return}function zz(){var a=0;a=Ds(12)|0;Ny(a);return a|0}function Az(a,b){a=a|0;b=b|0;c[a+16>>2]=b<<16>>16;return}function Bz(a){a=a|0;if(!a)return;Ju(a);cJ(a);return}function Cz(a){a=a|0;return xb[c[(c[a>>2]|0)+48>>2]&127](a)|0}function Dz(a){a=a|0;ow(a);c[a>>2]=2904;return}function Ez(a){a=a|0;return pG(a)|0}function Fz(a,b){a=a|0;b=+b;Xw(a,b);return}function Gz(a,b){a=a|0;b=b|0;return +(+wf(a,b))}function Hz(a){a=a|0;return +(+rI(+g[a+124>>2]))}function Iz(){var a=0;a=Ds(4)|0;cC(a);return a|0}function Jz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return}function Kz(a){a=a|0;return kG(c[a+204>>2]|0)|0}function Lz(a,b){a=a|0;b=+b;SD(a,b);return}function Mz(a,b){a=a|0;b=b|0;yh(a,b);return}function Nz(a,b){a=a|0;b=+b;BD(a,b);return}function Oz(a){a=a|0;return xb[c[(c[a>>2]|0)+28>>2]&127](a)|0}function Pz(a,b){a=a|0;b=b|0;return Dv(a,b)|0}function Qz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return Ab[a&7](b|0,c|0,+d)|0}function Rz(a){a=a|0;return uv(a)|0}function Sz(a){a=a|0;return +(+g[a+136>>2])}function Tz(a){a=a|0;return qA(c[a+68>>2]|0)|0}function Uz(b){b=b|0;if((a[b>>0]|0)==1)b=0;else{a[b>>0]=1;b=1}return b|0}function Vz(b,c){b=b|0;c=c|0;a[b+80>>0]=c&1;return}function Wz(a,b){a=a|0;b=b|0;YC(a,b);return}function Xz(a){a=a|0;return +(+g[a+132>>2])}function Yz(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)|0}function Zz(a,b){a=a|0;b=b|0;bD(a,b);return}function _z(a){a=a|0;c[a+4>>2]=(c[a+4>>2]|0)+-1;return}function $z(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;T(41)}function aA(a){a=a|0;return AD(a)|0}function bA(a){a=a|0;Dw(a);return}function cA(a,b){a=a|0;b=+b;g[a+196>>2]=+ot(b);return}function dA(a,b){a=a|0;b=+b;g[a+192>>2]=+ot(b);return}function eA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Sb[a&127](b|0,c|0,d|0)}function fA(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))wk(b,d,a);return}function gA(a,b){a=a|0;b=b|0;ur(a+92|0,b);return}function hA(a,b){a=a|0;b=+b;g[a+104>>2]=b;return}function iA(a){a=a|0;cj(a);cJ(a);return}function jA(a,b){a=a|0;b=+b;g[a+268>>2]=b;return}function kA(a){a=a|0;return +(+rI(+g[a+80>>2]))}function lA(a,b){a=a|0;b=b|0;c[b+780>>2]=0;return}function mA(a,b){a=a|0;b=b|0;vk(a,b);return}function nA(){c[5957]=1065353216;c[5958]=0;c[5959]=0;g[5960]=0.0;return}function oA(a,b){a=a|0;b=+b;fx(a,b);return}function pA(a){a=a|0;return +(+nb[c[(c[a>>2]|0)+48>>2]&15](a))}function qA(a){a=a|0;return xb[c[(c[a>>2]|0)+36>>2]&127](a)|0}function rA(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function sA(a,b){a=a|0;b=b|0;Ld(a,b);return}function tA(a,b){a=a|0;b=b|0;CD(a,b);return}function uA(a){a=a|0;return +(+g[a+140>>2])}function vA(b){b=b|0;return (a[b+32>>0]&1)!=0|0}function wA(b,c){b=b|0;c=c|0;a[b+250>>0]=c&1;return}function xA(a,b){a=a|0;b=b|0;ss(a,b);return}function yA(a,b){a=a|0;b=b|0;Xn(a+348|0,b);return}function zA(a,b){a=a|0;b=b|0;return Kx(b)|0}function AA(a,b){a=a|0;b=+b;g[a+112>>2]=b;return}function BA(a,b){a=a|0;b=b|0;yh(b,a);return}function CA(b,c){b=b|0;c=c|0;a[b+44>>0]=c&1;return}function DA(a){a=a|0;return cH(a)|0}function EA(a){a=a|0;return dH(a)|0}function FA(a){a=a|0;return iH(a)|0}function GA(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(17);return 0}function HA(a){a=a|0;_z(a);return}function IA(a,b){a=a|0;b=b|0;mA(a,b);return}function JA(a,b){a=a|0;b=b|0;return Jy(b)|0}function KA(a,b){a=a|0;b=b|0;c[a+52>>2]=b&1;return}function LA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;return}function MA(a,b,c){a=+a;b=+b;c=+c;return +(+VI(+_A(a,b,c)))}function NA(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Mb[a&15](b|0,+c,d|0)}function OA(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Jk(a,b)|0;return a|0}function PA(a,b){a=a|0;b=+b;g[a+220>>2]=b;return}function QA(a,b){a=a|0;b=+b;g[a+100>>2]=b;return}function RA(b){b=b|0;return (a[b+124>>0]&1)!=0|0}function SA(b,c){b=b|0;c=c|0;a[b+24>>0]=c&1;return}function TA(a){a=a|0;return ~~+g[a+56>>2]|0}function UA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+8+(b<<2)>>2]=d;return}function VA(b,c){b=b|0;c=c|0;a[b+288>>0]=c&1;return}function WA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;Pb[a&7](b|0,c|0,+d)}function XA(a,b){a=a|0;b=+b;g[a+224>>2]=b;return}function YA(a,b){a=a|0;b=+b;qx(a,b);return}function ZA(a){a=a|0;return GC(c[a+220>>2]|0)|0}function _A(a,b,c){a=+a;b=+b;c=+c;return +(+Iy(a,b,c,a,b,c))}function $A(a){a=+a;if(!(a<-1.0)){if(a>1.0)a=1.0}else a=-1.0;return +(+I(+a))}function aB(a){a=a|0;return +(+g[a+120>>2])}function bB(b,c){b=b|0;c=c|0;a[b+16>>0]=c&1;return}function cB(a){a=a|0;return tE(a)|0}function dB(a,b){a=a|0;b=b|0;Vm(a+104|0,b);return}function eB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(4);return 0.0}function fB(a,b){a=a|0;b=+b;g[a+204>>2]=b;return}function gB(a,b){a=a|0;b=+b;g[a+208>>2]=b;return}function hB(a){a=a|0;return +(+g[a+116>>2])}function iB(a){a=a|0;return +(+g[a+128>>2])}function jB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function kB(a,b,c){a=a|0;b=b|0;c=+c;qo(a,b,1.0/c);return}function lB(a){a=a|0;nf(a);cJ(a);return}function mB(a,b){a=a|0;b=b|0;var c=0;c=KB(a|0)|0;return ((b|0)==0?a:c)|0}function nB(a,b){a=a|0;b=+b;g[a+216>>2]=b;return}function oB(b){b=b|0;return (a[b+80>>0]&1)!=0|0}function pB(a,b){a=a|0;b=b|0;c[a+36>>2]=b;return}function qB(a,b){a=a|0;b=b|0;c[a+32>>2]=b;return}function rB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ye(a,b,c,d,0)|0}function sB(a,b){a=a|0;b=+b;g[a+248>>2]=b;return}function tB(b,c){b=b|0;c=c|0;a[b+260>>0]=c&1;return}function uB(b,c){b=b|0;c=c|0;a[b+25>>0]=c&1;return}function vB(a,b,c){a=a|0;b=+b;c=c|0;return}function wB(a,b){a=a|0;b=b|0;c[a+72>>2]=b;return}function xB(a){a=a|0;uu(a,+uE(a))|0;return}function yB(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Kb[a&7](b|0,+c,+d)}function zB(a){a=a|0;return +(+GH(+g[a+12>>2]))}function AB(a,b){a=a|0;b=b|0;c[a+8>>2]=b;return}function BB(a,b){a=a|0;b=b|0;return a+868+(b<<6)|0}function CB(a){a=a|0;return zH(a)|0}function DB(a,b){a=a|0;b=b|0;return +(+_s(a,b))}function EB(a){a=a|0;return c[a+8>>2]&65535|0}function FB(a,b){a=a|0;b=b|0;c[a+220>>2]=b;return}function GB(b,c){b=b|0;c=c|0;a[b+26>>0]=c&1;return}function HB(b,c){b=b|0;c=c|0;a[b+84>>0]=c&1;return}function IB(a){a=a|0;Gi(a);cJ(a);return}function JB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(40)}function KB(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function LB(a){a=a|0;return HH(a)|0}function MB(a){a=a|0;return VE(a)|0}function NB(a){a=a|0;return (c[a+108>>2]|0)+4|0}function OB(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return}function PB(a){a=a|0;return c[a+12>>2]&65535|0}function QB(a){a=a|0;if(!a)return;Ey(a);return}function RB(a,b){a=a|0;b=b|0;Vm(a+28|0,b);return}function SB(a,b,c){a=a|0;b=b|0;c=c|0;return zb[a&31](b|0,c|0)|0}function TB(a,b){a=a|0;b=+b;g[a+244>>2]=b;return}function UB(a,b){a=a|0;b=+b;g[a+240>>2]=b;return}function VB(a){a=a|0;return +(+g[a+104>>2])}function WB(a,b){a=a|0;b=b|0;return Nl(a,b)|0}function XB(a){a=a|0;return MH(a)|0}function YB(a){a=a|0;return c[a+16>>2]&65535|0}function ZB(a){a=a|0;kk(a);cJ(a);return}function _B(b,c){b=b|0;c=c|0;a[b+524>>0]=c&1;return}function $B(a){a=a|0;return ((a|0)==0?1:a<<1)|0}function aC(a,b){a=a|0;b=b|0;return a+(b*96|0)|0}function bC(a,b){a=a|0;b=b|0;return a+(b*80|0)|0}function cC(a){a=a|0;NG(a);c[a>>2]=3e3;return}function dC(a,b){a=a|0;b=+b;g[a+272>>2]=b;return}function eC(a,b){a=a|0;b=+b;g[a+212>>2]=b;return}function fC(a,b){a=a|0;b=+b;g[a+228>>2]=b;return}function gC(a){a=a|0;return +(+g[a+268>>2])}function hC(b){b=b|0;return (a[b+44>>0]&1)!=0|0}function iC(a){a=a|0;return gJ(c[a+84>>2]|0)|0}function jC(a,b){a=a|0;b=b|0;return Xo(a,b)|0}function kC(a,b){a=a|0;b=b|0;return Wo(a,b)|0}function lC(a,b){a=a|0;b=b|0;return +(+Gp(a,b))}function mC(a){a=a|0;return +(+ky(a))}function nC(a,b){a=a|0;b=b|0;return a+(b*104|0)|0}function oC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;T(39)}function pC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(33)}function qC(a){a=a|0;Gv(a);return}function rC(a,b){a=a|0;b=+b;g[a+252>>2]=b;return}function sC(a){a=a|0;return +(+g[a+96>>2])}function tC(a){a=a|0;return YH(a)|0}function uC(a){a=a|0;return (c[a+52>>2]|0)!=0|0}function vC(a){a=a|0;Qi(a);cJ(a);return}function wC(a,b){a=a|0;b=b|0;return a+(b*52|0)|0}function xC(a,b){a=a|0;b=b|0;return a+(b*44|0)|0}function yC(a,b){a=a|0;b=+b;g[a+276>>2]=b;return}function zC(a){a=a|0;bA(a);return}function AC(a){a=a|0;return gJ(c[a+88>>2]|0)|0}function BC(a){a=a|0;return gJ(c[a+780>>2]|0)|0}function CC(b){b=b|0;return (a[b+24>>0]&1)!=0|0}function DC(b,c){b=b|0;c=c|0;a[b+552>>0]=c&1;return}function EC(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function FC(a){a=a|0;return +(+g[a+112>>2])}function GC(a){a=a|0;a=gJ(a)|0;return (a|0)!=5&(a|0)!=2|0}function HC(a){a=a|0;mk(a);cJ(a);return}function IC(a,b){a=a|0;b=b|0;return a+4+(b*192|0)|0}function JC(b,c){b=b|0;c=c|0;a[b+736>>0]=c&1;return}function KC(a,b){a=a|0;b=b|0;c[a+204>>2]=b;return}function LC(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;T(24)}function MC(a,b){a=a|0;b=+b;g[a+232>>2]=b;return}function NC(a,b){a=a|0;b=+b;g[a+280>>2]=b;return}function OC(a,b){a=a|0;b=+b;g[a+236>>2]=b;return}function PC(a){a=a|0;return +(+g[a+272>>2])}function QC(a,b){a=a|0;b=+b;return uu(a,b)|0}function RC(b){b=b|0;return (a[b+16>>0]&1)!=0|0}function SC(a){a=a|0;if(a>>>0>4294963200){c[7137]=0-a;a=-1}return a|0}function TC(b,c){b=b|0;c=c|0;a[b+21>>0]=c&1;return}function UC(a,b){a=a|0;b=+b;g[a+684>>2]=b;return}function VC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(16);return 0}function WC(a,b){a=a|0;b=+b;g[a+188>>2]=b;return}function XC(a,b){a=a|0;b=+b;g[a+184>>2]=b;return}function YC(a,b){a=a|0;b=b|0;c[a+256>>2]=b;return}function ZC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(6);return 0.0}function _C(a){a=a|0;return +(+g[a+220>>2])}function $C(a){a=a|0;return +(+g[a+100>>2])}function aD(a){a=a|0;return gJ(c[a+120>>2]|0)|0}function bD(b,c){b=b|0;c=c|0;a[b+737>>0]=c&1;return}function cD(a,b){a=a|0;b=+b;g[a+256>>2]=b;return}function dD(a){a=a|0;return +(+g[a+224>>2])}function eD(a,b){a=a|0;b=b|0;return vs(a,b)|0}function fD(a,b){a=a|0;b=b|0;return us(a,b)|0}function gD(a){a=a|0;return hh(a)|0}function hD(b,c){b=b|0;c=c|0;a[b+152>>0]=c&1;return}function iD(a,b){a=a|0;b=b|0;c[a+84>>2]=b;return}function jD(a,b){a=a|0;b=b|0;c[a+88>>2]=b;return}function kD(a,b){a=a|0;b=b|0;c[a+92>>2]=b;return}function lD(a,b){a=a|0;b=b|0;c[a+100>>2]=b;return}function mD(a,b){a=a|0;b=b|0;c[a+96>>2]=b;return}function nD(a){a=a|0;return (c[a+48>>2]|0)==1|0}function oD(a){a=a|0;nk(a);cJ(a);return}function pD(a){a=a|0;Hk(a);cJ(a);return}function qD(a,b){a=a|0;b=b|0;return (a|0)==(b|0)|0}function rD(a,b){a=a|0;b=b|0;if(!p){p=a;q=b}}function sD(b){b=b|0;return (a[b+260>>0]&1)!=0|0}function tD(a){a=a|0;return gJ(c[a+108>>2]|0)|0}function uD(a){a=a|0;return gJ(c[a+112>>2]|0)|0}function vD(a){a=a|0;return gJ(c[a+776>>2]|0)|0}function wD(a){a=a|0;return gJ(c[a+772>>2]|0)|0}function xD(b){b=b|0;return (a[b+25>>0]&1)!=0|0}function yD(a,b){a=a|0;b=b|0;return c[a+24+(b<<2)>>2]|0}function zD(a){a=a|0;return (c[a+96>>2]|0)+4|0}function AD(a){a=a|0;return gJ(c[a+328>>2]|0)|0}function BD(a,b){a=a|0;b=+b;g[a+440>>2]=b;return}function CD(a,b){a=a|0;b=b|0;c[a+264>>2]=b;return}function DD(a,b,c){a=a|0;b=b|0;c=c|0;Ob[a&127](b|0,c|0)}function ED(a,b,c){a=a|0;b=b|0;c=+c;return +ob[a&1](b|0,+c)}function FD(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(2);return 0.0}function GD(a){a=a|0;return +(+g[a+276>>2])}function HD(a){a=a|0;return +(+g[a+208>>2])}function ID(a){a=a|0;return gJ(c[a+192>>2]|0)|0}function JD(a){a=a|0;return gJ(c[a+204>>2]|0)|0}function KD(a){a=a|0;return gJ(c[a+24>>2]|0)|0}function LD(a){a=a|0;return gJ(c[a+68>>2]|0)|0}function MD(a){a=a|0;return +(+qw(a))}function ND(a,b){a=a|0;b=b|0;c[a+16>>2]=b;return}function OD(a,b){a=a|0;b=b|0;return c[a+8+(b<<2)>>2]|0}function PD(a,b){a=a|0;b=+b;g[a+72>>2]=b;return}function QD(a){a=+a;return (g[j>>2]=a,c[j>>2]|0)|0}function RD(a){a=+a;return +(+$A(!(a>=0.0)?-a:a)*2.0)}function SD(a,b){a=a|0;b=+b;g[a+96>>2]=b;return}function TD(a){a=a|0;if(!a)return;cJ(a);return}function UD(a){a=a|0;return +(+g[a+216>>2])}function VD(a){a=a|0;return gJ(c[a+540>>2]|0)|0}function WD(a){a=a|0;return gJ(c[a+116>>2]|0)|0}function XD(a,b){a=a|0;b=+b;RF(a,b);return}function YD(b){b=b|0;return (a[b+26>>0]&1)!=0|0}function ZD(b){b=b|0;return (a[b+84>>0]&1)!=0|0}function _D(a,b){a=a|0;b=+b;g[a+80>>2]=b;return}function $D(a){a=a|0;return +(+g[a+32>>2]*+g[a+16>>2])}function aE(a,b){a=a|0;b=b|0;return a+(b<<2)|0}function bE(a){a=a|0;return +(+g[a+248>>2])}function cE(a){a=a|0;return gJ(c[a+256>>2]|0)|0}function dE(a){a=a|0;return _H(a)|0}function eE(a,b){a=a|0;b=+b;g[a+52>>2]=b;return}function fE(a,b){a=a|0;b=+b;g[a+56>>2]=b;return}function gE(a,b){a=a|0;b=b|0;c[a+20>>2]=b;return}function hE(a,b,c){a=a|0;b=b|0;c=+c;return 0}function iE(a){a=a|0;return +(+g[a+204>>2])}function jE(a){a=a|0;kr(a);return}function kE(a,b){a=a|0;b=+b;lG(a,b);return}function lE(a,b){a=a|0;b=+b;mG(a,b);return}function mE(a,b){a=a|0;b=+b;MG(a,b);return}function nE(a){a=a|0;return gJ(c[a+264>>2]|0)|0}function oE(a){a=a|0;return c[a+36>>2]|0}function pE(a){a=a|0;return c[a+32>>2]|0}function qE(a){a=a|0;return gJ(c[a+56>>2]|0)|0}function rE(a,b){a=a|0;b=+b;g[a+68>>2]=b;return}function sE(a){a=a|0;return (c[a+52>>2]|0)+4|0}function tE(a){a=a|0;return gJ(c[a+20>>2]|0)|0}function uE(a){a=a|0;return +(+VI(+EF(a)))}function vE(a,b){a=a|0;b=b|0;return a+156+(b<<4)|0}function wE(a,b,c){a=a|0;b=b|0;c=+c;Jb[a&31](b|0,+c)}function xE(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(38)}function yE(a){a=a|0;return +(+g[(NI(a)|0)>>2])}function zE(a){a=a|0;return +(+g[(OI(a)|0)>>2])}function AE(a){a=a|0;return +(+g[(MI(a)|0)>>2])}function BE(a){a=a|0;return gI(a)|0}function CE(a){a=a|0;xB(a);return}function DE(a){a=a|0;return c[a+8>>2]|0}function EE(a,b){a=a|0;b=+b;g[a+64>>2]=b;return}function FE(a,b){a=a|0;b=+b;g[a+60>>2]=b;return}function GE(a,b){a=a|0;b=+b;g[a+44>>2]=b;return}function HE(a,b){a=a|0;b=+b;g[a+40>>2]=b;return}function IE(a,b){a=a|0;b=+b;g[a+36>>2]=b;return}function JE(a,b){a=a|0;b=+b;g[a+92>>2]=b;return}function KE(a){a=a|0;return c[a+216>>2]|0}function LE(a){a=a|0;return +(+g[a+244>>2])}function ME(a){a=a|0;return +(+g[a+240>>2])}function NE(a){a=a|0;return +(+EF(a))}function OE(a,b){a=a|0;b=b|0;return a+28+(b<<4)|0}function PE(a,b){a=a|0;b=+b;g[a+24>>2]=b;return}function QE(a,b){a=a|0;b=+b;g[a+20>>2]=b;return}function RE(a,b){a=a|0;b=+b;g[a+32>>2]=b;return}function SE(a,b){a=a|0;b=+b;g[a+28>>2]=b;return}function TE(a,b){a=a|0;b=b|0;c[a>>2]=b;return}function UE(a){a=a|0;return c[a+228>>2]|0}function VE(a){a=a|0;return gJ(c[a+128>>2]|0)|0}function WE(a){a=a|0;c[a+232>>2]=0;return}function XE(a,b,c){a=a|0;b=b|0;c=c|0;return}function YE(a,b){a=a|0;b=+b;g[a+76>>2]=b;return}function ZE(a){a=a|0;return +(+g[a+212>>2])}function _E(a){a=a|0;return +(+g[a+228>>2])}function $E(a){a=a|0;return a+56|0}function aF(a){a=a|0;return c[a+24>>2]|0}function bF(a,b){a=a|0;b=+b;g[a+16>>2]=b;return}function cF(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;T(35)}function dF(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(30)}function eF(a){a=a|0;return +(+g[a+252>>2])}function fF(a){a=a|0;return OI(a)|0}function gF(a){a=a|0;return +(+uE(a))}function hF(a){a=a|0;return c[a+4>>2]|0}function iF(){var a=0;a=c[7140]|0;c[7140]=a+0;return a|0}function jF(a){a=a|0;return (a&3|0)!=0|0}function kF(a,b){a=a|0;b=+b;g[a+48>>2]=b;return}function lF(a){a=a|0;return a+156|0}function mF(b){b=b|0;return (a[b+152>>0]&1)!=0|0}function nF(){var a=0;a=c[2475]|0;c[2475]=a+0;return a|0}function oF(a){a=a|0;return 644}function pF(a){a=a|0;pi(a);cJ(a);return}function qF(a){a=a|0;Ki(a);cJ(a);return}function rF(a){a=a|0;Oj(a);cJ(a);return}function sF(a){a=a|0;return +(+g[a+232>>2])}function tF(a){a=a|0;return +(+g[a+280>>2])}function uF(a){a=a|0;return +(+g[a+236>>2])}function vF(a){a=a|0;return a+100|0}function wF(a){a=a|0;return 348}function xF(a){a=a|0;return c[a+12>>2]|0}function yF(a){a=a|0;BF(a+56|0);return}function zF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(15);return 0}function AF(a){a=a|0;cx(a);return}function BF(a){a=a|0;qC(a);return}function CF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(5);return 0.0}function DF(a){a=a|0;return gJ(c[a+4>>2]|0)|0}function EF(a){a=a|0;return +(+Gp(a,a))}function FF(a){a=a|0;return +(+g[a+256>>2])}function GF(a){a=a|0;return +(+g[a>>2])}function HF(a){a=a|0;return (a|0)!=0|0}function IF(a,b){a=a|0;b=b|0;return xb[a&127](b|0)|0}function JF(a){a=a|0;return a+24|0}function KF(a){a=a|0;Ua(a|0)|0;Cq()}function LF(a){a=a|0;return c[a+1304>>2]|0}function MF(a,b){a=+a;b=+b;return !(a>b)|0}function NF(a){a=a|0;return a+64|0}function OF(a){a=a|0;return +(+g[a+72>>2])}function PF(a){a=a|0;return c[a+332>>2]|0}function QF(a){a=a|0;return (a&2|0)!=0|0}function RF(a,b){a=a|0;b=+b;g[a+12>>2]=b;return}function SF(a){a=a|0;return a+172|0}function TF(a){a=a|0;return c[a+84>>2]|0}function UF(a){a=a|0;return c[a+88>>2]|0}function VF(a){a=a|0;return c[a+92>>2]|0}function WF(a){a=a|0;return c[a+96>>2]|0}function XF(a){a=a|0;return 252}function YF(a,b,c,d){a=a|0;b=+b;c=c|0;d=+d;T(11);return 0}function ZF(a){a=a|0;return +(+g[(gJ(a)|0)>>2])}function _F(a){a=a|0;return a+52|0}function $F(a){a=a|0;return +(+g[a+80>>2])}function aG(a){a=a|0;return 28}function bG(a){a=a|0;return c[a+100>>2]|0}function cG(a){a=a|0;return c[a+72>>2]|0}function dG(a,b){a=a|0;b=b|0;return +nb[a&15](b|0)}function eG(a){a=a|0;return a+40|0}function fG(a){a=a|0;return c[a+16>>2]|0}function gG(a){a=a|0;return +(+g[a+52>>2])}function hG(a){a=a|0;return +(+g[a+56>>2])}function iG(a){a=a|0;return a+112|0}function jG(a){a=a|0;return 212}function kG(a){a=a|0;return (a&1|0)!=0|0}function lG(a,b){a=a|0;b=+b;g[a+8>>2]=b;return}function mG(a,b){a=a|0;b=+b;g[a+4>>2]=b;return}function nG(a){a=+a;return a<1.0|0}function oG(a,b){a=a|0;b=b|0;return 1}function pG(a){a=a|0;return a+344|0}function qG(a){a=a|0;NH(a);return}function rG(a){a=a|0;return +(+g[a+68>>2])}function sG(a){a=a|0;return c[a+300>>2]|0}function tG(a,b){a=a|0;b=b|0;l=a;m=b}function uG(a){a=a|0;return a+188|0}function vG(a){a=a|0;return c[a+20>>2]|0}function wG(a){a=a|0;return 204}function xG(a){a=a|0;return c[a+748>>2]|0}function yG(a,b){a=a|0;b=b|0;return}function zG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(34)}function AG(a){a=a|0;return a+68|0}function BG(a){a=a|0;return a+36|0}function CG(a){a=a|0;return +(+g[a+64>>2])}function DG(a){a=a|0;return +(+g[a+60>>2])}function EG(a){a=a|0;return +(+g[a+44>>2])}function FG(a){a=a|0;return +(+g[a+40>>2])}function GG(a){a=a|0;return +(+g[a+36>>2])}function HG(a){a=a|0;return +(+g[a+48>>2])}function IG(a){a=a|0;return +(+g[a+92>>2])}function JG(a){a=a|0;return 220}function KG(a){a=a|0;return 264}function LG(a){a=a|0;return +(+g[a+76>>2])}function MG(a,b){a=a|0;b=+b;g[a>>2]=b;return}function NG(a){a=a|0;c[a>>2]=3028;return}function OG(a){a=a|0;c[a>>2]=8404;return}function PG(a){a=a|0;qG(a);return}function QG(a){a=a|0;return +(+g[a+24>>2])}function RG(a){a=a|0;return +(+g[a+4>>2])}function SG(a){a=a|0;return +(+g[a+20>>2])}function TG(a){a=a|0;return +(+g[a+32>>2])}function UG(a){a=a|0;return +(+g[a+16>>2])}function VG(a){a=a|0;return +(+g[a+12>>2])}function WG(a){a=a|0;return +(+g[a+28>>2])}function XG(a){a=a|0;return a+16|0}function YG(a){a=a|0;return 52}function ZG(a){a=a|0;return 68}function _G(a){a=a|0;return 84}function $G(a,b){a=a|0;b=b|0;return a+(b<<4)|0}function aH(a){a=a|0;return a+928|0}function bH(a){a=a|0;return +(+g[a+8>>2])}function cH(a){a=a|0;return a+316|0}function dH(a){a=a|0;return a+300|0}function eH(a,b){a=a|0;b=b|0;Ib[a&511](b|0)}function fH(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;T(32)}function gH(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;T(29)}function hH(a,b,c,d){a=a|0;b=+b;c=c|0;d=d|0;T(26)}function iH(a){a=a|0;return a+32|0}function jH(a){a=a|0;return 24}function kH(a){a=a|0;return a+848|0}function lH(a){a=a|0;return c[a>>2]|0}function mH(a,b){a=a|0;b=b|0;return nv(a,b)|0}function nH(a){a=a|0;Ey(a);return}function oH(a){a=a|0;cJ(a+-4|0);return}function pH(a){a=a|0;ni(a);return}function qH(a){a=a|0;return gJ(a)|0}function rH(a){a=a|0;return a+768|0}function sH(a){a=a|0;return a+788|0}function tH(a){a=a|0;return a+808|0}function uH(a){a=a|0;return a+104|0}function vH(a){a=a|0;return 496}function wH(a,b,c){a=a|0;b=b|0;c=c|0;T(14);return 0}function xH(a){a=a|0;return 32}function yH(a){a=a|0;return a+80|0}function zH(a){a=a|0;return a+388|0}function AH(a){a=a|0;return 60}function BH(a){a=a|0;return 436}function CH(a){a=a|0;c[a>>2]=3104;return}function DH(a,b,c){a=a|0;b=b|0;c=c|0;T(3);return 0.0}function EH(a){a=a|0;return a+348|0}function FH(){return Ds(1)|0}function GH(a){a=+a;return +(+$A(a)*2.0)}function HH(a){a=a|0;return a+372|0}function IH(a){a=a|0;c[a>>2]=4652;return}function JH(a){a=a|0;return (a&255)<<8|a>>8&255|0}function KH(a,b,c){a=a|0;b=b|0;c=+c;T(13);return 0}function LH(a){a=a|0;return 11398}function MH(a){a=a|0;return a+92|0}function NH(a){a=a|0;c[a>>2]=0;return}function OH(a){a=a|0;return a+88|0}function PH(a){a=a|0;return 4}function QH(a){a=a|0;return a+20|0}function RH(a){a=a|0;return 17723}function SH(a){a=a|0;return 17439}function TH(a){a=a|0;c[a>>2]=3080;return}function UH(){return Pt()|0}function VH(a){a=a|0;return 11336}function WH(a,b){a=a|0;b=+b;return}function XH(a){a=a|0;return a+76|0}function YH(a){a=a|0;return a+28|0}function ZH(a){a=a|0;return 16585}function _H(a){a=a|0;return a+440|0}function $H(a){a=+a;return +(+mh(a,6.2831854820251465))}function aI(a){a=a|0;return a+72|0}function bI(a,b,c){a=a|0;b=b|0;c=c|0;T(31)}function cI(a){a=a|0;return 16969}function dI(a,b){a=+a;b=b|0;return +(+Em(a,b))}function eI(){return Ds(64)|0}function fI(a){a=a|0;return 17027}function gI(a){a=a|0;return a+48|0}function hI(){c[176]=o}function iI(a){a=a|0;return 17225}function jI(a){a=a|0;return 1}function kI(a,b,c){a=a|0;b=b|0;c=+c;T(28)}function lI(a,b,c){a=a|0;b=+b;c=c|0;T(25)}function mI(a){a=a|0;return 17840}function nI(a){a=a|0;return 17811}function oI(a){a=a|0;return 3}function pI(a){a=a|0;return Gm(a,28524)|0}function qI(a){a=a|0;return 11665}function rI(a){a=+a;return +a}function sI(a){a=a|0;return 17783}function tI(a){a=a|0;return 16300}function uI(a){a=a|0;return 17383}function vI(a){a=a|0;return 17356}function wI(a){a=a|0;return 17326}function xI(a){a=a|0;return 8}function yI(a,b,c){a=a|0;b=+b;c=+c;T(23)}function zI(a){a=a|0;return 16404}function AI(a,b){a=a|0;b=b|0;T(12);return 0}function BI(a){a=a|0;return 16362}function CI(a){a=a|0;return 16383}function DI(a){a=a|0;return 6}function EI(a){a=a|0;return 12}function FI(){return 4}function GI(a){a=a|0;return 16343}function HI(a){a=a|0;return 0}function II(a){a=a|0;return 2}function JI(a){a=a|0;return 17498}function KI(a,b){a=a|0;b=+b;T(1);return 0.0}function LI(){c[5628]=1805;c[5629]=0;return}function MI(a){a=a|0;return a+12|0}function NI(a){a=a|0;return a+8|0}function OI(a){a=a|0;return a+4|0}function PI(a){a=a|0;Hb[a&3]()}function QI(){return 2}function RI(){return 1}function SI(){return 5}function TI(){return 3}function UI(){Wa()}function VI(a){a=+a;return +(+D(+a))}function WI(a){a=+a;return +(+G(+a))}function XI(a){a=+a;return +(+F(+a))}function YI(a,b){a=a|0;b=b|0;T(27)}function ZI(a){a=a|0;return}function _I(a,b){a=a|0;b=+b;T(22)}function $I(a){a=a|0;return Ds(a)|0}function aJ(a){a=a|0;cJ(a);return}function bJ(a){a=a|0;l=a}function cJ(a){a=a|0;Cd(a);return}function dJ(a){a=a|0;A=a}function eJ(a){a=a|0;T(10);return 0}function fJ(a){a=a|0;T(0);return 0.0}function gJ(a){a=a|0;return a|0}function hJ(){return A|0}function iJ(){return l|0}function jJ(a){a=a|0;T(21)}function kJ(){return 0}function lJ(){T(20)} +function dc(d,f){d=d|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0,la=0;ha=l;l=l+192|0;i=c[d+56>>2]|0;if(i|0?(Ib[c[c[i>>2]>>2]&511](i),h=c[d+56>>2]|0,h|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(151)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=9696;a[h+20>>0]=1;c[h+16>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[d+56>>2]=h;n=0;o=0;ga=0;K=0;h=0;while(1){if((n|0)>=(xb[c[(c[d>>2]|0)+96>>2]&127](d)|0))break;do if((K|0)==(o|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,p=sc((i<<4|3)+16|0)|0,(p|0)!=0):0){c[(p+4+15&-16)+-4>>2]=p;k=p+4+15&-16}else k=0;if((o|0)<=0){if(!ga){m=k;h=k;k=o;break}}else{h=0;do{fa=k+(h<<4)|0;ea=ga+(h<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);m=k;h=k;k=o}else{i=o;m=ga;k=o}}else{i=o;m=ga;k=K}while(0);o=m+(K<<4)|0;c[o>>2]=c[ha+136>>2];c[o+4>>2]=c[ha+136+4>>2];c[o+8>>2]=c[ha+136+8>>2];c[o+12>>2]=c[ha+136+12>>2];Sb[c[(c[d>>2]|0)+108>>2]&127](d,n,o);n=n+1|0;o=i;ga=m;K=k+1|0}a[ha+76+16>>0]=1;fa=ha+76+12|0;c[fa>>2]=0;c[ha+76+4>>2]=0;c[ha+76+8>>2]=0;a[ha+76+36>>0]=1;ea=ha+76+32|0;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;a[ha+76+56>>0]=1;da=ha+76+52|0;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;if(f){if((K|0)>0){J=0;i=0;k=0;m=0;while(1){h=J;J=J+1|0;if((J|0)<(K|0)){G=ga+(h<<4)|0;I=ga+(h<<4)+4|0;A=ga+(h<<4)+8|0;z=J;h=m;do{m=z;z=z+1|0;if((z|0)<(K|0)){x=ga+(m<<4)|0;y=ga+(m<<4)+4|0;w=ga+(m<<4)+8|0;f=z;do{F=+g[G>>2];v=+g[x>>2]-F;H=+g[I>>2];B=+g[y>>2]-H;L=+g[A>>2];E=+g[w>>2]-L;F=+g[ga+(f<<4)>>2]-F;H=+g[ga+(f<<4)+4>>2]-H;L=+g[ga+(f<<4)+8>>2]-L;q=1.0;p=0;while(1){t=(B*L-E*H)*q;u=(E*F-v*L)*q;r=(v*H-B*F)*q;a:do if(r*r+(t*t+u*u)>9.999999747378752e-05){s=1.0/+D(+(r*r+(t*t+u*u)));if((h|0)>0){m=0;do{if(t*s*+g[k+(m<<4)>>2]+u*s*+g[k+(m<<4)+4>>2]+r*s*+g[k+(m<<4)+8>>2]>.9990000128746033)break a;m=m+1|0}while((m|0)<(h|0))}q=t*s*+g[G>>2]+u*s*+g[I>>2]+r*s*+g[A>>2];m=0;do{if(t*s*+g[ga+(m<<4)>>2]+u*s*+g[ga+(m<<4)+4>>2]+r*s*+g[ga+(m<<4)+8>>2]-q+-.009999999776482582>0.0)break a;m=m+1|0}while((m|0)<(K|0));do if((h|0)==(i|0)){o=i|0?i<<1:1;if((i|0)<(o|0)){do if(!o)n=0;else{c[6995]=(c[6995]|0)+1;m=sc((o<<4|3)+16|0)|0;if(!m){n=0;break}c[(m+4+15&-16)+-4>>2]=m;n=m+4+15&-16}while(0);if((i|0)<=0){if(!k){m=o;k=n;break}}else{m=0;do{aa=n+(m<<4)|0;$=k+(m<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];m=m+1|0}while((m|0)!=(i|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);m=o;k=n}else m=i}else{m=i;i=h}while(0);g[k+(i<<4)>>2]=t*s;g[k+(i<<4)+4>>2]=u*s;g[k+(i<<4)+8>>2]=r*s;g[k+(i<<4)+12>>2]=-q;i=m;h=h+1|0}while(0);p=p+1|0;if((p|0)==2)break;else q=-1.0}f=f+1|0}while((f|0)!=(K|0))}}while((z|0)!=(K|0))}else h=m;if((J|0)==(K|0)){f=h;break}else m=h}if((f|0)>0){h=0;o=0;p=0;while(1){aa=k+(p<<4)|0;c[ha+136>>2]=c[aa>>2];c[ha+136+4>>2]=c[aa+4>>2];c[ha+136+8>>2]=c[aa+8>>2];q=+g[k+(p<<4)+12>>2];q=q-+nb[c[(c[d>>2]|0)+48>>2]&15](d);do if((p|0)==(h|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if((n|0)!=0?(c[6995]=(c[6995]|0)+1,M=sc((n<<4|3)+16|0)|0,(M|0)!=0):0){c[(M+4+15&-16)+-4>>2]=M;m=M+4+15&-16}else m=0;if((h|0)<=0){if(!o)break}else{i=0;do{aa=m+(i<<4)|0;$=o+(i<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];i=i+1|0}while((i|0)!=(h|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}else{n=h;m=o}}else{n=h;m=o;h=p}while(0);aa=m+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];g[m+(h<<4)+12>>2]=q;p=p+1|0;if((p|0)<(f|0)){h=n;o=m}else break}if((p|0)>0){G=0;o=0;n=0;i=0;h=0;do{z=G;G=G+1|0;if((G|0)<(p|0)){A=G;do{y=A;A=A+1|0;if((A|0)<(p|0)){x=A;do{t=+g[m+(y<<4)+4>>2];q=+g[m+(x<<4)+8>>2];r=+g[m+(y<<4)+8>>2];u=+g[m+(x<<4)+4>>2];v=+g[m+(x<<4)>>2];B=+g[m+(y<<4)>>2];s=+g[m+(z<<4)+8>>2];E=+g[m+(z<<4)+4>>2];F=+g[m+(z<<4)>>2];b:do if((((u*B-t*v)*(u*B-t*v)+((t*q-r*u)*(t*q-r*u)+(r*v-q*B)*(r*v-q*B))>9.999999747378752e-05?(v*E-u*F)*(v*E-u*F)+((u*s-q*E)*(u*s-q*E)+(q*F-v*s)*(q*F-v*s))>9.999999747378752e-05:0)?(t*F-B*E)*(t*F-B*E)+((r*E-t*s)*(r*E-t*s)+(B*s-r*F)*(B*s-r*F))>9.999999747378752e-05:0)?(O=s*(u*B-t*v)+(E*(r*v-q*B)+(t*q-r*u)*F),+C(+O)>9.999999974752427e-07):0){ia=+g[m+(z<<4)+12>>2];L=+g[m+(y<<4)+12>>2];ja=+g[m+(x<<4)+12>>2];H=-1.0/O*((r*E-t*s)*ja+((t*q-r*u)*ia+(u*s-q*E)*L));r=-1.0/O*((B*s-r*F)*ja+((r*v-q*B)*ia+(q*F-v*s)*L));q=-1.0/O*((t*F-B*E)*ja+((u*B-t*v)*ia+(v*E-u*F)*L));f=0;do{if(+g[m+(f<<4)+12>>2]+(H*+g[m+(f<<4)>>2]+r*+g[m+(f<<4)+4>>2]+q*+g[m+(f<<4)+8>>2])+-.009999999776482582>0.0)break b;f=f+1|0}while((f|0)<(p|0));do if((i|0)==(o|0)){w=o|0?o<<1:1;if((o|0)>=(w|0)){w=o;break}do if(!w)f=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<4|3)+16|0)|0;if(!h){f=0;break}c[(h+4+15&-16)+-4>>2]=h;f=h+4+15&-16}while(0);if((o|0)<=0){if(!n){n=f;h=f;break}}else{h=0;do{aa=f+(h<<4)|0;$=n+(h<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);n=f;h=f}else{w=o;o=i}while(0);g[n+(o<<4)>>2]=H;g[n+(o<<4)+4>>2]=r;g[n+(o<<4)+8>>2]=q;g[n+(o<<4)+12>>2]=0.0;o=w;i=i+1|0}while(0);x=x+1|0}while((x|0)!=(p|0))}}while((A|0)!=(p|0))}}while((G|0)!=(p|0))}else{n=0;i=0;h=0}}else{n=0;m=0;i=0;h=0}}else{n=0;m=0;k=0;i=0;h=0}uc(ha+76|0,h,i);if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(m|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}if(k|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}}else uc(ha+76|0,h,K);I=c[ha+76+44>>2]|0;if((I|0)>0){c[6995]=(c[6995]|0)+1;h=sc((I<<4|3)+16|0)|0;if(!h)i=0;else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}h=0;do{aa=i+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];c[aa+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(I|0));aa=i;_=i}else{aa=0;_=0}a[ha+56+16>>0]=1;$=ha+56+12|0;c[$>>2]=0;Z=ha+56+4|0;c[Z>>2]=0;c[ha+56+8>>2]=0;k=ha+136|0;n=k+19|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(n|0));if((I|0)<0)gb();if(I|0){Of(ha+56|0,I);i=c[$>>2]|0;h=0;do{a[i+(h*36|0)+16>>0]=1;k=i+(h*36|0)+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;k=i+(h*36|0)+20|0;m=ha+136+3|0;n=k+16|0;do{a[k>>0]=a[m>>0]|0;k=k+1|0;m=m+1|0}while((k|0)<(n|0));h=h+1|0}while((h|0)!=(I|0))}c[Z>>2]=I;o=c[ha+76+4>>2]|0;n=c[d+56>>2]|0;m=c[n+8>>2]|0;if((m|0)<(o|0)){if((c[n+12>>2]|0)<(o|0)){if(!o){h=0;k=m}else{c[6995]=(c[6995]|0)+1;h=sc((o<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[n+8>>2]|0}if((k|0)>0){i=0;do{Y=h+(i<<4)|0;X=(c[n+16>>2]|0)+(i<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[n+16>>2]|0;if(i|0){if(a[n+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+16>>2]=0}a[n+20>>0]=1;c[n+16>>2]=h;c[n+12>>2]=o;i=n+16|0}else i=n+16|0;h=m;do{Y=(c[i>>2]|0)+(h<<4)|0;c[Y>>2]=c[ha+136>>2];c[Y+4>>2]=c[ha+136+4>>2];c[Y+8>>2]=c[ha+136+8>>2];c[Y+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[n+8>>2]=o;if((o|0)>0){h=0;do{X=(c[fa>>2]|0)+(h<<4)|0;Y=(c[(c[d+56>>2]|0)+16>>2]|0)+(h<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];h=h+1|0}while((h|0)!=(o|0))}if((I|0)>0){G=0;do{z=(c[ea>>2]|0)+((c[(c[da>>2]|0)+(G<<2)>>2]|0)*12|0)|0;y=z;h=0;do{A=y+4|0;x=c[y+((c[A>>2]|0)*12|0)+8>>2]|0;f=c[$>>2]|0;w=f+(G*36|0)+4|0;i=c[w>>2]|0;p=f+(G*36|0)+8|0;if((i|0)==(c[p>>2]|0)?(N=i|0?i<<1:1,(i|0)<(N|0)):0){if(!N)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((N<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[w>>2]|0}n=f+(G*36|0)+12|0;m=c[n>>2]|0;if((i|0)<=0)if(!m)k=f+(G*36|0)+16|0;else ba=132;else{k=0;do{c[o+(k<<2)>>2]=c[m+(k<<2)>>2];k=k+1|0}while((k|0)!=(i|0));ba=132}if((ba|0)==132){ba=0;i=f+(G*36|0)+16|0;if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[n>>2]=0;k=i;i=c[w>>2]|0}a[k>>0]=1;c[n>>2]=o;c[p>>2]=N}c[(c[f+(G*36|0)+12>>2]|0)+(i<<2)>>2]=x;c[w>>2]=(c[w>>2]|0)+1;X=c[y+8>>2]|0;Y=c[fa>>2]|0;s=+g[Y+(X<<4)>>2]-+g[Y+(x<<4)>>2];t=+g[Y+(X<<4)+4>>2]-+g[Y+(x<<4)+4>>2];q=+g[Y+(X<<4)+8>>2]-+g[Y+(x<<4)+8>>2];r=1.0/+D(+(s*s+t*t+q*q));if((h|0)<2){g[ha+136+(h<<4)>>2]=s*r;g[ha+136+(h<<4)+4>>2]=t*r;g[ha+136+(h<<4)+8>>2]=q*r;g[ha+136+(h<<4)+12>>2]=0.0;h=h+1|0}Y=y+((c[A>>2]|0)*12|0)|0;y=Y+((c[Y>>2]|0)*12|0)|0}while((y|0)!=(z|0));if((h|0)==2){H=+g[ha+136+4>>2];L=+g[ha+136+24>>2];O=+g[ha+136+8>>2];ia=+g[ha+136+20>>2];F=+g[ha+136+16>>2];E=+g[ha+136>>2];X=aa+(G<<4)+4|0;Y=aa+(G<<4)+8|0;g[aa+(G<<4)+12>>2]=0.0;ja=1.0/+D(+((H*L-O*ia)*(H*L-O*ia)+(O*F-L*E)*(O*F-L*E)+(ia*E-H*F)*(ia*E-H*F)));g[aa+(G<<4)>>2]=(H*L-O*ia)*ja;g[X>>2]=(O*F-L*E)*ja;g[Y>>2]=(ia*E-H*F)*ja;n=c[$>>2]|0;g[n+(G*36|0)+20>>2]=(H*L-O*ia)*ja;c[n+(G*36|0)+24>>2]=c[X>>2];c[n+(G*36|0)+28>>2]=c[Y>>2];g[n+(G*36|0)+32>>2]=1000000015047466219876688.0e6}else{n=aa+(G<<4)|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;n=c[$>>2]|0}k=c[n+(G*36|0)+4>>2]|0;if((k|0)>0){m=c[(c[d+56>>2]|0)+16>>2]|0;r=+g[aa+(G<<4)>>2];s=+g[aa+(G<<4)+4>>2];t=+g[aa+(G<<4)+8>>2];i=c[n+(G*36|0)+12>>2]|0;h=0;q=1000000015047466219876688.0e6;do{Y=c[i+(h<<2)>>2]|0;ja=+g[m+(Y<<4)>>2]*r+ +g[m+(Y<<4)+4>>2]*s+ +g[m+(Y<<4)+8>>2]*t;q=q>ja?ja:q;h=h+1|0}while((h|0)!=(k|0))}else q=1000000015047466219876688.0e6;g[n+(G*36|0)+32>>2]=-q;G=G+1|0}while((G|0)!=(I|0))}if((c[Z>>2]|0)>0){i=0;m=0;k=0;n=0;o=0;while(1){do if((o|0)==(i|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,P=sc((i<<2|3)+16|0)|0,(P|0)!=0):0){c[(P+4+15&-16)+-4>>2]=P;k=P+4+15&-16}else k=0;if((o|0)>0){h=0;do{c[k+(h<<2)>>2]=c[m+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));if(!n){m=k;Y=k;h=k;break}}else if((m|0)==0|(n|0)==0){m=k;Y=k;h=k;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);m=k;Y=k;h=k}else{i=o;Y=k;h=n}}else{Y=k;h=n}while(0);c[m+(o<<2)>>2]=o;o=o+1|0;if((o|0)>=(c[Z>>2]|0))break;else{k=Y;n=h}}M=ha+36+12|0;N=ha+36+4|0;P=ha+136+12|0;k=o;do{w=k+-1|0;i=c[m+(w<<2)>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(23)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=i;X=c[$>>2]|0;r=+g[X+(i*36|0)+20>>2];s=+g[X+(i*36|0)+24>>2];q=+g[X+(i*36|0)+28>>2];c:do if((k|0)>1){o=w;i=h;f=h;n=1;p=h;h=1;y=w;while(1){z=h;while(1){h=c[$>>2]|0;x=o;do{X=x;x=x+-1|0;if((X|0)<=0){K=i;J=p;I=z;k=y;break c}w=c[m+(x<<2)>>2]|0}while(!(r*+g[h+(w*36|0)+20>>2]+s*+g[h+(w*36|0)+24>>2]+q*+g[h+(w*36|0)+28>>2]>.9990000128746033));do if((z|0)==(n|0)){k=z|0?z<<1:1;if((z|0)<(k|0)){do if(!k)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((z|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(z|0));if(!f){n=k;p=o;i=o;f=o;break}}else if((p|0)==0|(f|0)==0){n=k;p=o;i=o;f=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);n=k;p=o;i=o;f=o}else n=z}while(0);c[p+(z<<2)>>2]=w;z=z+1|0;h=0;while(1){if((c[m+(h<<2)>>2]|0)==(w|0))break;h=h+1|0;if((h|0)>=(y|0)){h=y;break}}if((y|0)>(h|0))break;else o=x}V=m+(h<<2)|0;W=c[V>>2]|0;k=y+-1|0;X=m+(k<<2)|0;c[V>>2]=c[X>>2];c[X>>2]=W;if((y|0)>1){o=x;h=z;y=k}else{o=x;h=z;ba=162;break}}}else{o=w;i=h;f=h;n=1;p=h;h=1;k=w;ba=162}while(0);d:do if((ba|0)==162){ba=0;y=h;while(1){h=c[$>>2]|0;w=o;do{X=w;w=w+-1|0;if((X|0)<=0){K=i;J=p;I=y;break d}x=c[m+(w<<2)>>2]|0}while(!(r*+g[h+(x*36|0)+20>>2]+s*+g[h+(x*36|0)+24>>2]+q*+g[h+(x*36|0)+28>>2]>.9990000128746033));do if((y|0)==(n|0)){n=y|0?y<<1:1;if((y|0)<(n|0)){do if(!n)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((y|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(y|0));if(!f){p=o;i=o;h=o;break}}else if((p|0)==0|(f|0)==0){p=o;i=o;h=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);p=o;i=o;h=o}else{n=y;h=f}}else h=f;while(0);c[p+(y<<2)>>2]=x;o=w;f=h;y=y+1|0}}while(0);if((I|0)>1){a[ha+36+16>>0]=1;c[M>>2]=0;c[N>>2]=0;c[ha+36+8>>2]=0;z=0;q=0.0;r=0.0;s=0.0;n=0;do{i=c[J+(z<<2)>>2]|0;q=+g[h+(i*36|0)+20>>2]+q;r=+g[h+(i*36|0)+24>>2]+r;s=+g[h+(i*36|0)+28>>2]+s;y=h+(i*36|0)+4|0;if((c[y>>2]|0)>0){x=h+(i*36|0)+12|0;w=0;h=n;while(1){f=c[(c[x>>2]|0)+(w<<2)>>2]|0;X=(c[(c[d+56>>2]|0)+16>>2]|0)+(f<<4)|0;c[ha+136>>2]=c[X>>2];c[ha+136+4>>2]=c[X+4>>2];c[ha+136+8>>2]=c[X+8>>2];c[ha+136+12>>2]=c[X+12>>2];e:do if((h|0)>0){n=c[M>>2]|0;i=0;while(1){if((c[n+(i*24|0)+20>>2]|0)==(f|0))break e;i=i+1|0;if((i|0)>=(h|0)){ba=261;break}}}else ba=261;while(0);if((ba|0)==261){ba=0;c[ha>>2]=c[ha+136>>2];c[ha+4>>2]=c[ha+136+4>>2];c[ha+8>>2]=c[ha+136+8>>2];c[ha+12>>2]=c[ha+136+12>>2];do if((h|0)==(c[ha+36+8>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[N>>2]|0}n=c[M>>2]|0;if((h|0)<=0){if(n)ba=270}else{i=0;do{ba=o+(i*24|0)|0;X=n+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(h|0));ba=270}if((ba|0)==270){ba=0;if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);h=c[N>>2]|0}c[M>>2]=0}a[ha+36+16>>0]=1;c[M>>2]=o;c[ha+36+8>>2]=p}while(0);X=c[M>>2]|0;W=X+(h*24|0)|0;c[W>>2]=c[ha>>2];c[W+4>>2]=c[ha+4>>2];c[W+8>>2]=c[ha+8>>2];c[W+12>>2]=c[ha+12>>2];c[W+16>>2]=c[ha+16>>2];c[X+(h*24|0)+20>>2]=f;h=(c[N>>2]|0)+1|0;c[N>>2]=h}w=w+1|0;if((w|0)>=(c[y>>2]|0)){n=h;break}}}z=z+1|0;h=c[$>>2]|0}while((z|0)!=(I|0));a[ha+16>>0]=1;c[ha+12>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;X=c[J>>2]|0;c[ha+20>>2]=c[h+(X*36|0)+20>>2];c[ha+24>>2]=c[h+(X*36|0)+24>>2];c[ha+28>>2]=c[h+(X*36|0)+28>>2];c[ha+32>>2]=c[h+(X*36|0)+32>>2];H=1.0/+D(+(q*q+r*r+s*s));O=q*H;L=r*H;H=s*H;if(+C(+H)>.7071067690849304){F=1.0/+D(+(H*H+L*L));t=O*-(H*F);u=(H*H+L*L)*F;v=0.0;B=L*F;E=-(O*L*F);F=-(H*F)}else{F=1.0/+D(+(O*O+L*L));t=(O*O+L*L)*F;u=-(H*O*F);v=-(L*F);B=0.0;E=H*-(L*F);F=O*F}if((n|0)<2)if((n|0)==1){n=0;o=0;f=0;i=1;while(1){w=c[M>>2]|0;do if((n|0)==(o|0)){p=o|0?o<<1:1;if((o|0)>=(p|0)){p=o;h=f;break}do if(!p)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h){h=0;o=n;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16;o=n}while(0);if((o|0)<=0){if(f|0)ba=212}else{i=0;do{ba=h+(i*24|0)|0;X=f+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(o|0));ba=212}if((ba|0)==212){ba=0;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}o=n;i=c[N>>2]|0}else{p=o;h=f;o=n}while(0);X=h+(o*24|0)|0;c[X>>2]=c[w>>2];c[X+4>>2]=c[w+4>>2];c[X+8>>2]=c[w+8>>2];c[X+12>>2]=c[w+12>>2];c[X+16>>2]=c[w+16>>2];c[X+20>>2]=c[w+20>>2];n=n+1|0;if((n|0)<(i|0)){o=p;f=h}else{ba=276;break}}}else{h=0;ba=315}else{o=c[M>>2]|0;i=0;h=n;do{if(v*+g[o+(i*24|0)>>2]+F*+g[o+(i*24|0)+4>>2]+B*+g[o+(i*24|0)+8>>2]>2]+F*+g[o+4>>2]+B*+g[o+8>>2]){c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];c[ha+136+16>>2]=c[o+16>>2];c[ha+136+20>>2]=c[o+20>>2];h=o+(i*24|0)|0;c[o>>2]=c[h>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];c[o+16>>2]=c[h+16>>2];c[o+20>>2]=c[h+20>>2];h=o+(i*24|0)|0;c[h>>2]=c[ha+136>>2];c[h+4>>2]=c[ha+136+4>>2];c[h+8>>2]=c[ha+136+8>>2];c[h+12>>2]=c[ha+136+12>>2];c[h+16>>2]=c[ha+136+16>>2];c[h+20>>2]=c[ha+136+20>>2];h=n}i=i+1|0}while((i|0)<(h|0));g[o+16>>2]=-1000000015047466219876688.0e6;if((h|0)>1){s=+g[o+4>>2];i=1;do{ia=+g[o+(i*24|0)>>2]-+g[o>>2];ja=+g[o+(i*24|0)+4>>2]-s;r=+g[o+(i*24|0)+8>>2]-+g[o+8>>2];q=u*ia+E*ja+t*r;r=v*ia+F*ja+B*r;if(q*q+r*r<1.1920928955078125e-07)q=0.0;else{ja=+C(+q);ja=(!(r>=0.0)?2.356194496154785:.7853981852531433)-(!(r>=0.0)?r+ja:r-ja)/(!(r>=0.0)?ja-r:r+ja)*.7853981852531433;q=q<0.0?-ja:ja}g[o+(i*24|0)+16>>2]=q;i=i+1|0}while((i|0)!=(h|0))}c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];rf(ha+36|0,ha+136|0,1,h+-1|0);i=c[M>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(43)|0;if(!h)n=0;else{c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}o=c[M>>2]|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];c[n+16>>2]=c[i+16>>2];c[n+20>>2]=c[i+20>>2];c[6995]=(c[6995]|0)+1;h=sc(67)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=c[n>>2];c[h+4>>2]=c[n+4>>2];c[h+8>>2]=c[n+8>>2];c[h+12>>2]=c[n+12>>2];c[h+16>>2]=c[n+16>>2];c[h+20>>2]=c[n+20>>2];if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}ba=h+24|0;c[ba>>2]=c[o+24>>2];c[ba+4>>2]=c[o+24+4>>2];c[ba+8>>2]=c[o+24+8>>2];c[ba+12>>2]=c[o+24+12>>2];c[ba+16>>2]=c[o+24+16>>2];c[ba+20>>2]=c[o+24+20>>2];if((c[N>>2]|0)==2){i=2;n=2}else{i=2;n=2;f=2;o=2;do{f:do if((o|0)>1){w=c[M>>2]|0;x=w+(i*24|0)|0;q=+g[x>>2];r=+g[w+(i*24|0)+4>>2];s=+g[w+(i*24|0)+8>>2];while(1){ba=o+-2|0;p=o+-1|0;F=+g[h+(ba*24|0)>>2];ia=F-+g[h+(p*24|0)>>2];B=+g[h+(ba*24|0)+4>>2];v=B-+g[h+(p*24|0)+4>>2];ja=+g[h+(ba*24|0)+8>>2];E=ja-+g[h+(p*24|0)+8>>2];if((ia*(B-r)-v*(F-q))*H+(O*(v*(ja-s)-E*(B-r))+L*(E*(F-q)-ia*(ja-s)))>0.0)break;if((p|0)>1){n=p;o=p}else{n=p;o=w;ba=240;break f}}do if((o|0)==(f|0)){w=f<<1;if((f|0)>=(w|0)){w=f;o=f;break}c[6995]=(c[6995]|0)+1;o=sc((f*48|3)+16|0)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)>0){o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=p;o=n}else w=f;while(0);o=h+(o*24|0)|0;c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2];c[o+12>>2]=c[x+12>>2];c[o+16>>2]=c[x+16>>2];c[o+20>>2]=c[x+20>>2];o=n+1|0;n=o;f=w;ba=238}else ba=238;while(0);do if((ba|0)==238){ba=0;if((o|0)!=1)break;o=c[M>>2]|0;ba=240}while(0);if((ba|0)==240){w=o+(i*24|0)|0;do if((f|0)==1){c[6995]=(c[6995]|0)+1;o=sc(67)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)<=0){if(!h){f=2;h=p;o=n;break}}else{o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=2;h=p;o=n}else o=1;while(0);o=h+(o*24|0)|0;c[o>>2]=c[w>>2];c[o+4>>2]=c[w+4>>2];c[o+8>>2]=c[w+8>>2];c[o+12>>2]=c[w+12>>2];c[o+16>>2]=c[w+16>>2];c[o+20>>2]=c[w+20>>2];o=n+1|0;n=o}i=i+1|0}while((i|0)!=(c[N>>2]|0))}ba=276}g:do if((ba|0)==276){ba=0;if((n|0)>0){G=0;o=c[ha+4>>2]|0;i=c[ha+8>>2]|0;w=a[ha+16>>0]|0;while(1){A=h+(G*24|0)+20|0;do if((o|0)==(i|0)){y=i|0?i<<1:1;if((i|0)>=(y|0)){z=w;o=i;y=i;break}do if(!y)f=0;else{c[6995]=(c[6995]|0)+1;o=sc((y<<2|3)+16|0)|0;if(!o){f=0;break}c[(o+4+15&-16)+-4>>2]=o;f=o+4+15&-16}while(0);p=c[ha+12>>2]|0;if((i|0)<=0){if(p)ba=305}else{o=0;do{c[f+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(i|0));ba=305}if((ba|0)==305){ba=0;if(w<<24>>24){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[ha+12>>2]=0;i=c[ha+4>>2]|0}c[ha+12>>2]=f;c[ha+8>>2]=y;z=1;o=i}else{z=w;y=i}while(0);c[(c[ha+12>>2]|0)+(o<<2)>>2]=c[A>>2];o=o+1|0;c[ha+4>>2]=o;i=c[N>>2]|0;h:do if((i|0)>0){x=c[M>>2]|0;f=c[A>>2]|0;p=0;while(1){w=x+(p*24|0)+20|0;p=p+1|0;if((c[w>>2]|0)==(f|0))break;if((p|0)>=(i|0))break h}c[w>>2]=-1}while(0);G=G+1|0;if((G|0)>=(n|0))break;else{i=y;w=z}}a[ha+16>>0]=z}if((i|0)<=0){ba=315;break}x=c[M>>2]|0;y=c[Z>>2]|0;z=c[$>>2]|0;A=(I|0)>0;if((y|0)>0)w=0;else{ba=315;break}while(1){G=c[x+(w*24|0)+20>>2]|0;i:do if((G|0)!=-1){if(A)f=0;else{o=0;while(1){p=c[z+(o*36|0)+4>>2]|0;if((p|0)>0){f=c[z+(o*36|0)+12>>2]|0;n=0;do{if((c[f+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(p|0))}o=o+1|0;if((o|0)>=(y|0))break i}}do{n=0;while(1){if((c[J+(n<<2)>>2]|0)==(f|0))break;n=n+1|0;if((n|0)>=(I|0)){ba=291;break}}do if((ba|0)==291){ba=0;o=c[z+(f*36|0)+4>>2]|0;if((o|0)<=0)break;p=c[z+(f*36|0)+12>>2]|0;n=0;do{if((c[p+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(o|0))}while(0);f=f+1|0}while((f|0)<(y|0))}while(0);w=w+1|0;if((w|0)>=(i|0)){ba=315;break}}}while(0);if((ba|0)==315){ba=0;ih((c[d+56>>2]|0)+24|0,ha);i=0}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}h=c[ha+12>>2]|0;if(h|0){if(a[ha+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ha+12>>2]=0}h=c[M>>2]|0;if(h|0){if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[M>>2]=0}if(i&(I|0)>0){p=0;ba=327}}else if((I|0)==1){p=0;ba=327}if((ba|0)==327)while(1){ba=0;f=c[J+(p<<2)>>2]|0;w=c[$>>2]|0;a[ha+136+16>>0]=1;c[P>>2]=0;c[ha+136+4>>2]=0;c[ha+136+8>>2]=0;o=c[w+(f*36|0)+4>>2]|0;if((o|0)>0){c[6995]=(c[6995]|0)+1;i=sc((o<<2|3)+16|0)|0;do if(!i){h=0;n=0}else{c[(i+4+15&-16)+-4>>2]=i;h=c[P>>2]|0;if((h|0)==0|(a[ha+136+16>>0]|0)==0){h=i+4+15&-16;n=i+4+15&-16;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16;n=i+4+15&-16}while(0);a[ha+136+16>>0]=1;c[P>>2]=h;c[ha+136+8>>2]=o;Yk(h|0,0,o<<2|0)|0;c[ha+136+4>>2]=o;i=c[w+(f*36|0)+12>>2]|0;h=0;do{c[n+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));h=c[P>>2]|0}else{c[ha+136+4>>2]=o;h=0}c[ha+136+20>>2]=c[w+(f*36|0)+20>>2];c[ha+136+20+4>>2]=c[w+(f*36|0)+20+4>>2];c[ha+136+20+8>>2]=c[w+(f*36|0)+20+8>>2];c[ha+136+20+12>>2]=c[w+(f*36|0)+20+12>>2];ih((c[d+56>>2]|0)+24|0,ha+136|0);if(h|0){if(a[ha+136+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[P>>2]=0}p=p+1|0;if((p|0)>=(I|0))break;else ba=327}if(!((J|0)==0|(K|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[K+-4>>2]|0)}}while((k|0)!=0)}else{Y=0;m=0}X=c[d+56>>2]|0;c[X+64>>2]=0;c[X+64+4>>2]=0;c[X+64+8>>2]=0;c[X+64+12>>2]=0;h=c[X+28>>2]|0;if((h|0)>0){W=0;i=0;k=0;I=0;K=0;f=0;n=0;J=0;w=0;o=0;G=0;z=0;x=0;y=0;p=0;while(1){A=c[X+36>>2]|0;V=c[A+(W*36|0)+4>>2]|0;if((V|0)>0){U=W&65535;T=W|-65536;N=0;S=J;P=w;h=A;M=p;while(1){R=N+1|0;d=c[h+(W*36|0)+12>>2]|0;w=c[d+(N<<2)>>2]&65535;N=c[d+(((R|0)==(V|0)?0:R)<<2)>>2]&65535;d=N<<16>>16>w<<16>>16?w:N;Q=N<<16>>16>w<<16>>16?N:w;p=N<<16>>16>w<<16>>16?w:N;w=N<<16>>16>w<<16>>16?N:w;N=P+-1|0;j:do if((((p&65535)<<16)+(w<<16>>16)&N)>>>0>>0?(ca=c[k+((((p&65535)<<16)+(w<<16>>16)&N)<<2)>>2]|0,(ca|0)!=-1):0){h=ca;while(1){if(w<<16>>16==(b[i+(h<<2)>>1]|0)?p<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1){J=0;break j}}J=o+(h<<2)|0}else J=0;while(0);h=c[X+16>>2]|0;u=+g[h+(p<<16>>16<<4)>>2]-+g[h+(w<<16>>16<<4)>>2];v=+g[h+(p<<16>>16<<4)+4>>2]-+g[h+(w<<16>>16<<4)+4>>2];s=+g[h+(p<<16>>16<<4)+8>>2]-+g[h+(w<<16>>16<<4)+8>>2];t=1.0/+D(+(u*u+v*v+s*s));h=c[X+48>>2]|0;k:do if((h|0)>0){w=c[X+56>>2]|0;p=0;while(1){q=+g[w+(p<<4)>>2];r=+g[w+(p<<4)+8>>2];do if(!(+C(+(q-u*t))>1.0e-06)){if(+C(+(+g[w+(p<<4)+4>>2]-v*t))>1.0e-06)break;if(!(+C(+(r-s*t))>1.0e-06))break k}while(0);do if(!(+C(+(u*t+q))>1.0e-06)){if(+C(+(v*t+ +g[w+(p<<4)+4>>2]))>1.0e-06)break;if(!(+C(+(s*t+r))>1.0e-06))break k}while(0);p=p+1|0;if((p|0)>=(h|0)){ba=367;break}}}else ba=367;while(0);if((ba|0)==367){ba=0;do if((h|0)==(c[X+52>>2]|0)){A=h|0?h<<1:1;if((h|0)>=(A|0))break;if(!A)w=0;else{c[6995]=(c[6995]|0)+1;h=sc((A<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}w=h;h=c[X+48>>2]|0}if((h|0)>0){p=0;do{ka=w+(p<<4)|0;la=(c[X+56>>2]|0)+(p<<4)|0;c[ka>>2]=c[la>>2];c[ka+4>>2]=c[la+4>>2];c[ka+8>>2]=c[la+8>>2];c[ka+12>>2]=c[la+12>>2];p=p+1|0}while((p|0)!=(h|0))}h=c[X+56>>2]|0;if(h|0){if(a[X+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[X+56>>2]=0}a[X+60>>0]=1;c[X+56>>2]=w;c[X+52>>2]=A;h=c[X+48>>2]|0}while(0);la=c[X+56>>2]|0;g[la+(h<<4)>>2]=u*t;g[la+(h<<4)+4>>2]=v*t;g[la+(h<<4)+8>>2]=s*t;g[la+(h<<4)+12>>2]=0.0;c[X+48>>2]=(c[X+48>>2]|0)+1}l:do if(!J){J=((d&65535)<<16)+(Q<<16>>16)&N;m:do if(J>>>0>>0){h=c[k+(J<<2)>>2]|0;if((h|0)==-1)break;while(1){if(Q<<16>>16==(b[i+(h<<2)>>1]|0)?d<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1)break m}A=o+(h<<2)|0;b[A>>1]=T;b[A+2>>1]=T>>>16;A=K;J=S;w=P;h=z;p=M;break l}while(0);do if((S|0)==(P|0)){w=S|0?S<<1:1;if((S|0)>=(w|0)){w=S;break}do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((S|0)<=0){if(!o){o=p;break}}else{h=0;do{la=p+(h<<2)|0;ka=o+(h<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;h=h+1|0}while((h|0)!=(S|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);o=p}else w=P;while(0);N=o+(S<<2)|0;b[N>>1]=T;b[N+2>>1]=T>>>16;N=S+1|0;do if((G|0)==(x|0)){x=G|0?G<<1:1;if((G|0)>=(x|0)){x=G;break}do if(!x)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((x<<2|3)+16|0)|0;if(!h){h=0;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}while(0);if((G|0)<=0){if(!i){i=h;break}}else{p=0;do{la=h+(p<<2)|0;ka=i+(p<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;p=p+1|0}while((p|0)!=(G|0))}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);i=h}while(0);la=i+(G<<2)|0;b[la>>1]=(d&65535)<<16|Q&65535;b[la+2>>1]=((d&65535)<<16|Q&65535)>>>16;G=G+1|0;if((P|0)<(w|0)){do if((I|0)<(w|0)){do if((z|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((I|0)<=0){if(!k){k=p;J=w;M=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[k+(h<<2)>>2];h=h+1|0}while((h|0)!=(I|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);k=p;J=w;M=p}else J=z;while(0);z=w<<2;Yk(k+(I<<2)|0,0,z-(I<<2)|0)|0;if((K|0)<(w|0)){do if((f|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((z|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((K|0)<=0){if(!n){f=w;n=p;h=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[n+(h<<2)>>2];h=h+1|0}while((h|0)!=(K|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);f=w;n=p;h=p}else h=y;while(0);Yk(n+(K<<2)|0,0,z-(K<<2)|0)|0;y=h}if((w|0)>0){Yk(M|0,-1,z|0)|0;Yk(y|0,-1,z|0)|0}if((I|0)<=0){I=w;A=w;h=J;p=M;break}p=w+-1|0;h=0;do{la=k+(((e[i+(h<<2)+2>>1]<<16)+(b[i+(h<<2)>>1]|0)&p)<<2)|0;c[n+(h<<2)>>2]=c[la>>2];c[la>>2]=h;h=h+1|0}while((h|0)!=(I|0));I=w;A=w;h=J;p=M}else{A=K;h=z;p=M}while(0);J=((d&65535)<<16)+(Q<<16>>16)&w+-1}else{A=K;h=z;p=M}J=k+(J<<2)|0;c[n+(S<<2)>>2]=c[J>>2];c[J>>2]=S;J=N}else{b[J+2>>1]=U;A=K;J=S;w=P;h=z;p=M}while(0);if((R|0)>=(V|0))break;N=R;K=A;S=J;P=w;z=h;h=c[X+36>>2]|0;M=p}z=h;h=c[X+28>>2]|0}else A=K;W=W+1|0;if((W|0)>=(h|0))break;else K=A}if((h|0)>0){z=c[X+36>>2]|0;A=c[X+16>>2]|0;y=0;q=0.0;do{f=c[z+(y*36|0)+4>>2]|0;w=c[z+(y*36|0)+12>>2]|0;x=c[w>>2]|0;if((f+-2|0)>=1){p=1;r=+g[X+64>>2];s=+g[X+68>>2];t=+g[X+72>>2];do{ka=c[w+(p<<2)>>2]|0;p=p+1|0;la=c[w+(((p|0)%(f|0)|0)<<2)>>2]|0;u=+g[A+(x<<4)>>2];v=+g[A+(ka<<4)>>2];E=+g[A+(x<<4)+4>>2];F=+g[A+(ka<<4)+4>>2];L=+g[A+(x<<4)+8>>2];O=+g[A+(ka<<4)+8>>2];B=+g[A+(la<<4)>>2];H=+g[A+(la<<4)+4>>2];ia=+g[A+(la<<4)+8>>2];ja=+D(+(((u-v)*(E-H)-(E-F)*(u-B))*((u-v)*(E-H)-(E-F)*(u-B))+(((E-F)*(L-ia)-(L-O)*(E-H))*((E-F)*(L-ia)-(L-O)*(E-H))+((L-O)*(u-B)-(u-v)*(L-ia))*((L-O)*(u-B)-(u-v)*(L-ia)))))*.5;r=r+(u+v+B)*.3333333432674408*ja;g[X+64>>2]=r;s=(E+F+H)*.3333333432674408*ja+s;g[X+68>>2]=s;t=ja*(L+O+ia)*.3333333432674408+t;g[X+72>>2]=t;q=q+ja}while((p|0)!=(f+-1|0))}y=y+1|0}while((y|0)!=(h|0));p=X+64|0;w=i;f=k;i=1}else ba=346}else{i=0;k=0;n=0;o=0;ba=346}if((ba|0)==346){q=0.0;p=X+64|0;w=i;f=k;i=0}t=1.0/q;u=t*+g[p>>2];g[p>>2]=u;s=t*+g[X+68>>2];g[X+68>>2]=s;t=t*+g[X+72>>2];g[X+72>>2]=t;g[X+96>>2]=3402823466385288598117041.0e14;if(i){k=c[X+36>>2]|0;i=0;r=3402823466385288598117041.0e14;while(1){q=+C(+(+g[k+(i*36|0)+32>>2]+(+g[k+(i*36|0)+20>>2]*u+ +g[k+(i*36|0)+24>>2]*s+ +g[k+(i*36|0)+28>>2]*t)));if(q>2]=q;else q=r;i=i+1|0;if((i|0)>=(h|0)){B=q;break}else r=q}}else B=3402823466385288598117041.0e14;i=c[X+8>>2]|0;if((i|0)>0){k=c[X+16>>2]|0;h=0;u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14;do{ja=+g[k+(h<<4)>>2];q=jat?ja:t;ja=+g[k+(h<<4)+4>>2];r=jav?ja:v;ja=+g[k+(h<<4)+8>>2];s=jau?ja:u;h=h+1|0}while((h|0)!=(i|0))}else{u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14}g[X+100>>2]=q+t;g[X+104>>2]=r+v;g[X+108>>2]=s+u;g[X+112>>2]=0.0;ja=t-q;q=v-r;r=u-s;g[X+116>>2]=ja;g[X+120>>2]=q;g[X+124>>2]=r;g[X+128>>2]=0.0;s=B/1.7320507764816284;p=+g[X+116+((ja>2]>2]*.5-s)*.0009765625;g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s;r=+g[X+116+(p<<2)>>2]*.5;g[X+80+(p<<2)>>2]=r;h=0;while(1){if(dh(X)|0){ba=452;break}r=r-q;g[X+80+(p<<2)>>2]=r;h=h+1|0;if((h|0)>=1024){ba=451;break}}n:do if((ba|0)==451){g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s}else if((ba|0)==452){q=(+g[X+96>>2]-s)*.0009765625;h=0;k=c[X+80+((1<<(1<>2]|0;while(1){i=c[X+80+((1<>2]|0;g[X+80+((1<>2]=q+(c[j>>2]=i,+g[j>>2]);r=q+ +g[X+80+((1<<(1<>2];g[X+80+((1<<(1<>2]=r;h=h+1|0;if(!(dh(X)|0))break;if((h|0)>=1024)break n;else k=(g[j>>2]=r,c[j>>2]|0)}c[X+80+((1<>2]=i;c[X+80+((1<<(1<>2]=k}while(0);if(w|0){c[6996]=(c[6996]|0)+1;Cd(c[w+-4>>2]|0)}if(o|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}if(!((m|0)==0|(Y|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[Y+-4>>2]|0)}o=c[Z>>2]|0;p=c[$>>2]|0;if((o|0)<=0){if(p|0)ba=473}else{h=0;do{k=p+(h*36|0)+4|0;m=p+(h*36|0)+12|0;n=c[m>>2]|0;i=p+(h*36|0)+16|0;if(n|0){if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[m>>2]=0}a[i>>0]=1;c[m>>2]=0;c[k>>2]=0;c[p+(h*36|0)+8>>2]=0;h=h+1|0}while((h|0)!=(o|0));ba=473}if((ba|0)==473){if(a[ha+56+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[$>>2]=0}if(!((aa|0)==0|(_|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[_+-4>>2]|0)}h=c[da>>2]|0;if(h|0){if(a[ha+76+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[da>>2]=0}a[ha+76+56>>0]=1;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;h=c[ea>>2]|0;if(h|0){if(a[ha+76+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ea>>2]=0}a[ha+76+36>>0]=1;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;h=c[fa>>2]|0;if(h|0){if(a[ha+76+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[fa>>2]=0}if(!ga){l=ha;return 1}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);l=ha;return 1}function ec(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0.0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0,ja=0,ka=0.0,la=0.0,ma=0.0,na=0,oa=0.0,pa=0,qa=0,ra=0,sa=0,ta=0;ta=l;l=l+1072|0;j=c[b+56>>2]|0;if(!j){j=c[b+4>>2]|0;j=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[d+8>>2]|0,c[e+8>>2]|0)|0;c[b+56>>2]=j;a[b+52>>0]=1}c[h+4>>2]=j;ra=c[d+4>>2]|0;pa=c[e+4>>2]|0;a:do switch(c[ra+4>>2]|0){case 10:switch(c[pa+4>>2]|0){case 10:{oa=+g[j+784>>2];sa=c[ra+56>>2]|0;b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(sa<<2)>>2],+g[ra+32+(((sa+2|0)%3|0)<<2)>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],sa,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}case 8:{oa=+g[j+784>>2];b=c[ra+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(b<<2)>>2],+g[ra+32+(((b+2|0)%3|0)<<2)>>2],0.0,+g[pa+32>>2]*+g[pa+16>>2],b,1,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}default:{m=pa+4|0;break a}}case 8:{if((c[pa+4>>2]|0)==10){oa=+g[j+784>>2];b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,0.0,+g[ra+32>>2]*+g[ra+16>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],1,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}else m=pa+4|0;break}default:m=pa+4|0}while(0);g[ta+488+128>>2]=999999984306749440.0;g[ta+128+308>>2]=9.999999747378752e-05;a[ta+128+332>>0]=0;j=c[b+8>>2]|0;c[ta+48>>2]=9552;c[ta+48+4>>2]=0;c[ta+48+8>>2]=1065353216;c[ta+48+12>>2]=0;g[ta+48+16>>2]=0.0;c[ta+48+20>>2]=j;c[ta+48+24>>2]=ta+128;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;c[ta+48+36>>2]=c[ra+4>>2];c[ta+48+40>>2]=c[m>>2];g[ta+48+44>>2]=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);g[ta+48+48>>2]=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);a[ta+48+52>>0]=0;c[ta+48+60>>2]=-1;c[ta+48+72>>2]=1;c[ta+48+76>>2]=1;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;ma=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);oa=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);oa=ma+oa+ +g[(c[b+56>>2]|0)+784>>2]+ +g[h+32>>2];g[ta+488+128>>2]=oa*oa;j=c[d+12>>2]|0;c[ta+488>>2]=c[j>>2];c[ta+488+4>>2]=c[j+4>>2];c[ta+488+8>>2]=c[j+8>>2];c[ta+488+12>>2]=c[j+12>>2];n=ta+488+16|0;c[n>>2]=c[j+16>>2];c[n+4>>2]=c[j+16+4>>2];c[n+8>>2]=c[j+16+8>>2];c[n+12>>2]=c[j+16+12>>2];s=ta+488+32|0;c[s>>2]=c[j+32>>2];c[s+4>>2]=c[j+32+4>>2];c[s+8>>2]=c[j+32+8>>2];c[s+12>>2]=c[j+32+12>>2];t=ta+488+48|0;c[t>>2]=c[j+48>>2];c[t+4>>2]=c[j+48+4>>2];c[t+8>>2]=c[j+48+8>>2];c[t+12>>2]=c[j+48+12>>2];j=c[e+12>>2]|0;u=ta+488+64|0;c[u>>2]=c[j>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];L=ta+488+80|0;c[L>>2]=c[j+16>>2];c[L+4>>2]=c[j+16+4>>2];c[L+8>>2]=c[j+16+8>>2];c[L+12>>2]=c[j+16+12>>2];M=ta+488+96|0;c[M>>2]=c[j+32>>2];c[M+4>>2]=c[j+32+4>>2];c[M+8>>2]=c[j+32+8>>2];c[M+12>>2]=c[j+32+12>>2];N=ta+488+112|0;c[N>>2]=c[j+48>>2];c[N+4>>2]=c[j+48+4>>2];c[N+8>>2]=c[j+48+8>>2];c[N+12>>2]=c[j+48+12>>2];j=c[ra+4>>2]|0;if((j|0)<7?(k=c[m>>2]|0,(k|0)<7):0){c[ta+40>>2]=6428;if(!j){j=k;o=0.0}else{o=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);j=c[m>>2]|0}if(!j)i=0.0;else i=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);c[ta>>2]=6456;c[ta+4>>2]=h;g[ta+24>>2]=o;g[ta+28>>2]=i;a[ta+36>>0]=0;ia=c[ra+56>>2]|0;b:do if(ia|0){ja=c[pa+56>>2]|0;do if(!ja){if((c[m>>2]|0)!=1)break b;t=ta+1e3+16|0;a[t>>0]=1;u=ta+1e3+12|0;c[u>>2]=0;s=ta+1e3+4|0;c[s>>2]=0;n=ta+1e3+8|0;c[n>>2]=0;j=c[e+12>>2]|0;ma=+g[pa+60>>2];oa=+g[pa+60+4>>2];p=+g[pa+60+8>>2];i=ma*+g[j>>2]+oa*+g[j+4>>2]+p*+g[j+8>>2]+ +g[j+48>>2];o=ma*+g[j+16>>2]+oa*+g[j+20>>2]+p*+g[j+24>>2]+ +g[j+52>>2];p=ma*+g[j+32>>2]+oa*+g[j+36>>2]+p*+g[j+40>>2]+ +g[j+56>>2];c[6995]=(c[6995]|0)+1;j=sc(35)|0;if(!j)k=0;else{c[(j+4+15&-16)+-4>>2]=j;k=j+4+15&-16}j=c[u>>2]|0;if(!j)j=0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);j=c[s>>2]|0;c[u>>2]=0}a[t>>0]=1;c[u>>2]=k;c[n>>2]=1;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;sa=c[e+12>>2]|0;ma=+g[pa+60+16>>2];oa=+g[pa+60+20>>2];p=+g[pa+60+24>>2];i=ma*+g[sa>>2]+oa*+g[sa+4>>2]+p*+g[sa+8>>2]+ +g[sa+48>>2];o=ma*+g[sa+16>>2]+oa*+g[sa+20>>2]+p*+g[sa+24>>2]+ +g[sa+52>>2];p=ma*+g[sa+32>>2]+oa*+g[sa+36>>2]+p*+g[sa+40>>2]+ +g[sa+56>>2];if((j|0)==(c[n>>2]|0)?(O=j|0?j<<1:1,(j|0)<(O|0)):0){if(!O)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((O<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{sa=m+(k<<4)|0;qa=(c[u>>2]|0)+(k<<4)|0;c[sa>>2]=c[qa>>2];c[sa+4>>2]=c[qa+4>>2];c[sa+8>>2]=c[qa+8>>2];c[sa+12>>2]=c[qa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=O;j=c[s>>2]|0}sa=c[u>>2]|0;g[sa+(j<<4)>>2]=i;g[sa+(j<<4)+4>>2]=o;g[sa+(j<<4)+8>>2]=p;g[sa+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;e=c[e+12>>2]|0;ma=+g[pa+60+32>>2];oa=+g[pa+60+36>>2];p=+g[pa+60+40>>2];i=ma*+g[e>>2]+oa*+g[e+4>>2]+p*+g[e+8>>2]+ +g[e+48>>2];o=ma*+g[e+16>>2]+oa*+g[e+20>>2]+p*+g[e+24>>2]+ +g[e+52>>2];p=ma*+g[e+32>>2]+oa*+g[e+36>>2]+p*+g[e+40>>2]+ +g[e+56>>2];if((j|0)==(c[n>>2]|0)?(S=j|0?j<<1:1,(j|0)<(S|0)):0){if(!S)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((S<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{e=m+(k<<4)|0;sa=(c[u>>2]|0)+(k<<4)|0;c[e>>2]=c[sa>>2];c[e+4>>2]=c[sa+4>>2];c[e+8>>2]=c[sa+8>>2];c[e+12>>2]=c[sa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=S;j=c[s>>2]|0}e=c[u>>2]|0;g[e+(j<<4)>>2]=i;g[e+(j<<4)+4>>2]=o;g[e+(j<<4)+8>>2]=p;g[e+(j<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;q=+g[(c[b+56>>2]|0)+784>>2];Dc(ta+48|0,ta+488|0,ta+40|0,c[f+20>>2]|0,0);i=+g[ta+48+4>>2];o=+g[ta+48+8>>2];p=+g[ta+48+12>>2];if(i*i+o*o+p*p>1.1920928955078125e-07){oa=1.0/(i*i+o*o+p*p);g[ta+760>>2]=i*oa;g[ta+760+4>>2]=o*oa;g[ta+760+8>>2]=p*oa;g[ta+760+12>>2]=0.0;oa=+g[ta+48+56>>2];i=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);i=oa-i-+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);j=c[b+36>>2]|0;if((j|0)<0){if((c[b+40>>2]|0)<0){k=c[b+44>>2]|0;if(k|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+40>>2]=0}do{e=(c[b+44>>2]|0)+(j<<4)|0;c[e>>2]=c[ta+744>>2];c[e+4>>2]=c[ta+744+4>>2];c[e+8>>2]=c[ta+744+8>>2];c[e+12>>2]=c[ta+744+12>>2];j=j+1|0}while((j|0)!=0)}c[b+36>>2]=0;Mc(ta+760|0,c[ra+56>>2]|0,c[d+12>>2]|0,ta+1e3|0,b+32|0,i-q,q,h)}do if(a[b+52>>0]|0?(W=c[h+4>>2]|0,c[W+780>>2]|0):0){k=c[W+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(W,k+4|0,j+4|0);break}else{af(W,j+4|0,m+4|0);break}}while(0);j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}}else{oa=+g[(c[b+56>>2]|0)+784>>2];c:do if(!(a[f+24>>0]|0)){Dc(ta+48|0,ta+488|0,ta,c[f+20>>2]|0,0);i=+g[ta+32>>2];if(i<0.0&(a[ta+36>>0]|0)!=0){o=+g[ta+8>>2];p=+g[ta+12>>2];q=+g[ta+16>>2];m=c[ta+20>>2]|0;na=107}}else{u=c[d+12>>2]|0;L=c[e+12>>2]|0;c[6411]=(c[6411]|0)+1;da=+g[ia+64>>2];ea=+g[ia+68>>2];r=+g[u+4>>2];fa=+g[ia+72>>2];v=+g[u+8>>2];x=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2];ga=+g[ja+64>>2];ha=+g[ja+68>>2];ma=+g[ja+72>>2];ka=da*+g[u>>2]+ea*r+fa*v+ +g[u+48>>2]-(ga*+g[L>>2]+ha*+g[L+4>>2]+ma*+g[L+8>>2]+ +g[L+48>>2]);la=da*x+ea*z+fa*B+ +g[u+52>>2]-(ga*+g[L+16>>2]+ha*+g[L+20>>2]+ma*+g[L+24>>2]+ +g[L+52>>2]);ma=da*E+ea*A+fa*y+ +g[u+56>>2]-(ga*+g[L+32>>2]+ha*+g[L+36>>2]+ma*+g[L+40>>2]+ +g[L+56>>2]);m=c[ia+28>>2]|0;d:do if((m|0)>0){i=3402823466385288598117041.0e14;j=0;w=0.0;o=0.0;p=0.0;q=0.0;H=x;while(1){f=c[ia+36>>2]|0;fa=+g[f+(j*36|0)+20>>2];ga=+g[f+(j*36|0)+24>>2];ha=+g[f+(j*36|0)+28>>2];x=fa*+g[u>>2]+ga*r+ha*v;v=fa*H+ga*z+ha*B;r=fa*E+ga*A+ha*y;g[ta+656>>2]=x;g[ta+656+4>>2]=v;g[ta+656+8>>2]=r;g[ta+656+12>>2]=0.0;if(ka*x+la*v+ma*r<0.0){g[ta+656>>2]=-x;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-r;B=-x;v=-v;r=-r}else B=x;c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,B,v,r,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);x=+g[ta+760>>2];y=+g[ta+744>>2];do if(x>2];A=+g[ta+1e3>>2];if(z=(m|0))break d;r=+g[u+4>>2];v=+g[u+8>>2];H=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2]}break c}else{i=3402823466385288598117041.0e14;o=0.0;p=0.0;q=0.0}while(0);m=c[ja+28>>2]|0;e:do if((m|0)>0){k=0;x=0.0;while(1){f=c[ja+36>>2]|0;ga=+g[f+(k*36|0)+20>>2];ha=+g[f+(k*36|0)+24>>2];w=+g[f+(k*36|0)+28>>2];r=ga*+g[L>>2]+ha*+g[L+4>>2]+w*+g[L+8>>2];v=ga*+g[L+16>>2]+ha*+g[L+20>>2]+w*+g[L+24>>2];w=ga*+g[L+32>>2]+ha*+g[L+36>>2]+w*+g[L+40>>2];g[ta+656>>2]=r;g[ta+656+4>>2]=v;g[ta+656+8>>2]=w;g[ta+656+12>>2]=0.0;if(ka*r+la*v+ma*w<0.0){g[ta+656>>2]=-r;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-w;r=-r;v=-v;w=-w}c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,r,v,w,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);y=+g[ta+760>>2];z=+g[ta+744>>2];do if(y>2];B=+g[ta+1e3>>2];if(A=(m|0))break e}break c}while(0);j=c[ia+48>>2]|0;f:do if((j|0)>0){t=0;k=-1;n=-1;w=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0;x=0.0;A=0.0;B=0.0;v=0.0;r=0.0;E=0.0;V=0.0;U=0.0;T=0.0;R=0.0;Q=0.0;P=0.0;m=c[ja+48>>2]|0;g:while(1){f=c[ia+56>>2]|0;da=+g[f+(t<<4)>>2];ea=+g[f+(t<<4)+4>>2];ha=+g[f+(t<<4)+8>>2];fa=da*+g[u>>2]+ea*+g[u+4>>2]+ha*+g[u+8>>2];ga=da*+g[u+16>>2]+ea*+g[u+20>>2]+ha*+g[u+24>>2];ha=da*+g[u+32>>2]+ea*+g[u+36>>2]+ha*+g[u+40>>2];if((m|0)>0){s=0;ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E;while(1){f=c[ja+56>>2]|0;A=+g[f+(s<<4)>>2];B=+g[f+(s<<4)+4>>2];Y=+g[f+(s<<4)+8>>2];E=A*+g[L>>2]+B*+g[L+4>>2]+Y*+g[L+8>>2];X=A*+g[L+16>>2]+B*+g[L+20>>2]+Y*+g[L+24>>2];Y=A*+g[L+32>>2]+B*+g[L+36>>2]+Y*+g[L+40>>2];g[ta+656>>2]=ga*Y-ha*X;g[ta+656+4>>2]=ha*E-fa*Y;g[ta+656+8>>2]=fa*X-ga*E;g[ta+656+12>>2]=0.0;do if(!(+C(+(ga*Y-ha*X))>1.0e-06)){if(+C(+(ha*E-fa*Y))>1.0e-06){na=71;break}if(!(+C(+(fa*X-ga*E))>1.0e-06)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa}else na=71}else na=71;while(0);do if((na|0)==71){na=0;q=1.0/+D(+((ga*Y-ha*X)*(ga*Y-ha*X)+(ha*E-fa*Y)*(ha*E-fa*Y)+(fa*X-ga*E)*(fa*X-ga*E)));o=(ga*Y-ha*X)*q;g[ta+656>>2]=o;p=(ha*E-fa*Y)*q;g[ta+656+4>>2]=p;q=(fa*X-ga*E)*q;g[ta+656+8>>2]=q;if(o*ka+p*la+ma*q<0.0){g[ta+656>>2]=-o;g[ta+656+4>>2]=-p;g[ta+656+8>>2]=-q;o=-o;p=-p;q=-q}c[6409]=(c[6409]|0)+1;if(!(Ii(u,L,ka,la,ma,o,p,q,ia,ja,i)|0)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa;break}c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);w=+g[ta+760>>2];x=+g[ta+744>>2];do if(!(w>2];B=+g[ta+1e3>>2];if(A>2];U=+g[ta+688+4>>2];V=+g[ta+688+8>>2];B=+g[ta+704>>2];A=+g[ta+704+4>>2];x=+g[ta+704+8>>2];break}else{j=1;w=A-B;T=+g[ta+672>>2];U=+g[ta+672+4>>2];V=+g[ta+672+8>>2];B=+g[ta+720>>2];A=+g[ta+720+4>>2];x=+g[ta+720+8>>2];break}}else{j=0;w=ba;B=_;A=$;x=aa}while(0);if(!j)break g;if(!(w>2]|0;if((s|0)>=(m|0))break;else{ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E}}j=c[ia+48>>2]|0}t=t+1|0;if((t|0)>=(j|0)){j=n;i=E;break f}}break c}else{k=-1;j=-1;v=0.0;r=0.0;i=0.0;R=0.0;Q=0.0;P=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0}while(0);if((k|j|0)>-1){A=P-i;B=Q-r;E=R-v;w=z*K+y*J+H*I;x=A*K+B*J+E*I;r=A*z+B*y+E*H;if(!(1.0-w*w==0.0))if(!((x-r*w)/(1.0-w*w)<-1000000015047466219876688.0e6))if((x-r*w)/(1.0-w*w)>1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;na=90}else v=(x-r*w)/(1.0-w*w);else{i=-1000000015047466219876688.0e6;na=90}else{i=0.0;na=90}if((na|0)==90)v=i;i=w*v-r;do if(i<-1000000015047466219876688.0e6){if(x-w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=-1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x-w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=-1000000015047466219876688.0e6;r=x-w*1000000015047466219876688.0e6;break}i=-1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}else{if(!(i>1000000015047466219876688.0e6)){r=v;break}if(x+w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x+w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=1000000015047466219876688.0e6;r=x+w*1000000015047466219876688.0e6;break}i=1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}while(0);z=z*i;y=y*i;x=H*i;w=z+(A-K*r);v=y+(B-J*r);i=x+(E-I*r);g[ta+1e3>>2]=w;g[ta+1e3+4>>2]=v;g[ta+1e3+8>>2]=i;g[ta+1e3+12>>2]=0.0;if(w*w+v*v+i*i>1.1920928955078125e-07){r=+D(+(w*w+v*v+i*i));g[ta+1e3>>2]=w*(1.0/r);g[ta+1e3+4>>2]=1.0/r*v;g[ta+1e3+8>>2]=1.0/r*i;if(w*(1.0/r)*ka+1.0/r*v*la+1.0/r*i*ma<0.0){g[ta+1e3>>2]=-(w*(1.0/r));g[ta+1e3+4>>2]=-(1.0/r*v);g[ta+1e3+8>>2]=-(1.0/r*i)}g[ta+760>>2]=P+z;g[ta+760+4>>2]=Q+y;g[ta+760+8>>2]=R+x;g[ta+760+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,ta+1e3|0,ta+760|0,-r)}}if(ka*o+la*p+ma*q<0.0){i=-1000000015047466219876688.0e6;o=-o;p=-p;q=-q;m=0;na=107}else{i=-1000000015047466219876688.0e6;m=0;na=107}}while(0);if((na|0)==107){j=c[b+16>>2]|0;if((j|0)<0){if((c[b+20>>2]|0)<0){k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=0;c[b+20>>2]=0}do{na=(c[b+24>>2]|0)+(j<<4)|0;c[na>>2]=c[ta+1e3>>2];c[na+4>>2]=c[ta+1e3+4>>2];c[na+8>>2]=c[ta+1e3+8>>2];c[na+12>>2]=c[ta+1e3+12>>2];j=j+1|0}while((j|0)!=0)}c[b+16>>2]=0;O=c[ra+56>>2]|0;N=c[pa+56>>2]|0;M=c[d+12>>2]|0;L=c[e+12>>2]|0;K=i-oa;H=1.0/+D(+(o*o+p*p+q*q));J=o*H;I=p*H;H=q*H;g[ta+1e3>>2]=J;g[ta+1e3+4>>2]=I;g[ta+1e3+8>>2]=H;c[ta+1e3+12>>2]=m;k=c[N+28>>2]|0;if((k|0)>0){m=c[N+36>>2]|0;o=+g[L>>2];p=+g[L+4>>2];q=+g[L+8>>2];r=+g[L+16>>2];v=+g[L+20>>2];w=+g[L+24>>2];x=+g[L+32>>2];y=+g[L+36>>2];z=+g[L+40>>2];i=-3402823466385288598117041.0e14;j=0;t=-1;while(1){A=+g[m+(j*36|0)+20>>2];B=+g[m+(j*36|0)+24>>2];E=+g[m+(j*36|0)+28>>2];n=(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H>i;t=n?j:t;j=j+1|0;if((j|0)==(k|0))break;else i=n?(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H:i}}else t=-1;j=c[N+36>>2]|0;c[b+16>>2]=0;u=c[j+(t*36|0)+4>>2]|0;if((u|0)>0){s=j+(t*36|0)+12|0;n=0;k=0;do{d=c[(c[s>>2]|0)+(n<<2)>>2]|0;e=c[N+16>>2]|0;la=+g[e+(d<<4)>>2];ma=+g[e+(d<<4)+4>>2];p=+g[e+(d<<4)+8>>2];i=la*+g[L>>2]+ma*+g[L+4>>2]+p*+g[L+8>>2]+ +g[L+48>>2];o=la*+g[L+16>>2]+ma*+g[L+20>>2]+p*+g[L+24>>2]+ +g[L+52>>2];p=la*+g[L+32>>2]+ma*+g[L+36>>2]+p*+g[L+40>>2]+ +g[L+56>>2];if((k|0)==(c[b+20>>2]|0)?(qa=k|0?k<<1:1,(k|0)<(qa|0)):0){if(!qa)j=0;else{c[6995]=(c[6995]|0)+1;j=sc((qa<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=c[b+16>>2]|0}if((k|0)>0){m=0;do{d=j+(m<<4)|0;e=(c[b+24>>2]|0)+(m<<4)|0;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];m=m+1|0}while((m|0)!=(k|0))}k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=j;c[b+20>>2]=qa;j=c[b+16>>2]|0}else j=k;k=c[b+24>>2]|0;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;k=(c[b+16>>2]|0)+1|0;c[b+16>>2]=k;n=n+1|0}while((n|0)!=(u|0))}if((t|0)>-1)Mc(ta+1e3|0,O,M,b+12|0,b+32|0,K,oa,h)}if(a[b+52>>0]|0?(sa=c[h+4>>2]|0,c[sa+780>>2]|0):0){k=c[sa+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(sa,k+4|0,j+4|0);break}else{af(sa,j+4|0,m+4|0);break}}}while(0);l=ta;return}while(0)}Dc(ta+48|0,ta+488|0,h,c[f+20>>2]|0,0);if((c[b+64>>2]|0?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+68>>2]|0):0)?(K=+g[ta+48+4>>2],P=+g[ta+48+8>>2],Q=+g[ta+48+12>>2],K*K+P*P+Q*Q>1.1920928955078125e-07):0){J=1.0/(K*K+P*P+Q*Q);if(+C(+(Q*J))>.7071067690849304){I=1.0/+D(+(Q*J*Q*J+P*J*P*J));E=0.0;H=P*J*I;I=-(Q*J*I)}else{I=1.0/+D(+(K*J*K*J+P*J*P*J));E=-(P*J*I);H=0.0;I=K*J*I}B=+nb[c[(c[ra>>2]|0)+16>>2]&15](ra);z=+nb[c[(c[pa>>2]|0)+16>>2]&15](pa);i=.019999999552965164/(B>2]=c[ta+488>>2];c[ta+1e3+4>>2]=c[ta+488+4>>2];c[ta+1e3+8>>2]=c[ta+488+8>>2];c[ta+1e3+12>>2]=c[ta+488+12>>2];c[ta+1e3+16>>2]=c[n>>2];c[ta+1e3+16+4>>2]=c[n+4>>2];c[ta+1e3+16+8>>2]=c[n+8>>2];c[ta+1e3+16+12>>2]=c[n+12>>2];c[ta+1e3+32>>2]=c[s>>2];c[ta+1e3+32+4>>2]=c[s+4>>2];c[ta+1e3+32+8>>2]=c[s+8>>2];c[ta+1e3+32+12>>2]=c[s+12>>2];c[ta+1e3+48>>2]=c[t>>2];c[ta+1e3+48+4>>2]=c[t+4>>2];c[ta+1e3+48+8>>2]=c[t+8>>2];c[ta+1e3+48+12>>2]=c[t+12>>2]}else{c[ta+1e3>>2]=c[u>>2];c[ta+1e3+4>>2]=c[u+4>>2];c[ta+1e3+8>>2]=c[u+8>>2];c[ta+1e3+12>>2]=c[u+12>>2];c[ta+1e3+16>>2]=c[L>>2];c[ta+1e3+16+4>>2]=c[L+4>>2];c[ta+1e3+16+8>>2]=c[L+8>>2];c[ta+1e3+16+12>>2]=c[L+12>>2];c[ta+1e3+32>>2]=c[M>>2];c[ta+1e3+32+4>>2]=c[M+4>>2];c[ta+1e3+32+8>>2]=c[M+8>>2];c[ta+1e3+32+12>>2]=c[M+12>>2];c[ta+1e3+48>>2]=c[N>>2];c[ta+1e3+48+4>>2]=c[N+4>>2];c[ta+1e3+48+8>>2]=c[N+8>>2];c[ta+1e3+48+12>>2]=c[N+12>>2]}j=c[b+64>>2]|0;if((j|0)>0){A=E*E+I*I+H*H;y=(i>.39269909262657166?.39269909262657166:i)*.5;k=0;do{if(A>1.1920928955078125e-07){w=+G(+y)/+D(+A);r=E*w;v=I*w;w=H*w;x=+F(+y);q=+(k|0)*(6.2831854820251465/+(j|0))*.5;p=+G(+q)/+D(+(Q*J*Q*J+(K*J*K*J+P*J*P*J)));i=K*J*p;o=P*J*p;p=Q*J*p;q=+F(+q);if(B>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+4>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+8>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+12>>2]=0.0;g[ta+488+16>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+20>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+24>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+28>>2]=0.0;g[ta+488+32>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+36>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+40>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+44>>2]=0.0;sa=c[e+12>>2]|0;c[u>>2]=c[sa>>2];c[u+4>>2]=c[sa+4>>2];c[u+8>>2]=c[sa+8>>2];c[u+12>>2]=c[sa+12>>2];c[L>>2]=c[sa+16>>2];c[L+4>>2]=c[sa+16+4>>2];c[L+8>>2]=c[sa+16+8>>2];c[L+12>>2]=c[sa+16+12>>2];c[M>>2]=c[sa+32>>2];c[M+4>>2]=c[sa+32+4>>2];c[M+8>>2]=c[sa+32+8>>2];c[M+12>>2]=c[sa+32+12>>2];c[N>>2]=c[sa+48>>2];c[N+4>>2]=c[sa+48+4>>2];c[N+8>>2]=c[sa+48+8>>2];c[N+12>>2]=c[sa+48+12>>2]}else{sa=c[d+12>>2]|0;c[ta+488>>2]=c[sa>>2];c[ta+488+4>>2]=c[sa+4>>2];c[ta+488+8>>2]=c[sa+8>>2];c[ta+488+12>>2]=c[sa+12>>2];c[n>>2]=c[sa+16>>2];c[n+4>>2]=c[sa+16+4>>2];c[n+8>>2]=c[sa+16+8>>2];c[n+12>>2]=c[sa+16+12>>2];c[s>>2]=c[sa+32>>2];c[s+4>>2]=c[sa+32+4>>2];c[s+8>>2]=c[sa+32+8>>2];c[s+12>>2]=c[sa+32+12>>2];c[t>>2]=c[sa+48>>2];c[t+4>>2]=c[sa+48+4>>2];c[t+8>>2]=c[sa+48+8>>2];c[t+12>>2]=c[sa+48+12>>2];ha=p*(r*-p+(v*q+x*-o)-w*-i)+(i*(x*q-r*-i-v*-o-w*-p)+q*(w*-o+(r*q+x*-i)-v*-p))-o*(v*-i+(w*q+x*-p)-r*-o);la=i*(v*-i+(w*q+x*-p)-r*-o)+(q*(r*-p+(v*q+x*-o)-w*-i)+o*(x*q-r*-i-v*-o-w*-p))-p*(w*-o+(r*q+x*-i)-v*-p);Y=o*(w*-o+(r*q+x*-i)-v*-p)+(p*(x*q-r*-i-v*-o-w*-p)+q*(v*-i+(w*q+x*-p)-r*-o))-i*(r*-p+(v*q+x*-o)-w*-i);fa=q*(x*q-r*-i-v*-o-w*-p)-i*(w*-o+(r*q+x*-i)-v*-p)-o*(r*-p+(v*q+x*-o)-w*-i)-p*(v*-i+(w*q+x*-p)-r*-o);ka=ha*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ma=la*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ea=Y*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));sa=c[e+12>>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488+64>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+68>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+72>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+76>>2]=0.0;g[ta+488+80>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+84>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+88>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+92>>2]=0.0;g[ta+488+96>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+100>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+104>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+108>>2]=0.0}j=c[f+20>>2]|0;g[ta+760+32>>2]=0.0;c[ta+760>>2]=6484;c[ta+760+36>>2]=h;c[ta+760+40>>2]=c[ta+488>>2];c[ta+760+40+4>>2]=c[ta+488+4>>2];c[ta+760+40+8>>2]=c[ta+488+8>>2];c[ta+760+40+12>>2]=c[ta+488+12>>2];c[ta+760+56>>2]=c[n>>2];c[ta+760+56+4>>2]=c[n+4>>2];c[ta+760+56+8>>2]=c[n+8>>2];c[ta+760+56+12>>2]=c[n+12>>2];c[ta+760+72>>2]=c[s>>2];c[ta+760+72+4>>2]=c[s+4>>2];c[ta+760+72+8>>2]=c[s+8>>2];c[ta+760+72+12>>2]=c[s+12>>2];c[ta+760+88>>2]=c[t>>2];c[ta+760+88+4>>2]=c[t+4>>2];c[ta+760+88+8>>2]=c[t+8>>2];c[ta+760+88+12>>2]=c[t+12>>2];c[ta+760+104>>2]=c[u>>2];c[ta+760+104+4>>2]=c[u+4>>2];c[ta+760+104+8>>2]=c[u+8>>2];c[ta+760+104+12>>2]=c[u+12>>2];c[ta+760+120>>2]=c[L>>2];c[ta+760+120+4>>2]=c[L+4>>2];c[ta+760+120+8>>2]=c[L+8>>2];c[ta+760+120+12>>2]=c[L+12>>2];c[ta+760+136>>2]=c[M>>2];c[ta+760+136+4>>2]=c[M+4>>2];c[ta+760+136+8>>2]=c[M+8>>2];c[ta+760+136+12>>2]=c[M+12>>2];c[ta+760+152>>2]=c[N>>2];c[ta+760+152+4>>2]=c[N+4>>2];c[ta+760+152+8>>2]=c[N+8>>2];c[ta+760+152+12>>2]=c[N+12>>2];c[ta+760+168>>2]=c[ta+1e3>>2];c[ta+760+168+4>>2]=c[ta+1e3+4>>2];c[ta+760+168+8>>2]=c[ta+1e3+8>>2];c[ta+760+168+12>>2]=c[ta+1e3+12>>2];c[ta+760+184>>2]=c[ta+1e3+16>>2];c[ta+760+184+4>>2]=c[ta+1e3+16+4>>2];c[ta+760+184+8>>2]=c[ta+1e3+16+8>>2];c[ta+760+184+12>>2]=c[ta+1e3+16+12>>2];c[ta+760+200>>2]=c[ta+1e3+32>>2];c[ta+760+200+4>>2]=c[ta+1e3+32+4>>2];c[ta+760+200+8>>2]=c[ta+1e3+32+8>>2];c[ta+760+200+12>>2]=c[ta+1e3+32+12>>2];c[ta+760+216>>2]=c[ta+1e3+48>>2];c[ta+760+216+4>>2]=c[ta+1e3+48+4>>2];c[ta+760+216+8>>2]=c[ta+1e3+48+8>>2];c[ta+760+216+12>>2]=c[ta+1e3+48+12>>2];a[ta+760+232>>0]=B>2]=j;Dc(ta+48|0,ta+488|0,ta+760|0,j,0);j=c[b+64>>2]|0}k=k+1|0}while((k|0)<(j|0))}}if(!(a[b+52>>0]|0)){l=ta;return}k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}function fc(b){b=b|0;var d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0;W=l;l=l+176|0;ci(b);if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=W;return}if((c[b+348>>2]|0)<=0){l=W;return}Q=W+96+32|0;R=W+96+52|0;N=0;do{S=c[(c[b+356>>2]|0)+(N<<2)>>2]|0;if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&1|0):0){e=c[b+72>>2]|0;if(!(a[S+533>>0]|0))M=e;else{c[W+80>>2]=c[S+580>>2];c[W+80+4>>2]=c[S+580+4>>2];c[W+80+8>>2]=c[S+580+8>>2];c[W+80+12>>2]=c[S+580+12>>2];i=+g[S+644>>2];k=+g[S+596>>2];m=+g[S+660>>2];s=+g[S+600>>2];t=+g[S+676>>2];u=+g[S+604>>2];v=+g[S+648>>2];w=+g[S+664>>2];x=+g[S+680>>2];y=+g[S+652>>2];z=+g[S+668>>2];A=+g[S+684>>2];B=+g[S+612>>2];C=+g[S+616>>2];E=+g[S+620>>2];F=+g[S+628>>2];G=+g[S+632>>2];H=+g[S+636>>2];ga=i*k+m*s+t*u+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A)*0.0;ea=(y*B+z*C+A*E)*0.0+(i*B+m*C+t*E+(v*B+w*C+x*E)*0.0);da=(y*F+z*G+A*H)*0.0+(i*F+m*G+t*H+(v*F+w*G+x*H)*0.0);fa=1.0/+D(+(ga*ga+ea*ea+da*da));ca=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)+(k*y+s*z+u*A)*0.0;aa=(y*B+z*C+A*E)*0.0+(v*B+w*C+x*E+(i*B+m*C+t*E)*0.0);$=(y*F+z*G+A*H)*0.0+(v*F+w*G+x*H+(i*F+m*G+t*H)*0.0);ba=1.0/+D(+(ca*ca+aa*aa+$*$));_=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A);Y=y*B+z*C+A*E+((i*B+m*C+t*E)*0.0+(v*B+w*C+x*E)*0.0);X=y*F+z*G+A*H+((i*F+m*G+t*H)*0.0+(v*F+w*G+x*H)*0.0);Z=1.0/+D(+(_*_+Y*Y+X*X));M=c[(c[e>>2]|0)+16>>2]|0;ea=ea*fa*10.0+ +g[W+80+4>>2];da=fa*da*10.0+ +g[W+80+8>>2];g[W+160>>2]=ga*fa*10.0+ +g[W+80>>2];g[W+160+4>>2]=ea;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;aa=aa*ba*10.0+ +g[W+80+4>>2];$=ba*$*10.0+ +g[W+80+8>>2];g[W+160>>2]=ca*ba*10.0+ +g[W+80>>2];g[W+160+4>>2]=aa;g[W+160+8>>2]=$;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;Y=Y*Z*10.0+ +g[W+80+4>>2];X=Z*X*10.0+ +g[W+80+8>>2];g[W+160>>2]=_*Z*10.0+ +g[W+80>>2];g[W+160+4>>2]=Y;g[W+160+8>>2]=X;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);if((c[S+544>>2]|0)>0){d=0;do{M=c[S+552>>2]|0;ca=+g[M+(d<<4)>>2];da=+g[M+(d<<4)+4>>2];ga=+g[M+(d<<4)+8>>2];ea=+g[W+80>>2]+((i*k+m*s+t*u)*ca+(k*v+s*w+u*x)*da+(k*y+s*z+u*A)*ga);fa=+g[W+80+4>>2]+((i*B+m*C+t*E)*ca+(v*B+w*C+x*E)*da+(y*B+z*C+A*E)*ga);ga=(i*F+m*G+t*H)*ca+(v*F+w*G+x*H)*da+(y*F+z*G+A*H)*ga+ +g[W+80+8>>2];c[W+64>>2]=1065353216;c[W+64+4>>2]=0;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea+-.10000000149011612;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+.10000000149011612;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa+-.10000000149011612;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+.10000000149011612;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga+-.10000000149011612;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+.10000000149011612;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);d=d+1|0}while((d|0)<(c[S+544>>2]|0))}M=c[b+72>>2]|0}L=c[b+364>>2]|0;c[W+80>>2]=0;c[W+80+4>>2]=0;c[W+80+8>>2]=0;c[W+80+12>>2]=0;c[W+64>>2]=1065353216;c[W+64+4>>2]=1065353216;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;c[W+48>>2]=1065353216;c[W+48+4>>2]=0;c[W+48+8>>2]=0;g[W+48+12>>2]=0.0;if(!(L&256)){if(L&1|0?(T=c[S+772>>2]|0,(T|0)>0):0){f=0;d=T;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[(c[M>>2]|0)+16>>2]|0;K=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;q=c[I>>2]|0;J=e+(f*104|0)+16|0;r=c[J>>2]|0;g[W+160>>2]=+g[K>>2]+-.10000000149011612;c[W+160+4>>2]=q;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+.10000000149011612;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]+-.10000000149011612;r=c[J>>2]|0;c[W+160>>2]=c[K>>2];g[W+160+4>>2]=ga;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;ga=+g[I>>2]+.10000000149011612;fa=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=ga;g[W+96+8>>2]=fa;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;r=c[I>>2]|0;fa=+g[J>>2]+-.10000000149011612;c[W+160>>2]=c[K>>2];c[W+160+4>>2]=r;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+.10000000149011612;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=0;c[W+32+8>>2]=1065353216;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&2|0?(U=c[S+792>>2]|0,(U|0)>0):0){f=0;d=U;do{e=c[S+800>>2]|0;if(c[(c[e+(f*52|0)+4>>2]|0)+16>>2]&1){Vb[c[(c[M>>2]|0)+16>>2]&127](M,(c[e+(f*52|0)+24>>2]|0)+8|0,(c[e+(f*52|0)+28>>2]|0)+8|0,W+80|0);d=c[S+792>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&16|0?(V=c[S+772>>2]|0,(V|0)>0):0){f=0;d=V;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){ea=+g[e+(f*104|0)+72>>2]*.5;ga=+g[e+(f*104|0)+76>>2]*.5;fa=+g[e+(f*104|0)+80>>2]*.5;K=c[(c[M>>2]|0)+16>>2]|0;d=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;ca=ga+ +g[I>>2];J=e+(f*104|0)+16|0;da=fa+ +g[J>>2];g[W+160>>2]=ea+ +g[d>>2];g[W+160+4>>2]=ca;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+64|0);K=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]-ga;fa=+g[J>>2]-fa;g[W+160>>2]=+g[d>>2]-ea;g[W+160+4>>2]=ga;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[W+64+4>>2]*.5;ga=+g[W+64+8>>2]*.5;g[W+96>>2]=+g[W+64>>2]*.5;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+96|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&32|0){if((a[22472]|0)==0?Uz(22472)|0:0){c[5774]=1065353216;c[5775]=0;c[5776]=0;c[5777]=0;c[5778]=0;c[5779]=1065353216;c[5780]=0;c[5781]=0;c[5782]=0;c[5783]=0;c[5784]=1065353216;g[5785]=0.0}if((c[S+872>>2]|0)>0){d=0;do{K=c[S+880>>2]|0;I=c[K+(d*104|0)+24>>2]|0;B=+g[I+8>>2];J=K+(d*104|0)+4|0;C=+g[J>>2];G=+g[I+12>>2];r=K+(d*104|0)+8|0;H=+g[r>>2];fa=+g[I+16>>2];I=K+(d*104|0)+12|0;da=+g[I>>2];ba=+g[K+(d*104|0)+20>>2]+(B*C+G*H+fa*da);g[W+160>>2]=B-C*ba;g[W+160+4>>2]=G-H*ba;g[W+160+8>>2]=fa-da*ba;g[W+160+12>>2]=0.0;X=+g[J>>2];Z=+g[r>>2];E=+g[I>>2];K=+g[K+(d*104|0)+4+((!(X>2]>2];Y=+g[23096+(K<<4)+4>>2];_=+g[23096+(K<<4)>>2];$=1.0/+D(+((X*Y-Z*_)*(X*Y-Z*_)+((Z*F-E*Y)*(Z*F-E*Y)+(E*_-X*F)*(E*_-X*F))));aa=E*(E*_-X*F)*$-Z*(X*Y-Z*_)*$;ca=X*(X*Y-Z*_)*$-E*(Z*F-E*Y)*$;ga=Z*(Z*F-E*Y)*$-X*(E*_-X*F)*$;ea=1.0/+D(+(ga*ga+(aa*aa+ca*ca)));K=c[(c[M>>2]|0)+16>>2]|0;g[W+96>>2]=B-C*ba-(Z*F-E*Y)*$*.5;g[W+96+4>>2]=G-H*ba-(E*_-X*F)*$*.5;g[W+96+8>>2]=fa-da*ba-(X*Y-Z*_)*$*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=(Z*F-E*Y)*$*.5+(B-C*ba);g[W+32+4>>2]=(E*_-X*F)*$*.5+(G-H*ba);g[W+32+8>>2]=(X*Y-Z*_)*$*.5+(fa-da*ba);g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;ba=+g[W+160>>2];da=+g[W+160+4>>2];fa=+g[W+160+8>>2];g[W+96>>2]=ba-ea*aa*.5;g[W+96+4>>2]=da-ea*ca*.5;g[W+96+8>>2]=fa-ea*ga*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=ea*aa*.5+ba;g[W+32+4>>2]=ea*ca*.5+da;g[W+32+8>>2]=ea*ga*.5+fa;g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;fa=+g[r>>2]*.5*3.0+ +g[W+160+4>>2];ga=+g[I>>2]*.5*3.0+ +g[W+160+8>>2];g[W+96>>2]=+g[J>>2]*.5*3.0+ +g[W+160>>2];g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[K&127](M,W+160|0,W+96|0,W+32|0);d=d+1|0}while((d|0)<(c[S+872>>2]|0))}}if(L&4|0?(c[W+160>>2]=0,c[W+160+4>>2]=1060320051,c[W+160+8>>2]=0,g[W+160+12>>2]=0.0,O=c[S+812>>2]|0,(O|0)>0):0){f=0;d=O;do{e=c[S+820>>2]|0;if(c[(c[e+(f*44|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*44|0)+8>>2]|0;_=+g[d+8>>2];ba=+g[d+12>>2];ea=+g[d+16>>2];d=c[e+(f*44|0)+12>>2]|0;$=+g[d+8>>2];ca=+g[d+12>>2];fa=+g[d+16>>2];d=c[e+(f*44|0)+16>>2]|0;aa=+g[d+8>>2];da=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=(_+$+aa)*.3333333432674408+(_-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+96+4>>2]=(ba+ca+da)*.3333333432674408+(ba-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+96+8>>2]=(ea+fa+ga)*.3333333432674408+(ea-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+96+12>>2]=0.0;g[W+32>>2]=(_+$+aa)*.3333333432674408+($-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+32+4>>2]=(ba+ca+da)*.3333333432674408+(ca-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+32+8>>2]=(ea+fa+ga)*.3333333432674408+(fa-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+32+12>>2]=0.0;g[W+16>>2]=(_+$+aa)*.3333333432674408+(aa-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+16+4>>2]=(ba+ca+da)*.3333333432674408+(da-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+16+8>>2]=(ea+fa+ga)*.3333333432674408+(ga-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+812>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&8|0?(c[W+160>>2]=1050253722,c[W+160+4>>2]=1050253722,c[W+160+8>>2]=1060320051,g[W+160+12>>2]=0.0,P=c[S+832>>2]|0,(P|0)>0):0){f=0;d=P;do{e=c[S+840>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*104|0)+8>>2]|0;y=+g[d+8>>2];B=+g[d+12>>2];F=+g[d+16>>2];d=c[e+(f*104|0)+12>>2]|0;z=+g[d+8>>2];C=+g[d+12>>2];G=+g[d+16>>2];d=c[e+(f*104|0)+16>>2]|0;A=+g[d+8>>2];E=+g[d+12>>2];H=+g[d+16>>2];d=c[e+(f*104|0)+20>>2]|0;ea=+g[d+8>>2];fa=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;ba=(y+z+A+ea)*.25+(y-(y+z+A+ea)*.25)*.800000011920929;ca=(B+C+E+fa)*.25+(B-(B+C+E+fa)*.25)*.800000011920929;da=(F+G+H+ga)*.25+(F-(F+G+H+ga)*.25)*.800000011920929;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;X=(y+z+A+ea)*.25+(z-(y+z+A+ea)*.25)*.800000011920929;Y=(B+C+E+fa)*.25+(C-(B+C+E+fa)*.25)*.800000011920929;Z=(F+G+H+ga)*.25+(G-(F+G+H+ga)*.25)*.800000011920929;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;_=(y+z+A+ea)*.25+(A-(y+z+A+ea)*.25)*.800000011920929;$=(B+C+E+fa)*.25+(E-(B+C+E+fa)*.25)*.800000011920929;aa=(F+G+H+ga)*.25+(H-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=_;g[W+16+4>>2]=$;g[W+16+8>>2]=aa;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;ea=(y+z+A+ea)*.25+(ea-(y+z+A+ea)*.25)*.800000011920929;fa=(B+C+E+fa)*.25+(fa-(B+C+E+fa)*.25)*.800000011920929;ga=(F+G+H+ga)*.25+(ga-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=X;g[W+96+4>>2]=Y;g[W+96+8>>2]=Z;g[W+96+12>>2]=0.0;g[W+32>>2]=_;g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=_;g[W+96+4>>2]=$;g[W+96+8>>2]=aa;g[W+96+12>>2]=0.0;g[W+32>>2]=ba;g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+832>>2]|0}f=f+1|0}while((f|0)<(d|0))}}else{LI();d=c[S+1112>>2]|0;if((d|0)>0){K=0;do{if(a[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+377>>0]|0){da=+(rs()|0)*4.656612873077393e-10;ea=+(rs()|0)*4.656612873077393e-10;fa=+(rs()|0)*4.656612873077393e-10;ga=1.0/+D(+(fa*fa+(da*da+ea*ea)));g[W+160>>2]=da*ga*.75;g[W+160+4>>2]=ea*ga*.75;g[W+160+8>>2]=fa*ga*.75;g[W+160+12>>2]=0.0;f=c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+24>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<4|3)+16|0)|0;if(!d)e=0;else{c[(d+4+15&-16)+-4>>2]=d;e=d+4+15&-16}d=0;do{J=e+(d<<4)|0;c[J>>2]=c[W+96>>2];c[J+4>>2]=c[W+96+4>>2];c[J+8>>2]=c[W+96+8>>2];c[J+12>>2]=c[W+96+12>>2];d=d+1|0}while((d|0)!=(f|0));d=0;do{I=(c[(c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+32>>2]|0)+(d<<2)>>2]|0)+8|0;J=e+(d<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2];d=d+1|0}while((d|0)!=(f|0));J=e;I=e}else{J=0;I=0}a[W+96+16>>0]=1;c[W+96+12>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=0;a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;uc(W+96|0,I,f);q=c[W+96+44>>2]|0;if((q|0)>0){o=c[Q>>2]|0;n=0;do{r=c[(c[R>>2]|0)+(n<<2)>>2]|0;e=c[o+(r*12|0)+4>>2]|0;d=o+(r*12|0)+(e*12|0)+((c[o+(r*12|0)+(e*12|0)>>2]|0)*12|0)|0;if((d|0)!=(o+(r*12|0)|0)){p=c[W+96+12>>2]|0;e=c[o+(r*12|0)+(e*12|0)+8>>2]|0;f=c[o+(r*12|0)+8>>2]|0;while(1){h=c[d+8>>2]|0;_b[c[(c[M>>2]|0)+36>>2]&0](M,p+(e<<4)|0,p+(f<<4)|0,p+(h<<4)|0,W+160|0,1.0);e=d+((c[d+4>>2]|0)*12|0)|0;d=e+((c[e>>2]|0)*12|0)|0;if((d|0)==(o+(r*12|0)|0))break;else{e=f;f=h}}}n=n+1|0}while((n|0)<(q|0))}d=c[R>>2]|0;if(d|0){if(a[W+96+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[R>>2]=0}a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;d=c[Q>>2]|0;if(d|0){if(a[W+96+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Q>>2]=0}a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;d=c[W+96+12>>2]|0;if(d|0){if(a[W+96+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[W+96+12>>2]=0}if(!((J|0)==0|(I|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[I+-4>>2]|0)}d=c[S+1112>>2]|0}K=K+1|0}while((K|0)<(d|0))}}if(L&64|0){if((c[S+852>>2]|0)>0){d=0;do{K=c[S+860>>2]|0;q=c[K+(d*96|0)+20>>2]|0;ca=+g[K+(d*96|0)+4>>2];da=+g[K+(d*96|0)+8>>2];ea=+g[K+(d*96|0)+12>>2];fa=ca*+g[q+20>>2]+da*+g[q+24>>2]+ea*+g[q+28>>2]+ +g[q+56>>2];ga=ca*+g[q+36>>2]+da*+g[q+40>>2]+ea*+g[q+44>>2]+ +g[q+60>>2];g[W+32>>2]=ca*+g[q+4>>2]+da*+g[q+8>>2]+ea*+g[q+12>>2]+ +g[q+52>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;K=K+(d*96|0)|0;q=c[K>>2]|0;c[W+16>>2]=1065353216;c[W+16+4>>2]=0;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[q+8>>2];I=c[q+12>>2]|0;r=c[q+16>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=I;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[q+8>>2]|0;ea=+g[q+12>>2];I=c[q+16>>2]|0;c[W+160>>2]=r;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ga=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[q+8>>2]|0;r=c[q+12>>2]|0;ga=+g[q+16>>2];c[W+160>>2]=I;c[W+160+4>>2]=r;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];r=c[W+32+4>>2]|0;I=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[W+32>>2]|0;ea=+g[W+32+4>>2];r=c[W+32+8>>2]|0;c[W+160>>2]=I;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[W+32>>2]|0;I=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=r;c[W+160+4>>2]=I;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;K=(c[K>>2]|0)+8|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[J&127](M,K,W+32|0,W+160|0);d=d+1|0}while((d|0)<(c[S+852>>2]|0))}d=c[S+772>>2]|0;if((d|0)>0){f=0;do{e=c[S+780>>2]|0;if((c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1|0)!=0?+g[e+(f*104|0)+88>>2]<=0.0:0){J=e+(f*104|0)+8|0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[J>>2];K=e+(f*104|0)+12|0;r=c[K>>2]|0;I=e+(f*104|0)+16|0;q=c[I>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=q;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=q,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;q=c[J>>2]|0;ea=+g[K>>2];r=c[I>>2]|0;c[W+160>>2]=q;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=q,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;J=c[J>>2]|0;K=c[K>>2]|0;ga=+g[I>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}}if(L&128|0?(c[S+752>>2]|0)>0:0){e=0;do{f=c[S+760>>2]|0;h=f+(e*60|0)+8|0;c[W+160>>2]=c[h>>2];c[W+160+4>>2]=c[h+4>>2];c[W+160+8>>2]=c[h+8>>2];c[W+160+12>>2]=c[h+12>>2];h=c[f+(e*60|0)+24>>2]|0;if((h|0)>0){d=0;i=+g[W+160>>2];k=+g[W+160+4>>2];m=+g[W+160+8>>2];do{K=c[f+(e*60|0)+28+(d<<2)>>2]|0;ga=+g[f+(e*60|0)+44+(d<<2)>>2];i=+g[K+8>>2]*ga+i;k=ga*+g[K+12>>2]+k;m=ga*+g[K+16>>2]+m;g[W+160+8>>2]=m;d=d+1|0}while((d|0)!=(h|0));g[W+160>>2]=i;g[W+160+4>>2]=k}Sb[c[(c[M>>2]|0)+48>>2]&127](M,W+160|0,c[f+(e*60|0)+4>>2]|0);e=e+1|0}while((e|0)<(c[S+752>>2]|0))}if(L&512|0){K=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&1024|0){K=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&2048|0){K=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}a:do if(L&4096|0?(c[S+912>>2]|0)>0:0){d=0;while(1){e=c[(c[S+920>>2]|0)+(d<<2)>>2]|0;switch(xb[c[(c[e>>2]|0)+20>>2]&127](e)|0){case 0:{L=ui(e+4|0)|0;ga=+g[e+28>>2];fa=+g[e+32>>2];ea=+g[e+36>>2];da=ga*+g[L+16>>2]+fa*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ca=ga*+g[L+32>>2]+fa*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+32>>2]=ga*+g[L>>2]+fa*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+32+4>>2]=da;g[W+32+8>>2]=ca;g[W+32+12>>2]=0.0;L=ui(e+16|0)|0;ca=+g[e+44>>2];da=+g[e+48>>2];ea=+g[e+52>>2];fa=ca*+g[L+16>>2]+da*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ga=ca*+g[L+32>>2]+da*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+16>>2]=ca*+g[L>>2]+da*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;K=(ui(e+4|0)|0)+48|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;Vb[L&127](M,K,W+32|0,W+160|0);K=c[(c[M>>2]|0)+16>>2]|0;L=(ui(e+16|0)|0)+48|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[K&127](M,L,W+16|0,W+160|0);c[W>>2]=1065353216;c[W+4>>2]=1065353216;c[W+8>>2]=0;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];K=c[W+32+4>>2]|0;J=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=K;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+32>>2]|0;ea=+g[W+32+4>>2];K=c[W+32+8>>2]|0;c[W+160>>2]=J;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ga=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+32>>2]|0;J=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=K;c[W+160+4>>2]=J;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);c[W>>2]=0;c[W+4>>2]=1065353216;c[W+8>>2]=1065353216;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+16>>2];J=c[W+16+4>>2]|0;K=c[W+16+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=J;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+16>>2]|0;ea=+g[W+16+4>>2];J=c[W+16+8>>2]|0;c[W+160>>2]=K;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ga=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+16>>2]|0;K=c[W+16+4>>2]|0;ga=+g[W+16+8>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);break}case 1:{L=(ui(e+4|0)|0)+48|0;c[W+160>>2]=c[L>>2];c[W+160+4>>2]=c[L+4>>2];c[W+160+8>>2]=c[L+8>>2];c[W+160+12>>2]=c[L+12>>2];L=(ui(e+16|0)|0)+48|0;c[W+96>>2]=c[L>>2];c[W+96+4>>2]=c[L+4>>2];c[W+96+8>>2]=c[L+8>>2];c[W+96+12>>2]=c[L+12>>2];L=ui(e+4|0)|0;aa=+g[e+28>>2];$=+g[e+32>>2];da=+g[e+36>>2];ba=+g[L>>2]*aa+ +g[L+4>>2]*$+ +g[L+8>>2]*da;ca=aa*+g[L+16>>2]+$*+g[L+20>>2]+da*+g[L+24>>2];da=aa*+g[L+32>>2]+$*+g[L+36>>2]+da*+g[L+40>>2];L=ui(e+16|0)|0;$=+g[e+44>>2];aa=+g[e+48>>2];ga=+g[e+52>>2];ea=+g[L>>2]*$+ +g[L+4>>2]*aa+ +g[L+8>>2]*ga;fa=$*+g[L+16>>2]+aa*+g[L+20>>2]+ga*+g[L+24>>2];ga=$*+g[L+32>>2]+aa*+g[L+36>>2]+ga*+g[L+40>>2];L=c[(c[M>>2]|0)+16>>2]|0;aa=ca*10.0+ +g[W+160+4>>2];$=da*10.0+ +g[W+160+8>>2];g[W+32>>2]=ba*10.0+ +g[W+160>>2];g[W+32+4>>2]=aa;g[W+32+8>>2]=$;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;$=fa*10.0+ +g[W+160+4>>2];aa=ga*10.0+ +g[W+160+8>>2];g[W+32>>2]=ea*10.0+ +g[W+160>>2];g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;ca=ca*10.0+ +g[W+96+4>>2];da=da*10.0+ +g[W+96+8>>2];g[W+32>>2]=ba*10.0+ +g[W+96>>2];g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;fa=fa*10.0+ +g[W+96+4>>2];ga=ga*10.0+ +g[W+96+8>>2];g[W+32>>2]=ea*10.0+ +g[W+96>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);break}default:{}}d=d+1|0;if((d|0)>=(c[S+912>>2]|0))break a}}while(0)}d=c[b+72>>2]|0;if(d|0?(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&2|0:0){if(a[b+368>>0]|0){L=c[b+72>>2]|0;M=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+369>>0]|0){L=c[b+72>>2]|0;M=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+370>>0]|0){M=c[b+72>>2]|0;S=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,S,0,W+160|0,W+96|0)}}N=N+1|0}while((N|0)<(c[b+348>>2]|0));l=W;return}function gc(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0.0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0.0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0.0,ua=0,va=0,wa=0.0,xa=0,ya=0,za=0.0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0.0,Ka=0.0,La=0.0,Ma=0.0,Na=0.0,Oa=0.0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0.0,hb=0.0,ib=0.0,jb=0.0,kb=0.0,lb=0.0;ua=l;l=l+208|0;ta=+g[b+512>>2];ha=c[b+192>>2]|0;ga=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);a[ua+48+16>>0]=1;ha=ua+48+12|0;c[ha>>2]=0;c[ua+48+4>>2]=0;c[ua+48+8>>2]=0;a[ua+48+36>>0]=1;ia=ua+48+32|0;c[ia>>2]=0;c[ua+48+24>>2]=0;c[ua+48+28>>2]=0;a[ua+48+56>>0]=1;c[ua+48+52>>2]=0;c[ua+48+44>>2]=0;c[ua+48+48>>2]=0;ja=ua+48+76|0;a[ja>>0]=1;ka=ua+48+72|0;c[ka>>2]=0;la=ua+48+64|0;c[la>>2]=0;ma=ua+48+68|0;c[ma>>2]=0;na=ua+48+96|0;a[na>>0]=1;oa=ua+48+92|0;c[oa>>2]=0;pa=ua+48+84|0;c[pa>>2]=0;qa=ua+48+88|0;c[qa>>2]=0;a[ua+48+116>>0]=1;ra=ua+48+112|0;c[ra>>2]=0;c[ua+48+104>>2]=0;c[ua+48+108>>2]=0;sa=c[b+872>>2]|0;if((sa|0)<=0){Ph(ua+48|0);l=ua;return}fa=0;f=0;do{ea=c[b+880>>2]|0;da=ea+(fa*104|0)|0;ca=c[da>>2]|0;if(!(c[ca+204>>2]&4)){switch(c[ca+252>>2]|0){case 2:{Q=+g[ca+392>>2];n=+g[ea+(fa*104|0)+84>>2];H=+g[ca+396>>2];N=+g[ea+(fa*104|0)+80>>2];e=+g[ea+(fa*104|0)+76>>2];O=+g[ca+388>>2];j=0;k=ca;h=ta*(Q*n-H*N+ +g[ca+372>>2]);n=ta*(+g[ca+376>>2]+(H*e-n*O));e=ta*(N*O-Q*e+ +g[ca+380>>2]);break}case 64:{ba=c[(c[ca+324>>2]|0)+468>>2]|0;m=c[ua+48+4>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+8>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+4>>2]|0}k=c[ha>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+16>>0]|0)ya=18}else if(!((k|0)==0|(a[ua+48+16>>0]|0)==0))ya=18;if((ya|0)==18){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+16>>0]=1;c[ha>>2]=f;c[ua+48+8>>2]=ba+6}else f=c[ha>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+4>>2]=ba+6;m=c[ua+48+24>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+28>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+24>>2]|0}k=c[ia>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+36>>0]|0)ya=32}else if(!((k|0)==0|(a[ua+48+36>>0]|0)==0))ya=32;if((ya|0)==32){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+36>>0]=1;c[ia>>2]=f;c[ua+48+28>>2]=ba+6}else f=c[ia>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+24>>2]=ba+6;$=c[ha>>2]|0;I=c[ca+324>>2]|0;J=c[ca+328>>2]|0;u=c[ea+(fa*104|0)+24>>2]|0;aa=ea+(fa*104|0)+4|0;K=c[I+132>>2]|0;v=c[I+468>>2]|0;f=c[pa>>2]|0;if((f|0)<((K*3|0)+3|0)){if((c[qa>>2]|0)<((K*3|0)+3|0)){if(!((K*3|0)+3|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K*3|0)+3<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[pa>>2]|0}if((k|0)>0){j=0;do{_=i+(j<<4)|0;Z=(c[oa>>2]|0)+(j<<4)|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[oa>>2]|0;if(j|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=i;c[qa>>2]=(K*3|0)+3}do{_=(c[oa>>2]|0)+(f<<4)|0;c[_>>2]=c[ua>>2];c[_+4>>2]=c[ua+4>>2];c[_+8>>2]=c[ua+8>>2];c[_+12>>2]=c[ua+12>>2];f=f+1|0}while((f|0)!=((K*3|0)+3|0))}c[pa>>2]=(K*3|0)+3;f=c[ua+48+104>>2]|0;if((f|0)<=(K+1|0)&(f|0)<=(K|0)){if((c[ua+48+108>>2]|0)<=(K|0)){if(!(K+1|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K+1|0)*48|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[ua+48+104>>2]|0}if((k|0)>0){j=0;do{Y=i+(j*48|0)|0;Z=c[ra>>2]|0;_=Z+(j*48|0)|0;c[Y>>2]=c[_>>2];c[Y+4>>2]=c[_+4>>2];c[Y+8>>2]=c[_+8>>2];c[Y+12>>2]=c[_+12>>2];Y=Z+(j*48|0)+16|0;_=i+(j*48|0)+16|0;c[_>>2]=c[Y>>2];c[_+4>>2]=c[Y+4>>2];c[_+8>>2]=c[Y+8>>2];c[_+12>>2]=c[Y+12>>2];Z=Z+(j*48|0)+32|0;_=i+(j*48|0)+32|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[ra>>2]|0;if(j|0){if(a[ua+48+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[ra>>2]=0}a[ua+48+116>>0]=1;c[ra>>2]=i;c[ua+48+108>>2]=K+1}do{_=c[ra>>2]|0;Z=_+(f*48|0)|0;c[Z>>2]=c[ua>>2];c[Z+4>>2]=c[ua+4>>2];c[Z+8>>2]=c[ua+8>>2];c[Z+12>>2]=c[ua+12>>2];Z=_+(f*48|0)+16|0;c[Z>>2]=c[ua+16>>2];c[Z+4>>2]=c[ua+16+4>>2];c[Z+8>>2]=c[ua+16+8>>2];c[Z+12>>2]=c[ua+16+12>>2];_=_+(f*48|0)+32|0;c[_>>2]=c[ua+32>>2];c[_+4>>2]=c[ua+32+4>>2];c[_+8>>2]=c[ua+32+8>>2];c[_+12>>2]=c[ua+32+12>>2];f=f+1|0}while((f|0)!=(K+1|0))}c[ua+48+104>>2]=K+1;z=c[oa>>2]|0;A=z+(K+1<<4)+(K+1<<4)|0;m=c[la>>2]|0;if((v|0)>(m|0)){if((c[ma>>2]|0)<(v|0)){if(!v){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((v<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[la>>2]|0}k=c[ka>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ja>>0]|0)ya=74}else if(!((k|0)==0|(a[ja>>0]|0)==0))ya=74;if((ya|0)==74){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=f;c[ma>>2]=v}else f=c[ka>>2]|0;Yk(f+(m<<2)|0,0,v-m<<2|0)|0}c[la>>2]=v;y=(v|0)>0?c[ka>>2]|0:0;x=c[ra>>2]|0;O=+g[u+8>>2]-+g[I+12>>2];Q=+g[u+12>>2]-+g[I+16>>2];N=+g[u+16>>2]-+g[I+20>>2];E=+g[I+28>>2];G=+g[I+32>>2];t=+g[I+36>>2];C=+g[I+40>>2];H=E*(2.0/(E*E+G*G+t*t+C*C));F=G*(2.0/(E*E+G*G+t*t+C*C));B=t*(2.0/(E*E+G*G+t*t+C*C));g[x>>2]=1.0-(G*F+t*B);g[x+4>>2]=E*F-C*B;g[x+8>>2]=E*B+C*F;g[x+12>>2]=0.0;g[x+16>>2]=E*F+C*B;g[x+20>>2]=1.0-(E*H+t*B);g[x+24>>2]=G*B-C*H;g[x+28>>2]=0.0;g[x+32>>2]=E*B-C*F;g[x+36>>2]=G*B+C*H;g[x+40>>2]=1.0-(E*H+G*F);g[x+44>>2]=0.0;_=ea+(fa*104|0)+12|0;F=+g[_>>2];Z=ea+(fa*104|0)+8|0;G=+g[Z>>2];H=+g[aa>>2];g[$>>2]=Q*F-N*G+0.0;g[$+4>>2]=N*H-O*F+0.0;g[$+8>>2]=O*G-Q*H+0.0;c[$+12>>2]=c[aa>>2];c[$+16>>2]=c[Z>>2];c[$+20>>2]=c[_>>2];H=O*+g[x+16>>2]+Q*+g[x+20>>2]+N*+g[x+24>>2];G=O*+g[x+32>>2]+Q*+g[x+36>>2]+N*+g[x+40>>2];g[z>>2]=O*+g[x>>2]+Q*+g[x+4>>2]+N*+g[x+8>>2];g[z+4>>2]=H;g[z+8>>2]=G;g[z+12>>2]=0.0;G=+g[aa>>2];H=+g[Z>>2];N=+g[_>>2];Q=G*+g[x+16>>2]+H*+g[x+20>>2]+N*+g[x+24>>2];O=G*+g[x+32>>2]+H*+g[x+36>>2]+N*+g[x+40>>2];g[z+(K+1<<4)>>2]=+g[x>>2]*G+ +g[x+4>>2]*H+ +g[x+8>>2]*N;g[z+(K+1<<4)+4>>2]=Q;g[z+(K+1<<4)+8>>2]=O;g[z+(K+1<<4)+12>>2]=0.0;O=+g[x+16>>2]*0.0+ +g[x+20>>2]*0.0+ +g[x+24>>2]*0.0;Q=+g[x+32>>2]*0.0+ +g[x+36>>2]*0.0+ +g[x+40>>2]*0.0;g[A>>2]=+g[x>>2]*0.0+ +g[x+4>>2]*0.0+ +g[x+8>>2]*0.0;g[A+4>>2]=O;g[A+8>>2]=Q;g[A+12>>2]=0.0;if((v|0)>0)Yk($+24|0,0,(((v+5|0)>6?v+5|0:6)<<2)+-20|0)|0;if((J|0)>-1&(K|0)>0){w=0;f=c[I+140>>2]|0;while(1){q=+g[f+(w*608|0)+336>>2];o=+g[f+(w*608|0)+340>>2];F=+g[f+(w*608|0)+344>>2];N=+g[f+(w*608|0)+348>>2];p=q*(2.0/(q*q+o*o+F*F+N*N));Q=o*(2.0/(q*q+o*o+F*F+N*N));r=F*(2.0/(q*q+o*o+F*F+N*N));B=1.0-(o*Q+F*r);C=q*Q-N*r;e=q*r+N*Q;E=q*Q+N*r;F=1.0-(q*p+F*r);h=o*r-N*p;G=q*r-N*Q;N=o*r+N*p;Q=1.0-(q*p+o*Q);i=(c[f+(w*608|0)+20>>2]|0)+1|0;o=+g[x+(i*48|0)>>2];p=+g[x+(i*48|0)+16>>2];q=+g[x+(i*48|0)+32>>2];r=+g[x+(i*48|0)+4>>2];s=+g[x+(i*48|0)+20>>2];t=+g[x+(i*48|0)+36>>2];n=+g[x+(i*48|0)+8>>2];O=+g[x+(i*48|0)+24>>2];H=+g[x+(i*48|0)+40>>2];f=w;w=w+1|0;g[x+(w*48|0)>>2]=q*e+(p*C+o*B);g[x+(w*48|0)+4>>2]=e*t+(s*C+r*B);g[x+(w*48|0)+8>>2]=B*n+C*O+e*H;g[x+(w*48|0)+12>>2]=0.0;g[x+(w*48|0)+16>>2]=q*h+(o*E+p*F);g[x+(w*48|0)+20>>2]=t*h+(r*E+s*F);g[x+(w*48|0)+24>>2]=E*n+F*O+h*H;g[x+(w*48|0)+28>>2]=0.0;g[x+(w*48|0)+32>>2]=o*G+p*N+q*Q;g[x+(w*48|0)+36>>2]=r*G+s*N+t*Q;g[x+(w*48|0)+40>>2]=G*n+N*O+Q*H;g[x+(w*48|0)+44>>2]=0.0;u=z+(K+1<<4)+(i<<4)|0;H=+g[u>>2];O=+g[u+4>>2];n=+g[u+8>>2];u=z+(K+1<<4)+(w<<4)|0;g[u>>2]=B*H+C*O+e*n;g[u+4>>2]=E*H+F*O+h*n;g[u+8>>2]=G*H+N*O+Q*n;g[u+12>>2]=0.0;n=+g[A+(i<<4)>>2];O=+g[A+(i<<4)+4>>2];H=+g[A+(i<<4)+8>>2];v=A+(w<<4)|0;g[v>>2]=B*n+C*O+e*H;g[v+4>>2]=E*n+F*O+h*H;g[v+8>>2]=G*n+N*O+Q*H;g[v+12>>2]=0.0;H=+g[z+(i<<4)>>2];O=+g[z+(i<<4)+4>>2];n=+g[z+(i<<4)+8>>2];i=c[I+140>>2]|0;e=B*H+C*O+e*n-+g[i+(f*608|0)+352>>2];h=E*H+F*O+h*n-+g[i+(f*608|0)+356>>2];n=G*H+N*O+Q*n-+g[i+(f*608|0)+360>>2];i=z+(w<<4)|0;g[i>>2]=e;j=z+(w<<4)+4|0;g[j>>2]=h;k=z+(w<<4)+8|0;g[k>>2]=n;g[z+(w<<4)+12>>2]=0.0;m=c[I+140>>2]|0;switch(c[m+(f*608|0)+500>>2]|0){case 0:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Q=(Q*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*O+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*O-Q*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];Y=y+(c[m+(f*608|0)+328>>2]<<2)|0;g[Y>>2]=Q;g[Y>>2]=Q+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);break}case 1:{g[y+(c[m+(f*608|0)+328>>2]<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+152>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+156>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+160>>2];break}case 2:{G=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];Q=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(G*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*Q+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*Q-G*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];G=+g[m+(f*608|0)+172>>2];Q=+g[k>>2];N=+g[m+(f*608|0)+176>>2];H=+g[j>>2];O=+g[i>>2];F=+g[m+(f*608|0)+168>>2];g[y+(Y+1<<2)>>2]=(G*Q-N*H+ +g[m+(f*608|0)+184>>2])*+g[u>>2]+(N*O-Q*F+ +g[m+(f*608|0)+188>>2])*+g[u+4>>2]+(H*F-G*O+ +g[m+(f*608|0)+192>>2])*+g[u+8>>2];O=+g[m+(f*608|0)+204>>2];G=+g[k>>2];F=+g[m+(f*608|0)+208>>2];H=+g[j>>2];Q=+g[i>>2];N=+g[m+(f*608|0)+200>>2];g[y+(Y+2<<2)>>2]=(O*G-F*H+ +g[m+(f*608|0)+216>>2])*+g[u>>2]+(F*Q-G*N+ +g[m+(f*608|0)+220>>2])*+g[u+4>>2]+(H*N-O*Q+ +g[m+(f*608|0)+224>>2])*+g[u+8>>2];m=c[I+140>>2]|0;Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=+g[y+(Y<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);g[y+(Y+1<<2)>>2]=+g[y+(Y+1<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+168>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+172>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+176>>2]);g[y+(Y+2<<2)>>2]=+g[y+(Y+2<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+200>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+204>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+208>>2]);break}case 3:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(Q*n-N*h)*+g[u>>2]+ +g[u+4>>2]*(N*e-n*O)+(h*O-Q*e)*+g[u+8>>2];g[y+(Y+1<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+184>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+188>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+192>>2];g[y+(Y+2<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+216>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+220>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+224>>2];break}default:{}}if((w|0)==(K|0))break;else f=m}if((J|0)!=-1){f=J;do{k=c[m+(f*608|0)+492>>2]|0;if((k|0)>0){j=c[m+(f*608|0)+328>>2]|0;i=0;do{c[$+(i+6+j<<2)>>2]=c[y+(j+i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}f=c[m+(f*608|0)+20>>2]|0}while((f|0)!=-1)}}f=c[ia>>2]|0;X=c[ca+324>>2]|0;I=c[ha>>2]|0;Y=c[X+132>>2]|0;u=c[X+468>>2]|0;v=c[la>>2]|0;if((u|0)>(v|0)){if((c[ma>>2]|0)<(u|0)){if(!u){i=0;k=v}else{c[6995]=(c[6995]|0)+1;i=sc((u<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[la>>2]|0}m=c[ka>>2]|0;if((k|0)>0){j=0;do{c[i+(j<<2)>>2]=c[m+(j<<2)>>2];j=j+1|0}while((j|0)!=(k|0));if(a[ja>>0]|0)ya=103}else if(!((m|0)==0|(a[ja>>0]|0)==0))ya=103;if((ya|0)==103){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=i;c[ma>>2]=u}else i=c[ka>>2]|0;Yk(i+(v<<2)|0,0,u-v<<2|0)|0}c[la>>2]=u;i=c[pa>>2]|0;if((i|0)<((Y<<2)+4|0)){if((c[qa>>2]|0)<((Y<<2)+4|0)){if(!((Y<<2)+4|0)){j=0;m=i}else{c[6995]=(c[6995]|0)+1;j=sc((Y<<2)+4<<4|19)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=c[pa>>2]|0}if((m|0)>0){k=0;do{W=j+(k<<4)|0;V=(c[oa>>2]|0)+(k<<4)|0;c[W>>2]=c[V>>2];c[W+4>>2]=c[V+4>>2];c[W+8>>2]=c[V+8>>2];c[W+12>>2]=c[V+12>>2];k=k+1|0}while((k|0)!=(m|0))}k=c[oa>>2]|0;if(k|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=j;c[qa>>2]=(Y<<2)+4}do{W=(c[oa>>2]|0)+(i<<4)|0;c[W>>2]=c[ua>>2];c[W+4>>2]=c[ua+4>>2];c[W+8>>2]=c[ua+8>>2];c[W+12>>2]=c[ua+12>>2];i=i+1|0}while((i|0)!=((Y<<2)+4|0))}c[pa>>2]=(Y<<2)+4;i=c[X+468>>2]|0;T=(i|0)==0?0:c[ka>>2]|0;U=c[oa>>2]|0;V=U+((Y<<1)+2<<4)|0;W=c[X+220>>2]|0;if((i|0)>0){R=(c[X+180>>2]|0)+(i+6<<2)|0;S=c[X+200>>2]|0}else{R=0;S=0}if(!(a[X+421>>0]|0)){r=+g[W>>2];s=+g[W+4>>2];t=+g[W+8>>2];B=+g[W+16>>2];C=+g[W+20>>2];E=+g[W+24>>2];F=+g[W+32>>2];H=+g[W+36>>2];O=+g[W+40>>2];G=-+g[I>>2];N=-+g[I+4>>2];Q=-+g[I+8>>2];o=-+g[I+12>>2];p=-+g[I+16>>2];q=-+g[I+20>>2];g[U>>2]=r*o+s*p+t*q;g[U+4>>2]=B*o+C*p+E*q;g[U+8>>2]=F*o+H*p+O*q;g[U+12>>2]=0.0;g[U+16>>2]=r*G+s*N+t*Q;g[U+20>>2]=B*G+C*N+E*Q;g[U+24>>2]=F*G+H*N+O*Q;g[U+28>>2]=0.0}else{c[U>>2]=0;c[U+4>>2]=0;c[U+8>>2]=0;c[U+12>>2]=0;c[U+16>>2]=0;c[U+20>>2]=0;c[U+24>>2]=0;c[U+28>>2]=0}if((Y|0)>0){Yk(U+32|0,0,Y<<5|0)|0;z=c[X+140>>2]|0;x=Y;do{y=x;x=x+-1|0;A=c[z+(x*608|0)+20>>2]|0;r=+g[W+(y*48|0)>>2];s=+g[W+(y*48|0)+4>>2];t=+g[W+(y*48|0)+8>>2];B=+g[W+(y*48|0)+16>>2];C=+g[W+(y*48|0)+20>>2];E=+g[W+(y*48|0)+24>>2];F=+g[W+(y*48|0)+32>>2];G=+g[W+(y*48|0)+36>>2];H=+g[W+(y*48|0)+40>>2];N=+g[z+(x*608|0)+352>>2];O=+g[z+(x*608|0)+356>>2];Q=+g[z+(x*608|0)+360>>2];v=c[z+(x*608|0)+492>>2]|0;w=c[z+(x*608|0)+328>>2]|0;if((v|0)>0){i=0;do{g[T+(w+i<<2)>>2]=+g[I+(i+6+w<<2)>>2]-(+g[z+(x*608|0)+136+(i<<5)+16>>2]*+g[U+(y<<5)>>2]+ +g[z+(x*608|0)+136+(i<<5)+20>>2]*+g[U+(y<<5)+4>>2]+ +g[z+(x*608|0)+136+(i<<5)+24>>2]*+g[U+(y<<5)+8>>2]+(+g[z+(x*608|0)+136+(i<<5)>>2]*+g[U+(y<<5)+16>>2]+ +g[z+(x*608|0)+136+(i<<5)+4>>2]*+g[U+(y<<5)+20>>2]+ +g[z+(x*608|0)+136+(i<<5)+8>>2]*+g[U+(y<<5)+24>>2]));i=i+1|0}while((i|0)!=(v|0));k=R+((P(w,w)|0)<<2)|0;j=0;do{m=ua+(j<<2)|0;g[m>>2]=0.0;u=P(v,j)|0;i=0;e=0.0;do{e=e+ +g[k+(u+i<<2)>>2]*+g[T+(w+i<<2)>>2];i=i+1|0}while((i|0)!=(v|0));g[m>>2]=e;j=j+1|0}while((j|0)!=(v|0));i=0;q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2];do{M=w+i|0;za=+g[ua+(i<<2)>>2];q=za*+g[S+(M<<5)>>2]+q;p=za*+g[S+(M<<5)+4>>2]+p;o=za*+g[S+(M<<5)+8>>2]+o;n=+g[S+(M<<5)+16>>2]*za+n;h=za*+g[S+(M<<5)+20>>2]+h;e=za*+g[S+(M<<5)+24>>2]+e;i=i+1|0}while((i|0)!=(v|0))}else{q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2]}n=O*o-Q*p+n;Q=h+(Q*q-N*o);za=N*p-O*q+e;g[U+(A+1<<5)>>2]=r*q+B*p+F*o+ +g[U+(A+1<<5)>>2];g[U+(A+1<<5)+4>>2]=s*q+C*p+G*o+ +g[U+(A+1<<5)+4>>2];g[U+(A+1<<5)+8>>2]=t*q+E*p+H*o+ +g[U+(A+1<<5)+8>>2];g[U+(A+1<<5)+16>>2]=r*n+B*Q+F*za+ +g[U+(A+1<<5)+16>>2];g[U+(A+1<<5)+20>>2]=s*n+C*Q+G*za+ +g[U+(A+1<<5)+20>>2];g[U+(A+1<<5)+24>>2]=t*n+E*Q+H*za+ +g[U+(A+1<<5)+24>>2]}while((y|0)>1)}if(!(a[X+421>>0]|0)){do if(!(c[X+132>>2]|0)){p=1.0/+g[X+44>>2];e=+g[U+16>>2]/+g[X+48>>2];h=+g[U+24>>2]/+g[X+56>>2];n=+g[U>>2]*p;o=p*+g[U+4>>2];p=p*+g[U+8>>2];q=+g[U+20>>2]/+g[X+52>>2]}else{if(!(a[X+420>>0]|0)){e=0.0;h=0.0;n=0.0;o=0.0;p=0.0;q=0.0;break}Va=+g[X+296>>2];cb=+g[X+316>>2];db=+g[X+300>>2];Ja=+g[X+312>>2];La=+g[X+308>>2];Ua=+g[X+292>>2];Ia=+g[X+276>>2];Ka=+g[X+280>>2];o=+g[X+284>>2];p=1.0/((Va*cb-db*Ja)*Ia+Ka*(db*La-cb*Ua)+(Ja*Ua-Va*La)*o);N=-((Va*cb-db*Ja)*p);Q=-((db*La-cb*Ua)*p);G=-((Ja*Ua-Va*La)*p);Pa=+g[X+372>>2];q=+g[X+376>>2];Na=+g[X+380>>2];Ga=Na*-((La*Ka-Ja*Ia)*p)+(Pa*-((Ja*o-cb*Ka)*p)+q*-((cb*Ia-La*o)*p));r=Na*-((Va*Ia-Ua*Ka)*p)+(Pa*-((db*Ka-Va*o)*p)+q*-((Ua*o-db*Ia)*p));hb=+g[X+388>>2];gb=+g[X+392>>2];ib=+g[X+396>>2];s=hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p)+ib*-((La*Ka-Ja*Ia)*p);Fa=hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p)+ib*-((Va*Ia-Ua*Ka)*p);bb=+g[X+404>>2];C=+g[X+408>>2];ab=+g[X+412>>2];t=bb*-((Ja*o-cb*Ka)*p)+C*-((cb*Ia-La*o)*p)+ab*-((La*Ka-Ja*Ia)*p);Aa=bb*-((db*Ka-Va*o)*p)+C*-((Ua*o-db*Ia)*p)+ab*-((Va*Ia-Ua*Ka)*p);Sa=+g[X+228>>2];Oa=+g[X+244>>2];Xa=+g[X+260>>2];Ra=+g[X+232>>2];Ma=+g[X+248>>2];Wa=+g[X+264>>2];Ta=+g[X+236>>2];Qa=+g[X+252>>2];Ya=+g[X+268>>2];Ba=(Na*G+(Pa*N+q*Q))*Sa+Ga*Oa+r*Xa+ +g[X+324>>2];jb=(Na*G+(Pa*N+q*Q))*Ra+Ga*Ma+r*Wa+ +g[X+328>>2];r=(Na*G+(Pa*N+q*Q))*Ta+Ga*Qa+r*Ya+ +g[X+332>>2];Ga=(hb*N+gb*Q+ib*G)*Sa+s*Oa+Fa*Xa+ +g[X+340>>2];lb=(hb*N+gb*Q+ib*G)*Ra+s*Ma+Fa*Wa+ +g[X+344>>2];Fa=(hb*N+gb*Q+ib*G)*Ta+s*Qa+Fa*Ya+ +g[X+348>>2];s=Sa*(bb*N+C*Q+ab*G)+Oa*t+Aa*Xa+ +g[X+356>>2];h=(bb*N+C*Q+ab*G)*Ra+t*Ma+Aa*Wa+ +g[X+360>>2];Aa=(bb*N+C*Q+ab*G)*Ta+t*Qa+Aa*Ya+ +g[X+364>>2];t=1.0/(r*(Ga*h-lb*s)+(Ba*(lb*Aa-Fa*h)+jb*(Fa*s-Ga*Aa)));e=(lb*Aa-Fa*h)*t;Da=(Fa*s-Ga*Aa)*t;kb=(Ga*h-lb*s)*t;eb=bb*(jb*Fa-r*lb)*t+(Pa*e+hb*(r*h-jb*Aa)*t);n=C*(jb*Fa-r*lb)*t+(q*e+gb*(r*h-jb*Aa)*t);fb=ab*(jb*Fa-r*lb)*t+(Na*e+ib*(r*h-jb*Aa)*t);H=bb*(r*Ga-Ba*Fa)*t+(Pa*Da+hb*(Ba*Aa-r*s)*t);O=C*(r*Ga-Ba*Fa)*t+(q*Da+gb*(Ba*Aa-r*s)*t);F=ab*(r*Ga-Ba*Fa)*t+(Na*Da+ib*(Ba*Aa-r*s)*t);hb=bb*(Ba*lb-jb*Ga)*t+(Pa*kb+hb*(jb*s-Ba*h)*t);gb=C*(Ba*lb-jb*Ga)*t+(q*kb+gb*(jb*s-Ba*h)*t);ib=ab*(Ba*lb-jb*Ga)*t+(Na*kb+ib*(jb*s-Ba*h)*t);Na=fb*-((La*Ka-Ja*Ia)*p)+(eb*-((Ja*o-cb*Ka)*p)+n*-((cb*Ia-La*o)*p));ab=fb*-((Va*Ia-Ua*Ka)*p)+(eb*-((db*Ka-Va*o)*p)+n*-((Ua*o-db*Ia)*p));q=F*-((La*Ka-Ja*Ia)*p)+(H*-((Ja*o-cb*Ka)*p)+O*-((cb*Ia-La*o)*p));C=F*-((Va*Ia-Ua*Ka)*p)+(H*-((db*Ka-Va*o)*p)+O*-((Ua*o-db*Ia)*p));Pa=ib*-((La*Ka-Ja*Ia)*p)+(hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p));bb=ib*-((Va*Ia-Ua*Ka)*p)+(hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p));_a=Qa*(ib*G+(hb*N+gb*Q))+(Oa*(fb*G+(eb*N+n*Q))+Ma*(F*G+(H*N+O*Q)));$a=Ya*(ib*G+(hb*N+gb*Q))+(Xa*(fb*G+(eb*N+n*Q))+Wa*(F*G+(H*N+O*Q)));Za=Ta*(ib*G+(hb*N+gb*Q))+(Sa*(fb*G+(eb*N+n*Q))+Ra*(F*G+(H*N+O*Q)))+-1.0;E=+g[U>>2];za=+g[U+4>>2];B=+g[U+8>>2];Ea=+g[U+16>>2];Ca=+g[U+20>>2];Ha=+g[U+24>>2];e=Ha*(jb*Fa-r*lb)*t+(Ea*e+Ca*(r*h-jb*Aa)*t)+(B*ab+(E*(fb*G+(eb*N+n*Q))+za*Na));h=Ha*(Ba*lb-jb*Ga)*t+(Ea*kb+Ca*(jb*s-Ba*h)*t)+(B*bb+(E*(ib*G+(hb*N+gb*Q))+za*Pa));n=Ha*(ib*G+(hb*N+gb*Q))+(Ea*(fb*G+(eb*N+n*Q))+Ca*(F*G+(H*N+O*Q)))+(B*((Ta*bb+(Sa*ab+Ra*C))*N+(Qa*bb+(Oa*ab+Ma*C))*-((Ja*o-cb*Ka)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((db*Ka-Va*o)*p))+(E*($a*-((db*Ka-Va*o)*p)+(_a*-((Ja*o-cb*Ka)*p)+Za*N))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((db*Ka-Va*o)*p)+((Ta*Pa+(Sa*Na+Ra*q))*N+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((Ja*o-cb*Ka)*p)))));o=Ha*Pa+(Ea*Na+Ca*q)+(B*((Ta*bb+(Sa*ab+Ra*C))*Q+(Qa*bb+(Oa*ab+Ma*C))*-((cb*Ia-La*o)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Ua*o-db*Ia)*p))+(E*($a*-((Ua*o-db*Ia)*p)+(_a*-((cb*Ia-La*o)*p)+Za*Q))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Ua*o-db*Ia)*p)+((Ta*Pa+(Sa*Na+Ra*q))*Q+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((cb*Ia-La*o)*p)))));p=Ha*bb+(Ea*ab+Ca*C)+(B*((Ta*bb+(Sa*ab+Ra*C))*G+(Qa*bb+(Oa*ab+Ma*C))*-((La*Ka-Ja*Ia)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Va*Ia-Ua*Ka)*p))+(E*($a*-((Va*Ia-Ua*Ka)*p)+(_a*-((La*Ka-Ja*Ia)*p)+Za*G))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Va*Ia-Ua*Ka)*p)+((Ta*Pa+(Sa*Na+Ra*q))*G+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((La*Ka-Ja*Ia)*p)))));q=Ha*(r*Ga-Ba*Fa)*t+(Ea*Da+Ca*(Ba*Aa-r*s)*t)+(B*C+(E*(F*G+(H*N+O*Q))+za*q))}while(0);e=-e;g[V>>2]=e;g[U+((Y<<1)+2<<4)+4>>2]=-q;g[U+((Y<<1)+2<<4)+8>>2]=-h;g[U+((Y<<1)+2<<4)+12>>2]=0.0;g[V+16>>2]=-n;g[V+20>>2]=-o;g[V+24>>2]=-p;g[V+28>>2]=0.0}else{c[V>>2]=0;c[V+4>>2]=0;c[V+8>>2]=0;c[V+12>>2]=0;c[V+16>>2]=0;c[V+20>>2]=0;c[V+24>>2]=0;c[V+28>>2]=0;e=0.0}if((Y|0)>0){v=0;K=c[X+140>>2]|0;do{w=v;v=v+1|0;e=+g[W+(v*48|0)>>2];h=+g[W+(v*48|0)+4>>2];n=+g[W+(v*48|0)+8>>2];o=+g[W+(v*48|0)+16>>2];p=+g[W+(v*48|0)+20>>2];q=+g[W+(v*48|0)+24>>2];r=+g[W+(v*48|0)+32>>2];s=+g[W+(v*48|0)+36>>2];t=+g[W+(v*48|0)+40>>2];lb=+g[K+(w*608|0)+352>>2];H=+g[K+(w*608|0)+356>>2];G=+g[K+(w*608|0)+360>>2];x=(c[K+(w*608|0)+20>>2]|0)+1|0;B=+g[V+(x<<5)>>2];C=+g[V+(x<<5)+4>>2];E=+g[V+(x<<5)+8>>2];y=V+(v<<5)|0;g[y>>2]=e*B+h*C+n*E;A=V+(v<<5)+4|0;g[A>>2]=o*B+p*C+q*E;J=V+(v<<5)+8|0;g[J>>2]=r*B+s*C+t*E;g[V+(v<<5)+12>>2]=0.0;ib=+g[V+(x<<5)+16>>2];jb=+g[V+(x<<5)+20>>2];kb=+g[V+(x<<5)+24>>2];F=e*ib+h*jb+n*kb-(H*(r*B+s*C+t*E)-G*(o*B+p*C+q*E));G=o*ib+p*jb+q*kb-(G*(e*B+h*C+n*E)-lb*(r*B+s*C+t*E));H=r*ib+s*jb+t*kb-(lb*(o*B+p*C+q*E)-H*(e*B+h*C+n*E));x=V+(v<<5)+16|0;g[x>>2]=F;z=V+(v<<5)+20|0;g[z>>2]=G;I=V+(v<<5)+24|0;g[I>>2]=H;g[V+(v<<5)+28>>2]=0.0;K=c[X+140>>2]|0;L=c[K+(w*608|0)+492>>2]|0;M=c[K+(w*608|0)+328>>2]|0;if((L|0)>0){i=0;do{u=M+i|0;g[ua+176+(i<<2)>>2]=+g[T+(u<<2)>>2]-(F*+g[S+(u<<5)>>2]+G*+g[S+(u<<5)+4>>2]+H*+g[S+(u<<5)+8>>2]+((e*B+h*C+n*E)*+g[S+(u<<5)+16>>2]+(o*B+p*C+q*E)*+g[S+(u<<5)+20>>2]+(r*B+s*C+t*E)*+g[S+(u<<5)+24>>2]));i=i+1|0}while((i|0)!=(L|0));k=R+((P(M,M)|0)<<2)|0;i=0;do{m=P(i,L)|0;u=f+24+(M<<2)+(i<<2)|0;g[u>>2]=0.0;j=0;e=0.0;do{e=e+ +g[k+(j+m<<2)>>2]*+g[ua+176+(j<<2)>>2];g[u>>2]=e;j=j+1|0}while((j|0)!=(L|0));i=i+1|0}while((i|0)!=(L|0));i=0;e=+g[y>>2];h=+g[A>>2];n=+g[J>>2];o=+g[x>>2];p=+g[z>>2];q=+g[I>>2];do{gb=+g[f+24+(M+i<<2)>>2];hb=gb*+g[K+(w*608|0)+136+(i<<5)+4>>2];ib=gb*+g[K+(w*608|0)+136+(i<<5)+8>>2];jb=gb*+g[K+(w*608|0)+136+(i<<5)+16>>2];kb=gb*+g[K+(w*608|0)+136+(i<<5)+20>>2];lb=gb*+g[K+(w*608|0)+136+(i<<5)+24>>2];e=+g[K+(w*608|0)+136+(i<<5)>>2]*gb+e;g[y>>2]=e;h=hb+h;g[A>>2]=h;n=ib+n;g[J>>2]=n;o=jb+o;g[x>>2]=o;p=kb+p;g[z>>2]=p;q=lb+q;g[I>>2]=q;i=i+1|0}while((i|0)!=(L|0))}}while((v|0)!=(Y|0));e=+g[V>>2]}kb=+g[U+((Y<<1)+2<<4)+4>>2];jb=+g[U+((Y<<1)+2<<4)+8>>2];ib=+g[W+4>>2]*e+ +g[W+20>>2]*kb+ +g[W+36>>2]*jb;hb=+g[W+8>>2]*e+ +g[W+24>>2]*kb+ +g[W+40>>2]*jb;g[f>>2]=+g[W>>2]*e+ +g[W+16>>2]*kb+ +g[W+32>>2]*jb;g[f+4>>2]=ib;g[f+8>>2]=hb;hb=+g[V+16>>2];ib=+g[V+20>>2];jb=+g[V+24>>2];kb=+g[W+4>>2]*hb+ +g[W+20>>2]*ib+ +g[W+36>>2]*jb;lb=+g[W+8>>2]*hb+ +g[W+24>>2]*ib+ +g[W+40>>2]*jb;g[f+12>>2]=+g[W>>2]*hb+ +g[W+16>>2]*ib+ +g[W+32>>2]*jb;g[f+16>>2]=kb;g[f+20>>2]=lb;if((ba|0)>-6){j=c[(c[ca+324>>2]|0)+180>>2]|0;i=0;e=0.0;do{e=e+ +g[j+(i<<2)>>2]*+g[$+(i<<2)>>2];i=i+1|0}while((i|0)<(ba+6|0))}else e=0.0;j=ca;k=0;h=ta*e*+g[aa>>2];n=ta*e*+g[Z>>2];e=ta*e*+g[_>>2];break}default:{j=0;k=0;h=0.0;n=0.0;e=0.0}}i=c[ea+(fa*104|0)+24>>2]|0;r=+g[i+8>>2];s=+g[i+12>>2];t=+g[i+16>>2];q=r-+g[i+24>>2]-h;p=s-+g[i+28>>2]-n;e=t-+g[i+32>>2]-e;h=+g[ea+(fa*104|0)+4>>2];n=+g[ea+(fa*104|0)+8>>2];o=+g[ea+(fa*104|0)+12>>2];if(q*h+p*n+e*o<=1.1920928955078125e-07){jb=r*h+s*n+t*o+ +g[ea+(fa*104|0)+20>>2];ib=+g[ea+(fa*104|0)+96>>2];jb=(jb>2];kb=(q-(q-h*(q*h+p*n+e*o))*ib+h*jb)*d;lb=(p-(p-n*(q*h+p*n+e*o))*ib+jb*n)*d;n=(e-(e-o*(q*h+p*n+e*o))*ib+jb*o)*d;e=+g[ea+(fa*104|0)+28>>2]*kb+ +g[ea+(fa*104|0)+32>>2]*lb+ +g[ea+(fa*104|0)+36>>2]*n;h=kb*+g[ea+(fa*104|0)+44>>2]+lb*+g[ea+(fa*104|0)+48>>2]+n*+g[ea+(fa*104|0)+52>>2];n=kb*+g[ea+(fa*104|0)+60>>2]+lb*+g[ea+(fa*104|0)+64>>2]+n*+g[ea+(fa*104|0)+68>>2];g[ua>>2]=e;g[ua+4>>2]=h;g[ua+8>>2]=n;g[ua+12>>2]=0.0;lb=+g[ea+(fa*104|0)+92>>2];g[i+8>>2]=r-e*lb;g[i+12>>2]=s-lb*h;g[i+16>>2]=t-lb*n;i=c[(c[da>>2]|0)+252>>2]|0;if((i|0)==2){if(k|0)ll(k,ua,ea+(fa*104|0)+76|0)}else if((j|0)!=0&(i|0)==64?(va=c[j+324>>2]|0,wa=+D(+(e*e+h*h+n*n))*-.5,xa=c[va+468>>2]|0,(xa|0)>-6):0){j=c[va+180>>2]|0;i=0;while(1){k=j+(i<<2)|0;h=wa*+g[f+(i<<2)>>2]+ +g[k>>2];g[k>>2]=h;e=+g[va+460>>2];if(!(h<-e)){if(e>2]=e}if((i|0)<(xa+5|0))i=i+1|0;else break}}}}fa=fa+1|0}while((fa|0)!=(sa|0));Ph(ua+48|0);l=ua;return}function hc(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0;O=l;l=l+176|0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=((xb[c[(c[B>>2]|0)+56>>2]&127](B)|0)&2048|0)!=0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=((xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&4096|0)!=0;N=+g[d+40>>2];if(N<=0.0){l=O;return}switch(c[d+4>>2]|0){case 3:{c[O+112>>2]=1065353216;c[O+112+4>>2]=0;c[O+112+4+4>>2]=0;c[O+112+4+8>>2]=0;c[O+112+4+12>>2]=0;c[O+112+20>>2]=1065353216;c[O+112+24>>2]=0;c[O+112+24+4>>2]=0;c[O+112+24+8>>2]=0;c[O+112+24+12>>2]=0;c[O+112+40>>2]=1065353216;M=O+112+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;D=+g[d+300>>2];C=+g[d+304>>2];A=+g[d+308>>2];M=c[d+28>>2]|0;z=D*+g[M+20>>2]+C*+g[M+24>>2]+A*+g[M+28>>2]+ +g[M+56>>2];y=D*+g[M+36>>2]+C*+g[M+40>>2]+A*+g[M+44>>2]+ +g[M+60>>2];g[O+112+48>>2]=D*+g[M+4>>2]+C*+g[M+8>>2]+A*+g[M+12>>2]+ +g[M+52>>2];g[O+112+52>>2]=z;g[O+112+56>>2]=y;g[O+112+60>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[M>>2]|0)+64>>2]&7](M,O+112|0,N);y=+g[d+316>>2];z=+g[d+320>>2];A=+g[d+324>>2];d=c[d+32>>2]|0;C=y*+g[d+20>>2]+z*+g[d+24>>2]+A*+g[d+28>>2]+ +g[d+56>>2];D=y*+g[d+36>>2]+z*+g[d+40>>2]+A*+g[d+44>>2]+ +g[d+60>>2];g[O+112+48>>2]=y*+g[d+4>>2]+z*+g[d+8>>2]+A*+g[d+12>>2]+ +g[d+52>>2];g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[b>>2]|0)+64>>2]&7](b,O+112|0,N)}l=O;return}case 4:{L=c[d+28>>2]|0;e=+g[d+552>>2];U=+g[L+4>>2];f=+g[d+552+16>>2];T=+g[L+8>>2];m=+g[d+552+32>>2];S=+g[L+12>>2];n=+g[d+552+4>>2];s=+g[d+552+20>>2];t=+g[d+552+36>>2];u=+g[d+552+8>>2];w=+g[d+552+24>>2];y=+g[d+552+40>>2];R=+g[L+20>>2];Q=+g[L+24>>2];P=+g[L+28>>2];v=+g[L+36>>2];x=+g[L+40>>2];z=+g[L+44>>2];W=+g[d+552+48>>2];V=+g[d+552+52>>2];D=+g[d+552+56>>2];A=+g[L+52>>2]+(U*W+T*V+S*D);C=R*W+Q*V+P*D+ +g[L+56>>2];D=v*W+x*V+z*D+ +g[L+60>>2];g[O+112>>2]=e*U+f*T+m*S;g[O+112+4>>2]=U*n+T*s+S*t;g[O+112+8>>2]=U*u+T*w+S*y;g[O+112+12>>2]=0.0;g[O+112+16>>2]=e*R+f*Q+m*P;g[O+112+20>>2]=n*R+s*Q+t*P;g[O+112+24>>2]=u*R+w*Q+y*P;g[O+112+28>>2]=0.0;g[O+112+32>>2]=e*v+f*x+m*z;g[O+112+36>>2]=n*v+s*x+t*z;g[O+112+40>>2]=u*v+w*x+y*z;g[O+112+44>>2]=0.0;g[O+112+48>>2]=A;g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0;L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0}m=+g[d+688>>2];n=+g[d+688+4>>2];e=+mh(m-n,6.2831854820251465);if(!(e<-3.1415927410125732))if(e>3.1415927410125732)f=e+-6.2831854820251465;else f=e;else f=e+6.2831854820251465;e=+mh(m+n,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(f==e)?M:0){c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Yb[d&0](b,O+112+48|0,O+96|0,O+80|0,N,N,n>0.0?f:0.0,n>0.0?e:6.2831854820251465,O+64|0,n>0.0,10.0)}l=O;return}case 5:{H=c[d+28>>2]|0;w=+g[d+300>>2];m=+g[H+4>>2];x=+g[d+300+16>>2];n=+g[H+8>>2];y=+g[d+300+32>>2];s=+g[H+12>>2];z=+g[d+300+4>>2];A=+g[d+300+20>>2];C=+g[d+300+36>>2];D=+g[d+300+8>>2];Q=+g[d+300+24>>2];S=+g[d+300+40>>2];t=+g[H+20>>2];u=+g[H+24>>2];v=+g[H+28>>2];P=+g[H+36>>2];R=+g[H+40>>2];T=+g[H+44>>2];e=+g[d+300+48>>2];f=+g[d+300+52>>2];W=+g[d+300+56>>2];U=+g[H+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[H+56>>2];W=P*e+R*f+T*W+ +g[H+60>>2];g[O+112>>2]=w*m+x*n+y*s;H=O+112+4|0;g[H>>2]=m*z+n*A+s*C;J=O+112+8|0;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;K=O+112+16|0;g[K>>2]=w*t+x*u+y*v;L=O+112+20|0;g[L>>2]=z*t+A*u+C*v;o=O+112+24|0;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;p=O+112+32|0;g[p>>2]=w*P+x*R+y*T;q=O+112+36|0;g[q>>2]=z*P+A*R+C*T;r=O+112+40|0;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;k=O+112+48|0;g[k>>2]=U;E=O+112+52|0;g[E>>2]=V;I=O+112+56|0;g[I>>2]=W;g[O+112+60>>2]=0.0;if(B){B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N);B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N)}else{B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0}if(M){Ak(O+96|0,d,6.0868353843688965,N);S=+g[O+96>>2];T=+g[O+96+4>>2];U=+g[O+96+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+96>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+96+4>>2]=V;g[O+96+8>>2]=W;g[O+96+12>>2]=0.0;i=O+112+48|0;h=0;do{Ak(O+80|0,d,+(h|0)*6.283185005187988*.03125,N);S=+g[O+80>>2];T=+g[O+80+4>>2];U=+g[O+80+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+80>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+80+4>>2]=V;g[O+80+8>>2]=W;g[O+80+12>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,O+96|0,O+80|0,O+64|0);if(!(h&3)){M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,i,O+80|0,O+64|0)}c[O+96>>2]=c[O+80>>2];c[O+96+4>>2]=c[O+80+4>>2];c[O+96+8>>2]=c[O+80+8>>2];c[O+96+12>>2]=c[O+80+12>>2];h=h+1|0}while((h|0)!=32);C=+g[d+452>>2];D=+g[d+512>>2];h=c[d+32>>2]|0;if(+g[h+404>>2]>0.0){P=+g[d+364>>2];R=+g[h+4>>2];Q=+g[d+364+16>>2];S=+g[h+8>>2];z=+g[d+364+32>>2];A=+g[h+12>>2];Y=+g[d+364+4>>2];X=+g[d+364+20>>2];y=+g[d+364+36>>2];_=+g[d+364+8>>2];Z=+g[d+364+24>>2];x=+g[d+364+40>>2];aa=+g[h+20>>2];$=+g[h+24>>2];w=+g[h+28>>2];T=+g[h+36>>2];V=+g[h+40>>2];W=+g[h+44>>2];U=+g[d+364+48>>2];e=+g[d+364+52>>2];f=+g[d+364+56>>2];m=aa*U+$*e+w*f;n=_*T+Z*V+x*W;s=Y*T+X*V+y*W;t=P*T+Q*V+z*W;u=_*aa+Z*$+x*w;v=Y*aa+X*$+y*w;w=P*aa+Q*$+z*w;x=R*_+S*Z+A*x;y=R*Y+S*X+A*y;z=P*R+Q*S+z*A;A=R*U+S*e+A*f;h=h+4|0;e=T*U+V*e;f=W*f}else{h=c[d+28>>2]|0;V=+g[d+300>>2];X=+g[h+4>>2];W=+g[d+300+16>>2];Y=+g[h+8>>2];z=+g[d+300+32>>2];A=+g[h+12>>2];T=+g[d+300+4>>2];U=+g[d+300+20>>2];y=+g[d+300+36>>2];R=+g[d+300+8>>2];S=+g[d+300+24>>2];x=+g[d+300+40>>2];P=+g[h+20>>2];Q=+g[h+24>>2];w=+g[h+28>>2];Z=+g[h+36>>2];$=+g[h+40>>2];aa=+g[h+44>>2];_=+g[d+300+48>>2];e=+g[d+300+52>>2];f=+g[d+300+56>>2];m=P*_+Q*e+w*f;n=R*Z+S*$+x*aa;s=T*Z+U*$+y*aa;t=V*Z+W*$+z*aa;u=R*P+S*Q+x*w;v=T*P+U*Q+y*w;w=V*P+W*Q+z*w;x=X*R+Y*S+A*x;y=X*T+Y*U+A*y;z=V*X+W*Y+z*A;A=X*_+Y*e+A*f;h=h+4|0;e=Z*_+$*e;f=aa*f}_=A+ +g[h+48>>2];$=m+ +g[h+52>>2];aa=f+e+ +g[h+56>>2];g[O+112>>2]=z;g[H>>2]=y;g[J>>2]=x;g[O+112+12>>2]=0.0;g[K>>2]=w;g[L>>2]=v;g[o>>2]=u;g[O+112+28>>2]=0.0;g[p>>2]=t;g[q>>2]=s;g[r>>2]=n;g[O+112+44>>2]=0.0;g[k>>2]=_;g[E>>2]=$;g[I>>2]=aa;g[O+112+60>>2]=0.0;c[O+80>>2]=c[i>>2];c[O+80+4>>2]=c[i+4>>2];c[O+80+8>>2]=c[i+8>>2];c[O+80+12>>2]=c[i+12>>2];g[O+64>>2]=z;g[O+64+4>>2]=w;g[O+64+8>>2]=t;g[O+64+12>>2]=0.0;g[O+48>>2]=y;g[O+48+4>>2]=v;g[O+48+8>>2]=s;g[O+48+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[d&0](b,O+80|0,O+64|0,O+48|0,N,N,-D-C,C-D,O+32|0,1,10.0)}l=O;return}case 6:case 9:{c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];i=d+1064+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1064+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1064+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2]}if(M){c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1128+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+932>>2];e=+g[d+932+4>>2];$=+g[d+996>>2];_=+g[d+996+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1196>>2];$=+g[d+1200>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+868>>2];f=+g[d+868+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 12:{c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];i=d+1236+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1236+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1236+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2]}if(M){c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1300+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+1056>>2];e=+g[d+1060>>2];$=+g[d+1144>>2];_=+g[d+1144+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1368>>2];$=+g[d+1372>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+968>>2];f=+g[d+968+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 7:{c[O+112>>2]=c[d+824>>2];c[O+112+4>>2]=c[d+824+4>>2];c[O+112+8>>2]=c[d+824+8>>2];c[O+112+12>>2]=c[d+824+12>>2];h=O+112+16|0;c[h>>2]=c[d+824+16>>2];c[h+4>>2]=c[d+824+16+4>>2];c[h+8>>2]=c[d+824+16+8>>2];c[h+12>>2]=c[d+824+16+12>>2];i=O+112+32|0;c[i>>2]=c[d+824+32>>2];c[i+4>>2]=c[d+824+32+4>>2];c[i+8>>2]=c[d+824+32+8>>2];c[i+12>>2]=c[d+824+32+12>>2];k=O+112+48|0;c[k>>2]=c[d+824+48>>2];c[k+4>>2]=c[d+824+48+4>>2];c[k+8>>2]=c[d+824+48+8>>2];c[k+12>>2]=c[d+824+48+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2]}if(M){E=a[d+180>>0]|0?d+824|0:d+888|0;H=c[E>>2]|0;K=c[E+4>>2]|0;I=c[E+16>>2]|0;L=c[E+20>>2]|0;J=c[E+32>>2]|0;M=c[E+36>>2]|0;Q=+g[E+48>>2];U=+g[E+52>>2];Y=+g[E+56>>2];$=+g[d+184>>2];T=(c[j>>2]=H,+g[j>>2]);S=(c[j>>2]=K,+g[j>>2])*0.0;R=+g[E+8>>2]*0.0;X=(c[j>>2]=I,+g[j>>2]);W=(c[j>>2]=L,+g[j>>2])*0.0;V=+g[E+24>>2]*0.0;aa=(c[j>>2]=J,+g[j>>2]);_=(c[j>>2]=M,+g[j>>2])*0.0;Z=+g[E+40>>2]*0.0;g[O+96>>2]=Q+(R+(S+T*$));g[O+96+4>>2]=U+(V+(W+X*$));g[O+96+8>>2]=Y+(Z+(_+aa*$));g[O+96+12>>2]=0.0;$=+g[d+188>>2];g[O+80>>2]=Q+(R+(S+T*$));g[O+80+4>>2]=U+(V+(W+X*$));g[O+80+8>>2]=Y+(Z+(_+aa*$));g[O+80+12>>2]=0.0;E=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[E>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](E,O+96|0,O+80|0,O+64|0);c[O+64>>2]=H;c[O+64+4>>2]=I;c[O+64+8>>2]=J;g[O+64+12>>2]=0.0;c[O+48>>2]=K;c[O+48+4>>2]=L;c[O+48+8>>2]=M;g[O+48+12>>2]=0.0;$=+g[d+192>>2];aa=+g[d+196>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[M&0](b,d+888+48|0,O+64|0,O+48|0,N,N,$,aa,O+32|0,1,10.0)}l=O;return}default:{l=O;return}}}function ic(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,Q=0,R=0,S=0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0;Z=l;l=l+112|0;c[Z+40>>2]=0;a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+4>>2]=0;c[Z+8>>2]=0;a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;i=e>>>0>8?e:8;if((i|0)>0){c[6995]=(c[6995]|0)+1;h=sc((i<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}h=0;do{Y=j+(h<<4)|0;c[Y>>2]=c[Z+48>>2];c[Y+4>>2]=c[Z+48+4>>2];c[Y+8>>2]=c[Z+48+8>>2];c[Y+12>>2]=c[Z+48+12>>2];h=h+1|0}while((h|0)!=(i|0));Y=j;X=j}else{Y=0;X=0}do if(!e){w=0;h=0;q=0;u=0;v=0}else{i=c[Z+24>>2]|0;if((i|0)<0){h=c[Z+32>>2]|0;if((c[Z+28>>2]|0)<0){if(!((h|0)==0|(a[Z+36>>0]|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+28>>2]=0;h=0}Yk(h+(i<<2)|0,0,P(i,-4)|0)|0}c[Z+24>>2]=0;h=d;i=0;x=3402823466385288598117041.0e14;p=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;z=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;while(1){T=+g[h>>2];x=Tp?T:p;T=+g[h+4>>2];y=Tr?T:r;T=+g[h+8>>2];z=Tt?T:t;i=i+1|0;if((i|0)==(e|0))break;else h=h+16|0}s=p-x;T=r-y;p=t-z;K=x+s*.5;J=y+T*.5;E=z+p*.5;do if(e>>>0<3|(s<9.999999974752427e-07|T<9.999999974752427e-07|p<9.999999974752427e-07)){t=s>9.999999974752427e-07&s<3402823466385288598117041.0e14?s:3402823466385288598117041.0e14;t=T>9.999999974752427e-07&T9.999999974752427e-07&p>2];z=1.0/T*+g[n+4>>2];A=1.0/p*+g[n+8>>2];n=n+16|0;a:do if(h){j=0;while(1){d=Y+(j<<4)|0;r=+g[d>>2];k=Y+(j<<4)+4|0;t=+g[k>>2];m=Y+(j<<4)+8|0;x=+g[m>>2];if(+C(+(r-y))<1.0000000474974513e-03&+C(+(t-z))<1.0000000474974513e-03&+C(+(x-A))<1.0000000474974513e-03)break;j=j+1|0;if(j>>>0>=h>>>0){m=j;break a}}if((y-1.0/s*K)*(y-1.0/s*K)+(z-1.0/T*J)*(z-1.0/T*J)+(A-1.0/p*E)*(A-1.0/p*E)>(r-1.0/s*K)*(r-1.0/s*K)+(t-1.0/T*J)*(t-1.0/T*J)+(x-1.0/p*E)*(x-1.0/p*E)){g[d>>2]=y;g[k>>2]=z;g[m>>2]=A;m=j}else m=j}else m=0;while(0);if((m|0)==(h|0)){g[Y+(h<<4)>>2]=y;g[Y+(h<<4)+4>>2]=z;g[Y+(h<<4)+8>>2]=A;h=h+1|0}if((i|0)==(c[Z+28>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if((q|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((q<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;k=u+4+15&-16}else k=0;d=c[Z+32>>2]|0;if((i|0)<=0){if(d)W=37}else{j=0;do{c[k+(j<<2)>>2]=c[d+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));W=37}if((W|0)==37){W=0;if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Z+32>>2]=0;i=c[Z+24>>2]|0}a[Z+36>>0]=1;c[Z+32>>2]=k;c[Z+28>>2]=q}c[(c[Z+32>>2]|0)+(i<<2)>>2]=m;i=(c[Z+24>>2]|0)+1|0;c[Z+24>>2]=i;o=o+1|0}while((o|0)!=(e|0));if(!h){i=1;x=-3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14}else{i=0;B=3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;H=-3402823466385288598117041.0e14;x=-3402823466385288598117041.0e14;J=3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;K=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;M=3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;N=-3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;while(1){z=+g[Y+(i<<4)>>2];j=zH;x=d?z:x;I=+g[Y+(i<<4)+4>>2];k=IK;t=m?I:t;L=+g[Y+(i<<4)+8>>2];n=LN;r=o?L:r;i=i+1|0;if((i|0)==(h|0))break;else{B=j?z:B;H=d?z:H;J=k?I:J;K=m?I:K;M=n?L:M;N=o?L:N}}i=h>>>0<3}x=x-E;z=t-A;B=r-y;if(!(i|(x<9.999999974752427e-07|z<9.999999974752427e-07|B<9.999999974752427e-07))){if(h|0){r=T;U=h;W=52;break}break}E=E+x*.5;A=A+z*.5;y=y+B*.5;t=x>=9.999999974752427e-07&x<3402823466385288598117041.0e14?x:3402823466385288598117041.0e14;t=z>=9.999999974752427e-07&z=9.999999974752427e-07&B>2]=t;g[Y+4>>2]=y;g[Y+8>>2]=z;g[Y+16>>2]=I;g[Y+20>>2]=y;g[Y+24>>2]=z;g[Y+32>>2]=I;g[Y+36>>2]=H;g[Y+40>>2]=z;g[Y+48>>2]=t;g[Y+52>>2]=H;g[Y+56>>2]=z;g[Y+64>>2]=t;g[Y+68>>2]=y;g[Y+72>>2]=B;g[Y+80>>2]=I;g[Y+84>>2]=y;g[Y+88>>2]=B;g[Y+96>>2]=I;g[Y+100>>2]=H;g[Y+104>>2]=B;g[Y+112>>2]=t;g[Y+116>>2]=H;g[Y+120>>2]=B;U=8;W=52}if((W|0)==52){h=0;do{V=Y+(h<<4)|0;g[V>>2]=s*+g[V>>2];V=Y+(h<<4)+4|0;g[V>>2]=r*+g[V>>2];V=Y+(h<<4)+8|0;g[V>>2]=p*+g[V>>2];h=h+1|0}while(h>>>0>>0);if((U|0)>=4){p=+g[Y>>2];s=+g[Y+4>>2];r=+g[Y+8>>2];V=U<<2;c[6995]=(c[6995]|0)+1;h=sc((V|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[Z+48>>2]=0;c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(i){c[(i+4+15&-16)+-4>>2]=i;h=c[Z+48>>2]|0;if(!h)h=i+4+15&-16;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16}}else h=0;c[Z+48>>2]=h;z=p;x=p;y=r;n=U;q=j;u=0;t=s;p=s;h=U;o=j;d=j;while(1){if((u|0)==(h|0)?(v=u|0?u<<1:1,(u|0)<(v|0)):0){if((v|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((v<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;j=c[Z+48>>2]|0;if((u|0)<=0){if(j|0)W=68}else{h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(u|0));W=68}if((W|0)==68){W=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[Z+48>>2]=0}c[Z+48>>2]=i;m=v}else m=h;c[(c[Z+48>>2]|0)+(u<<2)>>2]=1;k=u;u=u+1|0;do if((k|0)==(n|0)){i=k|0?k<<1:1;if((k|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,F=sc((i<<2|3)+16|0)|0,(F|0)!=0):0){c[(F+4+15&-16)+-4>>2]=F;j=F+4+15&-16}else j=0;if((k|0)>0){h=0;do{c[j+(h<<2)>>2]=c[q+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));if(!d){q=j;d=j;o=j;break}}else if((q|0)==0|(d|0)==0){q=j;d=j;o=j;break}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);q=j;d=j;o=j}else i=k}else i=n;while(0);c[q+(k<<2)>>2]=0;M=+g[Y+(k<<4)>>2];x=M>2];p=N>2];r=T=(U|0))break;else{n=i;h=m}}z=z-x;x=t-p;I=y-r;I=+D(+(z*z+x*x+I*I))*1.0000000474974513e-03;O=Se(Y,U,.009999999776482582,.019999999552965164,1.0,c[Z+48>>2]|0)|0;m=c[Z+48>>2]|0;Q=Se(Y,U,-.009999999776482582,-.019999999552965164,-1.0,m)|0;n=Y+(O<<4)|0;u=Y+(Q<<4)|0;x=+g[n>>2]-+g[u>>2];v=Y+(O<<4)+4|0;w=Y+(Q<<4)+4|0;y=+g[v>>2]-+g[w>>2];F=Y+(O<<4)+8|0;G=Y+(Q<<4)+8|0;z=+g[F>>2]-+g[G>>2];b:do if((O|0)!=(Q|0)?!(z==0.0&y==0.0&x==0.0):0){p=+D(+((z*.019999999552965164-y*0.0)*(z*.019999999552965164-y*0.0)+(x*0.0-z)*(x*0.0-z)+(y-x*.019999999552965164)*(y-x*.019999999552965164)));r=+D(+((z-y*0.0)*(z-y*0.0)+(z*.019999999552965164+x*0.0)*(z*.019999999552965164+x*0.0)+(y*-.019999999552965164-x)*(y*-.019999999552965164-x)));if(p>r){s=(y-x*.019999999552965164)*(1.0/p);t=(z*.019999999552965164-y*0.0)*(1.0/p);p=(x*0.0-z)*(1.0/p)}else{s=(y*-.019999999552965164-x)*(1.0/r);t=(z-y*0.0)*(1.0/r);p=(z*.019999999552965164+x*0.0)*(1.0/r)}h=Se(Y,U,t,p,s,m)|0;if((h|0)==(O|0)|(h|0)==(Q|0))i=Se(Y,U,-t,-p,-s,m)|0;else i=h;if(!((i|0)==(O|0)|(i|0)==(Q|0))){j=Y+(i<<4)|0;p=+g[j>>2]-+g[n>>2];d=Y+(i<<4)+4|0;r=+g[d>>2]-+g[v>>2];k=Y+(i<<4)+8|0;s=+g[k>>2]-+g[F>>2];t=1.0/+D(+((y*p-r*x)*(y*p-r*x)+((r*z-s*y)*(r*z-s*y)+(s*x-z*p)*(s*x-z*p))));h=Se(Y,U,(r*z-s*y)*t,(s*x-z*p)*t,(y*p-r*x)*t,m)|0;if((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))h=Se(Y,U,-((r*z-s*y)*t),-((s*x-z*p)*t),-((y*p-r*x)*t),m)|0;if(!((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))?(E=+g[n>>2],K=+g[v>>2],B=+g[F>>2],N=+g[u>>2]-E,H=+g[w>>2]-K,L=+g[G>>2]-B,M=+g[j>>2]-E,J=+g[d>>2]-K,T=+g[k>>2]-B,R=(+g[Y+(h<<4)+8>>2]-B)*(N*J-H*M)+((+g[Y+(h<<4)>>2]-E)*(H*T-L*J)+(+g[Y+(h<<4)+4>>2]-K)*(L*M-N*T))<0.0,S=R?i:h,R=R?h:i,(O|0)!=-1):0){B=(+g[Y+(O<<4)>>2]+ +g[Y+(Q<<4)>>2]+ +g[Y+(R<<4)>>2]+ +g[Y+(S<<4)>>2])*.25;E=(+g[Y+(O<<4)+4>>2]+ +g[Y+(Q<<4)+4>>2]+ +g[Y+(R<<4)+4>>2]+ +g[Y+(S<<4)+4>>2])*.25;H=(+g[Y+(O<<4)+8>>2]+ +g[Y+(Q<<4)+8>>2]+ +g[Y+(R<<4)+8>>2]+ +g[Y+(S<<4)+8>>2])*.25;h=Lh(Z,R,S,Q)|0;c[h+12>>2]=2;c[h+16>>2]=3;c[h+20>>2]=1;h=Lh(Z,S,R,O)|0;c[h+12>>2]=3;c[h+16>>2]=2;c[h+20>>2]=0;h=Lh(Z,O,Q,S)|0;c[h+12>>2]=0;c[h+16>>2]=1;c[h+20>>2]=3;h=Lh(Z,Q,O,R)|0;c[h+12>>2]=1;c[h+16>>2]=0;c[h+20>>2]=2;c[q+(S<<2)>>2]=1;c[q+(R<<2)>>2]=1;c[q+(Q<<2)>>2]=1;c[q+(O<<2)>>2]=1;h=c[Z+4>>2]|0;if((h|0)>0){j=c[Z+12>>2]|0;i=0;do{h=c[j+(i<<2)>>2]|0;R=c[h>>2]|0;Q=c[h+4>>2]|0;S=c[h+8>>2]|0;x=+g[Y+(Q<<4)>>2];s=x-+g[Y+(R<<4)>>2];y=+g[Y+(Q<<4)+4>>2];t=y-+g[Y+(R<<4)+4>>2];r=+g[Y+(Q<<4)+8>>2];p=r-+g[Y+(R<<4)+8>>2];x=+g[Y+(S<<4)>>2]-x;y=+g[Y+(S<<4)+4>>2]-y;r=+g[Y+(S<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}R=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[h+28>>2]=R;S=c[h>>2]|0;g[h+32>>2]=(+g[Y+(R<<4)>>2]-+g[Y+(S<<4)>>2])*A+(+g[Y+(R<<4)+4>>2]-+g[Y+(S<<4)+4>>2])*r+(+g[Y+(R<<4)+8>>2]-+g[Y+(S<<4)+8>>2])*p;i=i+1|0;h=c[Z+4>>2]|0}while((i|0)<(h|0))}if((e+-4|0)>0){u=e+-4|0;while(1){m=c[Z+12>>2]|0;d=0;i=0;do{j=c[m+(d<<2)>>2]|0;do if(i){if(!j)break;if(+g[i+32>>2]<+g[j+32>>2])W=104}else W=104;while(0);if((W|0)==104){W=0;i=j}d=d+1|0}while((d|0)<(h|0));if((i|0)==0?1:!(+g[i+32>>2]>I)){h=1;break b}n=c[i+28>>2]|0;c[q+(n<<2)>>2]=1;h=c[Z+4>>2]|0;c:do if(h|0){j=Y+(n<<4)|0;d=Y+(n<<4)+4|0;k=Y+(n<<4)+8|0;i=m;while(1){h=h+-1|0;i=c[i+(h<<2)>>2]|0;do if(i|0){S=c[i>>2]|0;R=c[i+4>>2]|0;e=c[i+8>>2]|0;M=+g[Y+(R<<4)>>2];N=+g[Y+(S<<4)>>2];x=+g[Y+(R<<4)+4>>2];z=+g[Y+(S<<4)+4>>2];J=+g[Y+(R<<4)+8>>2];K=+g[Y+(S<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!((A==0.0?0.0:1.0/A*((M-N)*y-(x-z)*L))*(+g[k>>2]-K)+((+g[j>>2]-N)*(A==0.0?1.0:1.0/A*((x-z)*T-(J-K)*y))+(+g[d>>2]-z)*(A==0.0?0.0:1.0/A*((J-K)*L-(M-N)*T)))>I*.009999999776482582))break;me(Z,i,n)}while(0);if(!h)break;i=c[Z+12>>2]|0}h=c[Z+4>>2]|0;if(!h)break;else i=h;d:do{i=i+-1|0;d=c[Z+12>>2]|0;k=c[d+(i<<2)>>2]|0;do if(k){m=c[k>>2]|0;do if((m|0)!=(n|0)){j=c[k+4>>2]|0;if((j|0)==(n|0)){j=n;break}if((c[k+8>>2]|0)!=(n|0))break d}else j=c[k+4>>2]|0;while(0);e=c[k+8>>2]|0;M=+g[Y+(j<<4)>>2];N=+g[Y+(m<<4)>>2];x=+g[Y+(j<<4)+4>>2];z=+g[Y+(m<<4)+4>>2];J=+g[Y+(j<<4)+8>>2];K=+g[Y+(m<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!(AI*.009999999776482582))break;me(Z,c[d+(c[k+12>>2]<<2)>>2]|0,n);h=c[Z+4>>2]|0;i=h}while(0)}while((i|0)!=0);if(!h)break;d=c[Z+12>>2]|0;do{h=h+-1|0;j=c[d+(h<<2)>>2]|0;do if(j|0){if((c[j+28>>2]|0)>-1)break c;S=c[j>>2]|0;R=c[j+4>>2]|0;e=c[j+8>>2]|0;x=+g[Y+(R<<4)>>2];s=x-+g[Y+(S<<4)>>2];y=+g[Y+(R<<4)+4>>2];t=y-+g[Y+(S<<4)+4>>2];r=+g[Y+(R<<4)+8>>2];p=r-+g[Y+(S<<4)+8>>2];x=+g[Y+(e<<4)>>2]-x;y=+g[Y+(e<<4)+4>>2]-y;r=+g[Y+(e<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}i=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[j+28>>2]=i;if(!(c[q+(i<<2)>>2]|0)){e=c[j>>2]|0;g[j+32>>2]=(+g[Y+(i<<4)>>2]-+g[Y+(e<<4)>>2])*A+(+g[Y+(i<<4)+4>>2]-+g[Y+(e<<4)+4>>2])*r+(+g[Y+(i<<4)+8>>2]-+g[Y+(e<<4)+8>>2])*p;break}else{c[j+28>>2]=-1;break}}while(0)}while((h|0)!=0)}while(0);if((u|0)<=1){h=1;break b}u=u+-1|0;h=c[Z+4>>2]|0}}else h=1}else h=0}else h=0}else h=0;while(0);i=c[Z+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);c[Z+48>>2]=0}if(!((q|0)==0|(o|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(h){h=c[Z+4>>2]|0;if((h|0)>0){v=0;m=0;j=0;k=0;i=0;d=c[Z+12>>2]|0;n=0;do{o=c[d+(v<<2)>>2]|0;if(o){do if((k|0)==(m|0)){d=m|0?m<<1:1;if((m|0)>=(d|0)){d=m;break}do if(!d)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((m|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(!n){j=i;n=i;break}}else if((j|0)==0|(n|0)==0){j=i;n=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);j=i;n=i}else d=m;while(0);c[j+(k<<2)>>2]=c[o>>2];o=k+1|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+4|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){u=n;break}do if(!m)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!n){d=m;j=i;u=i;break}}else if((j|0)==0|(n|0)==0){d=m;j=i;u=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);d=m;j=i;u=i}else u=n;while(0);c[j+(o<<2)>>2]=c[q>>2];o=k+2|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+8|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){m=d;n=u;break}do if(!m)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){n=0;break}c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[n+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!u){j=n;i=n;break}}else if((j|0)==0|(u|0)==0){j=n;i=n;break}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);j=n;i=n}else{m=d;n=u}while(0);c[j+(o<<2)>>2]=c[q>>2];d=c[Z+12>>2]|0;h=c[d+(v<<2)>>2]|0;c[d+(c[h+24>>2]<<2)>>2]=0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}k=k+3|0;h=c[Z+4>>2]|0}v=v+1|0}while((v|0)<(h|0));c[Z+44>>2]=(k|0)/3|0;if((k|0)>0){c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h)d=0;else{c[(h+4+15&-16)+-4>>2]=h;d=h+4+15&-16}Yk(d|0,0,k<<2|0)|0;h=0;do{c[d+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));n=i;m=j;h=d;S=d}else{n=i;m=j;h=0;S=0}}else{c[Z+44>>2]=0;n=0;m=0;h=0;k=0;S=0}i=c[Z+4>>2]|0;if((i|0)<0){if((c[Z+8>>2]|0)<0){j=c[Z+12>>2]|0;if(j|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+12>>2]=0}a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+8>>2]=0}do{c[(c[Z+12>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[Z+4>>2]=0;if(!((m|0)==0|(n|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}R=c[Z+44>>2]|0;m=(U|0)>0;if(m){c[6995]=(c[6995]|0)+1;i=sc((U<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{e=j+(i<<4)|0;c[e>>2]=c[Z+48>>2];c[e+4>>2]=c[Z+48+4>>2];c[e+8>>2]=c[Z+48+8>>2];c[e+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(U|0));Q=j;O=j}else{Q=0;O=0}j=c[Z+24>>2]|0;do if((j|0)>0){c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)d=0;else{c[(i+4+15&-16)+-4>>2]=i;d=i+4+15&-16}Yk(d|0,0,j<<2|0)|0;if((c[Z+24>>2]|0)<=0){G=d;F=d;break}j=c[Z+32>>2]|0;i=0;do{c[d+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)<(c[Z+24>>2]|0));G=d;F=d}else{G=0;F=0}while(0);if(m){c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}Yk(i|0,0,V|0)|0;u=i;v=i}else{u=0;v=0}Yk(v|0,0,V|0)|0;if((R|0)<=0)if(!u)w=0;else{i=0;W=221}else{q=c[Z+32>>2]|0;o=0;i=0;do{j=h+(o<<2)|0;m=c[j>>2]|0;n=u+(m<<2)|0;d=c[n>>2]|0;if(!d){c[j>>2]=i;c[Q+(i<<4)>>2]=c[X+(m<<4)>>2];c[Q+(i<<4)+4>>2]=c[X+(m<<4)+4>>2];c[Q+(i<<4)+8>>2]=c[X+(m<<4)+8>>2];d=c[Z+24>>2]|0;if((d|0)>0){j=0;do{if((c[G+(j<<2)>>2]|0)==(m|0))c[q+(j<<2)>>2]=i;j=j+1|0}while((j|0)!=(d|0))}i=i+1|0;c[n>>2]=i}else c[j>>2]=d+-1;o=o+1|0}while((o|0)!=(R*3|0));W=221}do if((W|0)==221){if(!v){w=i;break}c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0);w=i}while(0);if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}if((w|0)>0){c[6995]=(c[6995]|0)+1;i=sc((w<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{W=j+(i<<4)|0;c[W>>2]=c[Z+48>>2];c[W+4>>2]=c[Z+48+4>>2];c[W+8>>2]=c[Z+48+8>>2];c[W+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(w|0));m=j;d=j}else{m=0;d=0}if((R|0)>0){c[6995]=(c[6995]|0)+1;i=sc((R*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[Z+40>>2]|0;if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+40>>2]=i;Yk(i|0,0,R*12|0)|0}gi(d|0,O|0,w<<4|0)|0;gi(c[Z+40>>2]|0,S|0,R*12|0)|0;do if(k){if(!h){h=0;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=0}while(0);if((Q|0)==0|(O|0)==0){q=m;u=R;v=R*3|0;break}c[6996]=(c[6996]|0)+1;Cd(c[O+-4>>2]|0);q=m;u=R;v=R*3|0;break}}}w=0;h=0;q=0;u=0;v=0}while(0);if(!((Y|0)==0|(X|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[X+-4>>2]|0)}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(1271)|0;if(!h)F=0;else{c[(h+4+15&-16)+-4>>2]=h;F=h+4+15&-16}Bc(F,b,w,q,0);if((u|0)>0){i=F+780|0;j=F+792|0;d=F+800|0;k=F+984|0;h=0;do{o=h*3|0;b=c[Z+40>>2]|0;m=c[b+(o<<2)>>2]|0;n=c[b+(o+1<<2)>>2]|0;o=c[b+(o+2<<2)>>2]|0;if((m|0)<(n|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(m*104|0);c[Y+(b*52|0)+28>>2]=X+(n*104|0);M=+g[X+(m*104|0)+8>>2]-+g[X+(n*104|0)+8>>2];N=+g[X+(m*104|0)+12>>2]-+g[X+(n*104|0)+12>>2];T=+g[X+(m*104|0)+16>>2]-+g[X+(n*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((n|0)<(o|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(n*104|0);c[Y+(b*52|0)+28>>2]=X+(o*104|0);M=+g[X+(n*104|0)+8>>2]-+g[X+(o*104|0)+8>>2];N=+g[X+(n*104|0)+12>>2]-+g[X+(o*104|0)+12>>2];T=+g[X+(n*104|0)+16>>2]-+g[X+(o*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((o|0)<(m|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(o*104|0);c[Y+(b*52|0)+28>>2]=X+(m*104|0);M=+g[X+(o*104|0)+8>>2]-+g[X+(m*104|0)+8>>2];N=+g[X+(o*104|0)+12>>2]-+g[X+(m*104|0)+12>>2];T=+g[X+(o*104|0)+16>>2]-+g[X+(m*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}bg(F,m,n,o,0);h=h+1|0}while((h|0)!=(u|0))}if(w)if(!q)u=0;else{c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0);u=0}else u=q;if(v|0){h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0}if(f){j=c[F+792>>2]|0;if((j|0)>0){d=F+800|0;h=243703;i=0;do{k=c[d>>2]|0;m=k+(i*52|0)|0;h=(P(h,1664525)|0)+1013904223|0;n=Z+48|0;o=m;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=m;o=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;o=Z+48|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(j|0))}else h=243703;k=c[F+812>>2]|0;if((k|0)>0){m=F+820|0;i=0;do{d=c[m>>2]|0;j=d+(i*44|0)|0;h=(P(h,1664525)|0)+1013904223|0;d=d+(((h>>>0)%(k>>>0)|0)*44|0)|0;n=Z+48|0;o=j;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=j;o=d;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=d;o=Z+48|0;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(k|0))}}h=c[Z+32>>2]|0;if(h|0){if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+32>>2]=0}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;h=c[Z+12>>2]|0;if(h|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+12>>2]=0}h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0;if(!u){l=Z;return F|0}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);l=Z;return F|0}function jc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0;K=l;l=l+16|0;f=c[b+1112>>2]|0;if((f|0)>0)while(1){j=c[c[b+1120>>2]>>2]|0;f=c[j+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[j+52>>2]|0;if(f|0){if(a[j+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+52>>2]=0}a[j+56>>0]=1;c[j+52>>2]=0;c[j+44>>2]=0;c[j+48>>2]=0;f=c[j+32>>2]|0;if(f|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;f=c[j+12>>2]|0;if(f|0){if(a[j+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+12>>2]=0}a[j+16>>0]=1;c[j+12>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);f=c[b+1112>>2]|0;a:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(j|0))break a;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)>(h|0)){E=c[b+1120>>2]|0;F=E+(h<<2)|0;G=c[F>>2]|0;c[F>>2]=c[E+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=G;c[b+1112>>2]=f+-1;f=f+-1|0}if((f|0)<=0){h=f;break}}else h=f;f=c[b+772>>2]|0;f=(f|0)>(d|0)?d:f;if((h|0)<(f|0)){if((c[b+1116>>2]|0)<(f|0)){if(f){c[6995]=(c[6995]|0)+1;i=sc((f<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+1112>>2]|0;if((d|0)>0){j=0;do{c[i+(j<<2)>>2]=c[(c[b+1120>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(d|0));j=i;i=b+1120|0}else{j=i;i=b+1120|0}}else{j=0;i=b+1120|0}d=c[i>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[i>>2]=0}a[b+1124>>0]=1;c[i>>2]=j;c[b+1116>>2]=f}else i=b+1120|0;do{c[(c[i>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=(f|0))}c[b+1112>>2]=f;if((f|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;j=f+348|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;j=c[b+1120>>2]|0;a[(c[j+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0;f=c[b+1112>>2]|0}while((h|0)<(f|0));if((f|0)>0){h=c[b+772>>2]|0;if((h|0)>0){i=0;k=0.0;m=0.0;n=0.0;d=f;while(1){p=c[b+780>>2]|0;v=k+ +g[p+(i*104|0)+8>>2];m=m+ +g[p+(i*104|0)+12>>2];w=n+ +g[p+(i*104|0)+16>>2];o=c[j+(((i*29873|0)%(d|0)|0)<<2)>>2]|0;p=p+(i*104|0)|0;j=c[o+24>>2]|0;if((j|0)==(c[o+28>>2]|0)?(q=j|0?j<<1:1,(j|0)<(q|0)):0){if(!q)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((q<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+24>>2]|0}if((j|0)>0){d=0;do{c[h+(d<<2)>>2]=c[(c[o+32>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(j|0))}d=c[o+32>>2]|0;if(d){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);j=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=h;c[o+28>>2]=q;h=c[b+772>>2]|0}c[(c[o+32>>2]|0)+(j<<2)>>2]=p;c[o+24>>2]=j+1;i=i+1|0;if((i|0)>=(h|0))break;k=v;n=w;d=c[b+1112>>2]|0;j=c[b+1120>>2]|0}k=1.0/+(h|0);if((f|0)>=0)if(!f){i=0;n=v*k;m=m*k;k=w*k;J=70}else{n=v*k;m=m*k;k=w*k;J=68}else{E=b+780|0;G=0;F=0}}else{n=1.0/+(h|0)*0.0;m=1.0/+(h|0)*0.0;k=1.0/+(h|0)*0.0;J=68}if((J|0)==68){c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h){i=0;J=70}else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16;J=70}}if((J|0)==70){h=0;do{g[i+(h<<4)>>2]=n;g[i+(h<<4)+4>>2]=m;g[i+(h<<4)+8>>2]=k;g[i+(h<<4)+12>>2]=0.0;h=h+1|0}while((h|0)!=(f|0));E=b+780|0;G=i;F=i}t=G+4|0;u=G+8|0;s=0;do{z=+(s|0)*.0625;z=2.0-(z>1.0?1.0:z);d=0;o=0;while(1){h=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=c[h+24>>2]|0;if((j|0)>0){i=c[h+32>>2]|0;h=0;k=0.0;m=0.0;n=0.0;do{r=c[i+(h<<2)>>2]|0;k=k+ +g[r+8>>2];m=m+ +g[r+12>>2];n=n+ +g[r+16>>2];h=h+1|0}while((h|0)!=(j|0))}else{n=0.0;m=0.0;k=0.0}if(!j)r=d;else{q=G+(o<<4)|0;w=+g[q>>2];r=G+(o<<4)+4|0;x=+g[r>>2];h=G+(o<<4)+8|0;y=+g[h>>2];v=w+z*(k*(1.0/+(j|0))-w);m=x+z*(m*(1.0/+(j|0))-x);k=y+z*(n*(1.0/+(j|0))-y);g[q>>2]=v;g[r>>2]=m;g[h>>2]=k;g[G+(o<<4)+12>>2]=0.0;j=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;h=c[j+24>>2]|0;if((h|0)<0){if((c[j+28>>2]|0)<0){i=c[j+32>>2]|0;if(i|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+28>>2]=0}do{c[(c[j+32>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=0)}c[j+24>>2]=0;r=d|(v-w)*(v-w)+(m-x)*(m-x)+(k-y)*(k-y)>1.1920928955078125e-07}o=o+1|0;if((o|0)>=(f|0))break;else d=r}s=s+1|0;h=c[b+772>>2]|0;b:do if((h|0)>0){if((f|0)>1)q=0;else{p=0;while(1){d=c[c[b+1120>>2]>>2]|0;o=(c[E>>2]|0)+(p*104|0)|0;i=c[d+24>>2]|0;if((i|0)==(c[d+28>>2]|0)?(D=i|0?i<<1:1,(i|0)<(D|0)):0){if(!D)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((D<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[d+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[d+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[d+32>>2]|0;if(j){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[d+24>>2]|0}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=h;c[d+28>>2]=D;h=c[b+772>>2]|0}c[(c[d+32>>2]|0)+(i<<2)>>2]=o;c[d+24>>2]=i+1;p=p+1|0;if((p|0)>=(h|0))break b}}do{o=c[E>>2]|0;m=+g[o+(q*104|0)+8>>2];n=+g[o+(q*104|0)+12>>2];v=+g[o+(q*104|0)+16>>2];i=1;k=+C(+(+g[G>>2]-m))+ +C(+(+g[t>>2]-n))+ +C(+(+g[u>>2]-v));j=0;while(1){w=+C(+(+g[G+(i<<4)>>2]-m))+ +C(+(+g[G+(i<<4)+4>>2]-n))+ +C(+(+g[G+(i<<4)+8>>2]-v));d=w>2]|0)+(j<<2)>>2]|0;d=o+(q*104|0)|0;i=c[p+24>>2]|0;if((i|0)==(c[p+28>>2]|0)?(B=i|0?i<<1:1,(i|0)<(B|0)):0){if(!B)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((B<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[p+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[p+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[p+32>>2]|0;if(j){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=h;c[p+28>>2]=B;h=c[b+772>>2]|0}c[(c[p+32>>2]|0)+(i<<2)>>2]=d;c[p+24>>2]=i+1;q=q+1|0}while((q|0)<(h|0))}while(0)}while((s|0)<(e|0)&r);if((h|0)>0){h=h<<2;c[6995]=(c[6995]|0)+1;f=sc((h|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}Yk(f|0,-1,h|0)|0;e=f;u=f}else{e=0;u=0}f=c[b+1112>>2]|0;if((f|0)>0){o=c[b+1120>>2]|0;d=0;do{j=c[o+(d<<2)>>2]|0;if((c[j+24>>2]|0)>0){i=c[E>>2]|0;h=c[j+32>>2]|0;f=0;do{c[e+((((c[h+(f<<2)>>2]|0)-i|0)/104|0)<<2)>>2]=d;f=f+1|0}while((f|0)<(c[j+24>>2]|0));f=c[b+1112>>2]|0}d=d+1|0}while((d|0)<(f|0))}if((c[b+812>>2]|0)>0){r=0;do{D=c[b+820>>2]|0;q=c[E>>2]|0;f=((c[D+(r*44|0)+8>>2]|0)-q|0)/104|0;c[K>>2]=f;c[K+4>>2]=((c[D+(r*44|0)+12>>2]|0)-q|0)/104|0;c[K+8>>2]=((c[D+(r*44|0)+16>>2]|0)-q|0)/104|0;q=0;while(1){o=c[e+(f<<2)>>2]|0;d=1;do{f=c[K+(((d+q|0)%3|0)<<2)>>2]|0;c:do if((c[e+(f<<2)>>2]|0)!=(o|0)){p=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=(c[E>>2]|0)+(f*104|0)|0;h=c[p+24>>2]|0;d:do if((h|0)>0){i=c[p+32>>2]|0;f=0;while(1){if((c[i+(f<<2)>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(h|0))break d}if((f|0)!=(h|0))break c}while(0);if((h|0)==(c[p+28>>2]|0)?(H=h|0?h<<1:1,(h|0)<(H|0)):0){if(!H)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((H<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[p+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[p+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[p+32>>2]|0;if(i){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=f;c[p+28>>2]=H;f=h}else f=h;c[(c[p+32>>2]|0)+(f<<2)>>2]=j;c[p+24>>2]=f+1}while(0);d=d+1|0}while((d|0)!=3);f=q+1|0;if((f|0)>=3)break;q=f;f=c[K+(f<<2)>>2]|0}r=r+1|0}while((r|0)<(c[b+812>>2]|0));f=c[b+1112>>2]|0}if((f|0)>1){c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;p=f+36|0;a[p>>0]=1;q=f+32|0;c[q>>2]=0;r=f+24|0;c[r>>2]=0;s=f+28|0;c[s>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;t=f+348|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;t=f;a[f+377>>0]=0;j=c[b+772>>2]|0;if((j|0)>0){c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[r>>2]|0;if((h|0)>0){f=0;do{c[i+(f<<2)>>2]=c[(c[q>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[q>>2]|0;if(f|0){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[q>>2]=0}a[p>>0]=1;c[q>>2]=i;c[s>>2]=j;f=c[b+772>>2]|0;if((f|0)>0){o=0;i=c[r>>2]|0;h=j;while(1){d=(c[E>>2]|0)+(o*104|0)|0;do if((i|0)==(h|0)){j=h|0?h<<1:1;if((h|0)>=(j|0)){j=h;break}if(!j)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[r>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[q>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[q>>2]|0;if(i){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[r>>2]|0}c[q>>2]=0}a[p>>0]=1;c[q>>2]=f;c[s>>2]=j;f=c[b+772>>2]|0}else{j=h;h=i}while(0);c[(c[q>>2]|0)+(h<<2)>>2]=d;i=h+1|0;c[r>>2]=i;o=o+1|0;if((o|0)>=(f|0))break;else h=j}}}f=c[b+1112>>2]|0;if((f|0)==(c[b+1116>>2]|0)?(I=f|0?f<<1:1,(f|0)<(I|0)):0){if(!I)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((I<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+1112>>2]|0}if((f|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+1120>>2]|0;if(h){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+1112>>2]|0}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=i;c[b+1116>>2]=I}c[(c[b+1120>>2]|0)+(f<<2)>>2]=t;I=f+1|0;c[b+1112>>2]=I;E=c[b+1120>>2]|0;f=E+(f<<2)|0;H=c[E>>2]|0;c[E>>2]=c[f>>2];c[f>>2]=H;f=I}if((f|0)>0){h=0;do{d=c[(c[b+1120>>2]|0)+(h<<2)>>2]|0;do if(!(c[d+24>>2]|0)){j=h+-1|0;f=c[d+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[d+52>>2]|0;if(f|0){if(a[d+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+52>>2]=0}a[d+56>>0]=1;c[d+52>>2]=0;c[d+44>>2]=0;c[d+48>>2]=0;f=c[d+32>>2]|0;if(f|0){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;f=c[d+12>>2]|0;if(f|0){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+1112>>2]|0;e:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(d|0))break e;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)<=(h|0)){h=j;break}H=c[b+1120>>2]|0;I=H+(h<<2)|0;h=c[I>>2]|0;c[I>>2]=c[H+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=h;c[b+1112>>2]=f+-1;h=j;f=f+-1|0}while(0);h=h+1|0}while((h|0)<(f|0))}if(!((e|0)==0|(u|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0)}if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}}else J=234}else J=234;f:do if((J|0)==234){d=c[b+832>>2]|0;if(d|0){if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+1112>>2]|0;if((i|0)>0){h=0;do{c[j+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+1120>>2]|0;if(h|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=j;c[b+1116>>2]=d;h=b+1120|0}else h=b+1120|0;do{c[(c[h>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+832>>2]|0)<=0)break;d=0;while(1){j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+840>>2]|0)+(d*104|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(r=h|0?h<<1:1,(h|0)<(r|0)):0){if(!r)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=r;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=4);d=d+1|0;if((d|0)>=(c[b+832>>2]|0))break f}}d=c[b+812>>2]|0;if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){if(d){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+1112>>2]|0;if((j|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[b+1120>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));j=b+1120|0}else j=b+1120|0}else{h=0;j=b+1120|0}i=c[j>>2]|0;if(i|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+1124>>0]=1;c[j>>2]=h;c[b+1116>>2]=d}do{c[(c[b+1120>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+812>>2]|0)>0){d=0;do{j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+820>>2]|0)+(d*44|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if(!s)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=s;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=3);d=d+1|0}while((d|0)<(c[b+812>>2]|0))}}while(0);f=c[b+1112>>2]|0;if(!f){b=0;l=K;return b|0}if((f|0)>0){p=0;do{q=c[(c[b+1120>>2]|0)+(p<<2)>>2]|0;g[q+128>>2]=0.0;o=c[q+24>>2]|0;d=c[q+4>>2]|0;if((o|0)>(d|0)){if((c[q+8>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc((o<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+4>>2]|0}j=c[q+12>>2]|0;if((i|0)<=0)if(!j)h=q+16|0;else J=324;else{h=0;do{c[f+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));J=324}if((J|0)==324){J=0;if(!(a[q+16>>0]|0))h=q+16|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=q+16|0}}a[h>>0]=1;c[q+12>>2]=f;c[q+8>>2]=o}else f=c[q+12>>2]|0;Yk(f+(d<<2)|0,0,o-d<<2|0)|0;d=c[q+24>>2]|0}else d=o;c[q+4>>2]=o;j=(d|0)>0;if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;do{k=+g[(c[h+(f<<2)>>2]|0)+88>>2];if(k==0.0){a[q+376>>0]=1;k=999999984306749440.0}else k=1.0/k;g[i+(f<<2)>>2]=k;m=k+ +g[q+128>>2];g[q+128>>2]=m;f=f+1|0}while((f|0)!=(d|0));g[q+128>>2]=1.0/m;f=0;k=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;A=+g[i+(f<<2)>>2];k=k+ +g[I+8>>2]*A;n=n+A*+g[I+12>>2];v=v+A*+g[I+16>>2];f=f+1|0}while((f|0)!=(d|0));m=1.0/m}else{m=1.0/+g[q+128>>2];g[q+128>>2]=m;v=0.0;n=0.0;k=0.0}A=k*m;z=n*m;y=v*m;g[q+228>>2]=A;g[q+232>>2]=z;g[q+236>>2]=y;g[q+240>>2]=0.0;f=q+316|0;h=f+36|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=q+132|0;h=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;k=0.0;x=0.0;w=0.0;m=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;O=+g[I+8>>2]-A;M=+g[I+12>>2]-z;N=+g[I+16>>2]-y;L=+g[i+(f<<2)>>2];k=k+L*(M*M+N*N);g[q+132>>2]=k;x=L*(O*O+N*N)+x;g[q+152>>2]=x;w=(O*O+M*M)*L+w;g[q+172>>2]=w;m=m-M*O*L;g[q+136>>2]=m;n=n-N*O*L;g[q+140>>2]=n;v=v-N*M*L;g[q+156>>2]=v;f=f+1|0}while((f|0)!=(d|0));f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0}else{f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0;x=0.0;w=0.0;v=0.0;n=0.0;m=0.0;k=0.0}L=x*w-v*v;M=v*n-w*m;N=v*m-x*n;O=1.0/(L*k+m*M+N*n);g[q+132>>2]=L*O;g[f>>2]=(v*n-w*m)*O;g[h>>2]=(v*m-x*n)*O;g[q+144>>2]=0.0;g[q+148>>2]=M*O;g[j>>2]=(w*k-n*n)*O;g[i>>2]=(m*n-v*k)*O;g[q+160>>2]=0.0;g[q+164>>2]=N*O;g[q+168>>2]=(n*m-v*k)*O;g[q+172>>2]=(x*k-m*m)*O;g[q+176>>2]=0.0;c[q+60>>2]=1065353216;c[q+64>>2]=0;c[q+64+4>>2]=0;c[q+64+8>>2]=0;c[q+64+12>>2]=0;c[q+80>>2]=1065353216;c[q+84>>2]=0;c[q+84+4>>2]=0;c[q+84+8>>2]=0;c[q+84+12>>2]=0;c[q+100>>2]=1065353216;c[q+104>>2]=0;c[q+108>>2]=c[q+228>>2];c[q+108+4>>2]=c[q+228+4>>2];c[q+108+8>>2]=c[q+228+8>>2];c[q+108+12>>2]=c[q+228+12>>2];d=c[q+24>>2]|0;j=c[q+44>>2]|0;if((j|0)<(d|0)){if((c[q+48>>2]|0)<(d|0)){if(!d){f=0;i=j}else{c[6995]=(c[6995]|0)+1;f=sc((d<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+44>>2]|0}if((i|0)>0){h=0;do{I=f+(h<<4)|0;H=(c[q+52>>2]|0)+(h<<4)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[q+52>>2]|0;if(h|0){if(a[q+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[q+52>>2]=0}a[q+56>>0]=1;c[q+52>>2]=f;c[q+48>>2]=d;h=q+52|0}else h=q+52|0;f=j;do{I=(c[h>>2]|0)+(f<<4)|0;c[I>>2]=c[K>>2];c[I+4>>2]=c[K+4>>2];c[I+8>>2]=c[K+8>>2];c[I+12>>2]=c[K+12>>2];f=f+1|0}while((f|0)!=(d|0))}c[q+44>>2]=d;if((d|0)>0){f=0;do{H=c[(c[q+32>>2]|0)+(f<<2)>>2]|0;N=+g[H+12>>2]-+g[q+232>>2];O=+g[H+16>>2]-+g[q+236>>2];I=c[q+52>>2]|0;g[I+(f<<4)>>2]=+g[H+8>>2]-+g[q+228>>2];g[I+(f<<4)+4>>2]=N;g[I+(f<<4)+8>>2]=O;g[I+(f<<4)+12>>2]=0.0;f=f+1|0}while((f|0)<(c[q+44>>2]|0))}p=p+1|0}while((p|0)<(c[b+1112>>2]|0))}Tc(b);f=c[b+1112>>2]|0;o=P(f,f)|0;d=c[b+1132>>2]|0;if((o|0)>(d|0)){if((c[b+1136>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc(o+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+1132>>2]|0}j=c[b+1140>>2]|0;if((i|0)<=0)if(!j)h=b+1144|0;else J=372;else{h=0;do{a[f+h>>0]=a[j+h>>0]|0;h=h+1|0}while((h|0)!=(i|0));J=372}if((J|0)==372)if(!(a[b+1144>>0]|0))h=b+1144|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+1144|0}a[h>>0]=1;c[b+1140>>2]=f;c[b+1136>>2]=o}else f=c[b+1140>>2]|0;Yk(f+d|0,0,o-d|0)|0;f=c[b+1112>>2]|0}c[b+1132>>2]=o;if((f|0)<=0){b=f;l=K;return b|0}e=c[b+1120>>2]|0;s=c[b+1140>>2]|0;r=0;do{t=c[e+(r<<2)>>2]|0;c[t+380>>2]=r;u=c[t+24>>2]|0;q=0;do{j=c[e+(q<<2)>>2]|0;g:do if((u|0)>0){d=c[j+24>>2]|0;h=0;while(1){if((d|0)>0){p=c[(c[t+32>>2]|0)+(h<<2)>>2]|0;o=c[j+32>>2]|0;i=0;do{if((p|0)==(c[o+(i<<2)>>2]|0)){h=1;break g}i=i+1|0}while((i|0)<(d|0))}h=h+1|0;if((h|0)>=(u|0)){h=0;break}}}else h=0;while(0);a[s+((P(f,q)|0)+r)>>0]=h;q=q+1|0}while((q|0)!=(f|0));r=r+1|0}while((r|0)!=(f|0));l=K;return f|0}function kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;ja=l;l=l+64|0;if((e|0)<=0){l=ja;return}$=ja+16+4|0;aa=ja+16+8|0;Y=0;do{ba=c[d+(Y<<2)>>2]|0;ca=c[ba+772>>2]|0;da=c[ba+776>>2]|0;ea=Rj(b,ca,+g[f+12>>2])|0;fa=Rj(b,da,+g[f+12>>2])|0;ga=c[b+16>>2]|0;O=+g[ga+(ea*244|0)+128>>2];P=+g[ga+(ea*244|0)+132>>2];U=+g[ga+(ea*244|0)+136>>2];if(!(O*O+P*P+U*U<1.4210854715202004e-14?(O=+g[ga+(fa*244|0)+128>>2],P=+g[ga+(fa*244|0)+132>>2],U=+g[ga+(fa*244|0)+136>>2],O*O+P*P+U*U<1.4210854715202004e-14):0))ia=5;if((ia|0)==5?(ia=0,ha=c[ba+780>>2]|0,(ha|0)>0):0){Z=0;h=ha;do{W=ba+4+(Z*192|0)|0;o=ba+4+(Z*192|0)+80|0;if(+g[o>>2]<=+g[ba+788>>2]){X=c[b+28>>2]|0;if((X|0)==(c[b+32>>2]|0)?(_=X|0?X<<1:1,(X|0)<(_|0)):0){if(!_){h=0;m=X}else{c[6995]=(c[6995]|0)+1;h=sc((_*152|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}m=c[b+28>>2]|0}if((m|0)>0){i=0;do{gi(h+(i*152|0)|0,(c[b+36>>2]|0)+(i*152|0)|0,152)|0;i=i+1|0}while((i|0)!=(m|0))}i=c[b+36>>2]|0;if(i|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=h;c[b+32>>2]=_;h=c[b+28>>2]|0}else h=X;c[b+28>>2]=h+1;V=c[b+36>>2]|0;c[V+(X*152|0)+144>>2]=ea;c[V+(X*152|0)+148>>2]=fa;c[V+(X*152|0)+132>>2]=W;y=+g[ba+4+(Z*192|0)+48>>2]-+g[ca+52>>2];z=+g[ba+4+(Z*192|0)+52>>2]-+g[ca+56>>2];x=+g[ba+4+(Z*192|0)+56>>2]-+g[ca+60>>2];g[ja+48>>2]=y;g[ja+48+4>>2]=z;g[ja+48+8>>2]=x;g[ja+48+12>>2]=0.0;F=+g[ba+4+(Z*192|0)+32>>2]-+g[da+52>>2];G=+g[ba+4+(Z*192|0)+36>>2]-+g[da+56>>2];B=+g[ba+4+(Z*192|0)+40>>2]-+g[da+60>>2];g[ja+32>>2]=F;g[ja+32+4>>2]=G;g[ja+32+8>>2]=B;g[ja+32+12>>2]=0.0;if(!(c[ga+(ea*244|0)+240>>2]|0)){j=0.0;n=0.0;s=0.0}else{U=+g[ga+(ea*244|0)+192>>2]+ +g[ga+(ea*244|0)+224>>2];s=+g[ga+(ea*244|0)+196>>2]+ +g[ga+(ea*244|0)+228>>2];n=+g[ga+(ea*244|0)+200>>2]+ +g[ga+(ea*244|0)+232>>2];j=+g[ga+(ea*244|0)+176>>2]+ +g[ga+(ea*244|0)+208>>2]+(s*x-n*z);n=+g[ga+(ea*244|0)+180>>2]+ +g[ga+(ea*244|0)+212>>2]+(n*y-U*x);s=+g[ga+(ea*244|0)+184>>2]+ +g[ga+(ea*244|0)+216>>2]+(U*z-s*y)}if(!(c[ga+(fa*244|0)+240>>2]|0)){k=0.0;r=0.0;t=0.0}else{U=+g[ga+(fa*244|0)+192>>2]+ +g[ga+(fa*244|0)+224>>2];t=+g[ga+(fa*244|0)+196>>2]+ +g[ga+(fa*244|0)+228>>2];r=+g[ga+(fa*244|0)+200>>2]+ +g[ga+(fa*244|0)+232>>2];k=+g[ga+(fa*244|0)+176>>2]+ +g[ga+(fa*244|0)+208>>2]+(t*B-r*G);r=+g[ga+(fa*244|0)+180>>2]+ +g[ga+(fa*244|0)+212>>2]+(r*F-U*B);t=+g[ga+(fa*244|0)+184>>2]+ +g[ga+(fa*244|0)+216>>2]+(U*G-t*F)}P=j-k;O=n-r;K=s-t;Q=ba+4+(Z*192|0)+64|0;L=+g[Q>>2];R=ba+4+(Z*192|0)+68|0;M=+g[R>>2];S=ba+4+(Z*192|0)+72|0;N=+g[S>>2];p=c[b+16>>2]|0;i=c[p+(ea*244|0)+240>>2]|0;m=c[p+(fa*244|0)+240>>2]|0;U=+g[f+28>>2];J=+g[f+12>>2];j=+g[f+40>>2];k=+g[f+36>>2];T=ba+4+(Z*192|0)+120|0;h=c[T>>2]|0;if(!(h&6))if(!(h&8))I=k;else{I=J*+g[ba+4+(Z*192|0)+144>>2];j=I+ +g[ba+4+(Z*192|0)+148>>2];j=j<1.1920928955078125e-07?1.1920928955078125e-07:j;I=I/j;j=1.0/j}else{j=(h&2|0)==0?j:+g[ba+4+(Z*192|0)+144>>2];if(!(h&4))I=k;else I=+g[ba+4+(Z*192|0)+148>>2]}H=1.0/J*j;if(i|0){j=((z*N-x*M)*+g[i+324>>2]+(x*L-N*y)*+g[i+328>>2]+(M*y-z*L)*+g[i+332>>2])*+g[i+604>>2];k=((z*N-x*M)*+g[i+340>>2]+(x*L-N*y)*+g[i+344>>2]+(M*y-z*L)*+g[i+348>>2])*+g[i+608>>2];n=((z*N-x*M)*+g[i+356>>2]+(x*L-N*y)*+g[i+360>>2]+(M*y-z*L)*+g[i+364>>2])*+g[i+612>>2]}else{j=0.0;k=0.0;n=0.0}g[V+(X*152|0)+64>>2]=j;g[V+(X*152|0)+68>>2]=k;g[V+(X*152|0)+72>>2]=n;g[V+(X*152|0)+76>>2]=0.0;u=+g[S>>2];v=+g[R>>2];w=+g[Q>>2];if(m|0){r=(+g[m+324>>2]*-(G*u-B*v)+ +g[m+328>>2]*-(B*w-u*F)+ +g[m+332>>2]*-(v*F-G*w))*+g[m+604>>2];s=(+g[m+340>>2]*-(G*u-B*v)+ +g[m+344>>2]*-(B*w-u*F)+ +g[m+348>>2]*-(v*F-G*w))*+g[m+608>>2];t=(+g[m+356>>2]*-(G*u-B*v)+ +g[m+360>>2]*-(B*w-u*F)+ +g[m+364>>2]*-(v*F-G*w))*+g[m+612>>2]}else{r=0.0;s=0.0;t=0.0}g[V+(X*152|0)+80>>2]=r;g[V+(X*152|0)+84>>2]=s;g[V+(X*152|0)+88>>2]=t;g[V+(X*152|0)+92>>2]=0.0;if(i|0)k=+g[i+404>>2]+((k*x-n*z)*+g[Q>>2]+(n*y-x*j)*+g[R>>2]+(z*j-k*y)*+g[S>>2]);else k=0.0;if(m|0){E=-r;j=-s;t=-t;j=+g[m+404>>2]+((B*j-G*t)*+g[Q>>2]+(F*t-B*E)*+g[R>>2]+(G*E-F*j)*+g[S>>2])}else j=0.0;g[V+(X*152|0)+108>>2]=U/(H+(k+j));if(i|0){c[V+(X*152|0)+16>>2]=c[Q>>2];c[V+(X*152|0)+16+4>>2]=c[Q+4>>2];c[V+(X*152|0)+16+8>>2]=c[Q+8>>2];c[V+(X*152|0)+16+12>>2]=c[Q+12>>2];g[V+(X*152|0)>>2]=z*N-x*M;g[V+(X*152|0)+4>>2]=x*L-N*y;g[V+(X*152|0)+8>>2]=M*y-z*L;g[V+(X*152|0)+12>>2]=0.0}else{c[V+(X*152|0)>>2]=0;c[V+(X*152|0)+4>>2]=0;c[V+(X*152|0)+8>>2]=0;c[V+(X*152|0)+12>>2]=0;c[V+(X*152|0)+16>>2]=0;c[V+(X*152|0)+20>>2]=0;c[V+(X*152|0)+24>>2]=0;c[V+(X*152|0)+28>>2]=0}if(m|0){t=-+g[R>>2];E=-+g[S>>2];g[V+(X*152|0)+48>>2]=-+g[Q>>2];g[V+(X*152|0)+52>>2]=t;g[V+(X*152|0)+56>>2]=E;g[V+(X*152|0)+60>>2]=0.0;g[V+(X*152|0)+32>>2]=-(G*u-B*v);g[V+(X*152|0)+36>>2]=-(B*w-u*F);g[V+(X*152|0)+40>>2]=-(v*F-G*w);g[V+(X*152|0)+44>>2]=0.0}else{c[V+(X*152|0)+32>>2]=0;c[V+(X*152|0)+32+4>>2]=0;c[V+(X*152|0)+32+8>>2]=0;c[V+(X*152|0)+32+12>>2]=0;c[V+(X*152|0)+32+16>>2]=0;c[V+(X*152|0)+32+20>>2]=0;c[V+(X*152|0)+32+24>>2]=0;c[V+(X*152|0)+32+28>>2]=0}E=+g[o>>2]+ +g[f+64>>2];if(i|0){r=+g[i+392>>2];s=+g[i+396>>2];w=+g[i+388>>2];t=r*x-s*z+ +g[i+372>>2];s=+g[i+376>>2]+(s*y-x*w);r=z*w-r*y+ +g[i+380>>2]}else{t=0.0;s=0.0;r=0.0}if(m|0){j=+g[m+392>>2];k=+g[m+396>>2];z=+g[m+388>>2];n=j*B-k*G+ +g[m+372>>2];k=+g[m+376>>2]+(k*F-B*z);j=G*z-j*F+ +g[m+380>>2]}else{n=0.0;k=0.0;j=0.0}B=(t-n)*+g[Q>>2]+(s-k)*+g[R>>2]+(r-j)*+g[S>>2];c[V+(X*152|0)+104>>2]=c[ba+4+(Z*192|0)+84>>2];h=+C(+B)<+g[f+96>>2];B=h?0.0:-(B*+g[ba+4+(Z*192|0)+96>>2]);B=B<=0.0?0.0:B;h=c[f+72>>2]|0;do if(!(h&4))g[V+(X*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+124>>2]*+g[f+68>>2];g[V+(X*152|0)+100>>2]=j;do if(i|0){if(!(c[p+(ea*244|0)+240>>2]|0))break;G=j*+g[V+(X*152|0)+20>>2]*+g[p+(ea*244|0)+132>>2]*+g[i+412>>2]*+g[p+(ea*244|0)+116>>2];F=j*+g[V+(X*152|0)+24>>2]*+g[p+(ea*244|0)+136>>2]*+g[i+416>>2]*+g[p+(ea*244|0)+120>>2];g[p+(ea*244|0)+64>>2]=+g[p+(ea*244|0)+112>>2]*j*+g[V+(X*152|0)+16>>2]*+g[p+(ea*244|0)+128>>2]*+g[i+408>>2]+ +g[p+(ea*244|0)+64>>2];g[p+(ea*244|0)+68>>2]=G+ +g[p+(ea*244|0)+68>>2];g[p+(ea*244|0)+72>>2]=F+ +g[p+(ea*244|0)+72>>2];F=j*+g[p+(ea*244|0)+100>>2]*+g[V+(X*152|0)+68>>2];G=j*+g[p+(ea*244|0)+104>>2]*+g[V+(X*152|0)+72>>2];g[p+(ea*244|0)+80>>2]=j*+g[p+(ea*244|0)+96>>2]*+g[V+(X*152|0)+64>>2]+ +g[p+(ea*244|0)+80>>2];g[p+(ea*244|0)+84>>2]=F+ +g[p+(ea*244|0)+84>>2];g[p+(ea*244|0)+88>>2]=G+ +g[p+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[V+(X*152|0)+100>>2];if(!(c[p+(fa*244|0)+240>>2]|0))break;G=+g[V+(X*152|0)+88>>2];F=+g[V+(X*152|0)+84>>2];z=+g[V+(X*152|0)+80>>2];x=j*+g[V+(X*152|0)+52>>2]*+g[p+(fa*244|0)+132>>2]*+g[m+412>>2]*+g[p+(fa*244|0)+116>>2];y=j*+g[V+(X*152|0)+56>>2]*+g[p+(fa*244|0)+136>>2]*+g[m+416>>2]*+g[p+(fa*244|0)+120>>2];g[p+(fa*244|0)+64>>2]=+g[p+(fa*244|0)+112>>2]*j*+g[V+(X*152|0)+48>>2]*+g[p+(fa*244|0)+128>>2]*+g[m+408>>2]+ +g[p+(fa*244|0)+64>>2];g[p+(fa*244|0)+68>>2]=x+ +g[p+(fa*244|0)+68>>2];g[p+(fa*244|0)+72>>2]=y+ +g[p+(fa*244|0)+72>>2];F=F*+g[p+(fa*244|0)+100>>2]*-j;G=G*+g[p+(fa*244|0)+104>>2]*-j;g[p+(fa*244|0)+80>>2]=+g[p+(fa*244|0)+80>>2]-z*+g[p+(fa*244|0)+96>>2]*-j;g[p+(fa*244|0)+84>>2]=+g[p+(fa*244|0)+84>>2]-F;g[p+(fa*244|0)+88>>2]=+g[p+(fa*244|0)+88>>2]-G}while(0);g[V+(X*152|0)+96>>2]=0.0;if(!(c[p+(ea*244|0)+240>>2]|0)){j=0.0;k=0.0;n=0.0;r=0.0;s=0.0;t=0.0}else{j=+g[p+(ea*244|0)+208>>2];k=+g[p+(ea*244|0)+212>>2];n=+g[p+(ea*244|0)+216>>2];r=+g[p+(ea*244|0)+224>>2];s=+g[p+(ea*244|0)+228>>2];t=+g[p+(ea*244|0)+232>>2]}if(!(c[p+(fa*244|0)+240>>2]|0)){u=0.0;v=0.0;w=0.0;x=0.0;y=0.0;z=0.0}else{u=+g[p+(fa*244|0)+208>>2];v=+g[p+(fa*244|0)+212>>2];w=+g[p+(fa*244|0)+216>>2];x=+g[p+(fa*244|0)+224>>2];y=+g[p+(fa*244|0)+228>>2];z=+g[p+(fa*244|0)+232>>2]}j=B-((j+ +g[p+(ea*244|0)+176>>2])*+g[V+(X*152|0)+16>>2]+(k+ +g[p+(ea*244|0)+180>>2])*+g[V+(X*152|0)+20>>2]+(n+ +g[p+(ea*244|0)+184>>2])*+g[V+(X*152|0)+24>>2]+((r+ +g[p+(ea*244|0)+192>>2])*+g[V+(X*152|0)>>2]+(s+ +g[p+(ea*244|0)+196>>2])*+g[V+(X*152|0)+4>>2]+(t+ +g[p+(ea*244|0)+200>>2])*+g[V+(X*152|0)+8>>2])+((u+ +g[p+(fa*244|0)+176>>2])*+g[V+(X*152|0)+48>>2]+(v+ +g[p+(fa*244|0)+180>>2])*+g[V+(X*152|0)+52>>2]+(w+ +g[p+(fa*244|0)+184>>2])*+g[V+(X*152|0)+56>>2]+((x+ +g[p+(fa*244|0)+192>>2])*+g[V+(X*152|0)+32>>2]+(y+ +g[p+(fa*244|0)+196>>2])*+g[V+(X*152|0)+36>>2]+(z+ +g[p+(fa*244|0)+200>>2])*+g[V+(X*152|0)+40>>2])));if(E>0.0){k=j-1.0/J*E;j=0.0}else{k=j;j=-(1.0/J*I*E)}J=+g[V+(X*152|0)+108>>2];I=j*J;G=k*J;m=(c[f+52>>2]|0)==0?1:E>+g[f+56>>2];g[V+(X*152|0)+112>>2]=m?I+G:G;g[V+(X*152|0)+128>>2]=m?0.0:I;g[V+(X*152|0)+116>>2]=H*J;g[V+(X*152|0)+120>>2]=0.0;g[V+(X*152|0)+124>>2]=1.0e10;c[V+(X*152|0)+140>>2]=c[b+68>>2];m=ba+4+(Z*192|0)+88|0;if(+g[m>>2]>0.0){Md(b,Q,ea,fa,X,+g[ba+4+(Z*192|0)+92>>2]);j=+g[S>>2];if(+C(+j)>.7071067690849304){I=+g[R>>2];H=1.0/+D(+(j*j+I*I));g[ja+16>>2]=0.0;g[$>>2]=-(H*j);g[aa>>2]=H*I;g[ja>>2]=(j*j+I*I)*H;J=+g[Q>>2];g[ja+4>>2]=-(H*I*J);u=J*-(H*j);k=0.0;n=-(H*j);r=H*I;s=(j*j+I*I)*H;j=-(H*I*J)}else{s=+g[Q>>2];I=+g[R>>2];J=1.0/+D(+(s*s+I*I));g[ja+16>>2]=-(I*J);g[$>>2]=J*s;g[aa>>2]=0.0;g[ja>>2]=-(J*s*j);g[ja+4>>2]=j*-(I*J);u=(s*s+I*I)*J;k=-(I*J);n=J*s;r=0.0;s=-(J*s*j);j=j*-(I*J)}t=1.0/+D(+(k*k+n*n+r*r));v=k*t;g[ja+16>>2]=v;w=n*t;g[$>>2]=w;t=r*t;g[aa>>2]=t;J=1.0/+D(+(s*s+j*j+u*u));n=s*J;g[ja>>2]=n;k=j*J;g[ja+4>>2]=k;j=u*J;g[ja+8>>2]=j;h=(c[ca+180>>2]&2|0)==0;if(h){r=v;s=w}else{y=+g[ca+4>>2];B=+g[ca+20>>2];F=+g[ca+36>>2];z=+g[ca+8>>2];E=+g[ca+24>>2];H=+g[ca+40>>2];r=+g[ca+12>>2];s=+g[ca+28>>2];J=+g[ca+44>>2];G=(y*v+B*w+F*t)*+g[ca+164>>2];I=(v*z+w*E+t*H)*+g[ca+168>>2];t=(v*r+w*s+t*J)*+g[ca+172>>2];g[ja+16>>2]=y*G+z*I+r*t;g[$>>2]=B*G+E*I+s*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=y*G+z*I+r*t;s=B*G+E*I+s*t;t=F*G+H*I+J*t}i=(c[da+180>>2]&2|0)==0;if(!i){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*r+z*s+F*t)*+g[da+164>>2];I=(r*x+s*B+t*H)*+g[da+168>>2];t=(r*y+s*E+t*J)*+g[da+172>>2];g[ja+16>>2]=w*G+x*I+y*t;g[$>>2]=z*G+B*I+E*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=w*G+x*I+y*t;s=z*G+B*I+E*t;t=F*G+H*I+J*t}if(!((ca|0)==0|h)){w=+g[ca+4>>2];z=+g[ca+20>>2];F=+g[ca+36>>2];x=+g[ca+8>>2];B=+g[ca+24>>2];H=+g[ca+40>>2];y=+g[ca+12>>2];E=+g[ca+28>>2];J=+g[ca+44>>2];G=(w*n+z*k+F*j)*+g[ca+164>>2];I=(n*x+k*B+j*H)*+g[ca+168>>2];j=(n*y+k*E+j*J)*+g[ca+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(!((da|0)==0|i)){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*n+z*k+F*j)*+g[da+164>>2];I=(n*x+k*B+j*H)*+g[da+168>>2];j=(n*y+k*E+j*J)*+g[da+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(+D(+(r*r+s*s+t*t))>.001)Md(b,ja+16|0,ea,fa,X,+g[m>>2]);if(+D(+(n*n+k*k+j*j))>.001)Md(b,ja,ea,fa,X,+g[m>>2]);h=c[f+72>>2]|0}do if(!(h&32))ia=82;else{if(!(c[T>>2]&1)){ia=82;break}h=ba+4+(Z*192|0)+152|0;ed(b,ba+4+(Z*192|0)+160|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+136>>2],+g[h>>2]);if(!(c[f+72>>2]&16))break;ed(b,ba+4+(Z*192|0)+176|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+140>>2],+g[h>>2])}while(0);do if((ia|0)==82){ia=0;j=+g[Q>>2];v=+g[R>>2];u=+g[S>>2];k=P-(P*L+O*M+K*N)*j;s=O-(P*L+O*M+K*N)*v;r=K-(P*L+O*M+K*N)*u;A=ba+4+(Z*192|0)+160|0;g[ba+4+(Z*192|0)+160>>2]=k;h=ba+4+(Z*192|0)+164|0;g[h>>2]=s;p=ba+4+(Z*192|0)+168|0;g[p>>2]=r;q=ba+4+(Z*192|0)+172|0;g[q>>2]=0.0;if((c[f+72>>2]&64|0)==0?k*k+s*s+r*r>1.1920928955078125e-07:0){j=1.0/+D(+(k*k+s*s+r*r));g[A>>2]=k*j;g[h>>2]=j*s;g[p>>2]=j*r;do if(!ca){n=k*j;k=j*s;j=j*r}else{if(!(c[ca+180>>2]&1)){n=k*j;k=j*s;j=j*r;break}G=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];H=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];n=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(G*k*j+I*j*s+j*r*L)*+g[ca+164>>2];O=(k*j*H+j*s*J+j*r*N)*+g[ca+168>>2];j=(k*j*n+j*s*K+j*r*P)*+g[ca+172>>2];g[A>>2]=G*M+H*O+n*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=G*M+H*O+n*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);if(!(c[f+72>>2]&16))break;O=+g[h>>2];n=+g[S>>2];L=+g[p>>2];M=+g[R>>2];P=+g[Q>>2];N=+g[A>>2];o=ba+4+(Z*192|0)+176|0;g[ba+4+(Z*192|0)+176>>2]=O*n-L*M;h=ba+4+(Z*192|0)+180|0;i=ba+4+(Z*192|0)+184|0;m=ba+4+(Z*192|0)+188|0;g[m>>2]=0.0;k=1.0/+D(+((O*n-L*M)*(O*n-L*M)+(L*P-n*N)*(L*P-n*N)+(M*N-O*P)*(M*N-O*P)));j=(O*n-L*M)*k;g[o>>2]=j;n=(L*P-n*N)*k;g[h>>2]=n;k=(M*N-O*P)*k;g[i>>2]=k;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*j+I*n+k*L)*+g[ca+164>>2];O=(j*G+n*J+k*N)*+g[ca+168>>2];k=(j*H+n*K+k*P)*+g[ca+172>>2];g[o>>2]=F*M+G*O+H*k;g[h>>2]=I*M+J*O+K*k;g[i>>2]=L*M+N*O+P*k;g[m>>2]=0.0;j=F*M+G*O+H*k;n=I*M+J*O+K*k;k=L*M+N*O+P*k}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*j+H*n+K*k)*+g[da+164>>2];N=(j*F+n*I+k*M)*+g[da+168>>2];P=(j*G+n*J+k*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[m>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);break}o=ba+4+(Z*192|0)+176|0;if(+C(+u)>.7071067690849304){P=1.0/+D(+(u*u+v*v));g[A>>2]=0.0;g[h>>2]=-(P*u);g[p>>2]=P*v;s=-(P*v*j);t=j*-(P*u);r=(u*u+v*v)*P;n=0.0;k=-(P*u);j=P*v}else{k=1.0/+D(+(j*j+v*v));g[A>>2]=-(v*k);g[h>>2]=k*j;g[p>>2]=0.0;s=u*-(v*k);t=(j*j+v*v)*k;r=-(k*j*u);n=-(v*k);k=k*j;j=0.0}g[o>>2]=r;m=ba+4+(Z*192|0)+180|0;g[m>>2]=s;i=ba+4+(Z*192|0)+184|0;g[i>>2]=t;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*n+I*k+L*j)*+g[ca+164>>2];O=(n*G+k*J+j*N)*+g[ca+168>>2];j=(n*H+k*K+j*P)*+g[ca+172>>2];g[A>>2]=F*M+G*O+H*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=F*M+G*O+H*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0;if(h&16){do if(ca|0){if(!(c[ca+180>>2]&1))break;E=+g[ca+4>>2];z=+g[o>>2];H=+g[ca+20>>2];B=+g[m>>2];K=+g[ca+36>>2];P=+g[i>>2];F=+g[ca+8>>2];I=+g[ca+24>>2];M=+g[ca+40>>2];G=+g[ca+12>>2];J=+g[ca+28>>2];O=+g[ca+44>>2];L=(E*z+H*B+K*P)*+g[ca+164>>2];N=(z*F+B*I+P*M)*+g[ca+168>>2];P=(z*G+B*J+P*O)*+g[ca+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];z=+g[o>>2];H=+g[da+20>>2];B=+g[m>>2];K=+g[da+36>>2];P=+g[i>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*z+H*B+K*P)*+g[da+164>>2];N=(z*F+B*I+P*M)*+g[da+168>>2];P=(z*G+B*J+P*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0}if((h&80|0)!=80)break;c[T>>2]=c[T>>2]|1}while(0);q=c[b+16>>2]|0;i=c[q+(ea*244|0)+240>>2]|0;m=c[q+(fa*244|0)+240>>2]|0;o=c[V+(X*152|0)+140>>2]|0;p=c[b+76>>2]|0;h=c[f+72>>2]|0;do if(!(h&4))g[p+(o*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+128>>2]*+g[f+68>>2];g[p+(o*152|0)+100>>2]=j;if(i|0){O=+g[i+404>>2];U=j*O*+g[p+(o*152|0)+20>>2]*+g[i+412>>2]*+g[q+(ea*244|0)+116>>2];P=j*O*+g[p+(o*152|0)+24>>2]*+g[i+416>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*j*O*+g[p+(o*152|0)+16>>2]*+g[i+408>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=j*+g[q+(ea*244|0)+100>>2]*+g[p+(o*152|0)+68>>2];U=j*+g[q+(ea*244|0)+104>>2]*+g[p+(o*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=j*+g[q+(ea*244|0)+96>>2]*+g[p+(o*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}if(!m)break;j=+g[m+404>>2];k=+g[p+(o*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+(o*152|0)+88>>2];P=+g[p+(o*152|0)+84>>2];O=+g[p+(o*152|0)+80>>2];M=k*j*+g[p+(o*152|0)+52>>2]*+g[m+412>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+(o*152|0)+56>>2]*+g[m+416>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+(o*152|0)+48>>2]*+g[m+408>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);do if(h&16|0){if(!(h&4)){g[p+((o+1|0)*152|0)+100>>2]=0.0;break}k=+g[ba+4+(Z*192|0)+132>>2]*+g[f+68>>2];g[p+((o+1|0)*152|0)+100>>2]=k;do if(i|0){j=+g[i+404>>2];if(!(c[q+(ea*244|0)+240>>2]|0))break;U=k*j*+g[p+((o+1|0)*152|0)+20>>2]*+g[q+(ea*244|0)+116>>2];P=k*j*+g[p+((o+1|0)*152|0)+24>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+16>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=k*+g[q+(ea*244|0)+100>>2]*+g[p+((o+1|0)*152|0)+68>>2];U=k*+g[q+(ea*244|0)+104>>2]*+g[p+((o+1|0)*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=k*+g[q+(ea*244|0)+96>>2]*+g[p+((o+1|0)*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[m+404>>2];k=+g[p+((o+1|0)*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+((o+1|0)*152|0)+88>>2];P=+g[p+((o+1|0)*152|0)+84>>2];O=+g[p+((o+1|0)*152|0)+80>>2];M=k*j*+g[p+((o+1|0)*152|0)+52>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+((o+1|0)*152|0)+56>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+48>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);h=c[ba+780>>2]|0}Z=Z+1|0}while((Z|0)<(h|0))}Y=Y+1|0}while((Y|0)!=(e|0));l=ja;return}function lc(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=l;l=l+80|0;bf(b,e,f)|0;a[A+16>>0]=1;c[A+12>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;a[A+36>>0]=1;c[A+32>>2]=0;c[A+24>>2]=0;c[A+28>>2]=0;a[A+56>>0]=1;c[A+52>>2]=0;c[A+44>>2]=0;c[A+48>>2]=0;a[A+76>>0]=1;c[A+72>>2]=0;c[A+64>>2]=0;c[A+68>>2]=0;y=c[b+932>>2]|0;c[e+300>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+928|0)|0;c[e+268>>2]=y;if(y|0){i=c[e+300>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;if((i|0)>0){g=c[m+8>>2]|0;h=0;while(1){j=c[(c[b+940>>2]|0)+(h<<2)>>2]|0;if(!j)k=0;else k=zb[c[(c[f>>2]|0)+28>>2]&31](f,j)|0;c[g>>2]=k;if(!(zb[c[(c[f>>2]|0)+24>>2]&31](f,j)|0)){y=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,1)|0;t=c[y+8>>2]|0;c[t+12>>2]=c[j+16>>2];c[t+4>>2]=c[j+8>>2];c[t>>2]=c[j+4>>2];c[t+8>>2]=c[j+12>>2];Zb[c[(c[f>>2]|0)+20>>2]&31](f,y,11010,1414349395,j)}h=h+1|0;if((h|0)>=(i|0)){g=f;break}else g=g+4|0}}else g=f;Zb[c[(c[g>>2]|0)+20>>2]&31](f,m,11010,1497453121,b+928|0)}}else c[e+268>>2]=0;y=c[b+772>>2]|0;c[e+304>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+768|0)|0;c[e+272>>2]=y;if(y|0){s=c[e+304>>2]|0;t=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,s)|0;if((s|0)>0){q=0;r=c[t+8>>2]|0;while(1){h=c[b+780>>2]|0;c[r+52>>2]=c[h+(q*104|0)+56>>2];c[r+56>>2]=c[h+(q*104|0)+60>>2];c[r+60>>2]=c[h+(q*104|0)+64>>2];c[r+64>>2]=c[h+(q*104|0)+68>>2];c[r+88>>2]=c[h+(q*104|0)+92>>2];c[r+92>>2]=(a[h+(q*104|0)+100>>0]<<7&255)<<24>>24>>7<<24>>24;c[r+84>>2]=c[h+(q*104|0)+88>>2];g=c[h+(q*104|0)+4>>2]|0;if(!g){i=0;g=h}else{i=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;g=c[b+780>>2]|0}c[r>>2]=i;c[r+68>>2]=c[g+(q*104|0)+72>>2];c[r+72>>2]=c[g+(q*104|0)+76>>2];c[r+76>>2]=c[g+(q*104|0)+80>>2];c[r+80>>2]=c[g+(q*104|0)+84>>2];c[r+4>>2]=c[g+(q*104|0)+8>>2];c[r+8>>2]=c[g+(q*104|0)+12>>2];c[r+12>>2]=c[g+(q*104|0)+16>>2];c[r+16>>2]=c[g+(q*104|0)+20>>2];c[r+20>>2]=c[g+(q*104|0)+24>>2];c[r+24>>2]=c[g+(q*104|0)+28>>2];c[r+28>>2]=c[g+(q*104|0)+32>>2];c[r+32>>2]=c[g+(q*104|0)+36>>2];c[r+36>>2]=c[g+(q*104|0)+40>>2];c[r+40>>2]=c[g+(q*104|0)+44>>2];c[r+44>>2]=c[g+(q*104|0)+48>>2];c[r+48>>2]=c[g+(q*104|0)+52>>2];m=(c[b+780>>2]|0)+(q*104|0)|0;p=((m+~(m<<15)|0)>>>10^m+~(m<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);n=c[A+48>>2]|0;a:do if((p&n+-1)>>>0<(c[A+4>>2]|0)>>>0?(u=c[(c[A+12>>2]|0)+((p&n+-1)<<2)>>2]|0,(u|0)!=-1):0){h=c[A+72>>2]|0;i=c[A+32>>2]|0;g=u;while(1){if((m|0)==(c[h+(g<<3)>>2]|0))break;g=c[i+(g<<2)>>2]|0;if((g|0)==-1){z=27;break a}}h=q;i=c[A+52>>2]|0}else z=27;while(0);if((z|0)==27){z=0;h=c[A+44>>2]|0;if((h|0)==(n|0)){g=n|0?n<<1:1;if((n|0)<(g|0)){if((g|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((g<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;k=v+4+15&-16}else k=0;j=c[A+52>>2]|0;if((n|0)<=0)if(!j)i=n;else z=35;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(n|0));z=35}if((z|0)==35){z=0;if(a[A+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[A+52>>2]=0;i=c[A+44>>2]|0}a[A+56>>0]=1;c[A+52>>2]=k;c[A+48>>2]=g}else{g=n;i=n}}else{g=n;i=h}c[(c[A+52>>2]|0)+(i<<2)>>2]=q;c[A+44>>2]=i+1;i=c[A+64>>2]|0;if((i|0)==(c[A+68>>2]|0)?(w=i|0?i<<1:1,(i|0)<(w|0)):0){if((w|0)!=0?(c[6995]=(c[6995]|0)+1,x=sc((w<<3|3)+16|0)|0,(x|0)!=0):0){c[(x+4+15&-16)+-4>>2]=x;j=x+4+15&-16}else j=0;if((i|0)>0){g=0;do{k=(c[A+72>>2]|0)+(g<<3)|0;o=c[k+4>>2]|0;y=j+(g<<3)|0;c[y>>2]=c[k>>2];c[y+4>>2]=o;g=g+1|0}while((g|0)!=(i|0))}g=c[A+72>>2]|0;if(g|0){if(a[A+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[A+72>>2]=0}a[A+76>>0]=1;c[A+72>>2]=j;c[A+68>>2]=w;i=c[A+64>>2]|0;g=c[A+48>>2]|0}c[(c[A+72>>2]|0)+(i<<3)>>2]=m;c[A+64>>2]=i+1;if((n|0)<(g|0)){o=c[A+4>>2]|0;do if((o|0)<(g|0)){if((c[A+8>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((g<<2|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+12>>2]|0;if((o|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(o|0));if(a[A+16>>0]|0)z=62}else if(!((k|0)==0|(a[A+16>>0]|0)==0))z=62;if((z|0)==62){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+16>>0]=1;c[A+12>>2]=i;c[A+8>>2]=g}else i=c[A+12>>2]|0;n=g<<2;Yk(i+(o<<2)|0,0,n-(o<<2)|0)|0;c[A+4>>2]=g;m=c[A+24>>2]|0;if((m|0)<(g|0)){if((c[A+28>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((n|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+32>>2]|0;if((m|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(m|0));if(a[A+36>>0]|0)z=74}else if(!((k|0)==0|(a[A+36>>0]|0)==0))z=74;if((z|0)==74){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+36>>0]=1;c[A+32>>2]=i;c[A+28>>2]=g}else i=c[A+32>>2]|0;Yk(i+(m<<2)|0,0,n-(m<<2)|0)|0}c[A+24>>2]=g;if((g|0)>0){Yk(c[A+12>>2]|0,-1,n|0)|0;Yk(c[A+32>>2]|0,-1,n|0)|0}if((o|0)<=0){g=c[A+48>>2]|0;break}j=c[A+72>>2]|0;k=c[A+12>>2]|0;m=c[A+32>>2]|0;g=c[A+48>>2]|0;i=0;do{y=c[j+(i<<3)>>2]|0;y=((y+~(y<<15)|0)>>>10^y+~(y<<15))*9|0;y=k+(((((y>>>6^y)+~((y>>>6^y)<<11)|0)>>>16^(y>>>6^y)+~((y>>>6^y)<<11))&g+-1)<<2)|0;c[m+(i<<2)>>2]=c[y>>2];c[y>>2]=i;i=i+1|0}while((i|0)!=(o|0))}while(0);g=p&g+-1}else g=p&n+-1;i=c[A+12>>2]|0;c[(c[A+32>>2]|0)+(h<<2)>>2]=c[i+(g<<2)>>2]}c[i+(g<<2)>>2]=h;q=q+1|0;if((q|0)>=(s|0))break;else r=r+100|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,t,11031,1145979475,b+768|0)}}else c[e+272>>2]=0;y=c[b+792>>2]|0;c[e+308>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+800>>2]|0)|0;c[e+276>>2]=y;if(y|0){m=c[e+308>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,m)|0;if((m|0)>0){i=c[b+800>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j+16>>2]=(a[i+(k*52|0)+36>>0]<<7&255)<<24>>24>>7<<24>>24;h=c[i+(k*52|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+800>>2]|0;g=i}c[j>>2]=h;h=c[i+(k*52|0)+24>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+4>>2]=h;h=c[i+(k*52|0)+28>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+8>>2]=h;c[j+12>>2]=c[i+(k*52|0)+32>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+20|0}}else g=c[b+800>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11048,1497453121,g)}}else c[e+276>>2]=0;y=c[b+812>>2]|0;c[e+312>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+820>>2]|0)|0;c[e+280>>2]=y;if(y|0){m=c[e+312>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,36,m)|0;if((m|0)>0){i=c[b+820>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){h=c[i+(k*44|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+820>>2]|0;g=i}c[j+16>>2]=h;c[j>>2]=c[i+(k*44|0)+20>>2];c[j+4>>2]=c[i+(k*44|0)+24>>2];c[j+8>>2]=c[i+(k*44|0)+28>>2];c[j+12>>2]=c[i+(k*44|0)+32>>2];h=c[i+(k*44|0)+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+20>>2]=h;h=c[i+(k*44|0)+12>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+24>>2]=h;h=c[i+(k*44|0)+16>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+28>>2]=h;c[j+32>>2]=c[i+(k*44|0)+36>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+36|0}}else g=c[b+820>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11065,1497453121,g)}}else c[e+280>>2]=0;y=c[b+832>>2]|0;c[e+316>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+840>>2]|0)|0;c[e+284>>2]=y;if(y|0){m=c[e+316>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,m)|0;if((m|0)>0){i=c[b+840>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j>>2]=c[i+(k*104|0)+32>>2];c[j+4>>2]=c[i+(k*104|0)+36>>2];c[j+8>>2]=c[i+(k*104|0)+40>>2];c[j+12>>2]=c[i+(k*104|0)+44>>2];h=c[i+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+68>>2]=h;c[j+16>>2]=c[i+(k*104|0)+48>>2];c[j+20>>2]=c[i+(k*104|0)+52>>2];c[j+24>>2]=c[i+(k*104|0)+56>>2];c[j+28>>2]=c[i+(k*104|0)+60>>2];h=c[i+116>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+72>>2]=h;c[j+32>>2]=c[i+(k*104|0)+64>>2];c[j+36>>2]=c[i+(k*104|0)+68>>2];c[j+40>>2]=c[i+(k*104|0)+72>>2];c[j+44>>2]=c[i+(k*104|0)+76>>2];h=c[i+224>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+76>>2]=h;c[j+48>>2]=c[i+(k*104|0)+80>>2];c[j+52>>2]=c[i+(k*104|0)+84>>2];c[j+56>>2]=c[i+(k*104|0)+88>>2];c[j+60>>2]=c[i+(k*104|0)+92>>2];h=c[i+332>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+80>>2]=h;c[j+88>>2]=c[i+(k*104|0)+96>>2];c[j+92>>2]=c[i+(k*104|0)+100>>2];h=c[i+(k*104|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+840>>2]|0;g=i}c[j+64>>2]=h;c[j+84>>2]=c[i+(k*104|0)+24>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+100|0}}else g=c[b+840>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11082,1497453121,g)}}else c[e+284>>2]=0;y=c[b+852>>2]|0;c[e+320>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+860>>2]|0)|0;c[e+288>>2]=y;if(!y)y=f;else{k=c[e+320>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,92,k)|0;if((k|0)>0){i=c[m+8>>2]|0;j=0;while(1){h=c[b+860>>2]|0;c[i>>2]=c[h+(j*96|0)+28>>2];c[i+4>>2]=c[h+(j*96|0)+32>>2];c[i+8>>2]=c[h+(j*96|0)+36>>2];c[i+12>>2]=c[h+(j*96|0)+40>>2];c[i+16>>2]=c[h+(j*96|0)+44>>2];c[i+20>>2]=c[h+(j*96|0)+48>>2];c[i+24>>2]=c[h+(j*96|0)+52>>2];c[i+28>>2]=c[h+(j*96|0)+56>>2];c[i+32>>2]=c[h+(j*96|0)+60>>2];c[i+36>>2]=c[h+(j*96|0)+64>>2];c[i+40>>2]=c[h+(j*96|0)+68>>2];c[i+44>>2]=c[h+(j*96|0)+72>>2];c[i+48>>2]=c[h+(j*96|0)+76>>2];c[i+52>>2]=c[h+(j*96|0)+80>>2];c[i+56>>2]=c[h+(j*96|0)+84>>2];c[i+60>>2]=c[h+(j*96|0)+88>>2];c[i+88>>2]=c[h+(j*96|0)+92>>2];h=c[b+860>>2]|0;c[i+64>>2]=c[h+(j*96|0)+4>>2];c[i+68>>2]=c[h+(j*96|0)+8>>2];c[i+72>>2]=c[h+(j*96|0)+12>>2];c[i+76>>2]=c[h+(j*96|0)+16>>2];g=c[h+(j*96|0)>>2]|0;if(!g)g=-1;else g=(g-(c[b+780>>2]|0)|0)/104|0;c[i+84>>2]=g;g=c[h+(j*96|0)+20>>2]|0;if(!g)g=0;else g=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;c[i+80>>2]=g;j=j+1|0;if((j|0)>=(k|0))break;else i=i+92|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,m,11100,1497453121,c[b+860>>2]|0);y=f}}else{c[e+288>>2]=0;y=f}c[e+360>>2]=c[b+376>>2];c[e+336>>2]=c[b+352>>2];c[e+352>>2]=c[b+368>>2];c[e+332>>2]=c[b+348>>2];c[e+348>>2]=c[b+364>>2];c[e+344>>2]=c[b+360>>2];c[e+420>>2]=c[b+436>>2];c[e+424>>2]=c[b+440>>2];c[e+428>>2]=c[b+444>>2];c[e+416>>2]=c[b+432>>2];n=c[b+424>>2]|0;c[e+340>>2]=c[b+356>>2];c[e+364>>2]=c[b+380>>2];c[e+432>>2]=c[b+448>>2];c[e+356>>2]=c[b+372>>2];c[e+368>>2]=c[b+384>>2];c[e+372>>2]=c[b+388>>2];c[e+376>>2]=c[b+392>>2];c[e+380>>2]=c[b+396>>2];c[e+412>>2]=c[b+428>>2];c[e+408>>2]=n;c[e+384>>2]=c[b+400>>2];c[e+388>>2]=c[b+404>>2];c[e+392>>2]=c[b+408>>2];c[e+396>>2]=c[b+412>>2];c[e+400>>2]=c[b+416>>2];c[e+404>>2]=c[b+420>>2];c[e+264>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,b+532|0)|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,192,1)|0;m=c[n+8>>2]|0;c[m+96>>2]=c[b+692>>2];c[m+100>>2]=c[b+696>>2];c[m+104>>2]=c[b+700>>2];c[m+108>>2]=c[b+704>>2];c[m+112>>2]=c[b+708>>2];c[m+116>>2]=c[b+712>>2];c[m+120>>2]=c[b+716>>2];c[m+124>>2]=c[b+720>>2];c[m+128>>2]=c[b+724>>2];c[m+132>>2]=c[b+728>>2];c[m+136>>2]=c[b+732>>2];c[m+140>>2]=c[b+736>>2];c[m+180>>2]=d[b+533>>0];c[m+176>>2]=d[b+532>>0];c[m+144>>2]=c[b+580>>2];c[m+148>>2]=c[b+584>>2];c[m+152>>2]=c[b+588>>2];c[m+156>>2]=c[b+592>>2];x=c[b+544>>2]|0;c[m+168>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+552>>2]|0)|0;j=c[m+168>>2]|0;c[m+160>>2]=x;if(j|0){k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[b+552>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h>>2]=c[g+(i<<4)>>2];c[h+4>>2]=c[g+(i<<4)+4>>2];c[h+8>>2]=c[g+(i<<4)+8>>2];c[h+12>>2]=c[g+(i<<4)+12>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[b+552>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,19202,1497453121,g)}}else c[m+160>>2]=0;c[m+184>>2]=c[b+536>>2];c[m>>2]=c[b+596>>2];c[m+4>>2]=c[b+600>>2];c[m+8>>2]=c[b+604>>2];c[m+12>>2]=c[b+608>>2];c[m+16>>2]=c[b+612>>2];c[m+20>>2]=c[b+616>>2];c[m+24>>2]=c[b+620>>2];c[m+28>>2]=c[b+624>>2];c[m+32>>2]=c[b+628>>2];c[m+36>>2]=c[b+632>>2];c[m+40>>2]=c[b+636>>2];c[m+44>>2]=c[b+640>>2];c[m+48>>2]=c[b+644>>2];c[m+52>>2]=c[b+648>>2];c[m+56>>2]=c[b+652>>2];c[m+60>>2]=c[b+656>>2];c[m+64>>2]=c[b+660>>2];c[m+68>>2]=c[b+664>>2];c[m+72>>2]=c[b+668>>2];c[m+76>>2]=c[b+672>>2];c[m+80>>2]=c[b+676>>2];c[m+84>>2]=c[b+680>>2];c[m+88>>2]=c[b+684>>2];c[m+92>>2]=c[b+688>>2];x=c[b+564>>2]|0;c[m+172>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+572>>2]|0)|0;j=c[m+172>>2]|0;c[m+164>>2]=x;if(!j)z=147;else{k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[b+572>>2]|0;h=0;i=c[k+8>>2]|0;while(1){c[i>>2]=c[g+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[b+572>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,11120,1497453121,g);x=f}}else{c[m+164>>2]=0;z=147}if((z|0)==147)x=f;Zb[c[(c[x>>2]|0)+20>>2]&31](f,n,11126,1497453121,b+532|0);z=c[b+1112>>2]|0;c[e+324>>2]=z;if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[c[b+1120>>2]>>2]|0)|0;v=c[e+324>>2]|0;c[e+292>>2]=z;if(v|0){w=Bb[c[(c[f>>2]|0)+16>>2]&63](f,348,v)|0;if((v|0)>0){t=0;u=c[w+8>>2]|0;while(1){h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;z=u+320|0;c[z>>2]=c[h+360>>2];c[u+256>>2]=c[h+332>>2];c[u+260>>2]=c[h+336>>2];c[u+264>>2]=c[h+340>>2];c[u+268>>2]=c[h+344>>2];c[u+344>>2]=c[h+380>>2];c[u+340>>2]=d[h+377>>0];c[u+160>>2]=c[h+228>>2];c[u+164>>2]=c[h+232>>2];c[u+168>>2]=c[h+236>>2];c[u+172>>2]=c[h+240>>2];c[u+336>>2]=d[h+376>>0];c[u+208>>2]=c[h+276>>2];c[u+212>>2]=c[h+280>>2];c[u+216>>2]=c[h+284>>2];c[u+220>>2]=c[h+288>>2];c[u+224>>2]=c[h+292>>2];c[u+228>>2]=c[h+296>>2];c[u+232>>2]=c[h+300>>2];c[u+236>>2]=c[h+304>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u>>2]=c[h+60>>2];c[u+4>>2]=c[h+64>>2];c[u+8>>2]=c[h+68>>2];c[u+12>>2]=c[h+72>>2];c[u+16>>2]=c[h+76>>2];c[u+20>>2]=c[h+80>>2];c[u+24>>2]=c[h+84>>2];c[u+28>>2]=c[h+88>>2];c[u+32>>2]=c[h+92>>2];c[u+36>>2]=c[h+96>>2];c[u+40>>2]=c[h+100>>2];c[u+44>>2]=c[h+104>>2];c[u+48>>2]=c[h+108>>2];c[u+52>>2]=c[h+112>>2];c[u+56>>2]=c[h+116>>2];c[u+60>>2]=c[h+120>>2];c[u+296>>2]=c[h+124>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+300>>2]=c[h+128>>2];c[u+112>>2]=c[h+180>>2];c[u+116>>2]=c[h+184>>2];c[u+120>>2]=c[h+188>>2];c[u+124>>2]=c[h+192>>2];c[u+128>>2]=c[h+196>>2];c[u+132>>2]=c[h+200>>2];c[u+136>>2]=c[h+204>>2];c[u+140>>2]=c[h+208>>2];c[u+144>>2]=c[h+212>>2];c[u+148>>2]=c[h+216>>2];c[u+152>>2]=c[h+220>>2];c[u+156>>2]=c[h+224>>2];g=u+316|0;c[g>>2]=c[h+356>>2];c[u+64>>2]=c[h+132>>2];c[u+68>>2]=c[h+136>>2];c[u+72>>2]=c[h+140>>2];c[u+76>>2]=c[h+144>>2];c[u+80>>2]=c[h+148>>2];c[u+84>>2]=c[h+152>>2];c[u+88>>2]=c[h+156>>2];c[u+92>>2]=c[h+160>>2];c[u+96>>2]=c[h+164>>2];c[u+100>>2]=c[h+168>>2];c[u+104>>2]=c[h+172>>2];c[u+108>>2]=c[h+176>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+240>>2]=c[h+316>>2];c[u+244>>2]=c[h+320>>2];c[u+248>>2]=c[h+324>>2];c[u+252>>2]=c[h+328>>2];c[u+324>>2]=c[h+364>>2];c[u+328>>2]=c[h+368>>2];c[u+312>>2]=c[h+352>>2];c[g>>2]=c[h+356>>2];c[z>>2]=c[h+360>>2];c[u+332>>2]=c[h+372>>2];z=c[h+44>>2]|0;g=u+284|0;c[g>>2]=z;n=u+292|0;c[n>>2]=c[h+4>>2];o=u+288|0;c[o>>2]=c[h+24>>2];c[u+304>>2]=c[h+308>>2];c[u+176>>2]=c[h+244>>2];c[u+180>>2]=c[h+248>>2];c[u+184>>2]=c[h+252>>2];c[u+188>>2]=c[h+256>>2];c[u+192>>2]=c[h+260>>2];c[u+196>>2]=c[h+264>>2];c[u+200>>2]=c[h+268>>2];c[u+204>>2]=c[h+272>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+308>>2]=c[h+312>>2];if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[h+52>>2]|0)|0;c[u+272>>2]=z;if(z|0){j=c[g>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+52>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<4)>>2];c[i+4>>2]=c[k+(h<<4)+4>>2];c[i+8>>2]=c[k+(h<<4)+8>>2];c[i+12>>2]=c[k+(h<<4)+12>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+16|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,19202,1497453121,c[g+52>>2]|0)}}else c[u+272>>2]=0;if(c[n>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+12>>2]|0)|0;c[u+280>>2]=z;if(z|0){j=c[n>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+12>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11120,1497453121,c[g+12>>2]|0)}}else c[u+280>>2]=0;if(c[o>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+20|0)|0;c[u+276>>2]=z;if(z|0){m=c[n>>2]|0;s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,m)|0;if((m|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;n=c[g+32>>2]|0;o=c[A+12>>2]|0;p=c[A+72>>2]|0;q=c[A+52>>2]|0;r=c[A+32>>2]|0;j=0;k=c[s+8>>2]|0;while(1){i=c[n+(j<<2)>>2]|0;h=((i+~(i<<15)|0)>>>10^i+~(i<<15))*9|0;h=c[o+(((((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11))&(c[A+48>>2]|0)+-1)<<2)>>2]|0;if((i|0)!=(c[p+(h<<3)>>2]|0))do h=c[r+(h<<2)>>2]|0;while((i|0)!=(c[p+(h<<3)>>2]|0));c[k>>2]=c[q+(h<<2)>>2];j=j+1|0;if((j|0)==(m|0))break;else k=k+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,s,11163,1497453121,g+20|0)}}else c[u+276>>2]=0;t=t+1|0;if((t|0)>=(v|0))break;else u=u+348|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,w,11143,1497453121,c[c[b+1120>>2]>>2]|0)}}else c[e+292>>2]=0;z=c[b+912>>2]|0;c[e+328>>2]=z;if(!z){c[e+296>>2]=0;kj(A);l=A;return 11187}z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+920>>2]|0)|0;c[e+296>>2]=z;if(!z){kj(A);l=A;return 11187}k=c[b+912>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,104,k)|0;if((k|0)>0){i=0;j=c[m+8>>2]|0;while(1){g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;c[j+96>>2]=xb[c[(c[g>>2]|0)+20>>2]&127](g)|0;g=(c[b+920>>2]|0)+(i<<2)|0;h=c[g>>2]|0;c[j+8>>2]=c[h+28>>2];c[j+12>>2]=c[h+32>>2];c[j+16>>2]=c[h+36>>2];c[j+20>>2]=c[h+40>>2];c[j+24>>2]=c[h+44>>2];c[j+28>>2]=c[h+48>>2];c[j+32>>2]=c[h+52>>2];c[j+36>>2]=c[h+56>>2];c[j+40>>2]=c[h+60>>2];c[j+44>>2]=c[h+64>>2];c[j+48>>2]=c[h+68>>2];c[j+52>>2]=d[h+152>>0];h=j+56|0;c[j>>2]=0;n=j+4|0;c[n>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;c[h+28>>2]=0;g=c[g>>2]|0;h=c[g+4>>2]|0;if(h){c[j+88>>2]=1;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}if(c[g+12>>2]|0){c[j+88>>2]=3;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+920>>2]|0)+(i<<2)>>2]|0)+12>>2]|0)|0}g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;h=c[g+8>>2]|0;if(h){c[j+88>>2]=2;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+16>>2]|0;if(h){c[j+92>>2]=1;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+24>>2]|0;if(h){c[j+92>>2]=3;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}g=c[g+20>>2]|0;if(g|0){c[j+92>>2]=2;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,g)|0}i=i+1|0;if((i|0)>=(k|0))break;else j=j+104|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11167,1497453121,c[b+920>>2]|0);kj(A);l=A;return 11187}function mc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;K=l;l=l+144|0;switch(d-b|0){case 0:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;l=K;return}case 2:{m=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;b=c[m+88>>2]|0;d=c[m+200>>2]|0;g=c[m+92>>2]|0;f=c[m+204>>2]|0;if((b|0)==(d|0)&(g|0)==(f|0))if((c[m+96>>2]|0)==(c[m+208>>2]|0)){c[m+8>>2]=0;c[m>>2]=m;c[m+4>>2]=m;c[e>>2]=m;c[e+4>>2]=m;c[e+8>>2]=m;c[e+12>>2]=m;l=K;return}else f=g;f=g-f|0;if(!(f|b-d)){h=(c[m+96>>2]|0)>(c[m+208>>2]|0);f=h?m+112|0:m;c[f>>2]=f;c[f+4>>2]=f;g=f;h=h?m:m+112|0;i=f;j=f;k=f}else{c[m>>2]=m+112;c[m+4>>2]=m+112;c[m+112>>2]=m;c[m+116>>2]=m;j=(b-d|0)<0|(b-d|0)==0&(f|0)<0;g=m;h=m+112|0;i=j?m+112|0:m;j=j?m:m+112|0;k=(f|0)<0|(b-d|0)<0&(f|0)==0?m:m+112|0;f=(f|0)<0|(b-d|0)<0&(f|0)==0?m+112|0:m}c[e>>2]=j;c[e+4>>2]=i;c[e+8>>2]=k;c[e+12>>2]=f;a=hg(a,g,h)|0;c[a>>2]=a;c[a+4>>2]=a;c[g+8>>2]=a;a=c[a+8>>2]|0;c[a>>2]=a;c[a+4>>2]=a;c[h+8>>2]=a;l=K;return}case 1:{a=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;c[a+8>>2]=0;c[a>>2]=a;c[a+4>>2]=a;c[e>>2]=a;c[e+4>>2]=a;c[e+8>>2]=a;c[e+12>>2]=a;l=K;return}default:{n=((d-b|0)/2|0)+b|0;m=c[a+92>>2]|0;k=c[m+(n+-1<<2)>>2]|0;i=c[k+88>>2]|0;j=c[k+92>>2]|0;k=c[k+96>>2]|0;a:do if((n|0)<(d|0)){f=n;do{g=c[m+(f<<2)>>2]|0;if((c[g+88>>2]|0)!=(i|0))break a;if((c[g+92>>2]|0)!=(j|0))break a;if((c[g+96>>2]|0)!=(k|0))break a;f=f+1|0}while((f|0)<(d|0))}else f=n;while(0);mc(a,b,n,e);c[K+96>>2]=0;c[K+96+4>>2]=0;c[K+96+8>>2]=0;c[K+96+12>>2]=0;mc(a,f,d,K+96|0);k=c[K+96+4>>2]|0;b:do if(k|0){B=c[e+4>>2]|0;if(!B){c[e>>2]=c[K+96>>2];c[e+4>>2]=c[K+96+4>>2];c[e+8>>2]=c[K+96+8>>2];c[e+12>>2]=c[K+96+12>>2];break}c[a+100>>2]=(c[a+100>>2]|0)+-1;i=c[e+12>>2]|0;j=c[K+96+8>>2]|0;g=c[i+88>>2]|0;do if((g|0)==(c[j+88>>2]|0)?(h=c[i+92>>2]|0,(h|0)==(c[j+92>>2]|0)):0){f=c[j+4>>2]|0;if((f|0)==(j|0)){f=c[j+8>>2]|0;if(!f)f=g;else{h=c[f+12>>2]|0;j=h;f=c[h+88>>2]|0;h=c[h+92>>2]|0}b=j;n=f+1|0;g=i;o=c[j+96>>2]|0;break}i=c[j>>2]|0;c[f>>2]=i;c[i+4>>2]=f;if((j|0)==(c[K+96>>2]|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)<(h|0))g=i;else{if((g|0)==(h|0)?(c[i+92>>2]|0)<(c[f+92>>2]|0):0){g=i;break}g=f}while(0);c[K+96>>2]=g}if((j|0)==(k|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)>(h|0))f=i;else if((g|0)==(h|0)?(c[i+92>>2]|0)>(c[f+92>>2]|0):0){f=i;break}while(0);c[K+96+4>>2]=f;H=36}else{f=k;H=36}}else{f=k;H=36}while(0);if((H|0)==36){y=c[e>>2]|0;z=c[K+96>>2]|0;d=B;h=0;j=0;w=1;x=0;o=f;while(1){m=c[o+88>>2]|0;n=c[d+88>>2]|0;i=P(m-n|0,w)|0;c:do if((i|0)<=0){if((i|0)<0){v=(x|0)!=0;k=d;g=o;b=c[d+92>>2]|0;u=c[o+92>>2]|0;while(1){r=c[(v?g+4|0:g)>>2]|0;s=(r|0)==(g|0);t=g+88|0;while(1){d=k+88|0;p=u-b|0;if(!s?(C=c[r+88>>2]|0,D=P(C-m|0,w)|0,E=c[r+92>>2]|0,F=E-u|0,(F|0)>-1):0){if(!D)break;if((D|0)<0?(P(F,i)|0)<=(P(D,p)|0):0)break}q=c[(v?k+4|0:k)>>2]|0;if((q|0)==(k|0))break c;G=c[q+88>>2]|0;n=P(G-(c[d>>2]|0)|0,w)|0;o=c[q+92>>2]|0;d=o-b|0;m=c[t>>2]|0;b=i;i=P(m-G|0,w)|0;if(!((d|0)>0&(i|0)<0))break c;if(!n){k=q;b=o;continue}if((n|0)>=0)break c;if((P(d,b)|0)>=(P(n,p)|0))break c;else{k=q;b=o}}g=r;i=P(C-(c[d>>2]|0)|0,w)|0;u=E;m=C}}g=c[d+92>>2]|0;b=(x|0)!=0;d:do if(b){k=d;while(1){i=c[k>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}else{k=d;while(1){i=c[k+4>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}while(0);i=c[o+92>>2]|0;if(b){g=o;while(1){k=c[g+4>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}else{g=o;while(1){k=c[g>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}}else{u=(x|0)!=0;k=d;g=o;t=n;s=c[o+92>>2]|0;while(1){r=g+88|0;b=c[k+92>>2]|0;d=s-b|0;m=c[(u?k:k+4|0)>>2]|0;e:do if((m|0)!=(k|0))if(u){p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else{p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q+4>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else p=i;while(0);n=c[(u?g:g+4|0)>>2]|0;if((n|0)==(g|0))break c;i=c[n+88>>2]|0;m=P(i-(c[r>>2]|0)|0,w)|0;b=s;s=c[n+92>>2]|0;b=s-b|0;t=c[k+88>>2]|0;i=P(i-t|0,w)|0;if(!((b|0)<0&(i|0)>0))break c;if(!m){g=n;continue}if((m|0)>=0)break c;if((P(b,p)|0)>=(P(m,d)|0))break;else g=n}}while(0);i=(x|0)==0;j=i?g:j;h=i?k:h;o=i?z:g;d=i?y:k;x=x+1|0;if((x|0)==2)break;else w=i?-1:w}c[d+4>>2]=o;c[o>>2]=d;c[h>>2]=j;c[j+4>>2]=h;if((c[z+88>>2]|0)<(c[y+88>>2]|0))c[e>>2]=z;if((c[f+88>>2]|0)>=(c[B+88>>2]|0))c[e+4>>2]=f;c[e+12>>2]=c[K+96+12>>2];g=h;F=j;s=c[j+88>>2]|0;n=c[h+88>>2]|0;t=c[j+92>>2]|0;u=c[h+92>>2]|0;v=c[j+96>>2]|0;o=c[h+96>>2]|0;w=((t-u|0)<0)<<31>>31;x=0-(s-n)|0;y=sw(0,0,x|0,((x|0)<0)<<31>>31|0)|0;y=ct(v-o|0,((v-o|0)<0)<<31>>31|0,y|0,A|0)|0;z=A;B=ct(v-o|0,((v-o|0)<0)<<31>>31|0,t-u|0,w|0)|0;C=A;p=ct(s-n|0,((s-n|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;E=A;D=ct(t-u|0,w|0,t-u|0,w|0)|0;D=sw(p|0,E|0,D|0,A|0)|0;E=A;p=c[h+8>>2]|0;c[K+120>>2]=0;if(!p)p=0;else{q=sw(0,0,t-u|0,w|0)|0;r=A;d=p;f=0;do{m=c[d+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;b=ct(k-u|0,((k-u|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=A;e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,q|0,r|0)|0;f:do if((b|0)==(e|0)&(G|0)==(A|0)?(e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,y|0,z|0)|0,b=A,G=ct(k-u|0,((k-u|0)<0)<<31>>31|0,B|0,C|0)|0,b=Ow(G|0,A|0,e|0,b|0)|0,e=A,G=ct(m-o|0,((m-o|0)<0)<<31>>31|0,D|0,E|0)|0,G=Ow(b|0,e|0,G|0,A|0)|0,e=A,(e|0)>0|(e|0)==0&G>>>0>0):0){do if(f|0){b=(c[f+4>>2]|0)==(d|0);if((c[f>>2]|0)!=(d|0))if(b)break;else break f;if(!b)break f;e=c[f+12>>2]|0;L=c[(c[d+8>>2]|0)+12>>2]|0;G=c[L+88>>2]|0;b=c[L+92>>2]|0;L=c[L+96>>2]|0;M=(c[e+96>>2]|0)-L|0;b=(P(m-L|0,(c[e+92>>2]|0)-b|0)|0)-(P(M,k-b|0)|0)|0;G=(P(M,i-G|0)|0)-(P(m-L|0,(c[e+88>>2]|0)-G|0)|0)|0;b=ct(b|0,((b|0)<0)<<31>>31|0,t-u|0,w|0)|0;e=A;G=ct(G|0,((G|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=Ow(b|0,e|0,G|0,A|0)|0;e=A;if((e|0)>0|(e|0)==0&G>>>0>0)break f}while(0);f=d}while(0);d=c[d>>2]|0}while((d|0)!=(p|0));c[K+120>>2]=f;p=f}d=c[j+8>>2]|0;c[K+72>>2]=0;if(!d)f=0;else{n=sw(0,0,t-u|0,w|0)|0;o=A;b=d;f=0;do{m=c[b+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;G=ct(k-t|0,((k-t|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;M=A;L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,n|0,o|0)|0;do if((G|0)==(L|0)&(M|0)==(A|0)?(L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,y|0,z|0)|0,G=A,M=ct(k-t|0,((k-t|0)<0)<<31>>31|0,B|0,C|0)|0,G=Ow(M|0,A|0,L|0,G|0)|0,L=A,M=ct(m-v|0,((m-v|0)<0)<<31>>31|0,D|0,E|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,(L|0)>0|(L|0)==0&M>>>0>0):0){if(f|0){if((c[f>>2]|0)!=(b|0))break;if((c[f+4>>2]|0)==(b|0)?(L=c[f+12>>2]|0,e=c[(c[b+8>>2]|0)+12>>2]|0,M=c[e+88>>2]|0,G=c[e+92>>2]|0,e=c[e+96>>2]|0,r=(c[L+96>>2]|0)-e|0,G=(P(m-e|0,(c[L+92>>2]|0)-G|0)|0)-(P(r,k-G|0)|0)|0,M=(P(r,i-M|0)|0)-(P(m-e|0,(c[L+88>>2]|0)-M|0)|0)|0,G=ct(G|0,((G|0)<0)<<31>>31|0,t-u|0,w|0)|0,L=A,M=ct(M|0,((M|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,!((L|0)>0|(L|0)==0&M>>>0>0)):0)break}f=b}while(0);b=c[b>>2]|0}while((b|0)!=(d|0));c[K+72>>2]=f}if((p|0)!=0|(f|0)!=0){rc(a,h,j,K+120|0,K+72|0);f=c[K+120>>2]|0;if(f){h=c[f+12>>2]|0;g=h}f=c[K+72>>2]|0;if(!f){f=F;i=h}else{j=c[f+12>>2]|0;f=j;i=h}}else{f=F;i=h}b=f;n=c[j+88>>2]|0;o=(c[j+96>>2]|0)+1|0;h=c[j+92>>2]|0}f=0;e=0;k=0;z=0;G=1;D=0;m=0;d=0;B=0;F=b;C=o;x=j;w=i;while(1){y=c[w+88>>2]|0;u=(c[x+88>>2]|0)-y|0;M=c[w+92>>2]|0;E=(c[x+92>>2]|0)-M|0;t=c[w+96>>2]|0;r=(c[x+96>>2]|0)-t|0;c[K+120>>2]=u;c[K+120+4>>2]=E;c[K+120+8>>2]=r;c[K+120+12>>2]=-1;y=n-y|0;M=h-M|0;t=C-t|0;s=(P(r,M)|0)-(P(E,t)|0)|0;t=(P(u,t)|0)-(P(r,y)|0)|0;M=(P(E,y)|0)-(P(u,M)|0)|0;c[K+72>>2]=s;c[K+72+4>>2]=((s|0)<0)<<31>>31;c[K+72+8>>2]=t;c[K+72+8+4>>2]=((t|0)<0)<<31>>31;c[K+72+16>>2]=M;c[K+72+16+4>>2]=((M|0)<0)<<31>>31;y=ct(E|0,((E|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;L=A;v=ct(r|0,((r|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;v=sw(y|0,L|0,v|0,A|0)|0;L=A;r=ct(s|0,((s|0)<0)<<31>>31|0,r|0,((r|0)<0)<<31>>31|0)|0;y=A;M=ct(u|0,((u|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;M=sw(r|0,y|0,M|0,A|0)|0;y=A;t=ct(u|0,((u|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;u=A;E=ct(s|0,((s|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;E=sw(t|0,u|0,E|0,A|0)|0;c[K+48>>2]=v;c[K+48+4>>2]=L;c[K+48+8>>2]=M;c[K+48+8+4>>2]=y;c[K+48+16>>2]=E;c[K+48+16+4>>2]=A;c[K+24>>2]=0;c[K+24+4>>2]=0;c[K+24+8>>2]=0;c[K+24+12>>2]=0;c[K+24+16>>2]=0;E=Fd(a,0,w,K+120|0,K+72|0,K+48|0,K+24|0)|0;c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;c[K+16>>2]=0;y=Fd(a,1,x,K+120|0,K+72|0,K+48|0,K)|0;do if((E|0)!=0|(y|0)!=0){b=E|0?-1:1;do if((E|0)!=0&(y|0)!=0){v=c[K+24+16>>2]|0;b=c[K+16>>2]|0;if((v|0)!=(b|0)){u=v-b|0;break}if(!v)u=0;else{M=c[K+24>>2]|0;t=c[K+24+4>>2]|0;p=c[K+8>>2]|0;N=c[K+8+4>>2]|0;o=ct(p|0,0,M|0,0)|0;b=A;M=ct(N|0,0,M|0,0)|0;L=A;p=ct(p|0,0,t|0,0)|0;q=A;t=ct(N|0,0,t|0,0)|0;N=A;p=Ow(M|0,0,p|0,0)|0;M=A;N=Ow(L|0,0,t|0,N|0)|0;q=Ow(N|0,A|0,q|0,0)|0;M=Ow(q|0,A|0,M|0,0)|0;q=A;b=Ow(0,p|0,o|0,b|0)|0;o=A;p=Ow(M|0,q|0,(o>>>0

>>0|(o|0)==(p|0)&b>>>0<0)&1|0,0)|0;q=A;M=c[K+24+8>>2]|0;N=c[K+24+8+4>>2]|0;t=c[K>>2]|0;L=c[K+4>>2]|0;s=ct(t|0,0,M|0,0)|0;r=A;M=ct(L|0,0,M|0,0)|0;O=A;t=ct(t|0,0,N|0,0)|0;u=A;N=ct(L|0,0,N|0,0)|0;L=A;t=Ow(M|0,0,t|0,0)|0;M=A;L=Ow(O|0,0,N|0,L|0)|0;u=Ow(L|0,A|0,u|0,0)|0;M=Ow(u|0,A|0,M|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(M|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0)b=-1;else b=q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0?1:o>>>0>>0|(o|0)==(s|0)&b>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&b>>>0>r>>>0)&1;u=P(b,v)|0}}else u=b;while(0);do if(!G)if((u|0)>-1)if((c[K+16>>2]|0)<0&((c[K+8>>2]|0)==0?(c[K+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else if((c[K+24+16>>2]|0)<0&((c[K+24+8>>2]|0)==0?(c[K+24+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else H=133;while(0);if((H|0)==133){H=0;o=hg(a,w,x)|0;if(!z)k=o;else c[z+4>>2]=o;c[o>>2]=z;b=c[o+8>>2]|0;if(!B)d=b;else c[B>>2]=b;c[b+4>>2]=B;s=b}c[K+116>>2]=E;c[K+112>>2]=y;if(!u){rc(a,g,F,K+116|0,K+112|0);b=c[K+112>>2]|0}else b=y;if((u|0)>-1&(b|0)!=0){q=(D|0)!=0;if(q?(I=c[D>>2]|0,(I|0)!=(y|0)):0){n=I;do{p=n;n=c[n>>2]|0;r=c[p+8>>2]|0;if((n|0)==(p|0))h=0;else{c[n+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=n;h=n}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[p+12>>2]|0)+8>>2]=h;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((n|0)!=(y|0))}if(!s){m=q?m:y;h=d}else{if(q)h=D;else{m=d;h=c[y+4>>2]|0}c[h>>2]=d;c[d+4>>2]=h;c[s>>2]=y;c[y+4>>2]=s;h=0;b=c[K+112>>2]|0}O=F;t=c[b+8>>2]|0;s=0;B=h;z=c[b+12>>2]|0;n=c[O+88>>2]|0;d=c[O+96>>2]|0;h=c[O+92>>2]|0}else{t=D;B=d;z=F;d=C}b=c[K+116>>2]|0;if((u|0)<1&(b|0)!=0){p=(f|0)!=0;if(p?(J=c[f+4>>2]|0,(J|0)!=(E|0)):0){d=J;do{q=d+4|0;n=d;d=c[q>>2]|0;h=c[n>>2]|0;r=c[n+8>>2]|0;if((h|0)==(n|0))h=0;else{c[h+4>>2]=d;c[c[q>>2]>>2]=h}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[n+12>>2]|0)+8>>2]=h;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((d|0)!=(E|0))}if(!o)h=p?e:E;else{if(p)h=e;else{h=k;f=c[E>>2]|0}c[k>>2]=f;c[f+4>>2]=k;c[E>>2]=o;c[o+4>>2]=E;k=0;b=c[K+116>>2]|0}O=g;f=c[b+8>>2]|0;r=h;w=0;y=c[O+88>>2]|0;g=c[b+12>>2]|0;x=c[O+96>>2]|0;h=c[O+92>>2]|0}else{r=e;w=o;y=n;x=d}if((g|0)==(i|0)&(z|0)==(j|0)){if(f){q=f+4|0;b=c[q>>2]|0;if((b|0)!=(r|0))do{o=b+4|0;n=b;b=c[o>>2]|0;d=c[n>>2]|0;p=c[n+8>>2]|0;if((d|0)==(n|0))d=0;else{c[d+4>>2]=b;c[c[o>>2]>>2]=d}c[(c[p+12>>2]|0)+8>>2]=d;d=c[p>>2]|0;if((d|0)==(p|0))d=0;else{c[d+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(r|0));if(w|0){c[k>>2]=f;c[q>>2]=k;c[r>>2]=w;c[w+4>>2]=r}}else{c[k>>2]=w;c[w+4>>2]=k;c[g+8>>2]=w}if(!t){c[s>>2]=B;c[B+4>>2]=s;c[j+8>>2]=s;v=0;u=G;t=0;q=w;d=B;p=z;n=y;o=g;b=x;break}b=c[t>>2]|0;if((b|0)!=(m|0))do{n=b;b=c[b>>2]|0;o=c[n+8>>2]|0;if((b|0)==(n|0))d=0;else{c[b+4>>2]=c[n+4>>2];c[c[n+4>>2]>>2]=b;d=b}c[(c[o+12>>2]|0)+8>>2]=d;d=c[o>>2]|0;if((d|0)==(o|0))d=0;else{c[d+4>>2]=c[o+4>>2];c[c[o+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[n+4>>2]=0;c[n+4+4>>2]=0;c[n+4+8>>2]=0;c[n+4+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[o+4>>2]=0;c[o+4+4>>2]=0;c[o+4+8>>2]=0;c[o+4+12>>2]=0;c[o>>2]=c[a+56>>2];c[a+56>>2]=o;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(m|0));if(!s){v=0;u=G;q=w;s=0;d=B;p=z;n=y;o=g;b=x}else{c[t>>2]=B;c[B+4>>2]=t;c[s>>2]=m;c[m+4>>2]=s;v=0;u=G;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=1;u=0;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=hg(a,w,x)|0;c[v>>2]=v;c[v+4>>2]=v;c[w+8>>2]=v;v=c[v+8>>2]|0;c[v>>2]=v;c[v+4>>2]=v;c[x+8>>2]=v;v=0;u=G;t=D;r=e;q=z;s=B;p=F;o=g;b=C}while(0);if(!v)break b;e=r;z=q;G=u;D=t;B=s;F=p;g=o;C=b;x=p;w=o}}while(0);l=K;return}}} + +// EMSCRIPTEN_END_FUNCS +var nb=[fJ,ip,UG,HG,HG,LG,$D,Mq,Lq,Mq,fJ,fJ,fJ,fJ,fJ,fJ];var ob=[KI,bx];var pb=[FD,fk,fk,FD];var qb=[DH,Dj,gk,vi,Bv,$k,Ao,$j,Xm,_m,Qh,Tm,lm,ym,Ig,Ng,Gg,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH];var rb=[eB,tk,tk,eB];var sb=[CF,Vc];var tb=[ZC,Yu,ie,Yu,Yu,je,Yu,Yu,yf,uf,bu,Yu,Yu,ZC,ZC,ZC];var ub=[ix,oq];var vb=[Zv,qc,Vk,Zv];var wb=[bv,Nm,qd,bv];var xb=[eJ,HI,jI,hF,DE,DE,fG,BH,II,HI,Nr,VH,EI,XG,LH,YG,HI,xH,qI,II,oI,oI,jI,cG,KE,UE,PH,vH,II,oF,YG,XF,LF,wF,_G,PF,wG,sG,jG,JG,xG,jI,Cz,Vs,vF,KG,xF,Fv,cG,cG,yH,tI,jH,GI,AH,BI,CI,zI,sE,ZH,AH,cI,aI,fI,YG,iI,ZG,bG,bG,HI,wI,AH,vI,uI,zD,SH,HI,HI,HI,JI,DI,xI,EI,DI,_G,iG,RH,sI,AH,nI,mI,aF,nD,aG,VF,VF,fG,fG,OI,HI,jI,fG,fG,OI,DE,HI,WF,WF,fG,Ot,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ];var yb=[YF,Di];var zb=[AI,ds,gs,es,Fo,oG,oG,dc,tz,tz,Pd,wn,sy,bo,Ct,tl,fr,op,Pk,yi,Io,dr,AI,AI,AI,AI,AI,AI,AI,AI,AI,AI];var Ab=[KH,Kh,hE,hE,bn,KH,KH,KH];var Bb=[wH,Wn,Fi,xk,lc,vo,gl,sg,yd,fi,fh,Cf,vn,Sh,Jh,Hf,nq,bf,tg,hm,Wq,ek,Mf,Qk,xg,hl,Oh,Ok,Ie,Mk,Ed,EC,EC,pf,Yj,Sg,Jg,ti,To,ql,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH];var Cb=[zF,sn,zp,Uo,sk,qk,Vh,Ll,Il,Mo,wg,Ho,Rp,Ym,Zl,Rl,Si,jl,Qc,cw,Gx,Ef,zF,zF,zF,zF,zF,zF,zF,zF,zF,zF];var Db=[VC,Jl];var Eb=[GA,fd,Ad,Wd];var Fb=[gx,ld,Yf,gx];var Gb=[_u,Rc,oh,_u];var Hb=[lJ,UI,pk,gu];var Ib=[jJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,nH,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,Lp,Vq,no,Jj,gz,ZI,aJ,aJ,aJ,aJ,rd,pw,ZI,aJ,ZI,aJ,aJ,ZI,Ey,aJ,aJ,ZI,Ey,aJ,aJ,ZI,aJ,lz,Sx,ZI,aJ,ZI,aJ,mq,Mp,Qi,vC,bk,Vu,Wm,zu,fc,Bn,qh,Pn,Df,Ml,ZI,aJ,ZI,aJ,zl,$l,Qg,av,ci,aJ,kk,ZB,IH,Yv,ZI,IH,Yv,ZI,Yv,Td,mn,Yv,Yv,Le,Yv,Yv,qe,Yv,Oc,Tf,St,WE,pi,pF,aJ,up,Do,aJ,ZI,aJ,Jp,No,wl,_l,rk,Wu,Qp,_q,ZI,aJ,nf,lB,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,mk,HC,cr,Xp,Np,Qo,aJ,rq,jp,ir,_p,ZI,aJ,Oj,rF,Dd,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,oH,aJ,aJ,aJ,aJ,aJ,aJ,aJ,Yq,Vp,ZI,aJ,Hk,pD,aJ,aJ,aJ,Gi,IB,aJ,cj,iA,aJ,qm,Hv,ej,Ey,Ey,Ey,Ey,Yp,np,ZI,aJ,aJ,aJ,ZI,Ey,aJ,ZI,aJ,ZI,Ey,Mp,Dm,rm,Ey,Ey,Ey,Mp,aJ,Mp,pH,Qv,aJ,aJ,OG,Cv,Ey,Ey,Ey,ji,Pv,tj,xv,ZI,xv,Sp,gr,lk,yu,aJ,aJ,Ki,qF,ZI,aJ,aJ,aJ,ni,Qv,aJ,ZI,aJ,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,aJ,ar,Wp,aJ,aJ,nk,oD,ii,vv,Hp,Ko,ZI,aJ,ZI,ZI,aJ,aJ,Ms,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ];var Jb=[_I,nc,Uc,kn,jn,bF,kF,WH,kF,ns,wd,jh,Te,kd,yg,sp,dg,Hj,De,Gc,YE,kF,WH,Pl,Pl,lj,_I,_I,_I,_I,_I,_I];var Kb=[yI,be,jf,Bg,xj,gc,Jf,yI];var Lb=[LC];var Mb=[lI,Zg,Kd,vB,vB,xu,Vj,Xi,yp,xu,xu,jj,Ol,bm,xu,Pi];var Nb=[hH];var Ob=[YI,$q,ws,yG,OB,AB,yG,oo,_k,yG,Bt,so,Fc,le,cq,yG,yG,yG,yG,wB,jk,vg,fl,Tj,im,Pj,ks,rh,nl,Pp,Jx,ox,Jx,ox,Nc,hc,yG,mj,nu,io,pq,Th,Gt,Ft,Mg,gg,Ah,tu,sf,Dh,Ac,Wk,nd,Cj,zc,Vi,yG,Tl,Bk,Sk,el,ak,VA,Cr,mi,ap,Ck,lA,On,Dk,mj,wj,mj,ki,yr,dq,si,mj,nj,Sn,nr,pn,fe,Mn,vl,Eu,Cu,Du,zh,$m,Zm,Yg,Is,wq,Hl,Ls,Op,Uk,vd,ud,Lr,Uk,Ls,yG,yG,Hh,Ih,se,Yn,yG,yG,yG,ly,Dx,tf,md,mm,Fu,ku,ku,yG,mj,yG,yG,YI,YI,YI,YI];var Pb=[kI,Cw,Kv,fs,pl,tc,kI,kI];var Qb=[gH,ev,hk,cp,Wi,Nn,Am,gH];var Rb=[dF];var Sb=[bI,XE,Ei,Ge,mw,hi,zo,XE,yj,Lj,au,XE,Rd,td,XE,al,Rk,Kk,Gq,$i,of,bi,XE,XE,Mi,ei,mf,Fx,Ex,XE,XE,XE,XE,xd,ai,Sj,yk,Mt,Bh,su,gf,Me,Me,ph,al,Uj,So,li,al,Zh,XE,nm,Bo,wm,jm,Kl,Zj,gn,hn,fn,Vn,mo,qf,ro,XE,XE,XE,XE,Zp,lp,mp,Ql,zj,$h,hp,XE,XE,XE,XE,zi,Nd,Yh,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI];var Tb=[fH,Jz,oc,ae,$e,Jz,Ej,Be,xm,en,fH,fH,fH,fH,fH,fH];var Ub=[pC];var Vb=[zG,_e,jB,jB,jB,Xf,Ff,cu,Nj,Ar,Nu,Gk,Kc,Ec,Lf,Ht,th,Pf,kc,Ou,Km,sl,kp,Ff,We,Og,_f,Fe,Tt,Zs,Cg,wh,cu,oi,Ul,tt,vh,$d,am,qj,Bj,Cp,pg,Vg,Mh,Hi,Nk,jB,ri,Eh,wi,jB,jB,oj,rj,om,Tk,dk,ke,Ae,qi,Lc,rj,yl,rl,xl,cd,_n,Aj,_n,Cl,eq,po,dl,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG];var Wb=[cF,Ov];var Xb=[pu];var Yb=[iv];var Zb=[xE,Sl,og,Up,Pc,Ze,$f,Uf,ec,Ic,yc,Bd,de,Dc,Zu,_h,pc,Xd,bl,Oi,hf,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE];var _b=[oC];var $b=[JB,_d,Gl,cm,rp,Jn,Ti,JB];var ac=[$z,mg,Xg,$z];var bc=[Nw,Fj];var cc=[wv,pm,pm,wv];return{__GLOBAL__sub_I_btConeTwistConstraint_cpp:nA,__GLOBAL__sub_I_btQuickprof_cpp:Sc,___cxa_can_catch:Oq,___cxa_is_pointer_type:fz,___muldi3:ct,___udivdi3:rB,___uremdi3:xs,_bitshift64Lshr:Mu,_bitshift64Shl:wu,_emscripten_bind_Anchor___destroy___0:TD,_emscripten_bind_Anchor_get_m_body_0:vG,_emscripten_bind_Anchor_get_m_c0_0:YH,_emscripten_bind_Anchor_get_m_c1_0:XH,_emscripten_bind_Anchor_get_m_c2_0:IG,_emscripten_bind_Anchor_get_m_influence_0:QG,_emscripten_bind_Anchor_get_m_local_0:OI,_emscripten_bind_Anchor_get_m_node_0:lH,_emscripten_bind_Anchor_set_m_body_1:gE,_emscripten_bind_Anchor_set_m_c0_1:RB,_emscripten_bind_Anchor_set_m_c1_1:Cs,_emscripten_bind_Anchor_set_m_c2_1:JE,_emscripten_bind_Anchor_set_m_influence_1:PE,_emscripten_bind_Anchor_set_m_local_1:Es,_emscripten_bind_Anchor_set_m_node_1:TE,_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2:mt,_emscripten_bind_ClosestConvexResultCallback___destroy___0:px,_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0:XG,_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0:iH,_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0:gI,_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0:NF,_emscripten_bind_ClosestConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1:cs,_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1:Sr,_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1:ss,_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1:Xr,_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2:Lt,_emscripten_bind_ClosestRayResultCallback___destroy___0:px,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0:$E,_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0:aI,_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0:JF,_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0:eG,_emscripten_bind_ClosestRayResultCallback_hasHit_0:$y,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1:Mr,_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1:Is,_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1:Ur,_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1:$r,_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0:ms,_emscripten_bind_ConcreteContactResultCallback___destroy___0:px,_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7:rr,_emscripten_bind_Config___destroy___0:Bz,_emscripten_bind_Config_get_citerations_0:WF,_emscripten_bind_Config_get_collisions_0:bG,_emscripten_bind_Config_get_diterations_0:VF,_emscripten_bind_Config_get_kAHR_0:HG,_emscripten_bind_Config_get_kCHR_0:GG,_emscripten_bind_Config_get_kDF_0:WG,_emscripten_bind_Config_get_kDG_0:VG,_emscripten_bind_Config_get_kDP_0:bH,_emscripten_bind_Config_get_kKHR_0:FG,_emscripten_bind_Config_get_kLF_0:UG,_emscripten_bind_Config_get_kMT_0:TG,_emscripten_bind_Config_get_kPR_0:SG,_emscripten_bind_Config_get_kSHR_0:EG,_emscripten_bind_Config_get_kSKHR_CL_0:hG,_emscripten_bind_Config_get_kSK_SPLT_CL_0:rG,_emscripten_bind_Config_get_kSRHR_CL_0:gG,_emscripten_bind_Config_get_kSR_SPLT_CL_0:CG,_emscripten_bind_Config_get_kSSHR_CL_0:DG,_emscripten_bind_Config_get_kSS_SPLT_CL_0:OF,_emscripten_bind_Config_get_kVCF_0:RG,_emscripten_bind_Config_get_kVC_0:QG,_emscripten_bind_Config_get_maxvolume_0:LG,_emscripten_bind_Config_get_piterations_0:UF,_emscripten_bind_Config_get_timescale_0:$F,_emscripten_bind_Config_get_viterations_0:TF,_emscripten_bind_Config_set_citerations_1:mD,_emscripten_bind_Config_set_collisions_1:lD,_emscripten_bind_Config_set_diterations_1:kD,_emscripten_bind_Config_set_kAHR_1:kF,_emscripten_bind_Config_set_kCHR_1:IE,_emscripten_bind_Config_set_kDF_1:SE,_emscripten_bind_Config_set_kDG_1:RF,_emscripten_bind_Config_set_kDP_1:lG,_emscripten_bind_Config_set_kKHR_1:HE,_emscripten_bind_Config_set_kLF_1:bF,_emscripten_bind_Config_set_kMT_1:RE,_emscripten_bind_Config_set_kPR_1:QE,_emscripten_bind_Config_set_kSHR_1:GE,_emscripten_bind_Config_set_kSKHR_CL_1:fE,_emscripten_bind_Config_set_kSK_SPLT_CL_1:rE,_emscripten_bind_Config_set_kSRHR_CL_1:eE,_emscripten_bind_Config_set_kSR_SPLT_CL_1:EE,_emscripten_bind_Config_set_kSSHR_CL_1:FE,_emscripten_bind_Config_set_kSS_SPLT_CL_1:PD,_emscripten_bind_Config_set_kVCF_1:mG,_emscripten_bind_Config_set_kVC_1:PE,_emscripten_bind_Config_set_maxvolume_1:YE,_emscripten_bind_Config_set_piterations_1:jD,_emscripten_bind_Config_set_timescale_1:_D,_emscripten_bind_Config_set_viterations_1:iD,_emscripten_bind_ContactResultCallback___destroy___0:px,_emscripten_bind_ContactResultCallback_addSingleResult_7:rr,_emscripten_bind_ConvexResultCallback___destroy___0:px,_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_Face___destroy___0:TD,_emscripten_bind_Face_get_m_n_1:OD,_emscripten_bind_Face_get_m_normal_0:QH,_emscripten_bind_Face_set_m_n_2:UA,_emscripten_bind_Face_set_m_normal_1:Bs,_emscripten_bind_Joint___destroy___0:px,_emscripten_bind_Joint_get_m_cfm_0:DG,_emscripten_bind_Joint_get_m_delete_0:mF,_emscripten_bind_Joint_get_m_drift_0:aI,_emscripten_bind_Joint_get_m_erp_0:CG,_emscripten_bind_Joint_get_m_massmatrix_0:uH,_emscripten_bind_Joint_get_m_refs_1:OE,_emscripten_bind_Joint_get_m_sdrift_0:OH,_emscripten_bind_Joint_get_m_split_0:rG,_emscripten_bind_Joint_set_m_cfm_1:FE,_emscripten_bind_Joint_set_m_delete_1:hD,_emscripten_bind_Joint_set_m_drift_1:Is,_emscripten_bind_Joint_set_m_erp_1:EE,_emscripten_bind_Joint_set_m_massmatrix_1:dB,_emscripten_bind_Joint_set_m_refs_2:Uq,_emscripten_bind_Joint_set_m_sdrift_1:zs,_emscripten_bind_Joint_set_m_split_1:rE,_emscripten_bind_LJoint___destroy___0:px,_emscripten_bind_LJoint_get_m_rpos_1:vE,_emscripten_bind_LJoint_set_m_rpos_2:Pq,_emscripten_bind_Link___destroy___0:QB,_emscripten_bind_Link_get_m_n_1:yD,_emscripten_bind_Link_set_m_n_2:LA,_emscripten_bind_LocalConvexResult_LocalConvexResult_5:lr,_emscripten_bind_LocalConvexResult___destroy___0:TD,_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0:lH,_emscripten_bind_LocalConvexResult_get_m_hitFraction_0:FG,_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0:NI,_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0:JF,_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0:hF,_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1:TE,_emscripten_bind_LocalConvexResult_set_m_hitFraction_1:HE,_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1:Ns,_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1:Ur,_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1:OB,_emscripten_bind_LocalShapeInfo___destroy___0:TD,_emscripten_bind_LocalShapeInfo_get_m_shapePart_0:lH,_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0:hF,_emscripten_bind_LocalShapeInfo_set_m_shapePart_1:TE,_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1:OB,_emscripten_bind_Material___destroy___0:TD,_emscripten_bind_Material_get_m_flags_0:fG,_emscripten_bind_Material_get_m_kAST_0:bH,_emscripten_bind_Material_get_m_kLST_0:RG,_emscripten_bind_Material_get_m_kVST_0:VG,_emscripten_bind_Material_set_m_flags_1:ND,_emscripten_bind_Material_set_m_kAST_1:lG,_emscripten_bind_Material_set_m_kLST_1:mG,_emscripten_bind_Material_set_m_kVST_1:RF,_emscripten_bind_Node___destroy___0:TD,_emscripten_bind_Node_get_m_n_0:aI,_emscripten_bind_Node_get_m_x_0:NI,_emscripten_bind_Node_set_m_n_1:Is,_emscripten_bind_Node_set_m_x_1:Ns,_emscripten_bind_RayResultCallback___destroy___0:px,_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_RayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_RayResultCallback_hasHit_0:$y,_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_RayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_RaycastInfo___destroy___0:TD,_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0:gJ,_emscripten_bind_RaycastInfo_get_m_contactPointWS_0:XG,_emscripten_bind_RaycastInfo_get_m_groundObject_0:UF,_emscripten_bind_RaycastInfo_get_m_hardPointWS_0:BG,_emscripten_bind_RaycastInfo_get_m_isInContact_0:ZD,_emscripten_bind_RaycastInfo_get_m_suspensionLength_0:TG,_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0:AG,_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0:_F,_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1:Gs,_emscripten_bind_RaycastInfo_set_m_contactPointWS_1:cs,_emscripten_bind_RaycastInfo_set_m_groundObject_1:jD,_emscripten_bind_RaycastInfo_set_m_hardPointWS_1:js,_emscripten_bind_RaycastInfo_set_m_isInContact_1:HB,_emscripten_bind_RaycastInfo_set_m_suspensionLength_1:RE,_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1:is,_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1:Zr,_emscripten_bind_Specs___destroy___0:TD,_emscripten_bind_Specs_get_position_0:MI,_emscripten_bind_Specs_set_position_1:ys,_emscripten_bind_VoidPtr___destroy___0:TD,_emscripten_bind_btActionInterface___destroy___0:px,_emscripten_bind_btActionInterface_updateAction_2:aw,_emscripten_bind_btAxisSweep3___destroy___0:px,_emscripten_bind_btAxisSweep3_btAxisSweep3_2:yt,_emscripten_bind_btAxisSweep3_btAxisSweep3_3:Ks,_emscripten_bind_btAxisSweep3_btAxisSweep3_4:hs,_emscripten_bind_btAxisSweep3_btAxisSweep3_5:Gr,_emscripten_bind_btBoxShape___destroy___0:px,_emscripten_bind_btBoxShape_btBoxShape_1:Ci,_emscripten_bind_btBoxShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBoxShape_getLocalScaling_0:Oz,_emscripten_bind_btBoxShape_getMargin_0:pA,_emscripten_bind_btBoxShape_setLocalScaling_1:Cx,_emscripten_bind_btBoxShape_setMargin_1:Ay,_emscripten_bind_btBroadphaseInterface___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2:xt,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3:Ps,_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX___destroy___0:px,_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2:Dn,_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeX_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeX_getMargin_0:pA,_emscripten_bind_btCapsuleShapeX_getRadius_0:MD,_emscripten_bind_btCapsuleShapeX_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX_setMargin_1:Ay,_emscripten_bind_btCapsuleShapeZ___destroy___0:px,_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2:Cn,_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeZ_getMargin_0:pA,_emscripten_bind_btCapsuleShapeZ_getRadius_0:MD,_emscripten_bind_btCapsuleShapeZ_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeZ_setMargin_1:Ay,_emscripten_bind_btCapsuleShape___destroy___0:px,_emscripten_bind_btCapsuleShape_btCapsuleShape_2:Fn,_emscripten_bind_btCapsuleShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShape_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShape_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShape_getMargin_0:pA,_emscripten_bind_btCapsuleShape_getRadius_0:MD,_emscripten_bind_btCapsuleShape_getUpAxis_0:qE,_emscripten_bind_btCapsuleShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShape_setMargin_1:Ay,_emscripten_bind_btCollisionConfiguration___destroy___0:px,_emscripten_bind_btCollisionDispatcher___destroy___0:px,_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1:ok,_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btCollisionDispatcher_getNumManifolds_0:qA,_emscripten_bind_btCollisionObject___destroy___0:px,_emscripten_bind_btCollisionObject_activate_0:ju,_emscripten_bind_btCollisionObject_activate_1:Ys,_emscripten_bind_btCollisionObject_forceActivationState_1:FB,_emscripten_bind_btCollisionObject_getCollisionFlags_0:JD,_emscripten_bind_btCollisionObject_getCollisionShape_0:ID,_emscripten_bind_btCollisionObject_getUserIndex_0:nE,_emscripten_bind_btCollisionObject_getUserPointer_0:cE,_emscripten_bind_btCollisionObject_getWorldTransform_0:fF,_emscripten_bind_btCollisionObject_isActive_0:ZA,_emscripten_bind_btCollisionObject_isKinematicObject_0:Ry,_emscripten_bind_btCollisionObject_isStaticObject_0:Kz,_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btCollisionObject_setActivationState_1:uw,_emscripten_bind_btCollisionObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btCollisionObject_setCollisionFlags_1:wz,_emscripten_bind_btCollisionObject_setCollisionShape_1:sx,_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btCollisionObject_setFriction_1:YA,_emscripten_bind_btCollisionObject_setRestitution_1:oA,_emscripten_bind_btCollisionObject_setRollingFriction_1:Fz,_emscripten_bind_btCollisionObject_setUserIndex_1:tA,_emscripten_bind_btCollisionObject_setUserPointer_1:Wz,_emscripten_bind_btCollisionObject_setWorldTransform_1:cy,_emscripten_bind_btCollisionShape___destroy___0:px,_emscripten_bind_btCollisionShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCollisionShape_getLocalScaling_0:Oz,_emscripten_bind_btCollisionShape_getMargin_0:pA,_emscripten_bind_btCollisionShape_setLocalScaling_1:Cx,_emscripten_bind_btCollisionShape_setMargin_1:Ay,_emscripten_bind_btCollisionWorld___destroy___0:px,_emscripten_bind_btCollisionWorld_addCollisionObject_1:kw,_emscripten_bind_btCollisionWorld_addCollisionObject_2:Ru,_emscripten_bind_btCollisionWorld_addCollisionObject_3:pt,_emscripten_bind_btCollisionWorld_contactPairTest_3:wt,_emscripten_bind_btCollisionWorld_contactTest_2:tn,_emscripten_bind_btCollisionWorld_convexSweepTest_5:Qr,_emscripten_bind_btCollisionWorld_getBroadphase_0:LD,_emscripten_bind_btCollisionWorld_getDispatchInfo_0:tC,_emscripten_bind_btCollisionWorld_getDispatcher_0:KD,_emscripten_bind_btCollisionWorld_getPairCache_0:Tz,_emscripten_bind_btCollisionWorld_rayTest_3:$u,_emscripten_bind_btCollisionWorld_removeCollisionObject_1:Pw,_emscripten_bind_btCollisionWorld_updateSingleAabb_1:nx,_emscripten_bind_btCompoundShape___destroy___0:px,_emscripten_bind_btCompoundShape_addChildShape_2:Sd,_emscripten_bind_btCompoundShape_btCompoundShape_0:ny,_emscripten_bind_btCompoundShape_btCompoundShape_1:Sw,_emscripten_bind_btCompoundShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCompoundShape_getChildShape_1:Pz,_emscripten_bind_btCompoundShape_getLocalScaling_0:Oz,_emscripten_bind_btCompoundShape_getMargin_0:pA,_emscripten_bind_btCompoundShape_getNumChildShapes_0:cB,_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1:_x,_emscripten_bind_btCompoundShape_setLocalScaling_1:Cx,_emscripten_bind_btCompoundShape_setMargin_1:Ay,_emscripten_bind_btConcaveShape___destroy___0:px,_emscripten_bind_btConcaveShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConcaveShape_getLocalScaling_0:Oz,_emscripten_bind_btConcaveShape_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeX___destroy___0:px,_emscripten_bind_btConeShapeX_btConeShapeX_2:um,_emscripten_bind_btConeShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeX_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeX_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeZ___destroy___0:px,_emscripten_bind_btConeShapeZ_btConeShapeZ_2:tm,_emscripten_bind_btConeShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btConeShape___destroy___0:px,_emscripten_bind_btConeShape_btConeShape_2:vm,_emscripten_bind_btConeShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShape_getLocalScaling_0:Oz,_emscripten_bind_btConeShape_setLocalScaling_1:Cx,_emscripten_bind_btConeTwistConstraint___destroy___0:px,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2:Wg,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4:Fg,_emscripten_bind_btConeTwistConstraint_enableFeedback_1:mz,_emscripten_bind_btConeTwistConstraint_enableMotor_1:dz,_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btConeTwistConstraint_getParam_2:Rv,_emscripten_bind_btConeTwistConstraint_setAngularOnly_1:zy,_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btConeTwistConstraint_setDamping_1:Nz,_emscripten_bind_btConeTwistConstraint_setLimit_2:Rx,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1:yw,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1:ey,_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1:hv,_emscripten_bind_btConeTwistConstraint_setMotorTarget_1:di,_emscripten_bind_btConeTwistConstraint_setParam_3:fv,_emscripten_bind_btConstraintSetting___destroy___0:TD,_emscripten_bind_btConstraintSetting_btConstraintSetting_0:zz,_emscripten_bind_btConstraintSetting_get_m_damping_0:RG,_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0:bH,_emscripten_bind_btConstraintSetting_get_m_tau_0:GF,_emscripten_bind_btConstraintSetting_set_m_damping_1:mG,_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1:lG,_emscripten_bind_btConstraintSetting_set_m_tau_1:MG,_emscripten_bind_btConstraintSolver___destroy___0:px,_emscripten_bind_btContactSolverInfo___destroy___0:TD,_emscripten_bind_btContactSolverInfo_get_m_numIterations_0:vG,_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0:TA,_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0:uC,_emscripten_bind_btContactSolverInfo_set_m_numIterations_1:gE,_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1:py,_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1:KA,_emscripten_bind_btConvexHullShape___destroy___0:px,_emscripten_bind_btConvexHullShape_addPoint_1:cz,_emscripten_bind_btConvexHullShape_addPoint_2:jx,_emscripten_bind_btConvexHullShape_btConvexHullShape_0:_w,_emscripten_bind_btConvexHullShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexHullShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexHullShape_getMargin_0:pA,_emscripten_bind_btConvexHullShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexHullShape_setMargin_1:Ay,_emscripten_bind_btConvexShape___destroy___0:px,_emscripten_bind_btConvexShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexShape_getMargin_0:pA,_emscripten_bind_btConvexShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexShape_setMargin_1:Ay,_emscripten_bind_btConvexTriangleMeshShape___destroy___0:px,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1:Al,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2:kl,_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexTriangleMeshShape_getMargin_0:pA,_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexTriangleMeshShape_setMargin_1:Ay,_emscripten_bind_btCylinderShapeX___destroy___0:px,_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1:Wt,_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeX_getMargin_0:pA,_emscripten_bind_btCylinderShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeX_setMargin_1:Ay,_emscripten_bind_btCylinderShapeZ___destroy___0:px,_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1:Vt,_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeZ_getMargin_0:pA,_emscripten_bind_btCylinderShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeZ_setMargin_1:Ay,_emscripten_bind_btCylinderShape___destroy___0:px,_emscripten_bind_btCylinderShape_btCylinderShape_1:Mw,_emscripten_bind_btCylinderShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShape_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShape_getMargin_0:pA,_emscripten_bind_btCylinderShape_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShape_setMargin_1:Ay,_emscripten_bind_btDbvtBroadphase___destroy___0:px,_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0:Bx,_emscripten_bind_btDefaultCollisionConfiguration___destroy___0:px,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0:Fq,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1:At,_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0:TD,_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0:Jv,_emscripten_bind_btDefaultMotionState___destroy___0:px,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0:ps,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1:Ws,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2:_t,_emscripten_bind_btDefaultMotionState_getWorldTransform_1:sx,_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0:OI,_emscripten_bind_btDefaultMotionState_setWorldTransform_1:ex,_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1:Qy,_emscripten_bind_btDefaultSoftBodySolver___destroy___0:px,_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0:sq,_emscripten_bind_btDefaultVehicleRaycaster___destroy___0:px,_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1:rv,_emscripten_bind_btDefaultVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btDiscreteDynamicsWorld___destroy___0:px,_emscripten_bind_btDiscreteDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4:Tq,_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0:Zo,_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btDispatcherInfo___destroy___0:TD,_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0:WG,_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0:GG,_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0:DE,_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0:xD,_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0:CC,_emscripten_bind_btDispatcherInfo_get_m_stepCount_0:hF,_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0:VG,_emscripten_bind_btDispatcherInfo_get_m_timeStep_0:GF,_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0:RC,_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0:vA,_emscripten_bind_btDispatcherInfo_get_m_useEpa_0:YD,_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1:SE,_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1:IE,_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1:AB,_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1:uB,_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1:SA,_emscripten_bind_btDispatcherInfo_set_m_stepCount_1:OB,_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1:RF,_emscripten_bind_btDispatcherInfo_set_m_timeStep_1:MG,_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1:bB,_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1:_y,_emscripten_bind_btDispatcherInfo_set_m_useEpa_1:GB,_emscripten_bind_btDispatcher___destroy___0:px,_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btDispatcher_getNumManifolds_0:qA,_emscripten_bind_btDynamicsWorld___destroy___0:px,_emscripten_bind_btDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDynamicsWorld_addCollisionObject_1:kw,_emscripten_bind_btDynamicsWorld_addCollisionObject_2:Ru,_emscripten_bind_btDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btFixedConstraint___destroy___0:px,_emscripten_bind_btFixedConstraint_btFixedConstraint_4:Xl,_emscripten_bind_btFixedConstraint_enableFeedback_1:mz,_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btFixedConstraint_getParam_2:Rv,_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btFixedConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3:os,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5:er,_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3:Fk,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5:uk,_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2:Kr,_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2:Zx,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2:Px,_emscripten_bind_btGhostObject___destroy___0:px,_emscripten_bind_btGhostObject_activate_0:ju,_emscripten_bind_btGhostObject_activate_1:Ys,_emscripten_bind_btGhostObject_btGhostObject_0:Pg,_emscripten_bind_btGhostObject_forceActivationState_1:FB,_emscripten_bind_btGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btGhostObject_getCollisionShape_0:ID,_emscripten_bind_btGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btGhostObject_getUserIndex_0:nE,_emscripten_bind_btGhostObject_getUserPointer_0:cE,_emscripten_bind_btGhostObject_getWorldTransform_0:fF,_emscripten_bind_btGhostObject_isActive_0:ZA,_emscripten_bind_btGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btGhostObject_isStaticObject_0:Kz,_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btGhostObject_setActivationState_1:uw,_emscripten_bind_btGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btGhostObject_setCollisionShape_1:sx,_emscripten_bind_btGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btGhostObject_setFriction_1:YA,_emscripten_bind_btGhostObject_setRestitution_1:oA,_emscripten_bind_btGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btGhostObject_setUserIndex_1:tA,_emscripten_bind_btGhostObject_setUserPointer_1:Wz,_emscripten_bind_btGhostObject_setWorldTransform_1:cy,_emscripten_bind_btGhostPairCallback___destroy___0:px,_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0:Iz,_emscripten_bind_btHeightfieldTerrainShape___destroy___0:px,_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9:ug,_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2:Nv,_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0:Oz,_emscripten_bind_btHeightfieldTerrainShape_getMargin_0:pA,_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1:Cx,_emscripten_bind_btHeightfieldTerrainShape_setMargin_1:Ay,_emscripten_bind_btHingeConstraint___destroy___0:px,_emscripten_bind_btHingeConstraint_btHingeConstraint_2:eg,_emscripten_bind_btHingeConstraint_btHingeConstraint_3:ag,_emscripten_bind_btHingeConstraint_btHingeConstraint_4:Dg,_emscripten_bind_btHingeConstraint_btHingeConstraint_5:zg,_emscripten_bind_btHingeConstraint_btHingeConstraint_6:br,_emscripten_bind_btHingeConstraint_btHingeConstraint_7:Bq,_emscripten_bind_btHingeConstraint_enableAngularMotor_3:Av,_emscripten_bind_btHingeConstraint_enableFeedback_1:mz,_emscripten_bind_btHingeConstraint_enableMotor_1:Zz,_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btHingeConstraint_getParam_2:Rv,_emscripten_bind_btHingeConstraint_setAngularOnly_1:rz,_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btHingeConstraint_setLimit_4:yv,_emscripten_bind_btHingeConstraint_setLimit_5:Uu,_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1:My,_emscripten_bind_btHingeConstraint_setMotorTarget_2:_j,_emscripten_bind_btHingeConstraint_setParam_3:fv,_emscripten_bind_btKinematicCharacterController___destroy___0:px,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3:En,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4:Aq,_emscripten_bind_btKinematicCharacterController_canJump_0:uy,_emscripten_bind_btKinematicCharacterController_getGhostObject_0:DE,_emscripten_bind_btKinematicCharacterController_getGravity_0:xp,_emscripten_bind_btKinematicCharacterController_getMaxSlope_0:EG,_emscripten_bind_btKinematicCharacterController_jump_0:Rt,_emscripten_bind_btKinematicCharacterController_onGround_0:Cz,_emscripten_bind_btKinematicCharacterController_playerStep_2:tv,_emscripten_bind_btKinematicCharacterController_preStep_1:Kw,_emscripten_bind_btKinematicCharacterController_setFallSpeed_1:SE,_emscripten_bind_btKinematicCharacterController_setGravity_1:Jm,_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1:Yx,_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1:HE,_emscripten_bind_btKinematicCharacterController_setMaxSlope_1:ax,_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1:$v,_emscripten_bind_btKinematicCharacterController_setUp_1:cl,_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1:bw,_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2:Lu,_emscripten_bind_btKinematicCharacterController_setWalkDirection_1:_v,_emscripten_bind_btKinematicCharacterController_updateAction_2:aw,_emscripten_bind_btKinematicCharacterController_warp_1:Uw,_emscripten_bind_btManifoldPoint___destroy___0:TD,_emscripten_bind_btManifoldPoint_getAppliedImpulse_0:Hz,_emscripten_bind_btManifoldPoint_getDistance_0:kA,_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0:BE,_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0:FA,_emscripten_bind_btManifoldPoint_get_m_localPointA_0:gJ,_emscripten_bind_btManifoldPoint_get_m_localPointB_0:XG,_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0:NF,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0:gI,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0:iH,_emscripten_bind_btManifoldPoint_set_m_localPointA_1:Gs,_emscripten_bind_btManifoldPoint_set_m_localPointB_1:cs,_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1:Xr,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1:ss,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1:Sr,_emscripten_bind_btMatrix3x3___destroy___0:TD,_emscripten_bind_btMatrix3x3_getRotation_1:Mz,_emscripten_bind_btMatrix3x3_getRow_1:Iq,_emscripten_bind_btMatrix3x3_setEulerZYX_3:wx,_emscripten_bind_btMotionState___destroy___0:px,_emscripten_bind_btMotionState_getWorldTransform_1:sx,_emscripten_bind_btMotionState_setWorldTransform_1:ex,_emscripten_bind_btOverlappingPairCache___destroy___0:px,_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1:Bw,_emscripten_bind_btOverlappingPairCallback___destroy___0:px,_emscripten_bind_btPairCachingGhostObject___destroy___0:px,_emscripten_bind_btPairCachingGhostObject_activate_0:ju,_emscripten_bind_btPairCachingGhostObject_activate_1:Ys,_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0:kg,_emscripten_bind_btPairCachingGhostObject_forceActivationState_1:FB,_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0:ID,_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btPairCachingGhostObject_getUserIndex_0:nE,_emscripten_bind_btPairCachingGhostObject_getUserPointer_0:cE,_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0:fF,_emscripten_bind_btPairCachingGhostObject_isActive_0:ZA,_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btPairCachingGhostObject_isStaticObject_0:Kz,_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btPairCachingGhostObject_setActivationState_1:uw,_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1:sx,_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btPairCachingGhostObject_setFriction_1:YA,_emscripten_bind_btPairCachingGhostObject_setRestitution_1:oA,_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btPairCachingGhostObject_setUserIndex_1:tA,_emscripten_bind_btPairCachingGhostObject_setUserPointer_1:Wz,_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1:cy,_emscripten_bind_btPersistentManifold___destroy___0:QB,_emscripten_bind_btPersistentManifold_btPersistentManifold_0:gm,_emscripten_bind_btPersistentManifold_getBody0_0:wD,_emscripten_bind_btPersistentManifold_getBody1_0:vD,_emscripten_bind_btPersistentManifold_getContactPoint_1:oy,_emscripten_bind_btPersistentManifold_getNumContacts_0:BC,_emscripten_bind_btPoint2PointConstraint___destroy___0:px,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2:Wj,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4:ik,_emscripten_bind_btPoint2PointConstraint_enableFeedback_1:mz,_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btPoint2PointConstraint_getParam_2:Rv,_emscripten_bind_btPoint2PointConstraint_getPivotInA_0:EA,_emscripten_bind_btPoint2PointConstraint_getPivotInB_0:DA,_emscripten_bind_btPoint2PointConstraint_get_m_setting_0:EH,_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btPoint2PointConstraint_setParam_3:fv,_emscripten_bind_btPoint2PointConstraint_setPivotA_1:jy,_emscripten_bind_btPoint2PointConstraint_setPivotB_1:iy,_emscripten_bind_btPoint2PointConstraint_set_m_setting_1:st,_emscripten_bind_btQuadWord___destroy___0:TD,_emscripten_bind_btQuadWord_setW_1:XD,_emscripten_bind_btQuadWord_setX_1:mE,_emscripten_bind_btQuadWord_setY_1:lE,_emscripten_bind_btQuadWord_setZ_1:kE,_emscripten_bind_btQuadWord_w_0:AE,_emscripten_bind_btQuadWord_x_0:ZF,_emscripten_bind_btQuadWord_y_0:zE,_emscripten_bind_btQuadWord_z_0:yE,_emscripten_bind_btQuaternion___destroy___0:TD,_emscripten_bind_btQuaternion_angleShortestPath_1:bz,_emscripten_bind_btQuaternion_angle_1:DB,_emscripten_bind_btQuaternion_btQuaternion_4:qp,_emscripten_bind_btQuaternion_dot_1:lC,_emscripten_bind_btQuaternion_getAngleShortestPath_0:Zy,_emscripten_bind_btQuaternion_getAngle_0:zB,_emscripten_bind_btQuaternion_getAxis_0:Fp,_emscripten_bind_btQuaternion_inverse_0:Ep,_emscripten_bind_btQuaternion_length2_0:NE,_emscripten_bind_btQuaternion_length_0:gF,_emscripten_bind_btQuaternion_normalize_0:CE,_emscripten_bind_btQuaternion_normalized_0:wp,_emscripten_bind_btQuaternion_op_add_1:kC,_emscripten_bind_btQuaternion_op_div_1:QC,_emscripten_bind_btQuaternion_op_mul_1:Zt,_emscripten_bind_btQuaternion_op_mulq_1:WB,_emscripten_bind_btQuaternion_op_sub_1:jC,_emscripten_bind_btQuaternion_setEulerZYX_3:Tw,_emscripten_bind_btQuaternion_setEuler_3:mx,_emscripten_bind_btQuaternion_setRotation_2:Ix,_emscripten_bind_btQuaternion_setValue_4:Tp,_emscripten_bind_btQuaternion_setW_1:XD,_emscripten_bind_btQuaternion_setX_1:mE,_emscripten_bind_btQuaternion_setY_1:lE,_emscripten_bind_btQuaternion_setZ_1:kE,_emscripten_bind_btQuaternion_w_0:AE,_emscripten_bind_btQuaternion_x_0:ZF,_emscripten_bind_btQuaternion_y_0:zE,_emscripten_bind_btQuaternion_z_0:yE,_emscripten_bind_btRaycastVehicle___destroy___0:px,_emscripten_bind_btRaycastVehicle_addWheel_7:Zd,_emscripten_bind_btRaycastVehicle_applyEngineForce_2:gw,_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3:il,_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0:NB,_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0:Yy,_emscripten_bind_btRaycastVehicle_getForwardAxis_0:aD,_emscripten_bind_btRaycastVehicle_getForwardVector_0:Go,_emscripten_bind_btRaycastVehicle_getNumWheels_0:MB,_emscripten_bind_btRaycastVehicle_getRightAxis_0:uD,_emscripten_bind_btRaycastVehicle_getRigidBody_0:tD,_emscripten_bind_btRaycastVehicle_getSteeringValue_1:Ax,_emscripten_bind_btRaycastVehicle_getUpAxis_0:WD,_emscripten_bind_btRaycastVehicle_getUserConstraintId_0:AC,_emscripten_bind_btRaycastVehicle_getUserConstraintType_0:iC,_emscripten_bind_btRaycastVehicle_getWheelInfo_1:Yz,_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1:Gy,_emscripten_bind_btRaycastVehicle_rayCast_1:Gz,_emscripten_bind_btRaycastVehicle_resetSuspension_0:Yl,_emscripten_bind_btRaycastVehicle_setBrake_2:Qw,_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3:qu,_emscripten_bind_btRaycastVehicle_setPitchControl_1:Lz,_emscripten_bind_btRaycastVehicle_setSteeringValue_2:fw,_emscripten_bind_btRaycastVehicle_setUserConstraintId_1:Py,_emscripten_bind_btRaycastVehicle_setUserConstraintType_1:Fy,_emscripten_bind_btRaycastVehicle_updateAction_2:aw,_emscripten_bind_btRaycastVehicle_updateFriction_1:vx,_emscripten_bind_btRaycastVehicle_updateSuspension_1:El,_emscripten_bind_btRaycastVehicle_updateVehicle_1:zx,_emscripten_bind_btRaycastVehicle_updateWheelTransform_2:Yt,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1:jv,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2:mu,_emscripten_bind_btRigidBodyConstructionInfo___destroy___0:TD,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3:Zn,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4:qr,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0:uA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0:Sz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0:iB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0:RA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0:Xz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0:sC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0:aB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0:$C,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0:IG,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0:hB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0:FC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0:VB,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1:Cy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1:dy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1:qz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1:yz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1:hy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1:SD,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1:jz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1:QA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1:JE,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1:pz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1:AA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1:hA,_emscripten_bind_btRigidBody___destroy___0:px,_emscripten_bind_btRigidBody_activate_0:ju,_emscripten_bind_btRigidBody_activate_1:Ys,_emscripten_bind_btRigidBody_applyCentralForce_1:Qu,_emscripten_bind_btRigidBody_applyCentralImpulse_1:Au,_emscripten_bind_btRigidBody_applyForce_2:Ox,_emscripten_bind_btRigidBody_applyGravity_0:Lo,_emscripten_bind_btRigidBody_applyImpulse_2:lx,_emscripten_bind_btRigidBody_applyTorqueImpulse_1:Iu,_emscripten_bind_btRigidBody_applyTorque_1:ov,_emscripten_bind_btRigidBody_btRigidBody_1:Kg,_emscripten_bind_btRigidBody_forceActivationState_1:FB,_emscripten_bind_btRigidBody_getAabb_2:zt,_emscripten_bind_btRigidBody_getAngularVelocity_0:CB,_emscripten_bind_btRigidBody_getCenterOfMassTransform_0:fF,_emscripten_bind_btRigidBody_getCollisionFlags_0:JD,_emscripten_bind_btRigidBody_getCollisionShape_0:ID,_emscripten_bind_btRigidBody_getGravity_0:dE,_emscripten_bind_btRigidBody_getLinearVelocity_0:LB,_emscripten_bind_btRigidBody_getMotionState_0:VD,_emscripten_bind_btRigidBody_getUserIndex_0:nE,_emscripten_bind_btRigidBody_getUserPointer_0:cE,_emscripten_bind_btRigidBody_getWorldTransform_0:fF,_emscripten_bind_btRigidBody_isActive_0:ZA,_emscripten_bind_btRigidBody_isKinematicObject_0:Ry,_emscripten_bind_btRigidBody_isStaticObject_0:Kz,_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btRigidBody_setActivationState_1:uw,_emscripten_bind_btRigidBody_setAngularFactor_1:Xy,_emscripten_bind_btRigidBody_setAngularVelocity_1:By,_emscripten_bind_btRigidBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btRigidBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btRigidBody_setCenterOfMassTransform_1:hx,_emscripten_bind_btRigidBody_setCollisionFlags_1:wz,_emscripten_bind_btRigidBody_setCollisionShape_1:sx,_emscripten_bind_btRigidBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btRigidBody_setDamping_2:go,_emscripten_bind_btRigidBody_setFriction_1:YA,_emscripten_bind_btRigidBody_setGravity_1:nn,_emscripten_bind_btRigidBody_setLinearFactor_1:iz,_emscripten_bind_btRigidBody_setLinearVelocity_1:Ly,_emscripten_bind_btRigidBody_setMassProps_2:Qj,_emscripten_bind_btRigidBody_setMotionState_1:Wy,_emscripten_bind_btRigidBody_setRestitution_1:oA,_emscripten_bind_btRigidBody_setRollingFriction_1:Fz,_emscripten_bind_btRigidBody_setSleepingThresholds_2:ux,_emscripten_bind_btRigidBody_setUserIndex_1:tA,_emscripten_bind_btRigidBody_setUserPointer_1:Wz,_emscripten_bind_btRigidBody_setWorldTransform_1:cy,_emscripten_bind_btRigidBody_upcast_1:zA,_emscripten_bind_btRigidBody_updateInertiaTensor_0:Mj,_emscripten_bind_btRotationalLimitMotor___destroy___0:TD,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0:yy,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1:Ew,_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0:hC,_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0:RG,_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0:GF,_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0:VG,_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0:bH,_emscripten_bind_btRotationalLimitMotor_isLimited_0:yx,_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0:Rz,_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1:CA,_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1:mG,_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1:MG,_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1:RF,_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1:lG,_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0:px,_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0:hj,_emscripten_bind_btSliderConstraint___destroy___0:px,_emscripten_bind_btSliderConstraint_btSliderConstraint_3:oe,_emscripten_bind_btSliderConstraint_btSliderConstraint_5:vf,_emscripten_bind_btSliderConstraint_enableFeedback_1:mz,_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btSliderConstraint_getParam_2:Rv,_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btSliderConstraint_setLowerAngLimit_1:Vy,_emscripten_bind_btSliderConstraint_setLowerLinLimit_1:Uy,_emscripten_bind_btSliderConstraint_setParam_3:fv,_emscripten_bind_btSliderConstraint_setUpperAngLimit_1:Ty,_emscripten_bind_btSliderConstraint_setUpperLinLimit_1:Sy,_emscripten_bind_btSoftBodyArray___destroy___0:ay,_emscripten_bind_btSoftBodyArray_at_1:tw,_emscripten_bind_btSoftBodyArray_size_0:DF,_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4:_g,_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4:Qs,_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5:Od,_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10:gd,_emscripten_bind_btSoftBodyHelpers_CreatePatch_9:od,_emscripten_bind_btSoftBodyHelpers_CreateRope_5:Lg,_emscripten_bind_btSoftBodyHelpers___destroy___0:TD,_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0:FH,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0:px,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0:aq,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1:As,_emscripten_bind_btSoftBodySolver___destroy___0:px,_emscripten_bind_btSoftBodyWorldInfo___destroy___0:Xx,_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0:oz,_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0:GF,_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0:pE,_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0:oE,_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0:eG,_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0:VG,_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0:RG,_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0:XG,_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0:bH,_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1:MG,_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1:qB,_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1:pB,_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1:$r,_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1:RF,_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1:mG,_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1:cs,_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1:lG,_emscripten_bind_btSoftBody___destroy___0:px,_emscripten_bind_btSoftBody_activate_0:ju,_emscripten_bind_btSoftBody_activate_1:Ys,_emscripten_bind_btSoftBody_appendAnchor_4:Zf,_emscripten_bind_btSoftBody_appendFace_4:dv,_emscripten_bind_btSoftBody_appendLinearJoint_2:df,_emscripten_bind_btSoftBody_appendLink_4:cv,_emscripten_bind_btSoftBody_appendMaterial_0:gD,_emscripten_bind_btSoftBody_appendNode_2:$c,_emscripten_bind_btSoftBody_appendTetra_5:Sf,_emscripten_bind_btSoftBody_btSoftBody_4:Hs,_emscripten_bind_btSoftBody_checkFace_3:Lk,_emscripten_bind_btSoftBody_checkLink_2:Wl,_emscripten_bind_btSoftBody_forceActivationState_1:FB,_emscripten_bind_btSoftBody_generateBendingConstraints_2:_c,_emscripten_bind_btSoftBody_generateClusters_1:xz,_emscripten_bind_btSoftBody_generateClusters_2:Qx,_emscripten_bind_btSoftBody_getCollisionFlags_0:JD,_emscripten_bind_btSoftBody_getCollisionShape_0:ID,_emscripten_bind_btSoftBody_getTotalMass_0:tp,_emscripten_bind_btSoftBody_getUserIndex_0:nE,_emscripten_bind_btSoftBody_getUserPointer_0:cE,_emscripten_bind_btSoftBody_getWorldTransform_0:fF,_emscripten_bind_btSoftBody_get_m_anchors_0:kH,_emscripten_bind_btSoftBody_get_m_cfg_0:EH,_emscripten_bind_btSoftBody_get_m_faces_0:tH,_emscripten_bind_btSoftBody_get_m_links_0:sH,_emscripten_bind_btSoftBody_get_m_materials_0:aH,_emscripten_bind_btSoftBody_get_m_nodes_0:rH,_emscripten_bind_btSoftBody_isActive_0:ZA,_emscripten_bind_btSoftBody_isKinematicObject_0:Ry,_emscripten_bind_btSoftBody_isStaticObject_0:Kz,_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btSoftBody_rotate_1:ck,_emscripten_bind_btSoftBody_scale_1:Ve,_emscripten_bind_btSoftBody_setActivationState_1:uw,_emscripten_bind_btSoftBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btSoftBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btSoftBody_setCollisionFlags_1:wz,_emscripten_bind_btSoftBody_setCollisionShape_1:sx,_emscripten_bind_btSoftBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btSoftBody_setFriction_1:YA,_emscripten_bind_btSoftBody_setMass_2:Ku,_emscripten_bind_btSoftBody_setRestitution_1:oA,_emscripten_bind_btSoftBody_setRollingFriction_1:Fz,_emscripten_bind_btSoftBody_setTotalMass_2:lh,_emscripten_bind_btSoftBody_setUserIndex_1:tA,_emscripten_bind_btSoftBody_setUserPointer_1:Wz,_emscripten_bind_btSoftBody_setWorldTransform_1:cy,_emscripten_bind_btSoftBody_set_m_anchors_1:xx,_emscripten_bind_btSoftBody_set_m_cfg_1:yA,_emscripten_bind_btSoftBody_set_m_faces_1:Wx,_emscripten_bind_btSoftBody_set_m_links_1:Vx,_emscripten_bind_btSoftBody_set_m_materials_1:dx,_emscripten_bind_btSoftBody_set_m_nodes_1:Ux,_emscripten_bind_btSoftBody_transform_1:sA,_emscripten_bind_btSoftBody_translate_1:em,_emscripten_bind_btSoftBody_upcast_1:JA,_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0:px,_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1:Jx,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3:ij,_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5:zf,_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2:tn,_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0:Yo,_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0:Ez,_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0:LB,_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3:$u,_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1:ox,_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1:ol,_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btSphereShape___destroy___0:px,_emscripten_bind_btSphereShape_btSphereShape_1:by,_emscripten_bind_btSphereShape_calculateLocalInertia_2:Nv,_emscripten_bind_btSphereShape_getLocalScaling_0:Oz,_emscripten_bind_btSphereShape_getMargin_0:pA,_emscripten_bind_btSphereShape_setLocalScaling_1:Cx,_emscripten_bind_btSphereShape_setMargin_1:Ay,_emscripten_bind_btStaticPlaneShape___destroy___0:px,_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2:Vl,_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2:Nv,_emscripten_bind_btStaticPlaneShape_getLocalScaling_0:Oz,_emscripten_bind_btStaticPlaneShape_setLocalScaling_1:Cx,_emscripten_bind_btStridingMeshInterface___destroy___0:px,_emscripten_bind_btTransform___destroy___0:TD,_emscripten_bind_btTransform_btTransform_0:eI,_emscripten_bind_btTransform_btTransform_2:Iv,_emscripten_bind_btTransform_getBasis_0:qH,_emscripten_bind_btTransform_getOrigin_0:BE,_emscripten_bind_btTransform_getRotation_0:vp,_emscripten_bind_btTransform_setFromOpenGLMatrix_1:nz,_emscripten_bind_btTransform_setIdentity_0:jE,_emscripten_bind_btTransform_setOrigin_1:xA,_emscripten_bind_btTransform_setRotation_1:IA,_emscripten_bind_btTriangleMeshShape___destroy___0:px,_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btTriangleMesh___destroy___0:px,_emscripten_bind_btTriangleMesh_addTriangle_3:Un,_emscripten_bind_btTriangleMesh_addTriangle_4:In,_emscripten_bind_btTriangleMesh_btTriangleMesh_0:rx,_emscripten_bind_btTriangleMesh_btTriangleMesh_1:ew,_emscripten_bind_btTriangleMesh_btTriangleMesh_2:mv,_emscripten_bind_btTypedConstraint___destroy___0:px,_emscripten_bind_btTypedConstraint_enableFeedback_1:mz,_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btTypedConstraint_getParam_2:Rv,_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btTypedConstraint_setParam_3:fv,_emscripten_bind_btVector3___destroy___0:QB,_emscripten_bind_btVector3_btVector3_0:UH,_emscripten_bind_btVector3_btVector3_3:vq,_emscripten_bind_btVector3_dot_1:Kt,_emscripten_bind_btVector3_length_0:wy,_emscripten_bind_btVector3_normalize_0:AF,_emscripten_bind_btVector3_op_add_1:fD,_emscripten_bind_btVector3_op_mul_1:iu,_emscripten_bind_btVector3_op_sub_1:eD,_emscripten_bind_btVector3_rotate_2:gp,_emscripten_bind_btVector3_setValue_3:hr,_emscripten_bind_btVector3_setX_1:mE,_emscripten_bind_btVector3_setY_1:lE,_emscripten_bind_btVector3_setZ_1:kE,_emscripten_bind_btVector3_x_0:ZF,_emscripten_bind_btVector3_y_0:zE,_emscripten_bind_btVector3_z_0:yE,_emscripten_bind_btVector4___destroy___0:QB,_emscripten_bind_btVector4_btVector4_0:UH,_emscripten_bind_btVector4_btVector4_4:pp,_emscripten_bind_btVector4_dot_1:Kt,_emscripten_bind_btVector4_length_0:wy,_emscripten_bind_btVector4_normalize_0:AF,_emscripten_bind_btVector4_op_add_1:fD,_emscripten_bind_btVector4_op_mul_1:iu,_emscripten_bind_btVector4_op_sub_1:eD,_emscripten_bind_btVector4_rotate_2:fp,_emscripten_bind_btVector4_setValue_4:Tp,_emscripten_bind_btVector4_setX_1:mE,_emscripten_bind_btVector4_setY_1:lE,_emscripten_bind_btVector4_setZ_1:kE,_emscripten_bind_btVector4_w_0:AE,_emscripten_bind_btVector4_x_0:ZF,_emscripten_bind_btVector4_y_0:zE,_emscripten_bind_btVector4_z_0:yE,_emscripten_bind_btVehicleRaycasterResult___destroy___0:TD,_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0:TG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0:XG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0:gJ,_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1:RE,_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1:cs,_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1:Gs,_emscripten_bind_btVehicleRaycaster___destroy___0:px,_emscripten_bind_btVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btVehicleTuning_btVehicleTuning_0:Ky,_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0:UG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0:SG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0:VG,_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0:RG,_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0:bH,_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0:GF,_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1:bF,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1:QE,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1:RF,_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1:mG,_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1:lG,_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1:MG,_emscripten_bind_btWheelInfoConstructionInfo___destroy___0:TD,_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0:oB,_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0:gJ,_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0:OF,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0:LG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0:gG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0:HG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0:DG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0:iH,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0:XG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0:hG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0:CG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0:rG,_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1:Vz,_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1:Gs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1:PD,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1:YE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1:eE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1:kF,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1:FE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1:Sr,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1:cs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1:fE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1:EE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1:rE,_emscripten_bind_btWheelInfo___destroy___0:TD,_emscripten_bind_btWheelInfo_btWheelInfo_1:$w,_emscripten_bind_btWheelInfo_getSuspensionRestLength_0:iE,_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0:sD,_emscripten_bind_btWheelInfo_get_m_brake_0:FF,_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0:lF,_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0:gC,_emscripten_bind_btWheelInfo_get_m_deltaRotation_0:ME,_emscripten_bind_btWheelInfo_get_m_engineForce_0:eF,_emscripten_bind_btWheelInfo_get_m_frictionSlip_0:_E,_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0:bE,_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0:HD,_emscripten_bind_btWheelInfo_get_m_raycastInfo_0:gJ,_emscripten_bind_btWheelInfo_get_m_rollInfluence_0:LE,_emscripten_bind_btWheelInfo_get_m_rotation_0:uF,_emscripten_bind_btWheelInfo_get_m_skidInfo_0:tF,_emscripten_bind_btWheelInfo_get_m_steering_0:sF,_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0:PC,_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0:iE,_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0:UD,_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0:uG,_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0:SF,_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0:_C,_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0:dD,_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0:ZE,_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0:GD,_emscripten_bind_btWheelInfo_get_m_worldTransform_0:MH,_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1:tB,_emscripten_bind_btWheelInfo_set_m_brake_1:cD,_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1:Jr,_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1:jA,_emscripten_bind_btWheelInfo_set_m_deltaRotation_1:UB,_emscripten_bind_btWheelInfo_set_m_engineForce_1:rC,_emscripten_bind_btWheelInfo_set_m_frictionSlip_1:fC,_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1:sB,_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1:gB,_emscripten_bind_btWheelInfo_set_m_raycastInfo_1:Et,_emscripten_bind_btWheelInfo_set_m_rollInfluence_1:TB,_emscripten_bind_btWheelInfo_set_m_rotation_1:OC,_emscripten_bind_btWheelInfo_set_m_skidInfo_1:NC,_emscripten_bind_btWheelInfo_set_m_steering_1:MC,_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1:dC,_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1:fB,_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1:nB,_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1:_r,_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1:Rr,_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1:PA,_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1:XA,_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1:eC,_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1:yC,_emscripten_bind_btWheelInfo_set_m_worldTransform_1:gA,_emscripten_bind_btWheelInfo_updateWheel_2:Zi,_emscripten_bind_tAnchorArray___destroy___0:ay,_emscripten_bind_tAnchorArray_at_1:ls,_emscripten_bind_tAnchorArray_clear_0:qC,_emscripten_bind_tAnchorArray_pop_back_0:HA,_emscripten_bind_tAnchorArray_push_back_1:Tx,_emscripten_bind_tAnchorArray_size_0:DF,_emscripten_bind_tFaceArray___destroy___0:ay,_emscripten_bind_tFaceArray_at_1:Nx,_emscripten_bind_tFaceArray_size_0:DF,_emscripten_bind_tLinkArray___destroy___0:ay,_emscripten_bind_tLinkArray_at_1:Mx,_emscripten_bind_tLinkArray_size_0:DF,_emscripten_bind_tMaterialArray___destroy___0:ay,_emscripten_bind_tMaterialArray_at_1:tw,_emscripten_bind_tMaterialArray_size_0:DF,_emscripten_bind_tNodeArray___destroy___0:ay,_emscripten_bind_tNodeArray_at_1:Lx,_emscripten_bind_tNodeArray_size_0:DF,_emscripten_enum_PHY_ScalarType_PHY_DOUBLE:RI,_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88:FI,_emscripten_enum_PHY_ScalarType_PHY_FLOAT:kJ,_emscripten_enum_PHY_ScalarType_PHY_INTEGER:QI,_emscripten_enum_PHY_ScalarType_PHY_SHORT:TI,_emscripten_enum_PHY_ScalarType_PHY_UCHAR:SI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM:TI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP:RI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM:FI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP:QI,_free:Cd,_i64Add:Ow,_i64Subtract:sw,_llvm_bswap_i16:JH,_llvm_bswap_i32:KB,_malloc:sc,_memcpy:gi,_memmove:$p,_memset:Yk,_sbrk:_o,dynCall_di:dG,dynCall_did:ED,dynCall_diidii:zv,dynCall_diii:vz,dynCall_diiidii:hu,dynCall_diiii:Yw,dynCall_diiiii:lv,dynCall_diiiiiiii:bs,dynCall_diiiiiiiii:or,dynCall_diiiiiiiiii:zq,dynCall_ii:IF,dynCall_iidid:Hx,dynCall_iii:SB,dynCall_iiid:Qz,dynCall_iiii:az,dynCall_iiiii:Jw,dynCall_iiiiii:gv,dynCall_iiiiiii:Qt,dynCall_iiiiiiiii:Yr,dynCall_iiiiiiiiiii:xq,dynCall_v:PI,dynCall_vi:eH,dynCall_vid:wE,dynCall_vidd:yB,dynCall_viddiii:Xu,dynCall_vidi:NA,dynCall_vidii:gy,dynCall_vii:DD,dynCall_viid:WA,dynCall_viidi:fy,dynCall_viidii:Xv,dynCall_viii:eA,dynCall_viiid:$x,dynCall_viiidii:Hu,dynCall_viiii:kx,dynCall_viiiid:Wv,dynCall_viiiidddddidi:fq,dynCall_viiiiddddiid:Kq,dynCall_viiiii:Ev,dynCall_viiiiid:Gu,dynCall_viiiiii:ou,dynCall_viiiiiii:ft,dynCall_viiiiiiiii:zr,dynCall_viiiiiiiiii:Nq,establishStackSpace:tG,getTempRet0:hJ,runPostSets:hI,setTempRet0:dJ,setThrew:rD,stackAlloc:rA,stackRestore:bJ,stackSave:iJ}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var __GLOBAL__sub_I_btConeTwistConstraint_cpp=Module["__GLOBAL__sub_I_btConeTwistConstraint_cpp"]=asm["__GLOBAL__sub_I_btConeTwistConstraint_cpp"];var __GLOBAL__sub_I_btQuickprof_cpp=Module["__GLOBAL__sub_I_btQuickprof_cpp"]=asm["__GLOBAL__sub_I_btQuickprof_cpp"];var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _emscripten_bind_Anchor___destroy___0=Module["_emscripten_bind_Anchor___destroy___0"]=asm["_emscripten_bind_Anchor___destroy___0"];var _emscripten_bind_Anchor_get_m_body_0=Module["_emscripten_bind_Anchor_get_m_body_0"]=asm["_emscripten_bind_Anchor_get_m_body_0"];var _emscripten_bind_Anchor_get_m_c0_0=Module["_emscripten_bind_Anchor_get_m_c0_0"]=asm["_emscripten_bind_Anchor_get_m_c0_0"];var _emscripten_bind_Anchor_get_m_c1_0=Module["_emscripten_bind_Anchor_get_m_c1_0"]=asm["_emscripten_bind_Anchor_get_m_c1_0"];var _emscripten_bind_Anchor_get_m_c2_0=Module["_emscripten_bind_Anchor_get_m_c2_0"]=asm["_emscripten_bind_Anchor_get_m_c2_0"];var _emscripten_bind_Anchor_get_m_influence_0=Module["_emscripten_bind_Anchor_get_m_influence_0"]=asm["_emscripten_bind_Anchor_get_m_influence_0"];var _emscripten_bind_Anchor_get_m_local_0=Module["_emscripten_bind_Anchor_get_m_local_0"]=asm["_emscripten_bind_Anchor_get_m_local_0"];var _emscripten_bind_Anchor_get_m_node_0=Module["_emscripten_bind_Anchor_get_m_node_0"]=asm["_emscripten_bind_Anchor_get_m_node_0"];var _emscripten_bind_Anchor_set_m_body_1=Module["_emscripten_bind_Anchor_set_m_body_1"]=asm["_emscripten_bind_Anchor_set_m_body_1"];var _emscripten_bind_Anchor_set_m_c0_1=Module["_emscripten_bind_Anchor_set_m_c0_1"]=asm["_emscripten_bind_Anchor_set_m_c0_1"];var _emscripten_bind_Anchor_set_m_c1_1=Module["_emscripten_bind_Anchor_set_m_c1_1"]=asm["_emscripten_bind_Anchor_set_m_c1_1"];var _emscripten_bind_Anchor_set_m_c2_1=Module["_emscripten_bind_Anchor_set_m_c2_1"]=asm["_emscripten_bind_Anchor_set_m_c2_1"];var _emscripten_bind_Anchor_set_m_influence_1=Module["_emscripten_bind_Anchor_set_m_influence_1"]=asm["_emscripten_bind_Anchor_set_m_influence_1"];var _emscripten_bind_Anchor_set_m_local_1=Module["_emscripten_bind_Anchor_set_m_local_1"]=asm["_emscripten_bind_Anchor_set_m_local_1"];var _emscripten_bind_Anchor_set_m_node_1=Module["_emscripten_bind_Anchor_set_m_node_1"]=asm["_emscripten_bind_Anchor_set_m_node_1"];var _emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=Module["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"]=asm["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"];var _emscripten_bind_ClosestConvexResultCallback___destroy___0=Module["_emscripten_bind_ClosestConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestConvexResultCallback___destroy___0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_hasHit_0=Module["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"];var _emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=Module["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"]=asm["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"];var _emscripten_bind_ClosestRayResultCallback___destroy___0=Module["_emscripten_bind_ClosestRayResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestRayResultCallback___destroy___0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"];var _emscripten_bind_ClosestRayResultCallback_hasHit_0=Module["_emscripten_bind_ClosestRayResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestRayResultCallback_hasHit_0"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"];var _emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=Module["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"]=asm["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"];var _emscripten_bind_ConcreteContactResultCallback___destroy___0=Module["_emscripten_bind_ConcreteContactResultCallback___destroy___0"]=asm["_emscripten_bind_ConcreteContactResultCallback___destroy___0"];var _emscripten_bind_ConcreteContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"];var _emscripten_bind_Config___destroy___0=Module["_emscripten_bind_Config___destroy___0"]=asm["_emscripten_bind_Config___destroy___0"];var _emscripten_bind_Config_get_citerations_0=Module["_emscripten_bind_Config_get_citerations_0"]=asm["_emscripten_bind_Config_get_citerations_0"];var _emscripten_bind_Config_get_collisions_0=Module["_emscripten_bind_Config_get_collisions_0"]=asm["_emscripten_bind_Config_get_collisions_0"];var _emscripten_bind_Config_get_diterations_0=Module["_emscripten_bind_Config_get_diterations_0"]=asm["_emscripten_bind_Config_get_diterations_0"];var _emscripten_bind_Config_get_kAHR_0=Module["_emscripten_bind_Config_get_kAHR_0"]=asm["_emscripten_bind_Config_get_kAHR_0"];var _emscripten_bind_Config_get_kCHR_0=Module["_emscripten_bind_Config_get_kCHR_0"]=asm["_emscripten_bind_Config_get_kCHR_0"];var _emscripten_bind_Config_get_kDF_0=Module["_emscripten_bind_Config_get_kDF_0"]=asm["_emscripten_bind_Config_get_kDF_0"];var _emscripten_bind_Config_get_kDG_0=Module["_emscripten_bind_Config_get_kDG_0"]=asm["_emscripten_bind_Config_get_kDG_0"];var _emscripten_bind_Config_get_kDP_0=Module["_emscripten_bind_Config_get_kDP_0"]=asm["_emscripten_bind_Config_get_kDP_0"];var _emscripten_bind_Config_get_kKHR_0=Module["_emscripten_bind_Config_get_kKHR_0"]=asm["_emscripten_bind_Config_get_kKHR_0"];var _emscripten_bind_Config_get_kLF_0=Module["_emscripten_bind_Config_get_kLF_0"]=asm["_emscripten_bind_Config_get_kLF_0"];var _emscripten_bind_Config_get_kMT_0=Module["_emscripten_bind_Config_get_kMT_0"]=asm["_emscripten_bind_Config_get_kMT_0"];var _emscripten_bind_Config_get_kPR_0=Module["_emscripten_bind_Config_get_kPR_0"]=asm["_emscripten_bind_Config_get_kPR_0"];var _emscripten_bind_Config_get_kSHR_0=Module["_emscripten_bind_Config_get_kSHR_0"]=asm["_emscripten_bind_Config_get_kSHR_0"];var _emscripten_bind_Config_get_kSKHR_CL_0=Module["_emscripten_bind_Config_get_kSKHR_CL_0"]=asm["_emscripten_bind_Config_get_kSKHR_CL_0"];var _emscripten_bind_Config_get_kSK_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSK_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSK_SPLT_CL_0"];var _emscripten_bind_Config_get_kSRHR_CL_0=Module["_emscripten_bind_Config_get_kSRHR_CL_0"]=asm["_emscripten_bind_Config_get_kSRHR_CL_0"];var _emscripten_bind_Config_get_kSR_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSR_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSR_SPLT_CL_0"];var _emscripten_bind_Config_get_kSSHR_CL_0=Module["_emscripten_bind_Config_get_kSSHR_CL_0"]=asm["_emscripten_bind_Config_get_kSSHR_CL_0"];var _emscripten_bind_Config_get_kSS_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSS_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSS_SPLT_CL_0"];var _emscripten_bind_Config_get_kVCF_0=Module["_emscripten_bind_Config_get_kVCF_0"]=asm["_emscripten_bind_Config_get_kVCF_0"];var _emscripten_bind_Config_get_kVC_0=Module["_emscripten_bind_Config_get_kVC_0"]=asm["_emscripten_bind_Config_get_kVC_0"];var _emscripten_bind_Config_get_maxvolume_0=Module["_emscripten_bind_Config_get_maxvolume_0"]=asm["_emscripten_bind_Config_get_maxvolume_0"];var _emscripten_bind_Config_get_piterations_0=Module["_emscripten_bind_Config_get_piterations_0"]=asm["_emscripten_bind_Config_get_piterations_0"];var _emscripten_bind_Config_get_timescale_0=Module["_emscripten_bind_Config_get_timescale_0"]=asm["_emscripten_bind_Config_get_timescale_0"];var _emscripten_bind_Config_get_viterations_0=Module["_emscripten_bind_Config_get_viterations_0"]=asm["_emscripten_bind_Config_get_viterations_0"];var _emscripten_bind_Config_set_citerations_1=Module["_emscripten_bind_Config_set_citerations_1"]=asm["_emscripten_bind_Config_set_citerations_1"];var _emscripten_bind_Config_set_collisions_1=Module["_emscripten_bind_Config_set_collisions_1"]=asm["_emscripten_bind_Config_set_collisions_1"];var _emscripten_bind_Config_set_diterations_1=Module["_emscripten_bind_Config_set_diterations_1"]=asm["_emscripten_bind_Config_set_diterations_1"];var _emscripten_bind_Config_set_kAHR_1=Module["_emscripten_bind_Config_set_kAHR_1"]=asm["_emscripten_bind_Config_set_kAHR_1"];var _emscripten_bind_Config_set_kCHR_1=Module["_emscripten_bind_Config_set_kCHR_1"]=asm["_emscripten_bind_Config_set_kCHR_1"];var _emscripten_bind_Config_set_kDF_1=Module["_emscripten_bind_Config_set_kDF_1"]=asm["_emscripten_bind_Config_set_kDF_1"];var _emscripten_bind_Config_set_kDG_1=Module["_emscripten_bind_Config_set_kDG_1"]=asm["_emscripten_bind_Config_set_kDG_1"];var _emscripten_bind_Config_set_kDP_1=Module["_emscripten_bind_Config_set_kDP_1"]=asm["_emscripten_bind_Config_set_kDP_1"];var _emscripten_bind_Config_set_kKHR_1=Module["_emscripten_bind_Config_set_kKHR_1"]=asm["_emscripten_bind_Config_set_kKHR_1"];var _emscripten_bind_Config_set_kLF_1=Module["_emscripten_bind_Config_set_kLF_1"]=asm["_emscripten_bind_Config_set_kLF_1"];var _emscripten_bind_Config_set_kMT_1=Module["_emscripten_bind_Config_set_kMT_1"]=asm["_emscripten_bind_Config_set_kMT_1"];var _emscripten_bind_Config_set_kPR_1=Module["_emscripten_bind_Config_set_kPR_1"]=asm["_emscripten_bind_Config_set_kPR_1"];var _emscripten_bind_Config_set_kSHR_1=Module["_emscripten_bind_Config_set_kSHR_1"]=asm["_emscripten_bind_Config_set_kSHR_1"];var _emscripten_bind_Config_set_kSKHR_CL_1=Module["_emscripten_bind_Config_set_kSKHR_CL_1"]=asm["_emscripten_bind_Config_set_kSKHR_CL_1"];var _emscripten_bind_Config_set_kSK_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSK_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSK_SPLT_CL_1"];var _emscripten_bind_Config_set_kSRHR_CL_1=Module["_emscripten_bind_Config_set_kSRHR_CL_1"]=asm["_emscripten_bind_Config_set_kSRHR_CL_1"];var _emscripten_bind_Config_set_kSR_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSR_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSR_SPLT_CL_1"];var _emscripten_bind_Config_set_kSSHR_CL_1=Module["_emscripten_bind_Config_set_kSSHR_CL_1"]=asm["_emscripten_bind_Config_set_kSSHR_CL_1"];var _emscripten_bind_Config_set_kSS_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSS_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSS_SPLT_CL_1"];var _emscripten_bind_Config_set_kVCF_1=Module["_emscripten_bind_Config_set_kVCF_1"]=asm["_emscripten_bind_Config_set_kVCF_1"];var _emscripten_bind_Config_set_kVC_1=Module["_emscripten_bind_Config_set_kVC_1"]=asm["_emscripten_bind_Config_set_kVC_1"];var _emscripten_bind_Config_set_maxvolume_1=Module["_emscripten_bind_Config_set_maxvolume_1"]=asm["_emscripten_bind_Config_set_maxvolume_1"];var _emscripten_bind_Config_set_piterations_1=Module["_emscripten_bind_Config_set_piterations_1"]=asm["_emscripten_bind_Config_set_piterations_1"];var _emscripten_bind_Config_set_timescale_1=Module["_emscripten_bind_Config_set_timescale_1"]=asm["_emscripten_bind_Config_set_timescale_1"];var _emscripten_bind_Config_set_viterations_1=Module["_emscripten_bind_Config_set_viterations_1"]=asm["_emscripten_bind_Config_set_viterations_1"];var _emscripten_bind_ContactResultCallback___destroy___0=Module["_emscripten_bind_ContactResultCallback___destroy___0"]=asm["_emscripten_bind_ContactResultCallback___destroy___0"];var _emscripten_bind_ContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ContactResultCallback_addSingleResult_7"];var _emscripten_bind_ConvexResultCallback___destroy___0=Module["_emscripten_bind_ConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ConvexResultCallback___destroy___0"];var _emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ConvexResultCallback_hasHit_0=Module["_emscripten_bind_ConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ConvexResultCallback_hasHit_0"];var _emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_Face___destroy___0=Module["_emscripten_bind_Face___destroy___0"]=asm["_emscripten_bind_Face___destroy___0"];var _emscripten_bind_Face_get_m_n_1=Module["_emscripten_bind_Face_get_m_n_1"]=asm["_emscripten_bind_Face_get_m_n_1"];var _emscripten_bind_Face_get_m_normal_0=Module["_emscripten_bind_Face_get_m_normal_0"]=asm["_emscripten_bind_Face_get_m_normal_0"];var _emscripten_bind_Face_set_m_n_2=Module["_emscripten_bind_Face_set_m_n_2"]=asm["_emscripten_bind_Face_set_m_n_2"];var _emscripten_bind_Face_set_m_normal_1=Module["_emscripten_bind_Face_set_m_normal_1"]=asm["_emscripten_bind_Face_set_m_normal_1"];var _emscripten_bind_Joint___destroy___0=Module["_emscripten_bind_Joint___destroy___0"]=asm["_emscripten_bind_Joint___destroy___0"];var _emscripten_bind_Joint_get_m_cfm_0=Module["_emscripten_bind_Joint_get_m_cfm_0"]=asm["_emscripten_bind_Joint_get_m_cfm_0"];var _emscripten_bind_Joint_get_m_delete_0=Module["_emscripten_bind_Joint_get_m_delete_0"]=asm["_emscripten_bind_Joint_get_m_delete_0"];var _emscripten_bind_Joint_get_m_drift_0=Module["_emscripten_bind_Joint_get_m_drift_0"]=asm["_emscripten_bind_Joint_get_m_drift_0"];var _emscripten_bind_Joint_get_m_erp_0=Module["_emscripten_bind_Joint_get_m_erp_0"]=asm["_emscripten_bind_Joint_get_m_erp_0"];var _emscripten_bind_Joint_get_m_massmatrix_0=Module["_emscripten_bind_Joint_get_m_massmatrix_0"]=asm["_emscripten_bind_Joint_get_m_massmatrix_0"];var _emscripten_bind_Joint_get_m_refs_1=Module["_emscripten_bind_Joint_get_m_refs_1"]=asm["_emscripten_bind_Joint_get_m_refs_1"];var _emscripten_bind_Joint_get_m_sdrift_0=Module["_emscripten_bind_Joint_get_m_sdrift_0"]=asm["_emscripten_bind_Joint_get_m_sdrift_0"];var _emscripten_bind_Joint_get_m_split_0=Module["_emscripten_bind_Joint_get_m_split_0"]=asm["_emscripten_bind_Joint_get_m_split_0"];var _emscripten_bind_Joint_set_m_cfm_1=Module["_emscripten_bind_Joint_set_m_cfm_1"]=asm["_emscripten_bind_Joint_set_m_cfm_1"];var _emscripten_bind_Joint_set_m_delete_1=Module["_emscripten_bind_Joint_set_m_delete_1"]=asm["_emscripten_bind_Joint_set_m_delete_1"];var _emscripten_bind_Joint_set_m_drift_1=Module["_emscripten_bind_Joint_set_m_drift_1"]=asm["_emscripten_bind_Joint_set_m_drift_1"];var _emscripten_bind_Joint_set_m_erp_1=Module["_emscripten_bind_Joint_set_m_erp_1"]=asm["_emscripten_bind_Joint_set_m_erp_1"];var _emscripten_bind_Joint_set_m_massmatrix_1=Module["_emscripten_bind_Joint_set_m_massmatrix_1"]=asm["_emscripten_bind_Joint_set_m_massmatrix_1"];var _emscripten_bind_Joint_set_m_refs_2=Module["_emscripten_bind_Joint_set_m_refs_2"]=asm["_emscripten_bind_Joint_set_m_refs_2"];var _emscripten_bind_Joint_set_m_sdrift_1=Module["_emscripten_bind_Joint_set_m_sdrift_1"]=asm["_emscripten_bind_Joint_set_m_sdrift_1"];var _emscripten_bind_Joint_set_m_split_1=Module["_emscripten_bind_Joint_set_m_split_1"]=asm["_emscripten_bind_Joint_set_m_split_1"];var _emscripten_bind_LJoint___destroy___0=Module["_emscripten_bind_LJoint___destroy___0"]=asm["_emscripten_bind_LJoint___destroy___0"];var _emscripten_bind_LJoint_get_m_rpos_1=Module["_emscripten_bind_LJoint_get_m_rpos_1"]=asm["_emscripten_bind_LJoint_get_m_rpos_1"];var _emscripten_bind_LJoint_set_m_rpos_2=Module["_emscripten_bind_LJoint_set_m_rpos_2"]=asm["_emscripten_bind_LJoint_set_m_rpos_2"];var _emscripten_bind_Link___destroy___0=Module["_emscripten_bind_Link___destroy___0"]=asm["_emscripten_bind_Link___destroy___0"];var _emscripten_bind_Link_get_m_n_1=Module["_emscripten_bind_Link_get_m_n_1"]=asm["_emscripten_bind_Link_get_m_n_1"];var _emscripten_bind_Link_set_m_n_2=Module["_emscripten_bind_Link_set_m_n_2"]=asm["_emscripten_bind_Link_set_m_n_2"];var _emscripten_bind_LocalConvexResult_LocalConvexResult_5=Module["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"]=asm["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"];var _emscripten_bind_LocalConvexResult___destroy___0=Module["_emscripten_bind_LocalConvexResult___destroy___0"]=asm["_emscripten_bind_LocalConvexResult___destroy___0"];var _emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"];var _emscripten_bind_LocalConvexResult_get_m_hitFraction_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"];var _emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=Module["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"];var _emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"];var _emscripten_bind_LocalConvexResult_set_m_hitFraction_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"];var _emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=Module["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"];var _emscripten_bind_LocalShapeInfo___destroy___0=Module["_emscripten_bind_LocalShapeInfo___destroy___0"]=asm["_emscripten_bind_LocalShapeInfo___destroy___0"];var _emscripten_bind_LocalShapeInfo_get_m_shapePart_0=Module["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"];var _emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=Module["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"];var _emscripten_bind_LocalShapeInfo_set_m_shapePart_1=Module["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"];var _emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=Module["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"];var _emscripten_bind_Material___destroy___0=Module["_emscripten_bind_Material___destroy___0"]=asm["_emscripten_bind_Material___destroy___0"];var _emscripten_bind_Material_get_m_flags_0=Module["_emscripten_bind_Material_get_m_flags_0"]=asm["_emscripten_bind_Material_get_m_flags_0"];var _emscripten_bind_Material_get_m_kAST_0=Module["_emscripten_bind_Material_get_m_kAST_0"]=asm["_emscripten_bind_Material_get_m_kAST_0"];var _emscripten_bind_Material_get_m_kLST_0=Module["_emscripten_bind_Material_get_m_kLST_0"]=asm["_emscripten_bind_Material_get_m_kLST_0"];var _emscripten_bind_Material_get_m_kVST_0=Module["_emscripten_bind_Material_get_m_kVST_0"]=asm["_emscripten_bind_Material_get_m_kVST_0"];var _emscripten_bind_Material_set_m_flags_1=Module["_emscripten_bind_Material_set_m_flags_1"]=asm["_emscripten_bind_Material_set_m_flags_1"];var _emscripten_bind_Material_set_m_kAST_1=Module["_emscripten_bind_Material_set_m_kAST_1"]=asm["_emscripten_bind_Material_set_m_kAST_1"];var _emscripten_bind_Material_set_m_kLST_1=Module["_emscripten_bind_Material_set_m_kLST_1"]=asm["_emscripten_bind_Material_set_m_kLST_1"];var _emscripten_bind_Material_set_m_kVST_1=Module["_emscripten_bind_Material_set_m_kVST_1"]=asm["_emscripten_bind_Material_set_m_kVST_1"];var _emscripten_bind_Node___destroy___0=Module["_emscripten_bind_Node___destroy___0"]=asm["_emscripten_bind_Node___destroy___0"];var _emscripten_bind_Node_get_m_n_0=Module["_emscripten_bind_Node_get_m_n_0"]=asm["_emscripten_bind_Node_get_m_n_0"];var _emscripten_bind_Node_get_m_x_0=Module["_emscripten_bind_Node_get_m_x_0"]=asm["_emscripten_bind_Node_get_m_x_0"];var _emscripten_bind_Node_set_m_n_1=Module["_emscripten_bind_Node_set_m_n_1"]=asm["_emscripten_bind_Node_set_m_n_1"];var _emscripten_bind_Node_set_m_x_1=Module["_emscripten_bind_Node_set_m_x_1"]=asm["_emscripten_bind_Node_set_m_x_1"];var _emscripten_bind_RayResultCallback___destroy___0=Module["_emscripten_bind_RayResultCallback___destroy___0"]=asm["_emscripten_bind_RayResultCallback___destroy___0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_RayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_RayResultCallback_hasHit_0=Module["_emscripten_bind_RayResultCallback_hasHit_0"]=asm["_emscripten_bind_RayResultCallback_hasHit_0"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_RayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_RaycastInfo___destroy___0=Module["_emscripten_bind_RaycastInfo___destroy___0"]=asm["_emscripten_bind_RaycastInfo___destroy___0"];var _emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"];var _emscripten_bind_RaycastInfo_get_m_contactPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_groundObject_0=Module["_emscripten_bind_RaycastInfo_get_m_groundObject_0"]=asm["_emscripten_bind_RaycastInfo_get_m_groundObject_0"];var _emscripten_bind_RaycastInfo_get_m_hardPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_isInContact_0=Module["_emscripten_bind_RaycastInfo_get_m_isInContact_0"]=asm["_emscripten_bind_RaycastInfo_get_m_isInContact_0"];var _emscripten_bind_RaycastInfo_get_m_suspensionLength_0=Module["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"]=asm["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"];var _emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"];var _emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"];var _emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"];var _emscripten_bind_RaycastInfo_set_m_contactPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_groundObject_1=Module["_emscripten_bind_RaycastInfo_set_m_groundObject_1"]=asm["_emscripten_bind_RaycastInfo_set_m_groundObject_1"];var _emscripten_bind_RaycastInfo_set_m_hardPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_isInContact_1=Module["_emscripten_bind_RaycastInfo_set_m_isInContact_1"]=asm["_emscripten_bind_RaycastInfo_set_m_isInContact_1"];var _emscripten_bind_RaycastInfo_set_m_suspensionLength_1=Module["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"]=asm["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"];var _emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"];var _emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"];var _emscripten_bind_Specs___destroy___0=Module["_emscripten_bind_Specs___destroy___0"]=asm["_emscripten_bind_Specs___destroy___0"];var _emscripten_bind_Specs_get_position_0=Module["_emscripten_bind_Specs_get_position_0"]=asm["_emscripten_bind_Specs_get_position_0"];var _emscripten_bind_Specs_set_position_1=Module["_emscripten_bind_Specs_set_position_1"]=asm["_emscripten_bind_Specs_set_position_1"];var _emscripten_bind_VoidPtr___destroy___0=Module["_emscripten_bind_VoidPtr___destroy___0"]=asm["_emscripten_bind_VoidPtr___destroy___0"];var _emscripten_bind_btActionInterface___destroy___0=Module["_emscripten_bind_btActionInterface___destroy___0"]=asm["_emscripten_bind_btActionInterface___destroy___0"];var _emscripten_bind_btActionInterface_updateAction_2=Module["_emscripten_bind_btActionInterface_updateAction_2"]=asm["_emscripten_bind_btActionInterface_updateAction_2"];var _emscripten_bind_btAxisSweep3___destroy___0=Module["_emscripten_bind_btAxisSweep3___destroy___0"]=asm["_emscripten_bind_btAxisSweep3___destroy___0"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_2=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_3=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_4=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_5=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"];var _emscripten_bind_btBoxShape___destroy___0=Module["_emscripten_bind_btBoxShape___destroy___0"]=asm["_emscripten_bind_btBoxShape___destroy___0"];var _emscripten_bind_btBoxShape_btBoxShape_1=Module["_emscripten_bind_btBoxShape_btBoxShape_1"]=asm["_emscripten_bind_btBoxShape_btBoxShape_1"];var _emscripten_bind_btBoxShape_calculateLocalInertia_2=Module["_emscripten_bind_btBoxShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBoxShape_calculateLocalInertia_2"];var _emscripten_bind_btBoxShape_getLocalScaling_0=Module["_emscripten_bind_btBoxShape_getLocalScaling_0"]=asm["_emscripten_bind_btBoxShape_getLocalScaling_0"];var _emscripten_bind_btBoxShape_getMargin_0=Module["_emscripten_bind_btBoxShape_getMargin_0"]=asm["_emscripten_bind_btBoxShape_getMargin_0"];var _emscripten_bind_btBoxShape_setLocalScaling_1=Module["_emscripten_bind_btBoxShape_setLocalScaling_1"]=asm["_emscripten_bind_btBoxShape_setLocalScaling_1"];var _emscripten_bind_btBoxShape_setMargin_1=Module["_emscripten_bind_btBoxShape_setMargin_1"]=asm["_emscripten_bind_btBoxShape_setMargin_1"];var _emscripten_bind_btBroadphaseInterface___destroy___0=Module["_emscripten_bind_btBroadphaseInterface___destroy___0"]=asm["_emscripten_bind_btBroadphaseInterface___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape___destroy___0=Module["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"];var _emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX___destroy___0=Module["_emscripten_bind_btCapsuleShapeX___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeX___destroy___0"];var _emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2=Module["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"]=asm["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"];var _emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeX_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeX_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeX_getMargin_0=Module["_emscripten_bind_btCapsuleShapeX_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeX_getMargin_0"];var _emscripten_bind_btCapsuleShapeX_getRadius_0=Module["_emscripten_bind_btCapsuleShapeX_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeX_getRadius_0"];var _emscripten_bind_btCapsuleShapeX_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeX_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX_setMargin_1=Module["_emscripten_bind_btCapsuleShapeX_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeX_setMargin_1"];var _emscripten_bind_btCapsuleShapeZ___destroy___0=Module["_emscripten_bind_btCapsuleShapeZ___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeZ___destroy___0"];var _emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=Module["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"]=asm["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"];var _emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeZ_getMargin_0=Module["_emscripten_bind_btCapsuleShapeZ_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getMargin_0"];var _emscripten_bind_btCapsuleShapeZ_getRadius_0=Module["_emscripten_bind_btCapsuleShapeZ_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getRadius_0"];var _emscripten_bind_btCapsuleShapeZ_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeZ_setMargin_1=Module["_emscripten_bind_btCapsuleShapeZ_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setMargin_1"];var _emscripten_bind_btCapsuleShape___destroy___0=Module["_emscripten_bind_btCapsuleShape___destroy___0"]=asm["_emscripten_bind_btCapsuleShape___destroy___0"];var _emscripten_bind_btCapsuleShape_btCapsuleShape_2=Module["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"]=asm["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"];var _emscripten_bind_btCapsuleShape_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShape_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShape_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShape_getHalfHeight_0"];var _emscripten_bind_btCapsuleShape_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShape_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShape_getLocalScaling_0"];var _emscripten_bind_btCapsuleShape_getMargin_0=Module["_emscripten_bind_btCapsuleShape_getMargin_0"]=asm["_emscripten_bind_btCapsuleShape_getMargin_0"];var _emscripten_bind_btCapsuleShape_getRadius_0=Module["_emscripten_bind_btCapsuleShape_getRadius_0"]=asm["_emscripten_bind_btCapsuleShape_getRadius_0"];var _emscripten_bind_btCapsuleShape_getUpAxis_0=Module["_emscripten_bind_btCapsuleShape_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShape_getUpAxis_0"];var _emscripten_bind_btCapsuleShape_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShape_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShape_setMargin_1=Module["_emscripten_bind_btCapsuleShape_setMargin_1"]=asm["_emscripten_bind_btCapsuleShape_setMargin_1"];var _emscripten_bind_btCollisionConfiguration___destroy___0=Module["_emscripten_bind_btCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btCollisionConfiguration___destroy___0"];var _emscripten_bind_btCollisionDispatcher___destroy___0=Module["_emscripten_bind_btCollisionDispatcher___destroy___0"]=asm["_emscripten_bind_btCollisionDispatcher___destroy___0"];var _emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=Module["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"]=asm["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"];var _emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btCollisionDispatcher_getNumManifolds_0=Module["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"];var _emscripten_bind_btCollisionObject___destroy___0=Module["_emscripten_bind_btCollisionObject___destroy___0"]=asm["_emscripten_bind_btCollisionObject___destroy___0"];var _emscripten_bind_btCollisionObject_activate_0=Module["_emscripten_bind_btCollisionObject_activate_0"]=asm["_emscripten_bind_btCollisionObject_activate_0"];var _emscripten_bind_btCollisionObject_activate_1=Module["_emscripten_bind_btCollisionObject_activate_1"]=asm["_emscripten_bind_btCollisionObject_activate_1"];var _emscripten_bind_btCollisionObject_forceActivationState_1=Module["_emscripten_bind_btCollisionObject_forceActivationState_1"]=asm["_emscripten_bind_btCollisionObject_forceActivationState_1"];var _emscripten_bind_btCollisionObject_getCollisionFlags_0=Module["_emscripten_bind_btCollisionObject_getCollisionFlags_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionFlags_0"];var _emscripten_bind_btCollisionObject_getCollisionShape_0=Module["_emscripten_bind_btCollisionObject_getCollisionShape_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionShape_0"];var _emscripten_bind_btCollisionObject_getUserIndex_0=Module["_emscripten_bind_btCollisionObject_getUserIndex_0"]=asm["_emscripten_bind_btCollisionObject_getUserIndex_0"];var _emscripten_bind_btCollisionObject_getUserPointer_0=Module["_emscripten_bind_btCollisionObject_getUserPointer_0"]=asm["_emscripten_bind_btCollisionObject_getUserPointer_0"];var _emscripten_bind_btCollisionObject_getWorldTransform_0=Module["_emscripten_bind_btCollisionObject_getWorldTransform_0"]=asm["_emscripten_bind_btCollisionObject_getWorldTransform_0"];var _emscripten_bind_btCollisionObject_isActive_0=Module["_emscripten_bind_btCollisionObject_isActive_0"]=asm["_emscripten_bind_btCollisionObject_isActive_0"];var _emscripten_bind_btCollisionObject_isKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isKinematicObject_0"];var _emscripten_bind_btCollisionObject_isStaticObject_0=Module["_emscripten_bind_btCollisionObject_isStaticObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticObject_0"];var _emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btCollisionObject_setActivationState_1=Module["_emscripten_bind_btCollisionObject_setActivationState_1"]=asm["_emscripten_bind_btCollisionObject_setActivationState_1"];var _emscripten_bind_btCollisionObject_setAnisotropicFriction_2=Module["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"];var _emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"];var _emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btCollisionObject_setCollisionFlags_1=Module["_emscripten_bind_btCollisionObject_setCollisionFlags_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionFlags_1"];var _emscripten_bind_btCollisionObject_setCollisionShape_1=Module["_emscripten_bind_btCollisionObject_setCollisionShape_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionShape_1"];var _emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"];var _emscripten_bind_btCollisionObject_setFriction_1=Module["_emscripten_bind_btCollisionObject_setFriction_1"]=asm["_emscripten_bind_btCollisionObject_setFriction_1"];var _emscripten_bind_btCollisionObject_setRestitution_1=Module["_emscripten_bind_btCollisionObject_setRestitution_1"]=asm["_emscripten_bind_btCollisionObject_setRestitution_1"];var _emscripten_bind_btCollisionObject_setRollingFriction_1=Module["_emscripten_bind_btCollisionObject_setRollingFriction_1"]=asm["_emscripten_bind_btCollisionObject_setRollingFriction_1"];var _emscripten_bind_btCollisionObject_setUserIndex_1=Module["_emscripten_bind_btCollisionObject_setUserIndex_1"]=asm["_emscripten_bind_btCollisionObject_setUserIndex_1"];var _emscripten_bind_btCollisionObject_setUserPointer_1=Module["_emscripten_bind_btCollisionObject_setUserPointer_1"]=asm["_emscripten_bind_btCollisionObject_setUserPointer_1"];var _emscripten_bind_btCollisionObject_setWorldTransform_1=Module["_emscripten_bind_btCollisionObject_setWorldTransform_1"]=asm["_emscripten_bind_btCollisionObject_setWorldTransform_1"];var _emscripten_bind_btCollisionShape___destroy___0=Module["_emscripten_bind_btCollisionShape___destroy___0"]=asm["_emscripten_bind_btCollisionShape___destroy___0"];var _emscripten_bind_btCollisionShape_calculateLocalInertia_2=Module["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"];var _emscripten_bind_btCollisionShape_getLocalScaling_0=Module["_emscripten_bind_btCollisionShape_getLocalScaling_0"]=asm["_emscripten_bind_btCollisionShape_getLocalScaling_0"];var _emscripten_bind_btCollisionShape_getMargin_0=Module["_emscripten_bind_btCollisionShape_getMargin_0"]=asm["_emscripten_bind_btCollisionShape_getMargin_0"];var _emscripten_bind_btCollisionShape_setLocalScaling_1=Module["_emscripten_bind_btCollisionShape_setLocalScaling_1"]=asm["_emscripten_bind_btCollisionShape_setLocalScaling_1"];var _emscripten_bind_btCollisionShape_setMargin_1=Module["_emscripten_bind_btCollisionShape_setMargin_1"]=asm["_emscripten_bind_btCollisionShape_setMargin_1"];var _emscripten_bind_btCollisionWorld___destroy___0=Module["_emscripten_bind_btCollisionWorld___destroy___0"]=asm["_emscripten_bind_btCollisionWorld___destroy___0"];var _emscripten_bind_btCollisionWorld_addCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_1"];var _emscripten_bind_btCollisionWorld_addCollisionObject_2=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_2"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_2"];var _emscripten_bind_btCollisionWorld_addCollisionObject_3=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_3"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_3"];var _emscripten_bind_btCollisionWorld_contactPairTest_3=Module["_emscripten_bind_btCollisionWorld_contactPairTest_3"]=asm["_emscripten_bind_btCollisionWorld_contactPairTest_3"];var _emscripten_bind_btCollisionWorld_contactTest_2=Module["_emscripten_bind_btCollisionWorld_contactTest_2"]=asm["_emscripten_bind_btCollisionWorld_contactTest_2"];var _emscripten_bind_btCollisionWorld_convexSweepTest_5=Module["_emscripten_bind_btCollisionWorld_convexSweepTest_5"]=asm["_emscripten_bind_btCollisionWorld_convexSweepTest_5"];var _emscripten_bind_btCollisionWorld_getBroadphase_0=Module["_emscripten_bind_btCollisionWorld_getBroadphase_0"]=asm["_emscripten_bind_btCollisionWorld_getBroadphase_0"];var _emscripten_bind_btCollisionWorld_getDispatchInfo_0=Module["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"];var _emscripten_bind_btCollisionWorld_getDispatcher_0=Module["_emscripten_bind_btCollisionWorld_getDispatcher_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatcher_0"];var _emscripten_bind_btCollisionWorld_getPairCache_0=Module["_emscripten_bind_btCollisionWorld_getPairCache_0"]=asm["_emscripten_bind_btCollisionWorld_getPairCache_0"];var _emscripten_bind_btCollisionWorld_rayTest_3=Module["_emscripten_bind_btCollisionWorld_rayTest_3"]=asm["_emscripten_bind_btCollisionWorld_rayTest_3"];var _emscripten_bind_btCollisionWorld_removeCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"];var _emscripten_bind_btCollisionWorld_updateSingleAabb_1=Module["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"];var _emscripten_bind_btCompoundShape___destroy___0=Module["_emscripten_bind_btCompoundShape___destroy___0"]=asm["_emscripten_bind_btCompoundShape___destroy___0"];var _emscripten_bind_btCompoundShape_addChildShape_2=Module["_emscripten_bind_btCompoundShape_addChildShape_2"]=asm["_emscripten_bind_btCompoundShape_addChildShape_2"];var _emscripten_bind_btCompoundShape_btCompoundShape_0=Module["_emscripten_bind_btCompoundShape_btCompoundShape_0"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_0"];var _emscripten_bind_btCompoundShape_btCompoundShape_1=Module["_emscripten_bind_btCompoundShape_btCompoundShape_1"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_1"];var _emscripten_bind_btCompoundShape_calculateLocalInertia_2=Module["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"];var _emscripten_bind_btCompoundShape_getChildShape_1=Module["_emscripten_bind_btCompoundShape_getChildShape_1"]=asm["_emscripten_bind_btCompoundShape_getChildShape_1"];var _emscripten_bind_btCompoundShape_getLocalScaling_0=Module["_emscripten_bind_btCompoundShape_getLocalScaling_0"]=asm["_emscripten_bind_btCompoundShape_getLocalScaling_0"];var _emscripten_bind_btCompoundShape_getMargin_0=Module["_emscripten_bind_btCompoundShape_getMargin_0"]=asm["_emscripten_bind_btCompoundShape_getMargin_0"];var _emscripten_bind_btCompoundShape_getNumChildShapes_0=Module["_emscripten_bind_btCompoundShape_getNumChildShapes_0"]=asm["_emscripten_bind_btCompoundShape_getNumChildShapes_0"];var _emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=Module["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"]=asm["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"];var _emscripten_bind_btCompoundShape_setLocalScaling_1=Module["_emscripten_bind_btCompoundShape_setLocalScaling_1"]=asm["_emscripten_bind_btCompoundShape_setLocalScaling_1"];var _emscripten_bind_btCompoundShape_setMargin_1=Module["_emscripten_bind_btCompoundShape_setMargin_1"]=asm["_emscripten_bind_btCompoundShape_setMargin_1"];var _emscripten_bind_btConcaveShape___destroy___0=Module["_emscripten_bind_btConcaveShape___destroy___0"]=asm["_emscripten_bind_btConcaveShape___destroy___0"];var _emscripten_bind_btConcaveShape_calculateLocalInertia_2=Module["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"];var _emscripten_bind_btConcaveShape_getLocalScaling_0=Module["_emscripten_bind_btConcaveShape_getLocalScaling_0"]=asm["_emscripten_bind_btConcaveShape_getLocalScaling_0"];var _emscripten_bind_btConcaveShape_setLocalScaling_1=Module["_emscripten_bind_btConcaveShape_setLocalScaling_1"]=asm["_emscripten_bind_btConcaveShape_setLocalScaling_1"];var _emscripten_bind_btConeShapeX___destroy___0=Module["_emscripten_bind_btConeShapeX___destroy___0"]=asm["_emscripten_bind_btConeShapeX___destroy___0"];var _emscripten_bind_btConeShapeX_btConeShapeX_2=Module["_emscripten_bind_btConeShapeX_btConeShapeX_2"]=asm["_emscripten_bind_btConeShapeX_btConeShapeX_2"];var _emscripten_bind_btConeShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeX_getLocalScaling_0=Module["_emscripten_bind_btConeShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeX_getLocalScaling_0"];var _emscripten_bind_btConeShapeX_setLocalScaling_1=Module["_emscripten_bind_btConeShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeX_setLocalScaling_1"];var _emscripten_bind_btConeShapeZ___destroy___0=Module["_emscripten_bind_btConeShapeZ___destroy___0"]=asm["_emscripten_bind_btConeShapeZ___destroy___0"];var _emscripten_bind_btConeShapeZ_btConeShapeZ_2=Module["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"]=asm["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"];var _emscripten_bind_btConeShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeZ_getLocalScaling_0=Module["_emscripten_bind_btConeShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeZ_getLocalScaling_0"];var _emscripten_bind_btConeShapeZ_setLocalScaling_1=Module["_emscripten_bind_btConeShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeZ_setLocalScaling_1"];var _emscripten_bind_btConeShape___destroy___0=Module["_emscripten_bind_btConeShape___destroy___0"]=asm["_emscripten_bind_btConeShape___destroy___0"];var _emscripten_bind_btConeShape_btConeShape_2=Module["_emscripten_bind_btConeShape_btConeShape_2"]=asm["_emscripten_bind_btConeShape_btConeShape_2"];var _emscripten_bind_btConeShape_calculateLocalInertia_2=Module["_emscripten_bind_btConeShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShape_calculateLocalInertia_2"];var _emscripten_bind_btConeShape_getLocalScaling_0=Module["_emscripten_bind_btConeShape_getLocalScaling_0"]=asm["_emscripten_bind_btConeShape_getLocalScaling_0"];var _emscripten_bind_btConeShape_setLocalScaling_1=Module["_emscripten_bind_btConeShape_setLocalScaling_1"]=asm["_emscripten_bind_btConeShape_setLocalScaling_1"];var _emscripten_bind_btConeTwistConstraint___destroy___0=Module["_emscripten_bind_btConeTwistConstraint___destroy___0"]=asm["_emscripten_bind_btConeTwistConstraint___destroy___0"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"];var _emscripten_bind_btConeTwistConstraint_enableFeedback_1=Module["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"];var _emscripten_bind_btConeTwistConstraint_enableMotor_1=Module["_emscripten_bind_btConeTwistConstraint_enableMotor_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableMotor_1"];var _emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btConeTwistConstraint_getParam_2=Module["_emscripten_bind_btConeTwistConstraint_getParam_2"]=asm["_emscripten_bind_btConeTwistConstraint_getParam_2"];var _emscripten_bind_btConeTwistConstraint_setAngularOnly_1=Module["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"];var _emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btConeTwistConstraint_setDamping_1=Module["_emscripten_bind_btConeTwistConstraint_setDamping_1"]=asm["_emscripten_bind_btConeTwistConstraint_setDamping_1"];var _emscripten_bind_btConeTwistConstraint_setLimit_2=Module["_emscripten_bind_btConeTwistConstraint_setLimit_2"]=asm["_emscripten_bind_btConeTwistConstraint_setLimit_2"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTarget_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"];var _emscripten_bind_btConeTwistConstraint_setParam_3=Module["_emscripten_bind_btConeTwistConstraint_setParam_3"]=asm["_emscripten_bind_btConeTwistConstraint_setParam_3"];var _emscripten_bind_btConstraintSetting___destroy___0=Module["_emscripten_bind_btConstraintSetting___destroy___0"]=asm["_emscripten_bind_btConstraintSetting___destroy___0"];var _emscripten_bind_btConstraintSetting_btConstraintSetting_0=Module["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"]=asm["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"];var _emscripten_bind_btConstraintSetting_get_m_damping_0=Module["_emscripten_bind_btConstraintSetting_get_m_damping_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_damping_0"];var _emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=Module["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"];var _emscripten_bind_btConstraintSetting_get_m_tau_0=Module["_emscripten_bind_btConstraintSetting_get_m_tau_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_tau_0"];var _emscripten_bind_btConstraintSetting_set_m_damping_1=Module["_emscripten_bind_btConstraintSetting_set_m_damping_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_damping_1"];var _emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=Module["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"];var _emscripten_bind_btConstraintSetting_set_m_tau_1=Module["_emscripten_bind_btConstraintSetting_set_m_tau_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_tau_1"];var _emscripten_bind_btConstraintSolver___destroy___0=Module["_emscripten_bind_btConstraintSolver___destroy___0"]=asm["_emscripten_bind_btConstraintSolver___destroy___0"];var _emscripten_bind_btContactSolverInfo___destroy___0=Module["_emscripten_bind_btContactSolverInfo___destroy___0"]=asm["_emscripten_bind_btContactSolverInfo___destroy___0"];var _emscripten_bind_btContactSolverInfo_get_m_numIterations_0=Module["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"];var _emscripten_bind_btContactSolverInfo_set_m_numIterations_1=Module["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"];var _emscripten_bind_btConvexHullShape___destroy___0=Module["_emscripten_bind_btConvexHullShape___destroy___0"]=asm["_emscripten_bind_btConvexHullShape___destroy___0"];var _emscripten_bind_btConvexHullShape_addPoint_1=Module["_emscripten_bind_btConvexHullShape_addPoint_1"]=asm["_emscripten_bind_btConvexHullShape_addPoint_1"];var _emscripten_bind_btConvexHullShape_addPoint_2=Module["_emscripten_bind_btConvexHullShape_addPoint_2"]=asm["_emscripten_bind_btConvexHullShape_addPoint_2"];var _emscripten_bind_btConvexHullShape_btConvexHullShape_0=Module["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"]=asm["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"];var _emscripten_bind_btConvexHullShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexHullShape_getLocalScaling_0=Module["_emscripten_bind_btConvexHullShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexHullShape_getLocalScaling_0"];var _emscripten_bind_btConvexHullShape_getMargin_0=Module["_emscripten_bind_btConvexHullShape_getMargin_0"]=asm["_emscripten_bind_btConvexHullShape_getMargin_0"];var _emscripten_bind_btConvexHullShape_setLocalScaling_1=Module["_emscripten_bind_btConvexHullShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexHullShape_setLocalScaling_1"];var _emscripten_bind_btConvexHullShape_setMargin_1=Module["_emscripten_bind_btConvexHullShape_setMargin_1"]=asm["_emscripten_bind_btConvexHullShape_setMargin_1"];var _emscripten_bind_btConvexShape___destroy___0=Module["_emscripten_bind_btConvexShape___destroy___0"]=asm["_emscripten_bind_btConvexShape___destroy___0"];var _emscripten_bind_btConvexShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexShape_getLocalScaling_0=Module["_emscripten_bind_btConvexShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexShape_getLocalScaling_0"];var _emscripten_bind_btConvexShape_getMargin_0=Module["_emscripten_bind_btConvexShape_getMargin_0"]=asm["_emscripten_bind_btConvexShape_getMargin_0"];var _emscripten_bind_btConvexShape_setLocalScaling_1=Module["_emscripten_bind_btConvexShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexShape_setLocalScaling_1"];var _emscripten_bind_btConvexShape_setMargin_1=Module["_emscripten_bind_btConvexShape_setMargin_1"]=asm["_emscripten_bind_btConvexShape_setMargin_1"];var _emscripten_bind_btConvexTriangleMeshShape___destroy___0=Module["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"];var _emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btConvexTriangleMeshShape_getMargin_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"];var _emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btConvexTriangleMeshShape_setMargin_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"];var _emscripten_bind_btCylinderShapeX___destroy___0=Module["_emscripten_bind_btCylinderShapeX___destroy___0"]=asm["_emscripten_bind_btCylinderShapeX___destroy___0"];var _emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=Module["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"]=asm["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"];var _emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeX_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeX_getMargin_0=Module["_emscripten_bind_btCylinderShapeX_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeX_getMargin_0"];var _emscripten_bind_btCylinderShapeX_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeX_setMargin_1=Module["_emscripten_bind_btCylinderShapeX_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeX_setMargin_1"];var _emscripten_bind_btCylinderShapeZ___destroy___0=Module["_emscripten_bind_btCylinderShapeZ___destroy___0"]=asm["_emscripten_bind_btCylinderShapeZ___destroy___0"];var _emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=Module["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"]=asm["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"];var _emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeZ_getMargin_0=Module["_emscripten_bind_btCylinderShapeZ_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeZ_getMargin_0"];var _emscripten_bind_btCylinderShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeZ_setMargin_1=Module["_emscripten_bind_btCylinderShapeZ_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeZ_setMargin_1"];var _emscripten_bind_btCylinderShape___destroy___0=Module["_emscripten_bind_btCylinderShape___destroy___0"]=asm["_emscripten_bind_btCylinderShape___destroy___0"];var _emscripten_bind_btCylinderShape_btCylinderShape_1=Module["_emscripten_bind_btCylinderShape_btCylinderShape_1"]=asm["_emscripten_bind_btCylinderShape_btCylinderShape_1"];var _emscripten_bind_btCylinderShape_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShape_getLocalScaling_0=Module["_emscripten_bind_btCylinderShape_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShape_getLocalScaling_0"];var _emscripten_bind_btCylinderShape_getMargin_0=Module["_emscripten_bind_btCylinderShape_getMargin_0"]=asm["_emscripten_bind_btCylinderShape_getMargin_0"];var _emscripten_bind_btCylinderShape_setLocalScaling_1=Module["_emscripten_bind_btCylinderShape_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShape_setLocalScaling_1"];var _emscripten_bind_btCylinderShape_setMargin_1=Module["_emscripten_bind_btCylinderShape_setMargin_1"]=asm["_emscripten_bind_btCylinderShape_setMargin_1"];var _emscripten_bind_btDbvtBroadphase___destroy___0=Module["_emscripten_bind_btDbvtBroadphase___destroy___0"]=asm["_emscripten_bind_btDbvtBroadphase___destroy___0"];var _emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=Module["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"]=asm["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"];var _emscripten_bind_btDefaultCollisionConfiguration___destroy___0=Module["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"];var _emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"];var _emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"];var _emscripten_bind_btDefaultMotionState___destroy___0=Module["_emscripten_bind_btDefaultMotionState___destroy___0"]=asm["_emscripten_bind_btDefaultMotionState___destroy___0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_2=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"];var _emscripten_bind_btDefaultMotionState_getWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0=Module["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"]=asm["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"];var _emscripten_bind_btDefaultMotionState_setWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=Module["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"]=asm["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"];var _emscripten_bind_btDefaultSoftBodySolver___destroy___0=Module["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"];var _emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=Module["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"]=asm["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"];var _emscripten_bind_btDefaultVehicleRaycaster___destroy___0=Module["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"];var _emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=Module["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"];var _emscripten_bind_btDefaultVehicleRaycaster_castRay_3=Module["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"];var _emscripten_bind_btDiscreteDynamicsWorld___destroy___0=Module["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"];var _emscripten_bind_btDiscreteDynamicsWorld_addAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=Module["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"];var _emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"];var _emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_setGravity_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btDispatcherInfo___destroy___0=Module["_emscripten_bind_btDispatcherInfo___destroy___0"]=asm["_emscripten_bind_btDispatcherInfo___destroy___0"];var _emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=Module["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"];var _emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0=Module["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"];var _emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=Module["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSPU_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"];var _emscripten_bind_btDispatcherInfo_get_m_stepCount_0=Module["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeStep_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"];var _emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"];var _emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"];var _emscripten_bind_btDispatcherInfo_get_m_useEpa_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"];var _emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=Module["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"];var _emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=Module["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"];var _emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=Module["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"];var _emscripten_bind_btDispatcherInfo_set_m_stepCount_1=Module["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeStep_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"];var _emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"];var _emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"];var _emscripten_bind_btDispatcherInfo_set_m_useEpa_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"];var _emscripten_bind_btDispatcher___destroy___0=Module["_emscripten_bind_btDispatcher___destroy___0"]=asm["_emscripten_bind_btDispatcher___destroy___0"];var _emscripten_bind_btDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btDispatcher_getNumManifolds_0=Module["_emscripten_bind_btDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btDispatcher_getNumManifolds_0"];var _emscripten_bind_btDynamicsWorld___destroy___0=Module["_emscripten_bind_btDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDynamicsWorld___destroy___0"];var _emscripten_bind_btDynamicsWorld_addAction_1=Module["_emscripten_bind_btDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDynamicsWorld_addAction_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDynamicsWorld_contactTest_2"];var _emscripten_bind_btDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDynamicsWorld_rayTest_3"];var _emscripten_bind_btDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDynamicsWorld_removeAction_1"];var _emscripten_bind_btDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btFixedConstraint___destroy___0=Module["_emscripten_bind_btFixedConstraint___destroy___0"]=asm["_emscripten_bind_btFixedConstraint___destroy___0"];var _emscripten_bind_btFixedConstraint_btFixedConstraint_4=Module["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"]=asm["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"];var _emscripten_bind_btFixedConstraint_enableFeedback_1=Module["_emscripten_bind_btFixedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btFixedConstraint_enableFeedback_1"];var _emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btFixedConstraint_getParam_2=Module["_emscripten_bind_btFixedConstraint_getParam_2"]=asm["_emscripten_bind_btFixedConstraint_getParam_2"];var _emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btFixedConstraint_setParam_3=Module["_emscripten_bind_btFixedConstraint_setParam_3"]=asm["_emscripten_bind_btFixedConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"];var _emscripten_bind_btGeneric6DofConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"];var _emscripten_bind_btGhostObject___destroy___0=Module["_emscripten_bind_btGhostObject___destroy___0"]=asm["_emscripten_bind_btGhostObject___destroy___0"];var _emscripten_bind_btGhostObject_activate_0=Module["_emscripten_bind_btGhostObject_activate_0"]=asm["_emscripten_bind_btGhostObject_activate_0"];var _emscripten_bind_btGhostObject_activate_1=Module["_emscripten_bind_btGhostObject_activate_1"]=asm["_emscripten_bind_btGhostObject_activate_1"];var _emscripten_bind_btGhostObject_btGhostObject_0=Module["_emscripten_bind_btGhostObject_btGhostObject_0"]=asm["_emscripten_bind_btGhostObject_btGhostObject_0"];var _emscripten_bind_btGhostObject_forceActivationState_1=Module["_emscripten_bind_btGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btGhostObject_forceActivationState_1"];var _emscripten_bind_btGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btGhostObject_getCollisionFlags_0"];var _emscripten_bind_btGhostObject_getCollisionShape_0=Module["_emscripten_bind_btGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btGhostObject_getCollisionShape_0"];var _emscripten_bind_btGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btGhostObject_getOverlappingObject_1"];var _emscripten_bind_btGhostObject_getUserIndex_0=Module["_emscripten_bind_btGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btGhostObject_getUserIndex_0"];var _emscripten_bind_btGhostObject_getUserPointer_0=Module["_emscripten_bind_btGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btGhostObject_getUserPointer_0"];var _emscripten_bind_btGhostObject_getWorldTransform_0=Module["_emscripten_bind_btGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btGhostObject_getWorldTransform_0"];var _emscripten_bind_btGhostObject_isActive_0=Module["_emscripten_bind_btGhostObject_isActive_0"]=asm["_emscripten_bind_btGhostObject_isActive_0"];var _emscripten_bind_btGhostObject_isKinematicObject_0=Module["_emscripten_bind_btGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isKinematicObject_0"];var _emscripten_bind_btGhostObject_isStaticObject_0=Module["_emscripten_bind_btGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticObject_0"];var _emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btGhostObject_setActivationState_1=Module["_emscripten_bind_btGhostObject_setActivationState_1"]=asm["_emscripten_bind_btGhostObject_setActivationState_1"];var _emscripten_bind_btGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btGhostObject_setCollisionFlags_1"];var _emscripten_bind_btGhostObject_setCollisionShape_1=Module["_emscripten_bind_btGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btGhostObject_setCollisionShape_1"];var _emscripten_bind_btGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btGhostObject_setFriction_1=Module["_emscripten_bind_btGhostObject_setFriction_1"]=asm["_emscripten_bind_btGhostObject_setFriction_1"];var _emscripten_bind_btGhostObject_setRestitution_1=Module["_emscripten_bind_btGhostObject_setRestitution_1"]=asm["_emscripten_bind_btGhostObject_setRestitution_1"];var _emscripten_bind_btGhostObject_setRollingFriction_1=Module["_emscripten_bind_btGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btGhostObject_setRollingFriction_1"];var _emscripten_bind_btGhostObject_setUserIndex_1=Module["_emscripten_bind_btGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btGhostObject_setUserIndex_1"];var _emscripten_bind_btGhostObject_setUserPointer_1=Module["_emscripten_bind_btGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btGhostObject_setUserPointer_1"];var _emscripten_bind_btGhostObject_setWorldTransform_1=Module["_emscripten_bind_btGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btGhostObject_setWorldTransform_1"];var _emscripten_bind_btGhostPairCallback___destroy___0=Module["_emscripten_bind_btGhostPairCallback___destroy___0"]=asm["_emscripten_bind_btGhostPairCallback___destroy___0"];var _emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=Module["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"]=asm["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"];var _emscripten_bind_btHeightfieldTerrainShape___destroy___0=Module["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"]=asm["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"];var _emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=Module["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"]=asm["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"];var _emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2=Module["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"];var _emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"];var _emscripten_bind_btHeightfieldTerrainShape_getMargin_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"];var _emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"];var _emscripten_bind_btHeightfieldTerrainShape_setMargin_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"];var _emscripten_bind_btHingeConstraint___destroy___0=Module["_emscripten_bind_btHingeConstraint___destroy___0"]=asm["_emscripten_bind_btHingeConstraint___destroy___0"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_2=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_3=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_4=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_5=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_6=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_7=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"];var _emscripten_bind_btHingeConstraint_enableAngularMotor_3=Module["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"]=asm["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"];var _emscripten_bind_btHingeConstraint_enableFeedback_1=Module["_emscripten_bind_btHingeConstraint_enableFeedback_1"]=asm["_emscripten_bind_btHingeConstraint_enableFeedback_1"];var _emscripten_bind_btHingeConstraint_enableMotor_1=Module["_emscripten_bind_btHingeConstraint_enableMotor_1"]=asm["_emscripten_bind_btHingeConstraint_enableMotor_1"];var _emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btHingeConstraint_getParam_2=Module["_emscripten_bind_btHingeConstraint_getParam_2"]=asm["_emscripten_bind_btHingeConstraint_getParam_2"];var _emscripten_bind_btHingeConstraint_setAngularOnly_1=Module["_emscripten_bind_btHingeConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btHingeConstraint_setAngularOnly_1"];var _emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btHingeConstraint_setLimit_4=Module["_emscripten_bind_btHingeConstraint_setLimit_4"]=asm["_emscripten_bind_btHingeConstraint_setLimit_4"];var _emscripten_bind_btHingeConstraint_setLimit_5=Module["_emscripten_bind_btHingeConstraint_setLimit_5"]=asm["_emscripten_bind_btHingeConstraint_setLimit_5"];var _emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btHingeConstraint_setMotorTarget_2=Module["_emscripten_bind_btHingeConstraint_setMotorTarget_2"]=asm["_emscripten_bind_btHingeConstraint_setMotorTarget_2"];var _emscripten_bind_btHingeConstraint_setParam_3=Module["_emscripten_bind_btHingeConstraint_setParam_3"]=asm["_emscripten_bind_btHingeConstraint_setParam_3"];var _emscripten_bind_btKinematicCharacterController___destroy___0=Module["_emscripten_bind_btKinematicCharacterController___destroy___0"]=asm["_emscripten_bind_btKinematicCharacterController___destroy___0"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"];var _emscripten_bind_btKinematicCharacterController_canJump_0=Module["_emscripten_bind_btKinematicCharacterController_canJump_0"]=asm["_emscripten_bind_btKinematicCharacterController_canJump_0"];var _emscripten_bind_btKinematicCharacterController_getGhostObject_0=Module["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"];var _emscripten_bind_btKinematicCharacterController_getGravity_0=Module["_emscripten_bind_btKinematicCharacterController_getGravity_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGravity_0"];var _emscripten_bind_btKinematicCharacterController_getMaxSlope_0=Module["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"]=asm["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"];var _emscripten_bind_btKinematicCharacterController_jump_0=Module["_emscripten_bind_btKinematicCharacterController_jump_0"]=asm["_emscripten_bind_btKinematicCharacterController_jump_0"];var _emscripten_bind_btKinematicCharacterController_onGround_0=Module["_emscripten_bind_btKinematicCharacterController_onGround_0"]=asm["_emscripten_bind_btKinematicCharacterController_onGround_0"];var _emscripten_bind_btKinematicCharacterController_playerStep_2=Module["_emscripten_bind_btKinematicCharacterController_playerStep_2"]=asm["_emscripten_bind_btKinematicCharacterController_playerStep_2"];var _emscripten_bind_btKinematicCharacterController_preStep_1=Module["_emscripten_bind_btKinematicCharacterController_preStep_1"]=asm["_emscripten_bind_btKinematicCharacterController_preStep_1"];var _emscripten_bind_btKinematicCharacterController_setFallSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setGravity_1=Module["_emscripten_bind_btKinematicCharacterController_setGravity_1"]=asm["_emscripten_bind_btKinematicCharacterController_setGravity_1"];var _emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"];var _emscripten_bind_btKinematicCharacterController_setMaxSlope_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"];var _emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=Module["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"];var _emscripten_bind_btKinematicCharacterController_setUp_1=Module["_emscripten_bind_btKinematicCharacterController_setUp_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUp_1"];var _emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=Module["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"];var _emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=Module["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"]=asm["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"];var _emscripten_bind_btKinematicCharacterController_setWalkDirection_1=Module["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"]=asm["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"];var _emscripten_bind_btKinematicCharacterController_updateAction_2=Module["_emscripten_bind_btKinematicCharacterController_updateAction_2"]=asm["_emscripten_bind_btKinematicCharacterController_updateAction_2"];var _emscripten_bind_btKinematicCharacterController_warp_1=Module["_emscripten_bind_btKinematicCharacterController_warp_1"]=asm["_emscripten_bind_btKinematicCharacterController_warp_1"];var _emscripten_bind_btManifoldPoint___destroy___0=Module["_emscripten_bind_btManifoldPoint___destroy___0"]=asm["_emscripten_bind_btManifoldPoint___destroy___0"];var _emscripten_bind_btManifoldPoint_getAppliedImpulse_0=Module["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"]=asm["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"];var _emscripten_bind_btManifoldPoint_getDistance_0=Module["_emscripten_bind_btManifoldPoint_getDistance_0"]=asm["_emscripten_bind_btManifoldPoint_getDistance_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointA_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointB_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"];var _emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_set_m_localPointA_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"];var _emscripten_bind_btManifoldPoint_set_m_localPointB_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"];var _emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"];var _emscripten_bind_btMatrix3x3___destroy___0=Module["_emscripten_bind_btMatrix3x3___destroy___0"]=asm["_emscripten_bind_btMatrix3x3___destroy___0"];var _emscripten_bind_btMatrix3x3_getRotation_1=Module["_emscripten_bind_btMatrix3x3_getRotation_1"]=asm["_emscripten_bind_btMatrix3x3_getRotation_1"];var _emscripten_bind_btMatrix3x3_getRow_1=Module["_emscripten_bind_btMatrix3x3_getRow_1"]=asm["_emscripten_bind_btMatrix3x3_getRow_1"];var _emscripten_bind_btMatrix3x3_setEulerZYX_3=Module["_emscripten_bind_btMatrix3x3_setEulerZYX_3"]=asm["_emscripten_bind_btMatrix3x3_setEulerZYX_3"];var _emscripten_bind_btMotionState___destroy___0=Module["_emscripten_bind_btMotionState___destroy___0"]=asm["_emscripten_bind_btMotionState___destroy___0"];var _emscripten_bind_btMotionState_getWorldTransform_1=Module["_emscripten_bind_btMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btMotionState_getWorldTransform_1"];var _emscripten_bind_btMotionState_setWorldTransform_1=Module["_emscripten_bind_btMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btMotionState_setWorldTransform_1"];var _emscripten_bind_btOverlappingPairCache___destroy___0=Module["_emscripten_bind_btOverlappingPairCache___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCache___destroy___0"];var _emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1=Module["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"]=asm["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"];var _emscripten_bind_btOverlappingPairCallback___destroy___0=Module["_emscripten_bind_btOverlappingPairCallback___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCallback___destroy___0"];var _emscripten_bind_btPairCachingGhostObject___destroy___0=Module["_emscripten_bind_btPairCachingGhostObject___destroy___0"]=asm["_emscripten_bind_btPairCachingGhostObject___destroy___0"];var _emscripten_bind_btPairCachingGhostObject_activate_0=Module["_emscripten_bind_btPairCachingGhostObject_activate_0"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_0"];var _emscripten_bind_btPairCachingGhostObject_activate_1=Module["_emscripten_bind_btPairCachingGhostObject_activate_1"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_1"];var _emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=Module["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"];var _emscripten_bind_btPairCachingGhostObject_forceActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"];var _emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"];var _emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"];var _emscripten_bind_btPairCachingGhostObject_getUserIndex_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"];var _emscripten_bind_btPairCachingGhostObject_getUserPointer_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"];var _emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=Module["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"];var _emscripten_bind_btPairCachingGhostObject_isActive_0=Module["_emscripten_bind_btPairCachingGhostObject_isActive_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isActive_0"];var _emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_setActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionShape_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"];var _emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setRestitution_1=Module["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"];var _emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setUserIndex_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"];var _emscripten_bind_btPairCachingGhostObject_setUserPointer_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"];var _emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=Module["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"];var _emscripten_bind_btPersistentManifold___destroy___0=Module["_emscripten_bind_btPersistentManifold___destroy___0"]=asm["_emscripten_bind_btPersistentManifold___destroy___0"];var _emscripten_bind_btPersistentManifold_btPersistentManifold_0=Module["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"]=asm["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"];var _emscripten_bind_btPersistentManifold_getBody0_0=Module["_emscripten_bind_btPersistentManifold_getBody0_0"]=asm["_emscripten_bind_btPersistentManifold_getBody0_0"];var _emscripten_bind_btPersistentManifold_getBody1_0=Module["_emscripten_bind_btPersistentManifold_getBody1_0"]=asm["_emscripten_bind_btPersistentManifold_getBody1_0"];var _emscripten_bind_btPersistentManifold_getContactPoint_1=Module["_emscripten_bind_btPersistentManifold_getContactPoint_1"]=asm["_emscripten_bind_btPersistentManifold_getContactPoint_1"];var _emscripten_bind_btPersistentManifold_getNumContacts_0=Module["_emscripten_bind_btPersistentManifold_getNumContacts_0"]=asm["_emscripten_bind_btPersistentManifold_getNumContacts_0"];var _emscripten_bind_btPoint2PointConstraint___destroy___0=Module["_emscripten_bind_btPoint2PointConstraint___destroy___0"]=asm["_emscripten_bind_btPoint2PointConstraint___destroy___0"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"];var _emscripten_bind_btPoint2PointConstraint_enableFeedback_1=Module["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"]=asm["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"];var _emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btPoint2PointConstraint_getParam_2=Module["_emscripten_bind_btPoint2PointConstraint_getParam_2"]=asm["_emscripten_bind_btPoint2PointConstraint_getParam_2"];var _emscripten_bind_btPoint2PointConstraint_getPivotInA_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"];var _emscripten_bind_btPoint2PointConstraint_getPivotInB_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"];var _emscripten_bind_btPoint2PointConstraint_get_m_setting_0=Module["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"]=asm["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"];var _emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btPoint2PointConstraint_setParam_3=Module["_emscripten_bind_btPoint2PointConstraint_setParam_3"]=asm["_emscripten_bind_btPoint2PointConstraint_setParam_3"];var _emscripten_bind_btPoint2PointConstraint_setPivotA_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"];var _emscripten_bind_btPoint2PointConstraint_setPivotB_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"];var _emscripten_bind_btPoint2PointConstraint_set_m_setting_1=Module["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"]=asm["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"];var _emscripten_bind_btQuadWord___destroy___0=Module["_emscripten_bind_btQuadWord___destroy___0"]=asm["_emscripten_bind_btQuadWord___destroy___0"];var _emscripten_bind_btQuadWord_setW_1=Module["_emscripten_bind_btQuadWord_setW_1"]=asm["_emscripten_bind_btQuadWord_setW_1"];var _emscripten_bind_btQuadWord_setX_1=Module["_emscripten_bind_btQuadWord_setX_1"]=asm["_emscripten_bind_btQuadWord_setX_1"];var _emscripten_bind_btQuadWord_setY_1=Module["_emscripten_bind_btQuadWord_setY_1"]=asm["_emscripten_bind_btQuadWord_setY_1"];var _emscripten_bind_btQuadWord_setZ_1=Module["_emscripten_bind_btQuadWord_setZ_1"]=asm["_emscripten_bind_btQuadWord_setZ_1"];var _emscripten_bind_btQuadWord_w_0=Module["_emscripten_bind_btQuadWord_w_0"]=asm["_emscripten_bind_btQuadWord_w_0"];var _emscripten_bind_btQuadWord_x_0=Module["_emscripten_bind_btQuadWord_x_0"]=asm["_emscripten_bind_btQuadWord_x_0"];var _emscripten_bind_btQuadWord_y_0=Module["_emscripten_bind_btQuadWord_y_0"]=asm["_emscripten_bind_btQuadWord_y_0"];var _emscripten_bind_btQuadWord_z_0=Module["_emscripten_bind_btQuadWord_z_0"]=asm["_emscripten_bind_btQuadWord_z_0"];var _emscripten_bind_btQuaternion___destroy___0=Module["_emscripten_bind_btQuaternion___destroy___0"]=asm["_emscripten_bind_btQuaternion___destroy___0"];var _emscripten_bind_btQuaternion_angleShortestPath_1=Module["_emscripten_bind_btQuaternion_angleShortestPath_1"]=asm["_emscripten_bind_btQuaternion_angleShortestPath_1"];var _emscripten_bind_btQuaternion_angle_1=Module["_emscripten_bind_btQuaternion_angle_1"]=asm["_emscripten_bind_btQuaternion_angle_1"];var _emscripten_bind_btQuaternion_btQuaternion_4=Module["_emscripten_bind_btQuaternion_btQuaternion_4"]=asm["_emscripten_bind_btQuaternion_btQuaternion_4"];var _emscripten_bind_btQuaternion_dot_1=Module["_emscripten_bind_btQuaternion_dot_1"]=asm["_emscripten_bind_btQuaternion_dot_1"];var _emscripten_bind_btQuaternion_getAngleShortestPath_0=Module["_emscripten_bind_btQuaternion_getAngleShortestPath_0"]=asm["_emscripten_bind_btQuaternion_getAngleShortestPath_0"];var _emscripten_bind_btQuaternion_getAngle_0=Module["_emscripten_bind_btQuaternion_getAngle_0"]=asm["_emscripten_bind_btQuaternion_getAngle_0"];var _emscripten_bind_btQuaternion_getAxis_0=Module["_emscripten_bind_btQuaternion_getAxis_0"]=asm["_emscripten_bind_btQuaternion_getAxis_0"];var _emscripten_bind_btQuaternion_inverse_0=Module["_emscripten_bind_btQuaternion_inverse_0"]=asm["_emscripten_bind_btQuaternion_inverse_0"];var _emscripten_bind_btQuaternion_length2_0=Module["_emscripten_bind_btQuaternion_length2_0"]=asm["_emscripten_bind_btQuaternion_length2_0"];var _emscripten_bind_btQuaternion_length_0=Module["_emscripten_bind_btQuaternion_length_0"]=asm["_emscripten_bind_btQuaternion_length_0"];var _emscripten_bind_btQuaternion_normalize_0=Module["_emscripten_bind_btQuaternion_normalize_0"]=asm["_emscripten_bind_btQuaternion_normalize_0"];var _emscripten_bind_btQuaternion_normalized_0=Module["_emscripten_bind_btQuaternion_normalized_0"]=asm["_emscripten_bind_btQuaternion_normalized_0"];var _emscripten_bind_btQuaternion_op_add_1=Module["_emscripten_bind_btQuaternion_op_add_1"]=asm["_emscripten_bind_btQuaternion_op_add_1"];var _emscripten_bind_btQuaternion_op_div_1=Module["_emscripten_bind_btQuaternion_op_div_1"]=asm["_emscripten_bind_btQuaternion_op_div_1"];var _emscripten_bind_btQuaternion_op_mul_1=Module["_emscripten_bind_btQuaternion_op_mul_1"]=asm["_emscripten_bind_btQuaternion_op_mul_1"];var _emscripten_bind_btQuaternion_op_mulq_1=Module["_emscripten_bind_btQuaternion_op_mulq_1"]=asm["_emscripten_bind_btQuaternion_op_mulq_1"];var _emscripten_bind_btQuaternion_op_sub_1=Module["_emscripten_bind_btQuaternion_op_sub_1"]=asm["_emscripten_bind_btQuaternion_op_sub_1"];var _emscripten_bind_btQuaternion_setEulerZYX_3=Module["_emscripten_bind_btQuaternion_setEulerZYX_3"]=asm["_emscripten_bind_btQuaternion_setEulerZYX_3"];var _emscripten_bind_btQuaternion_setEuler_3=Module["_emscripten_bind_btQuaternion_setEuler_3"]=asm["_emscripten_bind_btQuaternion_setEuler_3"];var _emscripten_bind_btQuaternion_setRotation_2=Module["_emscripten_bind_btQuaternion_setRotation_2"]=asm["_emscripten_bind_btQuaternion_setRotation_2"];var _emscripten_bind_btQuaternion_setValue_4=Module["_emscripten_bind_btQuaternion_setValue_4"]=asm["_emscripten_bind_btQuaternion_setValue_4"];var _emscripten_bind_btQuaternion_setW_1=Module["_emscripten_bind_btQuaternion_setW_1"]=asm["_emscripten_bind_btQuaternion_setW_1"];var _emscripten_bind_btQuaternion_setX_1=Module["_emscripten_bind_btQuaternion_setX_1"]=asm["_emscripten_bind_btQuaternion_setX_1"];var _emscripten_bind_btQuaternion_setY_1=Module["_emscripten_bind_btQuaternion_setY_1"]=asm["_emscripten_bind_btQuaternion_setY_1"];var _emscripten_bind_btQuaternion_setZ_1=Module["_emscripten_bind_btQuaternion_setZ_1"]=asm["_emscripten_bind_btQuaternion_setZ_1"];var _emscripten_bind_btQuaternion_w_0=Module["_emscripten_bind_btQuaternion_w_0"]=asm["_emscripten_bind_btQuaternion_w_0"];var _emscripten_bind_btQuaternion_x_0=Module["_emscripten_bind_btQuaternion_x_0"]=asm["_emscripten_bind_btQuaternion_x_0"];var _emscripten_bind_btQuaternion_y_0=Module["_emscripten_bind_btQuaternion_y_0"]=asm["_emscripten_bind_btQuaternion_y_0"];var _emscripten_bind_btQuaternion_z_0=Module["_emscripten_bind_btQuaternion_z_0"]=asm["_emscripten_bind_btQuaternion_z_0"];var _emscripten_bind_btRaycastVehicle___destroy___0=Module["_emscripten_bind_btRaycastVehicle___destroy___0"]=asm["_emscripten_bind_btRaycastVehicle___destroy___0"];var _emscripten_bind_btRaycastVehicle_addWheel_7=Module["_emscripten_bind_btRaycastVehicle_addWheel_7"]=asm["_emscripten_bind_btRaycastVehicle_addWheel_7"];var _emscripten_bind_btRaycastVehicle_applyEngineForce_2=Module["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"]=asm["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"];var _emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=Module["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"]=asm["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"];var _emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=Module["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"]=asm["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"];var _emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=Module["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"]=asm["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"];var _emscripten_bind_btRaycastVehicle_getForwardAxis_0=Module["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"];var _emscripten_bind_btRaycastVehicle_getForwardVector_0=Module["_emscripten_bind_btRaycastVehicle_getForwardVector_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardVector_0"];var _emscripten_bind_btRaycastVehicle_getNumWheels_0=Module["_emscripten_bind_btRaycastVehicle_getNumWheels_0"]=asm["_emscripten_bind_btRaycastVehicle_getNumWheels_0"];var _emscripten_bind_btRaycastVehicle_getRightAxis_0=Module["_emscripten_bind_btRaycastVehicle_getRightAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getRightAxis_0"];var _emscripten_bind_btRaycastVehicle_getRigidBody_0=Module["_emscripten_bind_btRaycastVehicle_getRigidBody_0"]=asm["_emscripten_bind_btRaycastVehicle_getRigidBody_0"];var _emscripten_bind_btRaycastVehicle_getSteeringValue_1=Module["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"]=asm["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"];var _emscripten_bind_btRaycastVehicle_getUpAxis_0=Module["_emscripten_bind_btRaycastVehicle_getUpAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getUpAxis_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintId_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintType_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"];var _emscripten_bind_btRaycastVehicle_getWheelInfo_1=Module["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"];var _emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=Module["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"];var _emscripten_bind_btRaycastVehicle_rayCast_1=Module["_emscripten_bind_btRaycastVehicle_rayCast_1"]=asm["_emscripten_bind_btRaycastVehicle_rayCast_1"];var _emscripten_bind_btRaycastVehicle_resetSuspension_0=Module["_emscripten_bind_btRaycastVehicle_resetSuspension_0"]=asm["_emscripten_bind_btRaycastVehicle_resetSuspension_0"];var _emscripten_bind_btRaycastVehicle_setBrake_2=Module["_emscripten_bind_btRaycastVehicle_setBrake_2"]=asm["_emscripten_bind_btRaycastVehicle_setBrake_2"];var _emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=Module["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"]=asm["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"];var _emscripten_bind_btRaycastVehicle_setPitchControl_1=Module["_emscripten_bind_btRaycastVehicle_setPitchControl_1"]=asm["_emscripten_bind_btRaycastVehicle_setPitchControl_1"];var _emscripten_bind_btRaycastVehicle_setSteeringValue_2=Module["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"]=asm["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"];var _emscripten_bind_btRaycastVehicle_setUserConstraintId_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"];var _emscripten_bind_btRaycastVehicle_setUserConstraintType_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"];var _emscripten_bind_btRaycastVehicle_updateAction_2=Module["_emscripten_bind_btRaycastVehicle_updateAction_2"]=asm["_emscripten_bind_btRaycastVehicle_updateAction_2"];var _emscripten_bind_btRaycastVehicle_updateFriction_1=Module["_emscripten_bind_btRaycastVehicle_updateFriction_1"]=asm["_emscripten_bind_btRaycastVehicle_updateFriction_1"];var _emscripten_bind_btRaycastVehicle_updateSuspension_1=Module["_emscripten_bind_btRaycastVehicle_updateSuspension_1"]=asm["_emscripten_bind_btRaycastVehicle_updateSuspension_1"];var _emscripten_bind_btRaycastVehicle_updateVehicle_1=Module["_emscripten_bind_btRaycastVehicle_updateVehicle_1"]=asm["_emscripten_bind_btRaycastVehicle_updateVehicle_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransform_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"];var _emscripten_bind_btRigidBodyConstructionInfo___destroy___0=Module["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"];var _emscripten_bind_btRigidBody___destroy___0=Module["_emscripten_bind_btRigidBody___destroy___0"]=asm["_emscripten_bind_btRigidBody___destroy___0"];var _emscripten_bind_btRigidBody_activate_0=Module["_emscripten_bind_btRigidBody_activate_0"]=asm["_emscripten_bind_btRigidBody_activate_0"];var _emscripten_bind_btRigidBody_activate_1=Module["_emscripten_bind_btRigidBody_activate_1"]=asm["_emscripten_bind_btRigidBody_activate_1"];var _emscripten_bind_btRigidBody_applyCentralForce_1=Module["_emscripten_bind_btRigidBody_applyCentralForce_1"]=asm["_emscripten_bind_btRigidBody_applyCentralForce_1"];var _emscripten_bind_btRigidBody_applyCentralImpulse_1=Module["_emscripten_bind_btRigidBody_applyCentralImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyCentralImpulse_1"];var _emscripten_bind_btRigidBody_applyForce_2=Module["_emscripten_bind_btRigidBody_applyForce_2"]=asm["_emscripten_bind_btRigidBody_applyForce_2"];var _emscripten_bind_btRigidBody_applyGravity_0=Module["_emscripten_bind_btRigidBody_applyGravity_0"]=asm["_emscripten_bind_btRigidBody_applyGravity_0"];var _emscripten_bind_btRigidBody_applyImpulse_2=Module["_emscripten_bind_btRigidBody_applyImpulse_2"]=asm["_emscripten_bind_btRigidBody_applyImpulse_2"];var _emscripten_bind_btRigidBody_applyTorqueImpulse_1=Module["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"];var _emscripten_bind_btRigidBody_applyTorque_1=Module["_emscripten_bind_btRigidBody_applyTorque_1"]=asm["_emscripten_bind_btRigidBody_applyTorque_1"];var _emscripten_bind_btRigidBody_btRigidBody_1=Module["_emscripten_bind_btRigidBody_btRigidBody_1"]=asm["_emscripten_bind_btRigidBody_btRigidBody_1"];var _emscripten_bind_btRigidBody_forceActivationState_1=Module["_emscripten_bind_btRigidBody_forceActivationState_1"]=asm["_emscripten_bind_btRigidBody_forceActivationState_1"];var _emscripten_bind_btRigidBody_getAabb_2=Module["_emscripten_bind_btRigidBody_getAabb_2"]=asm["_emscripten_bind_btRigidBody_getAabb_2"];var _emscripten_bind_btRigidBody_getAngularVelocity_0=Module["_emscripten_bind_btRigidBody_getAngularVelocity_0"]=asm["_emscripten_bind_btRigidBody_getAngularVelocity_0"];var _emscripten_bind_btRigidBody_getCenterOfMassTransform_0=Module["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"]=asm["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"];var _emscripten_bind_btRigidBody_getCollisionFlags_0=Module["_emscripten_bind_btRigidBody_getCollisionFlags_0"]=asm["_emscripten_bind_btRigidBody_getCollisionFlags_0"];var _emscripten_bind_btRigidBody_getCollisionShape_0=Module["_emscripten_bind_btRigidBody_getCollisionShape_0"]=asm["_emscripten_bind_btRigidBody_getCollisionShape_0"];var _emscripten_bind_btRigidBody_getGravity_0=Module["_emscripten_bind_btRigidBody_getGravity_0"]=asm["_emscripten_bind_btRigidBody_getGravity_0"];var _emscripten_bind_btRigidBody_getLinearVelocity_0=Module["_emscripten_bind_btRigidBody_getLinearVelocity_0"]=asm["_emscripten_bind_btRigidBody_getLinearVelocity_0"];var _emscripten_bind_btRigidBody_getMotionState_0=Module["_emscripten_bind_btRigidBody_getMotionState_0"]=asm["_emscripten_bind_btRigidBody_getMotionState_0"];var _emscripten_bind_btRigidBody_getUserIndex_0=Module["_emscripten_bind_btRigidBody_getUserIndex_0"]=asm["_emscripten_bind_btRigidBody_getUserIndex_0"];var _emscripten_bind_btRigidBody_getUserPointer_0=Module["_emscripten_bind_btRigidBody_getUserPointer_0"]=asm["_emscripten_bind_btRigidBody_getUserPointer_0"];var _emscripten_bind_btRigidBody_getWorldTransform_0=Module["_emscripten_bind_btRigidBody_getWorldTransform_0"]=asm["_emscripten_bind_btRigidBody_getWorldTransform_0"];var _emscripten_bind_btRigidBody_isActive_0=Module["_emscripten_bind_btRigidBody_isActive_0"]=asm["_emscripten_bind_btRigidBody_isActive_0"];var _emscripten_bind_btRigidBody_isKinematicObject_0=Module["_emscripten_bind_btRigidBody_isKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isKinematicObject_0"];var _emscripten_bind_btRigidBody_isStaticObject_0=Module["_emscripten_bind_btRigidBody_isStaticObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticObject_0"];var _emscripten_bind_btRigidBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btRigidBody_setActivationState_1=Module["_emscripten_bind_btRigidBody_setActivationState_1"]=asm["_emscripten_bind_btRigidBody_setActivationState_1"];var _emscripten_bind_btRigidBody_setAngularFactor_1=Module["_emscripten_bind_btRigidBody_setAngularFactor_1"]=asm["_emscripten_bind_btRigidBody_setAngularFactor_1"];var _emscripten_bind_btRigidBody_setAngularVelocity_1=Module["_emscripten_bind_btRigidBody_setAngularVelocity_1"]=asm["_emscripten_bind_btRigidBody_setAngularVelocity_1"];var _emscripten_bind_btRigidBody_setAnisotropicFriction_2=Module["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"];var _emscripten_bind_btRigidBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"];var _emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btRigidBody_setCenterOfMassTransform_1=Module["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"]=asm["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"];var _emscripten_bind_btRigidBody_setCollisionFlags_1=Module["_emscripten_bind_btRigidBody_setCollisionFlags_1"]=asm["_emscripten_bind_btRigidBody_setCollisionFlags_1"];var _emscripten_bind_btRigidBody_setCollisionShape_1=Module["_emscripten_bind_btRigidBody_setCollisionShape_1"]=asm["_emscripten_bind_btRigidBody_setCollisionShape_1"];var _emscripten_bind_btRigidBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"];var _emscripten_bind_btRigidBody_setDamping_2=Module["_emscripten_bind_btRigidBody_setDamping_2"]=asm["_emscripten_bind_btRigidBody_setDamping_2"];var _emscripten_bind_btRigidBody_setFriction_1=Module["_emscripten_bind_btRigidBody_setFriction_1"]=asm["_emscripten_bind_btRigidBody_setFriction_1"];var _emscripten_bind_btRigidBody_setGravity_1=Module["_emscripten_bind_btRigidBody_setGravity_1"]=asm["_emscripten_bind_btRigidBody_setGravity_1"];var _emscripten_bind_btRigidBody_setLinearFactor_1=Module["_emscripten_bind_btRigidBody_setLinearFactor_1"]=asm["_emscripten_bind_btRigidBody_setLinearFactor_1"];var _emscripten_bind_btRigidBody_setLinearVelocity_1=Module["_emscripten_bind_btRigidBody_setLinearVelocity_1"]=asm["_emscripten_bind_btRigidBody_setLinearVelocity_1"];var _emscripten_bind_btRigidBody_setMassProps_2=Module["_emscripten_bind_btRigidBody_setMassProps_2"]=asm["_emscripten_bind_btRigidBody_setMassProps_2"];var _emscripten_bind_btRigidBody_setMotionState_1=Module["_emscripten_bind_btRigidBody_setMotionState_1"]=asm["_emscripten_bind_btRigidBody_setMotionState_1"];var _emscripten_bind_btRigidBody_setRestitution_1=Module["_emscripten_bind_btRigidBody_setRestitution_1"]=asm["_emscripten_bind_btRigidBody_setRestitution_1"];var _emscripten_bind_btRigidBody_setRollingFriction_1=Module["_emscripten_bind_btRigidBody_setRollingFriction_1"]=asm["_emscripten_bind_btRigidBody_setRollingFriction_1"];var _emscripten_bind_btRigidBody_setSleepingThresholds_2=Module["_emscripten_bind_btRigidBody_setSleepingThresholds_2"]=asm["_emscripten_bind_btRigidBody_setSleepingThresholds_2"];var _emscripten_bind_btRigidBody_setUserIndex_1=Module["_emscripten_bind_btRigidBody_setUserIndex_1"]=asm["_emscripten_bind_btRigidBody_setUserIndex_1"];var _emscripten_bind_btRigidBody_setUserPointer_1=Module["_emscripten_bind_btRigidBody_setUserPointer_1"]=asm["_emscripten_bind_btRigidBody_setUserPointer_1"];var _emscripten_bind_btRigidBody_setWorldTransform_1=Module["_emscripten_bind_btRigidBody_setWorldTransform_1"]=asm["_emscripten_bind_btRigidBody_setWorldTransform_1"];var _emscripten_bind_btRigidBody_upcast_1=Module["_emscripten_bind_btRigidBody_upcast_1"]=asm["_emscripten_bind_btRigidBody_upcast_1"];var _emscripten_bind_btRigidBody_updateInertiaTensor_0=Module["_emscripten_bind_btRigidBody_updateInertiaTensor_0"]=asm["_emscripten_bind_btRigidBody_updateInertiaTensor_0"];var _emscripten_bind_btRotationalLimitMotor___destroy___0=Module["_emscripten_bind_btRotationalLimitMotor___destroy___0"]=asm["_emscripten_bind_btRotationalLimitMotor___destroy___0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"];var _emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"];var _emscripten_bind_btRotationalLimitMotor_isLimited_0=Module["_emscripten_bind_btRotationalLimitMotor_isLimited_0"]=asm["_emscripten_bind_btRotationalLimitMotor_isLimited_0"];var _emscripten_bind_btRotationalLimitMotor_needApplyTorques_0=Module["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"]=asm["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"];var _emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"];var _emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"];var _emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"];var _emscripten_bind_btSliderConstraint___destroy___0=Module["_emscripten_bind_btSliderConstraint___destroy___0"]=asm["_emscripten_bind_btSliderConstraint___destroy___0"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_3=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_5=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"];var _emscripten_bind_btSliderConstraint_enableFeedback_1=Module["_emscripten_bind_btSliderConstraint_enableFeedback_1"]=asm["_emscripten_bind_btSliderConstraint_enableFeedback_1"];var _emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btSliderConstraint_getParam_2=Module["_emscripten_bind_btSliderConstraint_getParam_2"]=asm["_emscripten_bind_btSliderConstraint_getParam_2"];var _emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btSliderConstraint_setLowerAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"];var _emscripten_bind_btSliderConstraint_setLowerLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"];var _emscripten_bind_btSliderConstraint_setParam_3=Module["_emscripten_bind_btSliderConstraint_setParam_3"]=asm["_emscripten_bind_btSliderConstraint_setParam_3"];var _emscripten_bind_btSliderConstraint_setUpperAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"];var _emscripten_bind_btSliderConstraint_setUpperLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"];var _emscripten_bind_btSoftBodyArray___destroy___0=Module["_emscripten_bind_btSoftBodyArray___destroy___0"]=asm["_emscripten_bind_btSoftBodyArray___destroy___0"];var _emscripten_bind_btSoftBodyArray_at_1=Module["_emscripten_bind_btSoftBodyArray_at_1"]=asm["_emscripten_bind_btSoftBodyArray_at_1"];var _emscripten_bind_btSoftBodyArray_size_0=Module["_emscripten_bind_btSoftBodyArray_size_0"]=asm["_emscripten_bind_btSoftBodyArray_size_0"];var _emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"];var _emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"];var _emscripten_bind_btSoftBodyHelpers_CreatePatch_9=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"];var _emscripten_bind_btSoftBodyHelpers_CreateRope_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"];var _emscripten_bind_btSoftBodyHelpers___destroy___0=Module["_emscripten_bind_btSoftBodyHelpers___destroy___0"]=asm["_emscripten_bind_btSoftBodyHelpers___destroy___0"];var _emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=Module["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"]=asm["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"];var _emscripten_bind_btSoftBodySolver___destroy___0=Module["_emscripten_bind_btSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btSoftBodySolver___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo___destroy___0=Module["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"]=asm["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=Module["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"];var _emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"];var _emscripten_bind_btSoftBody___destroy___0=Module["_emscripten_bind_btSoftBody___destroy___0"]=asm["_emscripten_bind_btSoftBody___destroy___0"];var _emscripten_bind_btSoftBody_activate_0=Module["_emscripten_bind_btSoftBody_activate_0"]=asm["_emscripten_bind_btSoftBody_activate_0"];var _emscripten_bind_btSoftBody_activate_1=Module["_emscripten_bind_btSoftBody_activate_1"]=asm["_emscripten_bind_btSoftBody_activate_1"];var _emscripten_bind_btSoftBody_appendAnchor_4=Module["_emscripten_bind_btSoftBody_appendAnchor_4"]=asm["_emscripten_bind_btSoftBody_appendAnchor_4"];var _emscripten_bind_btSoftBody_appendFace_4=Module["_emscripten_bind_btSoftBody_appendFace_4"]=asm["_emscripten_bind_btSoftBody_appendFace_4"];var _emscripten_bind_btSoftBody_appendLinearJoint_2=Module["_emscripten_bind_btSoftBody_appendLinearJoint_2"]=asm["_emscripten_bind_btSoftBody_appendLinearJoint_2"];var _emscripten_bind_btSoftBody_appendLink_4=Module["_emscripten_bind_btSoftBody_appendLink_4"]=asm["_emscripten_bind_btSoftBody_appendLink_4"];var _emscripten_bind_btSoftBody_appendMaterial_0=Module["_emscripten_bind_btSoftBody_appendMaterial_0"]=asm["_emscripten_bind_btSoftBody_appendMaterial_0"];var _emscripten_bind_btSoftBody_appendNode_2=Module["_emscripten_bind_btSoftBody_appendNode_2"]=asm["_emscripten_bind_btSoftBody_appendNode_2"];var _emscripten_bind_btSoftBody_appendTetra_5=Module["_emscripten_bind_btSoftBody_appendTetra_5"]=asm["_emscripten_bind_btSoftBody_appendTetra_5"];var _emscripten_bind_btSoftBody_btSoftBody_4=Module["_emscripten_bind_btSoftBody_btSoftBody_4"]=asm["_emscripten_bind_btSoftBody_btSoftBody_4"];var _emscripten_bind_btSoftBody_checkFace_3=Module["_emscripten_bind_btSoftBody_checkFace_3"]=asm["_emscripten_bind_btSoftBody_checkFace_3"];var _emscripten_bind_btSoftBody_checkLink_2=Module["_emscripten_bind_btSoftBody_checkLink_2"]=asm["_emscripten_bind_btSoftBody_checkLink_2"];var _emscripten_bind_btSoftBody_forceActivationState_1=Module["_emscripten_bind_btSoftBody_forceActivationState_1"]=asm["_emscripten_bind_btSoftBody_forceActivationState_1"];var _emscripten_bind_btSoftBody_generateBendingConstraints_2=Module["_emscripten_bind_btSoftBody_generateBendingConstraints_2"]=asm["_emscripten_bind_btSoftBody_generateBendingConstraints_2"];var _emscripten_bind_btSoftBody_generateClusters_1=Module["_emscripten_bind_btSoftBody_generateClusters_1"]=asm["_emscripten_bind_btSoftBody_generateClusters_1"];var _emscripten_bind_btSoftBody_generateClusters_2=Module["_emscripten_bind_btSoftBody_generateClusters_2"]=asm["_emscripten_bind_btSoftBody_generateClusters_2"];var _emscripten_bind_btSoftBody_getCollisionFlags_0=Module["_emscripten_bind_btSoftBody_getCollisionFlags_0"]=asm["_emscripten_bind_btSoftBody_getCollisionFlags_0"];var _emscripten_bind_btSoftBody_getCollisionShape_0=Module["_emscripten_bind_btSoftBody_getCollisionShape_0"]=asm["_emscripten_bind_btSoftBody_getCollisionShape_0"];var _emscripten_bind_btSoftBody_getTotalMass_0=Module["_emscripten_bind_btSoftBody_getTotalMass_0"]=asm["_emscripten_bind_btSoftBody_getTotalMass_0"];var _emscripten_bind_btSoftBody_getUserIndex_0=Module["_emscripten_bind_btSoftBody_getUserIndex_0"]=asm["_emscripten_bind_btSoftBody_getUserIndex_0"];var _emscripten_bind_btSoftBody_getUserPointer_0=Module["_emscripten_bind_btSoftBody_getUserPointer_0"]=asm["_emscripten_bind_btSoftBody_getUserPointer_0"];var _emscripten_bind_btSoftBody_getWorldTransform_0=Module["_emscripten_bind_btSoftBody_getWorldTransform_0"]=asm["_emscripten_bind_btSoftBody_getWorldTransform_0"];var _emscripten_bind_btSoftBody_get_m_anchors_0=Module["_emscripten_bind_btSoftBody_get_m_anchors_0"]=asm["_emscripten_bind_btSoftBody_get_m_anchors_0"];var _emscripten_bind_btSoftBody_get_m_cfg_0=Module["_emscripten_bind_btSoftBody_get_m_cfg_0"]=asm["_emscripten_bind_btSoftBody_get_m_cfg_0"];var _emscripten_bind_btSoftBody_get_m_faces_0=Module["_emscripten_bind_btSoftBody_get_m_faces_0"]=asm["_emscripten_bind_btSoftBody_get_m_faces_0"];var _emscripten_bind_btSoftBody_get_m_links_0=Module["_emscripten_bind_btSoftBody_get_m_links_0"]=asm["_emscripten_bind_btSoftBody_get_m_links_0"];var _emscripten_bind_btSoftBody_get_m_materials_0=Module["_emscripten_bind_btSoftBody_get_m_materials_0"]=asm["_emscripten_bind_btSoftBody_get_m_materials_0"];var _emscripten_bind_btSoftBody_get_m_nodes_0=Module["_emscripten_bind_btSoftBody_get_m_nodes_0"]=asm["_emscripten_bind_btSoftBody_get_m_nodes_0"];var _emscripten_bind_btSoftBody_isActive_0=Module["_emscripten_bind_btSoftBody_isActive_0"]=asm["_emscripten_bind_btSoftBody_isActive_0"];var _emscripten_bind_btSoftBody_isKinematicObject_0=Module["_emscripten_bind_btSoftBody_isKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isKinematicObject_0"];var _emscripten_bind_btSoftBody_isStaticObject_0=Module["_emscripten_bind_btSoftBody_isStaticObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticObject_0"];var _emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btSoftBody_rotate_1=Module["_emscripten_bind_btSoftBody_rotate_1"]=asm["_emscripten_bind_btSoftBody_rotate_1"];var _emscripten_bind_btSoftBody_scale_1=Module["_emscripten_bind_btSoftBody_scale_1"]=asm["_emscripten_bind_btSoftBody_scale_1"];var _emscripten_bind_btSoftBody_setActivationState_1=Module["_emscripten_bind_btSoftBody_setActivationState_1"]=asm["_emscripten_bind_btSoftBody_setActivationState_1"];var _emscripten_bind_btSoftBody_setAnisotropicFriction_2=Module["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"];var _emscripten_bind_btSoftBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"];var _emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btSoftBody_setCollisionFlags_1=Module["_emscripten_bind_btSoftBody_setCollisionFlags_1"]=asm["_emscripten_bind_btSoftBody_setCollisionFlags_1"];var _emscripten_bind_btSoftBody_setCollisionShape_1=Module["_emscripten_bind_btSoftBody_setCollisionShape_1"]=asm["_emscripten_bind_btSoftBody_setCollisionShape_1"];var _emscripten_bind_btSoftBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"];var _emscripten_bind_btSoftBody_setFriction_1=Module["_emscripten_bind_btSoftBody_setFriction_1"]=asm["_emscripten_bind_btSoftBody_setFriction_1"];var _emscripten_bind_btSoftBody_setMass_2=Module["_emscripten_bind_btSoftBody_setMass_2"]=asm["_emscripten_bind_btSoftBody_setMass_2"];var _emscripten_bind_btSoftBody_setRestitution_1=Module["_emscripten_bind_btSoftBody_setRestitution_1"]=asm["_emscripten_bind_btSoftBody_setRestitution_1"];var _emscripten_bind_btSoftBody_setRollingFriction_1=Module["_emscripten_bind_btSoftBody_setRollingFriction_1"]=asm["_emscripten_bind_btSoftBody_setRollingFriction_1"];var _emscripten_bind_btSoftBody_setTotalMass_2=Module["_emscripten_bind_btSoftBody_setTotalMass_2"]=asm["_emscripten_bind_btSoftBody_setTotalMass_2"];var _emscripten_bind_btSoftBody_setUserIndex_1=Module["_emscripten_bind_btSoftBody_setUserIndex_1"]=asm["_emscripten_bind_btSoftBody_setUserIndex_1"];var _emscripten_bind_btSoftBody_setUserPointer_1=Module["_emscripten_bind_btSoftBody_setUserPointer_1"]=asm["_emscripten_bind_btSoftBody_setUserPointer_1"];var _emscripten_bind_btSoftBody_setWorldTransform_1=Module["_emscripten_bind_btSoftBody_setWorldTransform_1"]=asm["_emscripten_bind_btSoftBody_setWorldTransform_1"];var _emscripten_bind_btSoftBody_set_m_anchors_1=Module["_emscripten_bind_btSoftBody_set_m_anchors_1"]=asm["_emscripten_bind_btSoftBody_set_m_anchors_1"];var _emscripten_bind_btSoftBody_set_m_cfg_1=Module["_emscripten_bind_btSoftBody_set_m_cfg_1"]=asm["_emscripten_bind_btSoftBody_set_m_cfg_1"];var _emscripten_bind_btSoftBody_set_m_faces_1=Module["_emscripten_bind_btSoftBody_set_m_faces_1"]=asm["_emscripten_bind_btSoftBody_set_m_faces_1"];var _emscripten_bind_btSoftBody_set_m_links_1=Module["_emscripten_bind_btSoftBody_set_m_links_1"]=asm["_emscripten_bind_btSoftBody_set_m_links_1"];var _emscripten_bind_btSoftBody_set_m_materials_1=Module["_emscripten_bind_btSoftBody_set_m_materials_1"]=asm["_emscripten_bind_btSoftBody_set_m_materials_1"];var _emscripten_bind_btSoftBody_set_m_nodes_1=Module["_emscripten_bind_btSoftBody_set_m_nodes_1"]=asm["_emscripten_bind_btSoftBody_set_m_nodes_1"];var _emscripten_bind_btSoftBody_transform_1=Module["_emscripten_bind_btSoftBody_transform_1"]=asm["_emscripten_bind_btSoftBody_transform_1"];var _emscripten_bind_btSoftBody_translate_1=Module["_emscripten_bind_btSoftBody_translate_1"]=asm["_emscripten_bind_btSoftBody_translate_1"];var _emscripten_bind_btSoftBody_upcast_1=Module["_emscripten_bind_btSoftBody_upcast_1"]=asm["_emscripten_bind_btSoftBody_upcast_1"];var _emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=Module["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"];var _emscripten_bind_btSoftRigidDynamicsWorld_addAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btSphereShape___destroy___0=Module["_emscripten_bind_btSphereShape___destroy___0"]=asm["_emscripten_bind_btSphereShape___destroy___0"];var _emscripten_bind_btSphereShape_btSphereShape_1=Module["_emscripten_bind_btSphereShape_btSphereShape_1"]=asm["_emscripten_bind_btSphereShape_btSphereShape_1"];var _emscripten_bind_btSphereShape_calculateLocalInertia_2=Module["_emscripten_bind_btSphereShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btSphereShape_calculateLocalInertia_2"];var _emscripten_bind_btSphereShape_getLocalScaling_0=Module["_emscripten_bind_btSphereShape_getLocalScaling_0"]=asm["_emscripten_bind_btSphereShape_getLocalScaling_0"];var _emscripten_bind_btSphereShape_getMargin_0=Module["_emscripten_bind_btSphereShape_getMargin_0"]=asm["_emscripten_bind_btSphereShape_getMargin_0"];var _emscripten_bind_btSphereShape_setLocalScaling_1=Module["_emscripten_bind_btSphereShape_setLocalScaling_1"]=asm["_emscripten_bind_btSphereShape_setLocalScaling_1"];var _emscripten_bind_btSphereShape_setMargin_1=Module["_emscripten_bind_btSphereShape_setMargin_1"]=asm["_emscripten_bind_btSphereShape_setMargin_1"];var _emscripten_bind_btStaticPlaneShape___destroy___0=Module["_emscripten_bind_btStaticPlaneShape___destroy___0"]=asm["_emscripten_bind_btStaticPlaneShape___destroy___0"];var _emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=Module["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"]=asm["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"];var _emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=Module["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"];var _emscripten_bind_btStaticPlaneShape_getLocalScaling_0=Module["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"]=asm["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"];var _emscripten_bind_btStaticPlaneShape_setLocalScaling_1=Module["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"]=asm["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"];var _emscripten_bind_btStridingMeshInterface___destroy___0=Module["_emscripten_bind_btStridingMeshInterface___destroy___0"]=asm["_emscripten_bind_btStridingMeshInterface___destroy___0"];var _emscripten_bind_btTransform___destroy___0=Module["_emscripten_bind_btTransform___destroy___0"]=asm["_emscripten_bind_btTransform___destroy___0"];var _emscripten_bind_btTransform_btTransform_0=Module["_emscripten_bind_btTransform_btTransform_0"]=asm["_emscripten_bind_btTransform_btTransform_0"];var _emscripten_bind_btTransform_btTransform_2=Module["_emscripten_bind_btTransform_btTransform_2"]=asm["_emscripten_bind_btTransform_btTransform_2"];var _emscripten_bind_btTransform_getBasis_0=Module["_emscripten_bind_btTransform_getBasis_0"]=asm["_emscripten_bind_btTransform_getBasis_0"];var _emscripten_bind_btTransform_getOrigin_0=Module["_emscripten_bind_btTransform_getOrigin_0"]=asm["_emscripten_bind_btTransform_getOrigin_0"];var _emscripten_bind_btTransform_getRotation_0=Module["_emscripten_bind_btTransform_getRotation_0"]=asm["_emscripten_bind_btTransform_getRotation_0"];var _emscripten_bind_btTransform_setFromOpenGLMatrix_1=Module["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"]=asm["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"];var _emscripten_bind_btTransform_setIdentity_0=Module["_emscripten_bind_btTransform_setIdentity_0"]=asm["_emscripten_bind_btTransform_setIdentity_0"];var _emscripten_bind_btTransform_setOrigin_1=Module["_emscripten_bind_btTransform_setOrigin_1"]=asm["_emscripten_bind_btTransform_setOrigin_1"];var _emscripten_bind_btTransform_setRotation_1=Module["_emscripten_bind_btTransform_setRotation_1"]=asm["_emscripten_bind_btTransform_setRotation_1"];var _emscripten_bind_btTriangleMeshShape___destroy___0=Module["_emscripten_bind_btTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btTriangleMeshShape___destroy___0"];var _emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btTriangleMesh___destroy___0=Module["_emscripten_bind_btTriangleMesh___destroy___0"]=asm["_emscripten_bind_btTriangleMesh___destroy___0"];var _emscripten_bind_btTriangleMesh_addTriangle_3=Module["_emscripten_bind_btTriangleMesh_addTriangle_3"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_3"];var _emscripten_bind_btTriangleMesh_addTriangle_4=Module["_emscripten_bind_btTriangleMesh_addTriangle_4"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_4"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_0=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_1=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_2=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"];var _emscripten_bind_btTypedConstraint___destroy___0=Module["_emscripten_bind_btTypedConstraint___destroy___0"]=asm["_emscripten_bind_btTypedConstraint___destroy___0"];var _emscripten_bind_btTypedConstraint_enableFeedback_1=Module["_emscripten_bind_btTypedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btTypedConstraint_enableFeedback_1"];var _emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btTypedConstraint_getParam_2=Module["_emscripten_bind_btTypedConstraint_getParam_2"]=asm["_emscripten_bind_btTypedConstraint_getParam_2"];var _emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btTypedConstraint_setParam_3=Module["_emscripten_bind_btTypedConstraint_setParam_3"]=asm["_emscripten_bind_btTypedConstraint_setParam_3"];var _emscripten_bind_btVector3___destroy___0=Module["_emscripten_bind_btVector3___destroy___0"]=asm["_emscripten_bind_btVector3___destroy___0"];var _emscripten_bind_btVector3_btVector3_0=Module["_emscripten_bind_btVector3_btVector3_0"]=asm["_emscripten_bind_btVector3_btVector3_0"];var _emscripten_bind_btVector3_btVector3_3=Module["_emscripten_bind_btVector3_btVector3_3"]=asm["_emscripten_bind_btVector3_btVector3_3"];var _emscripten_bind_btVector3_dot_1=Module["_emscripten_bind_btVector3_dot_1"]=asm["_emscripten_bind_btVector3_dot_1"];var _emscripten_bind_btVector3_length_0=Module["_emscripten_bind_btVector3_length_0"]=asm["_emscripten_bind_btVector3_length_0"];var _emscripten_bind_btVector3_normalize_0=Module["_emscripten_bind_btVector3_normalize_0"]=asm["_emscripten_bind_btVector3_normalize_0"];var _emscripten_bind_btVector3_op_add_1=Module["_emscripten_bind_btVector3_op_add_1"]=asm["_emscripten_bind_btVector3_op_add_1"];var _emscripten_bind_btVector3_op_mul_1=Module["_emscripten_bind_btVector3_op_mul_1"]=asm["_emscripten_bind_btVector3_op_mul_1"];var _emscripten_bind_btVector3_op_sub_1=Module["_emscripten_bind_btVector3_op_sub_1"]=asm["_emscripten_bind_btVector3_op_sub_1"];var _emscripten_bind_btVector3_rotate_2=Module["_emscripten_bind_btVector3_rotate_2"]=asm["_emscripten_bind_btVector3_rotate_2"];var _emscripten_bind_btVector3_setValue_3=Module["_emscripten_bind_btVector3_setValue_3"]=asm["_emscripten_bind_btVector3_setValue_3"];var _emscripten_bind_btVector3_setX_1=Module["_emscripten_bind_btVector3_setX_1"]=asm["_emscripten_bind_btVector3_setX_1"];var _emscripten_bind_btVector3_setY_1=Module["_emscripten_bind_btVector3_setY_1"]=asm["_emscripten_bind_btVector3_setY_1"];var _emscripten_bind_btVector3_setZ_1=Module["_emscripten_bind_btVector3_setZ_1"]=asm["_emscripten_bind_btVector3_setZ_1"];var _emscripten_bind_btVector3_x_0=Module["_emscripten_bind_btVector3_x_0"]=asm["_emscripten_bind_btVector3_x_0"];var _emscripten_bind_btVector3_y_0=Module["_emscripten_bind_btVector3_y_0"]=asm["_emscripten_bind_btVector3_y_0"];var _emscripten_bind_btVector3_z_0=Module["_emscripten_bind_btVector3_z_0"]=asm["_emscripten_bind_btVector3_z_0"];var _emscripten_bind_btVector4___destroy___0=Module["_emscripten_bind_btVector4___destroy___0"]=asm["_emscripten_bind_btVector4___destroy___0"];var _emscripten_bind_btVector4_btVector4_0=Module["_emscripten_bind_btVector4_btVector4_0"]=asm["_emscripten_bind_btVector4_btVector4_0"];var _emscripten_bind_btVector4_btVector4_4=Module["_emscripten_bind_btVector4_btVector4_4"]=asm["_emscripten_bind_btVector4_btVector4_4"];var _emscripten_bind_btVector4_dot_1=Module["_emscripten_bind_btVector4_dot_1"]=asm["_emscripten_bind_btVector4_dot_1"];var _emscripten_bind_btVector4_length_0=Module["_emscripten_bind_btVector4_length_0"]=asm["_emscripten_bind_btVector4_length_0"];var _emscripten_bind_btVector4_normalize_0=Module["_emscripten_bind_btVector4_normalize_0"]=asm["_emscripten_bind_btVector4_normalize_0"];var _emscripten_bind_btVector4_op_add_1=Module["_emscripten_bind_btVector4_op_add_1"]=asm["_emscripten_bind_btVector4_op_add_1"];var _emscripten_bind_btVector4_op_mul_1=Module["_emscripten_bind_btVector4_op_mul_1"]=asm["_emscripten_bind_btVector4_op_mul_1"];var _emscripten_bind_btVector4_op_sub_1=Module["_emscripten_bind_btVector4_op_sub_1"]=asm["_emscripten_bind_btVector4_op_sub_1"];var _emscripten_bind_btVector4_rotate_2=Module["_emscripten_bind_btVector4_rotate_2"]=asm["_emscripten_bind_btVector4_rotate_2"];var _emscripten_bind_btVector4_setValue_4=Module["_emscripten_bind_btVector4_setValue_4"]=asm["_emscripten_bind_btVector4_setValue_4"];var _emscripten_bind_btVector4_setX_1=Module["_emscripten_bind_btVector4_setX_1"]=asm["_emscripten_bind_btVector4_setX_1"];var _emscripten_bind_btVector4_setY_1=Module["_emscripten_bind_btVector4_setY_1"]=asm["_emscripten_bind_btVector4_setY_1"];var _emscripten_bind_btVector4_setZ_1=Module["_emscripten_bind_btVector4_setZ_1"]=asm["_emscripten_bind_btVector4_setZ_1"];var _emscripten_bind_btVector4_w_0=Module["_emscripten_bind_btVector4_w_0"]=asm["_emscripten_bind_btVector4_w_0"];var _emscripten_bind_btVector4_x_0=Module["_emscripten_bind_btVector4_x_0"]=asm["_emscripten_bind_btVector4_x_0"];var _emscripten_bind_btVector4_y_0=Module["_emscripten_bind_btVector4_y_0"]=asm["_emscripten_bind_btVector4_y_0"];var _emscripten_bind_btVector4_z_0=Module["_emscripten_bind_btVector4_z_0"]=asm["_emscripten_bind_btVector4_z_0"];var _emscripten_bind_btVehicleRaycasterResult___destroy___0=Module["_emscripten_bind_btVehicleRaycasterResult___destroy___0"]=asm["_emscripten_bind_btVehicleRaycasterResult___destroy___0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"];var _emscripten_bind_btVehicleRaycaster___destroy___0=Module["_emscripten_bind_btVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btVehicleRaycaster___destroy___0"];var _emscripten_bind_btVehicleRaycaster_castRay_3=Module["_emscripten_bind_btVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btVehicleRaycaster_castRay_3"];var _emscripten_bind_btVehicleTuning_btVehicleTuning_0=Module["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"]=asm["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"];var _emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=Module["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"];var _emscripten_bind_btVehicleTuning_set_m_frictionSlip_1=Module["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo___destroy___0=Module["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo___destroy___0=Module["_emscripten_bind_btWheelInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfo___destroy___0"];var _emscripten_bind_btWheelInfo_btWheelInfo_1=Module["_emscripten_bind_btWheelInfo_btWheelInfo_1"]=asm["_emscripten_bind_btWheelInfo_btWheelInfo_1"];var _emscripten_bind_btWheelInfo_getSuspensionRestLength_0=Module["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"];var _emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfo_get_m_brake_0=Module["_emscripten_bind_btWheelInfo_get_m_brake_0"]=asm["_emscripten_bind_btWheelInfo_get_m_brake_0"];var _emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=Module["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"];var _emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=Module["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"]=asm["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"];var _emscripten_bind_btWheelInfo_get_m_deltaRotation_0=Module["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"];var _emscripten_bind_btWheelInfo_get_m_engineForce_0=Module["_emscripten_bind_btWheelInfo_get_m_engineForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_engineForce_0"];var _emscripten_bind_btWheelInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfo_get_m_raycastInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"];var _emscripten_bind_btWheelInfo_get_m_rollInfluence_0=Module["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"];var _emscripten_bind_btWheelInfo_get_m_rotation_0=Module["_emscripten_bind_btWheelInfo_get_m_rotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rotation_0"];var _emscripten_bind_btWheelInfo_get_m_skidInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"];var _emscripten_bind_btWheelInfo_get_m_steering_0=Module["_emscripten_bind_btWheelInfo_get_m_steering_0"]=asm["_emscripten_bind_btWheelInfo_get_m_steering_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsRadius_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_worldTransform_0=Module["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"]=asm["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"];var _emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfo_set_m_brake_1=Module["_emscripten_bind_btWheelInfo_set_m_brake_1"]=asm["_emscripten_bind_btWheelInfo_set_m_brake_1"];var _emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=Module["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"];var _emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1=Module["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"]=asm["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"];var _emscripten_bind_btWheelInfo_set_m_deltaRotation_1=Module["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"];var _emscripten_bind_btWheelInfo_set_m_engineForce_1=Module["_emscripten_bind_btWheelInfo_set_m_engineForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_engineForce_1"];var _emscripten_bind_btWheelInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfo_set_m_raycastInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"];var _emscripten_bind_btWheelInfo_set_m_rollInfluence_1=Module["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"];var _emscripten_bind_btWheelInfo_set_m_rotation_1=Module["_emscripten_bind_btWheelInfo_set_m_rotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rotation_1"];var _emscripten_bind_btWheelInfo_set_m_skidInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"];var _emscripten_bind_btWheelInfo_set_m_steering_1=Module["_emscripten_bind_btWheelInfo_set_m_steering_1"]=asm["_emscripten_bind_btWheelInfo_set_m_steering_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_worldTransform_1=Module["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"]=asm["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"];var _emscripten_bind_btWheelInfo_updateWheel_2=Module["_emscripten_bind_btWheelInfo_updateWheel_2"]=asm["_emscripten_bind_btWheelInfo_updateWheel_2"];var _emscripten_bind_tAnchorArray___destroy___0=Module["_emscripten_bind_tAnchorArray___destroy___0"]=asm["_emscripten_bind_tAnchorArray___destroy___0"];var _emscripten_bind_tAnchorArray_at_1=Module["_emscripten_bind_tAnchorArray_at_1"]=asm["_emscripten_bind_tAnchorArray_at_1"];var _emscripten_bind_tAnchorArray_clear_0=Module["_emscripten_bind_tAnchorArray_clear_0"]=asm["_emscripten_bind_tAnchorArray_clear_0"];var _emscripten_bind_tAnchorArray_pop_back_0=Module["_emscripten_bind_tAnchorArray_pop_back_0"]=asm["_emscripten_bind_tAnchorArray_pop_back_0"];var _emscripten_bind_tAnchorArray_push_back_1=Module["_emscripten_bind_tAnchorArray_push_back_1"]=asm["_emscripten_bind_tAnchorArray_push_back_1"];var _emscripten_bind_tAnchorArray_size_0=Module["_emscripten_bind_tAnchorArray_size_0"]=asm["_emscripten_bind_tAnchorArray_size_0"];var _emscripten_bind_tFaceArray___destroy___0=Module["_emscripten_bind_tFaceArray___destroy___0"]=asm["_emscripten_bind_tFaceArray___destroy___0"];var _emscripten_bind_tFaceArray_at_1=Module["_emscripten_bind_tFaceArray_at_1"]=asm["_emscripten_bind_tFaceArray_at_1"];var _emscripten_bind_tFaceArray_size_0=Module["_emscripten_bind_tFaceArray_size_0"]=asm["_emscripten_bind_tFaceArray_size_0"];var _emscripten_bind_tLinkArray___destroy___0=Module["_emscripten_bind_tLinkArray___destroy___0"]=asm["_emscripten_bind_tLinkArray___destroy___0"];var _emscripten_bind_tLinkArray_at_1=Module["_emscripten_bind_tLinkArray_at_1"]=asm["_emscripten_bind_tLinkArray_at_1"];var _emscripten_bind_tLinkArray_size_0=Module["_emscripten_bind_tLinkArray_size_0"]=asm["_emscripten_bind_tLinkArray_size_0"];var _emscripten_bind_tMaterialArray___destroy___0=Module["_emscripten_bind_tMaterialArray___destroy___0"]=asm["_emscripten_bind_tMaterialArray___destroy___0"];var _emscripten_bind_tMaterialArray_at_1=Module["_emscripten_bind_tMaterialArray_at_1"]=asm["_emscripten_bind_tMaterialArray_at_1"];var _emscripten_bind_tMaterialArray_size_0=Module["_emscripten_bind_tMaterialArray_size_0"]=asm["_emscripten_bind_tMaterialArray_size_0"];var _emscripten_bind_tNodeArray___destroy___0=Module["_emscripten_bind_tNodeArray___destroy___0"]=asm["_emscripten_bind_tNodeArray___destroy___0"];var _emscripten_bind_tNodeArray_at_1=Module["_emscripten_bind_tNodeArray_at_1"]=asm["_emscripten_bind_tNodeArray_at_1"];var _emscripten_bind_tNodeArray_size_0=Module["_emscripten_bind_tNodeArray_size_0"]=asm["_emscripten_bind_tNodeArray_size_0"];var _emscripten_enum_PHY_ScalarType_PHY_DOUBLE=Module["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"]=asm["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"];var _emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=Module["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"];var _emscripten_enum_PHY_ScalarType_PHY_FLOAT=Module["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"];var _emscripten_enum_PHY_ScalarType_PHY_INTEGER=Module["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"]=asm["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"];var _emscripten_enum_PHY_ScalarType_PHY_SHORT=Module["_emscripten_enum_PHY_ScalarType_PHY_SHORT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_SHORT"];var _emscripten_enum_PHY_ScalarType_PHY_UCHAR=Module["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"]=asm["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"];var _free=Module["_free"]=asm["_free"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i16=Module["_llvm_bswap_i16"]=asm["_llvm_bswap_i16"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_did=Module["dynCall_did"]=asm["dynCall_did"];var dynCall_diidii=Module["dynCall_diidii"]=asm["dynCall_diidii"];var dynCall_diii=Module["dynCall_diii"]=asm["dynCall_diii"];var dynCall_diiidii=Module["dynCall_diiidii"]=asm["dynCall_diiidii"];var dynCall_diiii=Module["dynCall_diiii"]=asm["dynCall_diiii"];var dynCall_diiiii=Module["dynCall_diiiii"]=asm["dynCall_diiiii"];var dynCall_diiiiiiii=Module["dynCall_diiiiiiii"]=asm["dynCall_diiiiiiii"];var dynCall_diiiiiiiii=Module["dynCall_diiiiiiiii"]=asm["dynCall_diiiiiiiii"];var dynCall_diiiiiiiiii=Module["dynCall_diiiiiiiiii"]=asm["dynCall_diiiiiiiiii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iidid=Module["dynCall_iidid"]=asm["dynCall_iidid"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiid=Module["dynCall_iiid"]=asm["dynCall_iiid"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=asm["dynCall_iiiiiiiiiii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_vidd=Module["dynCall_vidd"]=asm["dynCall_vidd"];var dynCall_viddiii=Module["dynCall_viddiii"]=asm["dynCall_viddiii"];var dynCall_vidi=Module["dynCall_vidi"]=asm["dynCall_vidi"];var dynCall_vidii=Module["dynCall_vidii"]=asm["dynCall_vidii"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_viidi=Module["dynCall_viidi"]=asm["dynCall_viidi"];var dynCall_viidii=Module["dynCall_viidii"]=asm["dynCall_viidii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiid=Module["dynCall_viiid"]=asm["dynCall_viiid"];var dynCall_viiidii=Module["dynCall_viiidii"]=asm["dynCall_viiidii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiid=Module["dynCall_viiiid"]=asm["dynCall_viiiid"];var dynCall_viiiidddddidi=Module["dynCall_viiiidddddidi"]=asm["dynCall_viiiidddddidi"];var dynCall_viiiiddddiid=Module["dynCall_viiiiddddiid"]=asm["dynCall_viiiiddddiid"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiid=Module["dynCall_viiiiid"]=asm["dynCall_viiiiid"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=asm["dynCall_viiiiiii"];var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=asm["dynCall_viiiiiiiii"];var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=asm["dynCall_viiiiiiiiii"];Module["asm"]=asm;if(memoryInitializer){if(!isDataURI(memoryInitializer)){if(typeof Module["locateFile"]==="function"){memoryInitializer=Module["locateFile"](memoryInitializer)}else if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=exit;var abortDecorators=[];function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module["WrapperObject"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module["getCache"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module["wrapPointer"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module["castObject"]=castObject;Module["NULL"]=wrapPointer(0);function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy object. (Did you create it yourself?)";obj["__destroy__"]();delete getCache(obj.__class__)[obj.ptr]}Module["destroy"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module["compare"]=compare;function getPointer(obj){return obj.ptr}Module["getPointer"]=getPointer;function getClass(obj){return obj.__class__}Module["getClass"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:(function(){if(ensureCache.needed){for(var i=0;i=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module["_malloc"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret}),copy:(function(array,view,offset){var offsetShifted=offset;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offsetShifted>>=1;break;case 4:offsetShifted>>=2;break;case 8:offsetShifted>>=3;break}for(var i=0;i1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}else{Module["read"]=function shell_read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw new Error("Unknown runtime environment. Where are we?")}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var ASM_CONSTS=[(function($0,$1,$2,$3,$4,$5,$6,$7){var self=Module["getCache"](Module["ConcreteContactResultCallback"])[$0];if(!self.hasOwnProperty("addSingleResult"))throw"a JSImplementation must implement all functions, you forgot ConcreteContactResultCallback::addSingleResult.";return self["addSingleResult"]($1,$2,$3,$4,$5,$6,$7)})];function _emscripten_asm_const_diiiiiiii(code,a0,a1,a2,a3,a4,a5,a6,a7){return ASM_CONSTS[code](a0,a1,a2,a3,a4,a5,a6,a7)}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+28576;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_btConeTwistConstraint_cpp()})},{func:(function(){__GLOBAL__sub_I_btQuickprof_cpp()})});memoryInitializer="data:application/octet-stream;base64,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6AoAAAMBAAAEAQAABQEAAAYBAAAnAAAABAAAABIAAABHAAAAAAAAABALAAADAQAABwEAAAUBAAAGAQAAJwAAAAUAAAATAAAASAAAAAAAAABACwAAAwEAAAgBAAAFAQAABgEAACcAAAAGAAAAFAAAAEkAAAB7IHZhciBzZWxmID0gTW9kdWxlWydnZXRDYWNoZSddKE1vZHVsZVsnQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2snXSlbJDBdOyBpZiAoIXNlbGYuaGFzT3duUHJvcGVydHkoJ2FkZFNpbmdsZVJlc3VsdCcpKSB0aHJvdyAnYSBKU0ltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50IGFsbCBmdW5jdGlvbnMsIHlvdSBmb3Jnb3QgQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2s6OmFkZFNpbmdsZVJlc3VsdC4nOyByZXR1cm4gc2VsZlsnYWRkU2luZ2xlUmVzdWx0J10oJDEsJDIsJDMsJDQsJDUsJDYsJDcpOyB9ADI5Q29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2sATjE2YnRDb2xsaXNpb25Xb3JsZDIxQ29udGFjdFJlc3VsdENhbGxiYWNrRQBOMTZidENvbGxpc2lvbldvcmxkMjRDbG9zZXN0UmF5UmVzdWx0Q2FsbGJhY2tFAE4xNmJ0Q29sbGlzaW9uV29ybGQxN1JheVJlc3VsdENhbGxiYWNrRQAxOWJ0R2hvc3RQYWlyQ2FsbGJhY2sAMjVidE92ZXJsYXBwaW5nUGFpckNhbGxiYWNrADIwYnREZWZhdWx0TW90aW9uU3RhdGUAMTNidE1vdGlvblN0YXRlADE4YnRWZWhpY2xlUmF5Y2FzdGVyAE4xNmJ0Q29sbGlzaW9uV29ybGQyN0Nsb3Nlc3RDb252ZXhSZXN1bHRDYWxsYmFja0UATjE2YnRDb2xsaXNpb25Xb3JsZDIwQ29udmV4UmVzdWx0Q2FsbGJhY2tFADIzYnREZWZhdWx0U29mdEJvZHlTb2x2ZXIAMTZidFNvZnRCb2R5U29sdmVyADQxYnRTb2Z0Qm9keVJpZ2lkQm9keUNvbGxpc2lvbkNvbmZpZ3VyYXRpb24ATjM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0xN1N3YXBwZWRDcmVhdGVGdW5jRQAzMGJ0Q29sbGlzaW9uQWxnb3JpdGhtQ3JlYXRlRnVuYwBOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yOGJ0U29mdFNvZnRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAFNvZnRCb2R5TWF0ZXJpYWxEYXRhAFNvZnRCb2R5Tm9kZURhdGEAU29mdEJvZHlMaW5rRGF0YQBTb2Z0Qm9keUZhY2VEYXRhAFNvZnRCb2R5VGV0cmFEYXRhAFNvZnRSaWdpZEFuY2hvckRhdGEAZmxvYXQAU29mdEJvZHlQb3NlRGF0YQBTb2Z0Qm9keUNsdXN0ZXJEYXRhAGludABidFNvZnRCb2R5Sm9pbnREYXRhAGJ0U29mdEJvZHlGbG9hdERhdGEAMTBidFNvZnRCb2R5AE4xMGJ0U29mdEJvZHkxNVJheUZyb21Ub0Nhc3RlckUATjZidERidnQ4SUNvbGxpZGVFAE4xMGJ0U29mdEJvZHk1Sm9pbnRFAE4xMGJ0U29mdEJvZHk2Q0pvaW50RQBOMTBidFNvZnRCb2R5NkxKb2ludEUAU29mdEJvZHkAMjRidFNvZnRCb2R5Q29sbGlzaW9uU2hhcGUAYnRDb252ZXhJbnRlcm5hbFNoYXBlRGF0YQBTT0ZUQ0xVU1RFUgAyN2J0U29mdENsdXN0ZXJDb2xsaXNpb25TaGFwZQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVDTF9SU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTFDbHVzdGVyQmFzZUUATjE1YnRTb2Z0Q29sbGlkZXJzMTNDb2xsaWRlU0RGX1JTRQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVWRl9TU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTJDb2xsaWRlQ0xfU1NFADI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0AMjBidENvbGxpc2lvbkFsZ29yaXRobQBUcmlhbmdsZQAxNWJ0VHJpYW5nbGVTaGFwZQBOMTJidENvbnZleENhc3QxMENhc3RSZXN1bHRFAFpOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTIxY2FsY3VsYXRlVGltZU9mSW1wYWN0RVAxN2J0Q29sbGlzaW9uT2JqZWN0UzFfUksxNmJ0RGlzcGF0Y2hlckluZm9QMTZidE1hbmlmb2xkUmVzdWx0RTMxTG9jYWxUcmlhbmdsZVNwaGVyZUNhc3RDYWxsYmFjawAyNmJ0U29mdEJvZHlUcmlhbmdsZUNhbGxiYWNrADM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjNidFNvZnRTaW5nbGVSYXlDYWxsYmFjawAyM2J0QnJvYWRwaGFzZVJheUNhbGxiYWNrADI0YnRCcm9hZHBoYXNlQWFiYkNhbGxiYWNrADI0YnRTb2Z0UmlnaWREeW5hbWljc1dvcmxkADI4YnRTb2Z0U29mdENvbGxpc2lvbkFsZ29yaXRobQBidFJpZ2lkQm9keUZsb2F0RGF0YQAxMWJ0UmlnaWRCb2R5ADM0YnRDbG9zZXN0Tm90TWVDb252ZXhSZXN1bHRDYWxsYmFjawBidER5bmFtaWNzV29ybGRGbG9hdERhdGEAMjNidERpc2NyZXRlRHluYW1pY3NXb3JsZAAxNWJ0RHluYW1pY3NXb3JsZAAyN0lucGxhY2VTb2x2ZXJJc2xhbmRDYWxsYmFjawBOMjVidFNpbXVsYXRpb25Jc2xhbmRNYW5hZ2VyMTRJc2xhbmRDYWxsYmFja0UAYnRHZW5lcmljNkRvZlNwcmluZzJDb25zdHJhaW50RGF0YQAxN2J0VHlwZWRDb25zdHJhaW50ADEzYnRUeXBlZE9iamVjdAAxN2J0Rml4ZWRDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZDb25zdHJhaW50RGF0YQAyM2J0R2VuZXJpYzZEb2ZDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50RGF0YQAyOWJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50AGJ0UG9pbnQyUG9pbnRDb25zdHJhaW50RmxvYXREYXRhADIzYnRQb2ludDJQb2ludENvbnN0cmFpbnQAYnRUeXBlZENvbnN0cmFpbnRGbG9hdERhdGEAYnRTbGlkZXJDb25zdHJhaW50RGF0YQAxOGJ0U2xpZGVyQ29uc3RyYWludABidENvbmVUd2lzdENvbnN0cmFpbnREYXRhADIxYnRDb25lVHdpc3RDb25zdHJhaW50AGJ0SGluZ2VDb25zdHJhaW50RmxvYXREYXRhADE3YnRIaW5nZUNvbnN0cmFpbnQAMzVidFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcgAxOGJ0Q29uc3RyYWludFNvbHZlcgAxNmJ0UmF5Y2FzdFZlaGljbGUAMTdidEFjdGlvbkludGVyZmFjZQAyNWJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIANDNidEtpbmVtYXRpY0Nsb3Nlc3ROb3RNZUNvbnZleFJlc3VsdENhbGxiYWNrADMwYnRLaW5lbWF0aWNDaGFyYWN0ZXJDb250cm9sbGVyADMwYnRDaGFyYWN0ZXJDb250cm9sbGVySW50ZXJmYWNlADIyYnRTdWJzaW1wbGV4Q29udmV4Q2FzdAAxMmJ0Q29udmV4Q2FzdABidENvbGxpc2lvbk9iamVjdEZsb2F0RGF0YQAxN2J0Q29sbGlzaW9uT2JqZWN0ADEzYnRHaG9zdE9iamVjdAAyNGJ0UGFpckNhY2hpbmdHaG9zdE9iamVjdAAyM2J0Q29sbGlzaW9uUGFpckNhbGxiYWNrADE3YnRPdmVybGFwQ2FsbGJhY2sAMjFidENvbGxpc2lvbkRpc3BhdGNoZXIAMzFidERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uADI0YnRDb2xsaXNpb25Db25maWd1cmF0aW9uAE4zMWJ0Q29udmV4UGxhbmVDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yNmJ0Qm94Qm94Q29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzRidFNwaGVyZVRyaWFuZ2xlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzJidFNwaGVyZVNwaGVyZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjE2YnRFbXB0eUFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTE3U3dhcHBlZENyZWF0ZUZ1bmNFAE4zNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTdTd2FwcGVkQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQAyNWJ0U2ltdWxhdGlvbklzbGFuZE1hbmFnZXIAMzFidENvbnZleFBsYW5lQ29sbGlzaW9uQWxnb3JpdGhtAFpOMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0yMWNhbGN1bGF0ZVRpbWVPZkltcGFjdEVQMTdidENvbGxpc2lvbk9iamVjdFMxX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUzMUxvY2FsVHJpYW5nbGVTcGhlcmVDYXN0Q2FsbGJhY2sAMjRidENvbnZleFRyaWFuZ2xlQ2FsbGJhY2sAMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjZidEJveEJveENvbGxpc2lvbkFsZ29yaXRobQAxNmJ0TWFuaWZvbGRSZXN1bHQATjM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlNlJlc3VsdEUAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTE1TG9jYWxJbmZvQWRkZXIyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUU5UmF5VGVzdGVyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUUyOUJyaWRnZVRyaWFuZ2xlUmF5Y2FzdENhbGxiYWNrXzAAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTI5QnJpZGdlVHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMTlidFNpbmdsZVJheUNhbGxiYWNrADE3RGVidWdEcmF3Y2FsbGJhY2sAAU92ZXJmbG93IGluIEFBQkIsIG9iamVjdCByZW1vdmVkIGZyb20gc2ltdWxhdGlvbgBJZiB5b3UgY2FuIHJlcHJvZHVjZSB0aGlzLCBwbGVhc2UgZW1haWwgYnVnc0Bjb250aW51b3VzcGh5c2ljcy5jb20KAFBsZWFzZSBpbmNsdWRlIGFib3ZlIGluZm9ybWF0aW9uLCB5b3VyIFBsYXRmb3JtLCB2ZXJzaW9uIG9mIE9TLgoAVGhhbmtzLgoAMTZidENvbGxpc2lvbldvcmxkAFpaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRU4yMmJ0Q29tcG91bmRMZWFmQ2FsbGJhY2sxMlByb2Nlc3NDaGlsZEVpUzVfUEsxNmJ0Q29sbGlzaW9uU2hhcGVFMTRMb2NhbEluZm9BZGRlcgBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTIyYnRDb21wb3VuZExlYWZDYWxsYmFjawBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2tfMABaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2sAMjFidFNpbmdsZVN3ZWVwQ2FsbGJhY2sAMjNidEJyaWRnZWRNYW5pZm9sZFJlc3VsdAAyM2J0U2luZ2xlQ29udGFjdENhbGxiYWNrADM0YnRTcGhlcmVUcmlhbmdsZUNvbGxpc2lvbkFsZ29yaXRobQAyNGJ0UGVydHVyYmVkQ29udGFjdFJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUyMWJ0V2l0aG91dE1hcmdpblJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUxM2J0RHVtbXlSZXN1bHQAMjNidENvbnZleENvbnZleEFsZ29yaXRobQBOMjNidENvbnZleENvbnZleEFsZ29yaXRobTEwQ3JlYXRlRnVuY0UAMjJidENvbXBvdW5kTGVhZkNhbGxiYWNrADI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQAzMGJ0Q29tcG91bmRDb21wb3VuZExlYWZDYWxsYmFjawAzNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQBidENvbXBvdW5kU2hhcGVDaGlsZERhdGEAYnRDb21wb3VuZFNoYXBlRGF0YQBDb21wb3VuZAAxNWJ0Q29tcG91bmRTaGFwZQBidENvbmVTaGFwZURhdGEAQ29uZQAxMWJ0Q29uZVNoYXBlAENvbmVaADEyYnRDb25lU2hhcGVaAENvbmVYADEyYnRDb25lU2hhcGVYAFNQSEVSRQAxM2J0U3BoZXJlU2hhcGUAWk5LMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTlwcm9jZXNzQWxsVHJpYW5nbGVzRVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMWJ0Tm9kZU92ZXJsYXBDYWxsYmFjawBidFRyaWFuZ2xlTWVzaFNoYXBlRGF0YQBCVkhUUklBTkdMRU1FU0gAMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlAFpOMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTRwZXJmb3JtUmF5Y2FzdEVQMThidFRyaWFuZ2xlQ2FsbGJhY2tSSzlidFZlY3RvcjNTNF9FMjFNeU5vZGVPdmVybGFwQ2FsbGJhY2sAWk4yMmJ0QnZoVHJpYW5nbGVNZXNoU2hhcGUxN3BlcmZvcm1Db252ZXhjYXN0RVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X1M0X1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMVN1cHBvcnRWZXJ0ZXhDYWxsYmFjawBaTksxOWJ0VHJpYW5nbGVNZXNoU2hhcGUxOXByb2Nlc3NBbGxUcmlhbmdsZXNFUDE4YnRUcmlhbmdsZUNhbGxiYWNrUks5YnRWZWN0b3IzUzRfRTE2RmlsdGVyZWRDYWxsYmFjawBUUklBTkdMRU1FU0gAMTlidFRyaWFuZ2xlTWVzaFNoYXBlAGJ0U3RhdGljUGxhbmVTaGFwZURhdGEAU1RBVElDUExBTkUAMThidFN0YXRpY1BsYW5lU2hhcGUAMjNidFBvbHloZWRyYWxDb252ZXhTaGFwZQAzNGJ0UG9seWhlZHJhbENvbnZleEFhYmJDYWNoaW5nU2hhcGUAYnRDb2xsaXNpb25TaGFwZURhdGEAMTZidENvbGxpc2lvblNoYXBlADEzYnRDb252ZXhTaGFwZQAyMWJ0Q29udmV4SW50ZXJuYWxTaGFwZQBidENvbnZleEh1bGxTaGFwZURhdGEAQ29udmV4ADE3YnRDb252ZXhIdWxsU2hhcGUAMThidFRyaWFuZ2xlQ2FsbGJhY2sAMzFidEludGVybmFsVHJpYW5nbGVJbmRleENhbGxiYWNrAGJ0Q2Fwc3VsZVNoYXBlRGF0YQBDYXBzdWxlU2hhcGUAMTRidENhcHN1bGVTaGFwZQBDYXBzdWxlWAAxNWJ0Q2Fwc3VsZVNoYXBlWABDYXBzdWxlWgAxNWJ0Q2Fwc3VsZVNoYXBlWgAyNkxvY2FsU3VwcG9ydFZlcnRleENhbGxiYWNrAENvbnZleFRyaW1lc2gAMjVidENvbnZleFRyaWFuZ2xlTWVzaFNoYXBlADE0YnRDb25jYXZlU2hhcGUAQm94ADEwYnRCb3hTaGFwZQAxNGJ0T3B0aW1pemVkQnZoAFpOMTRidE9wdGltaXplZEJ2aDVidWlsZEVQMjNidFN0cmlkaW5nTWVzaEludGVyZmFjZWJSSzlidFZlY3RvcjNTNF9FMjBOb2RlVHJpYW5nbGVDYWxsYmFjawBaTjE0YnRPcHRpbWl6ZWRCdmg1YnVpbGRFUDIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2ViUks5YnRWZWN0b3IzUzRfRTI5UXVhbnRpemVkTm9kZVRyaWFuZ2xlQ2FsbGJhY2sASEVJR0hURklFTEQAMjVidEhlaWdodGZpZWxkVGVycmFpblNoYXBlAGJ0Q3lsaW5kZXJTaGFwZURhdGEAQ3lsaW5kZXJZADE1YnRDeWxpbmRlclNoYXBlAEN5bGluZGVyWAAxNmJ0Q3lsaW5kZXJTaGFwZVgAQ3lsaW5kZXJaADE2YnRDeWxpbmRlclNoYXBlWgAxNGJ0VHJpYW5nbGVNZXNoADIwYnRBeGlzU3dlZXAzSW50ZXJuYWxJdEUAMjFidEJyb2FkcGhhc2VJbnRlcmZhY2UAMTJidEF4aXNTd2VlcDMAMTVidE51bGxQYWlyQ2FjaGUAMjJidE92ZXJsYXBwaW5nUGFpckNhY2hlAFpOMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlMTljbGVhblByb3h5RnJvbVBhaXJzRVAxN2J0QnJvYWRwaGFzZVByb3h5UDEyYnREaXNwYXRjaGVyRTE3Q2xlYW5QYWlyQ2FsbGJhY2sAWk4yOGJ0SGFzaGVkT3ZlcmxhcHBpbmdQYWlyQ2FjaGUzN3JlbW92ZU92ZXJsYXBwaW5nUGFpcnNDb250YWluaW5nUHJveHlFUDE3YnRCcm9hZHBoYXNlUHJveHlQMTJidERpc3BhdGNoZXJFMThSZW1vdmVQYWlyQ2FsbGJhY2sAMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlADE4YnREYnZ0VHJlZUNvbGxpZGVyADIwQnJvYWRwaGFzZUFhYmJUZXN0ZXIAMTlCcm9hZHBoYXNlUmF5VGVzdGVyADE2YnREYnZ0QnJvYWRwaGFzZQAxMmJ0RGlzcGF0Y2hlcgBidE9wdGltaXplZEJ2aE5vZGVEYXRhAGJ0UXVhbnRpemVkQnZoTm9kZURhdGEAYnRCdmhTdWJ0cmVlSW5mb0RhdGEAYnRRdWFudGl6ZWRCdmhGbG9hdERhdGEAMTRidFF1YW50aXplZEJ2aAAyNWJ0VHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMjhidFRyaWFuZ2xlQ29udmV4Y2FzdENhbGxiYWNrAFpOMzNidE1pbmtvd3NraVBlbmV0cmF0aW9uRGVwdGhTb2x2ZXIxMmNhbGNQZW5EZXB0aEVSMjJidFZvcm9ub2lTaW1wbGV4U29sdmVyUEsxM2J0Q29udmV4U2hhcGVTNF9SSzExYnRUcmFuc2Zvcm1TN19SOWJ0VmVjdG9yM1M5X1M5X1AxMmJ0SURlYnVnRHJhd0UyMGJ0SW50ZXJtZWRpYXRlUmVzdWx0ADMzYnRNaW5rb3dza2lQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRDb252ZXhQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRHamtFcGFQZW5ldHJhdGlvbkRlcHRoU29sdmVyADE2YnRQb2ludENvbGxlY3RvcgAxNWJ0R2prQ29udmV4Q2FzdAAyN2J0Q29udGludW91c0NvbnZleENvbGxpc2lvbgAxN2J0R2prUGFpckRldGVjdG9yADM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlADMwYnRBY3RpdmF0aW5nQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRFbXB0eUFsZ29yaXRobQAzMmJ0U3BoZXJlU3BoZXJlQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRCb3hCb3hEZXRlY3RvcgAyMlNwaGVyZVRyaWFuZ2xlRGV0ZWN0b3IAMjNidEhhc2hlZFNpbXBsZVBhaXJDYWNoZQAxOGJ0Q29udmV4UG9seWhlZHJvbgAyNmJ0VHJpYW5nbGVJbmRleFZlcnRleEFycmF5AGJ0SW50SW5kZXhEYXRhAGJ0U2hvcnRJbnRJbmRleFRyaXBsZXREYXRhAGJ0Q2hhckluZGV4VHJpcGxldERhdGEAYnRWZWN0b3IzRmxvYXREYXRhAGJ0VmVjdG9yM0RvdWJsZURhdGEAYnRNZXNoUGFydERhdGEAYnRTdHJpZGluZ01lc2hJbnRlcmZhY2VEYXRhADIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2UAUm9vdAARAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABEADwoREREDCgcAARMJCwsAAAkGCwAACwAGEQAAABEREQAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAARAAoKERERAAoAAAIACQsAAAAJAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA0AAAAEDQAAAAAJDgAAAAAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAPAAAAAA8AAAAACRAAAAAAABAAABAAABIAAAASEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAABISEgAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAoAAAAACgAAAAAJCwAAAAAACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAC0rICAgMFgweAAobnVsbCkALTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAwMTIzNDU2Nzg5QUJDREVGLgBUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXM6ICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXMAdGVybWluYXRpbmcgd2l0aCAlcyBmb3JlaWduIGV4Y2VwdGlvbgB0ZXJtaW5hdGluZwB1bmNhdWdodABTdDlleGNlcHRpb24ATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAU3Q5dHlwZV9pbmZvAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAcHRocmVhZF9vbmNlIGZhaWx1cmUgaW4gX19jeGFfZ2V0X2dsb2JhbHNfZmFzdCgpAGNhbm5vdCBjcmVhdGUgcHRocmVhZCBrZXkgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAY2Fubm90IHplcm8gb3V0IHRocmVhZCB2YWx1ZSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQB0ZXJtaW5hdGVfaGFuZGxlciB1bmV4cGVjdGVkbHkgcmV0dXJuZWQATjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTE3X19wYmFzZV90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0U=";var tempDoublePtr=STATICTOP;STATICTOP+=16;function __ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8setParamEifi(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8setParamEifi");abort(-1)}function __ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder");abort(-1)}function __ZNK30btGeneric6DofSpring2Constraint8getParamEii(){Module["printErr"]("missing function: _ZNK30btGeneric6DofSpring2Constraint8getParamEii");abort(-1)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___gxx_personality_v0(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var _llvm_pow_f32=Math_pow;function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function __ZTI30btGeneric6DofSpring2Constraint(){Module["printErr"]("missing function: _ZTI30btGeneric6DofSpring2Constraint");abort(-1)}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i>2]=c[a+4>>2];c[b+20>>2]=c[a+8>>2];c[b+24>>2]=c[a+12>>2];c[b+28>>2]=c[a+16>>2];c[b+32>>2]=c[a+20>>2];c[b+36>>2]=c[a+24>>2];c[b+40>>2]=c[a+28>>2];c[b+44>>2]=c[a+32>>2];c[b+48>>2]=c[a+36>>2];c[b+52>>2]=c[a+40>>2];c[b+56>>2]=c[a+44>>2];c[b+60>>2]=c[a+48>>2];c[b+64>>2]=c[a+52>>2];c[b+68>>2]=c[a+56>>2];c[b+72>>2]=c[a+60>>2];c[b+76>>2]=c[a+64>>2];c[b+80>>2]=c[a+68>>2];c[b+84>>2]=c[a+72>>2];c[b+88>>2]=c[a+76>>2];c[b+92>>2]=c[a+80>>2];c[b+96>>2]=c[a+84>>2];c[b+100>>2]=c[a+88>>2];c[b+104>>2]=c[a+92>>2];c[b+108>>2]=c[a+96>>2];c[b+112>>2]=c[a+100>>2];c[b+116>>2]=c[a+104>>2];c[b+120>>2]=c[a+108>>2];c[b+124>>2]=c[a+112>>2];c[b+128>>2]=c[a+116>>2];c[b+132>>2]=c[a+120>>2];c[b+136>>2]=c[a+124>>2];c[b+140>>2]=c[a+128>>2];c[b+144>>2]=c[a+132>>2];c[b+148>>2]=c[a+136>>2];c[b+152>>2]=c[a+140>>2];c[b+156>>2]=c[a+144>>2];c[b+160>>2]=c[a+148>>2];c[b+164>>2]=c[a+152>>2];c[b+168>>2]=c[a+156>>2];c[b+172>>2]=c[a+160>>2];c[b+176>>2]=c[a+164>>2];c[b+180>>2]=c[a+168>>2];c[b+184>>2]=c[a+172>>2];c[b+188>>2]=c[a+176>>2];c[b+232>>2]=c[a+180>>2];c[b+192>>2]=c[a+184>>2];c[b>>2]=0;c[b+4>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+192>>2]|0)|0;c[b+8>>2]=0;c[b+236>>2]=c[a+204>>2];c[b+240>>2]=c[a+208>>2];c[b+244>>2]=c[a+212>>2];c[b+248>>2]=c[a+220>>2];c[b+196>>2]=c[a+224>>2];c[b+200>>2]=c[a+228>>2];c[b+204>>2]=c[a+236>>2];c[b+208>>2]=c[a+244>>2];c[b+212>>2]=c[a+248>>2];c[b+216>>2]=c[a+232>>2];c[b+252>>2]=c[a+252>>2];e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b+12>>2]=f;if(!f){f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}function cf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0;v=a[h+16>>0]&-16;a[h+16>>0]=v;w=+g[e>>2];x=+g[d>>2];n=+g[e+4>>2];o=+g[d+4>>2];p=+g[e+8>>2];q=+g[d+8>>2];r=+g[f>>2];s=+g[f+4>>2];t=+g[f+8>>2];l=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];y=(w-x)*(l-x)+(n-o)*(m-o)+(p-q)*(i-q);z=(r-x)*(l-x)+(s-o)*(m-o)+(t-q)*(i-q);do if(y<=0.0&z<=0.0){c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];a[h+16>>0]=v|1;j=0.0;k=0.0;i=1.0}else{u=(w-x)*(l-w)+(n-o)*(m-n)+(p-q)*(i-p);k=(r-x)*(l-w)+(s-o)*(m-n)+(t-q)*(i-p);if(!(!(u>=0.0)|!(k<=u))){c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];a[h+16>>0]=v|2;j=0.0;k=1.0;i=0.0;break}if(u<=0.0&(y>=0.0?y*k-u*z<=0.0:0)){g[h>>2]=x+(w-x)*(y/(y-u));g[h+4>>2]=o+(n-o)*(y/(y-u));g[h+8>>2]=q+(p-q)*(y/(y-u));g[h+12>>2]=0.0;a[h+16>>0]=v|3;j=0.0;k=y/(y-u);i=1.0-y/(y-u);break}j=(w-x)*(l-r)+(n-o)*(m-s)+(p-q)*(i-t);i=(r-x)*(l-r)+(s-o)*(m-s)+(t-q)*(i-t);if(!(!(i>=0.0)|!(j<=i))){c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];a[h+16>>0]=v|4;j=1.0;k=0.0;i=0.0;break}if(i<=0.0&(z>=0.0?j*z-y*i<=0.0:0)){g[h>>2]=x+(r-x)*(z/(z-i));g[h+4>>2]=o+(s-o)*(z/(z-i));g[h+8>>2]=q+(t-q)*(z/(z-i));g[h+12>>2]=0.0;a[h+16>>0]=v|5;j=z/(z-i);k=0.0;i=1.0-z/(z-i);break}if((u*i-j*k<=0.0?k-u>=0.0:0)?j-i>=0.0:0){k=(k-u)/(k-u+(j-i));g[h>>2]=w+(r-w)*k;g[h+4>>2]=n+(s-n)*k;g[h+8>>2]=p+(t-p)*k;g[h+12>>2]=0.0;a[h+16>>0]=v|6;j=k;k=1.0-k;i=0.0;break}l=1.0/(y*k-u*z+(u*i-j*k+(j*z-y*i)));m=(j*z-y*i)*l;i=(y*k-u*z)*l;g[h>>2]=(r-x)*i+((w-x)*m+x);g[h+4>>2]=(s-o)*i+((n-o)*m+o);g[h+8>>2]=(t-q)*i+((p-q)*m+q);g[h+12>>2]=0.0;a[h+16>>0]=v|7;j=i;k=m;i=1.0-m-i}while(0);g[h+20>>2]=i;g[h+24>>2]=k;g[h+28>>2]=j;g[h+32>>2]=0.0;return}function df(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;h=c[c[b+1120>>2]>>2]|0;f=c[c[e+1120>>2]>>2]|0;c[6995]=(c[6995]|0)+1;e=sc(207)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}y=e+4|0;i=e+28|0;Yk(i|0,0,160)|0;c[e>>2]=3464;c[y>>2]=h;c[e+8>>2]=0;c[e+12>>2]=0;h=e+16|0;c[h>>2]=f;c[e+20>>2]=0;c[e+24>>2]=0;f=ui(y)|0;j=+g[f>>2];l=+g[f+16>>2];n=+g[f+32>>2];p=+g[f+4>>2];q=+g[f+20>>2];r=+g[f+36>>2];s=+g[f+8>>2];u=+g[f+24>>2];w=+g[f+40>>2];k=-+g[f+48>>2];m=-+g[f+52>>2];o=-+g[f+56>>2];t=+g[d+12>>2];v=+g[d+16>>2];x=+g[d+20>>2];g[i>>2]=j*k+l*m+n*o+(j*t+l*v+n*x);g[e+32>>2]=p*k+q*m+r*o+(p*t+q*v+r*x);g[e+36>>2]=s*k+u*m+w*o+(s*t+u*v+w*x);g[e+40>>2]=0.0;h=ui(h)|0;x=+g[h>>2];w=+g[h+16>>2];v=+g[h+32>>2];u=+g[h+4>>2];t=+g[h+20>>2];s=+g[h+36>>2];o=+g[h+8>>2];m=+g[h+24>>2];k=+g[h+40>>2];r=-+g[h+48>>2];q=-+g[h+52>>2];p=-+g[h+56>>2];n=+g[d+12>>2];l=+g[d+16>>2];j=+g[d+20>>2];g[e+44>>2]=x*r+w*q+v*p+(x*n+w*l+v*j);g[e+48>>2]=u*r+t*q+s*p+(u*n+t*l+s*j);g[e+52>>2]=o*r+m*q+k*p+(o*n+m*l+k*j);g[e+56>>2]=0.0;c[e+60>>2]=c[d+4>>2];c[e+64>>2]=c[d>>2];c[e+68>>2]=c[d+8>>2];h=e;f=c[b+912>>2]|0;if((f|0)!=(c[b+916>>2]|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}i=f|0?f<<1:1;if((f|0)>=(i|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+912>>2]|0}if((f|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+920>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+920>>2]|0;if(d){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+912>>2]|0}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=e;c[b+916>>2]=i;y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}function ef(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;var i=0;i=l;l=l+144|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=4324;a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;g[i>>2]=d;c[i+4>>2]=e;c[i+72>>2]=f;c[i+76>>2]=c[h>>2];c[i+76+4>>2]=c[h+4>>2];c[i+76+8>>2]=c[h+8>>2];c[i+76+12>>2]=c[h+12>>2];g[i+92>>2]=0.0;g[i+96>>2]=0.0;g[i+100>>2]=.5;g[i+104>>2]=0.0;g[i+108>>2]=0.0;g[i+112>>2]=0.0;g[i+116>>2]=.800000011920929;g[i+120>>2]=1.0;a[i+124>>0]=0;g[i+128>>2]=.004999999888241291;g[i+132>>2]=.009999999776482582;g[i+136>>2]=.009999999776482582;g[i+140>>2]=.009999999776482582;c[i+8>>2]=1065353216;c[i+12>>2]=0;c[i+12+4>>2]=0;c[i+12+8>>2]=0;c[i+12+12>>2]=0;c[i+28>>2]=1065353216;c[i+32>>2]=0;c[i+32+4>>2]=0;c[i+32+8>>2]=0;c[i+32+12>>2]=0;c[i+48>>2]=1065353216;c[i+52>>2]=0;c[i+52+4>>2]=0;c[i+52+8>>2]=0;c[i+52+12>>2]=0;c[i+52+16>>2]=0;Id(b,i);l=i;return}function ff(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+548>>2]|0;a:do if((e|0)>0){g=c[b+556>>2]|0;f=0;while(1){if((c[g+(f<<2)>>2]|0)==(d|0))break;f=f+1|0;if((f|0)>=(e|0))break a}if((f|0)!=(e|0))return}while(0);if((e|0)==(c[b+552>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+548>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+556>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+556>>2]|0;if(f){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+548>>2]|0}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=g;c[b+552>>2]=h}c[(c[b+556>>2]|0)+(e<<2)>>2]=d;c[b+548>>2]=e+1;g=c[d+28>>2]|0;h=c[d+32>>2]|0;if((g|0)==(b|0)){e=c[b+288>>2]|0;if((e|0)==(c[b+292>>2]|0)?(j=e|0?e<<1:1,(e|0)<(j|0)):0){if(!j)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+288>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+296>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+296>>2]|0;if(f){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+288>>2]|0}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=g;c[b+292>>2]=j}c[(c[b+296>>2]|0)+(e<<2)>>2]=h;e=e+1|0;c[b+288>>2]=e}else{b=c[h+288>>2]|0;if((b|0)==(c[h+292>>2]|0)?(i=b|0?b<<1:1,(b|0)<(i|0)):0){if(!i)f=0;else{c[6995]=(c[6995]|0)+1;b=sc((i<<2|3)+16|0)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;b=c[h+288>>2]|0}if((b|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+296>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(b|0))}e=c[h+296>>2]|0;if(e){if(a[h+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);b=c[h+288>>2]|0}c[h+296>>2]=0}a[h+300>>0]=1;c[h+296>>2]=f;c[h+292>>2]=i}c[(c[h+296>>2]|0)+(b<<2)>>2]=g;e=b+1|0;c[h+288>>2]=e;b=h}c[b+280>>2]=(e|0)>0&1;return}function gf(a,b,f){a=a|0;b=b|0;f=f|0;var i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;t=l;l=l+32|0;c[a+60>>2]=(c[a+60>>2]|0)+1;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,t+28|0,t+24|0,t+20|0,t+16|0,t+12|0,t+8|0,t+4|0,t,b);n=(c[t+12>>2]|0)+(P(c[t+8>>2]|0,f)|0)|0;r=c[a+4>>2]|0;o=c[t>>2]|0;switch(o|0){case 3:{i=e[n+4>>1]|0;break}case 2:{i=c[n+8>>2]|0;break}default:i=d[n+2>>0]|0}s=(c[t+20>>2]|0)==0;p=c[t+16>>2]|0;q=c[t+28>>2]|0;i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+44>>2]=m;g[a+48>>2]=k;g[a+52>>2]=j;g[a+56>>2]=0.0;switch(o|0){case 3:{i=e[n+2>>1]|0;break}case 2:{i=c[n+4>>2]|0;break}default:i=d[n+1>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+28>>2]=m;g[a+32>>2]=k;g[a+36>>2]=j;g[a+40>>2]=0.0;switch(o|0){case 3:{i=e[n>>1]|0;break}case 2:{i=c[n>>2]|0;break}default:i=d[n>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];j=+g[i>>2]*+g[r+4>>2];u=+g[i+8>>2];m=+g[r+12>>2];m=u*m;r=a+12|0;g[r>>2]=j;r=a+16|0;g[r>>2]=k;r=a+20|0;g[r>>2]=m;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}else{m=+h[i+8>>3]*+g[r+8>>2];k=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3];u=+g[r+12>>2];u=j*u;r=a+12|0;g[r>>2]=k;r=a+16|0;g[r>>2]=m;r=a+20|0;g[r>>2]=u;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}}function hf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){i=c[b+12>>2]|0;uo(b+16|0,d,e,f,g);if((i|0)<=1)break;h=c[b+8>>2]|0;if((h&2|0)==0?(c[d+36>>2]|0)!=1:0){if(!(h&1)){h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==1:0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;j=b+16+(c[b+12>>2]<<3)|0;h=0;i=b+16|0;k=0;b:while(1){if(i>>>0>=j>>>0){f=18;break}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,e,1,g);if(a[d+54>>0]|0){f=18;break}do if(a[d+53>>0]|0){if(!(a[d+52>>0]|0))if(!(c[b+8>>2]&1)){h=1;f=18;break b}else{h=1;f=k;break}if((c[d+24>>2]|0)==1){f=23;break b}if(!(c[b+8>>2]&2)){f=23;break b}else{h=1;f=1}}else f=k;while(0);i=i+8|0;k=f}do if((f|0)==18){if((!k?(c[d+20>>2]=e,c[d+40>>2]=(c[d+40>>2]|0)+1,(c[d+36>>2]|0)==1):0)?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(h){f=23;break}else{h=4;break}}if(h)f=23;else h=4}while(0);if((f|0)==23)h=3;c[d+44>>2]=h;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function jf(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+164>>2];t=+g[f+340>>2];p=+g[b+160>>2];n=+g[b+156>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+164>>2];p=+g[f+396>>2];q=+g[b+160>>2];n=+g[b+156>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}r=k+d;q=o+j;p=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){n=0.0;o=0.0;d=0.0;j=0.0;k=0.0;m=0.0}else{t=+g[f+336>>2];k=+g[b+180>>2];w=+g[f+340>>2];v=+g[b+176>>2];m=+g[b+172>>2];u=+g[f+332>>2];n=+g[f+316>>2];o=+g[f+320>>2];d=+g[f+324>>2];j=t*k-w*v;k=w*m-k*u;m=v*u-t*m}}else{w=+g[f+392>>2];k=+g[b+180>>2];t=+g[f+396>>2];u=+g[b+176>>2];m=+g[b+172>>2];v=+g[f+388>>2];n=+g[f+372>>2];o=+g[f+376>>2];d=+g[f+380>>2];j=w*k-t*u;k=t*m-k*v;m=u*v-w*m}c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;a[s+36+32>>0]=1;u=+g[b+60>>2];r=+g[b+72>>2]+(r-(n+j))*u;t=(q-(o+k))*u+ +g[b+76>>2];u=(p-(d+m))*u+ +g[b+80>>2];v=(r*+g[b+120>>2]+t*+g[b+124>>2]+u*+g[b+128>>2])*e;w=(r*+g[b+136>>2]+t*+g[b+140>>2]+u*+g[b+144>>2])*e;g[s+36>>2]=(r*+g[b+104>>2]+t*+g[b+108>>2]+u*+g[b+112>>2])*e;g[s+36+4>>2]=v;g[s+36+8>>2]=w;g[s+36+12>>2]=0.0;f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+156|0);Nh(b+16|0,s+36|0,b+172|0);l=s;return}function kf(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0;d=c[a+780>>2]|0;if((d|0)!=4){c[a+780>>2]=d+1;x=d;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}y=+g[b+80>>2];v=+g[a+84>>2];u=v>2];s=t>2];w=+g[a+660>>2]<(r>31;y=+g[b>>2];if(d){e=+g[a+196>>2];k=+g[b+4>>2];l=+g[a+200>>2];h=+g[b+8>>2];f=+g[a+204>>2];m=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];i=((y-e)*(q-p)-(k-l)*(m-u))*((y-e)*(q-p)-(k-l)*(m-u))+(((k-l)*(s-n)-(h-f)*(q-p))*((k-l)*(s-n)-(h-f)*(q-p))+((h-f)*(m-u)-(y-e)*(s-n))*((h-f)*(m-u)-(y-e)*(s-n)));if((d|0)==1){j=+g[a+8>>2];t=h;o=+g[a+12>>2];r=m;v=e;h=0.0;m=+g[a+4>>2];x=7}else{t=h;r=m;x=6}}else{e=+g[a+196>>2];l=+g[a+200>>2];f=+g[a+204>>2];i=0.0;k=+g[b+4>>2];t=+g[b+8>>2];r=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];x=6}if((x|0)==6){m=+g[a+4>>2];j=+g[a+8>>2];B=k-j;o=+g[a+12>>2];z=t-o;v=r-u;A=q-p;h=s-n;h=((y-m)*A-B*v)*((y-m)*A-B*v)+((B*h-z*A)*(B*h-z*A)+(z*v-(y-m)*h)*(z*v-(y-m)*h));if((d|0)==2){r=u;q=e;e=0.0;x=8}else{v=e;x=7}}if((x|0)==7){B=y-m;D=k-j;z=t-o;A=r-v;r=q-l;e=s-f;e=(B*r-D*A)*(B*r-D*A)+((D*e-z*r)*(D*e-z*r)+(z*A-B*e)*(z*A-B*e));if(w)f=0.0;else{r=u;q=v;x=8}}if((x|0)==8){D=y-m;y=k-j;A=t-o;B=r-q;z=p-l;f=n-f;f=(D*z-y*B)*(D*z-y*B)+((y*f-A*z)*(y*f-A*z)+(A*B-D*f)*(A*B-D*f))}D=+C(+i);A=+C(+h);y=+C(+e);v=+C(+f);B=D>-999999984306749440.0?D:-999999984306749440.0;z=A>B?A:B;x=v>(y>z?y:z)?3:y>z?2:A>B?1:(D>-999999984306749440.0^1)<<31>>31;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}function lf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;q=c[b+18504>>2]|0;if(!q){c[b>>2]=5;q=0;return q|0}i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18504>>2]|0)==(q|0))c[b+18504>>2]=c[q+48>>2];c[b+18508>>2]=(c[b+18508>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18496>>2];i=c[b+18496>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18496>>2]=q;c[b+18500>>2]=(c[b+18500>>2]|0)+1;a[q+55>>0]=0;c[q+20>>2]=d;c[q+24>>2]=e;c[q+28>>2]=f;m=+g[d+16>>2];j=+g[e+16>>2]-m;n=+g[d+20>>2];k=+g[e+20>>2]-n;o=+g[d+24>>2];l=+g[e+24>>2]-o;m=+g[f+16>>2]-m;n=+g[f+20>>2]-n;o=+g[f+24>>2]-o;g[q>>2]=k*o-l*n;g[q+4>>2]=l*m-j*o;g[q+8>>2]=j*n-k*m;g[q+12>>2]=0.0;p=+D(+((k*o-l*n)*(k*o-l*n)+(l*m-j*o)*(l*m-j*o)+(j*n-k*m)*(j*n-k*m)));if(p>9.999999747378752e-05){if((!(Zk(k*o-l*n,l*m-j*o,j*n-k*m,+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],q+16|0)|0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],q+16|0)|0):0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],q+16|0)|0):0)g[q+16>>2]=(+g[d+16>>2]*+g[q>>2]+ +g[d+20>>2]*+g[q+4>>2]+ +g[d+24>>2]*+g[q+8>>2])/p;g[q>>2]=1.0/p*+g[q>>2];g[q+4>>2]=1.0/p*+g[q+4>>2];g[q+8>>2]=1.0/p*+g[q+8>>2];if(h)return q|0;if(!(+g[q+16>>2]>=-9.999999747378752e-06))i=3;else return q|0}else i=2;c[b>>2]=i;i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18496>>2]|0)==(q|0))c[b+18496>>2]=c[q+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18504>>2]=q;c[b+18508>>2]=(c[b+18508>>2]|0)+1;q=0;return q|0}function mf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0;h=c[d+8>>2]|0;if((h|0)>0){i=c[d+16>>2]|0;f=0;e=0;do{j=c[i+(f<<2)>>2]|0;if(!(c[j+204>>2]&3)){c[j+208>>2]=e;e=e+1|0}c[j+212>>2]=-1;g[j+268>>2]=1.0;f=f+1|0}while((f|0)!=(h|0));j=e}else j=0;i=c[b+8>>2]|0;if((i|0)<(j|0)){if((c[b+12>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<3|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+8>>2]|0}if((h|0)>0){f=0;do{m=(c[b+16>>2]|0)+(f<<3)|0;k=c[m+4>>2]|0;l=e+(f<<3)|0;c[l>>2]=c[m>>2];c[l+4>>2]=k;f=f+1|0}while((f|0)!=(h|0))}f=c[b+16>>2]|0;if(f|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=e;c[b+12>>2]=j;f=b+16|0}else f=b+16|0;e=i;do{m=(c[f>>2]|0)+(e<<3)|0;c[m>>2]=0;c[m+4>>2]=0;e=e+1|0}while((e|0)!=(j|0))}c[b+8>>2]=j;if((j|0)>0){f=c[b+16>>2]|0;e=0;do{c[f+(e<<3)>>2]=e;c[f+(e<<3)+4>>2]=1;e=e+1|0}while((e|0)!=(j|0))}e=c[d+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;l=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;if(!l)return;k=xb[c[(c[e>>2]|0)+20>>2]&127](e)|0;if((l|0)<=0)return;d=0;do{e=c[c[k+(d<<4)>>2]>>2]|0;f=c[c[k+(d<<4)+4>>2]>>2]|0;if((e|0?(f|0?(c[e+204>>2]&7|0)==0:0):0)?(c[f+204>>2]&7|0)==0:0){i=c[e+208>>2]|0;e=c[f+208>>2]|0;j=c[b+16>>2]|0;f=c[j+(i<<3)>>2]|0;if((f|0)!=(i|0)){h=j+(i<<3)|0;do{i=j+(f<<3)|0;c[h>>2]=c[i>>2];i=c[i>>2]|0;h=j+(i<<3)|0;f=c[h>>2]|0}while((i|0)!=(f|0))}f=c[j+(e<<3)>>2]|0;if((f|0)!=(e|0)){h=j+(e<<3)|0;do{e=j+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=j+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}if((i|0)!=(e|0)){c[j+(i<<3)>>2]=e;m=j+(e<<3)+4|0;c[m>>2]=(c[m>>2]|0)+(c[j+(i<<3)+4>>2]|0)}}d=d+1|0}while((d|0)!=(l|0));return}function nf(b){b=b|0;var d=0,e=0;c[b>>2]=5536;if(a[b+20>>0]|0){d=c[b+16>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+16>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}if(a[b+12>>0]|0){d=c[b+8>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+28>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+28>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+32>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+32>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+36>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+36>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+40>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+40>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+44>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+44>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+48>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+48>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+52>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+52>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+72>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+72>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+76>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+76>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+68>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+68>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+24>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+24>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function of(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;u=+g[b>>2];t=+g[b+4>>2];s=+g[b+8>>2];r=1.0/+D(+(u*u+t*t+s*s));y=+g[d>>2];x=+g[d+4>>2];w=+g[d+8>>2];v=1.0/+D(+(y*y+x*x+w*w));B=s*r*x*v-t*r*w*v;A=u*r*w*v-s*r*y*v;z=t*r*y*v-u*r*x*v;d=c[a+28>>2]|0;e=+g[d+4>>2];h=+g[d+20>>2];j=+g[d+36>>2];f=+g[d+8>>2];i=+g[d+24>>2];k=+g[d+40>>2];l=+g[d+12>>2];n=+g[d+28>>2];p=+g[d+44>>2];m=-+g[d+52>>2];o=-+g[d+56>>2];q=-+g[d+60>>2];g[a+48>>2]=z*j+(e*B+h*A);g[a+52>>2]=e*y*v+x*v*h+w*v*j;g[a+56>>2]=u*r*e+t*r*h+s*r*j;g[a+60>>2]=0.0;g[a+64>>2]=B*f+A*i+z*k;g[a+68>>2]=y*v*f+x*v*i+w*v*k;g[a+72>>2]=u*r*f+t*r*i+s*r*k;g[a+76>>2]=0.0;g[a+80>>2]=B*l+A*n+z*p;g[a+84>>2]=y*v*l+x*v*n+w*v*p;g[a+88>>2]=u*r*l+t*r*n+s*r*p;g[a+92>>2]=0.0;g[a+96>>2]=e*0.0+h*0.0+j*0.0+(e*m+h*o+j*q);g[a+100>>2]=f*0.0+i*0.0+k*0.0+(f*m+i*o+k*q);g[a+104>>2]=l*0.0+n*0.0+p*0.0+(l*m+n*o+p*q);g[a+108>>2]=0.0;d=c[a+32>>2]|0;q=+g[d+4>>2];p=+g[d+20>>2];o=+g[d+36>>2];n=+g[d+8>>2];m=+g[d+24>>2];l=+g[d+40>>2];k=+g[d+12>>2];i=+g[d+28>>2];f=+g[d+44>>2];j=-+g[d+52>>2];h=-+g[d+56>>2];e=-+g[d+60>>2];g[a+112>>2]=B*q+A*p+z*o;g[a+116>>2]=y*v*q+x*v*p+w*v*o;g[a+120>>2]=u*r*q+t*r*p+s*r*o;g[a+124>>2]=0.0;g[a+128>>2]=B*n+A*m+z*l;g[a+132>>2]=y*v*n+x*v*m+w*v*l;g[a+136>>2]=u*r*n+t*r*m+s*r*l;g[a+140>>2]=0.0;g[a+144>>2]=B*k+A*i+z*f;g[a+148>>2]=y*v*k+x*v*i+w*v*f;g[a+152>>2]=u*r*k+t*r*i+s*r*f;g[a+156>>2]=0.0;g[a+160>>2]=q*0.0+p*0.0+o*0.0+(q*j+p*h+o*e);g[a+164>>2]=n*0.0+m*0.0+l*0.0+(n*j+m*h+l*e);g[a+168>>2]=k*0.0+i*0.0+f*0.0+(k*j+i*h+f*e);g[a+172>>2]=0.0;jd(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0);return}function pf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c[6158]=(c[6158]|0)+1;f=c[b+24>>2]|0;if(!f){if(!(c[e+8>>2]&c[d+4>>2])){b=0;return b|0}if(!(c[d+8>>2]&c[e+4>>2])){b=0;return b|0}}else if(!(Bb[c[(c[f>>2]|0)+8>>2]&63](f,d,e)|0)){b=0;return b|0}k=(c[d+12>>2]|0)>(c[e+12>>2]|0);l=k?e:d;g=c[l+12>>2]|0;k=k?d:e;d=c[k+12>>2]|0;i=(((d<<16|g)+~((d<<16|g)<<15)|0)>>>10^(d<<16|g)+~((d<<16|g)<<15))*9|0;i=((i>>>6^i)+~((i>>>6^i)<<11)|0)>>>16^(i>>>6^i)+~((i>>>6^i)<<11);j=c[b+12>>2]|0;f=c[(c[b+40>>2]|0)+((i&j+-1)<<2)>>2]|0;a:do if((f|0)!=-1){e=c[b+16>>2]|0;while(1){if((c[(c[e+(f<<4)>>2]|0)+12>>2]|0)==(g|0)?(c[(c[e+(f<<4)+4>>2]|0)+12>>2]|0)==(d|0):0)break;f=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}f=e+(f<<4)|0;if(f|0){b=f;return b|0}}while(0);h=c[b+8>>2]|0;if((h|0)==(j|0)){g=j|0?j<<1:1;if((j|0)<(g|0)){if(!g){f=0;d=j}else{c[6995]=(c[6995]|0)+1;f=sc((g<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=c[b+8>>2]|0}if((d|0)>0){e=0;do{m=c[b+16>>2]|0;c[f+(e<<4)>>2]=c[m+(e<<4)>>2];c[f+(e<<4)+4>>2]=c[m+(e<<4)+4>>2];c[f+(e<<4)+8>>2]=c[m+(e<<4)+8>>2];c[f+(e<<4)+12>>2]=c[m+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+16>>2]|0;if(e){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=g;f=g}else{d=j;f=j}}else{d=h;f=j}c[b+8>>2]=d+1;e=c[b+16>>2]|0;d=c[b+68>>2]|0;if(d){Bb[c[(c[d>>2]|0)+8>>2]&63](d,l,k)|0;f=c[b+12>>2]|0}if((j|0)<(f|0)){Kf(b);f=(c[b+12>>2]|0)+-1&i}else f=i&j+-1;m=(c[l+12>>2]|0)<(c[k+12>>2]|0);c[e+(h<<4)>>2]=m?l:k;c[e+(h<<4)+4>>2]=m?k:l;c[e+(h<<4)+8>>2]=0;c[e+(h<<4)+8+4>>2]=0;m=(c[b+40>>2]|0)+(f<<2)|0;c[(c[b+60>>2]|0)+(h<<2)>>2]=c[m>>2];c[m>>2]=h;m=e+(h<<4)|0;return m|0}function qf(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=c[a+108>>2]|0;if(g|0)Sb[c[(c[g>>2]|0)+12>>2]&127](g,c[d+60>>2]|0,f);o=c[d+12>>2]|0;p=c[a+60>>2]|0;n=c[a+92>>2]|0;if(!(xb[c[(c[n>>2]|0)+56>>2]&127](n)|0)){n=c[a+92>>2]|0;Sb[c[(c[n>>2]|0)+16>>2]&127](n,p+((o&65535)<<6)|0,f)}m=e[a+56>>1]|0;l=c[a+60>>2]|0;b[l+54>>1]=(e[l+54>>1]|0)+65534;b[l+56>>1]=(e[l+56>>1]|0)+65534;b[l+58>>1]=(e[l+58>>1]|0)+65534;l=0;d=b[a+6>>1]|0;do{k=a+68+(l<<2)|0;n=c[k>>2]|0;g=e[p+((o&65535)<<6)+54+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;f=b[n+(g<<2)+6>>1]|0;if(!(f<<16>>16))f=n;else{j=(c[a+60>>2]|0)+((e[n+(g<<2)+2>>1]|0)<<6)+54+(l<<1)|0;i=n+(g<<2)|0;while(1){h=i;i=i+4|0;g=b[i>>1]|0;if((d&65535)<(g&65535))break;q=c[a+60>>2]|0;d=f&65535;d=(g&1)==0?q+(d<<6)+48+(l<<1)|0:q+(d<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[j>>1]=(b[j>>1]|0)+1<<16>>16;d=e[h>>1]|e[h+2>>1]<<16;g=e[i>>1]|e[i+2>>1]<<16;b[h>>1]=g;b[h+2>>1]=g>>>16;b[i>>1]=d;b[i+2>>1]=d>>>16;f=b[h+10>>1]|0;if(!(f<<16>>16))break;else d=d&65535}d=b[a+6>>1]|0;f=c[k>>2]|0}g=e[p+((o&65535)<<6)+48+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;i=f+(g<<2)|0;h=b[i+6>>1]|0;if(h<<16>>16){k=(c[a+60>>2]|0)+((e[f+(g<<2)+2>>1]|0)<<6)+48+(l<<1)|0;j=i;f=b[i>>1]|0;while(1){g=j;j=j+4|0;d=b[j>>1]|0;if((f&65535)<(d&65535))break;i=c[a+60>>2]|0;q=h&65535;d=(d&1)==0?i+(q<<6)+48+(l<<1)|0:i+(q<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[k>>1]=(b[k>>1]|0)+1<<16>>16;d=e[g>>1]|e[g+2>>1]<<16;q=e[j>>1]|e[j+2>>1]<<16;b[g>>1]=q;b[g+2>>1]=q>>>16;b[j>>1]=d;b[j+2>>1]=d>>>16;h=b[g+10>>1]|0;if(!(h<<16>>16))break;else f=d&65535}d=b[a+6>>1]|0}b[n+((m<<1)+-1<<2)+2>>1]=0;b[n+((m<<1)+-1<<2)>>1]=d;l=l+1|0}while((l|0)!=3);b[(c[a+60>>2]|0)+((o&65535)<<6)+48>>1]=b[a+64>>1]|0;b[a+64>>1]=o;b[a+56>>1]=(b[a+56>>1]|0)+-1<<16>>16;return}function rf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0;w=l;l=l+32|0;q=c[a+12>>2]|0;r=+g[q+(((e+d|0)/2|0)*24|0)>>2];t=+g[q+(((e+d|0)/2|0)*24|0)+4>>2];u=+g[q+(((e+d|0)/2|0)*24|0)+8>>2];v=+g[q+(((e+d|0)/2|0)*24|0)+16>>2];s=c[q+(((e+d|0)/2|0)*24|0)+20>>2]|0;f=e;h=d;while(1){m=+g[b>>2];n=+g[b+4>>2];o=+g[b+8>>2];p=(r-m)*(r-m)+(t-n)*(t-n)+(u-o)*(u-o);a:while(1){i=+g[q+(h*24|0)+16>>2];do if(i!=v){if(!(i>2]-m;j=+g[q+(h*24|0)+4>>2]-n;k=+g[q+(h*24|0)+8>>2]-o;if(i*i+j*j+k*k!=p)if(i*i+j*j+k*k>2]|0)<(s|0))break;else break a}while(0);h=h+1|0}b:while(1){i=+g[q+(f*24|0)+16>>2];do if(v!=i){if(!(v>2]-m;j=+g[q+(f*24|0)+4>>2]-n;k=+g[q+(f*24|0)+8>>2]-o;if(p!=i*i+j*j+k*k)if(p>2]|0))break;else break b}while(0);f=f+-1|0}if((h|0)<=(f|0)){x=q+(h*24|0)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];q=q+(f*24|0)|0;c[x>>2]=c[q>>2];c[x+4>>2]=c[q+4>>2];c[x+8>>2]=c[q+8>>2];c[x+12>>2]=c[q+12>>2];c[x+16>>2]=c[q+16>>2];c[x+20>>2]=c[q+20>>2];q=(c[a+12>>2]|0)+(f*24|0)|0;c[q>>2]=c[w>>2];c[q+4>>2]=c[w+4>>2];c[q+8>>2]=c[w+8>>2];c[q+12>>2]=c[w+12>>2];c[q+16>>2]=c[w+16>>2];c[q+20>>2]=c[w+20>>2];f=f+-1|0;h=h+1|0}if((h|0)>(f|0))break;q=c[a+12>>2]|0}if((f|0)>(d|0))rf(a,b,d,f);if((h|0)>=(e|0)){l=w;return}rf(a,b,h,e);l=w;return}function sf(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;j=c[a+28>>2]|0;k=c[a+32>>2]|0;e=c[b+8>>2]|0;g[e>>2]=1.0;h=c[b+24>>2]|0;g[e+(h+1<<2)>>2]=1.0;g[e+((h<<1)+2<<2)>>2]=1.0;l=+g[a+300>>2];q=+g[a+304>>2];f=+g[a+308>>2];o=+g[j+4>>2]*l+ +g[j+8>>2]*q+ +g[j+12>>2]*f;m=l*+g[j+20>>2]+q*+g[j+24>>2]+f*+g[j+28>>2];f=l*+g[j+36>>2]+q*+g[j+40>>2]+f*+g[j+44>>2];e=c[b+12>>2]|0;c[e>>2]=0;g[e+4>>2]=f;g[e+8>>2]=-m;g[e+12>>2]=0.0;g[e+(h<<2)>>2]=-f;c[e+(h<<2)+4>>2]=0;g[e+(h<<2)+8>>2]=o;g[e+(h<<2)+12>>2]=0.0;g[e+(h<<1<<2)>>2]=m;g[e+(h<<1<<2)+4>>2]=-o;c[e+(h<<1<<2)+8>>2]=0;g[e+(h<<1<<2)+12>>2]=0.0;e=c[b+16>>2]|0;g[e>>2]=-1.0;g[e+(h+1<<2)>>2]=-1.0;g[e+((h<<1)+2<<2)>>2]=-1.0;q=+g[a+316>>2];l=+g[a+320>>2];d=+g[a+324>>2];p=+g[k+4>>2]*q+ +g[k+8>>2]*l+ +g[k+12>>2]*d;n=q*+g[k+20>>2]+l*+g[k+24>>2]+d*+g[k+28>>2];d=q*+g[k+36>>2]+l*+g[k+40>>2]+d*+g[k+44>>2];h=c[b+20>>2]|0;e=c[b+24>>2]|0;c[h>>2]=0;g[h+4>>2]=-d;g[h+8>>2]=n;g[h+12>>2]=0.0;g[h+(e<<2)>>2]=d;c[h+(e<<2)+4>>2]=0;g[h+(e<<2)+8>>2]=-p;g[h+(e<<2)+12>>2]=0.0;g[h+(e<<1<<2)>>2]=-n;g[h+(e<<1<<2)+4>>2]=p;c[h+(e<<1<<2)+8>>2]=0;g[h+(e<<1<<2)+12>>2]=0.0;h=c[a+332>>2]|0;l=+g[(h&1|0?a+336|0:b+4|0)>>2]*+g[b>>2];i=c[b+28>>2]|0;g[i>>2]=l*(p+ +g[k+52>>2]-o-+g[j+52>>2]);g[i+(e<<2)>>2]=l*(n+ +g[k+56>>2]-m-+g[j+56>>2]);g[i+(e<<1<<2)>>2]=l*(d+ +g[k+60>>2]-f-+g[j+60>>2]);if(h&2|0){k=c[b+32>>2]|0;c[k>>2]=c[a+340>>2];c[k+(e<<2)>>2]=c[a+340>>2];c[k+(e<<1<<2)>>2]=c[a+340>>2]}f=+g[a+356>>2];if(f>0.0){g[c[b+36>>2]>>2]=-f;g[c[b+40>>2]>>2]=f;d=+g[a+356>>2]}else d=f;if(d>0.0){g[(c[b+36>>2]|0)+(e<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<2)>>2]=f;d=+g[a+356>>2]}if(!(d>0.0)){j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}g[(c[b+36>>2]|0)+(e<<1<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<1<<2)>>2]=f;j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}function tf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;a[q+16>>0]=1;c[q+12>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;e=c[b+8>>2]|0;if((e|0)>0){o=0;i=0;h=0;g=0;f=0;while(1){m=c[b+16>>2]|0;n=m+(o<<4)|0;if((g|0)==(f|0)){j=f|0?f<<1:1;if((f|0)<(j|0)){if(j){c[6995]=(c[6995]|0)+1;e=sc((j<<4|3)+16|0)|0;if(!e){i=0;f=g}else{c[(e+4+15&-16)+-4>>2]=e;i=e+4+15&-16;f=g}}else i=0;if((f|0)>0){e=0;do{k=c[q+12>>2]|0;c[i+(e<<4)>>2]=c[k+(e<<4)>>2];c[i+(e<<4)+4>>2]=c[k+(e<<4)+4>>2];c[i+(e<<4)+8>>2]=c[k+(e<<4)+8>>2];c[i+(e<<4)+12>>2]=c[k+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[q+12>>2]|0;if(!e)g=f;else{c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0}c[q+12>>2]=i;k=j;h=j;j=g;f=i;e=c[b+8>>2]|0}else{k=f;j=f;f=i}}else{k=f;j=g;f=i}c[f+(j<<4)>>2]=c[n>>2];c[f+(j<<4)+4>>2]=c[m+(o<<4)+4>>2];c[f+(j<<4)+8>>2]=c[m+(o<<4)+8>>2];c[f+(j<<4)+12>>2]=c[m+(o<<4)+12>>2];g=j+1|0;o=o+1|0;if((o|0)>=(e|0))break;else{i=f;f=k}}c[q+4>>2]=g;a[q+16>>0]=1;c[q+8>>2]=h;if((j|0)>-1){f=c[q+12>>2]|0;e=0;while(1){Cb[c[(c[b>>2]|0)+12>>2]&31](b,c[f+(e<<4)>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;if((e|0)<(j|0))e=e+1|0;else break}}}else g=0;if((c[b+52>>2]|0)>0){f=c[b+60>>2]|0;e=0;do{c[f+(e<<2)>>2]=-1;e=e+1|0}while((e|0)<(c[b+52>>2]|0))}if((g|0)<=1)if((g|0)<=0){e=c[q+12>>2]|0;if(!e){l=q;return}}else p=23;else{te(q,0,g+-1|0);p=23}if((p|0)==23){e=c[q+12>>2]|0;f=0;do{Bb[c[(c[b>>2]|0)+8>>2]&63](b,c[e+(f<<4)>>2]|0,c[e+(f<<4)+4>>2]|0)|0;f=f+1|0}while((f|0)<(g|0))}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0;l=q;return}function uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;B=(a[b+68>>0]|0)!=0;C=B?e:d;B=B?d:e;z=c[b+52>>2]|0;if((z|0)<=0){x=1.0;return +x}A=(c[C+192>>2]|0)+28|0;j=+g[C+4>>2];u=+g[C+8>>2];v=+g[C+12>>2];w=c[C+16>>2]|0;x=+g[C+20>>2];k=+g[C+24>>2];l=+g[C+28>>2];e=c[C+32>>2]|0;m=+g[C+36>>2];n=+g[C+40>>2];o=+g[C+44>>2];p=c[C+48>>2]|0;q=+g[C+52>>2];r=+g[C+56>>2];s=+g[C+60>>2];t=c[C+64>>2]|0;i=1.0;d=0;y=c[C+304>>2]|0;do{E=c[A>>2]|0;P=+g[E+(d*80|0)>>2];O=+g[E+(d*80|0)+16>>2];N=+g[E+(d*80|0)+32>>2];M=+g[E+(d*80|0)+4>>2];L=+g[E+(d*80|0)+20>>2];K=+g[E+(d*80|0)+36>>2];J=+g[E+(d*80|0)+8>>2];I=+g[E+(d*80|0)+24>>2];H=+g[E+(d*80|0)+40>>2];G=+g[E+(d*80|0)+48>>2];F=+g[E+(d*80|0)+52>>2];D=+g[E+(d*80|0)+56>>2];c[C+304>>2]=y+1;g[C+4>>2]=j*P+u*O+v*N;g[C+8>>2]=j*M+u*L+v*K;g[C+12>>2]=j*J+u*I+v*H;g[C+16>>2]=0.0;g[C+20>>2]=x*P+k*O+l*N;g[C+24>>2]=x*M+k*L+l*K;g[C+28>>2]=x*J+k*I+l*H;g[C+32>>2]=0.0;g[C+36>>2]=m*P+n*O+o*N;g[C+40>>2]=m*M+n*L+o*K;g[C+44>>2]=m*J+n*I+o*H;g[C+48>>2]=0.0;g[C+52>>2]=q+(j*G+u*F+v*D);g[C+56>>2]=r+(x*G+k*F+l*D);g[C+60>>2]=s+(m*G+n*F+o*D);g[C+64>>2]=0.0;E=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;D=+tb[c[(c[E>>2]|0)+12>>2]&15](E,C,B,f,h);i=D>2]|0)+1|0;c[C+304>>2]=y;g[C+4>>2]=j;g[C+8>>2]=u;g[C+12>>2]=v;c[C+16>>2]=w;g[C+20>>2]=x;g[C+24>>2]=k;g[C+28>>2]=l;c[C+32>>2]=e;g[C+36>>2]=m;g[C+40>>2]=n;g[C+44>>2]=o;c[C+48>>2]=p;g[C+52>>2]=q;g[C+56>>2]=r;g[C+60>>2]=s;c[C+64>>2]=t;d=d+1|0}while((d|0)!=(z|0));return +i}function vf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=lt()|0;c[i+4>>2]=7;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4884;a[i+48>>0]=0;c[i+52>>2]=c[e>>2];c[i+52+4>>2]=c[e+4>>2];c[i+52+8>>2]=c[e+8>>2];c[i+52+12>>2]=c[e+12>>2];c[i+68>>2]=c[e+16>>2];c[i+68+4>>2]=c[e+16+4>>2];c[i+68+8>>2]=c[e+16+8>>2];c[i+68+12>>2]=c[e+16+12>>2];c[i+84>>2]=c[e+32>>2];c[i+84+4>>2]=c[e+32+4>>2];c[i+84+8>>2]=c[e+32+8>>2];c[i+84+12>>2]=c[e+32+12>>2];c[i+100>>2]=c[e+48>>2];c[i+100+4>>2]=c[e+48+4>>2];c[i+100+8>>2]=c[e+48+8>>2];c[i+100+12>>2]=c[e+48+12>>2];c[i+116>>2]=c[f>>2];c[i+116+4>>2]=c[f+4>>2];c[i+116+8>>2]=c[f+8>>2];c[i+116+12>>2]=c[f+12>>2];c[i+132>>2]=c[f+16>>2];c[i+132+4>>2]=c[f+16+4>>2];c[i+132+8>>2]=c[f+16+8>>2];c[i+132+12>>2]=c[f+16+12>>2];c[i+148>>2]=c[f+32>>2];c[i+148+4>>2]=c[f+32+4>>2];c[i+148+8>>2]=c[f+32+8>>2];c[i+148+12>>2]=c[f+32+12>>2];c[i+164>>2]=c[f+48>>2];c[i+164+4>>2]=c[f+48+4>>2];c[i+164+8>>2]=c[f+48+8>>2];c[i+164+12>>2]=c[f+48+12>>2];a[i+180>>0]=h&1;g[i+184>>2]=1.0;g[i+188>>2]=-1.0;g[i+192>>2]=0.0;g[i+196>>2]=0.0;g[i+200>>2]=1.0;g[i+204>>2]=.699999988079071;g[i+208>>2]=0.0;g[i+212>>2]=0.0;g[i+216>>2]=1.0;g[i+220>>2]=.699999988079071;g[i+224>>2]=0.0;g[i+228>>2]=0.0;g[i+264>>2]=1.0;g[i+268>>2]=.699999988079071;g[i+272>>2]=1.0;g[i+276>>2]=0.0;g[i+280>>2]=1.0;g[i+284>>2]=.699999988079071;g[i+288>>2]=1.0;g[i+292>>2]=0.0;g[i+232>>2]=1.0;g[i+236>>2]=.699999988079071;g[i+240>>2]=1.0;g[i+244>>2]=0.0;g[i+248>>2]=1.0;g[i+252>>2]=.699999988079071;g[i+256>>2]=1.0;g[i+260>>2]=0.0;a[i+1096>>0]=0;g[i+1116>>2]=0.0;g[i+1120>>2]=0.0;g[i+1124>>2]=0.0;c[i+300>>2]=0;c[i+1100>>2]=0;c[i+1100+4>>2]=0;c[i+1100+8>>2]=0;a[i+1100+12>>0]=0;a[i+49>>0]=1;Zc(i,(c[i+28>>2]|0)+4|0,(c[i+32>>2]|0)+4|0);return i|0}function wf(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+64|0;Tg(c[b+108>>2]|0,d,0);e=+g[d+204>>2]+ +g[d+212>>2];h=e*+g[d+56>>2]+ +g[d+40>>2];i=e*+g[d+60>>2]+ +g[d+44>>2];g[d+16>>2]=+g[d+52>>2]*e+ +g[d+36>>2];g[d+20>>2]=h;g[d+24>>2]=i;g[d+28>>2]=0.0;g[j+32>>2]=-1.0;k=c[b+92>>2]|0;k=Cb[c[(c[k>>2]|0)+8>>2]&31](k,d+36|0,d+16|0,j)|0;c[d+88>>2]=0;if(!k){c[d+32>>2]=c[d+204>>2];g[d+272>>2]=0.0;h=-+g[d+56>>2];i=-+g[d+60>>2];g[d>>2]=-+g[d+52>>2];g[d+4>>2]=h;g[d+8>>2]=i;g[d+12>>2]=0.0;i=-1.0;h=1.0;k=d+268|0;g[k>>2]=h;l=j;return +i}f=e*+g[j+32>>2];c[d>>2]=c[j+16>>2];c[d+4>>2]=c[j+16+4>>2];c[d+8>>2]=c[j+16+8>>2];c[d+12>>2]=c[j+16+12>>2];a[d+84>>0]=1;if((a[22488]|0)==0?Uz(22488)|0:0){c[j+40>>2]=0;c[j+40+4>>2]=0;c[j+40+8>>2]=0;c[j+40+12>>2]=0;ef(23848,0.0,0,0,j+40|0)}c[6013]=c[6013]|1;g[6063]=0.0;e=+g[6073]*0.0;h=+g[6074]*0.0;g[6068]=+g[6072]*0.0;g[6069]=e;g[6070]=h;g[6071]=0.0;c[6076]=0;c[6077]=0;c[6078]=0;c[6079]=0;h=+g[6065]*0.0;e=+g[6066]*0.0;g[6117]=+g[6064]*0.0;g[6118]=h;g[6119]=e;g[6120]=0.0;c[d+88>>2]=23848;e=f-+g[d+212>>2];g[d+32>>2]=e;h=+g[d+204>>2];i=+g[d+208>>2]*.009999999776482582;if(e>2]=h-i;e=h-i}if(e>h+i)g[d+32>>2]=h+i;c[d+16>>2]=c[j>>2];c[d+16+4>>2]=c[j+4>>2];c[d+16+8>>2]=c[j+8>>2];c[d+16+12>>2]=c[j+12>>2];s=+g[d>>2];r=+g[d+4>>2];o=+g[d+8>>2];h=s*+g[d+52>>2]+r*+g[d+56>>2]+o*+g[d+60>>2];k=c[b+108>>2]|0;e=+g[d+16>>2]-+g[k+52>>2];n=+g[d+20>>2]-+g[k+56>>2];p=+g[d+24>>2]-+g[k+60>>2];i=+g[k+392>>2];q=+g[k+396>>2];m=+g[k+388>>2];g[d+272>>2]=!(h>=-.10000000149011612)?-1.0/h*(s*(i*p-n*q+ +g[k+372>>2])+r*(+g[k+376>>2]+(e*q-p*m))+o*(n*m-e*i+ +g[k+380>>2])):0.0;i=f;h=!(h>=-.10000000149011612)?-1.0/h:10.0;k=d+268|0;g[k>>2]=h;l=j;return +i}function xf(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+64|0;e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+4|0,o+48|0,o+32|0);h=+g[o+48>>2]+-.019999999552965164;g[o+48>>2]=h;i=+g[o+48+4>>2]+-.019999999552965164;g[o+48+4>>2]=i;j=+g[o+48+8>>2]+-.019999999552965164;g[o+48+8>>2]=j;f=+g[o+32>>2]+.019999999552965164;g[o+32>>2]=f;k=+g[o+32+4>>2]+.019999999552965164;g[o+32+4>>2]=k;m=+g[o+32+8>>2]+.019999999552965164;g[o+32+8>>2]=m;if(((a[b+44>>0]|0)!=0?(c[d+252>>2]|0)==2:0)?(c[d+204>>2]&3|0)==0:0){e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+68|0,o+16|0,o);h=+g[o+16>>2]+-.019999999552965164;g[o+16>>2]=h;j=+g[o+16+4>>2]+-.019999999552965164;g[o+16+4>>2]=j;k=+g[o+16+8>>2]+-.019999999552965164;g[o+16+8>>2]=k;f=+g[o>>2]+.019999999552965164;g[o>>2]=f;m=+g[o+4>>2]+.019999999552965164;g[o+4>>2]=m;n=+g[o+8>>2]+.019999999552965164;g[o+8>>2]=n;i=+g[o+48>>2];if(h>2]=h;else h=i;i=+g[o+48+4>>2];if(j>2]=j;i=j}j=+g[o+48+8>>2];if(k>2]=k;j=k}k=+g[o+16+12>>2];if(k<+g[o+48+12>>2])g[o+48+12>>2]=k;k=+g[o+32>>2];if(k>2]=f;else f=k;k=+g[o+32+4>>2];if(k>2]=m;k=m}m=+g[o+32+8>>2];if(m>2]=n;m=n}n=+g[o+12>>2];if(+g[o+32+12>>2]>2]=n}e=c[b+68>>2]|0;if((c[d+204>>2]&1|0)==0?(h=f-h,k=k-i,n=m-j,!(h*h+k*k+n*n<999999995904.0)):0){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=5;if(!(a[14696]|0)){l=o;return}e=c[b+72>>2]|0;if(!e){l=o;return}a[14696]=0;Ob[c[(c[e>>2]|0)+44>>2]&127](e,14697);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14746);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14814);b=c[b+72>>2]|0;Ob[c[(c[b>>2]|0)+44>>2]&127](b,14879);l=o;return}Zb[c[(c[e>>2]|0)+16>>2]&31](e,c[d+188>>2]|0,o+48|0,o+32|0,c[b+24>>2]|0);l=o;return}function yf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;b=l;l=l+608|0;p=+g[d+116>>2]-+g[d+52>>2];o=+g[d+120>>2]-+g[d+56>>2];n=+g[d+124>>2]-+g[d+60>>2];i=+g[e+116>>2]-+g[e+52>>2];j=+g[e+120>>2]-+g[e+56>>2];k=+g[e+124>>2]-+g[e+60>>2];m=+g[d+276>>2];if(p*p+o*o+n*n>2],i*i+j*j+k*k>2]|0;f=c[e+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;q=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[b+552+32>>2]=f;c[b+552+48>>2]=f;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=h;c[b+12>>2]=b+552;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){i=+g[b+376+164>>2];if(+g[d+268>>2]>i)g[d+268>>2]=i;if(+g[e+268>>2]>i)g[e+268>>2]=i;if(!(i<1.0))i=1.0}else i=1.0;q=c[e+192>>2]|0;h=c[d+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;f=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[b+552+32>>2]=h;c[b+552+48>>2]=h;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=b+552;c[b+12>>2]=q;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){j=+g[b+376+164>>2];if(+g[d+268>>2]>j)g[d+268>>2]=j;if(+g[e+268>>2]>j)g[e+268>>2]=j;if(i>j)i=j}p=i;l=b;return +p}function zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Us(480)|0;Vd(i,b,d,e);c[i>>2]=4080;a[i+360>>0]=1;c[i+356>>2]=0;c[i+348>>2]=0;c[i+352>>2]=0;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;g[i+384>>2]=1.0e3;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+388+16>>2]=0;c[i+388+20>>2]=0;c[i+388+24>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;a[i+444>>0]=1;c[i+440>>2]=0;c[i+432>>2]=0;c[i+436>>2]=0;c[i+472>>2]=h;a[i+476>>0]=0;if(!h){c[6995]=(c[6995]|0)+1;f=sc(59)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}g[f+12>>2]=1.0;c[f+8>>2]=0;c[f+4>>2]=5;c[f>>2]=3172;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+16>>0]=1;c[i+472>>2]=f;a[i+476>>0]=1}c[i+364>>2]=4302;a[i+368>>0]=1;a[i+369>>0]=0;a[i+370>>0]=0;c[i+404>>2]=d;c[i+408>>2]=b;Bi(i+428|0);h=c[i+432>>2]|0;if((h|0)>0)e=0;else{d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}do{d=(c[i+440>>2]|0)+(e<<2)|0;f=c[d>>2]|0;c[d>>2]=0;if(f|0)do{d=f;f=c[f+280>>2]|0;cJ(d)}while((f|0)!=0);e=e+1|0}while((e|0)!=(h|0));d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}function Af(a,b,d,e,f,h,i){a=a|0;b=+b;d=+d;e=+e;f=f|0;h=+h;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0;s=l;l=l+16|0;j=d*h+ +g[a+52>>2];d=e*h+ +g[a+56>>2];g[i+48>>2]=b*h+ +g[a+48>>2];g[i+52>>2]=j;g[i+56>>2]=d;g[i+60>>2]=0.0;d=+g[f>>2];j=+g[f+4>>2];k=+g[f+8>>2];if(d*d+j*j+k*k>1.1920928955078125e-07)b=+D(+(d*d+j*j+k*k));else b=0.0;e=b*h>.7853981852531433?.7853981852531433/h:b;if(e<1.0000000474974513e-03)b=h*.5-e*h*h*h*.02083333395421505*e;else b=+G(+(e*.5*h))/e;r=b*d;q=b*j;p=b*k;d=+F(+(e*h*.5));yh(a,s);e=+g[s>>2];j=+g[s+12>>2];k=+g[s+8>>2];h=+g[s+4>>2];b=(d*j-r*e-q*h-p*k)*(d*j-r*e-q*h-p*k)+((p*j+d*k+r*h-q*e)*(p*j+d*k+r*h-q*e)+((d*e+r*j+q*k-p*h)*(d*e+r*j+q*k-p*h)+(p*e+(q*j+d*h)-r*k)*(p*e+(q*j+d*h)-r*k)));if(b>1.1920928955078125e-07){b=1.0/+D(+b);m=(d*e+r*j+q*k-p*h)*b;n=(p*j+d*k+r*h-q*e)*b;o=(d*j-r*e-q*h-p*k)*b;b=(p*e+(q*j+d*h)-r*k)*b}else{m=d*e+r*j+q*k-p*h;n=p*j+d*k+r*h-q*e;o=d*j-r*e-q*h-p*k;b=p*e+(q*j+d*h)-r*k}d=o*o+(n*n+(b*b+m*m));if(d>1.1920928955078125e-07){q=m*(2.0/d);r=b*(2.0/d);e=n*(2.0/d);p=o*q;h=o*r;k=o*e;q=m*q;j=m*r;m=m*e;r=b*r;o=b*e;n=n*e;g[i>>2]=1.0-(r+n);g[i+4>>2]=j-k;g[i+8>>2]=m+h;g[i+12>>2]=0.0;g[i+16>>2]=j+k;g[i+20>>2]=1.0-(q+n);g[i+24>>2]=o-p;g[i+28>>2]=0.0;g[i+32>>2]=m-h;g[i+36>>2]=o+p;g[i+40>>2]=1.0-(q+r);g[i+44>>2]=0.0;l=s;return}else{c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[i+16>>2]=c[a+16>>2];c[i+16+4>>2]=c[a+16+4>>2];c[i+16+8>>2]=c[a+16+8>>2];c[i+16+12>>2]=c[a+16+12>>2];c[i+32>>2]=c[a+32>>2];c[i+32+4>>2]=c[a+32+4>>2];c[i+32+8>>2]=c[a+32+8>>2];c[i+32+12>>2]=c[a+32+12>>2];l=s;return}}function Bf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0;x=l;l=l+256|0;if(!a){l=x;return}p=+g[b>>2];q=+g[b+4>>2];r=+g[b+8>>2];s=+g[b+16>>2];t=+g[b+20>>2];o=+g[b+24>>2];c[x>>2]=a;a=64;n=1;e=x;b=0;while(1){m=n+-1|0;j=c[e+(m<<2)>>2]|0;do if(((((+g[j>>2]<=s?+g[j+16>>2]>=p:0)?+g[j+4>>2]<=t:0)?+g[j+20>>2]>=q:0)?+g[j+8>>2]<=o:0)?+g[j+24>>2]>=r:0){if(!(c[j+40>>2]|0)){Ob[c[(c[d>>2]|0)+12>>2]&127](d,j);f=m;break}i=c[j+36>>2]|0;do if((m|0)==(a|0)?(u=a|0?a<<1:1,(n|0)<=(u|0)):0){if((u|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((u<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;h=v+4+15&-16}else h=0;if((n|0)>1){f=0;do{c[h+(f<<2)>>2]=c[e+(f<<2)>>2];f=f+1|0}while((f|0)!=(a|0));if(!(b<<24>>24)){a=u;k=1;break}}else if((e|0)==0|b<<24>>24==0){a=u;k=1;break}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);a=u;k=1}else{h=e;k=b}while(0);c[h+(m<<2)>>2]=i;f=c[j+40>>2]|0;do if((n|0)==(a|0)){a=n|0?n<<1:1;if((n|0)<(a|0)){if((a|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((a<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;e=w+4+15&-16}else e=0;if((n|0)>0){b=0;do{c[e+(b<<2)>>2]=c[h+(b<<2)>>2];b=b+1|0}while((b|0)!=(n|0));if(!(k<<24>>24)){b=1;break}}else if((h|0)==0|k<<24>>24==0){b=1;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);b=1}else{a=n;e=h;b=k}}else{e=h;b=k}while(0);c[e+(n<<2)>>2]=f;f=n+1|0}else f=m;while(0);if((f|0)>0)n=f;else break}if((e|0)==0|b<<24>>24==0){l=x;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=x;return}function Cf(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];c[b+276>>2]=c[a+1316>>2];c[b+324>>2]=c[a+1364>>2];c[b+252>>2]=d[a+1309>>0];c[b+300>>2]=c[a+1340>>2];c[b+280>>2]=c[a+1320>>2];c[b+328>>2]=c[a+1368>>2];c[b+256>>2]=d[a+1310>>0];c[b+304>>2]=c[a+1344>>2];c[b+284>>2]=c[a+1324>>2];c[b+332>>2]=c[a+1372>>2];c[b+260>>2]=d[a+1311>>0];c[b+308>>2]=c[a+1348>>2];c[b+288>>2]=c[a+1328>>2];c[b+336>>2]=c[a+1376>>2];c[b+264>>2]=d[a+1312>>0];c[b+312>>2]=c[a+1352>>2];c[b+292>>2]=c[a+1332>>2];c[b+340>>2]=c[a+1380>>2];c[b+268>>2]=d[a+1313>>0];c[b+316>>2]=c[a+1356>>2];c[b+296>>2]=c[a+1336>>2];c[b+344>>2]=c[a+1384>>2];c[b+272>>2]=d[a+1314>>0];c[b+320>>2]=c[a+1360>>2];return 12447}function Df(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=c[b+220>>2]|0;Sb[c[(c[k>>2]|0)+8>>2]&127](k,b,c[b+24>>2]|0);k=c[b+324>>2]|0;if((k|0)>0){j=c[b+332>>2]|0;i=0;do{e=c[j+(i<<2)>>2]|0;d=c[e+772>>2]|0;e=c[e+776>>2]|0;if((d|0?(e|0?(c[d+204>>2]&3|0)==0:0):0)?(c[e+204>>2]&3|0)==0:0){g=c[d+208>>2]|0;d=c[e+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(g<<3)>>2]|0;if((e|0)!=(g|0)){f=h+(g<<3)|0;do{g=h+(e<<3)|0;c[f>>2]=c[g>>2];g=c[g>>2]|0;f=h+(g<<3)|0;e=c[f>>2]|0}while((g|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){f=h+(d<<3)|0;do{d=h+(e<<3)|0;c[f>>2]=c[d>>2];d=c[d>>2]|0;f=h+(d<<3)|0;e=c[f>>2]|0}while((d|0)!=(e|0))}if((g|0)!=(d|0)){c[h+(g<<3)>>2]=d;f=h+(d<<3)+4|0;c[f>>2]=(c[f>>2]|0)+(c[h+(g<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0))}k=c[b+228>>2]|0;if((k|0)<=0){m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}j=c[b+236>>2]|0;i=0;do{d=c[j+(i<<2)>>2]|0;if((a[d+20>>0]|0?(l=c[d+28>>2]|0,(c[l+204>>2]&3|0)==0):0)?(m=c[d+32>>2]|0,(c[m+204>>2]&3|0)==0):0){f=c[l+208>>2]|0;d=c[m+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(f<<3)>>2]|0;if((e|0)!=(f|0)){g=h+(f<<3)|0;do{f=h+(e<<3)|0;c[g>>2]=c[f>>2];f=c[f>>2]|0;g=h+(f<<3)|0;e=c[g>>2]|0}while((f|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){g=h+(d<<3)|0;do{d=h+(e<<3)|0;c[g>>2]=c[d>>2];d=c[d>>2]|0;g=h+(d<<3)|0;e=c[g>>2]|0}while((d|0)!=(e|0))}if((f|0)!=(d|0)){c[h+(f<<3)>>2]=d;g=h+(d<<3)+4|0;c[g>>2]=(c[g>>2]|0)+(c[h+(f<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0));m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}function Ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6157]=(c[6157]|0)+1;k=(c[b+12>>2]|0)>(c[d+12>>2]|0);n=k?d:b;h=c[n+12>>2]|0;k=k?b:d;f=c[k+12>>2]|0;j=(((f<<16|h)+~((f<<16|h)<<15)|0)>>>10^(f<<16|h)+~((f<<16|h)<<15))*9|0;j=(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11))&(c[a+12>>2]|0)+-1;b=c[(c[a+40>>2]|0)+(j<<2)>>2]|0;if((b|0)==-1){a=0;return a|0}g=c[a+16>>2]|0;d=b;while(1){if((c[(c[g+(d<<4)>>2]|0)+12>>2]|0)==(h|0)?(c[(c[g+(d<<4)+4>>2]|0)+12>>2]|0)==(f|0):0)break;b=c[(c[a+60>>2]|0)+(d<<2)>>2]|0;if((b|0)==-1){b=0;i=22;break}else d=b}if((i|0)==22)return b|0;b=g+(d<<4)|0;if(!b){a=0;return a|0}Sb[c[(c[a>>2]|0)+32>>2]&127](a,b,e);m=c[g+(d<<4)+12>>2]|0;l=b-(c[a+16>>2]|0)>>4;d=j;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(l|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(j<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(l<<2)>>2];i=(c[a+8>>2]|0)+-1|0;b=c[a+68>>2]|0;if(b|0)Cb[c[(c[b>>2]|0)+12>>2]&31](b,n,k,e)|0;if((i|0)==(l|0)){c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}h=c[a+16>>2]|0;g=c[(c[h+(i<<4)+4>>2]|0)+12>>2]<<16|c[(c[h+(i<<4)>>2]|0)+12>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;d=g;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(i|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(g<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(i<<2)>>2];c[h+(l<<4)>>2]=c[h+(i<<4)>>2];c[h+(l<<4)+4>>2]=c[h+(i<<4)+4>>2];c[h+(l<<4)+8>>2]=c[h+(i<<4)+8>>2];c[h+(l<<4)+12>>2]=c[h+(i<<4)+12>>2];e=(c[a+40>>2]|0)+(g<<2)|0;c[(c[a+60>>2]|0)+(l<<2)>>2]=c[e>>2];c[e>>2]=l;c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}function Ff(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0;f=l;l=l+784|0;c[f+720>>2]=1065353216;c[f+720+4>>2]=0;c[f+720+4+4>>2]=0;c[f+720+4+8>>2]=0;c[f+720+4+12>>2]=0;c[f+720+20>>2]=1065353216;c[f+720+24>>2]=0;c[f+720+24+4>>2]=0;c[f+720+24+8>>2]=0;c[f+720+24+12>>2]=0;c[f+720+40>>2]=1065353216;e=f+720+44|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[f+544>>2]=3896;c[f+544+168>>2]=0;g[f+544+172>>2]=0.0;c[f+544+164>>2]=c[b+200>>2];e=c[b+196>>2]|0;c[f+488+8>>2]=0;c[f+488+12>>2]=-1;i=f+488+28|0;c[f+488>>2]=7020;c[f+488+4>>2]=8;c[f+488+16>>2]=1065353216;c[f+488+20>>2]=1065353216;c[f+488+24>>2]=1065353216;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[i+16>>2]=0;c[f+488+32>>2]=e;c[f+488+48>>2]=e;g[f+488+52>>2]=0.0;c[f+376+8>>2]=0;c[f+376+12>>2]=-1;c[f+376+16>>2]=1065353216;c[f+376+20>>2]=1065353216;c[f+376+24>>2]=1065353216;g[f+376+28>>2]=0.0;g[f+376+48>>2]=.03999999910593033;c[f+376+56>>2]=0;c[f+376>>2]=3924;c[f+376+4>>2]=1;c[f+376+60>>2]=c[d>>2];c[f+376+60+4>>2]=c[d+4>>2];c[f+376+60+8>>2]=c[d+8>>2];c[f+376+60+12>>2]=c[d+12>>2];c[f+376+76>>2]=c[d+16>>2];c[f+376+76+4>>2]=c[d+16+4>>2];c[f+376+76+8>>2]=c[d+16+8>>2];c[f+376+76+12>>2]=c[d+16+12>>2];c[f+376+92>>2]=c[d+32>>2];c[f+376+92+4>>2]=c[d+32+4>>2];c[f+376+92+8>>2]=c[d+32+8>>2];c[f+376+92+12>>2]=c[d+32+12>>2];g[f+16+308>>2]=9.999999747378752e-05;a[f+16+332>>0]=0;c[f>>2]=5276;c[f+4>>2]=f+16;c[f+8>>2]=f+488;c[f+12>>2]=f+376;if(fd(f,b+4|0,b+68|0,f+720|0,f+720|0,f+544|0)|0?(h=+g[f+544+164>>2],+g[b+200>>2]>h):0)g[b+200>>2]=h;c[f+376>>2]=7472;e=c[f+376+56>>2]|0;if(!e){l=f;return}Ib[c[c[e>>2]>>2]&511](e);e=c[f+376+56>>2]|0;if(!e){l=f;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=f;return}function Gf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=c[b+4>>2]|0;if((i|0)==(c[b+8>>2]|0)?(h=i|0?i<<1:1,(i|0)<(h|0)):0){if(!h){e=0;g=i}else{c[6995]=(c[6995]|0)+1;e=sc((h*244|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=c[b+4>>2]|0}if((g|0)>0){f=0;do{k=e+(f*244|0)|0;j=c[b+12>>2]|0;l=j+(f*244|0)|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=j+(f*244|0)+16|0;l=e+(f*244|0)+16|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];l=j+(f*244|0)+32|0;k=e+(f*244|0)+32|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=e+(f*244|0)+48|0;l=j+(f*244|0)+48|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];gi(e+(f*244|0)+64|0,j+(f*244|0)+64|0,180)|0;f=f+1|0}while((f|0)!=(g|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=h;e=c[b+4>>2]|0}else e=i;c[b+4>>2]=e+1;l=c[b+12>>2]|0;c[l+(i*244|0)>>2]=c[d>>2];c[l+(i*244|0)+4>>2]=c[d+4>>2];c[l+(i*244|0)+8>>2]=c[d+8>>2];c[l+(i*244|0)+12>>2]=c[d+12>>2];c[l+(i*244|0)+16>>2]=c[d+16>>2];c[l+(i*244|0)+16+4>>2]=c[d+16+4>>2];c[l+(i*244|0)+16+8>>2]=c[d+16+8>>2];c[l+(i*244|0)+16+12>>2]=c[d+16+12>>2];c[l+(i*244|0)+32>>2]=c[d+32>>2];c[l+(i*244|0)+32+4>>2]=c[d+32+4>>2];c[l+(i*244|0)+32+8>>2]=c[d+32+8>>2];c[l+(i*244|0)+32+12>>2]=c[d+32+12>>2];c[l+(i*244|0)+48>>2]=c[d+48>>2];c[l+(i*244|0)+48+4>>2]=c[d+48+4>>2];c[l+(i*244|0)+48+8>>2]=c[d+48+8>>2];c[l+(i*244|0)+48+12>>2]=c[d+48+12>>2];gi(l+(i*244|0)+64|0,d+64|0,180)|0;return (c[b+12>>2]|0)+(i*244|0)|0}function Hf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0;fi(a,b,e)|0;c[b+52>>2]=c[a+552>>2];c[b+56>>2]=c[a+556>>2];c[b+60>>2]=c[a+560>>2];c[b+64>>2]=c[a+564>>2];c[b+68>>2]=c[a+568>>2];c[b+72>>2]=c[a+572>>2];c[b+76>>2]=c[a+576>>2];c[b+80>>2]=c[a+580>>2];c[b+84>>2]=c[a+584>>2];c[b+88>>2]=c[a+588>>2];c[b+92>>2]=c[a+592>>2];c[b+96>>2]=c[a+596>>2];c[b+100>>2]=c[a+600>>2];c[b+104>>2]=c[a+604>>2];c[b+108>>2]=c[a+608>>2];c[b+112>>2]=c[a+612>>2];c[b+116>>2]=c[a+616>>2];c[b+120>>2]=c[a+620>>2];c[b+124>>2]=c[a+624>>2];c[b+128>>2]=c[a+628>>2];c[b+132>>2]=c[a+632>>2];c[b+136>>2]=c[a+636>>2];c[b+140>>2]=c[a+640>>2];c[b+144>>2]=c[a+644>>2];c[b+148>>2]=c[a+648>>2];c[b+152>>2]=c[a+652>>2];c[b+156>>2]=c[a+656>>2];c[b+160>>2]=c[a+660>>2];c[b+164>>2]=c[a+664>>2];c[b+168>>2]=c[a+668>>2];c[b+172>>2]=c[a+672>>2];c[b+176>>2]=c[a+676>>2];c[b+184>>2]=d[a+736>>0];c[b+188>>2]=d[a+737>>0];c[b+196>>2]=c[a+684>>2];c[b+192>>2]=c[a+680>>2];c[b+180>>2]=d[a+740>>0];h=+g[a+688>>2];i=+g[a+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;g[b+200>>2]=f;f=+mh(h+i,6.2831854820251465);if(f<-3.1415927410125732){i=f+6.2831854820251465;e=b+204|0;g[e>>2]=i;e=a+696|0;e=c[e>>2]|0;j=b+208|0;c[j>>2]=e;j=a+700|0;j=c[j>>2]|0;e=b+212|0;c[e>>2]=j;a=a+704|0;a=c[a>>2]|0;b=b+216|0;c[b>>2]=a;return 12693}if(!(f>3.1415927410125732)){i=f;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}i=f+-6.2831854820251465;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}function If(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;k=l;l=l+64|0;n=+g[a+20>>2];u=+g[a+40>>2];p=+g[a+24>>2];s=+g[a+36>>2];t=+g[a+32>>2];m=+g[a+16>>2];j=+g[a>>2];i=+g[a+4>>2];q=+g[a+8>>2];h=1.0/((n*u-p*s)*j+i*(p*t-u*m)+(s*m-n*t)*q);z=+g[b>>2];y=+g[b+4>>2];A=+g[b+8>>2];x=+g[b+16>>2];w=+g[b+20>>2];v=+g[b+24>>2];r=+g[b+32>>2];o=+g[b+36>>2];f=+g[b+40>>2];g[k+16>>2]=A*(s*m-n*t)*h+(z*(n*u-p*s)*h+y*(p*t-u*m)*h);g[k+16+4>>2]=A*(t*i-s*j)*h+(z*(s*q-u*i)*h+y*(u*j-t*q)*h);g[k+16+8>>2]=A*(n*j-m*i)*h+(z*(p*i-n*q)*h+y*(m*q-p*j)*h);g[k+16+12>>2]=0.0;g[k+16+16>>2]=(n*u-p*s)*h*x+(p*t-u*m)*h*w+(s*m-n*t)*h*v;g[k+16+20>>2]=(s*q-u*i)*h*x+(u*j-t*q)*h*w+(t*i-s*j)*h*v;g[k+16+24>>2]=(p*i-n*q)*h*x+(m*q-p*j)*h*w+(n*j-m*i)*h*v;g[k+16+28>>2]=0.0;g[k+16+32>>2]=(n*u-p*s)*h*r+(p*t-u*m)*h*o+(s*m-n*t)*h*f;g[k+16+36>>2]=(s*q-u*i)*h*r+(u*j-t*q)*h*o+(t*i-s*j)*h*f;g[k+16+40>>2]=(p*i-n*q)*h*r+(m*q-p*j)*h*o+(n*j-m*i)*h*f;g[k+16+44>>2]=0.0;yh(k+16|0,k);f=+g[k>>2];h=+g[k+4>>2];i=+g[k+8>>2];m=+g[k+12>>2];j=1.0/+D(+(f*f+h*h+i*i+m*m));g[k>>2]=f*j;g[k+4>>2]=h*j;g[k+8>>2]=i*j;g[k+12>>2]=m*j;m=m*j<-1.0?-1.0:m*j;g[e>>2]=+I(+(m>1.0?1.0:m))*2.0;g[d>>2]=f*j;g[d+4>>2]=h*j;g[d+8>>2]=i*j;g[d+12>>2]=0.0;if(f*j*f*j+h*j*h*j+i*j*i*j<1.4210854715202004e-14){c[d>>2]=1065353216;c[d+4>>2]=0;c[d+8>>2]=0;g[d+12>>2]=0.0;l=k;return}else{A=1.0/+D(+(f*j*f*j+h*j*h*j+i*j*i*j));g[d>>2]=f*j*A;g[d+4>>2]=A*h*j;g[d+8>>2]=A*i*j;l=k;return}}function Jf(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0;v=c[a+892>>2]|0;if((v|0)<=0)return;q=c[a+900>>2]|0;a=0;do{u=c[q+(a*56|0)>>2]|0;j=c[q+(a*56|0)+4>>2]|0;y=c[j+8>>2]|0;x=c[j+12>>2]|0;w=c[j+16>>2]|0;f=q+(a*56|0)+8|0;s=+g[f>>2];h=q+(a*56|0)+12|0;r=+g[h>>2];i=q+(a*56|0)+16|0;p=+g[i>>2];b=+g[y+8>>2]*s+ +g[x+8>>2]*r+ +g[w+8>>2]*p;d=+g[y+12>>2]*s+ +g[x+12>>2]*r+ +g[w+12>>2]*p;e=+g[y+16>>2]*s+ +g[x+16>>2]*r+ +g[w+16>>2]*p;k=+g[u+8>>2];l=+g[u+12>>2];m=+g[u+16>>2];n=k-+g[u+24>>2]-(b-(s*+g[y+24>>2]+r*+g[x+24>>2]+p*+g[w+24>>2]));o=l-+g[u+28>>2]-(d-(s*+g[y+28>>2]+r*+g[x+28>>2]+p*+g[w+28>>2]));p=m-+g[u+32>>2]-(e-(s*+g[y+32>>2]+r*+g[x+32>>2]+p*+g[w+32>>2]));r=+g[q+(a*56|0)+24>>2];s=+g[q+(a*56|0)+28>>2];t=+g[q+(a*56|0)+32>>2];if(n*r+o*s+p*t<0.0){e=+g[q+(a*56|0)+40>>2]-(k*r+l*s+m*t-(b*r+d*s+e*t));b=r*e+0.0;d=s*e+0.0;e=t*e+0.0}else{b=0.0;d=0.0;e=0.0}z=+g[q+(a*56|0)+44>>2];b=b-z*(n-r*(n*r+o*s+p*t));d=d-z*(o-s*(n*r+o*s+p*t));s=e-z*(p-t*(n*r+o*s+p*t));t=+g[q+(a*56|0)+48>>2];g[u+8>>2]=k+t*b;g[u+12>>2]=l+t*d;g[u+16>>2]=t*s+m;y=q+(a*56|0)+52|0;t=+g[y>>2]*+g[f>>2];x=c[j+8>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[h>>2];x=c[j+12>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[i>>2];y=c[j+16>>2]|0;g[y+8>>2]=+g[y+8>>2]-b*t;g[y+12>>2]=+g[y+12>>2]-d*t;g[y+16>>2]=+g[y+16>>2]-s*t;a=a+1|0}while((a|0)!=(v|0));return}function Kf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+32>>2]|0;if((l|0)>=(k|0))return;if((c[b+36>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+32>>2]|0}g=c[b+40>>2]|0;if((f|0)<=0)if(!g)e=b+44|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+44>>0]|0))e=b+44|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+44|0}a[e>>0]=1;c[b+40>>2]=d;c[b+36>>2]=k;i=b+40|0}else{i=b+40|0;d=c[b+40>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+32>>2]=k;h=c[b+52>>2]|0;if((h|0)<(k|0)){if((c[b+56>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}g=c[b+60>>2]|0;if((f|0)<=0)if(!g)e=b+64|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+64>>0]|0))e=b+64|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+64|0}a[e>>0]=1;c[b+60>>2]=d;c[b+56>>2]=k}else d=c[b+60>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+52>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+60>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+60>>2]|0;d=0;do{k=c[(c[g+(d<<4)+4>>2]|0)+12>>2]<<16|c[(c[g+(d<<4)>>2]|0)+12>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Lf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=4276;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?1000000015047466219876688.0e6:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?1000000015047466219876688.0e6:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?1000000015047466219876688.0e6:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Mf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+20>>2]=c[a+76>>2];e=c[a+20>>2]|0;c[b+16>>2]=e;c[b+12>>2]=0;if(!e)return 16280;g=Bb[c[(c[d>>2]|0)+16>>2]&63](d,76,e)|0;e=c[g+8>>2]|0;c[b+12>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;if((c[b+16>>2]|0)>0){f=0;while(1){h=c[a+28>>2]|0;c[e+72>>2]=c[h+(f*80|0)+72>>2];c[e+64>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[h+(f*80|0)+64>>2]|0)|0;if(!(zb[c[(c[d>>2]|0)+24>>2]&31](d,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)|0)){h=c[(c[d>>2]|0)+16>>2]|0;i=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;i=xb[c[(c[i>>2]|0)+52>>2]&127](i)|0;i=Bb[h&63](d,i,1)|0;h=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;h=Bb[c[(c[h>>2]|0)+56>>2]&63](h,c[i+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,i,h,1346455635,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)}i=c[a+28>>2]|0;c[e+68>>2]=c[i+(f*80|0)+68>>2];c[e>>2]=c[i+(f*80|0)>>2];c[e+4>>2]=c[i+(f*80|0)+4>>2];c[e+8>>2]=c[i+(f*80|0)+8>>2];c[e+12>>2]=c[i+(f*80|0)+12>>2];c[e+16>>2]=c[i+(f*80|0)+16>>2];c[e+20>>2]=c[i+(f*80|0)+20>>2];c[e+24>>2]=c[i+(f*80|0)+24>>2];c[e+28>>2]=c[i+(f*80|0)+28>>2];c[e+32>>2]=c[i+(f*80|0)+32>>2];c[e+36>>2]=c[i+(f*80|0)+36>>2];c[e+40>>2]=c[i+(f*80|0)+40>>2];c[e+44>>2]=c[i+(f*80|0)+44>>2];c[e+48>>2]=c[i+(f*80|0)+48>>2];c[e+52>>2]=c[i+(f*80|0)+52>>2];c[e+56>>2]=c[i+(f*80|0)+56>>2];c[e+60>>2]=c[i+(f*80|0)+60>>2];f=f+1|0;if((f|0)>=(c[b+16>>2]|0)){e=d;break}else e=e+76|0}}else e=d;Zb[c[(c[e>>2]|0)+20>>2]&31](d,g,16255,1497453121,c[g+8>>2]|0);return 16280}function Nf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+28>>2]|0;if((l|0)>=(k|0))return;if((c[b+32>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+28>>2]|0}g=c[b+36>>2]|0;if((f|0)<=0)if(!g)e=b+40|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+40>>0]|0))e=b+40|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+40|0}a[e>>0]=1;c[b+36>>2]=d;c[b+32>>2]=k;i=b+36|0}else{i=b+36|0;d=c[b+36>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+28>>2]=k;h=c[b+48>>2]|0;if((h|0)<(k|0)){if((c[b+52>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+48>>2]|0}g=c[b+56>>2]|0;if((f|0)<=0)if(!g)e=b+60|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=d;c[b+52>>2]=k}else d=c[b+56>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+48>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+56>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+56>>2]|0;d=0;do{k=c[g+(d*12|0)+4>>2]<<16|c[g+(d*12|0)>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Of(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((c[b+8>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d*36|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;r=e+4+15&-16}else r=0;n=c[b+4>>2]|0;if((n|0)>0){m=0;do{o=c[b+12>>2]|0;i=r+(m*36|0)+16|0;a[i>>0]=1;j=r+(m*36|0)+12|0;c[j>>2]=0;l=r+(m*36|0)+4|0;c[l>>2]=0;k=r+(m*36|0)+8|0;c[k>>2]=0;p=c[o+(m*36|0)+4>>2]|0;if((p|0)>0){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}g=c[l>>2]|0;h=c[j>>2]|0;if((g|0)<=0){if(h|0)q=13}else{e=0;do{c[f+(e<<2)>>2]=c[h+(e<<2)>>2];e=e+1|0}while((e|0)!=(g|0));q=13}if((q|0)==13?(q=0,a[i>>0]|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[i>>0]=1;c[j>>2]=f;c[k>>2]=p;Yk(f|0,0,p<<2|0)|0;g=c[j>>2]|0;c[l>>2]=p;f=c[o+(m*36|0)+12>>2]|0;e=0;do{c[g+(e<<2)>>2]=c[f+(e<<2)>>2];e=e+1|0}while((e|0)!=(p|0))}else c[l>>2]=p;p=r+(m*36|0)+20|0;o=o+(m*36|0)+20|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];m=m+1|0}while((m|0)!=(n|0));f=c[b+4>>2]|0;if((f|0)>0){e=0;do{h=c[b+12>>2]|0;i=h+(e*36|0)+4|0;j=h+(e*36|0)+12|0;k=c[j>>2]|0;g=h+(e*36|0)+16|0;if(k|0){if(a[g>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[g>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(e*36|0)+8>>2]=0;e=e+1|0}while((e|0)!=(f|0))}}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=r;c[b+8>>2]=d;return}function Pf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=6004;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?999999984306749440.0:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?999999984306749440.0:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?999999984306749440.0:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Qf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=l;l=l+128|0;if(!b){l=h;return}if(c[b+40>>2]|0){Qf(a,c[b+36>>2]|0,d+1|0,e,f);Qf(a,c[b+40>>2]|0,d+1|0,e,f)}if((d|0)<0){l=h;return}m=+g[b>>2];r=+g[b+16>>2];j=+g[b+4>>2];q=+g[b+20>>2];i=+g[b+8>>2];p=+g[b+24>>2];k=(m+r)*.5-(r-m)*.5;n=(j+q)*.5-(q-j)*.5;o=(i+p)*.5-(p-i)*.5;m=(m+r)*.5+(r-m)*.5;j=(j+q)*.5+(q-j)*.5;i=(i+p)*.5+(p-i)*.5;f=(c[b+40>>2]|0)==0?f:e;g[h>>2]=k;g[h+4>>2]=n;g[h+8>>2]=o;g[h+12>>2]=0.0;g[h+16>>2]=m;g[h+20>>2]=n;g[h+24>>2]=o;g[h+28>>2]=0.0;g[h+32>>2]=m;g[h+36>>2]=j;g[h+40>>2]=o;g[h+44>>2]=0.0;g[h+48>>2]=k;g[h+52>>2]=j;g[h+56>>2]=o;g[h+60>>2]=0.0;g[h+64>>2]=k;g[h+68>>2]=n;g[h+72>>2]=i;g[h+76>>2]=0.0;g[h+80>>2]=m;g[h+84>>2]=n;g[h+88>>2]=i;g[h+92>>2]=0.0;g[h+96>>2]=m;g[h+100>>2]=j;g[h+104>>2]=i;g[h+108>>2]=0.0;g[h+112>>2]=k;g[h+116>>2]=j;g[h+120>>2]=i;g[h+124>>2]=0.0;Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+16|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+32|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+48|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+64|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+80|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+96|0,h+112|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+112|0,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h+112|0,f);l=h;return}function Rf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b>>2]=6640;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;c[b+36>>2]=1566444395;c[b+40>>2]=1566444395;c[b+44>>2]=1566444395;g[b+48>>2]=0.0;c[b+52>>2]=-581039253;c[b+56>>2]=-581039253;c[b+60>>2]=-581039253;g[b+64>>2]=0.0;c[b+68>>2]=0;c[b+72>>2]=1;g[b+76>>2]=0.0;c[b+80>>2]=1065353216;c[b+84>>2]=1065353216;c[b+88>>2]=1065353216;g[b+92>>2]=0.0;c[b+4>>2]=31;if(d){c[6995]=(c[6995]|0)+1;d=sc(59)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=-1;c[d+12>>2]=0;c[d+16>>2]=0;c[b+68>>2]=d;d=c[b+24>>2]|0}else d=0;if((d|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e*80|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+20>>2]|0;if((f|0)>0){d=0;do{i=h+(d*80|0)|0;j=c[b+28>>2]|0;k=j+(d*80|0)|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=j+(d*80|0)+16|0;k=h+(d*80|0)+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];k=j+(d*80|0)+32|0;i=h+(d*80|0)+32|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+48|0;k=j+(d*80|0)+48|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+64|0;j=j+(d*80|0)+64|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=h;c[b+24>>2]=e;return}function Sf(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;r=l;l=l+96|0;m=r;n=m+96|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));if(!i)p=c[c[b+940>>2]>>2]|0;else p=i;i=c[b+832>>2]|0;if((i|0)==(c[b+836>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if(!q)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((q*104|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[b+832>>2]|0}if((i|0)>0){j=0;do{m=o+(j*104|0)|0;k=(c[b+840>>2]|0)+(j*104|0)|0;n=m+104|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));j=j+1|0}while((j|0)!=(i|0))}i=c[b+840>>2]|0;if(i|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=o;c[b+836>>2]=q;i=c[b+832>>2]|0}m=c[b+840>>2]|0;c[m+(i*104|0)>>2]=0;c[m+(i*104|0)+4>>2]=p;m=m+(i*104|0)+8|0;k=r;n=m+96|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));q=c[b+832>>2]|0;c[b+832>>2]=q+1;p=c[b+840>>2]|0;k=c[b+780>>2]|0;c[p+(q*104|0)+8>>2]=k+(d*104|0);o=c[b+780>>2]|0;c[p+(q*104|0)+12>>2]=o+(e*104|0);m=c[b+780>>2]|0;c[p+(q*104|0)+16>>2]=m+(f*104|0);n=c[b+780>>2]|0;c[p+(q*104|0)+20>>2]=n+(h*104|0);z=+g[k+(d*104|0)+8>>2];w=+g[k+(d*104|0)+12>>2];A=+g[k+(d*104|0)+16>>2];t=+g[m+(f*104|0)+8>>2]-z;y=+g[m+(f*104|0)+12>>2]-w;v=+g[m+(f*104|0)+16>>2]-A;u=+g[n+(h*104|0)+8>>2]-z;x=+g[n+(h*104|0)+12>>2]-w;s=+g[n+(h*104|0)+16>>2]-A;g[p+(q*104|0)+24>>2]=(+g[o+(e*104|0)+16>>2]-A)*(t*x-y*u)+((+g[o+(e*104|0)+8>>2]-z)*(y*s-v*x)+(+g[o+(e*104|0)+12>>2]-w)*(v*u-t*s));a[b+984>>0]=1;l=r;return}function Tf(b){b=b|0;var d=0;c[b>>2]=5052;d=c[b+204>>2]|0;if(d|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;d=c[b+176>>2]|0;if(d|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0.0,p=0;k=l;l=l+160|0;i=c[b+12>>2]|0;if(!i){l=k;return}m=(a[b+16>>0]|0)!=0;n=m?e:d;e=m?d:e;p=c[n+4>>2]|0;d=c[e+4>>2]|0;c[h+4>>2]=i;o=+g[i+784>>2]+ +g[h+32>>2];c[k+136>>2]=9648;c[k+136+4>>2]=p;c[k+136+8>>2]=d;g[k+136+12>>2]=o;g[k+128>>2]=999999984306749440.0;i=c[n+12>>2]|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[k+16>>2]=c[i+16>>2];c[k+16+4>>2]=c[i+16+4>>2];c[k+16+8>>2]=c[i+16+8>>2];c[k+16+12>>2]=c[i+16+12>>2];c[k+32>>2]=c[i+32>>2];c[k+32+4>>2]=c[i+32+4>>2];c[k+32+8>>2]=c[i+32+8>>2];c[k+32+12>>2]=c[i+32+12>>2];c[k+48>>2]=c[i+48>>2];c[k+48+4>>2]=c[i+48+4>>2];c[k+48+8>>2]=c[i+48+8>>2];c[k+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+64>>2]=c[i>>2];c[k+64+4>>2]=c[i+4>>2];c[k+64+8>>2]=c[i+8>>2];c[k+64+12>>2]=c[i+12>>2];c[k+80>>2]=c[i+16>>2];c[k+80+4>>2]=c[i+16+4>>2];c[k+80+8>>2]=c[i+16+8>>2];c[k+80+12>>2]=c[i+16+12>>2];c[k+96>>2]=c[i+32>>2];c[k+96+4>>2]=c[i+32+4>>2];c[k+96+8>>2]=c[i+32+8>>2];c[k+96+12>>2]=c[i+32+12>>2];c[k+112>>2]=c[i+48>>2];c[k+112+4>>2]=c[i+48+4>>2];c[k+112+8>>2]=c[i+48+8>>2];c[k+112+12>>2]=c[i+48+12>>2];Xd(k+136|0,k,h,c[f+20>>2]|0,m);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function Vf(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0;d=c[a+812>>2]|0;if((d|0)>0){e=c[a+820>>2]|0;b=0;do{f=c[e+(b*44|0)+8>>2]|0;h=c[e+(b*44|0)+12>>2]|0;i=c[e+(b*44|0)+16>>2]|0;l=+g[f+8>>2];n=+g[f+12>>2];j=+g[f+16>>2];k=+g[h+8>>2]-l;o=+g[h+12>>2]-n;m=+g[h+16>>2]-j;l=+g[i+8>>2]-l;n=+g[i+12>>2]-n;j=+g[i+16>>2]-j;g[e+(b*44|0)+36>>2]=+D(+((k*n-o*l)*(k*n-o*l)+((o*j-m*n)*(o*j-m*n)+(m*l-k*j)*(m*l-k*j))));b=b+1|0}while((b|0)!=(d|0))}d=c[a+772>>2]|0;if((d|0)>0){c[6995]=(c[6995]|0)+1;b=sc((d<<2|3)+16|0)|0;if(!b)e=0;else{c[(b+4+15&-16)+-4>>2]=b;e=b+4+15&-16}Yk(e|0,0,d<<2|0)|0;f=c[a+772>>2]|0;if((f|0)>0){d=c[a+780>>2]|0;b=0;do{g[d+(b*104|0)+92>>2]=0.0;b=b+1|0}while((b|0)!=(f|0));i=e;h=e;b=f}else{i=e;h=e;b=f}}else{i=0;h=0;b=d}f=c[a+812>>2]|0;if((f|0)>0){d=c[a+820>>2]|0;e=c[a+780>>2]|0;b=0;do{o=+C(+(+g[d+(b*44|0)+36>>2]));p=c[d+(b*44|0)+8>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+12>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+16>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];b=b+1|0}while((b|0)!=(f|0));b=c[a+772>>2]|0}if((b|0)>0){d=0;do{e=c[i+(d<<2)>>2]|0;if((e|0)>0){q=(c[a+780>>2]|0)+(d*104|0)+92|0;g[q>>2]=+g[q>>2]/+(e|0)}else g[(c[a+780>>2]|0)+(d*104|0)+92>>2]=0.0;d=d+1|0}while((d|0)!=(b|0));if(!h)return}else if((i|0)==0|(h|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);return}function Wf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0;d=l;l=l+128|0;F=c[(c[a+8>>2]|0)+28>>2]|0;f=c[F+(b*80|0)+64>>2]|0;e=c[a+12>>2]|0;w=+g[F+(b*80|0)>>2];C=+g[e>>2];v=+g[F+(b*80|0)+16>>2];B=+g[e+4>>2];u=+g[F+(b*80|0)+32>>2];A=+g[e+8>>2];t=+g[F+(b*80|0)+4>>2];s=+g[F+(b*80|0)+20>>2];r=+g[F+(b*80|0)+36>>2];q=+g[F+(b*80|0)+8>>2];o=+g[F+(b*80|0)+24>>2];m=+g[F+(b*80|0)+40>>2];z=+g[e+16>>2];y=+g[e+20>>2];x=+g[e+24>>2];p=+g[e+32>>2];n=+g[e+36>>2];k=+g[e+40>>2];E=+g[F+(b*80|0)+48>>2];D=+g[F+(b*80|0)+52>>2];h=+g[F+(b*80|0)+56>>2];j=+g[e+48>>2]+(C*E+B*D+A*h);i=z*E+y*D+x*h+ +g[e+52>>2];h=p*E+n*D+k*h+ +g[e+56>>2];g[d+56>>2]=w*C+v*B+u*A;g[d+56+4>>2]=C*t+B*s+A*r;g[d+56+8>>2]=C*q+B*o+A*m;g[d+56+12>>2]=0.0;g[d+56+16>>2]=w*z+v*y+u*x;g[d+56+20>>2]=t*z+s*y+r*x;g[d+56+24>>2]=q*z+o*y+m*x;g[d+56+28>>2]=0.0;g[d+56+32>>2]=w*p+v*n+u*k;g[d+56+36>>2]=t*p+s*n+r*k;g[d+56+40>>2]=q*p+o*n+m*k;g[d+56+44>>2]=0.0;g[d+56+48>>2]=j;g[d+56+52>>2]=i;g[d+56+56>>2]=h;g[d+56+60>>2]=0.0;e=c[a+4>>2]|0;c[d+32>>2]=0;c[d+32+4>>2]=f;c[d+32+8>>2]=e;c[d+32+12>>2]=d+56;c[d+32+16>>2]=-1;c[d+32+20>>2]=b;e=c[a+24>>2]|0;g[d+4>>2]=1.0;c[d+8>>2]=0;c[d+12>>2]=1;c[d+16>>2]=-1;c[d+20>>2]=0;c[d>>2]=6108;c[d+24>>2]=e;c[d+28>>2]=b;c[d+4>>2]=c[e+4>>2];c[d+20>>2]=c[e+20>>2];ad(c[a+16>>2]|0,c[a+20>>2]|0,d+32|0,d);l=d;return}function Xf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;i=l;l=l+80|0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=0;do{q=i+64+(f<<2)|0;c[i+64>>2]=0;c[i+64+4>>2]=0;c[i+64+8>>2]=0;c[i+64+12>>2]=0;g[q>>2]=1.0;j=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i+32>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+32+4>>2]=o;g[i+32+8>>2]=p;g[i+32+12>>2]=0.0;Sb[j&127](i+48|0,a,i+32|0);p=+g[i+48>>2];o=+g[i+48+4>>2];n=+g[i+48+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;j=i+32+(f<<2)|0;g[e+(f<<2)>>2]=h+ +g[j>>2];g[q>>2]=-1.0;q=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+4>>2]=o;g[i+8>>2]=p;g[i+12>>2]=0.0;Sb[q&127](i+16|0,a,i);p=+g[i+16>>2];o=+g[i+16+4>>2];n=+g[i+16+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;g[d+(f<<2)>>2]=+g[j>>2]-h;f=f+1|0}while((f|0)!=3);l=i;return}function Yf(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0;m=l;l=l+48|0;c[6995]=(c[6995]|0)+1;f=sc(83)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}c[k>>2]=g;c[k+4>>2]=h;c[k+8>>2]=i;h=k+16|0;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];h=k+32|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];h=k+56|0;c[h>>2]=0;i=k+52|0;c[i>>2]=0;c[m+16>>2]=c[d>>2];c[m+16+4>>2]=c[d+4>>2];c[m+16+8>>2]=c[d+8>>2];c[m+16+12>>2]=c[d+12>>2];c[m+16+16>>2]=c[e>>2];c[m+16+16+4>>2]=c[e+4>>2];c[m+16+16+8>>2]=c[e+8>>2];c[m+16+16+12>>2]=c[e+12>>2];c[k+60>>2]=c[b+104>>2];f=(c[b+148>>2]|0)+1|0;c[b+148>>2]=f;c[k+12>>2]=f;f=c[b+8>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;g=j+44|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(g|0))}else c[b+8>>2]=0;c[f+32>>2]=0;c[f+36>>2]=k;c[f+40>>2]=0;c[f>>2]=c[m+16>>2];c[f+4>>2]=c[m+16+4>>2];c[f+8>>2]=c[m+16+8>>2];c[f+12>>2]=c[m+16+12>>2];c[f+16>>2]=c[m+16+16>>2];c[f+20>>2]=c[m+16+20>>2];c[f+24>>2]=c[m+16+24>>2];c[f+28>>2]=c[m+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,f);c[b+16>>2]=(c[b+16>>2]|0)+1;c[k+48>>2]=f;j=b+84+(c[b+104>>2]<<2)|0;c[i>>2]=0;c[h>>2]=c[j>>2];f=c[j>>2]|0;if(f|0)c[f+52>>2]=k;c[j>>2]=k;if(a[b+153>>0]|0){l=m;return k|0}c[m>>2]=9248;c[m+4>>2]=b;c[m+8>>2]=k;Bf(c[b+4>>2]|0,m+16|0,m);Bf(c[b+44>>2]|0,m+16|0,m);l=m;return k|0}function Zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0;C=l;l=l+96|0;n=+g[e+4>>2];o=+g[e+20>>2];p=+g[e+36>>2];q=+g[e+8>>2];r=+g[e+24>>2];s=+g[e+40>>2];t=+g[e+12>>2];u=+g[e+28>>2];v=+g[e+44>>2];w=-+g[e+52>>2];x=-+g[e+56>>2];y=-+g[e+60>>2];k=c[b+780>>2]|0;z=+g[k+(d*104|0)+8>>2];A=+g[k+(d*104|0)+12>>2];B=+g[k+(d*104|0)+16>>2];a:do if(f){f=c[b+328>>2]|0;b:do if((f|0)>0){j=c[b+336>>2]|0;i=0;while(1){if((c[j+(i<<2)>>2]|0)==(e|0))break;i=i+1|0;if((i|0)>=(f|0))break b}if((i|0)!=(f|0)){f=k;break a}}while(0);if((f|0)==(c[b+332>>2]|0)?(m=f|0?f<<1:1,(f|0)<(m|0)):0){if(!m)j=0;else{c[6995]=(c[6995]|0)+1;f=sc((m<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;f=c[b+328>>2]|0}if((f|0)>0){i=0;do{c[j+(i<<2)>>2]=c[(c[b+336>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+336>>2]|0;if(i){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=j;c[b+332>>2]=m}c[(c[b+336>>2]|0)+(f<<2)>>2]=e;c[b+328>>2]=f+1;f=c[b+780>>2]|0}else f=k;while(0);c[C>>2]=f+(d*104|0);c[C+20>>2]=e;g[C+4>>2]=n*w+o*x+p*y+(n*z+o*A+p*B);g[C+8>>2]=q*w+r*x+s*y+(q*z+r*A+s*B);g[C+12>>2]=t*w+u*x+v*y+(t*z+u*A+v*B);g[C+16>>2]=0.0;e=f+(d*104|0)+100|0;a[e>>0]=a[e>>0]|1;g[C+24>>2]=h;Ln(b+848|0,C);l=C;return}function _f(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0;I=l;l=l+32|0;j=+g[b+16>>2];f=+g[b>>2];k=+g[b+20>>2];h=+g[b+4>>2];n=+g[b+24>>2];i=+g[b+8>>2];r=+g[b+32>>2];v=+g[b+36>>2];w=+g[b+40>>2];B=(k-h)*(w-i)-(n-i)*(v-h);C=(n-i)*(r-f)-(j-f)*(w-i);E=(j-f)*(v-h)-(k-h)*(r-f);g[I+16>>2]=B;g[I+16+4>>2]=C;g[I+16+8>>2]=E;g[I+16+12>>2]=0.0;o=+g[a+4>>2];s=+g[a+8>>2];x=+g[a+12>>2];F=B*o+C*s+E*x-(f*B+h*C+i*E);p=+g[a+20>>2];t=+g[a+24>>2];y=+g[a+28>>2];if(F*(B*p+C*t+E*y-(f*B+h*C+i*E))>=0.0){l=I;return}G=c[a+36>>2]|0;if(F<=0.0&(G&1|0)!=0){l=I;return}H=F/(F-(B*p+C*t+E*y-(f*B+h*C+i*E)));if(!(H<+g[a+40>>2])){l=I;return}A=(B*B+C*C+E*E)*-9.999999747378752e-05;z=f-(p*H+o*(1.0-H));u=h-(t*H+s*(1.0-H));q=i-(y*H+x*(1.0-H));m=j-(p*H+o*(1.0-H));k=k-(t*H+s*(1.0-H));j=n-(y*H+x*(1.0-H));if(!(E*(z*k-u*m)+(B*(u*j-q*k)+C*(q*m-z*j))>=A)){l=I;return}i=r-(p*H+o*(1.0-H));h=v-(t*H+s*(1.0-H));f=w-(y*H+x*(1.0-H));if(!(E*(m*h-k*i)+(B*(k*f-j*h)+C*(j*i-m*f))>=A)){l=I;return}if(!(E*(u*i-z*h)+(B*(q*h-u*f)+C*(z*f-q*i))>=A)){l=I;return}f=1.0/+D(+(B*B+C*C+E*E));g[I+16>>2]=B*f;g[I+16+4>>2]=C*f;g[I+16+8>>2]=E*f;b=c[(c[a>>2]|0)+12>>2]|0;if(F<=0.0&(G&2|0)==0){g[I>>2]=-(B*f);g[I+4>>2]=-(C*f);g[I+8>>2]=-(E*f);g[I+12>>2]=0.0;g[a+40>>2]=+pb[b&3](a,I,H,d,e);l=I;return}else{g[a+40>>2]=+pb[b&3](a,I+16|0,H,d,e);l=I;return}}function $f(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0;k=l;l=l+144|0;i=c[b+12>>2]|0;if(!i){l=k;return}n=c[d+4>>2]|0;m=c[e+4>>2]|0;c[h+4>>2]=i;g[k+12+128>>2]=999999984306749440.0;i=c[d+12>>2]|0;c[k+12>>2]=c[i>>2];c[k+12+4>>2]=c[i+4>>2];c[k+12+8>>2]=c[i+8>>2];c[k+12+12>>2]=c[i+12>>2];c[k+12+16>>2]=c[i+16>>2];c[k+12+16+4>>2]=c[i+16+4>>2];c[k+12+16+8>>2]=c[i+16+8>>2];c[k+12+16+12>>2]=c[i+16+12>>2];c[k+12+32>>2]=c[i+32>>2];c[k+12+32+4>>2]=c[i+32+4>>2];c[k+12+32+8>>2]=c[i+32+8>>2];c[k+12+32+12>>2]=c[i+32+12>>2];c[k+12+48>>2]=c[i+48>>2];c[k+12+48+4>>2]=c[i+48+4>>2];c[k+12+48+8>>2]=c[i+48+8>>2];c[k+12+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+12+64>>2]=c[i>>2];c[k+12+64+4>>2]=c[i+4>>2];c[k+12+64+8>>2]=c[i+8>>2];c[k+12+64+12>>2]=c[i+12>>2];c[k+12+80>>2]=c[i+16>>2];c[k+12+80+4>>2]=c[i+16+4>>2];c[k+12+80+8>>2]=c[i+16+8>>2];c[k+12+80+12>>2]=c[i+16+12>>2];c[k+12+96>>2]=c[i+32>>2];c[k+12+96+4>>2]=c[i+32+4>>2];c[k+12+96+8>>2]=c[i+32+8>>2];c[k+12+96+12>>2]=c[i+32+12>>2];c[k+12+112>>2]=c[i+48>>2];c[k+12+112+4>>2]=c[i+48+4>>2];c[k+12+112+8>>2]=c[i+48+8>>2];c[k+12+112+12>>2]=c[i+48+12>>2];c[k>>2]=9628;c[k+4>>2]=n;c[k+8>>2]=m;pc(k,k+12|0,h,c[f+20>>2]|0,0);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function ag(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=qt()|0;Ij(f,4,b);c[f>>2]=4996;c[f+552>>2]=c[d>>2];c[f+552+4>>2]=c[d+4>>2];c[f+552+8>>2]=c[d+8>>2];c[f+552+12>>2]=c[d+12>>2];c[f+568>>2]=c[d+16>>2];c[f+568+4>>2]=c[d+16+4>>2];c[f+568+8>>2]=c[d+16+8>>2];c[f+568+12>>2]=c[d+16+12>>2];c[f+584>>2]=c[d+32>>2];c[f+584+4>>2]=c[d+32+4>>2];c[f+584+8>>2]=c[d+32+8>>2];c[f+584+12>>2]=c[d+32+12>>2];c[f+600>>2]=c[d+48>>2];c[f+600+4>>2]=c[d+48+4>>2];c[f+600+8>>2]=c[d+48+8>>2];c[f+600+12>>2]=c[d+48+12>>2];c[f+616>>2]=c[d>>2];c[f+616+4>>2]=c[d+4>>2];c[f+616+8>>2]=c[d+8>>2];c[f+616+12>>2]=c[d+12>>2];c[f+632>>2]=c[d+16>>2];c[f+632+4>>2]=c[d+16+4>>2];c[f+632+8>>2]=c[d+16+8>>2];c[f+632+12>>2]=c[d+16+12>>2];c[f+648>>2]=c[d+32>>2];c[f+648+4>>2]=c[d+32+4>>2];c[f+648+8>>2]=c[d+32+8>>2];c[f+648+12>>2]=c[d+32+12>>2];c[f+664>>2]=c[d+48>>2];c[f+664+4>>2]=c[d+48+4>>2];c[f+664+8>>2]=c[d+48+8>>2];c[f+664+12>>2]=c[d+48+12>>2];g[f+688>>2]=0.0;g[f+692>>2]=-1.0;g[f+696>>2]=.8999999761581421;g[f+700>>2]=.30000001192092896;g[f+704>>2]=1.0;g[f+708>>2]=0.0;g[f+712>>2]=0.0;a[f+716>>0]=0;a[f+736>>0]=0;a[f+737>>0]=0;a[f+738>>0]=0;a[f+739>>0]=1;a[f+740>>0]=e&1;c[f+748>>2]=0;c[f+748+4>>2]=0;c[f+748+8>>2]=0;c[f+748+12>>2]=0;c[f+748+16>>2]=0;d=c[f+28>>2]|0;l=+g[f+600>>2];k=+g[f+604>>2];j=+g[f+608>>2];i=l*+g[d+20>>2]+k*+g[d+24>>2]+j*+g[d+28>>2]+ +g[d+56>>2];h=l*+g[d+36>>2]+k*+g[d+40>>2]+j*+g[d+44>>2]+ +g[d+60>>2];g[f+664>>2]=l*+g[d+4>>2]+k*+g[d+8>>2]+j*+g[d+12>>2]+ +g[d+52>>2];g[f+668>>2]=i;g[f+672>>2]=h;g[f+676>>2]=0.0;g[f+732>>2]=e?-1.0:1.0;return f|0}function bg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;q=l;l=l+48|0;if((f|0)==(d|0)|((d|0)==(e|0)|(e|0)==(f|0))){l=q;return}k=q;m=k+36|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));if(!h)o=c[c[b+940>>2]>>2]|0;else o=h;h=c[b+812>>2]|0;if((h|0)==(c[b+816>>2]|0)?(p=h|0?h<<1:1,(h|0)<(p|0)):0){if(!p)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*44|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}n=h;h=c[b+812>>2]|0}if((h|0)>0){i=0;do{k=n+(i*44|0)|0;j=(c[b+820>>2]|0)+(i*44|0)|0;m=k+44|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));i=i+1|0}while((i|0)!=(h|0))}h=c[b+820>>2]|0;if(h|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=n;c[b+816>>2]=p;h=c[b+812>>2]|0}k=c[b+820>>2]|0;c[k+(h*44|0)>>2]=0;c[k+(h*44|0)+4>>2]=o;k=k+(h*44|0)+8|0;j=q;m=k+36|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));p=c[b+812>>2]|0;c[b+812>>2]=p+1;o=c[b+820>>2]|0;k=c[b+780>>2]|0;c[o+(p*44|0)+8>>2]=k+(d*104|0);m=c[b+780>>2]|0;c[o+(p*44|0)+12>>2]=m+(e*104|0);n=c[b+780>>2]|0;c[o+(p*44|0)+16>>2]=n+(f*104|0);t=+g[k+(d*104|0)+8>>2];v=+g[k+(d*104|0)+12>>2];r=+g[k+(d*104|0)+16>>2];s=+g[m+(e*104|0)+8>>2]-t;w=+g[m+(e*104|0)+12>>2]-v;u=+g[m+(e*104|0)+16>>2]-r;t=+g[n+(f*104|0)+8>>2]-t;v=+g[n+(f*104|0)+12>>2]-v;r=+g[n+(f*104|0)+16>>2]-r;g[o+(p*44|0)+36>>2]=+D(+((s*v-w*t)*(s*v-w*t)+((w*r-u*v)*(w*r-u*v)+(u*t-s*r)*(u*t-s*r))));a[b+984>>0]=1;l=q;return}function cg(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;g[r+16+60>>2]=0.0;g[r+16+8>>2]=0.0;g[r+16+12>>2]=.10000000149011612;g[r+16+16>>2]=300.0;g[r+16>>2]=1.0;g[r+16+4>>2]=-1.0;g[r+16+28>>2]=0.0;g[r+16+32>>2]=.20000000298023224;g[r+16+36>>2]=0.0;g[r+16+40>>2]=0.0;g[r+16+20>>2]=1.0;g[r+16+24>>2]=.5;c[r+16+56>>2]=0;g[r+16+48>>2]=0.0;a[r+16+44>>0]=0;p=0;do{o=c[b+856+(p<<2)>>2]|0;n=a[b+788+p>>0]|0;if(!o){if(n<<24>>24){n=1;q=5}}else q=5;if((q|0)==5){q=0;g[r+16+40>>2]=0.0;c[r+16+56>>2]=o;c[r+16+52>>2]=c[b+840+(p<<2)>>2];c[r+16+48>>2]=c[b+824+(p<<2)>>2];c[r+16+20>>2]=c[b+732>>2];a[r+16+44>>0]=n;c[r+16+4>>2]=c[b+696+(p<<2)>>2];c[r+16+24>>2]=c[b+728>>2];c[r+16>>2]=c[b+680+(p<<2)>>2];g[r+16+16>>2]=0.0;c[r+16+12>>2]=c[b+808+(p<<2)>>2];c[r+16+8>>2]=c[b+792+(p<<2)>>2];c[r>>2]=c[b+1064+(p<<2)>>2];c[r+4>>2]=c[b+1080+(p<<2)>>2];c[r+8>>2]=c[b+1096+(p<<2)>>2];g[r+12>>2]=0.0;o=c[b+1304>>2]>>p*3;if(!(o&1))n=c[d+32>>2]|0;else n=b+740+(p<<2)|0;c[r+16+28>>2]=c[n>>2];if(!(o&2))n=c[d+32>>2]|0;else n=b+772+(p<<2)|0;c[r+16+36>>2]=c[n>>2];c[r+16+32>>2]=c[((o&4|0)==0?d+4|0:b+756+(p<<2)|0)>>2];if(a[b+1301>>0]|0){o=p+1|0;if(!(c[b+868+(((o|0)==3?0:o)<<6)+56>>2]|0))n=1;else n=(c[b+868+(((p+2|0)%3|0)<<6)+56>>2]|0)==0&1}else n=0;e=(Hd(b,r+16|0,f,h,i,j,k,m,d,e,r,0,n)|0)+e|0}p=p+1|0}while((p|0)!=3);l=r;return e|0}function dg(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;q=0;do{p=c[(c[b+256>>2]|0)+(q<<2)>>2]|0;if(!(c[p+204>>2]&3)){m=+g[p+504>>2];f=+E(+(1.0-m),+d);i=f*+g[p+372>>2];g[p+372>>2]=i;h=f*+g[p+376>>2];g[p+376>>2]=h;f=f*+g[p+380>>2];g[p+380>>2]=f;o=+g[p+508>>2];l=+E(+(1.0-o),+d);j=l*+g[p+388>>2];g[p+388>>2]=j;k=l*+g[p+392>>2];g[p+392>>2]=k;l=l*+g[p+396>>2];g[p+396>>2]=l;do if(a[p+512>>0]|0){if(l*l+(j*j+k*k)<+g[p+524>>2]?i*i+h*h+f*f<+g[p+520>>2]:0){r=+g[p+516>>2];g[p+388>>2]=j*r;g[p+392>>2]=r*k;g[p+396>>2]=r*l;g[p+372>>2]=r*i;g[p+376>>2]=r*h;g[p+380>>2]=r*f;i=r*i;h=r*h;f=r*f;n=j*r;k=r*k;l=r*l}else n=j;j=+D(+(i*i+h*h+f*f));do if(j.004999999888241291){i=i-i*(1.0/j)*.004999999888241291;g[p+372>>2]=i;h=h-h*(1.0/j)*.004999999888241291;g[p+376>>2]=h;f=f-f*(1.0/j)*.004999999888241291;g[p+380>>2]=f;break}else{c[p+372>>2]=0;c[p+372+4>>2]=0;c[p+372+8>>2]=0;c[p+372+12>>2]=0;i=0.0;h=0.0;f=0.0;break}while(0);j=+D(+(n*n+k*k+l*l));if(j.004999999888241291){g[p+388>>2]=n-n*(1.0/j)*.004999999888241291;g[p+392>>2]=k-k*(1.0/j)*.004999999888241291;g[p+396>>2]=l-l*(1.0/j)*.004999999888241291;break}else{c[p+388>>2]=0;c[p+388+4>>2]=0;c[p+388+8>>2]=0;c[p+388+12>>2]=0;break}}while(0);Af(p+4|0,i,h,f,p+388|0,d,p+68|0);e=c[b+248>>2]|0}q=q+1|0}while((q|0)<(e|0));return}function eg(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=qt()|0;Ij(e,4,b);c[e>>2]=4996;c[e+552>>2]=c[d>>2];c[e+552+4>>2]=c[d+4>>2];c[e+552+8>>2]=c[d+8>>2];c[e+552+12>>2]=c[d+12>>2];c[e+568>>2]=c[d+16>>2];c[e+568+4>>2]=c[d+16+4>>2];c[e+568+8>>2]=c[d+16+8>>2];c[e+568+12>>2]=c[d+16+12>>2];c[e+584>>2]=c[d+32>>2];c[e+584+4>>2]=c[d+32+4>>2];c[e+584+8>>2]=c[d+32+8>>2];c[e+584+12>>2]=c[d+32+12>>2];c[e+600>>2]=c[d+48>>2];c[e+600+4>>2]=c[d+48+4>>2];c[e+600+8>>2]=c[d+48+8>>2];c[e+600+12>>2]=c[d+48+12>>2];c[e+616>>2]=c[d>>2];c[e+616+4>>2]=c[d+4>>2];c[e+616+8>>2]=c[d+8>>2];c[e+616+12>>2]=c[d+12>>2];c[e+632>>2]=c[d+16>>2];c[e+632+4>>2]=c[d+16+4>>2];c[e+632+8>>2]=c[d+16+8>>2];c[e+632+12>>2]=c[d+16+12>>2];c[e+648>>2]=c[d+32>>2];c[e+648+4>>2]=c[d+32+4>>2];c[e+648+8>>2]=c[d+32+8>>2];c[e+648+12>>2]=c[d+32+12>>2];c[e+664>>2]=c[d+48>>2];c[e+664+4>>2]=c[d+48+4>>2];c[e+664+8>>2]=c[d+48+8>>2];c[e+664+12>>2]=c[d+48+12>>2];g[e+688>>2]=0.0;g[e+692>>2]=-1.0;g[e+696>>2]=.8999999761581421;g[e+700>>2]=.30000001192092896;g[e+704>>2]=1.0;g[e+708>>2]=0.0;g[e+712>>2]=0.0;a[e+716>>0]=0;a[e+736>>0]=0;a[e+737>>0]=0;a[e+738>>0]=0;a[e+739>>0]=1;a[e+740>>0]=0;c[e+748>>2]=0;c[e+748+4>>2]=0;c[e+748+8>>2]=0;c[e+748+12>>2]=0;c[e+748+16>>2]=0;d=c[e+28>>2]|0;k=+g[e+600>>2];j=+g[e+604>>2];i=+g[e+608>>2];h=k*+g[d+20>>2]+j*+g[d+24>>2]+i*+g[d+28>>2]+ +g[d+56>>2];f=k*+g[d+36>>2]+j*+g[d+40>>2]+i*+g[d+44>>2]+ +g[d+60>>2];g[e+664>>2]=k*+g[d+4>>2]+j*+g[d+8>>2]+i*+g[d+12>>2]+ +g[d+52>>2];g[e+668>>2]=h;g[e+672>>2]=f;g[e+676>>2]=0.0;g[e+732>>2]=1.0;return e|0}function fg(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=h|0;i=i|0;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;x=+g[j+(h<<2)>>2];y=+g[j+16+(h<<2)>>2];w=+g[j+32+(h<<2)>>2];o=+g[k+(i<<2)>>2];q=+g[k+16+(i<<2)>>2];s=+g[k+32+(i<<2)>>2];t=+g[k+48>>2]-+g[j+48>>2];u=+g[k+52>>2]-+g[j+52>>2];v=+g[k+56>>2]-+g[j+56>>2];m=1.0-(x*o+y*q+w*s)*(x*o+y*q+w*s);if(!(m==0.0)){m=(x*t+y*u+w*v-(x*o+y*q+w*s)*(o*t+q*u+s*v))/m;if(!(m<-c)){if(m>c){m=c;p=4}}else{m=-c;p=4}}else{m=0.0;p=4}n=(x*o+y*q+w*s)*m-(o*t+q*u+s*v);if(n<-e){m=(x*o+y*q+w*s)*-e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=-e;m=c}else n=-e;else{n=-e;m=-c}}else if(n>e){m=(x*o+y*q+w*s)*e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=e;m=c}else n=e;else{n=e;m=-c}}r=o*n;q=q*n;o=s*n;e=r+(t-x*m);n=q+(u-y*m);m=o+(v-w*m);c=+D(+(m*m+(e*e+n*n)));if(c-d-f>l)return +(c-d-f);do if(m*m+(e*e+n*n)<=1.4210854715202004e-14)if(+C(+w)>.7071067690849304){m=1.0/+D(+(y*y+w*w));g[a>>2]=0.0;g[a+4>>2]=-(w*m);i=a+4|0;j=a;m=y*m;h=2;break}else{m=1.0/+D(+(x*x+y*y));g[a>>2]=-(y*m);g[a+4>>2]=x*m;i=a+4|0;j=a;m=0.0;h=2;break}else{g[a>>2]=e*-(1.0/c);g[a+4>>2]=n*-(1.0/c);g[a+8>>2]=m*-(1.0/c);i=a+4|0;j=a;m=0.0;h=3}while(0);g[a+(h<<2)>>2]=m;x=q+ +g[k+52>>2]+ +g[i>>2]*f;y=o+ +g[k+56>>2]+ +g[a+8>>2]*f;g[b>>2]=r+ +g[k+48>>2]+ +g[j>>2]*f;g[b+4>>2]=x;g[b+8>>2]=y;g[b+12>>2]=0.0;return +(c-d-f)}function gg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=c[b+28>>2]|0;j=c[b+32>>2]|0;if(!(a[b+1301>>0]|0)){h=0;e=cg(b,d,0,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);l=k;return}h=0;e=0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);cg(b,d,e,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;l=k;return}function hg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[a+60>>2]|0;c[e+4>>2]=f;g=e+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*24|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[e>>2]=f;c[g>>2]=c[a+48>>2];c[a+48>>2]=e}else c[a+52>>2]=c[e+8>>2];h=c[e>>2]|0;g=c[e+4>>2]|0;if((g|0)>0){e=0;f=h;do{e=e+1|0;i=f;f=f+24|0;c[i>>2]=(e|0)<(g|0)?f:0}while((e|0)!=(g|0))}}else h=e;c[a+56>>2]=c[h>>2];c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}e=c[a+60>>2]|0;c[f+4>>2]=e;g=f+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*24|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[f>>2]=e;c[g>>2]=c[a+48>>2];c[a+48>>2]=f}else{c[a+52>>2]=c[e+8>>2];f=e}e=c[f>>2]|0;i=c[f+4>>2]|0;if((i|0)>0){f=0;g=e;do{f=f+1|0;j=g;g=g+24|0;c[j>>2]=(f|0)<(i|0)?g:0}while((f|0)!=(i|0))}}c[a+56>>2]=c[e>>2];j=e;c[j>>2]=0;c[j+4>>2]=0;c[h+8>>2]=e;c[e+8>>2]=h;j=c[a+100>>2]|0;c[h+20>>2]=j;c[e+20>>2]=j;c[h+12>>2]=d;c[e+12>>2]=b;c[h+16>>2]=0;c[e+16>>2]=0;e=c[a+116>>2]|0;c[a+116>>2]=e+1;if((e|0)<(c[a+120>>2]|0))return h|0;c[a+120>>2]=e+1;return h|0}function ig(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0;c[b+4>>2]=1065353216;c[b+8>>2]=1065353216;c[b+12>>2]=1065353216;g[b+16>>2]=0.0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[b+48>>2]=0;c[b>>2]=8796;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+164>>0]=d&1;a[b+165>>0]=e&1;g[b+168>>2]=0.0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+24>>2]|0;if((e|0)>0){d=0;do{h=f+(d<<5)|0;i=(c[b+32>>2]|0)+(d<<5)|0;c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[h+16>>2]=c[i+16>>2];c[h+20>>2]=c[i+20>>2];c[h+24>>2]=c[i+24>>2];c[h+28>>2]=c[i+28>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=f;c[b+28>>2]=1;i=c[b+24>>2]|0;c[f+(i<<5)>>2]=0;c[f+(i<<5)+4>>2]=0;c[f+(i<<5)+8>>2]=12;c[f+(i<<5)+12>>2]=0;c[f+(i<<5)+16>>2]=0;c[f+(i<<5)+20>>2]=16;c[f+(i<<5)+24>>2]=2;c[f+(i<<5)+28>>2]=0;c[b+24>>2]=(c[b+24>>2]|0)+1;i=(a[b+164>>0]|0)==0;d=c[b+32>>2]|0;c[d>>2]=(c[(i?b+148|0:b+128|0)>>2]|0)/3|0;c[d+4>>2]=0;c[d+24>>2]=i?3:2;c[d+8>>2]=i?6:12;if(!(a[b+165>>0]|0)){h=12;b=(c[b+108>>2]|0)/3|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}else{h=16;b=c[b+88>>2]|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}}function jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;f=l;l=l+112|0;h=c[a+28>>2]|0;x=+g[d>>2];D=+g[h>>2];w=+g[d+16>>2];C=+g[h+4>>2];v=+g[d+32>>2];B=+g[h+8>>2];u=+g[d+4>>2];t=+g[d+20>>2];s=+g[d+36>>2];r=+g[d+8>>2];p=+g[d+24>>2];n=+g[d+40>>2];A=+g[h+16>>2];z=+g[h+20>>2];y=+g[h+24>>2];q=+g[h+32>>2];o=+g[h+36>>2];m=+g[h+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];i=+g[d+56>>2];k=+g[h+48>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[h+52>>2];i=q*F+o*E+m*i+ +g[h+56>>2];g[f+48>>2]=x*D+w*C+v*B;g[f+48+4>>2]=D*u+C*t+B*s;g[f+48+8>>2]=D*r+C*p+B*n;g[f+48+12>>2]=0.0;g[f+48+16>>2]=x*A+w*z+v*y;g[f+48+20>>2]=u*A+t*z+s*y;g[f+48+24>>2]=r*A+p*z+n*y;g[f+48+28>>2]=0.0;g[f+48+32>>2]=x*q+w*o+v*m;g[f+48+36>>2]=u*q+t*o+s*m;g[f+48+40>>2]=r*q+p*o+n*m;g[f+48+44>>2]=0.0;g[f+48+48>>2]=k;g[f+48+52>>2]=j;g[f+48+56>>2]=i;g[f+48+60>>2]=0.0;h=c[a+32>>2]|0;g[f+24+4>>2]=1.0;c[f+24+8>>2]=1;c[f+24+12>>2]=-1;c[f+24>>2]=6260;c[f+24+16>>2]=h;c[f+24+20>>2]=b;c[f+24+4>>2]=c[h+4>>2];h=c[a+4>>2]|0;d=c[h+8>>2]|0;c[f>>2]=h;c[f+4>>2]=e;c[f+8>>2]=d;c[f+12>>2]=f+48;c[f+16>>2]=-1;c[f+20>>2]=b;vc(c[a+8>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,f,f+24|0,+g[a+20>>2]);l=f;return}function kg(){var b=0,d=0,e=0;b=Us(348)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;c[b>>2]=5400;c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d){e=0;Li(e);d=b+344|0;c[d>>2]=e;return b|0}c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16;Li(d);e=b+344|0;c[e>>2]=d;return b|0}function lg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0;k=l;l=l+16|0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=1065353216;c[b+20>>2]=1065353216;c[b+24>>2]=1065353216;g[b+28>>2]=0.0;g[b+48>>2]=.03999999910593033;c[b+56>>2]=0;c[b+60>>2]=1065353216;c[b+64>>2]=1065353216;c[b+68>>2]=1065353216;g[b+72>>2]=0.0;c[b+76>>2]=-1082130432;c[b+80>>2]=-1082130432;c[b+84>>2]=-1082130432;g[b+88>>2]=0.0;a[b+92>>0]=0;c[b>>2]=7604;a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b+4>>2]=4;if((e|0)<=0){c[b+100>>2]=e;uj(b);l=k;return}c[6995]=(c[6995]|0)+1;h=sc((e<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+100>>2]|0;if((i|0)>0){h=0;do{m=j+(h<<4)|0;n=(c[b+108>>2]|0)+(h<<4)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+108>>2]|0;if(h|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=j;c[b+104>>2]=e;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];if((e|0)!=1){h=1;do{n=(c[b+108>>2]|0)+(h<<4)|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];h=h+1|0}while((h|0)!=(e|0))}c[b+100>>2]=e;h=0;while(1){j=c[d+4>>2]|0;m=c[d+8>>2]|0;n=c[b+108>>2]|0;c[n+(h<<4)>>2]=c[d>>2];c[n+(h<<4)+4>>2]=j;c[n+(h<<4)+8>>2]=m;g[n+(h<<4)+12>>2]=0.0;h=h+1|0;if((h|0)==(e|0))break;else d=d+f|0}uj(b);l=k;return}function mg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0;s=l;l=l+48|0;q=+g[d>>2];p=+g[d+4>>2];r=+g[d+8>>2];j=q*+g[b+4>>2]+p*+g[b+20>>2]+r*+g[b+36>>2];k=q*+g[b+8>>2]+p*+g[b+24>>2]+r*+g[b+40>>2];g[s+32>>2]=+g[b>>2]*q+ +g[b+16>>2]*p+ +g[b+32>>2]*r;g[s+32+4>>2]=j;g[s+32+8>>2]=k;g[s+32+12>>2]=0.0;Sb[c[(c[a>>2]|0)+64>>2]&127](s+16|0,a,s+32|0);k=+g[s+16>>2];j=+g[s+16+4>>2];r=+g[s+16+8>>2];p=k*+g[b>>2]+j*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];q=k*+g[b+16>>2]+j*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];r=k*+g[b+32>>2]+j*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];t=c[(c[a>>2]|0)+64>>2]|0;j=-+g[s+32+4>>2];k=-+g[s+32+8>>2];g[s>>2]=-+g[s+32>>2];g[s+4>>2]=j;g[s+8>>2]=k;g[s+12>>2]=0.0;Sb[t&127](s+16|0,a,s);k=+g[s+16>>2];j=+g[s+16+4>>2];m=+g[s+16+8>>2];n=k*+g[b>>2]+j*+g[b+4>>2]+m*+g[b+8>>2]+ +g[b+48>>2];o=k*+g[b+16>>2]+j*+g[b+20>>2]+m*+g[b+24>>2]+ +g[b+52>>2];m=k*+g[b+32>>2]+j*+g[b+36>>2]+m*+g[b+40>>2]+ +g[b+56>>2];g[e>>2]=p*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2];g[f>>2]=n*+g[d>>2]+o*+g[d+4>>2]+m*+g[d+8>>2];g[i>>2]=n;g[i+4>>2]=o;g[i+8>>2]=m;g[i+12>>2]=0.0;g[h>>2]=p;g[h+4>>2]=q;g[h+8>>2]=r;g[h+12>>2]=0.0;j=+g[e>>2];k=+g[f>>2];if(!(j>k)){l=s;return}g[e>>2]=k;g[f>>2]=j;g[i>>2]=p;g[i+4>>2]=q;g[i+8>>2]=r;g[i+12>>2]=0.0;g[h>>2]=n;g[h+4>>2]=o;g[h+8>>2]=m;g[h+12>>2]=0.0;l=s;return}function ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;if((b|0)<0)b=c[a+12>>2]|0;d=c[a>>2]|0;if(!((b|0)>0&(d|0)!=0)){l=n;return}while(1){e=d+40|0;if(c[e>>2]|0){m=0;while(1){g=d+32|0;h=c[g>>2]|0;if(h>>>0>d>>>0){i=(c[h+40>>2]|0)==(d|0)&1;j=c[h+36+((i^1)<<2)>>2]|0;k=c[h+32>>2]|0;if(!k)f=a;else f=k+36+(((c[k+40>>2]|0)==(h|0)&1)<<2)|0;c[f>>2]=d;c[j+32>>2]=d;c[h+32>>2]=d;c[g>>2]=k;k=d+36|0;c[h+36>>2]=c[k>>2];c[h+40>>2]=c[e>>2];c[(c[k>>2]|0)+32>>2]=h;c[(c[e>>2]|0)+32>>2]=h;c[d+36+(i<<2)>>2]=h;c[d+36+((i^1)<<2)>>2]=j;c[n>>2]=c[h>>2];c[n+4>>2]=c[h+4>>2];c[n+8>>2]=c[h+8>>2];c[n+12>>2]=c[h+12>>2];c[n+16>>2]=c[h+16>>2];c[n+20>>2]=c[h+20>>2];c[n+24>>2]=c[h+24>>2];c[n+28>>2]=c[h+28>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];c[h+16>>2]=c[d+16>>2];c[h+20>>2]=c[d+20>>2];c[h+24>>2]=c[d+24>>2];c[h+28>>2]=c[d+28>>2];c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];c[d+16>>2]=c[n+16>>2];c[d+20>>2]=c[n+20>>2];c[d+24>>2]=c[n+24>>2];c[d+28>>2]=c[n+28>>2];d=h}d=c[d+36+(((c[a+16>>2]|0)>>>m&1)<<2)>>2]|0;e=d+40|0;if(!(c[e>>2]|0))break;else m=m+1&31}}if(!(Ag(a,d)|0))e=0;else e=c[a>>2]|0;Pe(a,e,d);c[a+16>>2]=(c[a+16>>2]|0)+1;b=b+-1|0;if(!b)break;d=c[a>>2]|0}l=n;return}function og(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0;i=l;l=l+32|0;d=a[b+8>>0]|0?d:e;if(((c[(c[d+4>>2]|0)+4>>2]|0)+-21|0)>>>0>=9){l=i;return}e=c[(c[d+8>>2]|0)+192>>2]|0;y=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[b+64>>2]=f;g[b+68>>2]=y+.05999999865889549;c[b+56>>2]=h;h=c[b+16>>2]|0;Sb[c[(c[h>>2]|0)+28>>2]&127](h,i+16|0,i);y=+g[i>>2];x=+g[i+16>>2];w=+g[i+4>>2];v=+g[i+16+4>>2];u=+g[i+8>>2];t=+g[i+16+8>>2];h=c[d+12>>2]|0;B=+g[h>>2];o=+g[h+16>>2];D=+g[h+32>>2];z=+g[h+4>>2];m=+g[h+20>>2];A=+g[h+36>>2];q=+g[h+8>>2];j=+g[h+24>>2];r=+g[h+40>>2];E=-+g[h+48>>2];s=-+g[h+52>>2];k=-+g[h+56>>2];p=(y+x)*.5*B+(w+v)*.5*o+(u+t)*.5*D+(B*E+o*s+D*k);n=(y+x)*.5*z+(w+v)*.5*m+(u+t)*.5*A+(z*E+m*s+A*k);k=(y+x)*.5*q+(w+v)*.5*j+(u+t)*.5*r+(q*E+j*s+r*k);s=+g[b+68>>2];o=((y-x)*.5+s)*+C(+(B+o*0.0+D*0.0))+((w-v)*.5+s)*+C(+(B*0.0+o+D*0.0))+((u-t)*.5+s)*+C(+(D+(B*0.0+o*0.0)));m=((y-x)*.5+s)*+C(+(z+m*0.0+A*0.0))+((w-v)*.5+s)*+C(+(z*0.0+m+A*0.0))+((u-t)*.5+s)*+C(+(A+(z*0.0+m*0.0)));j=((y-x)*.5+s)*+C(+(q+j*0.0+r*0.0))+((w-v)*.5+s)*+C(+(q*0.0+j+r*0.0))+((u-t)*.5+s)*+C(+(r+(q*0.0+j*0.0)));g[b+24>>2]=p-o;g[b+28>>2]=n-m;g[b+32>>2]=k-j;g[b+36>>2]=0.0;g[b+40>>2]=p+o;g[b+44>>2]=n+m;g[b+48>>2]=k+j;g[b+52>>2]=0.0;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+12|0,b+24|0,b+40|0);l=i;return}function pg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0;x=l;l=l+48|0;u=+g[e>>2];v=+g[d>>2];w=+g[e+4>>2];t=+g[d+4>>2];s=+g[e+8>>2];n=+g[d+8>>2];o=+D(+((u-v)*.5*(u-v)*.5+(w-t)*.5*(w-t)*.5+(s-n)*.5*(s-n)*.5));p=+g[a+60>>2];d=+C(+p)>.7071067690849304;q=+g[a+56>>2];if(d){m=1.0/+D(+(p*p+q*q));r=+g[a+52>>2];f=r*-(p*m);h=(p*p+q*q)*m;i=0.0;j=-(r*q*m);k=-(p*m);m=q*m}else{r=+g[a+52>>2];k=1.0/+D(+(r*r+q*q));f=(r*r+q*q)*k;h=-(p*r*k);i=-(q*k);j=p*-(q*k);k=r*k;m=0.0}y=(u+v)*.5*r+(w+t)*.5*q+(s+n)*.5*p-+g[a+68>>2];z=(u+v)*.5-r*y;i=o*i;r=o*k;v=o*m;k=o*h;m=o*j;u=o*f;g[x>>2]=k+(i+z);g[x+4>>2]=m+(r+((w+t)*.5-q*y));g[x+8>>2]=u+(v+((s+n)*.5-p*y));g[x+12>>2]=0.0;g[x+16>>2]=i+z-k;g[x+20>>2]=r+((w+t)*.5-q*y)-m;g[x+24>>2]=v+((s+n)*.5-p*y)-u;g[x+28>>2]=0.0;g[x+32>>2]=z-i-k;g[x+36>>2]=(w+t)*.5-q*y-r-m;g[x+40>>2]=(s+n)*.5-p*y-v-u;g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,0);g[x>>2]=z-i-k;g[x+4>>2]=(w+t)*.5-q*y-r-m;g[x+8>>2]=(s+n)*.5-p*y-v-u;g[x+12>>2]=0.0;g[x+16>>2]=k+(z-i);g[x+20>>2]=m+((w+t)*.5-q*y-r);g[x+24>>2]=u+((s+n)*.5-p*y-v);g[x+28>>2]=0.0;g[x+32>>2]=k+(i+z);g[x+36>>2]=m+(r+((w+t)*.5-q*y));g[x+40>>2]=u+(v+((s+n)*.5-p*y));g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,1);l=x;return}function qg(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if(!(a[d+164>>0]|0)){f=c[d+148>>2]|0;if((f|0)==(c[d+152>>2]|0)?(k=f|0?f<<1:1,(f|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<1)+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+148>>2]|0}h=c[d+156>>2]|0;if((f|0)<=0)if(!h)f=d+160|0;else g=27;else{g=0;do{b[i+(g<<1)>>1]=b[h+(g<<1)>>1]|0;g=g+1|0}while((g|0)!=(f|0));g=27}if((g|0)==27){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=k;f=c[d+148>>2]|0}b[(c[d+156>>2]|0)+(f<<1)>>1]=e;c[d+148>>2]=f+1;k=d+156|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}else{f=c[d+128>>2]|0;if((f|0)==(c[d+132>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+128>>2]|0}h=c[d+136>>2]|0;if((f|0)<=0)if(!h)f=d+140|0;else g=12;else{g=0;do{c[i+(g<<2)>>2]=c[h+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0));g=12}if((g|0)==12){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=j;f=c[d+128>>2]|0}c[(c[d+136>>2]|0)+(f<<2)>>2]=e;c[d+128>>2]=(c[d+128>>2]|0)+1;k=d+136|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}}function rg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;ce(b,d);c[b>>2]=3244;c[6995]=(c[6995]|0)+1;e=sc(27)|0;i=e+4+15&-16;c[i+-4>>2]=e;a[i+4>>0]=0;c[(e+4+15&-16)>>2]=3276;c[b+88>>2]=i;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3296;c[b+92>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3296;c[b+96>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3316;c[b+100>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3336;c[b+104>>2]=e;a[e+4>>0]=1;if(!(a[b+20>>0]|0))return;e=c[b+16>>2]|0;if(!e)return;if((c[e>>2]|0)>=156)return;f=c[e+16>>2]|0;if(f){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+16>>2]|0;if(!e)i=b+16|0;else{f=b+16|0;g=11}}else{f=b+16|0;g=11}if((g|0)==11){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);i=f}c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}e=c[d+12>>2]|0;c[h>>2]=156;f=h+4|0;c[f>>2]=e;c[h+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*156|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[h+16>>2]=e;c[h+12>>2]=e;f=c[f>>2]|0;c[h+8>>2]=f;if(f+-1|0){b=c[h>>2]|0;g=e;d=f+-1|0;do{j=g;g=g+b|0;c[j>>2]=g;d=d+-1|0}while((d|0)!=0);e=e+(P(b,f+-1|0)|0)|0}c[e>>2]=0;c[i>>2]=h;return}function sg(a,b,e){a=a|0;b=b|0;e=e|0;bf(a,b,e)|0;c[b+264>>2]=c[a+324>>2];c[b+268>>2]=c[a+328>>2];c[b+272>>2]=c[a+332>>2];c[b+276>>2]=c[a+336>>2];c[b+280>>2]=c[a+340>>2];c[b+284>>2]=c[a+344>>2];c[b+288>>2]=c[a+348>>2];c[b+292>>2]=c[a+352>>2];c[b+296>>2]=c[a+356>>2];c[b+300>>2]=c[a+360>>2];c[b+304>>2]=c[a+364>>2];c[b+308>>2]=c[a+368>>2];c[b+312>>2]=c[a+372>>2];c[b+316>>2]=c[a+376>>2];c[b+320>>2]=c[a+380>>2];c[b+324>>2]=c[a+384>>2];c[b+328>>2]=c[a+388>>2];c[b+332>>2]=c[a+392>>2];c[b+336>>2]=c[a+396>>2];c[b+340>>2]=c[a+400>>2];c[b+456>>2]=c[a+404>>2];c[b+344>>2]=c[a+604>>2];c[b+348>>2]=c[a+608>>2];c[b+352>>2]=c[a+612>>2];c[b+356>>2]=c[a+616>>2];c[b+360>>2]=c[a+408>>2];c[b+364>>2]=c[a+412>>2];c[b+368>>2]=c[a+416>>2];c[b+372>>2]=c[a+420>>2];c[b+376>>2]=c[a+424>>2];c[b+380>>2]=c[a+428>>2];c[b+384>>2]=c[a+432>>2];c[b+388>>2]=c[a+436>>2];c[b+392>>2]=c[a+440>>2];c[b+396>>2]=c[a+444>>2];c[b+400>>2]=c[a+448>>2];c[b+404>>2]=c[a+452>>2];c[b+408>>2]=c[a+456>>2];c[b+412>>2]=c[a+460>>2];c[b+416>>2]=c[a+464>>2];c[b+420>>2]=c[a+468>>2];c[b+424>>2]=c[a+472>>2];c[b+428>>2]=c[a+476>>2];c[b+432>>2]=c[a+480>>2];c[b+436>>2]=c[a+484>>2];c[b+440>>2]=c[a+488>>2];c[b+444>>2]=c[a+492>>2];c[b+448>>2]=c[a+496>>2];c[b+452>>2]=c[a+500>>2];c[b+460>>2]=c[a+504>>2];c[b+464>>2]=c[a+508>>2];c[b+492>>2]=d[a+512>>0];c[b+468>>2]=c[a+516>>2];c[b+472>>2]=c[a+520>>2];c[b+476>>2]=c[a+524>>2];c[b+480>>2]=c[a+528>>2];c[b+484>>2]=c[a+532>>2];c[b+488>>2]=c[a+536>>2];return 12085}function tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0,l=0,m=0.0;c[6131]=(c[6131]|0)+1;if(!(c[b+4>>2]&2))j=.019999999552965164;else{k=c[d+192>>2]|0;i=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);k=c[e+192>>2]|0;j=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);j=i>2];i=+g[e+184>>2];i=m>2]|0;h=c[f+12>>2]|0;if(!h){if(c[b+4>>2]&4|0){b=0;return b|0}c[6995]=(c[6995]|0)+1;f=sc(823)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}}else{c[f+12>>2]=c[h>>2];c[f+8>>2]=(c[f+8>>2]|0)+-1;k=h}c[k>>2]=1025;f=k+120|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+312|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+504|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+696|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[k+772>>2]=d;c[k+776>>2]=e;c[k+780>>2]=0;g[k+784>>2]=j;g[k+788>>2]=i;e=k;f=c[b+12>>2]|0;c[k+800>>2]=f;if((f|0)==(c[b+16>>2]|0)?(l=f|0?f<<1:1,(f|0)<(l|0)):0){if(!l)d=0;else{c[6995]=(c[6995]|0)+1;f=sc((l<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=f;f=c[b+12>>2]|0}if((f|0)>0){h=0;do{c[d+(h<<2)>>2]=c[(c[b+20>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+20>>2]|0;if(h){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=d;c[b+16>>2]=l}c[(c[b+20>>2]|0)+(f<<2)>>2]=e;c[b+12>>2]=f+1;b=k;return b|0}function ug(b,d,e,f,h,i,k,l,m){b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;k=k|0;l=l|0;m=m|0;var n=0,o=0.0,p=0.0,q=0.0,r=0.0;n=at()|0;c[n+8>>2]=0;c[n+12>>2]=-1;g[n+16>>2]=0.0;c[n>>2]=8404;c[n+4>>2]=24;c[n+68>>2]=b;c[n+72>>2]=d;g[n+76>>2]=h;g[n+80>>2]=i;g[n+84>>2]=+(b+-1|0);g[n+88>>2]=+(d+-1|0);g[n+92>>2]=f;c[n+96>>2]=e;c[n+100>>2]=l;a[n+104>>0]=m&1;a[n+105>>0]=0;a[n+106>>0]=0;c[n+108>>2]=k;c[n+112>>2]=1065353216;c[n+116>>2]=1065353216;c[n+120>>2]=1065353216;g[n+124>>2]=0.0;switch(k|0){case 0:{g[n+20>>2]=h;c[n+24>>2]=0;b=n+88|0;d=n+84|0;e=n+80|0;f=0.0;i=0.0;break}case 1:{c[n+20>>2]=0;g[n+24>>2]=h;b=n+88|0;d=n+80|0;e=n+84|0;f=0.0;i=h;h=0.0;break}case 2:{c[n+20>>2]=0;c[n+24>>2]=0;b=n+80|0;d=n+88|0;e=n+84|0;f=h;i=0.0;h=0.0;break}default:{q=+g[n+36>>2];h=+g[n+20>>2];p=+g[n+40>>2];f=+g[n+24>>2];o=+g[n+44>>2];i=+g[n+28>>2];h=q+h;f=p+f;i=o+i;h=h*.5;f=f*.5;i=i*.5;m=n+52|0;g[m>>2]=h;m=n+56|0;g[m>>2]=f;m=n+60|0;g[m>>2]=i;m=n+64|0;g[m>>2]=0.0;return n|0}}g[n+28>>2]=f;g[n+32>>2]=0.0;k=c[e>>2]|0;c[n+36>>2]=k;l=c[d>>2]|0;c[n+40>>2]=l;m=c[b>>2]|0;c[n+44>>2]=m;g[n+48>>2]=0.0;r=(c[j>>2]=k,+g[j>>2]);p=(c[j>>2]=l,+g[j>>2]);o=h;h=p;p=i;i=(c[j>>2]=m,+g[j>>2]);q=f;o=r+o;p=h+p;q=i+q;o=o*.5;p=p*.5;q=q*.5;m=n+52|0;g[m>>2]=o;m=n+56|0;g[m>>2]=p;m=n+60|0;g[m>>2]=q;m=n+64|0;g[m>>2]=0.0;return n|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);d=c[a+8>>2]|0;if((d|0)<=0){dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&8){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645651,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}function wg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=c[d>>2]|0;l=zb[c[(c[l>>2]|0)+56>>2]&31](l,116)|0;ul(l,d,e,f,0);c[l>>2]=6576;a[l+104>>0]=1;c[l+100>>2]=0;c[l+92>>2]=0;c[l+96>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(83)|0;if(!b)h=0;else{c[(b+4+15&-16)+-4>>2]=b;h=b+4+15&-16}c[h>>2]=9668;i=h+20|0;a[i>>0]=1;j=h+16|0;c[j>>2]=0;d=h+8|0;c[d>>2]=0;k=h+12|0;c[k>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(43)|0;if(!b)g=0;else{c[(b+4+15&-16)+-4>>2]=b;g=b+4+15&-16}d=c[d>>2]|0;if((d|0)>0){b=0;do{m=g+(b*12|0)|0;n=(c[j>>2]|0)+(b*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];b=b+1|0}while((b|0)!=(d|0))}b=c[j>>2]|0;if(!b){a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[j>>2]=0;a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}function xg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;g=c[a+52>>2]|0;Bb[c[(c[g>>2]|0)+56>>2]&63](g,b+12|0,d)|0;c[b+52>>2]=c[a+16>>2];do if((c[a+56>>2]|0)!=0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&1|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+56>>2]|0)|0;if(!e){c[b+40>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+56>>2]|0)|0;c[b+44>>2]=0;e=c[a+56>>2]|0;e=xb[c[(c[e>>2]|0)+12>>2]&127](e)|0;e=Bb[c[(c[d>>2]|0)+16>>2]&63](d,e,1)|0;g=c[a+56>>2]|0;g=Bb[c[(c[g>>2]|0)+16>>2]&63](g,c[e+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,e,g,1213612625,c[a+56>>2]|0);break}else{c[b+40>>2]=e;c[b+44>>2]=0;break}}else f=8;while(0);if((f|0)==8){c[b+40>>2]=0;c[b+44>>2]=0}if(c[a+60>>2]|0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&2|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+60>>2]|0)|0;if(!e){c[b+48>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+60>>2]|0)|0;f=c[a+60>>2]|0;f=xb[c[(c[f>>2]|0)+8>>2]&127](f)|0;f=Bb[c[(c[d>>2]|0)+16>>2]&63](d,f,1)|0;g=c[a+60>>2]|0;g=Bb[c[(c[g>>2]|0)+12>>2]&63](g,c[f+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,f,g,1346456916,c[a+60>>2]|0);g=b+56|0;c[g>>2]=0;return 16561}else{c[b+48>>2]=e;g=b+56|0;c[g>>2]=0;return 16561}}c[b+48>>2]=0;g=b+56|0;c[g>>2]=0;return 16561}function yg(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+32|0;d=c[a+8>>2]|0;if((d|0)<=0){l=h;return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if((!((e|0)==0?1:(c[e+252>>2]&2|0)==0)?(c[e+220>>2]|0)!=2:0)?!(b==0.0?1:(c[e+204>>2]&2|0)==0):0){d=c[e+540>>2]|0;if(!d)d=e+4|0;else{Ob[c[(c[d>>2]|0)+8>>2]&127](d,e+4|0);d=e+4|0}j=1.0/b*(+g[e+56>>2]-+g[e+120>>2]);k=1.0/b*(+g[e+60>>2]-+g[e+124>>2]);g[e+372>>2]=1.0/b*(+g[e+52>>2]-+g[e+116>>2]);g[e+376>>2]=j;g[e+380>>2]=k;g[e+384>>2]=0.0;If(e+68|0,d,h+8|0,h);k=+g[h>>2];j=1.0/b*k*+g[h+8+4>>2];i=1.0/b*k*+g[h+8+8>>2];g[e+388>>2]=1.0/b*+g[h+8>>2]*k;g[e+392>>2]=j;g[e+396>>2]=i;g[e+400>>2]=0.0;c[e+132>>2]=c[e+372>>2];c[e+132+4>>2]=c[e+372+4>>2];c[e+132+8>>2]=c[e+372+8>>2];c[e+132+12>>2]=c[e+372+12>>2];c[e+148>>2]=c[e+388>>2];c[e+148+4>>2]=c[e+388+4>>2];c[e+148+8>>2]=c[e+388+8>>2];c[e+148+12>>2]=c[e+388+12>>2];c[e+68>>2]=c[d>>2];c[e+68+4>>2]=c[d+4>>2];c[e+68+8>>2]=c[d+8>>2];c[e+68+12>>2]=c[d+12>>2];c[e+84>>2]=c[e+20>>2];c[e+84+4>>2]=c[e+20+4>>2];c[e+84+8>>2]=c[e+20+8>>2];c[e+84+12>>2]=c[e+20+12>>2];c[e+100>>2]=c[e+36>>2];c[e+100+4>>2]=c[e+36+4>>2];c[e+100+8>>2]=c[e+36+8>>2];c[e+100+12>>2]=c[e+36+12>>2];c[e+116>>2]=c[e+52>>2];c[e+116+4>>2]=c[e+52+4>>2];c[e+116+8>>2]=c[e+52+8>>2];c[e+116+12>>2]=c[e+52+12>>2];d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));l=h;return}function zg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=qt()|0;c[i+4>>2]=4;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4996;c[i+552>>2]=c[e>>2];c[i+552+4>>2]=c[e+4>>2];c[i+552+8>>2]=c[e+8>>2];c[i+552+12>>2]=c[e+12>>2];c[i+568>>2]=c[e+16>>2];c[i+568+4>>2]=c[e+16+4>>2];c[i+568+8>>2]=c[e+16+8>>2];c[i+568+12>>2]=c[e+16+12>>2];c[i+584>>2]=c[e+32>>2];c[i+584+4>>2]=c[e+32+4>>2];c[i+584+8>>2]=c[e+32+8>>2];c[i+584+12>>2]=c[e+32+12>>2];c[i+600>>2]=c[e+48>>2];c[i+600+4>>2]=c[e+48+4>>2];c[i+600+8>>2]=c[e+48+8>>2];c[i+600+12>>2]=c[e+48+12>>2];c[i+616>>2]=c[f>>2];c[i+616+4>>2]=c[f+4>>2];c[i+616+8>>2]=c[f+8>>2];c[i+616+12>>2]=c[f+12>>2];c[i+632>>2]=c[f+16>>2];c[i+632+4>>2]=c[f+16+4>>2];c[i+632+8>>2]=c[f+16+8>>2];c[i+632+12>>2]=c[f+16+12>>2];c[i+648>>2]=c[f+32>>2];c[i+648+4>>2]=c[f+32+4>>2];c[i+648+8>>2]=c[f+32+8>>2];c[i+648+12>>2]=c[f+32+12>>2];c[i+664>>2]=c[f+48>>2];c[i+664+4>>2]=c[f+48+4>>2];c[i+664+8>>2]=c[f+48+8>>2];c[i+664+12>>2]=c[f+48+12>>2];g[i+688>>2]=0.0;g[i+692>>2]=-1.0;g[i+696>>2]=.8999999761581421;g[i+700>>2]=.30000001192092896;g[i+704>>2]=1.0;g[i+708>>2]=0.0;g[i+712>>2]=0.0;a[i+716>>0]=0;a[i+736>>0]=0;a[i+737>>0]=0;a[i+738>>0]=0;a[i+739>>0]=1;a[i+740>>0]=h&1;c[i+748>>2]=0;c[i+748+4>>2]=0;c[i+748+8>>2]=0;c[i+748+12>>2]=0;c[i+748+16>>2]=0;g[i+732>>2]=h?-1.0:1.0;return i|0}function Ag(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((c[a>>2]|0)==(b|0)){c[a>>2]=0;a=0;return a|0}e=c[b+32>>2]|0;d=c[e+32>>2]|0;b=c[e+36+(((c[e+40>>2]|0)!=(b|0)&1)<<2)>>2]|0;a:do if(!d){c[a>>2]=b;c[b+32>>2]=0;d=c[a+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[a+4>>2]=e}else{c[d+36+(((c[d+40>>2]|0)==(e|0)&1)<<2)>>2]=b;c[b+32>>2]=d;b=c[a+4>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[a+4>>2]=e;while(1){n=+g[d>>2];r=d+4|0;p=+g[r>>2];w=d+8|0;o=+g[w>>2];e=d+16|0;m=+g[e>>2];t=d+20|0;k=+g[t>>2];u=d+24|0;h=+g[u>>2];v=c[d+36>>2]|0;q=c[d+40>>2]|0;b=c[(+g[v>>2]<+g[q>>2]?v:q)>>2]|0;c[d>>2]=b;s=c[(+g[v+16>>2]>+g[q+16>>2]?v+16|0:q+16|0)>>2]|0;c[e>>2]=s;e=c[(+g[v+4>>2]<+g[q+4>>2]?v:q)+4>>2]|0;c[r>>2]=e;r=c[(+g[v+20>>2]>+g[q+20>>2]?v+16|0:q+16|0)+4>>2]|0;c[t>>2]=r;t=c[(+g[v+8>>2]<+g[q+8>>2]?v:q)+8>>2]|0;c[w>>2]=t;q=c[(+g[v+24>>2]>+g[q+24>>2]?v+16|0:q+16|0)+8>>2]|0;c[u>>2]=q;b=n!=(c[j>>2]=b,+g[j>>2]);n=(c[j>>2]=t,+g[j>>2]);l=(c[j>>2]=s,+g[j>>2]);i=(c[j>>2]=r,+g[j>>2]);f=(c[j>>2]=q,+g[j>>2]);if(!(b|p!=(c[j>>2]=e,+g[j>>2])|o!=n|m!=l|k!=i|h!=f))break;d=c[d+32>>2]|0;if(!d)break a}return d|0}while(0);w=c[a>>2]|0;return w|0}function Bg(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0;h=l;l=l+16|0;d=+g[a+396>>2]*b;b=+g[a+512>>2];f=c[a+852>>2]|0;if((f|0)<=0){l=h;return}e=0;do{t=c[a+860>>2]|0;j=t+(e*96|0)+20|0;w=c[j>>2]|0;o=c[t+(e*96|0)>>2]|0;z=+g[t+(e*96|0)+4>>2];y=+g[t+(e*96|0)+8>>2];x=+g[t+(e*96|0)+12>>2];i=t+(e*96|0)+76|0;v=+g[w+392>>2];q=+g[t+(e*96|0)+84>>2];A=+g[w+396>>2];m=+g[t+(e*96|0)+80>>2];k=+g[i>>2];n=+g[w+388>>2];s=+g[o+8>>2];r=+g[o+12>>2];p=+g[o+16>>2];u=d*(z*+g[w+4>>2]+y*+g[w+8>>2]+x*+g[w+12>>2]+ +g[w+52>>2]-s)+(b*(v*q-A*m+ +g[w+372>>2])-(s-+g[o+24>>2]));q=d*(z*+g[w+20>>2]+y*+g[w+24>>2]+x*+g[w+28>>2]+ +g[w+56>>2]-r)+(b*(+g[w+376>>2]+(A*k-q*n))-(r-+g[o+28>>2]));k=d*(z*+g[w+36>>2]+y*+g[w+40>>2]+x*+g[w+44>>2]+ +g[w+60>>2]-p)+(b*(m*n-v*k+ +g[w+380>>2])-(p-+g[o+32>>2]));v=+g[t+(e*96|0)+24>>2];n=(u*+g[t+(e*96|0)+28>>2]+q*+g[t+(e*96|0)+32>>2]+ +g[t+(e*96|0)+36>>2]*k)*v;m=(u*+g[t+(e*96|0)+44>>2]+q*+g[t+(e*96|0)+48>>2]+k*+g[t+(e*96|0)+52>>2])*v;k=v*(u*+g[t+(e*96|0)+60>>2]+q*+g[t+(e*96|0)+64>>2]+k*+g[t+(e*96|0)+68>>2]);q=+g[t+(e*96|0)+92>>2];g[o+8>>2]=s+n*q;g[o+12>>2]=q*m+r;g[o+16>>2]=q*k+p;j=c[j>>2]|0;g[h>>2]=-n;g[h+4>>2]=-m;g[h+8>>2]=-k;g[h+12>>2]=0.0;ll(j,h,i);e=e+1|0}while((e|0)!=(f|0));l=h;return}function Cg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0;m=l;l=l+688|0;c[m+568+8>>2]=0;c[m+568+12>>2]=-1;c[m+568+16>>2]=1065353216;c[m+568+20>>2]=1065353216;c[m+568+24>>2]=1065353216;g[m+568+28>>2]=0.0;c[m+568+56>>2]=0;c[m+568>>2]=3924;c[m+568+4>>2]=1;c[m+568+60>>2]=c[d>>2];c[m+568+60+4>>2]=c[d+4>>2];c[m+568+60+8>>2]=c[d+8>>2];c[m+568+60+12>>2]=c[d+12>>2];c[m+568+76>>2]=c[d+16>>2];c[m+568+76+4>>2]=c[d+16+4>>2];c[m+568+76+8>>2]=c[d+16+8>>2];c[m+568+76+12>>2]=c[d+16+12>>2];c[m+568+92>>2]=c[d+32>>2];c[m+568+92+4>>2]=c[d+32+4>>2];c[m+568+92+8>>2]=c[d+32+8>>2];c[m+568+92+12>>2]=c[d+32+12>>2];c[m+568+48>>2]=c[b+204>>2];g[m+208+308>>2]=9.999999747378752e-05;a[m+208+332>>0]=0;c[m+200>>2]=9464;d=c[b+4>>2]|0;c[m+176>>2]=9532;c[m+176+4>>2]=m+208;c[m+176+8>>2]=m+200;c[m+176+12>>2]=d;c[m+176+16>>2]=m+568;c[m+176+20>>2]=0;c[m>>2]=3896;c[m+168>>2]=0;g[m+164>>2]=1.0;c[m+172>>2]=c[b+208>>2];if((Wd(m+176|0,b+8|0,b+72|0,b+136|0,b+136|0,m)|0?(h=+g[m+132>>2],i=+g[m+136>>2],j=+g[m+140>>2],h*h+i*i+j*j>9.999999747378752e-05):0)?(k=+g[m+164>>2],k<+g[b+200>>2]):0){n=1.0/+D(+(h*h+i*i+j*j));g[m+132>>2]=h*n;g[m+136>>2]=i*n;g[m+140>>2]=j*n;+rb[c[(c[b>>2]|0)+12>>2]&3](b,m+132|0,m+148|0,k,e,f)}c[m+568>>2]=7472;b=c[m+568+56>>2]|0;if(!b){l=m;return}Ib[c[c[b>>2]>>2]&511](b);b=c[m+568+56>>2]|0;if(!b){l=m;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);l=m;return}function Dg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=qt()|0;c[h+4>>2]=4;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4996;c[h+552>>2]=c[e>>2];c[h+552+4>>2]=c[e+4>>2];c[h+552+8>>2]=c[e+8>>2];c[h+552+12>>2]=c[e+12>>2];c[h+568>>2]=c[e+16>>2];c[h+568+4>>2]=c[e+16+4>>2];c[h+568+8>>2]=c[e+16+8>>2];c[h+568+12>>2]=c[e+16+12>>2];c[h+584>>2]=c[e+32>>2];c[h+584+4>>2]=c[e+32+4>>2];c[h+584+8>>2]=c[e+32+8>>2];c[h+584+12>>2]=c[e+32+12>>2];c[h+600>>2]=c[e+48>>2];c[h+600+4>>2]=c[e+48+4>>2];c[h+600+8>>2]=c[e+48+8>>2];c[h+600+12>>2]=c[e+48+12>>2];c[h+616>>2]=c[f>>2];c[h+616+4>>2]=c[f+4>>2];c[h+616+8>>2]=c[f+8>>2];c[h+616+12>>2]=c[f+12>>2];c[h+632>>2]=c[f+16>>2];c[h+632+4>>2]=c[f+16+4>>2];c[h+632+8>>2]=c[f+16+8>>2];c[h+632+12>>2]=c[f+16+12>>2];c[h+648>>2]=c[f+32>>2];c[h+648+4>>2]=c[f+32+4>>2];c[h+648+8>>2]=c[f+32+8>>2];c[h+648+12>>2]=c[f+32+12>>2];c[h+664>>2]=c[f+48>>2];c[h+664+4>>2]=c[f+48+4>>2];c[h+664+8>>2]=c[f+48+8>>2];c[h+664+12>>2]=c[f+48+12>>2];g[h+688>>2]=0.0;g[h+692>>2]=-1.0;g[h+696>>2]=.8999999761581421;g[h+700>>2]=.30000001192092896;g[h+704>>2]=1.0;g[h+708>>2]=0.0;g[h+712>>2]=0.0;a[h+716>>0]=0;a[h+736>>0]=0;a[h+737>>0]=0;a[h+738>>0]=0;a[h+739>>0]=1;a[h+740>>0]=0;c[h+748>>2]=0;c[h+748+4>>2]=0;c[h+748+8>>2]=0;c[h+748+12>>2]=0;c[h+748+16>>2]=0;g[h+732>>2]=1.0;return h|0}function Eg(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0;d=c[a+772>>2]|0;if((d|0)>0){b=0;do{l=(c[a+780>>2]|0)+(b*104|0)+72|0;b=b+1|0;c[l>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0}while((b|0)!=(d|0))}d=c[a+812>>2]|0;if((d|0)>0){b=0;do{o=c[a+820>>2]|0;j=c[o+(b*44|0)+12>>2]|0;h=c[o+(b*44|0)+8>>2]|0;k=+g[h+8>>2];e=+g[j+8>>2]-k;f=+g[h+12>>2];i=+g[j+12>>2]-f;m=+g[h+16>>2];n=+g[j+16>>2]-m;l=c[o+(b*44|0)+16>>2]|0;k=+g[l+8>>2]-k;f=+g[l+12>>2]-f;m=+g[l+16>>2]-m;p=1.0/+D(+((e*f-i*k)*(e*f-i*k)+((i*m-n*f)*(i*m-n*f)+(n*k-e*m)*(n*k-e*m))));g[o+(b*44|0)+20>>2]=p*(i*m-n*f);g[o+(b*44|0)+24>>2]=p*(n*k-e*m);g[o+(b*44|0)+28>>2]=(e*f-i*k)*p;c[o+(b*44|0)+32>>2]=0;g[h+72>>2]=i*m-n*f+ +g[h+72>>2];g[h+76>>2]=n*k-e*m+ +g[h+76>>2];g[h+80>>2]=e*f-i*k+ +g[h+80>>2];g[j+72>>2]=i*m-n*f+ +g[j+72>>2];g[j+76>>2]=n*k-e*m+ +g[j+76>>2];g[j+80>>2]=e*f-i*k+ +g[j+80>>2];g[l+72>>2]=i*m-n*f+ +g[l+72>>2];g[l+76>>2]=n*k-e*m+ +g[l+76>>2];g[l+80>>2]=e*f-i*k+ +g[l+80>>2];b=b+1|0}while((b|0)!=(d|0))}l=c[a+772>>2]|0;if((l|0)<=0)return;a=c[a+780>>2]|0;b=0;do{h=a+(b*104|0)+72|0;i=+g[h>>2];j=a+(b*104|0)+76|0;k=+g[j>>2];d=a+(b*104|0)+80|0;e=+g[d>>2];f=+D(+(i*i+k*k+e*e));if(f>1.1920928955078125e-07){g[h>>2]=i*(1.0/f);g[j>>2]=1.0/f*k;g[d>>2]=1.0/f*e}b=b+1|0}while((b|0)!=(l|0));return}function Fg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=ht()|0;c[h+4>>2]=5;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4940;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[e+16>>2];c[h+316+4>>2]=c[e+16+4>>2];c[h+316+8>>2]=c[e+16+8>>2];c[h+316+12>>2]=c[e+16+12>>2];c[h+332>>2]=c[e+32>>2];c[h+332+4>>2]=c[e+32+4>>2];c[h+332+8>>2]=c[e+32+8>>2];c[h+332+12>>2]=c[e+32+12>>2];c[h+348>>2]=c[e+48>>2];c[h+348+4>>2]=c[e+48+4>>2];c[h+348+8>>2]=c[e+48+8>>2];c[h+348+12>>2]=c[e+48+12>>2];c[h+364>>2]=c[f>>2];c[h+364+4>>2]=c[f+4>>2];c[h+364+8>>2]=c[f+8>>2];c[h+364+12>>2]=c[f+12>>2];c[h+380>>2]=c[f+16>>2];c[h+380+4>>2]=c[f+16+4>>2];c[h+380+8>>2]=c[f+16+8>>2];c[h+380+12>>2]=c[f+16+12>>2];c[h+396>>2]=c[f+32>>2];c[h+396+4>>2]=c[f+32+4>>2];c[h+396+8>>2]=c[f+32+8>>2];c[h+396+12>>2]=c[f+32+12>>2];c[h+412>>2]=c[f+48>>2];c[h+412+4>>2]=c[f+48+4>>2];c[h+412+8>>2]=c[f+48+8>>2];c[h+412+12>>2]=c[f+48+12>>2];a[h+552>>0]=0;c[h+524>>2]=0;g[h+572>>2]=-1.0;g[h+444>>2]=999999984306749440.0;g[h+448>>2]=999999984306749440.0;g[h+452>>2]=999999984306749440.0;g[h+428>>2]=1.0;g[h+432>>2]=.30000001192092896;g[h+436>>2]=1.0;g[h+440>>2]=.009999999776482582;g[h+456>>2]=.05000000074505806;c[h+592>>2]=0;g[h+596>>2]=0.0;g[h+600>>2]=.699999988079071;g[h+604>>2]=0.0;return h|0}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;e=+g[d+128>>2];if(!(e!=0.0)){i=0.0;return +i}c[5961]=(c[5961]|0)+1;k=+g[d+96>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=e-k*+g[d+116>>2]-(f*+g[a+144>>2]+h*+g[a+148>>2]+i*+g[a+152>>2]+(+g[d>>2]*+g[a+160>>2]+ +g[d+4>>2]*+g[a+164>>2]+ +g[d+8>>2]*+g[a+168>>2]))*j-j*(+g[d+48>>2]*+g[b+144>>2]+ +g[d+52>>2]*+g[b+148>>2]+ +g[d+56>>2]*+g[b+152>>2]+(+g[d+32>>2]*+g[b+160>>2]+ +g[d+36>>2]*+g[b+164>>2]+ +g[d+40>>2]*+g[b+168>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+144>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+144>>2];g[a+148>>2]=l+ +g[a+148>>2];g[a+152>>2]=k+ +g[a+152>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+160>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+160>>2];g[a+164>>2]=k+ +g[a+164>>2];g[a+168>>2]=l+ +g[a+168>>2]}if(!(c[b+240>>2]|0)){l=e;return +l}l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+144>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+144>>2];g[b+148>>2]=l+ +g[b+148>>2];g[b+152>>2]=k+ +g[b+152>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+160>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+160>>2];g[b+164>>2]=k+ +g[b+164>>2];g[b+168>>2]=l+ +g[b+168>>2];l=e;return +l}function Hg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=+f;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+16|0;c[b>>2]=5168;a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[b+8>>2]=d;c[b+256>>2]=0;c[b+260>>2]=0;c[b+264>>2]=1065353216;g[b+268>>2]=0.0;c[b+272>>2]=0;c[b+276>>2]=0;c[b+280>>2]=1065353216;g[b+284>>2]=0.0;g[b+64>>2]=.019999999552965164;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;c[b+100>>2]=0;c[b+100+4>>2]=0;c[b+100+8>>2]=0;c[b+100+12>>2]=0;a[b+250>>0]=1;g[b+56>>2]=0.0;c[b+12>>2]=e;a[b+251>>0]=1;g[b+252>>2]=0.0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;g[b+52>>2]=29.399999618530273;g[b+28>>2]=55.0;g[b+32>>2]=10.0;g[b+36>>2]=10.0;a[b+248>>0]=0;a[b+249>>0]=0;a[b+288>>0]=1;g[b+148>>2]=0.0;g[b+16>>2]=.20000000298023224;a[b+289>>0]=0;a[b+290>>0]=0;g[b+240>>2]=0.0;g[b+244>>2]=0.0;k=+g[h>>2];m=+g[h+4>>2];n=+g[h+8>>2];if(!(k*k+m*m+n*n>0.0)){ve(b,h);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}i=1.0/+D(+(k*k+m*m+n*n));j=n*i*-29.399999618530273*n*i*-29.399999618530273+(k*i*-29.399999618530273*k*i*-29.399999618530273+m*i*-29.399999618530273*m*i*-29.399999618530273);if(j>0.0){g[o>>2]=-(k*i*-29.399999618530273);g[o+4>>2]=-(m*i*-29.399999618530273);g[o+8>>2]=-(n*i*-29.399999618530273);g[o+12>>2]=0.0;ve(b,o)}g[b+52>>2]=+D(+j);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}function Ig(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=+g[d+100>>2];j=+g[d+16>>2];k=+g[d+20>>2];l=+g[d+24>>2];h=+g[d+108>>2];h=+g[d+112>>2]-f*+g[d+116>>2]-(j*+g[a+64>>2]+k*+g[a+68>>2]+l*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*h-h*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));e=+g[d+120>>2];if(!(f+h>2];if(f+h>e)i=e-f;else{i=h;e=f+h}}else i=e-f;g[d+100>>2]=e;if(c[a+240>>2]|0){h=i*k*+g[a+132>>2]*+g[a+116>>2];k=i*l*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*i*j*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=h+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=i*+g[a+100>>2]*+g[d+68>>2];l=i*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=i*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +i;l=i*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=i*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*i*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=i*+g[b+100>>2]*+g[d+84>>2];l=i*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=i*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +i}function Jg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6415]=(c[6415]|0)+1;k=(((e<<16|d)+~((e<<16|d)<<15)|0)>>>10^(e<<16|d)+~((e<<16|d)<<15))*9|0;k=((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11);l=c[b+12>>2]|0;f=c[(c[b+36>>2]|0)+((l+-1&k)<<2)>>2]|0;a:do if((f|0)!=-1){h=c[b+16>>2]|0;while(1){g=h+(f*12|0)|0;if((c[g>>2]|0)==(d|0)?(c[h+(f*12|0)+4>>2]|0)==(e|0):0)break;f=c[(c[b+56>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}if(g|0){e=g;return e|0}}while(0);j=c[b+8>>2]|0;if((j|0)==(l|0)){h=l|0?l<<1:1;if((l|0)<(h|0)){if(!h){f=0;i=l}else{c[6995]=(c[6995]|0)+1;f=sc((h*12|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+8>>2]|0}if((i|0)>0){g=0;do{m=f+(g*12|0)|0;n=(c[b+16>>2]|0)+(g*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];g=g+1|0}while((g|0)!=(i|0))}g=c[b+16>>2]|0;if(g|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=h;f=c[b+8>>2]|0}else{f=l;h=l}}else{f=j;h=l}c[b+8>>2]=f+1;g=c[b+16>>2]|0;if((l|0)<(h|0)){Nf(b);f=(c[b+12>>2]|0)+-1&k}else f=l+-1&k;c[g+(j*12|0)>>2]=d;c[g+(j*12|0)+4>>2]=e;c[g+(j*12|0)+8>>2]=0;n=(c[b+36>>2]|0)+(f<<2)|0;c[(c[b+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;n=g+(j*12|0)|0;return n|0}function Kg(b){b=b|0;var d=0;d=Us(676)|0;c[d>>2]=5320;c[d+132>>2]=0;c[d+132+4>>2]=0;c[d+132+8>>2]=0;c[d+132+12>>2]=0;c[d+132+16>>2]=0;c[d+132+20>>2]=0;c[d+132+24>>2]=0;c[d+132+28>>2]=0;c[d+164>>2]=1065353216;c[d+168>>2]=1065353216;c[d+172>>2]=1065353216;g[d+176>>2]=0.0;c[d+180>>2]=0;g[d+184>>2]=999999984306749440.0;c[d+188>>2]=0;c[d+188+4>>2]=0;c[d+188+8>>2]=0;c[d+188+12>>2]=0;c[d+204>>2]=1;c[d+208>>2]=-1;c[d+212>>2]=-1;c[d+216>>2]=-1;c[d+220>>2]=1;g[d+224>>2]=0.0;g[d+228>>2]=.5;g[d+232>>2]=0.0;g[d+236>>2]=0.0;g[d+240>>2]=0.0;g[d+244>>2]=.10000000149011612;g[d+248>>2]=1.0e4;c[d+252>>2]=1;c[d+256>>2]=0;c[d+260>>2]=-1;c[d+264>>2]=-1;g[d+268>>2]=1.0;g[d+272>>2]=0.0;g[d+276>>2]=0.0;c[d+280>>2]=0;a[d+300>>0]=1;c[d+296>>2]=0;c[d+288>>2]=0;c[d+292>>2]=0;c[d+304>>2]=0;c[d+4>>2]=1065353216;c[d+8>>2]=0;c[d+8+4>>2]=0;c[d+8+8>>2]=0;c[d+8+12>>2]=0;c[d+24>>2]=1065353216;c[d+28>>2]=0;c[d+28+4>>2]=0;c[d+28+8>>2]=0;c[d+28+12>>2]=0;c[d+44>>2]=1065353216;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;c[d+48+16>>2]=0;c[d+68>>2]=1065353216;c[d+72>>2]=0;c[d+72+4>>2]=0;c[d+72+8>>2]=0;c[d+72+12>>2]=0;c[d+88>>2]=1065353216;c[d+92>>2]=0;c[d+92+4>>2]=0;c[d+92+8>>2]=0;c[d+92+12>>2]=0;c[d+108>>2]=1065353216;c[d+112>>2]=0;c[d+112+4>>2]=0;c[d+112+8>>2]=0;c[d+112+12>>2]=0;c[d+112+16>>2]=0;c[d>>2]=4324;a[d+560>>0]=1;c[d+556>>2]=0;c[d+548>>2]=0;c[d+552>>2]=0;Id(d,b);return d|0}function Lg(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;c[6995]=(c[6995]|0)+1;b=sc((h+2|0)>>>0>268435455?18:(h+2<<4|3)+16|0)|0;if(!b)j=0;else{c[(b+4+15&-16)+-4>>2]=b;j=b+4+15&-16}k=$I((h+2|0)>>>0>1073741823?-1:h+2<<2)|0;if((h|0)>-2){b=0;do{p=+(b|0)/+(h+1|0);o=+g[e>>2];n=+g[e+4>>2];n=n+p*(+g[f+4>>2]-n);m=+g[e+8>>2];m=m+p*(+g[f+8>>2]-m);g[j+(b<<4)>>2]=o+p*(+g[f>>2]-o);g[j+(b<<4)+4>>2]=n;g[j+(b<<4)+8>>2]=m;g[j+(b<<4)+12>>2]=0.0;g[k+(b<<2)>>2]=1.0;b=b+1|0}while((b|0)<(h+2|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)l=0;else{c[(b+4+15&-16)+-4>>2]=b;l=b+4+15&-16}Bc(l,d,h+2|0,j,k);if(i&1|0){g[(c[l+780>>2]|0)+88>>2]=0.0;a[l+984>>0]=1}if(i&2|0){g[(c[l+780>>2]|0)+((h+1|0)*104|0)+88>>2]=0.0;a[l+984>>0]=1}if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}aJ(k);if((h+2|0)<=1)return l|0;j=l+780|0;k=l+792|0;e=l+800|0;f=l+984|0;b=1;do{r=b+-1|0;q=c[j>>2]|0;Xh(l,0);i=(c[k>>2]|0)+-1|0;d=c[e>>2]|0;c[d+(i*52|0)+24>>2]=q+(r*104|0);c[d+(i*52|0)+28>>2]=q+(b*104|0);n=+g[q+(r*104|0)+8>>2]-+g[q+(b*104|0)+8>>2];o=+g[q+(r*104|0)+12>>2]-+g[q+(b*104|0)+12>>2];p=+g[q+(r*104|0)+16>>2]-+g[q+(b*104|0)+16>>2];g[d+(i*52|0)+32>>2]=+D(+(n*n+o*o+p*p));a[f>>0]=1;b=b+1|0}while((b|0)!=(h+2|0));return l|0}function Mg(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0;if(a[b+1308>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);c[d>>2]=0;c[d+4>>2]=6;if((c[b+856>>2]|0)==0?(a[b+788>>0]|0)==0:0){e=0;f=6}else{c[d>>2]=1;c[d+4>>2]=5;e=1;f=5}if(!((c[b+860>>2]|0)==0?(a[b+789>>0]|0)==0:0)){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}if((c[b+864>>2]|0)==0?(a[b+790>>0]|0)==0:0)n=0;else{e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f;n=0}do{k=+g[b+868+(n<<6)>>2];l=+g[b+868+(n<<6)+4>>2];m=+Xj(+g[b+1192+(n<<2)>>2],k,l);g[b+868+(n<<6)+52>>2]=m;do if(!(k>l)){if(k>m){c[b+868+(n<<6)+56>>2]=1;h=b+868+(n<<6)+48|0;g[h>>2]=m-k;if(!(m-k>3.1415927410125732))if(m-k<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-k+i;j=18;break}h=b+868+(n<<6)+56|0;if(l>2]=2;h=b+868+(n<<6)+48|0;g[h>>2]=m-l;if(!(m-l>3.1415927410125732))if(m-l<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-l+i;j=18}else j=17}else{h=b+868+(n<<6)+56|0;j=17}while(0);if((j|0)==17){j=0;c[h>>2]=0;if(a[b+868+(n<<6)+44>>0]|0)j=18}if((j|0)==18){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}n=n+1|0}while((n|0)!=3);return}function Ng(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;k=+g[d+100>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=+g[d+112>>2]-k*+g[d+116>>2]-(f*+g[a+64>>2]+h*+g[a+68>>2]+i*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*j-j*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=l+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +e;l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +e}function Og(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;g=c[b+8>>2]|0;c[d+216>>2]=g;if((g|0)==(c[b+12>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+8>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+16>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+16>>2]|0;if(h){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=i;c[b+12>>2]=j}c[(c[b+16>>2]|0)+(g<<2)>>2]=d;c[b+8>>2]=g+1;c[k+32>>2]=c[d+4>>2];c[k+32+4>>2]=c[d+4+4>>2];c[k+32+8>>2]=c[d+4+8>>2];c[k+32+12>>2]=c[d+4+12>>2];c[k+32+16>>2]=c[d+20>>2];c[k+32+16+4>>2]=c[d+20+4>>2];c[k+32+16+8>>2]=c[d+20+8>>2];c[k+32+16+12>>2]=c[d+20+12>>2];c[k+32+32>>2]=c[d+36>>2];c[k+32+32+4>>2]=c[d+36+4>>2];c[k+32+32+8>>2]=c[d+36+8>>2];c[k+32+32+12>>2]=c[d+36+12>>2];c[k+32+48>>2]=c[d+52>>2];c[k+32+48+4>>2]=c[d+52+4>>2];c[k+32+48+8>>2]=c[d+52+8>>2];c[k+32+48+12>>2]=c[d+52+12>>2];j=c[d+192>>2]|0;Vb[c[(c[j>>2]|0)+8>>2]&127](j,k+32|0,k+16|0,k);j=c[b+68>>2]|0;c[d+188>>2]=Fb[c[(c[j>>2]|0)+8>>2]&3](j,k+16|0,k,c[(c[d+192>>2]|0)+4>>2]|0,d,e,f,c[b+24>>2]|0)|0;l=k;return}function Pg(){var b=0;b=Us(344)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=5356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;return b|0}function Qg(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=4360;if(a[b+288>>0]|0?(d=c[b+220>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+220>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+212>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+212>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}if(a[b+289>>0]|0?(f=c[b+216>>2]|0,Ib[c[c[f>>2]>>2]&511](f),f=c[b+216>>2]|0,f|0):0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}d=c[b+332>>2]|0;if(d|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;d=c[b+304>>2]|0;if(d|0){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;d=c[b+256>>2]|0;if(d|0){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;d=c[b+236>>2]|0;if(d|0){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;d=c[b+204>>2]|0;if(!d){a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}function Rg(a,b,d,e,f,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=+j;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;c[a>>2]=c[h>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];s=+g[e+4>>2];v=+g[a+8>>2];w=+g[e+8>>2];p=+g[a+4>>2];m=+g[a>>2];r=+g[e>>2];u=(s*v-w*p)*+g[b>>2]+ +g[b+4>>2]*(w*m-v*r)+(p*r-s*m)*+g[b+8>>2];t=(s*v-w*p)*+g[b+16>>2]+(w*m-v*r)*+g[b+20>>2]+(p*r-s*m)*+g[b+24>>2];s=(s*v-w*p)*+g[b+32>>2]+(w*m-v*r)*+g[b+36>>2]+(p*r-s*m)*+g[b+40>>2];g[a+16>>2]=u;g[a+20>>2]=t;g[a+24>>2]=s;g[a+28>>2]=0.0;r=+g[f+4>>2];w=+g[f+8>>2];n=+g[f>>2];q=+g[d>>2]*(r*-v-w*-p)+ +g[d+4>>2]*(w*-m-n*-v)+(n*-p-r*-m)*+g[d+8>>2];o=(r*-v-w*-p)*+g[d+16>>2]+(w*-m-n*-v)*+g[d+20>>2]+(n*-p-r*-m)*+g[d+24>>2];m=(r*-v-w*-p)*+g[d+32>>2]+(w*-m-n*-v)*+g[d+36>>2]+(n*-p-r*-m)*+g[d+40>>2];g[a+32>>2]=q;g[a+36>>2]=o;g[a+40>>2]=m;g[a+44>>2]=0.0;u=+g[i>>2]*u;t=+g[i+4>>2]*t;s=+g[i+8>>2]*s;g[a+48>>2]=u;g[a+52>>2]=t;g[a+56>>2]=s;g[a+60>>2]=0.0;r=+g[k>>2]*q;p=+g[k+4>>2]*o;n=+g[k+8>>2]*m;g[a+64>>2]=r;g[a+68>>2]=p;g[a+72>>2]=n;g[a+76>>2]=0.0;g[a+80>>2]=u*+g[a+16>>2]+t*+g[a+20>>2]+s*+g[a+24>>2]+j+l+(r*q+p*o+n*m);return}function Sg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6414]=(c[6414]|0)+1;h=(((d<<16|b)+~((d<<16|b)<<15)|0)>>>10^(d<<16|b)+~((d<<16|b)<<15))*9|0;m=c[a+36>>2]|0;h=m+(((c[a+12>>2]|0)+-1&(((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11)))<<2)|0;g=c[h>>2]|0;if((g|0)==-1){n=0;return n|0}n=c[a+16>>2]|0;e=g;while(1){l=n+(e*12|0)|0;if((c[l>>2]|0)==(b|0)?(c[n+(e*12|0)+4>>2]|0)==(d|0):0)break;e=c[(c[a+56>>2]|0)+(e<<2)>>2]|0;if((e|0)==-1){e=0;f=13;break}}if((f|0)==13)return e|0;if(!l){n=0;return n|0}k=c[n+(e*12|0)+8>>2]|0;j=(e*12|0)/12|0;i=c[a+56>>2]|0;if((g|0)==(j|0))e=-1;else{e=g;while(1){b=c[i+(e<<2)>>2]|0;if((b|0)==(j|0))break;else e=b}}c[((e|0)==-1?h:i+(e<<2)|0)>>2]=c[i+(j<<2)>>2];f=(c[a+8>>2]|0)+-1|0;if((f|0)==(j|0)){c[a+8>>2]=j;n=k;return n|0}g=c[n+(f*12|0)+4>>2]<<16|c[n+(f*12|0)>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;b=g;d=-1;e=m;while(1){e=c[e+(b<<2)>>2]|0;if((e|0)==(f|0))break;else{b=e;d=e;e=i}}c[((d|0)==-1?m+(g<<2)|0:i+(d<<2)|0)>>2]=c[i+(f<<2)>>2];c[l>>2]=c[n+(f*12|0)>>2];c[l+4>>2]=c[n+(f*12|0)+4>>2];c[l+8>>2]=c[n+(f*12|0)+8>>2];n=(c[a+36>>2]|0)+(g<<2)|0;c[(c[a+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;c[a+8>>2]=(c[a+8>>2]|0)+-1;n=k;return n|0}function Tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;h=l;l=l+64|0;a[d+84>>0]=0;c[h>>2]=c[b+4>>2];c[h+4>>2]=c[b+4+4>>2];c[h+8>>2]=c[b+4+8>>2];c[h+12>>2]=c[b+4+12>>2];c[h+16>>2]=c[b+20>>2];c[h+16+4>>2]=c[b+20+4>>2];c[h+16+8>>2]=c[b+20+8>>2];c[h+16+12>>2]=c[b+20+12>>2];c[h+32>>2]=c[b+36>>2];c[h+32+4>>2]=c[b+36+4>>2];c[h+32+8>>2]=c[b+36+8>>2];c[h+32+12>>2]=c[b+36+12>>2];c[h+48>>2]=c[b+52>>2];c[h+48+4>>2]=c[b+52+4>>2];c[h+48+8>>2]=c[b+52+8>>2];c[h+48+12>>2]=c[b+52+12>>2];if(e?(f=c[b+540>>2]|0,f|0):0)Ob[c[(c[f>>2]|0)+8>>2]&127](f,h);w=+g[d+156>>2];u=+g[h>>2];v=+g[d+160>>2];t=+g[h+4>>2];o=+g[d+164>>2];s=+g[h+8>>2];r=+g[h+16>>2];q=+g[h+20>>2];p=+g[h+24>>2];n=+g[h+32>>2];k=+g[h+36>>2];i=+g[h+40>>2];m=w*r+v*q+o*p+ +g[h+52>>2];j=w*n+v*k+o*i+ +g[h+56>>2];g[d+36>>2]=w*u+v*t+o*s+ +g[h+48>>2];g[d+40>>2]=m;g[d+44>>2]=j;g[d+48>>2]=0.0;j=+g[d+172>>2];m=+g[d+176>>2];o=+g[d+180>>2];g[d+52>>2]=u*j+t*m+s*o;g[d+56>>2]=j*r+m*q+o*p;g[d+60>>2]=j*n+m*k+o*i;g[d+64>>2]=0.0;o=+g[d+188>>2];m=+g[d+192>>2];j=+g[d+196>>2];g[d+68>>2]=u*o+t*m+s*j;g[d+72>>2]=o*r+m*q+j*p;g[d+76>>2]=o*n+m*k+j*i;g[d+80>>2]=0.0;l=h;return}function Ug(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=((e|0)<0)<<31>>31;break a}case 11:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=0;break a}case 12:{f=(c[d>>2]|0)+(8-1)&~(8-1);b=c[f>>2]|0;e=c[f+4>>2]|0;c[d>>2]=f+8;c[a>>2]=b;c[a+4>>2]=e;break a}case 13:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&65535)<<16>>16;c[a+4>>2]=(((f&65535)<<16>>16|0)<0)<<31>>31;break a}case 14:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&65535;c[a+4>>2]=0;break a}case 15:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&255)<<24>>24;c[a+4>>2]=(((f&255)<<24>>24|0)<0)<<31>>31;break a}case 16:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&255;c[a+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function Vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0;w=l;l=l+2048|0;if((e|0)>0)f=0;else{l=w;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));p=0;do{if((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)>0){q=b+(p<<4)|0;r=b+(p<<4)+4|0;s=b+(p<<4)+8|0;t=d+(p<<4)+12|0;u=d+(p<<4)|0;o=0;do{if(((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0)<128){f=(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0;if((f|0)>0)v=10;else{i=-3402823466385288598117041.0e14;f=-1}}else{f=128;v=10}if((v|0)==10){v=0;h=0;do{Sb[c[(c[a>>2]|0)+108>>2]&127](a,h,w+(h<<4)|0);h=h+1|0}while((h|0)!=(f|0));k=+g[q>>2];m=+g[r>>2];n=+g[s>>2];h=-1;j=0;i=-3402823466385288598117041.0e14;do{x=k*+g[w+(j<<4)>>2]+m*+g[w+(j<<4)+4>>2]+n*+g[w+(j<<4)+8>>2];y=x>i;h=y?j:h;i=y?x:i;j=j+1|0}while((j|0)!=(f|0));f=h}if(i>+g[t>>2]){y=w+(f<<4)|0;c[u>>2]=c[y>>2];c[u+4>>2]=c[y+4>>2];c[u+8>>2]=c[y+8>>2];c[u+12>>2]=c[y+12>>2];g[t>>2]=i}o=o+128|0}while((o|0)<(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0))}p=p+1|0}while((p|0)!=(e|0));l=w;return}function Wg(b,d){b=b|0;d=d|0;var e=0;e=ht()|0;Ij(e,5,b);c[e>>2]=4940;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];c[e+316>>2]=c[d+16>>2];c[e+316+4>>2]=c[d+16+4>>2];c[e+316+8>>2]=c[d+16+8>>2];c[e+316+12>>2]=c[d+16+12>>2];c[e+332>>2]=c[d+32>>2];c[e+332+4>>2]=c[d+32+4>>2];c[e+332+8>>2]=c[d+32+8>>2];c[e+332+12>>2]=c[d+32+12>>2];c[e+348>>2]=c[d+48>>2];c[e+348+4>>2]=c[d+48+4>>2];c[e+348+8>>2]=c[d+48+8>>2];c[e+348+12>>2]=c[d+48+12>>2];a[e+527>>0]=0;c[e+364>>2]=c[e+300>>2];c[e+364+4>>2]=c[e+300+4>>2];c[e+364+8>>2]=c[e+300+8>>2];c[e+364+12>>2]=c[e+300+12>>2];c[e+380>>2]=c[e+316>>2];c[e+380+4>>2]=c[e+316+4>>2];c[e+380+8>>2]=c[e+316+8>>2];c[e+380+12>>2]=c[e+316+12>>2];c[e+396>>2]=c[e+332>>2];c[e+396+4>>2]=c[e+332+4>>2];c[e+396+8>>2]=c[e+332+8>>2];c[e+396+12>>2]=c[e+332+12>>2];a[e+524>>0]=0;a[e+525>>0]=0;a[e+526>>0]=0;a[e+552>>0]=0;c[e+412>>2]=0;c[e+412+4>>2]=0;c[e+412+8>>2]=0;c[e+412+12>>2]=0;g[e+572>>2]=-1.0;g[e+444>>2]=999999984306749440.0;g[e+448>>2]=999999984306749440.0;g[e+452>>2]=999999984306749440.0;g[e+428>>2]=1.0;g[e+432>>2]=.30000001192092896;g[e+436>>2]=1.0;g[e+440>>2]=.009999999776482582;g[e+456>>2]=.05000000074505806;c[e+592>>2]=0;g[e+596>>2]=0.0;g[e+600>>2]=.699999988079071;g[e+604>>2]=0.0;return e|0}function Xg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;p=c[a+100>>2]|0;if((p|0)>0){n=0;do{t=c[a+108>>2]|0;s=+g[t+(n<<4)>>2]*+g[a+16>>2];q=+g[t+(n<<4)+4>>2]*+g[a+20>>2];o=+g[t+(n<<4)+8>>2]*+g[a+24>>2];k=s*+g[b>>2]+q*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+q*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+q*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];q=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(q<+g[e>>2]){g[e>>2]=q;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(q>+g[f>>2]){g[f>>2]=q;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(p|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function Yg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+48|0;e=(c[a+52>>2]|0)+4|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];b=d+32+4|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;g[d+32>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+36>>2]=+g[d+16>>2]+ +g[a+16>>2];g[d+32>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+20>>2]=+g[d+16>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[b>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+40>>2]=+g[d+16+4>>2]+ +g[a+16>>2];g[b>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+24>>2]=+g[d+16+4>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[d+32+8>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+44>>2]=+g[d+16+8>>2]+ +g[a+16>>2];g[d+32+8>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+28>>2]=+g[d+16+8>>2]-+g[a+16>>2];l=d;return}function Zg(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+156>>2]|0;c[b+156>>2]=f+1;a[b+152>>0]=(f|0)>=(c[b+160>>2]|0)&1;if(f|0){c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+72+16>>2]=0;c[b+72+20>>2]=0;c[b+72+24>>2]=0;c[b+72+28>>2]=0;return}j=+g[b+64>>2];i=1.0/d*+g[b+72>>2]*j;h=1.0/d*j*+g[b+76>>2];d=1.0/d*j*+g[b+80>>2];g[b+72>>2]=i;g[b+76>>2]=h;g[b+80>>2]=d;g[b+84>>2]=0.0;j=+g[b+68>>2];if(j>0.0){l=j*i*+g[b+120>>2]+j*h*+g[b+124>>2]+j*d*+g[b+128>>2];k=j*i*+g[b+136>>2]+j*h*+g[b+140>>2]+j*d*+g[b+144>>2];g[b+88>>2]=j*i*+g[b+104>>2]+j*h*+g[b+108>>2]+j*d*+g[b+112>>2];g[b+92>>2]=l;g[b+96>>2]=k;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-j)*i;g[b+76>>2]=(1.0-j)*h;g[b+80>>2]=(1.0-j)*d;i=(1.0-j)*i;h=(1.0-j)*h;d=(1.0-j)*d}g[b+72>>2]=1.0/+(e|0)*i;g[b+76>>2]=1.0/+(e|0)*h;g[b+80>>2]=1.0/+(e|0)*d;return}function _g(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0;n=l;l=l+16|0;if((f|0)>-3&(f+3|0)>-1){c[6995]=(c[6995]|0)+1;a=sc((f+3<<4|3)+16|0)|0;if(!a)m=0;else{c[(a+4+15&-16)+-4>>2]=a;m=a+4+15&-16}a=0;do{j=m+(a<<4)|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];a=a+1|0}while((a|0)!=(f+3|0));i=0;j=m;while(1){if(!i)h=0.0;else{a=i;h=0.0;k=.5;while(1){h=(a&1|0)==0?h:h+k;a=a>>1;if(!a)break;else k=k*.5}}k=h*2.0+-1.0;o=(+(i<<1|0)*3.1415927410125732+3.1415927410125732)/+(f+3|0);p=+D(+(1.0-k*k));h=p*+G(+o);g[j>>2]=p*+F(+o);g[j+4>>2]=h;g[j+8>>2]=k;g[j+12>>2]=0.0;i=i+1|0;if((i|0)==(f+3|0)){j=m;i=m;break}else j=j+16|0}}else{j=0;i=0}if((f|0)>-3){a=0;do{r=j+(a<<4)|0;q=j+(a<<4)+4|0;m=j+(a<<4)+8|0;o=+g[q>>2]*+g[e+4>>2]+ +g[d+4>>2];p=+g[m>>2]*+g[e+8>>2]+ +g[d+8>>2];g[r>>2]=+g[r>>2]*+g[e>>2]+ +g[d>>2];g[q>>2]=o;g[m>>2]=p;g[j+(a<<4)+12>>2]=0.0;a=a+1|0}while((a|0)<(f+3|0))}a=ic(b,j,f+3|0,1)|0;if((j|0)==0|(i|0)==0){l=n;return a|0}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);l=n;return a|0}function $g(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0;Dl(a+1028|0);if((c[a+812>>2]|0)<=0)return;f=0;do{p=c[a+820>>2]|0;q=p+(f*44|0)|0;d=c[p+(f*44|0)+8>>2]|0;e=c[p+(f*44|0)+12>>2]|0;b=c[p+(f*44|0)+16>>2]|0;m=+g[d+8>>2];n=+g[d+12>>2];o=+g[d+16>>2];i=+g[d+20>>2];u=+g[e+8>>2];j=u>2];k=r>2];l=s>2];h=t>2];j=t>2];k=s>2];l=r>2];h=u>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}d=b;e=d+44|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0))}else c[a+1032>>2]=0;c[b+32>>2]=0;c[b+36>>2]=q;c[b+40>>2]=0;g[b>>2]=j;g[b+4>>2]=k;g[b+8>>2]=l;g[b+12>>2]=h;g[b+16>>2]=m;g[b+20>>2]=n;g[b+24>>2]=o;g[b+28>>2]=i;Pe(a+1028|0,c[a+1028>>2]|0,b);c[a+1040>>2]=(c[a+1040>>2]|0)+1;c[p+(f*44|0)+40>>2]=b;f=f+1|0}while((f|0)<(c[a+812>>2]|0));return}function ah(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=c[a+12>>2]|0;i=c[h+(((d+b|0)/2|0)<<4)>>2]|0;j=c[h+(((d+b|0)/2|0)<<4)+4>>2]|0;k=c[h+(((d+b|0)/2|0)<<4)+8>>2]|0;f=d;e=b;while(1){while(1){g=c[h+(e<<4)+4>>2]|0;if((g|0)>=(j|0)){if((g|0)!=(j|0))break;g=c[h+(e<<4)>>2]|0;if((g|0)>=(i|0)){if((g|0)!=(i|0))break;if((c[h+(e<<4)+8>>2]|0)>=(k|0))break}}e=e+1|0}while(1){g=c[h+(f<<4)+4>>2]|0;if((j|0)>=(g|0)){if((j|0)!=(g|0))break;g=c[h+(f<<4)>>2]|0;if((i|0)>=(g|0)){if((i|0)!=(g|0))break;if((k|0)>=(c[h+(f<<4)+8>>2]|0))break}}f=f+-1|0}if((e|0)<=(f|0)){g=h+(e<<4)|0;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];h=h+(f<<4)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];h=(c[a+12>>2]|0)+(f<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];f=f+-1|0;e=e+1|0}if((e|0)>(f|0))break;h=c[a+12>>2]|0}if((f|0)>(b|0))ah(a,b,f);if((e|0)>=(d|0)){l=m;return}ah(a,e,d);l=m;return}function bh(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;q=c[a+8>>2]|0;if((q|0)>0){n=0;do{t=c[a+16>>2]|0;s=+g[t+(n<<4)>>2];p=+g[t+(n<<4)+4>>2];o=+g[t+(n<<4)+8>>2];k=s*+g[b>>2]+p*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+p*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+p*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];p=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(p<+g[e>>2]){g[e>>2]=p;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(p>+g[f>>2]){g[f>>2]=p;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(q|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function ch(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+548>>2]|0;if((f|0)<=0)return;g=c[a+556>>2]|0;d=0;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){e=25;break}}if((e|0)==25)return;if((d|0)<(f|0))d=0;else return;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}if((f|0)>(d|0)){d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+556>>2]|0)+(f+-1<<2)>>2]=e;c[a+548>>2]=f+-1}g=c[b+28>>2]|0;b=c[b+32>>2]|0;if((g|0)==(a|0)){d=c[a+288>>2]|0;a:do if((d|0)>0){f=c[a+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(b|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[a+296>>2]|0;g=f+(e<<2)|0;b=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[a+296>>2]|0)+(d+-1<<2)>>2]=b;c[a+288>>2]=d+-1;d=d+-1|0}c[a+280>>2]=(d|0)>0&1;return}else{d=c[b+288>>2]|0;b:do if((d|0)>0){f=c[b+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break b;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[b+296>>2]|0;g=f+(e<<2)|0;a=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[b+296>>2]|0)+(d+-1<<2)>>2]=a;c[b+288>>2]=d+-1;d=d+-1|0}c[b+280>>2]=(d|0)>0&1;return}}function dh(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0;j=c[a+28>>2]|0;i=0;e=0.0;f=0.0;h=0.0;a:while(1){switch(i|0){case 0:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 1:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 2:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 3:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 4:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 5:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 6:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 7:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}default:{}}if((j|0)>0){d=c[a+36>>2]|0;b=0;do{if(+g[d+(b*36|0)+32>>2]+(e*+g[d+(b*36|0)+20>>2]+f*+g[d+(b*36|0)+24>>2]+h*+g[d+(b*36|0)+28>>2])>0.0){b=0;d=16;break a}b=b+1|0}while((b|0)<(j|0))}i=i+1|0;if((i|0)>=8){b=1;d=16;break}}if((d|0)==16)return b|0;return 0}function eh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+32|0;j=(a[b+68>>0]|0)!=0;k=j?e:d;j=j?d:e;h=c[k+4>>2]|0;i=c[h+20>>2]|0;g=c[b+52>>2]|0;if((g|0)<(i|0)){if((c[b+56>>2]|0)<(i|0)){if(!i){d=0;f=g}else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}if((f|0)>0){e=0;do{c[d+(e<<2)>>2]=c[(c[b+60>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=d;c[b+56>>2]=i;e=b+60|0}else e=b+60|0;d=g;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0))}c[b+52>>2]=i;if((i|0)<=0){l=m;return}d=0;do{if(!(c[h+68>>2]|0)){e=c[(c[h+28>>2]|0)+(d*80|0)+64>>2]|0;f=c[k+8>>2]|0;g=c[k+12>>2]|0;c[m>>2]=k;c[m+4>>2]=e;c[m+8>>2]=f;c[m+12>>2]=g;c[m+16>>2]=-1;c[m+20>>2]=d;g=c[b+4>>2]|0;g=Db[c[(c[g>>2]|0)+8>>2]&1](g,m,j,c[b+72>>2]|0,1)|0;c[(c[b+60>>2]|0)+(d<<2)>>2]=g}else c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0));l=m;return}function fh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];return 12393}function gh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+32>>2]|0;if(!e)f=0;else f=c[b+40>>2]|0;i=c[b+52>>2]|0;if(!i)g=0;else g=c[b+60>>2]|0;d=c[b+72>>2]|0;if(!d)h=0;else h=c[b+80>>2]|0;j=c[b+8>>2]|0;+wb[c[(c[j>>2]|0)+12>>2]&3](j,f,e,g,i,h,d,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);d=c[b+32>>2]|0;if((d|0)<0){if((c[b+36>>2]|0)<0){e=c[b+40>>2]|0;if(e|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0;if((d|0)<0){if((c[b+56>>2]|0)<0){e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+56>>2]=0}do{c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+52>>2]=0;d=c[b+72>>2]|0;if((d|0)>=0){c[b+72>>2]=0;return}if((c[b+76>>2]|0)<0){e=c[b+80>>2]|0;if(e|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+76>>2]=0}do{c[(c[b+80>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0);c[b+72>>2]=0;return}function hh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)g=0;else{c[(d+4+15&-16)+-4>>2]=d;g=d+4+15&-16}h=g;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;if((c[b+932>>2]|0)>0){i=c[c[b+940>>2]>>2]|0;c[g>>2]=c[i>>2];c[g+4>>2]=c[i+4>>2];c[g+8>>2]=c[i+8>>2];c[g+12>>2]=c[i+12>>2];c[g+16>>2]=c[i+16>>2]}else{c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0}e=c[b+932>>2]|0;if((e|0)!=(c[b+936>>2]|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}i=e|0?e<<1:1;if((e|0)>=(i|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}if(!i)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+932>>2]|0}if((e|0)>0){f=0;do{c[d+(f<<2)>>2]=c[(c[b+940>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+940>>2]|0;if(f){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+932>>2]|0}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=d;c[b+936>>2]=i;i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}function ih(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c[b+4>>2]|0;if((e|0)==(c[b+8>>2]|0)){Of(b,e|0?e<<1:1);e=c[b+4>>2]|0}o=c[b+12>>2]|0;j=o+(e*36|0)+16|0;a[j>>0]=1;k=o+(e*36|0)+12|0;c[k>>2]=0;n=o+(e*36|0)+4|0;c[n>>2]=0;l=o+(e*36|0)+8|0;c[l>>2]=0;p=c[d+4>>2]|0;if((p|0)<=0){c[n>>2]=p;p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)g=0;else{c[(f+4+15&-16)+-4>>2]=f;g=f+4+15&-16}h=c[n>>2]|0;i=c[k>>2]|0;if((h|0)<=0){if(i|0)m=10}else{f=0;do{c[g+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));m=10}if((m|0)==10?a[j>>0]|0:0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[j>>0]=1;c[k>>2]=g;c[l>>2]=p;Yk(g|0,0,p<<2|0)|0;h=c[k>>2]|0;c[n>>2]=p;g=c[d+12>>2]|0;f=0;do{c[h+(f<<2)>>2]=c[g+(f<<2)>>2];f=f+1|0}while((f|0)!=(p|0));p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}function jh(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;k=(a[28564]|0)==0;j=0;do{i=c[(c[b+256>>2]|0)+(j<<2)>>2]|0;a:do if(i){f=c[i+220>>2]|0;b:do switch(f|0){case 4:case 2:{if((f|0)==4)break a;break}default:{o=+g[i+372>>2];n=+g[i+376>>2];m=+g[i+380>>2];l=+g[i+532>>2];if(o*o+n*n+m*m>2],m=+g[i+392>>2],n=+g[i+396>>2],o=+g[i+536>>2],l*l+m*m+n*n>2]=+g[i+224>>2]+d;break b}g[i+224>>2]=0.0;if((f&-2|0)!=4){c[i+220>>2]=0;f=0}}}while(0);h=f&-2;do if(k){if((h|0)!=2?!(+g[i+224>>2]>2.0):0)break;if(c[i+204>>2]&3|0){if((h|0)==4)break a;c[i+220>>2]=2;break a}if((f|0)==1){if((h|0)==4)break a;c[i+220>>2]=3;break a}else{if((f|0)!=2)break a;e=(c[i+304>>2]|0)+2|0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+304>>2]=e;c[i+372>>2]=0;c[i+372+4>>2]=0;c[i+372+8>>2]=0;c[i+372+12>>2]=0;e=c[b+248>>2]|0;break a}}while(0);if((h|0)!=4)c[i+220>>2]=1}while(0);j=j+1|0}while((j|0)<(e|0));return}function kh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,f,h);n=c[h>>2]|0;k=c[h+4>>2]|0;b=c[h+8>>2]|0;l=c[f>>2]|0;o=c[f+4>>2]|0;i=c[f+8>>2]|0;m=+g[d>>2];p=+g[d+4>>2];q=+g[d+8>>2];if(m>0.0)n=(g[j>>2]=(c[j>>2]=n,+g[j>>2])+m,c[j>>2]|0);else l=(g[j>>2]=(c[j>>2]=l,+g[j>>2])+m,c[j>>2]|0);if(p>0.0){d=o;k=(g[j>>2]=(c[j>>2]=k,+g[j>>2])+p,c[j>>2]|0)}else d=(g[j>>2]=(c[j>>2]=o,+g[j>>2])+p,c[j>>2]|0);if(q>0.0)b=(g[j>>2]=(c[j>>2]=b,+g[j>>2])+q,c[j>>2]|0);else i=(g[j>>2]=(c[j>>2]=i,+g[j>>2])+q,c[j>>2]|0);m=+g[e>>2];p=+g[e+4>>2];q=+g[e+8>>2];q=+D(+(m*m+p*p+q*q));q=q*+nb[c[(c[a>>2]|0)+16>>2]&15](a);c[f>>2]=l;c[f+4>>2]=d;c[f+8>>2]=i;g[f+12>>2]=0.0;c[h>>2]=n;c[h+4>>2]=k;c[h+8>>2]=b;g[h+12>>2]=0.0;g[f>>2]=+g[f>>2]-q;g[f+4>>2]=+g[f+4>>2]-q;g[f+8>>2]=+g[f+8>>2]-q;g[h>>2]=q+ +g[h>>2];g[h+4>>2]=q+ +g[h+4>>2];g[h+8>>2]=q+ +g[h+8>>2];return}function lh(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;j=c[b+772>>2]|0;if(e){if((j|0)>0){f=c[b+780>>2]|0;e=0;do{g[f+(e*104|0)+88>>2]=0.0;e=e+1|0}while((e|0)!=(j|0))}i=c[b+812>>2]|0;if((i|0)>0){f=c[b+820>>2]|0;e=0;do{m=c[f+(e*44|0)+8>>2]|0;l=c[f+(e*44|0)+12>>2]|0;k=c[f+(e*44|0)+16>>2]|0;o=+g[m+8>>2];q=+g[m+12>>2];h=+g[m+16>>2];n=+g[l+8>>2]-o;r=+g[l+12>>2]-q;p=+g[l+16>>2]-h;o=+g[k+8>>2]-o;q=+g[k+12>>2]-q;h=+g[k+16>>2]-h;h=+D(+((n*q-r*o)*(n*q-r*o)+((r*h-p*q)*(r*h-p*q)+(p*o-n*h)*(p*o-n*h))));g[m+88>>2]=h+ +g[m+88>>2];g[l+88>>2]=h+ +g[l+88>>2];g[k+88>>2]=h+ +g[k+88>>2];e=e+1|0}while((e|0)!=(i|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=1.0/+g[m>>2];e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;h=0.0;do{r=+g[f+(e*104|0)+88>>2];h=h+(r>0.0?1.0/r:0.0);e=e+1|0}while((e|0)!=(j|0));h=1.0/h*d;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=+g[m>>2]/h;e=e+1|0}while((e|0)!=(j|0));m=b+984|0;a[m>>0]=1;return}function mh(a,b){a=+a;b=+b;var d=0,e=0,f=0,h=0,i=0,k=0,l=0,m=0;l=(g[j>>2]=a,c[j>>2]|0);i=(g[j>>2]=b,c[j>>2]|0);a:do if((i<<1|0)!=0?!((l>>>23&255|0)==255|((QD(b)|0)&2147483647)>>>0>2139095040):0){if(l<<1>>>0<=i<<1>>>0)return +((l<<1|0)==(i<<1|0)?a*0.0:a);if(!(l>>>23&255)){if((l<<9|0)>-1){e=l<<9;d=0;do{d=d+-1|0;e=e<<1}while((e|0)>-1)}else d=0;e=l<<1-d}else{e=l&8388607|8388608;d=l>>>23&255}if(!(i>>>23&255)){if((i<<9|0)>-1){f=0;h=i<<9;do{f=f+-1|0;h=h<<1}while((h|0)>-1)}else f=0;k=f;i=i<<1-f}else{k=i>>>23&255;i=i&8388607|8388608}f=e-i|0;b:do if((d|0)>(k|0)){h=f;f=(f|0)>-1;while(1){if(f)if(!h)break;else e=h;e=e<<1;d=d+-1|0;f=e-i|0;if((d|0)>(k|0)){h=f;f=(f|0)>-1}else{h=(f|0)>-1;break b}}b=a*0.0;break a}else h=(f|0)>-1;while(0);if(h)if(!f){b=a*0.0;break}else e=f;if(e>>>0<8388608)do{e=e<<1;d=d+-1|0}while(e>>>0<8388608);if((d|0)>0)d=e+-8388608|d<<23;else d=e>>>(1-d|0);b=(c[j>>2]=d|l&-2147483648,+g[j>>2])}else m=3;while(0);if((m|0)==3)b=a*b/(a*b);return +b}function nh(b,e,f,h,i,j){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0;if((d[h+55>>0]|0|0)==(e|0)){h=0;return h|0}k=c[5288+(i<<2)>>2]|0;if(+g[h>>2]*+g[f+16>>2]+ +g[h+4>>2]*+g[f+20>>2]+ +g[h+8>>2]*+g[f+24>>2]-+g[h+16>>2]<-9.999999747378752e-06){e=lf(b,c[h+20+(k<<2)>>2]|0,c[h+20+(i<<2)>>2]|0,f,0)|0;if(!e){h=0;return h|0}a[e+52>>0]=i;c[e+32>>2]=h;a[h+52+i>>0]=0;c[h+32+(i<<2)>>2]=e;i=c[j>>2]|0;if(!i)c[j+4>>2]=e;else{a[i+53>>0]=2;c[i+36>>2]=e;a[e+54>>0]=1;c[e+40>>2]=i}c[j>>2]=e;c[j+8>>2]=(c[j+8>>2]|0)+1;h=1;return h|0}i=c[5300+(i<<2)>>2]|0;a[h+55>>0]=e;if(!(nh(b,e,f,c[h+32+(k<<2)>>2]|0,d[h+52+k>>0]|0,j)|0)){h=0;return h|0}if(!(nh(b,e,f,c[h+32+(i<<2)>>2]|0,d[h+52+i>>0]|0,j)|0)){h=0;return h|0}i=c[h+48>>2]|0;if(i|0)c[i+44>>2]=c[h+44>>2];i=c[h+44>>2]|0;if(i|0)c[i+48>>2]=c[h+48>>2];if((c[b+18496>>2]|0)==(h|0))c[b+18496>>2]=c[h+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[h+44>>2]=0;c[h+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=h;c[b+18504>>2]=h;c[b+18508>>2]=(c[b+18508>>2]|0)+1;h=1;return h|0}function oh(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0;a=l;l=l+80|0;o=+g[h+52>>2]-+g[f+52>>2];n=+g[h+56>>2]-+g[f+56>>2];g[a+56>>2]=+g[h+48>>2]-+g[f+48>>2];g[a+56+4>>2]=o;g[a+56+8>>2]=n;g[a+56+12>>2]=0.0;if(Hc(d,f,e,h,a+56|0,a,1)|0){c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=1;l=a;return k|0}if(!(Gd(d,f,e,h,a+56|0,a)|0)){k=0;l=a;return k|0}c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=0;l=a;return k|0}function ph(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0;p=l;l=l+2048|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){n=1.0;m=0.0;h=0.0}else{q=1.0/+D(+(e*e+h*h+f*f));n=e*q;m=h*q;h=f*q}if((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)<=0){l=p;return}k=0;f=-999999984306749440.0;while(1){if(((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0)<128){d=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0;if((d|0)>0)o=8;else{e=-3402823466385288598117041.0e14;d=-1}}else{d=128;o=8}if((o|0)==8){o=0;i=0;do{Sb[c[(c[b>>2]|0)+108>>2]&127](b,i,p+(i<<4)|0);i=i+1|0}while((i|0)!=(d|0));i=-1;j=0;e=-3402823466385288598117041.0e14;do{q=n*+g[p+(j<<4)>>2]+m*+g[p+(j<<4)+4>>2]+h*+g[p+(j<<4)+8>>2];r=q>e;i=r?j:i;e=r?q:e;j=j+1|0}while((j|0)!=(d|0));d=i}if(e>f){r=p+(d<<4)|0;c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2]}else e=f;k=k+128|0;if((k|0)>=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0))break;else f=e}l=p;return}function qh(b){b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0,k=0;k=l;l=l+64|0;if(!(a[b+290>>0]|0)){d=c[b+248>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if((c[f+540>>2]|0)!=0?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(j=+g[b+284>>2],j!=0.0):0)e=e-j;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));l=k;return}else{d=c[b+8>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if((!((f|0)==0?1:(c[f+252>>2]&2|0)==0)?(c[f+540>>2]|0)!=0:0)?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(i=+g[b+284>>2],i!=0.0):0)e=e-i;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+8>>2]|0}h=h+1|0}while((h|0)<(d|0));l=k;return}}function rh(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0,k=0.0,l=0.0;e=c[d+204>>2]|0;if((e&3|0)==0?(c[d+564>>2]&1|0)==0:0){h=+g[d+404>>2];if(h!=0.0){l=1.0/h*+g[b+268>>2];k=1.0/h*+g[b+272>>2];g[d+424>>2]=1.0/h*+g[b+264>>2];g[d+428>>2]=l;g[d+432>>2]=k;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(e&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{f=c[b+248>>2]|0;if((f|0)==(c[b+252>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+248>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+256>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+256>>2]|0;if(i){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=e;c[b+252>>2]=j;e=c[d+204>>2]|0}c[(c[b+256>>2]|0)+(f<<2)>>2]=d;c[b+248>>2]=f+1}j=(e&3|0)==0;Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,j?1:2,j?-1:-3);return}function sh(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;i=c[a+68+(d<<2)>>2]|0;j=b[i+((f&65535)<<2)+-4>>1]|0;if((e[i+((f&65535)<<2)>>1]|0)>=(j&65535))return;k=c[a+60>>2]|0;m=k+((e[i+((f&65535)<<2)+2>>1]|0)<<6)+54+(d<<1)|0;h=i+((f&65535)<<2)+-4|0;l=i+((f&65535)<<2)|0;while(1){i=e[l+-2>>1]|0;if(!(j&1)){f=e[l+2>>1]|0;if(((((e[k+(f<<6)+54+((1<>1]|0)>=(e[k+(i<<6)+48+((1<>1]|0)?(e[k+(i<<6)+54+((1<>1]|0)>=(e[k+(f<<6)+48+((1<>1]|0):0)?(e[k+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(i<<6)+48+((1<<(1<>1]|0):0)?(e[k+(i<<6)+54+((1<<(1<>1]|0)>=(e[k+(f<<6)+48+((1<<(1<>1]|0):0)?(p=c[a+92>>2]|0,n=k+(f<<6)|0,o=k+(i<<6)|0,Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0,p=c[a+96>>2]|0,p|0):0)Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0;f=k+(i<<6)+48+(d<<1)|0}else f=k+(i<<6)+54+(d<<1)|0;b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[m>>1]=(b[m>>1]|0)+-1<<16>>16;f=e[l>>1]|e[l+2>>1]<<16;j=e[h>>1]|e[h+2>>1]<<16;b[l>>1]=j;b[l+2>>1]=j>>>16;b[h>>1]=f;b[h+2>>1]=f>>>16;f=l+-4|0;h=h+-4|0;j=b[h>>1]|0;if((e[f>>1]|0)>=(j&65535))break;l=f;k=c[a+60>>2]|0}return}function th(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0,k=0,l=0,m=0.0,n=0.0;h=c[d+204>>2]|0;if((h&3|0)==0?(c[d+564>>2]&1|0)==0:0){i=+g[d+404>>2];if(i!=0.0){n=1.0/i*+g[b+268>>2];m=1.0/i*+g[b+272>>2];g[d+424>>2]=1.0/i*+g[b+264>>2];g[d+428>>2]=n;g[d+432>>2]=m;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(h&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{h=c[b+248>>2]|0;if((h|0)==(c[b+252>>2]|0)?(l=h|0?h<<1:1,(h|0)<(l|0)):0){if(!l)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((l<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+248>>2]|0}if((h|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+256>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[b+256>>2]|0;if(j){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=k;c[b+252>>2]=l}c[(c[b+256>>2]|0)+(h<<2)>>2]=d;c[b+248>>2]=h+1}Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,e,f);return}function uh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0,j=0.0,k=0,l=0.0;l=+g[d>>2];if(+g[b>>2]<=l){j=+g[d+4>>2];if((((+g[b+4>>2]<=j?+g[b+8>>2]<=+g[d+8>>2]:0)?+g[b+16>>2]>=+g[d+16>>2]:0)?+g[b+20>>2]>=+g[d+20>>2]:0)?+g[b+24>>2]>=+g[d+24>>2]:0){d=0;return d|0}else h=d+4|0}else{h=d+4|0;j=+g[d+4>>2]}g[d>>2]=l-f;g[h>>2]=j-f;g[d+8>>2]=+g[d+8>>2]-f;g[d+16>>2]=+g[d+16>>2]+f;g[d+20>>2]=+g[d+20>>2]+f;g[d+24>>2]=+g[d+24>>2]+f;l=+g[e>>2];k=l>0.0?d+16|0:d;g[k>>2]=l+ +g[k>>2];l=+g[e+4>>2];h=l>0.0?d+20|0:h;g[h>>2]=l+ +g[h>>2];l=+g[e+8>>2];h=l>0.0?d+24|0:d+8|0;g[h>>2]=l+ +g[h>>2];h=Ag(a,b)|0;a:do if(h){k=c[a+8>>2]|0;if((k|0)<=-1){h=c[a>>2]|0;break}if(k){e=0;while(1){i=c[h+32>>2]|0;e=e+1|0;if(!i)break a;if((e|0)>=(k|0)){h=i;break}else h=i}}}else h=0;while(0);c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];Pe(a,h,b);d=1;return d|0}function vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*.5;l=(+g[a+40>>2]-+g[a+24>>2])*.5;i=(+g[a+44>>2]-+g[a+28>>2])*.5;n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=i+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);B=(+g[a+36>>2]+ +g[a+20>>2])*.5;z=(+g[a+40>>2]+ +g[a+24>>2])*.5;x=(+g[a+44>>2]+ +g[a+28>>2])*.5;G=+g[b>>2];w=+C(+G);F=+g[b+4>>2];v=+C(+F);t=+g[b+8>>2];u=+C(+t);E=+g[b+16>>2];s=+C(+E);D=+g[b+20>>2];r=+C(+D);p=+g[b+24>>2];q=+C(+p);A=+g[b+32>>2];m=+C(+A);y=+g[b+36>>2];j=+C(+y);f=+g[b+40>>2];h=+C(+f);t=B*G+z*F+x*t+ +g[b+48>>2];p=B*E+z*D+x*p+ +g[b+52>>2];f=B*A+z*y+x*f+ +g[b+56>>2];g[d>>2]=t-((o+n)*w+(l+k)*v+i*u);g[d+4>>2]=p-((o+n)*s+(l+k)*r+i*q);g[d+8>>2]=f-((o+n)*m+(l+k)*j+i*h);g[d+12>>2]=0.0;g[e>>2]=(o+n)*w+(l+k)*v+i*u+t;g[e+4>>2]=(o+n)*s+(l+k)*r+i*q+p;g[e+8>>2]=(o+n)*m+(l+k)*j+i*h+f;g[e+12>>2]=0.0;return}function wh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0;I=+g[a+52>>2];z=+g[a+36>>2];H=+g[a+56>>2];x=+g[a+40>>2];F=+g[a+60>>2];v=+g[a+44>>2];G=(c[a+20>>2]|0)==0;m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(G?0.0:(I-z)*.5)+m;k=(G?0.0:(H-x)*.5)+k;i=(G?0.0:(F-v)*.5)+i;E=+g[b>>2];u=+C(+E);D=+g[b+4>>2];t=+C(+D);r=+g[b+8>>2];s=+C(+r);B=+g[b+16>>2];q=+C(+B);A=+g[b+20>>2];p=+C(+A);n=+g[b+24>>2];o=+C(+n);y=+g[b+32>>2];l=+C(+y);w=+g[b+36>>2];j=+C(+w);f=+g[b+40>>2];h=+C(+f);z=G?0.0:(I+z)*.5;x=G?0.0:(H+x)*.5;v=G?0.0:(F+v)*.5;r=z*E+x*D+v*r+ +g[b+48>>2];n=z*B+x*A+v*n+ +g[b+52>>2];f=z*y+x*w+v*f+ +g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function xh(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=c[a+68+(d<<2)>>2]|0;k=c[a+60>>2]|0;l=e[h+((f&65535)<<2)+2>>1]|0;i=b[h+((f&65535)<<2)+-4>>1]|0;if((e[h+((f&65535)<<2)>>1]|0)>=(i&65535))return;g=h+((f&65535)<<2)+-4|0;j=h+((f&65535)<<2)|0;h=k;while(1){f=e[j+-2>>1]|0;if(!(i&1))f=h+(f<<6)+48+(d<<1)|0;else{if(((((e[k+(l<<6)+54+((1<>1]|0)>=(e[h+(f<<6)+48+((1<>1]|0)?(e[h+(f<<6)+54+((1<>1]|0)>=(e[k+(l<<6)+48+((1<>1]|0):0)?(e[k+(l<<6)+54+((1<<(1<>1]|0)>=(e[h+(f<<6)+48+((1<<(1<>1]|0):0)?(e[h+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(l<<6)+48+((1<<(1<>1]|0):0)?(n=c[a+92>>2]|0,m=h+(f<<6)|0,Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0,n=c[a+96>>2]|0,n|0):0)Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0;f=h+(f<<6)+54+(d<<1)|0}b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[k+(l<<6)+48+(d<<1)>>1]=(b[k+(l<<6)+48+(d<<1)>>1]|0)+-1<<16>>16;f=e[j>>1]|e[j+2>>1]<<16;i=e[g>>1]|e[g+2>>1]<<16;b[j>>1]=i;b[j+2>>1]=i>>>16;b[g>>1]=f;b[g+2>>1]=f>>>16;f=j+-4|0;g=g+-4|0;i=b[g>>1]|0;if((e[f>>1]|0)>=(i&65535))break;j=f;h=c[a+60>>2]|0}return}function yh(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;d=+g[(gJ(a)|0)>>2];e=+g[(OI(a+16|0)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];if(d+e+c>0.0){e=+VI(d+e+c+1.0);g[f+12>>2]=e*.5;d=+g[(OI(a+32|0)|0)>>2];g[f>>2]=(d-+g[(NI(a+16|0)|0)>>2])*(.5/e);d=+g[(NI(a)|0)>>2];g[f+4>>2]=(d-+g[(gJ(a+32|0)|0)>>2])*(.5/e);d=+g[(gJ(a+16|0)|0)>>2];g[f+8>>2]=(d-+g[(OI(a)|0)>>2])*(.5/e);i=f+4|0;h=f+8|0;a=f+12|0;j=f;as(b,j,i,h,a);l=f;return}else{h=(d>2];k=gJ(a+((((h+1|0)>>>0)%3|0)<<4)|0)|0;e=e-+g[k+((((h+1|0)>>>0)%3|0)<<2)>>2];j=gJ(a+((((h+2|0)>>>0)%3|0)<<4)|0)|0;e=+VI(e-+g[j+((((h+2|0)>>>0)%3|0)<<2)>>2]+1.0);g[f+(h<<2)>>2]=e*.5;g[f+12>>2]=(+g[j+((((h+1|0)>>>0)%3|0)<<2)>>2]-+g[k+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+1|0)>>>0)%3|0)<<2)>>2]=(+g[k+(h<<2)>>2]+ +g[i+((((h+1|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+2|0)>>>0)%3|0)<<2)>>2]=(+g[j+(h<<2)>>2]+ +g[i+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);h=f+4|0;i=f+8|0;j=f+12|0;a=f;as(b,a,h,i,j);l=f;return}}function zh(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;j=xb[c[(c[b>>2]|0)+28>>2]&127](b)|0;i=+g[j>>2]-+g[d>>2];h=+g[j+4>>2]-+g[d+4>>2];f=+g[j+8>>2]-+g[d+8>>2];if(!(i*i+h*h+f*f>1.1920928955078125e-07))return;Yg(b,d);if((a[b+65>>0]|0)!=0?(e=c[b+56>>2]|0,Ib[c[c[e>>2]>>2]&511](e),e=c[b+56>>2]|0,(e|0)!=0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);e=b+56|0}else e=b+56|0;c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[e>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;return}function Ah(b,d){b=b|0;d=d|0;var e=0.0,f=0.0;if(a[b+1309>>0]|0){e=(+g[b+1256>>2]-+g[b+1316>>2])*+g[b+1340>>2];g[b+792>>2]=e*(+g[d>>2]*+g[b+1364>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+808>>2]=e/+g[d>>2]}if(a[b+1310>>0]|0){e=(+g[b+1260>>2]-+g[b+1320>>2])*+g[b+1344>>2];g[b+796>>2]=e*(+g[d>>2]*+g[b+1368>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+812>>2]=e/+g[d>>2]}if(a[b+1311>>0]|0){e=(+g[b+1264>>2]-+g[b+1324>>2])*+g[b+1348>>2];g[b+800>>2]=e*(+g[d>>2]*+g[b+1372>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+816>>2]=e/+g[d>>2]}if(a[b+1312>>0]|0){f=-((+g[b+1192>>2]-+g[b+1328>>2])*+g[b+1352>>2]);e=+g[d>>2];g[b+876>>2]=e*+g[b+1376>>2]/+(c[d+44>>2]|0)*f;g[b+880>>2]=+C(+f)/e}if(a[b+1313>>0]|0){e=-((+g[b+1196>>2]-+g[b+1332>>2])*+g[b+1356>>2]);f=+g[d>>2];g[b+940>>2]=f*+g[b+1380>>2]/+(c[d+44>>2]|0)*e;g[b+944>>2]=+C(+e)/f}if(!(a[b+1314>>0]|0)){gg(b,d);return}e=-((+g[b+1200>>2]-+g[b+1336>>2])*+g[b+1360>>2]);f=+g[d>>2];g[b+1004>>2]=f*+g[b+1384>>2]/+(c[d+44>>2]|0)*e;g[b+1008>>2]=+C(+e)/f;gg(b,d);return}function Bh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0;e=l;l=l+160|0;c[e+136>>2]=0;c[e+136+4>>2]=0;c[e+136+8>>2]=0;c[e+136+12>>2]=0;c[e+136+16>>2]=0;c[e+32>>2]=7356;f=e+32+4|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;c[e+32+44>>2]=0;c[e+32+44+4>>2]=0;c[e+32+44+8>>2]=0;c[e+32+44+12>>2]=0;c[e+32+60>>2]=1065353216;c[e+32+64>>2]=0;c[e+32+68>>2]=c[e+136+4>>2];c[e+32+68+4>>2]=c[e+136+4+4>>2];c[e+32+68+8>>2]=c[e+136+4+8>>2];c[e+32+68+12>>2]=c[e+136+4+12>>2];g[e+32+84>>2]=-999999984306749440.0;j=+g[d>>2];i=+g[d+4>>2];h=+g[d+8>>2];g[e+32+88>>2]=j+i*0.0+h*0.0;g[e+32+92>>2]=j*0.0+i+h*0.0;g[e+32+96>>2]=j*0.0+i*0.0+h;g[e+32+100>>2]=0.0;c[e+16>>2]=1566444395;c[e+16+4>>2]=1566444395;c[e+16+8>>2]=1566444395;g[e+16+12>>2]=0.0;d=c[(c[b>>2]|0)+64>>2]|0;g[e>>2]=-999999984306749440.0;g[e+4>>2]=-999999984306749440.0;g[e+8>>2]=-999999984306749440.0;g[e+12>>2]=0.0;Vb[d&127](b,e+32|0,e,e+16|0);c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];l=e;return}function Ch(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;var n=0;n=l;l=l+128|0;c[n+80>>2]=c[a+4>>2];c[n+80+4>>2]=c[a+20>>2];c[n+80+8>>2]=c[a+36>>2];g[n+80+12>>2]=0.0;c[n+80+16>>2]=c[a+8>>2];c[n+80+20>>2]=c[a+24>>2];c[n+80+24>>2]=c[a+40>>2];g[n+80+28>>2]=0.0;c[n+80+32>>2]=c[a+12>>2];c[n+80+36>>2]=c[a+28>>2];c[n+80+40>>2]=c[a+44>>2];g[n+80+44>>2]=0.0;c[n+32>>2]=c[b+4>>2];c[n+32+4>>2]=c[b+20>>2];c[n+32+8>>2]=c[b+36>>2];g[n+32+12>>2]=0.0;c[n+32+16>>2]=c[b+8>>2];c[n+32+20>>2]=c[b+24>>2];c[n+32+24>>2]=c[b+40>>2];g[n+32+28>>2]=0.0;c[n+32+32>>2]=c[b+12>>2];c[n+32+36>>2]=c[b+28>>2];c[n+32+40>>2]=c[b+44>>2];g[n+32+44>>2]=0.0;h=h-+g[a+56>>2];i=i-+g[a+60>>2];g[n+16>>2]=f-+g[a+52>>2];g[n+16+4>>2]=h;g[n+16+8>>2]=i;g[n+16+12>>2]=0.0;i=k-+g[b+56>>2];m=m-+g[b+60>>2];g[n>>2]=j-+g[b+52>>2];g[n+4>>2]=i;g[n+8>>2]=m;g[n+12>>2]=0.0;Rg(d,n+80|0,n+32|0,n+16|0,n,e,a+456|0,+g[a+404>>2],b+456|0,+g[b+404>>2]);l=n;return}function Dh(b,d){b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0,k=0,l=0.0,m=0.0;if(a[b+48>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=4;c[d+4>>2]=2;Zc(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+1088>>2]=0.0;a[b+297>>0]=0;e=+g[b+192>>2];h=+g[b+196>>2];do if(!(e<=h))k=0;else{m=+g[b+892>>2];l=+g[b+908>>2];i=+g[b+924>>2];i=+Xj(+L(+(+g[b+832>>2]*m+ +g[b+848>>2]*l+ +g[b+864>>2]*i),+(+g[b+828>>2]*m+ +g[b+844>>2]*l+ +g[b+860>>2]*i)),e,h);g[b+1084>>2]=i;if(!(ih)e=h;else{k=0;break}g[b+1088>>2]=i-e;a[b+297>>0]=1;k=1}while(0);a[b+296>>0]=0;f=c[b+1032>>2]|0;c[b+1080>>2]=f;e=+g[b+184>>2];h=+g[b+188>>2];i=(c[j>>2]=f,+g[j>>2]);do if(!(e<=h))f=10;else{if(!(i>h)){if(!(i>2]=i-e;a[b+296>>0]=1;f=12}while(0);if((f|0)==10?(g[b+1032>>2]=0.0,a[b+1096>>0]|0):0)f=12;if((f|0)==12){c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1}if(k<<24>>24==0?(a[b+1112>>0]|0)==0:0)return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Eh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0;v=l;l=l+16|0;if((e|0)<=0){l=v;return}u=0;do{c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;o=c[a+56>>2]|0;w=c[a+32+(o<<2)>>2]|0;c[v+(o<<2)>>2]=w;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];q=b+(u<<4)|0;p=+g[q>>2];r=b+(u<<4)+4|0;m=+g[r>>2];s=b+(u<<4)+8|0;k=+g[s>>2];n=(c[j>>2]=w,+g[j>>2]);if(f*p+i*m+h*k>-999999984306749440.0){o=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=o;o=c[a+56>>2]|0;t=f*p+i*m+h*k;n=+g[a+32+(o<<2)>>2];p=+g[q>>2];m=+g[r>>2];k=+g[s>>2]}else t=-999999984306749440.0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;g[v+(o<<2)>>2]=-n;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];if(f*p+i*m+h*k>t){w=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=w}u=u+1|0}while((u|0)!=(e|0));l=v;return}function Fh(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=f|0;var h=0,i=0,j=0,k=0,m=0.0,n=0.0;j=l;l=l+48|0;m=1.0/+D(+(b*b+d*d+e*e));g[f>>2]=m*b;g[f+4>>2]=m*d;g[f+8>>2]=m*e;g[f+12>>2]=0.0;h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;Sb[h&127](j,i,f);b=-+g[f>>2];d=-+g[f+4>>2];e=-+g[f+8>>2];h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a+4>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;m=+g[a+24>>2]*b+ +g[a+28>>2]*d+ +g[a+32>>2]*e;n=+g[a+40>>2]*b+ +g[a+44>>2]*d+ +g[a+48>>2]*e;g[j+16>>2]=+g[a+8>>2]*b+ +g[a+12>>2]*d+ +g[a+16>>2]*e;g[j+16+4>>2]=m;g[j+16+8>>2]=n;g[j+16+12>>2]=0.0;Sb[h&127](j+32|0,i,j+16|0);n=+g[j+32>>2];b=+g[j+32+4>>2];d=+g[j+32+8>>2];e=+g[j+4>>2]-(n*+g[a+72>>2]+b*+g[a+76>>2]+d*+g[a+80>>2]+ +g[a+108>>2]);m=+g[j+8>>2]-(n*+g[a+88>>2]+b*+g[a+92>>2]+d*+g[a+96>>2]+ +g[a+112>>2]);g[f+16>>2]=+g[j>>2]-(n*+g[a+56>>2]+b*+g[a+60>>2]+d*+g[a+64>>2]+ +g[a+104>>2]);g[f+20>>2]=e;g[f+24>>2]=m;g[f+28>>2]=0.0;l=j;return}function Gh(a,b,c,d,e,f,h,i,j,k,l,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=+n;o=+o;var p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;q=(j-f)*(n-h)-(k-h)*(m-f);r=(k-h)*(l-e)-(i-e)*(n-h);s=(i-e)*(m-f)-(j-f)*(l-e);if(+C(+(s*d+(q*b+r*c)))<1.1920928955078125e-07){s=-1.0;return +s}t=+g[a>>2];v=+g[a+4>>2];u=+g[a+8>>2];p=-(q*t+r*v+s*u-(s*h+(q*e+r*f)))/(s*d+(q*b+r*c));if(((p>1.1920928955078125e-06&p-1.1920928955078125e-06:0)?s*((m-(v+p*c))*(i-(t+p*b))-(j-(v+p*c))*(l-(t+p*b)))+(q*((j-(v+p*c))*(n-(u+p*d))-(k-(u+p*d))*(m-(v+p*c)))+r*((k-(u+p*d))*(l-(t+p*b))-(n-(u+p*d))*(i-(t+p*b))))>-1.1920928955078125e-06:0)?s*((f-(v+p*c))*(l-(t+p*b))-(m-(v+p*c))*(e-(t+p*b)))+(q*((m-(v+p*c))*(h-(u+p*d))-(n-(u+p*d))*(f-(v+p*c)))+r*((n-(u+p*d))*(e-(t+p*b))-(h-(u+p*d))*(l-(t+p*b))))>-1.1920928955078125e-06:0){v=p;return +v}v=-1.0;return +v}function Hh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(a[b+165>>0]|0){if((c[b+92>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d<<4|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}else g=0;f=c[b+88>>2]|0;if((f|0)>0){e=0;do{i=g+(e<<4)|0;h=(c[b+96>>2]|0)+(e<<4)|0;c[i>>2]=c[h>>2];c[i+4>>2]=c[h+4>>2];c[i+8>>2]=c[h+8>>2];c[i+12>>2]=c[h+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+96>>2]|0;if(e|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=g;c[b+92>>2]=d;return}if((c[b+112>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((d<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+108>>2]|0;g=c[b+116>>2]|0;if((f|0)<=0)if(!g)e=b+120|0;else i=21;else{e=0;do{c[h+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));i=21}if((i|0)==21){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+116>>2]=0;e=b+120|0}a[e>>0]=1;c[b+116>>2]=h;c[b+112>>2]=d;return}function Ih(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(a[d+164>>0]|0)){if((c[d+152>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,g=sc((e<<1)+19|0)|0,(g|0)!=0):0){c[(g+4+15&-16)+-4>>2]=g;i=g+4+15&-16}else i=0;g=c[d+148>>2]|0;h=c[d+156>>2]|0;if((g|0)<=0)if(!h)f=d+160|0;else j=22;else{f=0;do{b[i+(f<<1)>>1]=b[h+(f<<1)>>1]|0;f=f+1|0}while((f|0)!=(g|0));j=22}if((j|0)==22){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=e;return}else{if((c[d+132>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}else i=0;g=c[d+128>>2]|0;h=c[d+136>>2]|0;if((g|0)<=0)if(!h)f=d+140|0;else j=10;else{f=0;do{c[i+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(g|0));j=10}if((j|0)==10){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=e;return}}function Jh(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];c[b+84>>2]=c[a+332>>2];c[b+88>>2]=c[a+336>>2];c[b+92>>2]=c[a+340>>2];c[b+96>>2]=c[a+344>>2];c[b+100>>2]=c[a+348>>2];c[b+104>>2]=c[a+352>>2];c[b+108>>2]=c[a+356>>2];c[b+112>>2]=c[a+360>>2];c[b+116>>2]=c[a+364>>2];c[b+120>>2]=c[a+368>>2];c[b+124>>2]=c[a+372>>2];c[b+128>>2]=c[a+376>>2];c[b+132>>2]=c[a+380>>2];c[b+136>>2]=c[a+384>>2];c[b+140>>2]=c[a+388>>2];c[b+144>>2]=c[a+392>>2];c[b+148>>2]=c[a+396>>2];c[b+152>>2]=c[a+400>>2];c[b+156>>2]=c[a+404>>2];c[b+160>>2]=c[a+408>>2];c[b+164>>2]=c[a+412>>2];c[b+168>>2]=c[a+416>>2];c[b+172>>2]=c[a+420>>2];c[b+176>>2]=c[a+424>>2];c[b+180>>2]=c[a+444>>2];c[b+184>>2]=c[a+448>>2];c[b+188>>2]=c[a+452>>2];c[b+192>>2]=c[a+428>>2];c[b+196>>2]=c[a+432>>2];c[b+200>>2]=c[a+436>>2];c[b+204>>2]=c[a+440>>2];return 12643}function Kh(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+32|0;n=+g[a+60>>2];r=+g[a+76>>2]-n;m=+g[a+64>>2];p=+g[a+80>>2]-m;k=+g[a+68>>2];s=+g[a+84>>2]-k;o=+g[a+92>>2]-n;q=+g[a+96>>2]-m;h=+g[a+100>>2]-k;i=1.0/+D(+((r*q-p*o)*(r*q-p*o)+((p*h-s*q)*(p*h-s*q)+(s*o-r*h)*(s*o-r*h))));f=i*(p*h-s*q);h=i*(s*o-r*h);i=(r*q-p*o)*i;k=i*+g[b+8>>2]+(+g[b>>2]*f+ +g[b+4>>2]*h)-(f*n+h*m+i*k);if(!(k>=-d)|!(k<=d)){b=0;l=j;return b|0}e=0;while(1){Vb[c[(c[a>>2]|0)+104>>2]&127](a,e,j+16|0,j);n=+g[j+16>>2];s=+g[j>>2]-n;p=+g[j+16+4>>2];o=+g[j+4>>2]-p;m=+g[j+16+8>>2];r=+g[j+8>>2]-m;q=1.0/+D(+((h*s-f*o)*(h*s-f*o)+((i*o-h*r)*(i*o-h*r)+(f*r-i*s)*(f*r-i*s))));e=e+1|0;if((h*s-f*o)*q*+g[b+8>>2]+(+g[b>>2]*q*(i*o-h*r)+ +g[b+4>>2]*q*(f*r-i*s))-(m*(h*s-f*o)*q+(n*q*(i*o-h*r)+p*q*(f*r-i*s)))<-d){e=0;a=5;break}if((e|0)>=3){e=1;a=5;break}}if((a|0)==5){l=j;return e|0}return 0}function Lh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0;c[6995]=(c[6995]|0)+1;h=sc(55)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[j>>2]=d;c[j+4>>2]=e;c[j+8>>2]=f;c[j+12>>2]=-1;c[j+16>>2]=-1;c[j+20>>2]=-1;c[j+28>>2]=-1;g[j+32>>2]=0.0;f=j;d=c[b+4>>2]|0;c[j+24>>2]=d;if((d|0)!=(c[b+8>>2]|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}i=d|0?d<<1:1;if((d|0)>=(i|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}if(!i)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((i<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}d=c[b+4>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+12>>2]|0;if(e){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+4>>2]|0}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=i;i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}function Mh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0;o=+nb[c[(c[a>>2]|0)+48>>2]&15](a);u=+g[a+76>>2];t=+g[a+60>>2];r=+g[a+80>>2];q=+g[a+64>>2];n=+g[a+84>>2];m=+g[a+68>>2];F=+g[b>>2];y=+C(+F);E=+g[b+4>>2];x=+C(+E);k=+g[b+8>>2];l=+C(+k);D=+g[b+16>>2];w=+C(+D);B=+g[b+20>>2];v=+C(+B);i=+g[b+24>>2];j=+C(+i);A=+g[b+32>>2];s=+C(+A);z=+g[b+36>>2];p=+C(+z);f=+g[b+40>>2];h=+C(+f);k=(u+t)*.5*F+(r+q)*.5*E+(n+m)*.5*k+ +g[b+48>>2];i=(u+t)*.5*D+(r+q)*.5*B+(n+m)*.5*i+ +g[b+52>>2];f=(u+t)*.5*A+(r+q)*.5*z+(n+m)*.5*f+ +g[b+56>>2];l=(o+(u-t)*.5)*y+(o+(r-q)*.5)*x+(o+(n-m)*.5)*l;j=(o+(u-t)*.5)*w+(o+(r-q)*.5)*v+(o+(n-m)*.5)*j;h=(o+(u-t)*.5)*s+(o+(r-q)*.5)*p+(o+(n-m)*.5)*h;g[d>>2]=k-l;g[d+4>>2]=i-j;g[d+8>>2]=f-h;g[d+12>>2]=0.0;g[e>>2]=l+k;g[e+4>>2]=j+i;g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function Nh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;if(a[d+32>>0]&1){f=c[b+4>>2]|0;if(f|0)ll(f,d,e);f=c[b>>2]|0;if(f|0){n=+g[d>>2];l=+g[f+128>>2];m=+g[d+4>>2];k=+g[d+8>>2];h=+g[e+4>>2];p=+g[e+8>>2];o=+g[e>>2];j=+g[f+180>>2]*(k*h-m*p)+ +g[f+184>>2]*(n*p-k*o)+(m*o-n*h)*+g[f+188>>2];i=(k*h-m*p)*+g[f+196>>2]+(n*p-k*o)*+g[f+200>>2]+(m*o-n*h)*+g[f+204>>2];h=(k*h-m*p)*+g[f+212>>2]+(n*p-k*o)*+g[f+216>>2]+(m*o-n*h)*+g[f+220>>2];g[f+244>>2]=n*l+ +g[f+244>>2];g[f+248>>2]=l*m+ +g[f+248>>2];g[f+252>>2]=l*k+ +g[f+252>>2];g[f+316>>2]=n*l+ +g[f+316>>2];g[f+320>>2]=l*m+ +g[f+320>>2];g[f+324>>2]=l*k+ +g[f+324>>2];g[f+260>>2]=j+ +g[f+260>>2];g[f+264>>2]=i+ +g[f+264>>2];g[f+268>>2]=h+ +g[f+268>>2];g[f+332>>2]=j+ +g[f+332>>2];g[f+336>>2]=i+ +g[f+336>>2];g[f+340>>2]=h+ +g[f+340>>2];c[f+308>>2]=(c[f+308>>2]|0)+1}}if(!(a[d+32>>0]&2))return;aj(b,d+16|0,e);return}function Oh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;h=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=h;if(h|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;g=c[a+100>>2]|0;c[b+60>>2]=g;if(!g){c[b+52>>2]=0;c[b+56>>2]=0;d=b+64|0;c[d>>2]=0;return 17203}c[b+52>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+108>>2]|0)|0;c[b+56>>2]=0;h=Bb[c[(c[d>>2]|0)+16>>2]&63](d,16,g)|0;if((g|0)>0){e=c[a+108>>2]|0;a=c[h+8>>2]|0;f=0;while(1){c[a>>2]=c[e+(f<<4)>>2];c[a+4>>2]=c[e+(f<<4)+4>>2];c[a+8>>2]=c[e+(f<<4)+8>>2];c[a+12>>2]=c[e+(f<<4)+12>>2];f=f+1|0;if((f|0)==(g|0))break;else a=a+16|0}}else e=c[a+108>>2]|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,h,19202,1497453121,e);d=b+64|0;c[d>>2]=0;return 17203}function Ph(b){b=b|0;var d=0;d=c[b+112>>2]|0;if(d|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=0;c[b+104>>2]=0;c[b+108>>2]=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function Qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;k=c[b>>2]|0;if((k|0)==(c[a+84>>2]|0)){j=1.0;return +j}if(c[k+204>>2]&4|0){j=1.0;return +j}f=+g[b+8>>2];h=+g[b+12>>2];e=+g[b+16>>2];if(d){i=f;j=h}else{i=+g[k+4>>2]*f+ +g[k+8>>2]*h+ +g[k+12>>2]*e;j=f*+g[k+20>>2]+h*+g[k+24>>2]+e*+g[k+28>>2];e=f*+g[k+36>>2]+h*+g[k+40>>2]+e*+g[k+44>>2]}if(i*+g[a+88>>2]+j*+g[a+92>>2]+e*+g[a+96>>2]<+g[a+104>>2]){j=1.0;return +j}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=k;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=+g[b+8>>2];f=+g[b+12>>2];h=+g[b+16>>2];i=e*+g[k+20>>2]+f*+g[k+24>>2]+h*+g[k+28>>2];j=e*+g[k+36>>2]+f*+g[k+40>>2]+h*+g[k+44>>2];g[a+48>>2]=+g[k+4>>2]*e+ +g[k+8>>2]*f+ +g[k+12>>2]*h;g[a+52>>2]=i;g[a+56>>2]=j;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];j=+g[b+40>>2];return +j}function Rh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;if((c[b+12>>2]|0)>=2){Nf(b);return}c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=f+(d*12|0)|0;h=(c[b+16>>2]|0)+(d*12|0)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Nf(b);return}function Sh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+52>>2];c[b+56>>2]=c[a+56>>2];c[b+60>>2]=c[a+60>>2];c[b+64>>2]=c[a+64>>2];c[b+68>>2]=c[a+68>>2];c[b+72>>2]=c[a+72>>2];c[b+76>>2]=c[a+76>>2];c[b+80>>2]=c[a+80>>2];c[b+84>>2]=c[a+84>>2];c[b+88>>2]=c[a+88>>2];c[b+92>>2]=c[a+92>>2];c[b+96>>2]=c[a+96>>2];c[b+100>>2]=c[a+100>>2];c[b+104>>2]=c[a+104>>2];c[b+108>>2]=c[a+108>>2];c[b+112>>2]=c[a+112>>2];c[b+116>>2]=c[a+116>>2];c[b+120>>2]=c[a+120>>2];c[b+124>>2]=c[a+124>>2];c[b+128>>2]=c[a+128>>2];c[b+132>>2]=c[a+132>>2];c[b+136>>2]=c[a+136>>2];c[b+140>>2]=c[a+140>>2];c[b+144>>2]=c[a+144>>2];c[b+148>>2]=c[a+148>>2];c[b+152>>2]=c[a+152>>2];c[b+156>>2]=c[a+156>>2];c[b+160>>2]=c[a+160>>2];c[b+164>>2]=c[a+164>>2];c[b+168>>2]=c[a+168>>2];c[b+172>>2]=c[a+172>>2];c[b+176>>2]=c[a+176>>2];c[b+180>>2]=c[a+188>>2];c[b+184>>2]=c[a+184>>2];c[b+188>>2]=c[a+196>>2];c[b+192>>2]=c[a+192>>2];c[b+196>>2]=d[a+180>>0];c[b+200>>2]=d[a+49>>0];return 12599}function Th(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);id(a,b);dj(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function Uh(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=+d;e=+e;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;p=+g[c>>2];o=+g[c+16>>2];n=+g[c+32>>2];m=+g[c+4>>2];l=+g[c+20>>2];k=+g[c+36>>2];j=+g[c+8>>2];i=+g[c+24>>2];h=+g[c+40>>2];g[a>>2]=b-((p*0.0+o*-f+n*e)*0.0+(m*0.0+l*-f+k*e)*f+(j*0.0+i*-f+h*e)*-e);g[a+4>>2]=0.0-((p*0.0+o*-f+n*e)*-f+(m*0.0+l*-f+k*e)*0.0+(j*0.0+i*-f+h*e)*d);g[a+8>>2]=0.0-((p*0.0+o*-f+n*e)*e+(m*0.0+l*-f+k*e)*-d+(j*0.0+i*-f+h*e)*0.0);g[a+12>>2]=0.0;g[a+16>>2]=0.0-((p*f+o*0.0+n*-d)*0.0+(m*f+l*0.0+k*-d)*f+(j*f+i*0.0+h*-d)*-e);g[a+20>>2]=b-((p*f+o*0.0+n*-d)*-f+(m*f+l*0.0+k*-d)*0.0+(j*f+i*0.0+h*-d)*d);g[a+24>>2]=0.0-((p*f+o*0.0+n*-d)*e+(m*f+l*0.0+k*-d)*-d+(j*f+i*0.0+h*-d)*0.0);g[a+28>>2]=0.0;g[a+32>>2]=0.0-((p*-e+o*d+n*0.0)*0.0+(m*-e+l*d+k*0.0)*f+(j*-e+i*d+h*0.0)*-e);g[a+36>>2]=0.0-((p*-e+o*d+n*0.0)*-f+(m*-e+l*d+k*0.0)*0.0+(j*-e+i*d+h*0.0)*d);g[a+40>>2]=b-((p*-e+o*d+n*0.0)*e+(m*-e+l*d+k*0.0)*-d+(j*-e+i*d+h*0.0)*0.0);g[a+44>>2]=0.0;return}function Vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0;f=l;l=l+96|0;g[f+4>>2]=1.0;c[f+8>>2]=0;c[f+12>>2]=1;c[f+16>>2]=-1;c[f+20>>2]=0;c[f>>2]=2952;c[f+24>>2]=c[b>>2];c[f+24+4>>2]=c[b+4>>2];c[f+24+8>>2]=c[b+8>>2];c[f+24+12>>2]=c[b+12>>2];c[f+40>>2]=c[d>>2];c[f+40+4>>2]=c[d+4>>2];c[f+40+8>>2]=c[d+8>>2];c[f+40+12>>2]=c[d+12>>2];a=c[a+4>>2]|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,f);a=c[f+8>>2]|0;if(!a){e=0;l=f;return e|0}if(!(c[a+252>>2]&2)){e=0;l=f;return e|0}if(c[a+204>>2]&4|0){e=0;l=f;return e|0}c[e>>2]=c[f+72>>2];c[e+4>>2]=c[f+72+4>>2];c[e+8>>2]=c[f+72+8>>2];c[e+12>>2]=c[f+72+12>>2];c[e+16>>2]=c[f+56>>2];c[e+16+4>>2]=c[f+56+4>>2];c[e+16+8>>2]=c[f+56+8>>2];c[e+16+12>>2]=c[f+56+12>>2];k=+g[e+16>>2];j=+g[e+20>>2];i=+g[e+24>>2];h=1.0/+D(+(k*k+j*j+i*i));g[e+16>>2]=k*h;g[e+20>>2]=j*h;g[e+24>>2]=i*h;c[e+32>>2]=c[f+4>>2];e=a;l=f;return e|0}function Wh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0;e=l;l=l+32|0;d=c[b+448>>2]|0;switch(c[a+448>>2]&48&d&63){case 32:{if((a|0)==(b|0)&(d&64|0)==0){l=e;return}g[e+4>>2]=1.0;c[e+8+4>>2]=0;c[e+8+4+4>>2]=0;c[e+8+4+8>>2]=0;c[e>>2]=3748;c[e+8>>2]=c[a+516>>2];d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+16>>2]=c[(+g[a+376>>2]<+g[b+376>>2]?a+376|0:b+376|0)>>2];c[e+24>>2]=a;c[e+28>>2]=b;Ee(c[a+1068>>2]|0,c[b+1068>>2]|0,e);l=e;return}case 16:{if((a|0)==(b|0)){l=e;return}c[e>>2]=3784;d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+4>>2]=a;c[e+8>>2]=b;Ee(c[a+988>>2]|0,c[b+1028>>2]|0,e);c[e+4>>2]=b;c[e+8>>2]=a;Ee(c[b+988>>2]|0,c[a+1028>>2]|0,e);l=e;return}default:{l=e;return}}}function Xh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+48|0;g=m;h=g+44|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));if(!d)j=c[c[b+940>>2]>>2]|0;else j=d;d=c[b+792>>2]|0;if((d|0)==(c[b+796>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((k*52|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[b+792>>2]|0}if((d|0)>0){e=0;do{g=i+(e*52|0)|0;f=(c[b+800>>2]|0)+(e*52|0)|0;h=g+52|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));e=e+1|0}while((e|0)!=(d|0))}d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=i;c[b+796>>2]=k;d=c[b+792>>2]|0}g=c[b+800>>2]|0;c[g+(d*52|0)>>2]=0;c[g+(d*52|0)+4>>2]=j;g=g+(d*52|0)+8|0;f=m;h=g+44|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));c[b+792>>2]=(c[b+792>>2]|0)+1;l=m;return}function Yh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0;i=l;l=l+32|0;c[i+16>>2]=c[d>>2];c[i+16+4>>2]=c[d+4>>2];c[i+16+8>>2]=c[d+8>>2];c[i+16+12>>2]=c[d+12>>2];f=+g[i+16>>2];h=+g[i+16+4>>2];e=+g[i+16+8>>2];if(f*f+h*h+e*e<1.4210854715202004e-14){c[i+16>>2]=-1082130432;c[i+16+4>>2]=-1082130432;c[i+16+8>>2]=-1082130432;g[i+16+12>>2]=0.0;f=-1.0;h=-1.0;e=-1.0}j=1.0/+D(+(f*f+h*h+e*e));g[i+16>>2]=f*j;g[i+16+4>>2]=h*j;g[i+16+8>>2]=e*j;Nd(i,b,i+16|0);switch(c[b+4>>2]|0){case 8:{e=+g[b+32>>2]*+g[b+16>>2];break}case 0:{e=+g[b+48>>2];break}case 1:{e=+g[b+48>>2];break}case 13:{e=+g[b+48>>2];break}case 11:{e=+g[b+48>>2];break}case 10:{e=+g[b+48>>2];break}case 4:case 5:{e=+g[b+48>>2];break}default:e=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}h=e*+g[i+16+4>>2]+ +g[i+4>>2];j=e*+g[i+16+8>>2]+ +g[i+8>>2];g[a>>2]=e*+g[i+16>>2]+ +g[i>>2];g[a+4>>2]=h;g[a+8>>2]=j;g[a+12>>2]=0.0;l=i;return}function Zh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,k=0,m=0,n=0,o=0.0;m=l;l=l+80|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];if(e*e+f*f+i*i<9.999999747378752e-05){k=1065353216;h=0;e=0.0;d=0}else{o=1.0/+D(+(e*e+f*f+i*i));k=(g[j>>2]=e*o,c[j>>2]|0);n=(g[j>>2]=f*o,c[j>>2]|0);h=(g[j>>2]=i*o,c[j>>2]|0);e=+g[d+12>>2];d=n}c[m+32>>2]=8168;n=m+32+4|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[m+32+20>>2]=-999999984306749440.0;c[m+32+24>>2]=k;c[m+32+28>>2]=d;c[m+32+32>>2]=h;g[m+32+36>>2]=e;c[m+16>>2]=1566444395;c[m+16+4>>2]=1566444395;c[m+16+8>>2]=1566444395;g[m+16+12>>2]=0.0;b=c[b+96>>2]|0;k=c[(c[b>>2]|0)+8>>2]|0;g[m>>2]=-999999984306749440.0;g[m+4>>2]=-999999984306749440.0;g[m+8>>2]=-999999984306749440.0;g[m+12>>2]=0.0;Vb[k&127](b,m+32|0,m,m+16|0);c[a>>2]=c[n>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];c[a+12>>2]=c[n+12>>2];l=m;return}function _h(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0;p=l;l=l+32|0;e=c[a+12>>2]|0;if(!e){l=p;return}c[f+4>>2]=e;q=c[b+4>>2]|0;a=c[d+4>>2]|0;r=c[b+12>>2]|0;b=c[d+12>>2]|0;h=+g[r+48>>2]-+g[b+48>>2];i=+g[r+52>>2]-+g[b+52>>2];k=+g[r+56>>2]-+g[b+56>>2];m=+D(+(h*h+i*i+k*k));n=+g[q+32>>2]*+g[q+16>>2];o=+g[a+32>>2]*+g[a+16>>2];c[e+780>>2]=0;if(m>n+o+ +g[f+32>>2]){l=p;return}c[p+16>>2]=1065353216;c[p+16+4>>2]=0;c[p+16+8>>2]=0;g[p+16+12>>2]=0.0;if(m>1.1920928955078125e-07){g[p+16>>2]=h*(1.0/m);g[p+16+4>>2]=i*(1.0/m);g[p+16+8>>2]=k*(1.0/m);g[p+16+12>>2]=0.0;j=h*(1.0/m);i=i*(1.0/m);h=k*(1.0/m)}else{j=1.0;i=0.0;h=0.0}r=c[d+12>>2]|0;i=o*i+ +g[r+52>>2];k=o*h+ +g[r+56>>2];g[p>>2]=o*j+ +g[r+48>>2];g[p+4>>2]=i;g[p+8>>2]=k;g[p+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,p+16|0,p,m-(n+o));l=p;return}function $h(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0;m=c[a+4>>2]|0;a=c[a+44>>2]|0;do if(!m)if(!a){e=0;f=0.0;h=0;i=0;j=0;k=0.0;l=0;a=0}else{e=c[a>>2]|0;f=+g[a+12>>2];h=c[a+16>>2]|0;i=c[a+20>>2]|0;j=c[a+24>>2]|0;k=+g[a+28>>2];l=c[a+4>>2]|0;a=c[a+8>>2]|0}else if(!a){e=c[m>>2]|0;f=+g[m+12>>2];h=c[m+16>>2]|0;i=c[m+20>>2]|0;j=c[m+24>>2]|0;k=+g[m+28>>2];l=c[m+4>>2]|0;a=c[m+8>>2]|0;break}else{e=c[(+g[m>>2]<+g[a>>2]?m:a)>>2]|0;f=0.0;h=c[(+g[m+16>>2]>+g[a+16>>2]?m+16|0:a+16|0)>>2]|0;i=c[(+g[m+20>>2]>+g[a+20>>2]?m+16|0:a+16|0)+4>>2]|0;j=c[(+g[m+24>>2]>+g[a+24>>2]?m+16|0:a+16|0)+8>>2]|0;k=0.0;l=c[(+g[m+4>>2]<+g[a+4>>2]?m:a)+4>>2]|0;a=c[(+g[m+8>>2]<+g[a+8>>2]?m:a)+8>>2]|0;break}while(0);c[b>>2]=e;c[b+4>>2]=l;c[b+8>>2]=a;g[b+12>>2]=f;c[d>>2]=h;c[d+4>>2]=i;c[d+8>>2]=j;g[d+12>>2]=k;return}function ai(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0.0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;f=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];j=+D(+(f*f+i*i+j*j));h=c[b+68>>2]|0;do if(!(+g[d+(l<<2)>>2]>j*+g[b+56>>2])){f=+g[d+(h<<2)>>2];e=c[b+76>>2]|0;i=+g[d+(e<<2)>>2];j=+D(+(f*f+i*i));if(j>1.1920928955078125e-07){j=+g[b+60>>2]/j;g[a+(h<<2)>>2]=f*j;g[a+(l<<2)>>2]=-k;f=i*j;break}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;f=0.0;break}}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;f=0.0;e=c[b+76>>2]|0}while(0);g[a+(e<<2)>>2]=f;if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;i=+g[d>>2];j=+g[d+4>>2];k=+g[d+8>>2];m=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:i;f=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:j;k=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:k;j=1.0/+D(+(k*k+(m*m+f*f)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*j*m;g[a+4>>2]=i*j*f+ +g[a+4>>2];g[a+8>>2]=i*j*k+ +g[a+8>>2];return}function bi(a,b,d){a=a|0;b=b|0;d=d|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];c[a+316>>2]=c[b+16>>2];c[a+316+4>>2]=c[b+16+4>>2];c[a+316+8>>2]=c[b+16+8>>2];c[a+316+12>>2]=c[b+16+12>>2];c[a+332>>2]=c[b+32>>2];c[a+332+4>>2]=c[b+32+4>>2];c[a+332+8>>2]=c[b+32+8>>2];c[a+332+12>>2]=c[b+32+12>>2];c[a+348>>2]=c[b+48>>2];c[a+348+4>>2]=c[b+48+4>>2];c[a+348+8>>2]=c[b+48+8>>2];c[a+348+12>>2]=c[b+48+12>>2];c[a+364>>2]=c[d>>2];c[a+364+4>>2]=c[d+4>>2];c[a+364+8>>2]=c[d+8>>2];c[a+364+12>>2]=c[d+12>>2];c[a+380>>2]=c[d+16>>2];c[a+380+4>>2]=c[d+16+4>>2];c[a+380+8>>2]=c[d+16+8>>2];c[a+380+12>>2]=c[d+16+12>>2];c[a+396>>2]=c[d+32>>2];c[a+396+4>>2]=c[d+32+4>>2];c[a+396+8>>2]=c[d+32+8>>2];c[a+396+12>>2]=c[d+32+12>>2];c[a+412>>2]=c[d+48>>2];c[a+412+4>>2]=c[d+48+4>>2];c[a+412+8>>2]=c[d+48+8>>2];c[a+412+12>>2]=c[d+48+12>>2];Ib[c[(c[a>>2]|0)+8>>2]&511](a);return}function ci(a){a=a|0;var b=0,d=0;Dd(a);a:do if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&6144|0):0){d=xb[c[(c[a>>2]|0)+104>>2]&127](a)|0;while(1){b=d+-1|0;if((d|0)<=0)break a;d=zb[c[(c[a>>2]|0)+108>>2]&31](a,b)|0;Ob[c[(c[a>>2]|0)+172>>2]&127](a,d);d=b}}while(0);if((((xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&16387|0):0)?xb[c[(c[a>>2]|0)+20>>2]&127](a)|0:0)?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,xb[c[(c[d>>2]|0)+56>>2]&127](d)|0):0)?(c[a+296>>2]|0)>0:0){b=0;do{d=c[(c[a+304>>2]|0)+(b<<2)>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,c[a+72>>2]|0);b=b+1|0}while((b|0)<(c[a+296>>2]|0))}if(!(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0))return;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Ib[c[(c[a>>2]|0)+104>>2]&511](a);return}function di(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;c=l;l=l+48|0;yh(a+364|0,c+16|0);h=-+g[c+16>>2];e=-+g[c+16+4>>2];m=-+g[c+16+8>>2];k=+g[c+16+12>>2];f=+g[b>>2];n=+g[b+12>>2];j=+g[b+8>>2];i=+g[b+4>>2];yh(a+300|0,c);p=+g[c>>2];q=+g[c+12>>2];d=+g[c+8>>2];o=+g[c+4>>2];g[c+32>>2]=(k*n-f*h-i*e-j*m)*p+(k*f+n*h+j*e-i*m)*q+(f*m+(n*e+k*i)-j*h)*d-(n*m+k*j+i*h-f*e)*o;g[c+32+4>>2]=p*(n*m+k*j+i*h-f*e)+(q*(f*m+(n*e+k*i)-j*h)+(k*n-f*h-i*e-j*m)*o)-(k*f+n*h+j*e-i*m)*d;g[c+32+8>>2]=(n*m+k*j+i*h-f*e)*q+(k*n-f*h-i*e-j*m)*d+(k*f+n*h+j*e-i*m)*o-p*(f*m+(n*e+k*i)-j*h);g[c+32+12>>2]=(k*n-f*h-i*e-j*m)*q-(k*f+n*h+j*e-i*m)*p-(f*m+(n*e+k*i)-j*h)*o-(n*m+k*j+i*h-f*e)*d;Ce(a,c+32|0);l=c;return}function ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!e)e=c[b+188>>2]|0;j=c[d>>2]|0;f=c[b+328>>2]|0;a:do if((f|0)>0){h=c[b+336>>2]|0;g=0;while(1){if((c[h+(g<<2)>>2]|0)==(j|0))break;g=g+1|0;if((g|0)>=(f|0))break a}if((g|0)!=(f|0))return}while(0);if((f|0)==(c[b+332>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+328>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+336>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+336>>2]|0;if(g){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=h;c[b+332>>2]=i}c[(c[b+336>>2]|0)+(f<<2)>>2]=j;c[b+328>>2]=f+1;b=c[b+344>>2]|0;Bb[c[(c[b>>2]|0)+8>>2]&63](b,e,d)|0;return}function fi(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;c[b>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+28>>2]|0)|0;c[b+4>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+32>>2]|0)|0;f=zb[c[(c[e>>2]|0)+40>>2]&31](e,a)|0;g=zb[c[(c[e>>2]|0)+28>>2]&31](e,f)|0;c[b+8>>2]=g;if(g|0)Ob[c[(c[e>>2]|0)+48>>2]&127](e,f);c[b+12>>2]=c[a+4>>2];c[b+24>>2]=d[a+21>>0];c[b+40>>2]=c[a+24>>2];c[b+44>>2]=c[a+16>>2];c[b+48>>2]=d[a+20>>0];c[b+20>>2]=c[a+12>>2];c[b+16>>2]=c[a+8>>2];c[b+28>>2]=c[a+36>>2];c[b+32>>2]=c[a+40>>2];c[b+36>>2]=0;f=c[a+28>>2]|0;if((c[f+548>>2]|0)>0){e=0;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+28>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0))}f=c[a+32>>2]|0;if((c[f+548>>2]|0)>0)e=0;else return 12572;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+32>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0));return 12572}function gi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return db(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function hi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(xb[c[(c[d>>2]|0)+16>>2]&127](d)|0)return;i=c[b+772>>2]|0;h=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;if(xb[c[(c[d>>2]|0)+8>>2]&127](d)|0?(e=xb[c[(c[d>>2]|0)+20>>2]&127](d)|0,g=xb[c[(c[d>>2]|0)+24>>2]&127](d)|0,(i|0)>0):0){f=c[b+780>>2]|0;a=h+(e<<2)|0;e=0;while(1){k=c[f+(e*104|0)+12>>2]|0;j=c[f+(e*104|0)+16>>2]|0;c[a>>2]=c[f+(e*104|0)+8>>2];c[a+4>>2]=k;c[a+8>>2]=j;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}}if(!(xb[c[(c[d>>2]|0)+12>>2]&127](d)|0))return;a=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;g=xb[c[(c[d>>2]|0)+32>>2]&127](d)|0;if((i|0)<=0)return;f=c[b+780>>2]|0;a=h+(a<<2)|0;e=0;while(1){j=c[f+(e*104|0)+76>>2]|0;k=c[f+(e*104|0)+80>>2]|0;c[a>>2]=c[f+(e*104|0)+72>>2];c[a+4>>2]=j;c[a+8>>2]=k;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}return}function ii(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9696;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;f=c[b+28>>2]|0;if((f|0)>0){d=0;do{g=c[b+36>>2]|0;h=g+(d*36|0)+4|0;i=g+(d*36|0)+12|0;j=c[i>>2]|0;e=g+(d*36|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*36|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ji(b){b=b|0;var d=0;c[b>>2]=8796;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}function ki(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+188>>2]|0;if(d|0){f=c[a+68>>2]|0;f=xb[c[(c[f>>2]|0)+36>>2]&127](f)|0;Sb[c[(c[f>>2]|0)+40>>2]&127](f,d,c[a+24>>2]|0);f=c[a+68>>2]|0;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,c[a+24>>2]|0);c[b+188>>2]=0}d=c[b+216>>2]|0;f=c[a+8>>2]|0;if((d|0)>-1&(d|0)<(f|0)){g=c[a+16>>2]|0;e=c[g+(d<<2)>>2]|0;c[g+(d<<2)>>2]=c[g+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=e;c[a+8>>2]=f+-1;if((d|0)>=(f+-1|0)){c[b+216>>2]=-1;return}c[(c[(c[a+16>>2]|0)+(d<<2)>>2]|0)+216>>2]=d;c[b+216>>2]=-1;return}a:do if((f|0)>0){e=c[a+16>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){c[b+216>>2]=-1;return}h=c[a+16>>2]|0;e=h+(d<<2)|0;g=c[e>>2]|0;c[e>>2]=c[h+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=g;c[a+8>>2]=f+-1;c[b+216>>2]=-1;return}function li(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0;p=l;l=l+16|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){o=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(e*e+h*h+f*f));o=e*m;n=h*m;m=f*m}c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;d=c[b+56>>2]|0;b=c[b+32+(d<<2)>>2]|0;c[p+(d<<2)>>2]=b;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];i=o*e+n*h+m*f;k=(c[j>>2]=b,+g[j>>2]);if(i>-999999984306749440.0){b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b}else i=-999999984306749440.0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;g[p+(d<<2)>>2]=-k;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];if(!(o*e+n*h+m*f>i)){l=p;return}b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b;l=p;return}function mi(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];n=+g[b+68>>2];o=+g[b+72>>2];m=+g[b+76>>2];if(!(n*n+o*o+m*m>0.0)){g[b+20>>2]=0.0;return}k=+g[d>>2];l=+g[d+4>>2];e=+g[d+8>>2];f=1.0/+D(+(k*k+l*l+e*e));h=+g[b+256>>2];i=+g[b+260>>2];j=+g[b+264>>2];if(!(h*k*f+l*f*i+e*f*j!=0.0))return;p=h*k*f+l*f*i+e*f*j<-1.0?-1.0:h*k*f+l*f*i+e*f*j;p=+G(+(1.5707963705062866-+I(+(p>1.0?1.0:p))))*+D(+(n*n+o*o+m*m));g[b+68>>2]=n-h*p;g[b+72>>2]=o-i*p;g[b+76>>2]=m-j*p;g[b+20>>2]=(h*k*f+l*f*i+e*f*j<0.0?-1.0:1.0)*+D(+(j*p*j*p+(h*p*h*p+i*p*i*p)));if(!(h*k*f+l*f*i+e*f*j>0.0))return;a[b+249>>0]=1;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function ni(b){b=b|0;var d=0;c[b>>2]=9356;d=c[b+160>>2]|0;if(d|0){if(a[b+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+160>>2]=0}a[b+164>>0]=1;c[b+160>>2]=0;c[b+152>>2]=0;c[b+156>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(!d){a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}function oi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0;p=l;l=l+16|0;if((e|0)<=0){l=p;return}o=0;do{h=+g[a+64>>2]*.5;i=c[a+72>>2]|0;k=+g[b+(o<<4)>>2];m=+g[b+(o<<4)+4>>2];n=+g[b+(o<<4)+8>>2];n=+D(+(k*k+m*m+n*n));j=c[a+68>>2]|0;do if(!(+g[b+(o<<4)+(i<<2)>>2]>n*+g[a+56>>2])){k=+g[b+(o<<4)+(j<<2)>>2];f=c[a+76>>2]|0;m=+g[b+(o<<4)+(f<<2)>>2];n=+D(+(k*k+m*m));if(n>1.1920928955078125e-07){n=+g[a+60>>2]/n;g[p+(j<<2)>>2]=k*n;g[p+(i<<2)>>2]=-h;h=m*n;break}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=-h;h=0.0;break}}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=h;h=0.0;f=c[a+76>>2]|0}while(0);g[p+(f<<2)>>2]=h;j=d+(o<<4)|0;c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2];o=o+1|0}while((o|0)!=(e|0));l=p;return}function pi(b){b=b|0;var d=0;c[b>>2]=5112;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function qi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*+g[a+112>>2]*.5;m=(+g[a+40>>2]-+g[a+24>>2])*+g[a+116>>2]*.5;k=(+g[a+44>>2]-+g[a+28>>2])*+g[a+120>>2]*.5;t=+C(+(+g[b>>2]));s=+C(+(+g[b+4>>2]));r=+C(+(+g[b+8>>2]));n=+C(+(+g[b+16>>2]));l=+C(+(+g[b+20>>2]));j=+C(+(+g[b+24>>2]));w=+C(+(+g[b+32>>2]));v=+C(+(+g[b+36>>2]));f=+C(+(+g[b+40>>2]));u=+g[b+48>>2];p=+g[b+52>>2];h=+g[b+56>>2];q=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=o*w+m*v+k*f+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=u-(o*t+m*s+k*r+q);g[d+4>>2]=p-(o*n+m*l+k*j+i);g[d+8>>2]=h-f;g[d+12>>2]=0.0;g[e>>2]=u+(o*t+m*s+k*r+q);g[e+4>>2]=p+(o*n+m*l+k*j+i);g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function ri(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0;f=l;l=l+16|0;y=c[a+56>>2]|0;z=c[a+32+(((y+2|0)%3|0)<<2)>>2]|0;c[f>>2]=z;c[f+4>>2]=z;c[f+8>>2]=z;g[f+12>>2]=0.0;g[f+(y<<2)>>2]=(c[j>>2]=z,+g[j>>2])+ +g[a+32+(y<<2)>>2];w=+C(+(+g[b>>2]));v=+C(+(+g[b+4>>2]));u=+C(+(+g[b+8>>2]));s=+C(+(+g[b+16>>2]));r=+C(+(+g[b+20>>2]));q=+C(+(+g[b+24>>2]));o=+C(+(+g[b+32>>2]));m=+C(+(+g[b+36>>2]));i=+C(+(+g[b+40>>2]));x=+g[b+48>>2];t=+g[b+52>>2];p=+g[b+56>>2];n=+g[f>>2];k=+g[f+4>>2];h=+g[f+8>>2];g[d>>2]=x-(w*n+v*k+u*h);g[d+4>>2]=t-(s*n+r*k+q*h);g[d+8>>2]=p-(o*n+m*k+i*h);g[d+12>>2]=0.0;g[e>>2]=x+(w*n+v*k+u*h);g[e+4>>2]=t+(s*n+r*k+q*h);g[e+8>>2]=p+(o*n+m*k+i*h);g[e+12>>2]=0.0;l=f;return}function si(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+64|0;b=c[b+36>>2]|0;e=c[(c[a+24>>2]|0)+28>>2]|0;c[d>>2]=c[e+(b*80|0)>>2];c[d+4>>2]=c[e+(b*80|0)+4>>2];c[d+8>>2]=c[e+(b*80|0)+8>>2];c[d+12>>2]=c[e+(b*80|0)+12>>2];c[d+16>>2]=c[e+(b*80|0)+16>>2];c[d+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[d+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[d+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[d+32>>2]=c[e+(b*80|0)+32>>2];c[d+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[d+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[d+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[d+48>>2]=c[e+(b*80|0)+48>>2];c[d+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[d+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[d+48+12>>2]=c[e+(b*80|0)+48+12>>2];jg(a,b,d,c[e+(b*80|0)+64>>2]|0);l=d;return}function ti(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=l;l=l+48|0;e=c[a+28>>2]|0;c[i+32>>2]=e;e=(c[a+20>>2]|0)-e|0;c[i+32+4>>2]=e;c[i+32+8>>2]=b;c[i+32+12>>2]=d;c[i>>2]=c[a+60>>2];c[i+4>>2]=i+32;c[i+8>>2]=2;f=SC($a(146,i|0)|0)|0;a:do if((e+d|0)!=(f|0)){b=2;g=e+d|0;e=i+32|0;while(1){if((f|0)<0)break;g=g-f|0;j=c[e+4>>2]|0;k=f>>>0>j>>>0;e=k?e+8|0:e;b=(k<<31>>31)+b|0;j=f-(k?j:0)|0;c[e>>2]=(c[e>>2]|0)+j;c[e+4>>2]=(c[e+4>>2]|0)-j;c[i+16>>2]=c[a+60>>2];c[i+16+4>>2]=e;c[i+16+8>>2]=b;f=SC($a(146,i+16|0)|0)|0;if((g|0)==(f|0)){h=3;break a}}c[a+16>>2]=0;c[a+28>>2]=0;c[a+20>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[e+4>>2]|0)|0}else h=3;while(0);if((h|0)==3){k=c[a+44>>2]|0;c[a+16>>2]=k+(c[a+48>>2]|0);c[a+28>>2]=k;c[a+20>>2]=k}l=i;return d|0}function ui(b){b=b|0;var d=0;if((a[22440]|0)==0?Uz(22440)|0:0){if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}c[5738]=c[5682];c[5739]=c[5683];c[5740]=c[5684];c[5741]=c[5685];c[5742]=c[5686];c[5743]=c[5687];c[5744]=c[5688];c[5745]=c[5689];c[5746]=c[5690];c[5747]=c[5691];c[5748]=c[5692];c[5749]=c[5693];c[5750]=c[5694];c[5751]=c[5695];c[5752]=c[5696];c[5753]=c[5697]}d=c[b+8>>2]|0;if(!d){d=c[b>>2]|0;return ((d|0)==0?22952:d+60|0)|0}else return d+4|0;return 0}function vi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=c[b>>2]|0;if((e|0)==(c[a+84>>2]|0)){f=1.0;return +f}if(c[e+204>>2]&4|0){f=1.0;return +f}if((+g[a+32>>2]-+g[a+16>>2])*+g[b+8>>2]+(+g[a+36>>2]-+g[a+20>>2])*+g[b+12>>2]+(+g[a+40>>2]-+g[a+24>>2])*+g[b+16>>2]>=-+g[a+88>>2]){f=1.0;return +f}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{k=+g[b+8>>2];j=+g[b+12>>2];i=+g[b+16>>2];h=k*+g[e+20>>2]+j*+g[e+24>>2]+i*+g[e+28>>2];f=k*+g[e+36>>2]+j*+g[e+40>>2]+i*+g[e+44>>2];g[a+48>>2]=+g[e+4>>2]*k+ +g[e+8>>2]*j+ +g[e+12>>2]*i;g[a+52>>2]=h;g[a+56>>2]=f;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];k=+g[b+40>>2];return +k}function wi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;i=l;l=l+80|0;if((e|0)>0)f=0;else{l=i;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));h=i+32+4|0;f=0;do{j=b+(f<<4)|0;c[i+32>>2]=8168;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;g[i+32+20>>2]=-999999984306749440.0;c[i+32+24>>2]=c[j>>2];c[i+32+24+4>>2]=c[j+4>>2];c[i+32+24+8>>2]=c[j+8>>2];c[i+32+24+12>>2]=c[j+12>>2];c[i+16>>2]=1566444395;c[i+16+4>>2]=1566444395;c[i+16+8>>2]=1566444395;g[i+16+12>>2]=0.0;j=c[a+96>>2]|0;k=c[(c[j>>2]|0)+8>>2]|0;g[i>>2]=-999999984306749440.0;g[i+4>>2]=-999999984306749440.0;g[i+8>>2]=-999999984306749440.0;g[i+12>>2]=0.0;Vb[k&127](j,i+32|0,i,i+16|0);j=d+(f<<4)|0;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];f=f+1|0}while((f|0)<(e|0));l=i;return}function xi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[b+100>>2]|0;if((f|0)==(c[b+104>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+100>>2]|0}if((f|0)>0){g=0;do{j=h+(g<<4)|0;k=(c[b+108>>2]|0)+(g<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];g=g+1|0}while((g|0)!=(f|0))}f=c[b+108>>2]|0;if(f|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=h;c[b+104>>2]=i;f=c[b+100>>2]|0}k=(c[b+108>>2]|0)+(f<<4)|0;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[b+100>>2]=(c[b+100>>2]|0)+1;if(!e)return;uj(b);return}function yi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+96|0;b=c[b>>2]|0;if((b|0)==(c[a+4>>2]|0)){l=d;return 1}e=c[a+12>>2]|0;if(!(zb[c[(c[e>>2]|0)+8>>2]&31](e,c[b+188>>2]|0)|0)){l=d;return 1}e=c[a+4>>2]|0;f=c[e+192>>2]|0;c[d+64>>2]=0;c[d+64+4>>2]=f;c[d+64+8>>2]=e;c[d+64+12>>2]=e+4;c[d+64+16>>2]=-1;c[d+64+20>>2]=-1;e=c[b+192>>2]|0;c[d+40>>2]=0;c[d+40+4>>2]=e;c[d+40+8>>2]=b;c[d+40+12>>2]=b+4;c[d+40+16>>2]=-1;c[d+40+20>>2]=-1;b=c[(c[a+8>>2]|0)+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,d+64|0,d+40|0,0,2)|0;if(b|0){f=c[a+12>>2]|0;c[d+4>>2]=0;c[d+8>>2]=d+64;c[d+12>>2]=d+40;g[d+32>>2]=0.0;c[d>>2]=6324;c[d+36>>2]=f;Zb[c[(c[b>>2]|0)+8>>2]&31](b,d+64|0,d+40|0,(c[a+8>>2]|0)+28|0,d);Ib[c[c[b>>2]>>2]&511](b);f=c[(c[a+8>>2]|0)+24>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,b)}l=d;return 1}function zi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;i=c[c[a>>2]>>2]|0;h=c[c[a+4>>2]>>2]|0;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,i,h)|0)){l=k;return}f=c[i+192>>2]|0;c[k+64>>2]=0;c[k+64+4>>2]=f;c[k+64+8>>2]=i;c[k+64+12>>2]=i+4;c[k+64+16>>2]=-1;c[k+64+20>>2]=-1;f=c[h+192>>2]|0;c[k+40>>2]=0;c[k+40+4>>2]=f;c[k+40+8>>2]=h;c[k+40+12>>2]=h+4;c[k+40+16>>2]=-1;c[k+40+20>>2]=-1;f=c[a+8>>2]|0;if(!f){f=Db[c[(c[b>>2]|0)+8>>2]&1](b,k+64|0,k+40|0,0,1)|0;c[a+8>>2]=f;if(f|0)j=4}else j=4;if((j|0)==4){c[k>>2]=5916;c[k+4>>2]=0;c[k+8>>2]=k+64;c[k+12>>2]=k+40;g[k+32>>2]=0.0;if((c[d+8>>2]|0)!=1){e=+tb[c[(c[f>>2]|0)+12>>2]&15](f,i,h,d,k);if(+g[d+12>>2]>e)g[d+12>>2]=e}else Zb[c[(c[f>>2]|0)+8>>2]&31](f,k+64|0,k+40|0,d,k)}l=k;return}function Ai(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;c[a+4>>2]=35;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=8484;c[a+56>>2]=1;f=+g[b+4>>2]+-.03999999910593033;d=+g[b+8>>2]+-.03999999910593033;g[a+32>>2]=+g[b>>2]+-.03999999910593033;g[a+36>>2]=f;g[a+40>>2]=d;g[a+44>>2]=0.0;e=!(+g[b>>2]<+g[b+4>>2])&1;d=+g[b+((+g[b+(e<<2)>>2]<+g[b+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(d<.03999999910593033)){c[a+4>>2]=13;return}j=+HG(a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=j+ +g[a+32>>2];h=h+ +g[a+36>>2];f=f+ +g[a+40>>2];g[a+48>>2]=d;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=f-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=j-i;g[a+36>>2]=h-d;g[a+40>>2]=f;g[a+44>>2]=0.0;c[a+4>>2]=13;return}function Bi(b){b=b|0;var d=0,e=0,f=0,h=0;c[b+32>>2]=262144;d=c[b+4>>2]|0;if((d|0)<2383){if((c[b+8>>2]|0)<2383){c[6995]=(c[6995]|0)+1;e=sc(9551)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=2383;e=b+12|0}else e=b+12|0;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=2383)}c[b+4>>2]=2383;e=0;do{h=(c[b+12>>2]|0)+(e<<2)|0;d=c[h>>2]|0;c[h>>2]=0;if(d|0)do{h=d;d=c[d+280>>2]|0;cJ(h)}while((d|0)!=0);e=e+1|0}while((e|0)!=2383);g[b+20>>2]=.25;c[b+24>>2]=0;c[b+28>>2]=0;c[b+36>>2]=1;c[b+40>>2]=1;return}function Ci(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d>>2]=8188;c[d+4>>2]=0;f=+g[a+4>>2]+-.03999999910593033;b=+g[a+8>>2]+-.03999999910593033;g[d+32>>2]=+g[a>>2]+-.03999999910593033;g[d+36>>2]=f;g[d+40>>2]=b;g[d+44>>2]=0.0;e=!(+g[a>>2]<+g[a+4>>2])&1;b=+g[a+((+g[a+(e<<2)>>2]<+g[a+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(b<.03999999910593033))return d|0;j=+HG(d);h=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);j=j+ +g[d+32>>2];h=h+ +g[d+36>>2];f=f+ +g[d+40>>2];g[d+48>>2]=b;i=+nb[c[(c[d>>2]|0)+48>>2]&15](d);b=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=f-+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[d+32>>2]=j-i;g[d+36>>2]=h-b;g[d+40>>2]=f;g[d+44>>2]=0.0;return d|0}function Di(b,d,e,f){b=b|0;d=+d;e=e|0;f=+f;var h=0,i=0.0,j=0;eb(c[6994]|0,0)|0;if(e){g[b+284>>2]=f;i=+g[b+280>>2]+d;g[b+280>>2]=i;if(!(i>=f)){d=f;j=0}else{g[b+280>>2]=i-+(~~(i/f)|0)*f;d=f;j=~~(i/f)}}else{g[b+280>>2]=a[b+316>>0]|0?0.0:d;g[b+284>>2]=0.0;j=!(+C(+d)<1.1920928955078125e-07)&1;e=j}if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0){h=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;a[28564]=(xb[c[(c[h>>2]|0)+56>>2]&127](h)|0)>>>4&1}if(j){h=(j|0)>(e|0)?e:j;Jb[c[(c[b>>2]|0)+168>>2]&31](b,d*+(h|0));Ib[c[(c[b>>2]|0)+176>>2]&511](b);if((h|0)>0){e=0;do{Jb[c[(c[b>>2]|0)+160>>2]&31](b,d);Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=e+1|0}while((e|0)<(h|0));e=b}else e=b}else{Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=b}Ib[c[(c[e>>2]|0)+120>>2]&511](b);c[6993]=(c[6993]|0)+1;return j|0}function Ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;f=c[b+24>>2]|0;if((f|0)<(i|0)){if((c[b+28>>2]|0)<(i|0)){if(!i){e=0;h=f}else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+24>>2]|0}if((h|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[b+32>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[b+32>>2]|0;if(g|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=e;c[b+28>>2]=i;e=b+32|0}else e=b+32|0;do{c[(c[e>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(i|0))}else e=b+32|0;c[b+24>>2]=i;f=c[e>>2]|0;if((i|0)<=0)return;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(i|0));return}function Fi(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==32&(d|0)==32)){if((b|0)==32){if((d|0)<20){a=a+92|0;break}if((d+-21|0)>>>0<9){a=a+100|0;break}}else{if((b|0)<20&(d|0)==32){a=a+96|0;break}if((b+-21|0)>>>0<9&(d|0)==32){a=a+104|0;break}if((b|0)==8&(d|0)==8){a=a+56|0;break}if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+88|0;while(0);return c[a>>2]|0}function Gi(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=6512;e=c[b+52>>2]|0;if((e|0)>0){d=0;do{f=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);f=c[b+4>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,c[(c[b+60>>2]|0)+(d<<2)>>2]|0)}d=d+1|0}while((d|0)!=(e|0))}d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+20>>2]|0;if(!d){a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}function Hi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0;if((e|0)>0)f=0;else return;do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));r=0;do{j=+g[a+16>>2];k=+g[b+(r<<4)>>2]*j;l=+g[a+20>>2];m=+g[b+(r<<4)+4>>2]*l;n=+g[a+24>>2];o=+g[b+(r<<4)+8>>2]*n;p=c[a+100>>2]|0;if((p|0)>0){q=c[a+108>>2]|0;f=-1;i=0;h=-3402823466385288598117041.0e14;do{s=k*+g[q+(i<<4)>>2]+m*+g[q+(i<<4)+4>>2]+o*+g[q+(i<<4)+8>>2];t=s>h;f=t?i:f;h=t?s:h;i=i+1|0}while((i|0)!=(p|0));o=+g[q+(f<<4)+4>>2]*l;s=+g[q+(f<<4)+8>>2]*n;g[d+(r<<4)>>2]=+g[q+(f<<4)>>2]*j;g[d+(r<<4)+4>>2]=o;g[d+(r<<4)+8>>2]=s}else h=-999999984306749440.0;g[d+(r<<4)+12>>2]=h;r=r+1|0}while((r|0)!=(e|0));return}function Ii(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;x=+g[a>>2]*f+ +g[a+16>>2]*h+ +g[a+32>>2]*i;v=+g[a+4>>2]*f+ +g[a+20>>2]*h+ +g[a+36>>2]*i;t=+g[a+8>>2]*f+ +g[a+24>>2]*h+ +g[a+40>>2]*i;s=+g[b>>2]*f+ +g[b+16>>2]*h+ +g[b+32>>2]*i;q=+g[b+4>>2]*f+ +g[b+20>>2]*h+ +g[b+36>>2]*i;o=+g[b+8>>2]*f+ +g[b+24>>2]*h+ +g[b+40>>2]*i;w=+g[j+80>>2];u=+g[j+84>>2];p=+g[j+88>>2];r=+g[k+80>>2];m=+g[k+84>>2];n=+g[k+88>>2];p=x*(x<0.0?-w:w)+v*(v<0.0?-u:u)+t*(t<0.0?-p:p);n=s*(s<0.0?-r:r)+q*(q<0.0?-m:m)+o*(o<0.0?-n:n);o=+g[j+96>>2];m=+g[k+96>>2];m=(p>o?p:o)+(n>m?n:m);return !((c*f+d*h+e*i+ml)|0}function Ji(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+772>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+776>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+772>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+776>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+772>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+776>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ji(a,b,e);if((f|0)<(d|0))b=f;else break}return} +function wd(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0;r=l;l=l+288|0;o=c[b+248>>2]|0;if((o|0)>0){h=c[b+256>>2]|0;i=r+224+48|0;m=r+64+28|0;e=0;do{n=c[h+(e<<2)>>2]|0;g[n+268>>2]=1.0;a:do switch(c[n+220>>2]|0){case 2:case 5:break;default:if(!(c[n+204>>2]&3)){Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,d,r+224|0);f=+g[i>>2]-+g[n+52>>2];j=+g[r+224+52>>2]-+g[n+56>>2];k=+g[r+224+56>>2]-+g[n+60>>2];do if((a[b+44>>0]|0?(s=+g[n+276>>2],s*s!=0.0?s*s>2]|0)+4>>2]|0)<20:0){c[5787]=(c[5787]|0)+1;u=c[b+68>>2]|0;u=xb[c[(c[u>>2]|0)+36>>2]&127](u)|0;t=c[b+24>>2]|0;g[r+120+4>>2]=1.0;c[r+120+16>>2]=c[n+52>>2];c[r+120+16+4>>2]=c[n+52+4>>2];c[r+120+16+8>>2]=c[n+52+8>>2];c[r+120+16+12>>2]=c[n+52+12>>2];c[r+120+32>>2]=c[i>>2];c[r+120+32+4>>2]=c[i+4>>2];c[r+120+32+8>>2]=c[i+8>>2];c[r+120+32+12>>2]=c[i+12>>2];c[r+120+80>>2]=0;c[r+120>>2]=4556;c[r+120+84>>2]=n;c[r+120+92>>2]=u;c[r+120+96>>2]=t;t=c[n+272>>2]|0;c[r+64+8>>2]=0;c[r+64+12>>2]=-1;c[r+64>>2]=7020;c[r+64+4>>2]=8;c[r+64+16>>2]=1065353216;c[r+64+20>>2]=1065353216;c[r+64+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[r+64+32>>2]=t;c[r+64+48>>2]=t;g[r+64+52>>2]=0.0;c[r+120+88>>2]=c[b+56>>2];t=c[n+188>>2]|0;c[r+120+8>>2]=c[t+4>>2];c[r+120+12>>2]=c[t+8>>2];c[r+48>>2]=c[i>>2];c[r+48+4>>2]=c[i+4>>2];c[r+48+8>>2]=c[i+8>>2];c[r+48+12>>2]=c[i+12>>2];c[r>>2]=c[n+4>>2];c[r+4>>2]=c[n+4+4>>2];c[r+8>>2]=c[n+4+8>>2];c[r+12>>2]=c[n+4+12>>2];c[r+16>>2]=c[n+20>>2];c[r+16+4>>2]=c[n+20+4>>2];c[r+16+8>>2]=c[n+20+8>>2];c[r+16+12>>2]=c[n+20+12>>2];c[r+32>>2]=c[n+36>>2];c[r+32+4>>2]=c[n+36+4>>2];c[r+32+8>>2]=c[n+36+8>>2];c[r+32+12>>2]=c[n+36+12>>2];Ud(b,r+64|0,n+4|0,r,r+120|0,0.0);f=+g[r+120+4>>2];if(f<1.0){g[n+268>>2]=f;Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,f*d,r+224|0);g[n+268>>2]=0.0;Oe(n,r+224|0);break a}else break}while(0);Oe(n,r+224|0)}}while(0);e=e+1|0}while((e|0)<(o|0))}if(!(a[b+291>>0]|0)){l=r;return}if((c[b+324>>2]|0)<=0){l=r;return}n=0;do{o=c[(c[b+332>>2]|0)+(n<<2)>>2]|0;h=c[o+772>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;m=c[o+776>>2]|0;m=(c[m+252>>2]&2|0)==0?0:m;e=c[o+780>>2]|0;if((e|0)>0)if(!h){h=0;do{f=+g[58]*+g[m+232>>2];if(f>0.0?(p=+g[o+4+(h*192|0)+124>>2],p!=0.0):0){k=f*+g[o+4+(h*192|0)+64>>2]*p;d=f*+g[o+4+(h*192|0)+68>>2]*p;s=f*+g[o+4+(h*192|0)+72>>2]*p;f=+g[o+4+(h*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(h*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(h*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}h=h+1|0}while((h|0)<(e|0))}else{i=0;do{f=+g[h+232>>2]*+g[m+232>>2];if(f>0.0?(q=+g[o+4+(i*192|0)+124>>2],q!=0.0):0){k=f*+g[o+4+(i*192|0)+64>>2]*q;d=f*+g[o+4+(i*192|0)+68>>2]*q;s=f*+g[o+4+(i*192|0)+72>>2]*q;g[r+224>>2]=-k;g[r+224+4>>2]=-d;g[r+224+8>>2]=-s;g[r+224+12>>2]=0.0;j=+g[o+4+(i*192|0)+52>>2]-+g[h+56>>2];f=+g[o+4+(i*192|0)+56>>2]-+g[h+60>>2];g[r+120>>2]=+g[o+4+(i*192|0)+48>>2]-+g[h+52>>2];g[r+120+4>>2]=j;g[r+120+8>>2]=f;g[r+120+12>>2]=0.0;f=+g[o+4+(i*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(i*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(i*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;ll(h,r+224|0,r+120|0);g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}i=i+1|0}while((i|0)<(e|0))}n=n+1|0}while((n|0)<(c[b+324>>2]|0));l=r;return}function xd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0;q=l;l=l+240|0;c[a+4>>2]=(c[a+4>>2]|0)+1;p=c[b+36>>2]|0;o=c[d+36>>2]|0;f=c[a+8>>2]|0;J=c[(c[f+4>>2]|0)+28>>2]|0;d=c[J+(p*80|0)+64>>2]|0;b=(c[(c[a+12>>2]|0)+4>>2]|0)+28|0;e=c[(c[b>>2]|0)+(o*80|0)+64>>2]|0;f=c[f+12>>2]|0;n=+g[f>>2];H=+g[f+4>>2];I=+g[f+8>>2];h=+g[f+16>>2];k=+g[f+20>>2];t=+g[f+24>>2];r=+g[f+32>>2];u=+g[f+36>>2];C=+g[f+40>>2];v=+g[J+(p*80|0)>>2];w=+g[J+(p*80|0)+16>>2];x=+g[J+(p*80|0)+32>>2];y=+g[J+(p*80|0)+4>>2];z=+g[J+(p*80|0)+20>>2];A=+g[J+(p*80|0)+36>>2];i=+g[J+(p*80|0)+8>>2];B=+g[J+(p*80|0)+24>>2];D=+g[J+(p*80|0)+40>>2];s=+g[J+(p*80|0)+48>>2];j=+g[J+(p*80|0)+52>>2];G=+g[J+(p*80|0)+56>>2];E=+g[f+48>>2]+(n*s+H*j+I*G);F=+g[f+52>>2]+(h*s+k*j+t*G);G=+g[f+56>>2]+(r*s+u*j+C*G);g[q+176>>2]=n*v+H*w+I*x;g[q+176+4>>2]=n*y+H*z+I*A;g[q+176+8>>2]=n*i+H*B+I*D;g[q+176+12>>2]=0.0;g[q+176+16>>2]=h*v+k*w+t*x;g[q+176+20>>2]=h*y+k*z+t*A;g[q+176+24>>2]=h*i+k*B+t*D;g[q+176+28>>2]=0.0;g[q+176+32>>2]=r*v+u*w+C*x;g[q+176+36>>2]=r*y+u*z+C*A;g[q+176+40>>2]=r*i+u*B+C*D;g[q+176+44>>2]=0.0;g[q+176+48>>2]=E;g[q+176+52>>2]=F;g[q+176+56>>2]=G;g[q+176+60>>2]=0.0;f=c[(c[a+12>>2]|0)+12>>2]|0;G=+g[f>>2];F=+g[f+4>>2];E=+g[f+8>>2];D=+g[f+16>>2];C=+g[f+20>>2];B=+g[f+24>>2];u=+g[f+32>>2];i=+g[f+36>>2];r=+g[f+40>>2];b=c[b>>2]|0;A=+g[b+(o*80|0)>>2];z=+g[b+(o*80|0)+16>>2];y=+g[b+(o*80|0)+32>>2];x=+g[b+(o*80|0)+4>>2];w=+g[b+(o*80|0)+20>>2];v=+g[b+(o*80|0)+36>>2];t=+g[b+(o*80|0)+8>>2];k=+g[b+(o*80|0)+24>>2];h=+g[b+(o*80|0)+40>>2];I=+g[b+(o*80|0)+48>>2];H=+g[b+(o*80|0)+52>>2];n=+g[b+(o*80|0)+56>>2];j=+g[f+48>>2]+(G*I+F*H+E*n);s=+g[f+52>>2]+(D*I+C*H+B*n);n=+g[f+56>>2]+(u*I+i*H+r*n);g[q+112>>2]=G*A+F*z+E*y;g[q+112+4>>2]=G*x+F*w+E*v;g[q+112+8>>2]=G*t+F*k+E*h;g[q+112+12>>2]=0.0;g[q+112+16>>2]=D*A+C*z+B*y;g[q+112+20>>2]=D*x+C*w+B*v;g[q+112+24>>2]=D*t+C*k+B*h;g[q+112+28>>2]=0.0;g[q+112+32>>2]=u*A+i*z+r*y;g[q+112+36>>2]=u*x+i*w+r*v;g[q+112+40>>2]=u*t+i*k+r*h;g[q+112+44>>2]=0.0;g[q+112+48>>2]=j;g[q+112+52>>2]=s;g[q+112+56>>2]=n;g[q+112+60>>2]=0.0;Vb[c[(c[d>>2]|0)+8>>2]&127](d,q+176|0,q+96|0,q+80|0);Vb[c[(c[e>>2]|0)+8>>2]&127](e,q+112|0,q+64|0,q+48|0);n=+g[(c[a+24>>2]|0)+32>>2];s=+g[q+96>>2]-n;g[q+96>>2]=s;j=+g[q+96+4>>2]-n;g[q+96+4>>2]=j;h=+g[q+96+8>>2]-n;g[q+96+8>>2]=h;r=n+ +g[q+80>>2];g[q+80>>2]=r;k=n+ +g[q+80+4>>2];g[q+80+4>>2]=k;i=n+ +g[q+80+8>>2];g[q+80+8>>2]=i;if(!(s>+g[q+48>>2])?!(r<+g[q+64>>2]):0)b=1;else b=0;if(!(!(h>+g[q+48+8>>2])?!(i<+g[q+64+8>>2]):0))b=0;if(j>+g[q+48+4>>2]){l=q;return}if(k<+g[q+64+4>>2]|b^1){l=q;return}f=c[a+8>>2]|0;b=c[f+8>>2]|0;c[q+24>>2]=f;c[q+24+4>>2]=d;c[q+24+8>>2]=b;c[q+24+12>>2]=q+176;c[q+24+16>>2]=-1;c[q+24+20>>2]=p;b=c[a+12>>2]|0;f=c[b+8>>2]|0;c[q>>2]=b;c[q+4>>2]=e;c[q+8>>2]=f;c[q+12>>2]=q+112;c[q+16>>2]=-1;c[q+20>>2]=o;f=c[a+28>>2]|0;c[6416]=(c[6416]|0)+1;b=(((o<<16|p)+~((o<<16|p)<<15)|0)>>>10^(o<<16|p)+~((o<<16|p)<<15))*9|0;b=(c[f+12>>2]|0)+-1&(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11));a:do if((b|0)<(c[f+28>>2]|0)?(m=c[(c[f+36>>2]|0)+(b<<2)>>2]|0,(m|0)!=-1):0){e=c[f+16>>2]|0;d=m;while(1){b=e+(d*12|0)|0;if((c[b>>2]|0)==(p|0)?(c[e+(d*12|0)+4>>2]|0)==(o|0):0)break a;d=c[(c[f+56>>2]|0)+(d<<2)>>2]|0;if((d|0)==-1){b=0;break}}}else b=0;while(0);do if(!(n>0.0))if(!b){b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,c[a+32>>2]|0,1)|0;J=c[a+28>>2]|0;c[(Bb[c[(c[J>>2]|0)+12>>2]&63](J,p,o)|0)+8>>2]=b;break}else{b=c[b+8>>2]|0;break}else{b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,0,2)|0}while(0);J=c[a+24>>2]|0;f=c[J+8>>2]|0;m=c[J+12>>2]|0;c[J+8>>2]=q+24;c[J+12>>2]=q;Sb[c[(c[J>>2]|0)+8>>2]&127](J,-1,p);J=c[a+24>>2]|0;Sb[c[(c[J>>2]|0)+12>>2]&127](J,-1,o);Zb[c[(c[b>>2]|0)+8>>2]&31](b,q+24|0,q,c[a+20>>2]|0,c[a+24>>2]|0);J=c[a+24>>2]|0;c[J+8>>2]=f;c[J+12>>2]=m;l=q;return}function yd(b,d,e){b=b|0;d=d|0;e=e|0;fi(b,d,e)|0;c[d+52>>2]=c[b+48>>2];c[d+56>>2]=c[b+52>>2];c[d+60>>2]=c[b+56>>2];c[d+64>>2]=c[b+60>>2];c[d+68>>2]=c[b+64>>2];c[d+72>>2]=c[b+68>>2];c[d+76>>2]=c[b+72>>2];c[d+80>>2]=c[b+76>>2];c[d+84>>2]=c[b+80>>2];c[d+88>>2]=c[b+84>>2];c[d+92>>2]=c[b+88>>2];c[d+96>>2]=c[b+92>>2];c[d+100>>2]=c[b+96>>2];c[d+104>>2]=c[b+100>>2];c[d+108>>2]=c[b+104>>2];c[d+112>>2]=c[b+108>>2];c[d+116>>2]=c[b+112>>2];c[d+120>>2]=c[b+116>>2];c[d+124>>2]=c[b+120>>2];c[d+128>>2]=c[b+124>>2];c[d+132>>2]=c[b+128>>2];c[d+136>>2]=c[b+132>>2];c[d+140>>2]=c[b+136>>2];c[d+144>>2]=c[b+140>>2];c[d+148>>2]=c[b+144>>2];c[d+152>>2]=c[b+148>>2];c[d+156>>2]=c[b+152>>2];c[d+160>>2]=c[b+156>>2];c[d+164>>2]=c[b+160>>2];c[d+168>>2]=c[b+164>>2];c[d+172>>2]=c[b+168>>2];c[d+176>>2]=c[b+172>>2];c[d+428>>2]=c[b+968>>2];c[d+412>>2]=c[b+972>>2];c[d+444>>2]=c[b+976>>2];c[d+460>>2]=c[b+980>>2];c[d+476>>2]=c[b+984>>2];c[d+492>>2]=c[b+988>>2];c[d+508>>2]=c[b+992>>2];c[d+524>>2]=c[b+1e3>>2];c[d+540>>2]=c[b+1004>>2];c[d+556>>2]=c[b+1012>>2];c[d+572>>2]=c[b+1020>>2];c[d+588>>2]=c[b+1028>>2];c[d+604>>2]=c[b+1036>>2];c[d+432>>2]=c[b+1056>>2];c[d+416>>2]=c[b+1060>>2];c[d+448>>2]=c[b+1064>>2];c[d+464>>2]=c[b+1068>>2];c[d+480>>2]=c[b+1072>>2];c[d+496>>2]=c[b+1076>>2];c[d+512>>2]=c[b+1080>>2];c[d+528>>2]=c[b+1088>>2];c[d+544>>2]=c[b+1092>>2];c[d+560>>2]=c[b+1100>>2];c[d+576>>2]=c[b+1108>>2];c[d+592>>2]=c[b+1116>>2];c[d+608>>2]=c[b+1124>>2];c[d+436>>2]=c[b+1144>>2];c[d+420>>2]=c[b+1148>>2];c[d+452>>2]=c[b+1152>>2];c[d+468>>2]=c[b+1156>>2];c[d+484>>2]=c[b+1160>>2];c[d+500>>2]=c[b+1164>>2];c[d+516>>2]=c[b+1168>>2];c[d+532>>2]=c[b+1176>>2];c[d+548>>2]=c[b+1180>>2];c[d+564>>2]=c[b+1188>>2];c[d+580>>2]=c[b+1196>>2];c[d+596>>2]=c[b+1204>>2];c[d+612>>2]=c[b+1212>>2];g[d+440>>2]=0.0;g[d+424>>2]=0.0;g[d+456>>2]=0.0;g[d+472>>2]=0.0;g[d+488>>2]=0.0;g[d+504>>2]=0.0;g[d+520>>2]=0.0;g[d+536>>2]=0.0;g[d+552>>2]=0.0;g[d+568>>2]=0.0;g[d+584>>2]=0.0;g[d+600>>2]=0.0;g[d+616>>2]=0.0;a[d+620>>0]=a[b+996>>0]|0;a[d+624>>0]=a[b+1008>>0]|0;a[d+628>>0]=a[b+1016>>0]|0;a[d+632>>0]=a[b+1024>>0]|0;a[d+636>>0]=a[b+1032>>0]|0;a[d+621>>0]=a[b+1084>>0]|0;a[d+625>>0]=a[b+1096>>0]|0;a[d+629>>0]=a[b+1104>>0]|0;a[d+633>>0]=a[b+1112>>0]|0;a[d+637>>0]=a[b+1120>>0]|0;a[d+622>>0]=a[b+1172>>0]|0;a[d+626>>0]=a[b+1184>>0]|0;a[d+630>>0]=a[b+1192>>0]|0;a[d+634>>0]=a[b+1200>>0]|0;a[d+638>>0]=a[b+1208>>0]|0;a[d+623>>0]=0;a[d+627>>0]=0;a[d+631>>0]=0;a[d+635>>0]=0;a[d+639>>0]=0;c[d+196>>2]=c[b+680>>2];c[d+200>>2]=c[b+684>>2];c[d+204>>2]=c[b+688>>2];c[d+208>>2]=c[b+692>>2];c[d+180>>2]=c[b+696>>2];c[d+184>>2]=c[b+700>>2];c[d+188>>2]=c[b+704>>2];c[d+192>>2]=c[b+708>>2];c[d+212>>2]=c[b+712>>2];c[d+216>>2]=c[b+716>>2];c[d+220>>2]=c[b+720>>2];c[d+224>>2]=c[b+724>>2];c[d+228>>2]=c[b+728>>2];c[d+232>>2]=c[b+732>>2];c[d+236>>2]=c[b+736>>2];c[d+240>>2]=c[b+740>>2];c[d+244>>2]=c[b+744>>2];c[d+248>>2]=c[b+748>>2];c[d+252>>2]=c[b+752>>2];c[d+256>>2]=c[b+756>>2];c[d+260>>2]=c[b+760>>2];c[d+264>>2]=c[b+764>>2];c[d+268>>2]=c[b+768>>2];c[d+272>>2]=c[b+772>>2];c[d+276>>2]=c[b+776>>2];c[d+280>>2]=c[b+780>>2];c[d+284>>2]=c[b+784>>2];c[d+288>>2]=c[b+788>>2];c[d+292>>2]=c[b+876>>2];c[d+296>>2]=c[b+880>>2];c[d+300>>2]=c[b+884>>2];c[d+304>>2]=c[b+888>>2];c[d+308>>2]=c[b+892>>2];c[d+312>>2]=c[b+896>>2];c[d+316>>2]=c[b+900>>2];c[d+320>>2]=c[b+904>>2];c[d+324>>2]=c[b+804>>2];c[d+328>>2]=c[b+808>>2];c[d+332>>2]=c[b+812>>2];c[d+336>>2]=c[b+816>>2];c[d+340>>2]=c[b+820>>2];c[d+344>>2]=c[b+824>>2];c[d+348>>2]=c[b+828>>2];c[d+352>>2]=c[b+832>>2];c[d+356>>2]=c[b+840>>2];c[d+360>>2]=c[b+844>>2];c[d+364>>2]=c[b+848>>2];c[d+368>>2]=c[b+852>>2];c[d+372>>2]=c[b+860>>2];c[d+376>>2]=c[b+864>>2];c[d+380>>2]=c[b+868>>2];c[d+384>>2]=c[b+872>>2];a[d+388>>0]=a[b+792>>0]|0;a[d+392>>0]=a[b+795>>0]|0;a[d+396>>0]=a[b+798>>0]|0;a[d+400>>0]=a[b+836>>0]|0;a[d+404>>0]=a[b+856>>0]|0;a[d+389>>0]=a[b+793>>0]|0;a[d+393>>0]=a[b+796>>0]|0;a[d+397>>0]=a[b+799>>0]|0;a[d+401>>0]=a[b+837>>0]|0;a[d+405>>0]=a[b+857>>0]|0;a[d+390>>0]=a[b+794>>0]|0;a[d+394>>0]=a[b+797>>0]|0;a[d+398>>0]=a[b+800>>0]|0;a[d+402>>0]=a[b+838>>0]|0;a[d+406>>0]=a[b+858>>0]|0;a[d+391>>0]=0;a[d+395>>0]=0;a[d+399>>0]=0;a[d+403>>0]=0;a[d+407>>0]=0;c[d+640>>2]=c[b+1232>>2];c[d+408>>2]=0;return 12302}function zd(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0;I=l;l=l+128|0;c[I+16>>2]=i;c[I+16+4>>2]=j;c[I+16+8>>2]=k;c[I>>2]=e;c[I+4>>2]=f;c[I+8>>2]=h;if(!(+g[d+52>>2]<+g[b+12>>2])){m=0;l=I;return m|0}w=+g[d+36>>2];y=+g[d+40>>2];x=+g[d+44>>2];k=c[d+48>>2]|0;z=1.0/+D(+(w*w+y*y+x*x));h=ui(I)|0;A=+g[d+4>>2]-+g[h+48>>2];B=+g[d+8>>2]-+g[h+52>>2];C=+g[d+12>>2]-+g[h+56>>2];h=ui(I+16|0)|0;E=+g[d+20>>2]-+g[h+48>>2];F=+g[d+24>>2]-+g[h+52>>2];G=+g[d+28>>2]-+g[h+56>>2];if(!f)if(!e){p=0.0;s=0.0;q=0.0;n=0.0;o=0.0;r=0.0}else{r=+g[e+336>>2];o=+g[e+340>>2];v=+g[e+332>>2];p=+g[e+316>>2];s=+g[e+320>>2];q=+g[e+324>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}else{r=+g[f+392>>2];o=+g[f+396>>2];v=+g[f+388>>2];p=+g[f+372>>2];s=+g[f+376>>2];q=+g[f+380>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}v=p+n;u=s+o;t=q+r;if(!j)if(!i){r=0.0;s=0.0;n=0.0;o=0.0;p=0.0;q=0.0}else{q=+g[i+336>>2];p=+g[i+340>>2];J=+g[i+332>>2];r=+g[i+316>>2];s=+g[i+320>>2];n=+g[i+324>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}else{q=+g[j+392>>2];p=+g[j+396>>2];J=+g[j+388>>2];r=+g[j+372>>2];s=+g[j+376>>2];n=+g[j+380>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}r=v-(r+o);u=u-(s+p);t=t-(n+q);v=x*z*t+(y*z*u+w*z*r);J=+g[d+52>>2]-+g[b+12>>2];c[m+4>>2]=c[I>>2];c[m+4+4>>2]=c[I+4>>2];c[m+4+8>>2]=c[I+8>>2];c[m+16>>2]=c[I+16>>2];c[m+16+4>>2]=c[I+16+4>>2];c[m+16+8>>2]=c[I+16+8>>2];d=ui(I)|0;s=A*+g[d+4>>2]+B*+g[d+20>>2]+C*+g[d+36>>2];q=A*+g[d+8>>2]+B*+g[d+24>>2]+C*+g[d+40>>2];g[m+28>>2]=A*+g[d>>2]+B*+g[d+16>>2]+C*+g[d+32>>2];g[m+32>>2]=s;g[m+36>>2]=q;g[m+40>>2]=0.0;d=ui(I+16|0)|0;q=E*+g[d+4>>2]+F*+g[d+20>>2]+G*+g[d+36>>2];s=E*+g[d+8>>2]+F*+g[d+24>>2]+G*+g[d+40>>2];g[m+44>>2]=E*+g[d>>2]+F*+g[d+16>>2]+G*+g[d+32>>2];g[m+48>>2]=q;g[m+52>>2]=s;g[m+56>>2]=0.0;g[m+164>>2]=A;g[m+168>>2]=B;g[m+172>>2]=C;g[m+176>>2]=0.0;g[m+180>>2]=E;g[m+184>>2]=F;g[m+188>>2]=G;g[m+192>>2]=0.0;g[m+60>>2]=1.0;g[m+64>>2]=1.0;c[m+156>>2]=0;c[m+160>>2]=0;g[m+68>>2]=1.0;g[m+72>>2]=w*z*J;g[m+76>>2]=y*z*J;g[m+80>>2]=x*z*J;g[m+84>>2]=0.0;g[m+196>>2]=w*z;g[m+200>>2]=y*z;g[m+204>>2]=x*z;c[m+208>>2]=k;a[m+152>>0]=0;J=+g[b+16>>2];g[m+212>>2]=(t-x*z*v)*(t-x*z*v)+((r-w*z*v)*(r-w*z*v)+(u-y*z*v)*(u-y*z*v))>2]|0;if(!k){k=c[I>>2]|0;if(!k)o=0.0;else{k=k+128|0;H=14}}else{k=k+404|0;H=14}if((H|0)==14)o=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+4>>2]|0;if(!k){e=c[I>>2]|0;e=(e|0)==0?22904:e+180|0}else e=k+324|0;k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;if(!k)n=0.0;else{k=k+128|0;H=25}}else{k=k+404|0;H=25}if((H|0)==25)n=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;k=(k|0)==0?22904:k+180|0}else k=k+324|0;Uh(I+80|0,o,e,+g[m+164>>2],+g[m+168>>2],+g[m+172>>2]);Uh(I+32|0,n,k,+g[m+180>>2],+g[m+184>>2],+g[m+188>>2]);C=+g[I+80>>2]+ +g[I+32>>2];F=+g[I+80+4>>2]+ +g[I+32+4>>2];y=+g[I+80+8>>2]+ +g[I+32+8>>2];G=+g[I+80+16>>2]+ +g[I+32+16>>2];E=+g[I+80+20>>2]+ +g[I+32+20>>2];z=+g[I+80+24>>2]+ +g[I+32+24>>2];A=+g[I+80+32>>2]+ +g[I+32+32>>2];B=+g[I+80+36>>2]+ +g[I+32+36>>2];x=+g[I+80+40>>2]+ +g[I+32+40>>2];J=1.0/(y*(G*B-E*A)+(C*(E*x-z*B)+F*(z*A-G*x)));g[m+104>>2]=(E*x-z*B)*J;g[m+108>>2]=(y*B-F*x)*J;g[m+112>>2]=(F*z-y*E)*J;g[m+116>>2]=0.0;g[m+120>>2]=(z*A-G*x)*J;g[m+124>>2]=(C*x-y*A)*J;g[m+128>>2]=(y*G-C*z)*J;g[m+132>>2]=0.0;g[m+136>>2]=(G*B-E*A)*J;g[m+140>>2]=(F*A-C*B)*J;g[m+144>>2]=(C*E-F*G)*J;g[m+148>>2]=0.0;m=1;l=I;return m|0}function Ad(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0;u=l;l=l+288|0;q=c[b+4>>2]|0;a[q+312>>0]=0;c[q>>2]=0;a[q+356>>0]=1;c[q+292>>2]=1566444395;c[q+296>>2]=1566444395;c[q+300>>2]=1566444395;g[q+304>>2]=0.0;c[q+336>>2]=0;c[q+336+4>>2]=0;c[q+336+8>>2]=0;c[q+336+12>>2]=0;a[q+336+16>>0]=0;a[q+332>>0]=a[q+332>>0]&-16;r=+g[e+48>>2]-+g[d+48>>2]-(+g[h+48>>2]-+g[f+48>>2]);s=+g[e+52>>2]-+g[d+52>>2]-(+g[h+52>>2]-+g[f+52>>2]);t=+g[e+56>>2]-+g[d+56>>2]-(+g[h+56>>2]-+g[f+56>>2]);c[u+216>>2]=9504;g[u+216+36>>2]=999999984306749440.0;a[u+216+40>>0]=0;q=c[b+8>>2]|0;p=c[b+12>>2]|0;o=c[b+4>>2]|0;c[u+136>>2]=9552;c[u+136+4>>2]=0;c[u+136+8>>2]=1065353216;c[u+136+12>>2]=0;g[u+136+16>>2]=0.0;c[u+136+20>>2]=0;c[u+136+24>>2]=o;c[u+136+28>>2]=q;c[u+136+32>>2]=p;c[u+136+36>>2]=c[q+4>>2];c[u+136+40>>2]=c[p+4>>2];g[u+136+44>>2]=+nb[c[(c[q>>2]|0)+48>>2]&15](q);g[u+136+48>>2]=+nb[c[(c[p>>2]|0)+48>>2]&15](p);a[u+136+52>>0]=0;c[u+136+60>>2]=-1;c[u+136+72>>2]=1;c[u+136+76>>2]=1;g[u+128>>2]=999999984306749440.0;c[u>>2]=c[d>>2];c[u+4>>2]=c[d+4>>2];c[u+8>>2]=c[d+8>>2];c[u+12>>2]=c[d+12>>2];c[u+16>>2]=c[d+16>>2];c[u+16+4>>2]=c[d+16+4>>2];c[u+16+8>>2]=c[d+16+8>>2];c[u+16+12>>2]=c[d+16+12>>2];c[u+32>>2]=c[d+32>>2];c[u+32+4>>2]=c[d+32+4>>2];c[u+32+8>>2]=c[d+32+8>>2];c[u+32+12>>2]=c[d+32+12>>2];c[u+48>>2]=c[d+48>>2];c[u+48+4>>2]=c[d+48+4>>2];c[u+48+8>>2]=c[d+48+8>>2];c[u+48+12>>2]=c[d+48+12>>2];c[u+64>>2]=c[f>>2];c[u+64+4>>2]=c[f+4>>2];c[u+64+8>>2]=c[f+8>>2];c[u+64+12>>2]=c[f+12>>2];c[u+80>>2]=c[f+16>>2];c[u+80+4>>2]=c[f+16+4>>2];c[u+80+8>>2]=c[f+16+8>>2];c[u+80+12>>2]=c[f+16+12>>2];c[u+96>>2]=c[f+32>>2];c[u+96+4>>2]=c[f+32+4>>2];c[u+96+8>>2]=c[f+32+8>>2];c[u+96+12>>2]=c[f+32+12>>2];c[u+112>>2]=c[f+48>>2];c[u+112+4>>2]=c[f+48+4>>2];c[u+112+8>>2]=c[f+48+8>>2];c[u+112+12>>2]=c[f+48+12>>2];Dc(u+136|0,u,u+216|0,0,0);p=(a[u+216+40>>0]|0)==0;q=u+216+20|0;c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];if(p){i=0;l=u;return i|0}n=+g[u+216+36>>2];k=+g[u+216+16>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;do if(n>1.0000000474974513e-03){p=0;k=0.0;while(1){if((p|0)>31){b=0;p=13;break}w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;v=k;k=k-n/(t*(c[j>>2]=b,+g[j>>2])+w);if(!(!(k<=v)&(!(k<0.0)&!(k>1.0)))){b=0;p=13;break}Jb[c[c[i>>2]>>2]&31](i,k);w=1.0-k;g[u+48>>2]=w*+g[d+48>>2]+k*+g[e+48>>2];g[u+52>>2]=w*+g[d+52>>2]+k*+g[e+52>>2];g[u+56>>2]=w*+g[d+56>>2]+k*+g[e+56>>2];g[u+112>>2]=w*+g[f+48>>2]+k*+g[h+48>>2];g[u+116>>2]=w*+g[f+52>>2]+k*+g[h+52>>2];g[u+120>>2]=w*+g[f+56>>2]+k*+g[h+56>>2];Dc(u+136|0,u,u+216|0,0,0);if(!(a[u+216+40>>0]|0)){b=0;p=13;break}n=+g[u+216+36>>2];if(n<0.0){p=8;break}c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;if(!(n>1.0000000474974513e-03)){p=10;break}else p=p+1|0}if((p|0)==8){g[i+164>>2]=k;e=c[u+216+8>>2]|0;f=c[u+216+12>>2]|0;h=c[u+216+16>>2]|0;c[i+132>>2]=c[u+216+4>>2];c[i+136>>2]=e;c[i+140>>2]=f;c[i+144>>2]=h;c[i+148>>2]=c[q>>2];c[i+148+4>>2]=c[q+4>>2];c[i+148+8>>2]=c[q+8>>2];c[i+148+12>>2]=c[q+12>>2];i=1;l=u;return i|0}else if((p|0)==10){n=k;k=+g[u+216+16>>2];break}else if((p|0)==13){l=u;return b|0}}else n=0.0;while(0);w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;if(t*(c[j>>2]=b,+g[j>>2])+w>=-+g[i+172>>2]){i=0;l=u;return i|0}g[i+164>>2]=n;c[i+132>>2]=o;c[i+136>>2]=m;c[i+140>>2]=b;g[i+144>>2]=k;c[i+148>>2]=c[u+264>>2];c[i+148+4>>2]=c[u+264+4>>2];c[i+148+8>>2]=c[u+264+8>>2];c[i+148+12>>2]=c[u+264+12>>2];i=1;l=u;return i|0}function Bd(a,d,f,h,i){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;P=l;l=l+16|0;c[d+16>>2]=c[f>>2];c[d+16+4>>2]=c[f+4>>2];c[d+16+8>>2]=c[f+8>>2];c[d+16+12>>2]=c[f+12>>2];c[d+32>>2]=c[h>>2];c[d+32+4>>2]=c[h+4>>2];c[d+32+8>>2]=c[h+8>>2];c[d+32+12>>2]=c[h+12>>2];H=c[a+60>>2]|0;I=c[d+12>>2]&65535;q=+g[a+8>>2];s=+g[a+12>>2];x=+g[a+16>>2];r=+g[a+40>>2];k=(+g[f>>2]-q)*r;u=+g[a+44>>2];m=(+g[f+4>>2]-s)*u;y=+g[a+48>>2];o=(+g[f+8>>2]-x)*y;if(!(k<=0.0)){p=b[a+6>>1]|0;p=(!(k>=+(p&65535))?~~k&65535:p)&b[a+4>>1]}else p=0;b[P+6>>1]=p;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]}else j=0;b[P+6+2>>1]=j;if(!(o<=0.0)){j=b[a+6>>1]|0;j=(!(o>=+(j&65535))?~~o&65535:j)&b[a+4>>1]}else j=0;b[P+6+4>>1]=j;o=(+g[h>>2]-q)*r;m=(+g[h+4>>2]-s)*u;k=(+g[h+8>>2]-x)*y;if(!(o<=0.0)){n=b[a+6>>1]|0;n=(!(o>=+(n&65535))?~~o&65535:n)&b[a+4>>1]|1}else n=1;b[P>>1]=n;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]|1}else j=1;b[P+2>>1]=j;if(!(k<=0.0)){j=b[a+6>>1]|0;j=(!(k>=+(j&65535))?~~k&65535:j)&b[a+4>>1]|1}else j=1;b[P+4>>1]=j;G=0;while(1){D=b[H+(I<<6)+48+(G<<1)>>1]|0;E=b[H+(I<<6)+54+(G<<1)>>1]|0;B=a+68+(G<<2)|0;A=c[B>>2]|0;C=(p&65535)-(e[A+((D&65535)<<2)>>1]|0)|0;F=(n&65535)-(e[A+((E&65535)<<2)>>1]|0)|0;b[A+((D&65535)<<2)>>1]=p;b[A+((E&65535)<<2)>>1]=n;if((C|0)<0)xh(a,G,D);a:do if((F|0)>0?(J=c[B>>2]|0,K=c[a+60>>2]|0,L=e[J+((E&65535)<<2)+2>>1]|0,M=b[J+((E&65535)<<2)+6>>1]|0,M<<16>>16):0){z=1<>1]|0;if((e[w>>1]|0)<(n&65535))break a;t=c[a+60>>2]|0;p=j&65535;if(!(n&1)){do if((((e[K+(L<<6)+54+(z<<1)>>1]|0)>=(e[t+(p<<6)+48+(z<<1)>>1]|0)?(e[t+(p<<6)+54+(z<<1)>>1]|0)>=(e[K+(L<<6)+48+(z<<1)>>1]|0):0)?(e[K+(L<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0)?(e[t+(p<<6)+54+((1<>1]|0)>=(e[K+(L<<6)+48+((1<>1]|0):0){n=c[a+92>>2]|0;j=t+((e[w+2>>1]|0)<<6)|0;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0;n=c[a+96>>2]|0;if(!n)break;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0}while(0);j=t+(p<<6)+48+(G<<1)|0}else j=t+(p<<6)+54+(G<<1)|0;b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[A>>1]=(b[A>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;t=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=t;b[w+2>>1]=t>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);b:do if((C|0)>0?(N=c[B>>2]|0,O=b[N+((D&65535)<<2)+6>>1]|0,O<<16>>16):0){z=(c[a+60>>2]|0)+((e[N+((D&65535)<<2)+2>>1]|0)<<6)+48+(G<<1)|0;A=1<>1]|0;if((e[w>>1]|0)<(n&65535))break b;t=c[a+60>>2]|0;p=j&65535;if(!(n&1))j=t+(p<<6)+48+(G<<1)|0;else{j=e[w+2>>1]|0;do if(((e[t+(j<<6)+54+(A<<1)>>1]|0)>=(e[t+(p<<6)+48+(A<<1)>>1]|0)?(e[t+(p<<6)+54+(A<<1)>>1]|0)>=(e[t+(j<<6)+48+(A<<1)>>1]|0):0)?(e[t+(j<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0){if((e[t+(p<<6)+54+((1<>1]|0)<(e[t+(j<<6)+48+((1<>1]|0))break;n=c[a+92>>2]|0;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0;n=c[a+96>>2]|0;if(!n)break;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0}while(0);j=t+(p<<6)+54+(G<<1)|0}b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[z>>1]=(b[z>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;D=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=D;b[w+2>>1]=D>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);if((F|0)<0)sh(a,G,E,i);j=G+1|0;if((j|0)==3)break;G=j;p=b[P+6+(j<<1)>>1]|0;n=b[P+(j<<1)>>1]|0}j=c[a+108>>2]|0;if(!j){l=P;return}Zb[c[(c[j>>2]|0)+16>>2]&31](j,c[d+60>>2]|0,f,h,i);l=P;return}function Cd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;b=c[7001]|0;d=c[a+-4>>2]|0;j=a+-8+(d&-8)|0;do if(!(d&1)){e=c[a+-8>>2]|0;if(!(d&3))return;h=a+-8+(0-e)|0;g=e+(d&-8)|0;if(h>>>0>>0)return;if((h|0)==(c[7002]|0)){a=c[j+4>>2]|0;if((a&3|0)!=3){i=h;b=g;break}c[6999]=g;c[j+4>>2]=a&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[6997]=c[6997]&~(1<<(e>>>3));i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){a=c[h+16+4>>2]|0;if(!a){a=c[h+16>>2]|0;if(!a){a=0;break}else e=h+16|0}else e=h+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;if((h|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=c[6998]&~(1<>2]|0)!=(h|0)&1)<<2)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=c[h+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[h+16+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=a+-8|0;b=d&-8;h=a+-8|0}while(0);if(h>>>0>=j>>>0)return;d=c[j+4>>2]|0;if(!(d&1))return;if(!(d&2)){a=c[7002]|0;if((j|0)==(c[7003]|0)){j=(c[7e3]|0)+b|0;c[7e3]=j;c[7003]=i;c[i+4>>2]=j|1;if((i|0)!=(a|0))return;c[7002]=0;c[6999]=0;return}if((j|0)==(a|0)){j=(c[6999]|0)+b|0;c[6999]=j;c[7002]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(d&-8)+b|0;do if(d>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[6997]=c[6997]&~(1<<(d>>>3));break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){a=c[j+16+4>>2]|0;if(!a){a=c[j+16>>2]|0;if(!a){b=0;break}else e=j+16|0}else e=j+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);if(g|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=c[6998]&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+16+4>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[7002]|0)){c[6999]=f;return}}else{c[j+4>>2]=d&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=28028+(d<<1<<2);return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{j=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(j+245760|0)>>>16&2)+(j<<((j+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[i+28>>2]=a;c[i+20>>2]=0;c[i+16>>2]=0;b=c[6998]|0;d=1<>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){a=73;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){a=72;break}else{b=b<<1;d=a}}if((a|0)==72){c[e>>2]=i;c[i+24>>2]=d;c[i+12>>2]=i;c[i+8>>2]=i;break}else if((a|0)==73){h=d+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=d;c[i+24>>2]=0;break}}else{c[6998]=b|d;c[e>>2]=i;c[i+24>>2]=e;c[i+12>>2]=i;c[i+8>>2]=i}while(0);j=(c[7005]|0)+-1|0;c[7005]=j;if(!j)a=28444;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[7005]=-1;return}function Dd(b){b=b|0;var d=0.0,e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;q=l;l=l+192|0;if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=q;return}i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ib[c[(c[i>>2]|0)+100>>2]&511](i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ob[c[(c[i>>2]|0)+8>>2]&127](q+80|0,i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if(((xb[c[(c[i>>2]|0)+56>>2]&127](i)|0)&8|0?(e=c[b+24>>2]|0,e|0):0)?(j=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0,(j|0)>0):0){f=0;do{h=c[b+24>>2]|0;h=zb[c[(c[h>>2]|0)+40>>2]&31](h,f)|0;i=c[h+780>>2]|0;if((i|0)>0){e=0;do{r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ub[c[(c[r>>2]|0)+40>>2]&0](r,h+4+(e*192|0)+32|0,h+4+(e*192|0)+64|0,+g[h+4+(e*192|0)+80>>2],c[h+4+(e*192|0)+156>>2]|0,q+80+96|0);e=e+1|0}while((e|0)!=(i|0))}f=f+1|0}while((f|0)!=(j|0))}r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if((xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&3|0?(c[b+8>>2]|0)>0:0){h=0;do{e=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if(!(c[e+204>>2]&32)){if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&1|0):0){c[q+64>>2]=1053609165;c[q+64+4>>2]=1053609165;c[q+64+8>>2]=1053609165;g[q+64+12>>2]=0.0;switch(c[e+220>>2]|0){case 1:{c[q+64>>2]=c[q+80>>2];c[q+64+4>>2]=c[q+80+4>>2];c[q+64+8>>2]=c[q+80+8>>2];c[q+64+12>>2]=c[q+80+12>>2];break}case 2:{c[q+64>>2]=c[q+80+16>>2];c[q+64+4>>2]=c[q+80+16+4>>2];c[q+64+8>>2]=c[q+80+16+8>>2];c[q+64+12>>2]=c[q+80+16+12>>2];break}case 3:{c[q+64>>2]=c[q+80+32>>2];c[q+64+4>>2]=c[q+80+32+4>>2];c[q+64+8>>2]=c[q+80+32+8>>2];c[q+64+12>>2]=c[q+80+32+12>>2];break}case 4:{c[q+64>>2]=c[q+80+48>>2];c[q+64+4>>2]=c[q+80+48+4>>2];c[q+64+8>>2]=c[q+80+48+8>>2];c[q+64+12>>2]=c[q+80+48+12>>2];break}case 5:{c[q+64>>2]=c[q+80+64>>2];c[q+64+4>>2]=c[q+80+64+4>>2];c[q+64+8>>2]=c[q+80+64+8>>2];c[q+64+12>>2]=c[q+80+64+12>>2];break}default:{c[q+64>>2]=1050253722;c[q+64+4>>2]=1050253722;c[q+64+8>>2]=1050253722;g[q+64+12>>2]=0.0}}if(c[e+204>>2]&256|0){c[q+64>>2]=c[e+308>>2];c[q+64+4>>2]=c[e+308+4>>2];c[q+64+8>>2]=c[e+308+8>>2];c[q+64+12>>2]=c[e+308+12>>2]}Vb[c[(c[b>>2]|0)+28>>2]&127](b,e+4|0,c[e+192>>2]|0,q+64|0)}f=c[b+72>>2]|0;if(f|0?(xb[c[(c[f>>2]|0)+56>>2]&127](f)|0)&2|0:0){c[q+32>>2]=c[q+80+80>>2];c[q+32+4>>2]=c[q+80+80+4>>2];c[q+32+8>>2]=c[q+80+80+8>>2];c[q+32+12>>2]=c[q+80+80+12>>2];r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+4|0,q+64|0,q+48|0);g[q+64>>2]=+g[q+64>>2]+-.019999999552965164;g[q+64+4>>2]=+g[q+64+4>>2]+-.019999999552965164;g[q+64+8>>2]=+g[q+64+8>>2]+-.019999999552965164;g[q+48>>2]=+g[q+48>>2]+.019999999552965164;g[q+48+4>>2]=+g[q+48+4>>2]+.019999999552965164;g[q+48+8>>2]=+g[q+48+8>>2]+.019999999552965164;do if((a[b+44>>0]|0?(c[e+252>>2]|0)==2:0)?(c[e+204>>2]&3|0)==0:0){r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+68|0,q+16|0,q);d=+g[q+16>>2]+-.019999999552965164;g[q+16>>2]=d;k=+g[q+16+4>>2]+-.019999999552965164;g[q+16+4>>2]=k;m=+g[q+16+8>>2]+-.019999999552965164;g[q+16+8>>2]=m;n=+g[q>>2]+.019999999552965164;g[q>>2]=n;o=+g[q+4>>2]+.019999999552965164;g[q+4>>2]=o;p=+g[q+8>>2]+.019999999552965164;g[q+8>>2]=p;if(d<+g[q+64>>2])g[q+64>>2]=d;if(k<+g[q+64+4>>2])g[q+64+4>>2]=k;if(m<+g[q+64+8>>2])g[q+64+8>>2]=m;d=+g[q+16+12>>2];if(d<+g[q+64+12>>2])g[q+64+12>>2]=d;if(+g[q+48>>2]>2]=n;if(+g[q+48+4>>2]>2]=o;if(+g[q+48+8>>2]>2]=p;d=+g[q+12>>2];if(!(+g[q+48+12>>2]>2]=d}while(0);r=c[b+72>>2]|0;Vb[c[(c[r>>2]|0)+60>>2]&127](r,q+64|0,q+48|0,q+32|0)}}h=h+1|0}while((h|0)<(c[b+8>>2]|0))}l=q;return}function Ed(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+32|0;g=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;c[e+20>>2]=g;c[e>>2]=0;if(!g){s=e+24|0;c[s>>2]=0;s=d+4|0;f=e+4|0;s=c[s>>2]|0;c[f>>2]=s;f=d+8|0;f=c[f>>2]|0;s=e+8|0;c[s>>2]=f;s=d+12|0;s=c[s>>2]|0;f=e+12|0;c[f>>2]=s;d=d+16|0;d=c[d>>2]|0;f=e+16|0;c[f>>2]=d;l=t;return 19256}s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,g)|0;g=c[s+8>>2]|0;c[e>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;r=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;a:do if((r|0)>0){q=0;while(1){cc[c[(c[d>>2]|0)+16>>2]&3](d,t+28|0,t+4|0,t+16|0,t+8|0,t+24|0,t+20|0,t,t+12|0,q);i=c[t>>2]|0;c[g+24>>2]=i;c[g+28>>2]=c[t+4>>2];j=g+12|0;m=g+16|0;p=g+4|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;switch(c[t+12>>2]|0){case 2:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i*3|0)|0;k=c[j+8>>2]|0;c[g+8>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){m=c[t+24>>2]|0;i=0;do{n=m+(P(c[t+20>>2]|0,i)|0)|0;o=i*3|0;c[k+(o<<2)>>2]=c[n>>2];c[k+(o+1<<2)>>2]=c[n+4>>2];c[k+(o+2<<2)>>2]=c[n+8>>2];i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19137,1497453121,c[j+8>>2]|0)}break}case 3:{if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,8,i)|0;o=c[n+8>>2]|0;c[j>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t>>2]|0;if((j|0)>0){k=c[t+24>>2]|0;m=c[t+20>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;b[o+(i<<3)>>1]=b[u>>1]|0;b[o+(i<<3)+2>>1]=b[u+2>>1]|0;b[o+(i<<3)+4>>1]=b[u+4>>1]|0;a[o+(i<<3)+6>>0]=0;a[o+(i<<3)+7>>0]=0;i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19152,1497453121,c[n+8>>2]|0)}break}case 5:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;k=c[j+8>>2]|0;c[m>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){i=0;do{u=(c[t+24>>2]|0)+(P(c[t+20>>2]|0,i)|0)|0;a[k+(i<<2)>>0]=a[u>>0]|0;a[k+(i<<2)+1>>0]=a[u+1>>0]|0;a[k+(i<<2)+2>>0]=a[u+2>>0]|0;a[k+(i<<2)+3>>0]=0;i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19179,1497453121,c[j+8>>2]|0)}break}default:{}}switch(c[t+16>>2]|0){case 0:{i=c[t+4>>2]|0;if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,i)|0;k=c[j+8>>2]|0;c[g>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;m=c[t+4>>2]|0;if((m|0)>0){n=c[t+28>>2]|0;o=c[t+8>>2]|0;i=0;do{u=n+(P(o,i)|0)|0;c[k+(i<<4)>>2]=c[u>>2];c[k+(i<<4)+4>>2]=c[u+4>>2];c[k+(i<<4)+8>>2]=c[u+8>>2];i=i+1|0}while((i|0)!=(m|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19202,1497453121,c[j+8>>2]|0)}break}case 1:{i=c[t+4>>2]|0;if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,i)|0;o=c[n+8>>2]|0;c[p>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t+4>>2]|0;if((j|0)>0){k=c[t+28>>2]|0;m=c[t+8>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;h[o+(i<<5)>>3]=+h[u>>3];h[o+(i<<5)+8>>3]=+h[u+8>>3];h[o+(i<<5)+16>>3]=+h[u+16>>3];i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19221,1497453121,c[n+8>>2]|0)}break}default:{}}Ob[c[(c[d>>2]|0)+24>>2]&127](d,q);q=q+1|0;if((q|0)==(r|0)){g=f;break a}else g=g+32|0}}else g=f;while(0);Zb[c[(c[g>>2]|0)+20>>2]&31](f,s,19241,1497453121,c[s+8>>2]|0);u=e+24|0;c[u>>2]=0;u=d+4|0;f=e+4|0;u=c[u>>2]|0;c[f>>2]=u;f=d+8|0;f=c[f>>2]|0;u=e+8|0;c[u>>2]=f;u=d+12|0;u=c[u>>2]|0;f=e+12|0;c[f>>2]=u;f=d+16|0;f=c[f>>2]|0;u=e+16|0;c[u>>2]=f;l=t;return 19256}function Fd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;j=c[d+8>>2]|0;if(!j){h=0;return h|0}i=0;D=j;do{if((c[D+20>>2]|0)>(c[a+100>>2]|0)){B=c[D+12>>2]|0;w=c[B+88>>2]|0;x=w-(c[d+88>>2]|0)|0;y=c[B+92>>2]|0;z=y-(c[d+92>>2]|0)|0;B=c[B+96>>2]|0;C=B-(c[d+96>>2]|0)|0;k=ct(c[g>>2]|0,c[g+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;o=A;j=ct(c[g+8>>2]|0,c[g+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;o=Ow(j|0,A|0,k|0,o|0)|0;k=A;j=ct(c[g+16>>2]|0,c[g+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;j=Ow(o|0,k|0,j|0,A|0)|0;k=A;o=ct(c[f>>2]|0,c[f+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;v=A;n=ct(c[f+8>>2]|0,c[f+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;v=Ow(n|0,A|0,o|0,v|0)|0;o=A;n=ct(c[f+16>>2]|0,c[f+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;n=Ow(v|0,o|0,n|0,A|0)|0;o=A;if((k|0)>0|(k|0)==0&j>>>0>0){l=1;v=j}else{v=sw(0,0,j|0,k|0)|0;l=((j|0)!=0|(k|0)!=0)<<31>>31;v=(j|0)!=0|(k|0)!=0?v:0;k=(j|0)!=0|(k|0)!=0?A:0}if(!((o|0)>0|(o|0)==0&n>>>0>0)){j=sw(0,0,n|0,o|0)|0;j=(n|0)!=0|(o|0)!=0?j:0;m=(n|0)!=0|(o|0)!=0?A:0;if((j|0)!=0|(m|0)!=0|(l|0)!=0){l=(n|0)!=0|(o|0)!=0?0-l|0:l;n=j;p=8}}else{m=o;p=8}a:do if((p|0)==8){p=0;if(!i){c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break}j=c[h+16>>2]|0;if((l|0)==(j|0)){if(l|0){p=c[h+8>>2]|0;s=c[h+8+4>>2]|0;o=ct(p|0,0,v|0,0)|0;j=A;t=ct(s|0,0,v|0,0)|0;r=A;p=ct(p|0,0,k|0,0)|0;q=A;s=ct(s|0,0,k|0,0)|0;G=A;p=Ow(t|0,0,p|0,0)|0;t=A;G=Ow(r|0,0,s|0,G|0)|0;q=Ow(G|0,A|0,q|0,0)|0;t=Ow(q|0,A|0,t|0,0)|0;q=A;j=Ow(0,p|0,o|0,j|0)|0;o=A;p=Ow(t|0,q|0,(o>>>0

>>0|(o|0)==(p|0)&j>>>0<0)&1|0,0)|0;q=A;t=c[h>>2]|0;G=c[h+4>>2]|0;s=ct(t|0,0,n|0,0)|0;r=A;E=ct(G|0,0,n|0,0)|0;H=A;t=ct(t|0,0,m|0,0)|0;u=A;G=ct(G|0,0,m|0,0)|0;F=A;t=Ow(E|0,0,t|0,0)|0;E=A;F=Ow(H|0,0,G|0,F|0)|0;u=Ow(F|0,A|0,u|0,0)|0;E=Ow(u|0,A|0,E|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(E|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(!(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0))if(q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0)j=1;else j=o>>>0>>0|(o|0)==(s|0)&j>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&j>>>0>r>>>0)&1;else j=-1;j=P(j,l)|0;p=17}}else{j=l-j|0;p=17}do if((p|0)==17){p=0;if((j|0)>=0)if(!j)break;else break a;else{c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break a}}while(0);j=(c[i+4>>2]|0)==(D|0);if((c[i>>2]|0)==(D|0))if(j){H=c[e+8>>2]|0;E=P(H,z)|0;u=c[e+4>>2]|0;E=E-(P(u,C)|0)|0;G=c[e>>2]|0;H=(P(G,C)|0)-(P(H,x)|0)|0;G=(P(u,x)|0)-(P(G,z)|0)|0;u=c[i+12>>2]|0;j=c[(c[D+8>>2]|0)+12>>2]|0;z=c[j+88>>2]|0;x=(c[u+88>>2]|0)-z|0;v=c[j+92>>2]|0;C=(c[u+92>>2]|0)-v|0;j=c[j+96>>2]|0;u=(c[u+96>>2]|0)-j|0;F=(P(B-j|0,C)|0)-(P(y-v|0,u)|0)|0;j=(P(w-z|0,u)|0)-(P(B-j|0,x)|0)|0;C=(P(y-v|0,x)|0)-(P(w-z|0,C)|0)|0;E=ct(F|0,((F|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;F=A;H=ct(j|0,((j|0)<0)<<31>>31|0,H|0,((H|0)<0)<<31>>31|0)|0;j=A;G=ct(C|0,((C|0)<0)<<31>>31|0,G|0,((G|0)<0)<<31>>31|0)|0;G=Ow(E|0,F|0,G|0,A|0)|0;j=Ow(G|0,A|0,H|0,j|0)|0;H=A;j=(H|0)>0|(H|0)==0&j>>>0>0?2:1}else j=2;else j=j&1;i=(j|0)==2^b?i:D}while(0);j=c[d+8>>2]|0}D=c[D>>2]|0}while((D|0)!=(j|0));return i|0}function Gd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;v=l;l=l+544|0;j=h;k=j+36|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[v+384>>2]=a;c[v+384+4>>2]=d;o=+g[e>>2];F=+g[b>>2];n=+g[e+16>>2];i=+g[b+16>>2];m=+g[e+32>>2];G=+g[b+32>>2];w=+g[b+4>>2];H=+g[b+20>>2];x=+g[b+36>>2];t=+g[b+8>>2];r=+g[b+24>>2];p=+g[b+40>>2];E=+g[e+4>>2];C=+g[e+20>>2];B=+g[e+36>>2];A=+g[e+8>>2];z=+g[e+24>>2];y=+g[e+40>>2];g[v+384+8>>2]=o*F+n*i+m*G;g[v+384+12>>2]=o*w+n*H+m*x;g[v+384+16>>2]=o*t+n*r+m*p;g[v+384+20>>2]=0.0;g[v+384+24>>2]=F*E+i*C+G*B;g[v+384+28>>2]=w*E+H*C+x*B;g[v+384+32>>2]=t*E+r*C+p*B;g[v+384+36>>2]=0.0;g[v+384+40>>2]=F*A+i*z+G*y;g[v+384+44>>2]=w*A+H*z+x*y;g[v+384+48>>2]=t*A+r*z+p*y;g[v+384+52>>2]=0.0;p=+g[e+48>>2]-+g[b+48>>2];r=+g[e+52>>2]-+g[b+52>>2];t=+g[e+56>>2]-+g[b+56>>2];x=+g[b>>2];H=+g[e>>2];w=+g[b+16>>2];G=+g[e+16>>2];i=+g[b+32>>2];F=+g[e+32>>2];m=+g[b+4>>2];n=+g[b+20>>2];o=+g[b+36>>2];q=+g[b+8>>2];s=+g[b+24>>2];u=+g[b+40>>2];g[v+384+56>>2]=x*H+w*G+i*F;g[v+384+60>>2]=x*E+w*C+i*B;g[v+384+64>>2]=x*A+w*z+i*y;g[v+384+68>>2]=0.0;g[v+384+72>>2]=H*m+G*n+F*o;g[v+384+76>>2]=E*m+C*n+B*o;g[v+384+80>>2]=A*m+z*n+y*o;g[v+384+84>>2]=0.0;g[v+384+88>>2]=H*q+G*s+F*u;g[v+384+92>>2]=E*q+C*s+B*u;g[v+384+96>>2]=A*q+z*s+y*u;g[v+384+100>>2]=0.0;g[v+384+104>>2]=p*x+r*w+t*i;g[v+384+108>>2]=p*m+r*n+t*o;g[v+384+112>>2]=p*q+r*s+t*u;g[v+384+116>>2]=0.0;c[v+384+120>>2]=80;c[v+384+124>>2]=0;c[v+364>>2]=0;c[v+128>>2]=0;c[v+128+4>>2]=0;c[v+128+8>>2]=0;c[v+128+12>>2]=0;c[v+376>>2]=2;c[v+368>>2]=0;g[v+144>>2]=0.0;a=Jc(v,v+384|0,f)|0;if(a|0){c[h>>2]=(a|0)==1?1:2;h=0;l=v;return h|0}a=c[v+372>>2]|0;if(!(c[a+32>>2]|0)){q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;i=0.0}else{f=0;o=0.0;p=0.0;q=0.0;i=0.0;m=0.0;n=0.0;do{u=+g[a+16+(f<<2)>>2];d=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;e=(c[v+384>>2]|0)+(k>>1)|0;if(k&1)d=c[(c[e>>2]|0)+d>>2]|0;Sb[d&127](v+528|0,e,c[a+(f<<2)>>2]|0);o=o+u*+g[v+528>>2];p=p+u*+g[v+528+4>>2];q=q+u*+g[v+528+8>>2];a=c[(c[v+372>>2]|0)+(f<<2)>>2]|0;r=-+g[a>>2];s=-+g[a+4>>2];t=-+g[a+8>>2];a=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;d=(c[v+384+4>>2]|0)+(k>>1)|0;if(k&1)a=c[(c[d>>2]|0)+a>>2]|0;G=+g[v+384+24>>2]*r+ +g[v+384+28>>2]*s+ +g[v+384+32>>2]*t;F=+g[v+384+40>>2]*r+ +g[v+384+44>>2]*s+ +g[v+384+48>>2]*t;g[v+512>>2]=+g[v+384+8>>2]*r+ +g[v+384+12>>2]*s+ +g[v+384+16>>2]*t;g[v+512+4>>2]=G;g[v+512+8>>2]=F;g[v+512+12>>2]=0.0;Sb[a&127](v+528|0,d,v+512|0);F=+g[v+528>>2];G=+g[v+528+4>>2];H=+g[v+528+8>>2];i=i+u*(F*+g[v+384+56>>2]+G*+g[v+384+60>>2]+H*+g[v+384+64>>2]+ +g[v+384+104>>2]);m=m+u*(F*+g[v+384+72>>2]+G*+g[v+384+76>>2]+H*+g[v+384+80>>2]+ +g[v+384+108>>2]);n=n+u*(F*+g[v+384+88>>2]+G*+g[v+384+92>>2]+H*+g[v+384+96>>2]+ +g[v+384+112>>2]);f=f+1|0;a=c[v+372>>2]|0}while(f>>>0<(c[a+32>>2]|0)>>>0)}E=o*+g[b+16>>2]+p*+g[b+20>>2]+q*+g[b+24>>2]+ +g[b+52>>2];F=o*+g[b+32>>2]+p*+g[b+36>>2]+q*+g[b+40>>2]+ +g[b+56>>2];g[h+4>>2]=o*+g[b>>2]+p*+g[b+4>>2]+q*+g[b+8>>2]+ +g[b+48>>2];g[h+8>>2]=E;g[h+12>>2]=F;g[h+16>>2]=0.0;F=i*+g[b+16>>2]+m*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];E=i*+g[b+32>>2]+m*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[h+20>>2]=i*+g[b>>2]+m*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[h+24>>2]=F;g[h+28>>2]=E;g[h+32>>2]=0.0;E=o-i;F=p-m;H=q-n;g[h+48>>2]=0.0;G=+D(+(E*E+F*F+H*H));g[h+52>>2]=G;G=G>9.999999747378752e-05?1.0/G:1.0;g[h+36>>2]=G*E;g[h+40>>2]=G*F;g[h+44>>2]=G*H;h=1;l=v;return h|0}function Hd(b,d,e,f,h,i,j,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;B=P(c[l+24>>2]|0,m)|0;y=(a[d+44>>0]|0)!=0;A=c[d+56>>2]|0;if(!(y|(A|0)!=0)){d=0;return d|0}C=c[(o|0?l+12|0:l+8|0)>>2]|0;m=c[(o|0?l+20|0:l+16|0)>>2]|0;c[C+(B<<2)>>2]=c[n>>2];c[C+(B+1<<2)>>2]=c[n+4>>2];c[C+(B+2<<2)>>2]=c[n+8>>2];g[m+(B<<2)>>2]=-+g[n>>2];g[m+(B+1<<2)>>2]=-+g[n+4>>2];g[m+(B+2<<2)>>2]=-+g[n+8>>2];if(!o){q=+g[b+1176>>2];if(!(a[b+1301>>0]|0)){q=q-+g[e+48>>2];r=+g[b+1180>>2]-+g[e+52>>2];w=+g[b+1184>>2]-+g[e+56>>2];u=+g[n+8>>2];v=+g[n+4>>2];x=+g[n>>2];m=c[l+12>>2]|0;g[m+(B<<2)>>2]=r*u-w*v;g[m+(B+1<<2)>>2]=w*x-q*u;g[m+(B+2<<2)>>2]=q*v-r*x;x=+g[b+1176>>2]-+g[f+48>>2];r=+g[b+1180>>2]-+g[f+52>>2];v=+g[b+1184>>2]-+g[f+56>>2];q=+g[n+8>>2];u=+g[n+4>>2];w=+g[n>>2];m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-(r*q-v*u);r=x*u-r*w;e=m;q=-(v*w-x*q)}else{I=q-+g[f+48>>2];H=+g[b+1180>>2]-+g[f+52>>2];F=+g[b+1184>>2]-+g[f+56>>2];r=+g[n>>2];G=+g[n+4>>2];E=+g[n+8>>2];K=+g[b+1112>>2]-+g[e+48>>2];q=+g[b+1116>>2]-+g[e+52>>2];s=+g[b+1120>>2]-+g[e+56>>2];u=+g[d+52>>2]-+g[d+48>>2];J=r*(r*K+G*q+E*s)+r*u-r*(I*r+H*G+F*E);D=G*(r*K+G*q+E*s)+G*u-G*(I*r+H*G+F*E);u=E*(r*K+G*q+E*s)+E*u-E*(I*r+H*G+F*E);w=+g[b+1272>>2];x=+g[b+1276>>2];t=E*(q-G*(r*K+G*q+E*s)+w*D)-G*(s-E*(r*K+G*q+E*s)+w*u);v=r*(s-E*(r*K+G*q+E*s)+w*u)-E*(K-r*(r*K+G*q+E*s)+w*J);s=G*(K-r*(r*K+G*q+E*s)+w*J)-r*(q-G*(r*K+G*q+E*s)+w*D);q=(H-G*(I*r+H*G+F*E)-x*D)*E-(F-E*(I*r+H*G+F*E)-x*u)*G;u=(F-E*(I*r+H*G+F*E)-x*u)*r-(I-r*(I*r+H*G+F*E)-x*J)*E;r=(I-r*(I*r+H*G+F*E)-x*J)*G-(H-G*(I*r+H*G+F*E)-x*D)*r;if(!((p|0)!=0|(a[b+1280>>0]|0)==0)){t=w*t;v=w*v;s=w*s;q=x*q;u=x*u;r=x*r}m=(c[l+12>>2]|0)+(B<<2)|0;g[m>>2]=t;g[m+4>>2]=v;g[m+8>>2]=s;m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-q;e=m;q=-u}g[m+(B+1<<2)>>2]=q;g[e+(B+2<<2)>>2]=-r}if(A|0?+g[d>>2]==+g[d+4>>2]:0){m=c[l+28>>2]|0;g[m+(B<<2)>>2]=0.0;q=0.0}else z=12;do if((z|0)==12){e=c[l+28>>2]|0;g[e+(B<<2)>>2]=0.0;if(!y){if(A|0){m=e;q=0.0;break}else m=1;return m|0}c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+28>>2];if(A|0){m=e;q=+g[e+(B<<2)>>2];break}v=+g[d+8>>2];q=o|0?v:-v;r=+g[d+52>>2];s=+g[d>>2];t=+g[d+4>>2];u=+g[l>>2]*+g[d+32>>2];do if(!(s>t))if(!(s==t)){if(q/u<0.0)if(r>=s?s-q/u>r:0){q=(s-r)/(q/u);break}else{q=r0.0)if(r<=t?t-q/ut?0.0:1.0;break}else q=0.0}else q=0.0;else q=1.0;while(0);g[e+(B<<2)>>2]=q*v+ +g[e+(B<<2)>>2];g[(c[l+36>>2]|0)+(B<<2)>>2]=-+g[d+12>>2];c[(c[l+40>>2]|0)+(B<<2)>>2]=c[d+12>>2];C=1;return C|0}while(0);K=+g[l>>2]*+g[d+32>>2];f=m+(B<<2)|0;g[f>>2]=q+ +g[d+48>>2]*(o|0?-K:K);c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+36>>2];e=c[l+36>>2]|0;m=c[l+40>>2]|0;if(+g[d>>2]==+g[d+4>>2]){g[e+(B<<2)>>2]=-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=3402823466385288598117041.0e14;C=1;return C|0}g[e+(B<<2)>>2]=(A|0)==1?0.0:-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=(A|0)==1?3402823466385288598117041.0e14:0.0;r=+g[d+40>>2];if(!(r>0.0)){C=1;return C|0}d=o|0?j:h;C=o|0?k:i;J=+g[n>>2];K=+g[n+4>>2];q=+g[n+8>>2];q=+g[d>>2]*J+ +g[d+4>>2]*K+ +g[d+8>>2]*q-(J*+g[C>>2]+K*+g[C+4>>2]+q*+g[C+8>>2]);if((A|0)==1){if(!(q<0.0)){C=1;return C|0}if(!(+g[f>>2]<-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}else{if(!(q>0.0)){C=1;return C|0}if(!(+g[f>>2]>-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}return 0}function Id(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,k=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;n=l;l=l+16|0;c[b+252>>2]=2;c[b+372>>2]=0;c[b+372+4>>2]=0;c[b+372+8>>2]=0;c[b+372+12>>2]=0;c[b+372+16>>2]=0;c[b+372+20>>2]=0;c[b+372+24>>2]=0;c[b+372+28>>2]=0;c[b+604>>2]=1065353216;c[b+608>>2]=1065353216;c[b+612>>2]=1065353216;g[b+616>>2]=0.0;c[b+408>>2]=1065353216;c[b+412>>2]=1065353216;c[b+416>>2]=1065353216;e=b+420|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+472>>2]=0;c[b+472+4>>2]=0;c[b+472+8>>2]=0;c[b+472+12>>2]=0;c[b+472+16>>2]=0;c[b+472+20>>2]=0;c[b+472+24>>2]=0;c[b+472+28>>2]=0;f=+g[d+92>>2];m=+g[d+96>>2];g[n+12>>2]=f;g[n+8>>2]=m;g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+504>>2]=c[(f<0.0?n+4|0:f>1.0?n:n+12|0)>>2];g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+508>>2]=c[(m<0.0?n+4|0:m>1.0?n:n+8|0)>>2];c[b+532>>2]=c[d+116>>2];c[b+536>>2]=c[d+120>>2];e=c[d+4>>2]|0;c[b+540>>2]=e;c[b+668>>2]=0;c[b+672>>2]=0;a[b+512>>0]=a[d+124>>0]|0;c[b+516>>2]=c[d+128>>2];c[b+520>>2]=c[d+132>>2];c[b+524>>2]=c[d+136>>2];c[b+528>>2]=c[d+140>>2];if(!e){c[b+4>>2]=c[d+8>>2];c[b+4+4>>2]=c[d+8+4>>2];c[b+4+8>>2]=c[d+8+8>>2];c[b+4+12>>2]=c[d+8+12>>2];c[b+20>>2]=c[d+24>>2];c[b+20+4>>2]=c[d+24+4>>2];c[b+20+8>>2]=c[d+24+8>>2];c[b+20+12>>2]=c[d+24+12>>2];c[b+36>>2]=c[d+40>>2];c[b+36+4>>2]=c[d+40+4>>2];c[b+36+8>>2]=c[d+40+8>>2];c[b+36+12>>2]=c[d+40+12>>2];c[b+52>>2]=c[d+56>>2];c[b+52+4>>2]=c[d+56+4>>2];c[b+52+8>>2]=c[d+56+8>>2];c[b+52+12>>2]=c[d+56+12>>2];e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}else{Ob[c[(c[e>>2]|0)+8>>2]&127](e,b+4|0);e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}c[b+68>>2]=c[k>>2];c[b+68+4>>2]=c[k+4>>2];c[b+68+8>>2]=c[k+8>>2];c[b+68+12>>2]=c[k+12>>2];c[b+84>>2]=c[e>>2];c[b+84+4>>2]=c[e+4>>2];c[b+84+8>>2]=c[e+8>>2];c[b+84+12>>2]=c[e+12>>2];c[b+100>>2]=c[h>>2];c[b+100+4>>2]=c[h+4>>2];c[b+100+8>>2]=c[h+8>>2];c[b+100+12>>2]=c[h+12>>2];c[b+116>>2]=c[i>>2];c[b+116+4>>2]=c[i+4>>2];c[b+116+8>>2]=c[i+8>>2];c[b+116+12>>2]=c[i+12>>2];c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+228>>2]=c[d+100>>2];c[b+236>>2]=c[d+104>>2];c[b+240>>2]=c[d+108>>2];c[b+232>>2]=c[d+112>>2];Ob[c[(c[b>>2]|0)+8>>2]&127](b,c[d+72>>2]|0);e=c[5786]|0;c[5786]=e+1;c[b+568>>2]=e;f=+g[d>>2];e=c[b+204>>2]|0;if(f==0.0){c[b+204>>2]=e|1;m=0.0}else{c[b+204>>2]=e&-2;m=1.0/f}g[b+404>>2]=m;p=f*+g[b+444>>2];o=f*+g[b+448>>2];g[b+424>>2]=f*+g[b+440>>2];g[b+428>>2]=p;g[b+432>>2]=o;g[b+436>>2]=0.0;f=+g[d+76>>2];h=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+80>>2];e=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+84>>2];d=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;c[b+456>>2]=h;c[b+460>>2]=e;c[b+464>>2]=d;g[b+468>>2]=0.0;r=m*+g[b+412>>2];x=m*+g[b+416>>2];g[b+620>>2]=m*+g[b+408>>2];g[b+624>>2]=r;g[b+628>>2]=x;g[b+632>>2]=0.0;x=+g[b+4>>2];r=(c[j>>2]=h,+g[j>>2]);w=+g[b+8>>2];f=(c[j>>2]=e,+g[j>>2]);v=+g[b+12>>2];o=(c[j>>2]=d,+g[j>>2]);u=+g[b+20>>2];t=+g[b+24>>2];s=+g[b+28>>2];q=+g[b+36>>2];p=+g[b+40>>2];m=+g[b+44>>2];g[b+324>>2]=x*x*r+w*w*f+v*v*o;g[b+328>>2]=x*r*u+w*f*t+v*o*s;g[b+332>>2]=x*r*q+w*f*p+v*o*m;g[b+336>>2]=0.0;g[b+340>>2]=x*r*u+w*f*t+v*o*s;g[b+344>>2]=u*r*u+t*f*t+s*o*s;g[b+348>>2]=r*u*q+f*t*p+o*s*m;g[b+352>>2]=0.0;g[b+356>>2]=x*r*q+w*f*p+v*o*m;g[b+360>>2]=u*r*q+t*f*p+s*o*m;g[b+364>>2]=q*r*q+p*f*p+m*o*m;g[b+368>>2]=0.0;c[b+564>>2]=8;c[b+572>>2]=0;c[b+572+4>>2]=0;c[b+572+8>>2]=0;c[b+572+12>>2]=0;c[b+572+16>>2]=0;c[b+572+20>>2]=0;c[b+572+24>>2]=0;c[b+572+28>>2]=0;m=+g[b+404>>2];o=m*+g[b+412>>2];p=m*+g[b+416>>2];g[b+620>>2]=+g[b+408>>2]*m;g[b+624>>2]=o;g[b+628>>2]=p;e=b+632|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));l=n;return}function Jd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0;h=l;l=l+240|0;if(!(c[b+16>>2]|0)){K=c[b+12>>2]|0;b=c[b+20>>2]|0;x=+g[d>>2];q=+g[d+4>>2];u=+g[d+8>>2];j=+g[d+16>>2];r=+g[d+20>>2];i=+g[d+24>>2];m=+g[d+32>>2];s=+g[d+36>>2];n=+g[d+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];D=+g[d+56>>2];J=+g[e>>2];I=+g[e+16>>2];z=+g[e+32>>2];H=+g[e+4>>2];G=+g[e+20>>2];y=+g[e+36>>2];v=+g[e+8>>2];k=+g[e+24>>2];p=+g[e+40>>2];C=-+g[e+48>>2];B=-+g[e+52>>2];w=-+g[e+56>>2];d=c[(c[K>>2]|0)+64>>2]|0;A=-+g[b+52>>2];t=-+g[b+56>>2];o=-+g[b+60>>2];g[h+16>>2]=(x*J+j*I+m*z)*A+(x*H+j*G+m*y)*t+(x*v+j*k+m*p)*o;g[h+16+4>>2]=(q*J+r*I+s*z)*A+(q*H+r*G+s*y)*t+(q*v+r*k+s*p)*o;g[h+16+8>>2]=(u*J+i*I+n*z)*A+(u*H+i*G+n*y)*t+(u*v+i*k+n*p)*o;g[h+16+12>>2]=0.0;Sb[d&127](h+152|0,K,h+16|0);o=+g[h+152>>2];t=+g[h+152+4>>2];A=+g[h+152+8>>2];z=F*J+E*I+D*z+(J*C+I*B+z*w)+((x*J+j*I+m*z)*o+(q*J+r*I+s*z)*t+(u*J+i*I+n*z)*A);y=F*H+E*G+D*y+(H*C+G*B+y*w)+((x*H+j*G+m*y)*o+(q*H+r*G+s*y)*t+(u*H+i*G+n*y)*A);A=F*v+E*k+D*p+(v*C+k*B+p*w)+((x*v+j*k+m*p)*o+(q*v+r*k+s*p)*t+(u*v+i*k+n*p)*A);p=+g[b+52>>2];n=+g[b+56>>2];k=+g[b+60>>2];i=k*A+(p*z+n*y)-+g[b+68>>2];v=+g[e>>2];u=+g[e+4>>2];t=+g[e+8>>2];s=+g[e+16>>2];r=+g[e+20>>2];q=+g[e+24>>2];o=+g[e+32>>2];m=+g[e+36>>2];j=+g[e+40>>2];x=(z-p*i)*s+(y-n*i)*r+(A-k*i)*q+ +g[e+52>>2];w=(z-p*i)*o+(y-n*i)*m+(A-k*i)*j+ +g[e+56>>2];g[h+16>>2]=t*(A-k*i)+(v*(z-p*i)+u*(y-n*i))+ +g[e+48>>2];g[h+16+4>>2]=x;g[h+16+8>>2]=w;g[h+16+12>>2]=0.0;g[h>>2]=v*p+u*n+t*k;g[h+4>>2]=p*s+n*r+k*q;g[h+8>>2]=p*o+n*m+k*j;g[h+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,h,h+16|0,i);l=h;return}else{N=c[b+4>>2]|0;a[N+312>>0]=0;c[N>>2]=0;a[N+356>>0]=1;c[N+292>>2]=1566444395;c[N+296>>2]=1566444395;c[N+300>>2]=1566444395;g[N+304>>2]=0.0;c[N+336>>2]=0;c[N+336+4>>2]=0;c[N+336+8>>2]=0;c[N+336+12>>2]=0;a[N+336+16>>0]=0;a[N+332>>0]=a[N+332>>0]&-16;N=c[b+12>>2]|0;M=c[b+16>>2]|0;L=c[N+4>>2]|0;K=c[M+4>>2]|0;I=+nb[c[(c[N>>2]|0)+48>>2]&15](N);O=c[b+16>>2]|0;J=+nb[c[(c[O>>2]|0)+48>>2]&15](O);O=c[b+4>>2]|0;b=c[b+8>>2]|0;c[h+152>>2]=9552;c[h+152+4>>2]=0;c[h+152+8>>2]=1065353216;c[h+152+12>>2]=0;g[h+152+16>>2]=0.0;c[h+152+20>>2]=b;c[h+152+24>>2]=O;c[h+152+28>>2]=N;c[h+152+32>>2]=M;c[h+152+36>>2]=L;c[h+152+40>>2]=K;g[h+152+44>>2]=I;g[h+152+48>>2]=J;a[h+152+52>>0]=0;c[h+152+60>>2]=-1;c[h+152+72>>2]=1;c[h+152+76>>2]=1;g[h+16+128>>2]=999999984306749440.0;c[h+16>>2]=c[d>>2];c[h+16+4>>2]=c[d+4>>2];c[h+16+8>>2]=c[d+8>>2];c[h+16+12>>2]=c[d+12>>2];c[h+16+16>>2]=c[d+16>>2];c[h+16+16+4>>2]=c[d+16+4>>2];c[h+16+16+8>>2]=c[d+16+8>>2];c[h+16+16+12>>2]=c[d+16+12>>2];c[h+16+32>>2]=c[d+32>>2];c[h+16+32+4>>2]=c[d+32+4>>2];c[h+16+32+8>>2]=c[d+32+8>>2];c[h+16+32+12>>2]=c[d+32+12>>2];c[h+16+48>>2]=c[d+48>>2];c[h+16+48+4>>2]=c[d+48+4>>2];c[h+16+48+8>>2]=c[d+48+8>>2];c[h+16+48+12>>2]=c[d+48+12>>2];c[h+16+64>>2]=c[e>>2];c[h+16+64+4>>2]=c[e+4>>2];c[h+16+64+8>>2]=c[e+8>>2];c[h+16+64+12>>2]=c[e+12>>2];c[h+16+80>>2]=c[e+16>>2];c[h+16+80+4>>2]=c[e+16+4>>2];c[h+16+80+8>>2]=c[e+16+8>>2];c[h+16+80+12>>2]=c[e+16+12>>2];c[h+16+96>>2]=c[e+32>>2];c[h+16+96+4>>2]=c[e+32+4>>2];c[h+16+96+8>>2]=c[e+32+8>>2];c[h+16+96+12>>2]=c[e+32+12>>2];c[h+16+112>>2]=c[e+48>>2];c[h+16+112+4>>2]=c[e+48+4>>2];c[h+16+112+8>>2]=c[e+48+8>>2];c[h+16+112+12>>2]=c[e+48+12>>2];Dc(h+152|0,h+16|0,f,0,0);l=h;return}}function Kd(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0;w=l;l=l+96|0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}m=ui(b+4|0)|0;j=+g[b+28>>2];i=+g[b+32>>2];h=+g[b+36>>2];u=j*+g[m+16>>2]+i*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];t=j*+g[m+32>>2]+i*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+156>>2]=j*+g[m>>2]+i*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];g[b+160>>2]=u;g[b+164>>2]=t;g[b+168>>2]=0.0;m=ui(b+16|0)|0;t=+g[b+44>>2];u=+g[b+48>>2];h=+g[b+52>>2];i=t*+g[m>>2]+u*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];j=t*+g[m+16>>2]+u*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];h=t*+g[m+32>>2]+u*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+172>>2]=i;g[b+176>>2]=j;g[b+180>>2]=h;g[b+184>>2]=0.0;i=+g[b+156>>2]-i;j=+g[b+160>>2]-j;h=+g[b+164>>2]-h;if(i*i+j*j+h*h>16.0){u=1.0/+D(+(i*i+j*j+h*h));i=i*4.0*u;j=j*4.0*u;h=h*4.0*u}u=+g[b+64>>2];g[b+72>>2]=1.0/d*i*u;g[b+76>>2]=1.0/d*j*u;g[b+80>>2]=1.0/d*h*u;g[b+84>>2]=0.0;f=ui(b+4|0)|0;g[b+156>>2]=+g[b+156>>2]-+g[f+48>>2];g[b+160>>2]=+g[b+160>>2]-+g[f+52>>2];g[b+164>>2]=+g[b+164>>2]-+g[f+56>>2];f=ui(b+16|0)|0;g[b+172>>2]=+g[b+172>>2]-+g[f+48>>2];g[b+176>>2]=+g[b+176>>2]-+g[f+52>>2];g[b+180>>2]=+g[b+180>>2]-+g[f+56>>2];f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f)i=0.0;else{f=f+128|0;v=27}}else{f=f+404|0;v=27}if((v|0)==27)i=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+8>>2]|0;if(!f){m=c[b+4>>2]|0;m=(m|0)==0?22904:m+180|0}else m=f+324|0;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f)h=0.0;else{f=f+128|0;v=38}}else{f=f+404|0;v=38}if((v|0)==38)h=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;f=(f|0)==0?22904:f+180|0}else f=f+324|0;Uh(w+48|0,i,m,+g[b+156>>2],+g[b+160>>2],+g[b+164>>2]);Uh(w,h,f,+g[b+172>>2],+g[b+176>>2],+g[b+180>>2]);h=+g[w+48>>2]+ +g[w>>2];i=+g[w+48+4>>2]+ +g[w+4>>2];j=+g[w+48+8>>2]+ +g[w+8>>2];d=+g[w+48+16>>2]+ +g[w+16>>2];n=+g[w+48+20>>2]+ +g[w+20>>2];o=+g[w+48+24>>2]+ +g[w+24>>2];p=+g[w+48+32>>2]+ +g[w+32>>2];q=+g[w+48+36>>2]+ +g[w+36>>2];r=+g[w+48+40>>2]+ +g[w+40>>2];s=1.0/(j*(d*q-n*p)+(h*(n*r-o*q)+i*(o*p-d*r)));g[b+104>>2]=(n*r-o*q)*s;g[b+108>>2]=(j*q-i*r)*s;g[b+112>>2]=(i*o-j*n)*s;g[b+116>>2]=0.0;g[b+120>>2]=(o*p-d*r)*s;g[b+124>>2]=(h*r-j*p)*s;g[b+128>>2]=(j*d-h*o)*s;g[b+132>>2]=0.0;g[b+136>>2]=(d*q-n*p)*s;g[b+140>>2]=(i*p-h*q)*s;g[b+144>>2]=(h*n-i*d)*s;g[b+148>>2]=0.0;t=+g[b+68>>2];u=+g[b+72>>2];if(t>0.0){y=+g[b+76>>2];x=+g[b+80>>2];g[b+88>>2]=t*u*(n*r-o*q)*s+t*y*(j*q-i*r)*s+t*x*(i*o-j*n)*s;g[b+92>>2]=t*u*(o*p-d*r)*s+t*y*(h*r-j*p)*s+t*x*(j*d-h*o)*s;g[b+96>>2]=t*u*(d*q-n*p)*s+t*y*(i*p-h*q)*s+t*x*(h*n-i*d)*s;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-t)*u;g[b+76>>2]=(1.0-t)*y;g[b+80>>2]=(1.0-t)*x;r=(1.0-t)*u;s=(1.0-t)*y;u=(1.0-t)*x;t=+(e|0);t=1.0/t;r=t*r;g[b+72>>2]=r;s=t*s;g[b+76>>2]=s;u=t*u;g[b+80>>2]=u;l=w;return}else{t=u;u=+g[b+76>>2];y=+g[b+80>>2];x=+(e|0);x=1.0/x;t=x*t;g[b+72>>2]=t;u=x*u;g[b+76>>2]=u;y=x*y;g[b+80>>2]=y;l=w;return}}function Ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;f=m+(i*104|0)+8|0;q=+g[f>>2];h=m+(i*104|0)+12|0;p=+g[h>>2];d=m+(i*104|0)+16|0;l=+g[d>>2];j=q*+g[b>>2]+p*+g[b+4>>2]+l*+g[b+8>>2]+ +g[b+48>>2];k=q*+g[b+16>>2]+p*+g[b+20>>2]+l*+g[b+24>>2]+ +g[b+52>>2];l=q*+g[b+32>>2]+p*+g[b+36>>2]+l*+g[b+40>>2]+ +g[b+56>>2];g[f>>2]=j;g[h>>2]=k;g[d>>2]=l;g[m+(i*104|0)+20>>2]=0.0;d=m+(i*104|0)+24|0;p=+g[d>>2];h=m+(i*104|0)+28|0;q=+g[h>>2];f=m+(i*104|0)+32|0;r=+g[f>>2];s=p*+g[b+16>>2]+q*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];t=p*+g[b+32>>2]+q*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];g[d>>2]=p*+g[b>>2]+q*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];g[h>>2]=s;g[f>>2]=t;g[m+(i*104|0)+36>>2]=0.0;f=m+(i*104|0)+72|0;t=+g[f>>2];h=m+(i*104|0)+76|0;s=+g[h>>2];d=m+(i*104|0)+80|0;r=+g[d>>2];q=t*+g[b+16>>2]+s*+g[b+20>>2]+r*+g[b+24>>2];p=t*+g[b+32>>2]+s*+g[b+36>>2]+r*+g[b+40>>2];g[f>>2]=+g[b>>2]*t+ +g[b+4>>2]*s+ +g[b+8>>2]*r;g[h>>2]=q;g[d>>2]=p;g[m+(i*104|0)+84>>2]=0.0;m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;r=+nb[c[(c[o>>2]|0)+48>>2]&15](o);t=+g[d+4>>2]-r;s=+g[d+8>>2]-r;g[a+952>>2]=+g[d>>2]-r;g[a+956>>2]=t;g[a+960>>2]=s;g[a+964>>2]=0.0;s=r+ +g[d+20>>2];t=r+ +g[d+24>>2];g[a+968>>2]=r+ +g[d+16>>2];g[a+972>>2]=s;g[a+976>>2]=t;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;r=+g[m+8>>2]-+g[o+8>>2];s=+g[m+12>>2]-+g[o+12>>2];t=+g[m+16>>2]-+g[o+16>>2];t=+D(+(r*r+s*s+t*t));g[f+(d*52|0)+32>>2]=t;g[f+(d*52|0)+44>>2]=t*t;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}function Md(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0;B=c[b+88>>2]|0;if((B|0)==(c[b+92>>2]|0)?(o=B|0?B<<1:1,(B|0)<(o|0)):0){if(!o){k=0;n=B}else{c[6995]=(c[6995]|0)+1;k=sc((o*152|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}n=c[b+88>>2]|0}if((n|0)>0){l=0;do{gi(k+(l*152|0)|0,(c[b+96>>2]|0)+(l*152|0)|0,152)|0;l=l+1|0}while((l|0)!=(n|0))}l=c[b+96>>2]|0;if(l|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[l+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=k;c[b+92>>2]=o;k=c[b+88>>2]|0}else k=B;c[b+88>>2]=k+1;A=c[b+96>>2]|0;c[A+(B*152|0)+140>>2]=h;c[A+(B*152|0)+16>>2]=0;c[A+(B*152|0)+16+4>>2]=0;c[A+(B*152|0)+16+8>>2]=0;c[A+(B*152|0)+16+12>>2]=0;g[A+(B*152|0)+48>>2]=-0.0;g[A+(B*152|0)+52>>2]=-0.0;g[A+(B*152|0)+56>>2]=-0.0;g[A+(B*152|0)+60>>2]=0.0;b=c[b+16>>2]|0;o=c[b+(e*244|0)+240>>2]|0;h=c[b+(f*244|0)+240>>2]|0;c[A+(B*152|0)+144>>2]=e;c[A+(B*152|0)+148>>2]=f;g[A+(B*152|0)+104>>2]=i;c[A+(B*152|0)+132>>2]=0;g[A+(B*152|0)+100>>2]=0.0;g[A+(B*152|0)+96>>2]=0.0;x=-+g[d>>2];y=-+g[d+4>>2];z=-+g[d+8>>2];g[A+(B*152|0)>>2]=x;g[A+(B*152|0)+4>>2]=y;g[A+(B*152|0)+8>>2]=z;g[A+(B*152|0)+12>>2]=0.0;if(o|0){k=(g[j>>2]=(+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z)*+g[o+604>>2],c[j>>2]|0);l=(g[j>>2]=(+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z)*+g[o+608>>2],c[j>>2]|0);n=(g[j>>2]=(+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z)*+g[o+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+64>>2]=k;c[A+(B*152|0)+68>>2]=l;c[A+(B*152|0)+72>>2]=n;g[A+(B*152|0)+76>>2]=0.0;u=+g[d>>2];v=+g[d+4>>2];w=+g[d+8>>2];d=c[d+12>>2]|0;g[A+(B*152|0)+32>>2]=u;g[A+(B*152|0)+36>>2]=v;g[A+(B*152|0)+40>>2]=w;c[A+(B*152|0)+44>>2]=d;if(h|0){k=(g[j>>2]=(u*+g[h+324>>2]+v*+g[h+328>>2]+w*+g[h+332>>2])*+g[h+604>>2],c[j>>2]|0);l=(g[j>>2]=(u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2])*+g[h+608>>2],c[j>>2]|0);n=(g[j>>2]=(u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2])*+g[h+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+80>>2]=k;c[A+(B*152|0)+84>>2]=l;c[A+(B*152|0)+88>>2]=n;g[A+(B*152|0)+92>>2]=0.0;if(o|0){m=+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z;p=+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z;q=+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z}else{m=0.0;p=0.0;q=0.0}if(h|0){r=+g[h+324>>2]*u+ +g[h+328>>2]*v+ +g[h+332>>2]*w;s=u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2];t=u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2]}else{r=0.0;s=0.0;t=0.0}s=1.0/(m*x+p*y+q*z+0.0+(r*u+s*v+t*w));g[A+(B*152|0)+108>>2]=s;if(o|0){p=+g[b+(e*244|0)+192>>2];q=+g[b+(e*244|0)+196>>2];r=+g[b+(e*244|0)+200>>2];m=(+g[b+(e*244|0)+176>>2]+ +g[b+(e*244|0)+208>>2])*0.0+(+g[b+(e*244|0)+180>>2]+ +g[b+(e*244|0)+212>>2])*0.0+(+g[b+(e*244|0)+184>>2]+ +g[b+(e*244|0)+216>>2])*0.0}else{p=0.0;q=0.0;r=0.0;m=0.0}m=m+(p*x+q*y+r*z);if(!h){t=0.0;x=0.0;z=0.0;y=-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}t=+g[b+(f*244|0)+192>>2];x=+g[b+(f*244|0)+196>>2];z=+g[b+(f*244|0)+200>>2];y=(+g[b+(f*244|0)+176>>2]+ +g[b+(f*244|0)+208>>2])*-0.0+(+g[b+(f*244|0)+180>>2]+ +g[b+(f*244|0)+212>>2])*-0.0+(+g[b+(f*244|0)+184>>2]+ +g[b+(f*244|0)+216>>2])*-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}function Nd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0;t=l;l=l+48|0;switch(c[b+4>>2]|0){case 8:{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;l=t;return}case 0:{n=+g[b+32>>2];r=+g[b+36>>2];r=+g[d+4>>2]>=0.0?r:-r;s=+g[b+40>>2];s=+g[d+8>>2]>=0.0?s:-s;g[a>>2]=+g[d>>2]>=0.0?n:-n;g[a+4>>2]=r;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 1:{k=+g[d>>2];m=+g[d+4>>2];n=+g[d+8>>2];r=k*+g[b+60>>2]+m*+g[b+60+4>>2]+n*+g[b+60+8>>2];s=k*+g[b+60+16>>2]+m*+g[b+60+20>>2]+n*+g[b+60+24>>2];n=k*+g[b+60+32>>2]+m*+g[b+60+36>>2]+n*+g[b+60+40>>2];g[t+32>>2]=r;g[t+32+4>>2]=s;g[t+32+8>>2]=n;g[t+32+12>>2]=0.0;o=+g[t+32+((r>2]>2]|0;q=c[b+60+(o<<4)+8>>2]|0;c[a>>2]=c[b+60+(o<<4)>>2];c[a+4>>2]=p;c[a+8>>2]=q;g[a+12>>2]=0.0;l=t;return}case 13:{c[t+32>>2]=c[b+32>>2];c[t+32+4>>2]=c[b+32+4>>2];c[t+32+8>>2]=c[b+32+8>>2];c[t+32+12>>2]=c[b+32+12>>2];c[t+16>>2]=c[d>>2];e=c[d+4>>2]|0;c[t+16+4>>2]=e;q=c[d+8>>2]|0;c[t+16+8>>2]=q;g[t+16+12>>2]=0.0;b=c[b+56>>2]|0;f=(c[j>>2]=q,+g[j>>2]);switch(b|0){case 2:{d=0;o=2;p=1;f=(c[j>>2]=e,+g[j>>2]);break}case 1:{d=0;o=1;p=2;break}default:{d=1;o=0;p=2}}r=+g[t+32+(d<<2)>>2];i=+g[t+32+(b<<2)>>2];n=+g[t+16+(d<<2)>>2];m=+D(+(n*n+f*f));h=+g[t+16+(o<<2)>>2];if(m!=0.0){k=r/m*f;e=t;h=h<0.0?-i:i;f=n*(r/m)}else{k=0.0;e=t;h=h<0.0?-i:i;f=r}g[t+(d<<2)>>2]=f;g[t+(o<<2)>>2]=h;g[t+(p<<2)>>2]=k;c[a>>2]=c[e>>2];c[a+4>>2]=c[t+4>>2];c[a+8>>2]=c[t+8>>2];g[a+12>>2]=0.0;l=t;return}case 10:{f=+g[d>>2];h=+g[d+4>>2];i=+g[d+8>>2];e=c[b+56>>2]|0;r=+g[b+32+(e<<2)>>2];if(f*f+h*h+i*i<1.4210854715202004e-14){s=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(f*f+h*h+i*i));s=f*m;n=h*m;m=i*m}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=r;k=+g[t+32>>2];h=+g[t+32+4>>2];f=+g[t+32+8>>2];i=s*k+n*h+m*f;if(i>-999999984306749440.0){p=(g[j>>2]=f,c[j>>2]|0);q=(g[j>>2]=h,c[j>>2]|0);o=(g[j>>2]=k,c[j>>2]|0)}else{i=-999999984306749440.0;o=0;p=0;q=0}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=-r;k=+g[t+32>>2];r=+g[t+32+4>>2];f=+g[t+32+8>>2];e=s*k+n*r+m*f>i;b=(g[j>>2]=k,c[j>>2]|0);d=(g[j>>2]=r,c[j>>2]|0);p=e?(g[j>>2]=f,c[j>>2]|0):p;c[a>>2]=e?b:o;c[a+4>>2]=e?d:q;c[a+8>>2]=p;g[a+12>>2]=0.0;l=t;return}case 5:{p=c[b+96>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 4:{p=c[b+108>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}default:{Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);l=t;return}}}function Od(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0;x=l;l=l+64|0;if((h|0)>0){b=0;j=0;do{w=c[f+(j<<2)>>2]|0;b=(w|0)>(b|0)?w:b;j=j+1|0}while((j|0)<(h*3|0))}else b=0;t=b+1|0;k=P(t,t)|0;if(!k)j=0;else{c[6995]=(c[6995]|0)+1;j=sc(k+19|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Yk(j|0,0,k|0)|0}if((b|0)>-1){c[6995]=(c[6995]|0)+1;b=sc((t<<4|3)+16|0)|0;if(!b)m=0;else{c[(b+4+15&-16)+-4>>2]=b;m=b+4+15&-16}b=0;do{w=m+(b<<4)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];b=b+1|0}while((b|0)!=(t|0));b=0;k=0;while(1){v=c[e+(k+1<<2)>>2]|0;w=c[e+(k+2<<2)>>2]|0;c[m+(b<<4)>>2]=c[e+(k<<2)>>2];c[m+(b<<4)+4>>2]=v;c[m+(b<<4)+8>>2]=w;g[m+(b<<4)+12>>2]=0.0;k=k+3|0;if((k|0)>=(t*3|0)){w=m;v=m;break}else b=b+1|0}}else{w=0;v=0}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)u=0;else{c[(b+4+15&-16)+-4>>2]=b;u=b+4+15&-16}Bc(u,d,t,w,0);if((h|0)>0){d=u+780|0;n=u+792|0;o=u+800|0;p=u+984|0;e=0;do{q=c[f+(e<<2)>>2]|0;r=c[f+(e+1<<2)>>2]|0;s=c[f+(e+2<<2)>>2]|0;m=P(q,t)|0;b=j+(m+s)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+((P(s,t)|0)+q)>>0]=1;B=c[d>>2]|0;Xh(u,0);k=(c[n>>2]|0)+-1|0;b=c[o>>2]|0;c[b+(k*52|0)+24>>2]=B+(s*104|0);c[b+(k*52|0)+28>>2]=B+(q*104|0);A=+g[B+(s*104|0)+8>>2]-+g[B+(q*104|0)+8>>2];z=+g[B+(s*104|0)+12>>2]-+g[B+(q*104|0)+12>>2];y=+g[B+(s*104|0)+16>>2]-+g[B+(q*104|0)+16>>2];g[b+(k*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[p>>0]=1}k=P(r,t)|0;b=j+(k+q)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(m+r)>>0]=1;b=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=b+(q*104|0);c[m+(B*52|0)+28>>2]=b+(r*104|0);y=+g[b+(q*104|0)+8>>2]-+g[b+(r*104|0)+8>>2];z=+g[b+(q*104|0)+12>>2]-+g[b+(r*104|0)+12>>2];A=+g[b+(q*104|0)+16>>2]-+g[b+(r*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}b=j+((P(s,t)|0)+r)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(k+s)>>0]=1;k=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=k+(r*104|0);c[m+(B*52|0)+28>>2]=k+(s*104|0);y=+g[k+(r*104|0)+8>>2]-+g[k+(s*104|0)+8>>2];z=+g[k+(r*104|0)+12>>2]-+g[k+(s*104|0)+12>>2];A=+g[k+(r*104|0)+16>>2]-+g[k+(s*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}bg(u,q,r,s,0);e=e+3|0}while((e|0)<(h*3|0))}if(i){m=c[u+792>>2]|0;if((m|0)>0){e=u+800|0;b=243703;k=0;do{d=c[e>>2]|0;n=d+(k*52|0)|0;b=(P(b,1664525)|0)+1013904223|0;o=x;p=n;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=n;p=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;p=x;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(m|0))}else b=243703;d=c[u+812>>2]|0;if((d|0)>0){n=u+820|0;k=0;do{e=c[n>>2]|0;m=e+(k*44|0)|0;b=(P(b,1664525)|0)+1013904223|0;e=e+(((b>>>0)%(d>>>0)|0)*44|0)|0;o=x;p=m;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=m;p=e;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=e;p=x;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(d|0))}}if(!((w|0)==0|(v|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0)}if(!j){l=x;return u|0}c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);l=x;return u|0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0;H=l;l=l+96|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){G=0;l=H;return G|0}G=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[G+188>>2]|0)|0)){G=1;l=H;return G|0}b=c[G+192>>2]|0;F=c[a+216>>2]|0;if((c[b+4>>2]|0)!=32){c[H+32>>2]=0;c[H+32+4>>2]=b;c[H+32+8>>2]=G;c[H+32+12>>2]=G+4;c[H+32+16>>2]=-1;c[H+32+20>>2]=-1;ad(a+68|0,a+132|0,H+32|0,F);G=1;l=H;return G|0}if((G|0)==0?1:(c[G+252>>2]|0)!=8){G=1;l=H;return G|0}if(c[G+812>>2]|0?(c[G+1028>>2]|0)==0:0)$g(G);B=+g[a+180>>2]-+g[a+116>>2];C=+g[a+184>>2]-+g[a+120>>2];E=+g[a+188>>2]-+g[a+124>>2];b=c[G+1028>>2]|0;if(!b){s=c[G+812>>2]|0;if((s|0)>0){r=c[G+820>>2]|0;q=0;d=0;b=-1;i=1065353216;m=0;e=1.0;f=1.0;do{K=c[r+(q*44|0)+8>>2]|0;J=c[r+(q*44|0)+12>>2]|0;I=c[r+(q*44|0)+16>>2]|0;h=+Gh(a+116|0,B,C,E,+g[K+8>>2],+g[K+12>>2],+g[K+16>>2],+g[J+8>>2],+g[J+12>>2],+g[J+16>>2],+g[I+8>>2],+g[I+12>>2],+g[I+16>>2],f);if(h>0.0){d=d+1|0;b=q;i=(g[j>>2]=h,c[j>>2]|0);m=3;e=h;f=h}q=q+1|0}while((q|0)!=(s|0))}else{d=0;b=-1;i=1065353216;m=0;e=1.0}}else{c[H+32>>2]=3396;c[H+32+4>>2]=c[a+116>>2];c[H+32+4+4>>2]=c[a+116+4>>2];c[H+32+4+8>>2]=c[a+116+8>>2];c[H+32+4+12>>2]=c[a+116+12>>2];g[H+32+36>>2]=B;g[H+32+40>>2]=C;g[H+32+44>>2]=E;g[H+32+48>>2]=0.0;c[H+32+20>>2]=c[a+180>>2];c[H+32+20+4>>2]=c[a+180+4>>2];c[H+32+20+8>>2]=c[a+180+8>>2];c[H+32+20+12>>2]=c[a+180+12>>2];c[H+32+52>>2]=1065353216;c[H+32+56>>2]=0;c[H+32+60>>2]=0;Ue(b,a+116|0,a+180|0,H+32|0);b=c[H+32+56>>2]|0;if(!b){d=0;b=-1;i=1065353216;m=0;e=1.0}else{K=c[H+32+52>>2]|0;d=1;b=(b-(c[G+820>>2]|0)|0)/44|0;i=K;m=3;e=(c[j>>2]=K,+g[j>>2])}}s=c[G+832>>2]|0;if((s|0)>0){r=c[G+840>>2]|0;q=0;f=(c[j>>2]=i,+g[j>>2]);while(1){K=c[r+(q*104|0)+8>>2]|0;v=+g[K+8>>2];y=+g[K+12>>2];A=+g[K+16>>2];K=c[r+(q*104|0)+12>>2]|0;k=+g[K+8>>2];p=+g[K+12>>2];u=+g[K+16>>2];K=c[r+(q*104|0)+16>>2]|0;w=+g[K+8>>2];x=+g[K+12>>2];z=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,w,x,z,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}else i=m;K=c[r+(q*104|0)+20>>2]|0;n=+g[K+8>>2];o=+g[K+12>>2];t=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}h=+Gh(a+116|0,B,C,E,k,p,u,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;f=h;e=h}h=+Gh(a+116|0,B,C,E,v,y,A,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}q=q+1|0;if((q|0)==(s|0)){p=e;break}else m=i}}else{i=m;p=e}if(!d){K=1;l=H;return K|0}if(!(p<=+g[F+4>>2])){K=1;l=H;return K|0}c[H+32>>2]=0;c[H+32+4>>2]=b;k=+g[a+180>>2]-+g[a+116>>2];n=+g[a+184>>2]-+g[a+120>>2];o=+g[a+188>>2]-+g[a+124>>2];e=1.0/+D(+(k*k+n*n+o*o));if((i|0)==3){d=c[G+820>>2]|0;e=+g[d+(b*44|0)+20>>2];h=+g[d+(b*44|0)+24>>2];f=+g[d+(b*44|0)+28>>2];if(k*e+n*h+o*f>0.0){k=-e;h=-h;f=-f;e=0.0}else{k=e;e=+g[d+(b*44|0)+32>>2]}}else{k=-(k*e);h=-(n*e);f=-(o*e);e=0.0}c[H>>2]=G;c[H+4>>2]=H+32;g[H+8>>2]=k;g[H+12>>2]=h;g[H+16>>2]=f;g[H+20>>2]=e;g[H+24>>2]=p;+qb[c[(c[F>>2]|0)+12>>2]&31](F,H,1);K=1;l=H;return K|0}function Qd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0;if(a[b+165>>0]|0){h=c[b+88>>2]|0;a:do if((h|0)>0&e){f=c[b+96>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){s=+g[f+(e<<4)>>2]-j;r=+g[f+(e<<4)+4>>2]-k;q=+g[f+(e<<4)+8>>2]-l;if(s*s+r*r+q*q<=m)break;e=e+1|0;if((e|0)>=(h|0))break a}return e|0}while(0);p=(c[b+32>>2]|0)+12|0;c[p>>2]=(c[p>>2]|0)+1;if((h|0)==(c[b+92>>2]|0)?(i=h|0?h<<1:1,(h|0)<(i|0)):0){if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<4|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+88>>2]|0}if((h|0)>0){f=0;do{p=e+(f<<4)|0;o=(c[b+96>>2]|0)+(f<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+96>>2]|0;if(f|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=e;c[b+92>>2]=i;e=c[b+88>>2]|0}else e=h;p=(c[b+96>>2]|0)+(e<<4)|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+88>>2]|0;c[b+88>>2]=d+1;c[(c[b+32>>2]|0)+16>>2]=c[b+96>>2];return d|0}h=c[b+108>>2]|0;b:do if((h|0)>0&e){f=c[b+116>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){q=+g[f+(e<<2)>>2]-j;r=+g[f+(e+1<<2)>>2]-k;s=+g[f+(e+2<<2)>>2]-l;i=e+3|0;if(q*q+r*r+s*s<=m)break;if((i|0)<(h|0))e=i;else break b}d=(e|0)/3|0;return d|0}while(0);e=c[b+112>>2]|0;if((h|0)==(e|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+108>>2]|0}i=c[b+116>>2]|0;if((h|0)<=0)if(!i)f=b+120|0;else p=34;else{f=0;do{c[e+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));p=34}if((p|0)==34){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;f=c[b+108>>2]|0;i=n}else{f=h;i=h}}else{f=h;i=e}h=c[b+116>>2]|0;c[h+(f<<2)>>2]=c[d>>2];e=f+1|0;c[b+108>>2]=e;if((e|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=48;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=48}if((p|0)==48){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;o=e;f=c[b+108>>2]|0;i=n}else{o=h;f=i;e=h}}else{o=h;f=e;e=h}c[o+(f<<2)>>2]=c[d+4>>2];f=f+1|0;c[b+108>>2]=f;if((f|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){e=0;h=o}else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=62;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=62}if((p|0)==62){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;h=e;f=c[b+108>>2]|0}else{h=o;f=i}}else h=o;c[h+(f<<2)>>2]=c[d+8>>2];d=f+1|0;c[b+108>>2]=d;b=c[b+32>>2]|0;c[b+12>>2]=(c[b+12>>2]|0)+1;c[b+16>>2]=e;d=((d|0)/3|0)+-1|0;return d|0}function Rd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;m=l;l=l+400|0;f=c[d+36>>2]|0;d=c[e+36>>2]|0;e=c[b+24>>2]|0;if(((e|0)==(c[b+28>>2]|0)?c[e+1132>>2]|0:0)?(j=(P(c[d+380>>2]|0,c[e+1112>>2]|0)|0)+(c[f+380>>2]|0)|0,a[(c[e+1140>>2]|0)+j>>0]|0):0){c[5773]=(c[5773]|0)+1;l=m;return}c[m+332+4>>2]=35;c[m+332+8>>2]=0;c[m+332+12>>2]=-1;c[m+332+16>>2]=1065353216;c[m+332+20>>2]=1065353216;c[m+332+24>>2]=1065353216;g[m+332+28>>2]=0.0;c[m+332>>2]=3644;c[m+332+56>>2]=f;g[m+332+48>>2]=0.0;c[m+272+4>>2]=35;c[m+272+8>>2]=0;c[m+272+12>>2]=-1;c[m+272+16>>2]=1065353216;c[m+272+20>>2]=1065353216;c[m+272+24>>2]=1065353216;g[m+272+28>>2]=0.0;c[m+272>>2]=3644;c[m+272+56>>2]=d;g[m+272+48>>2]=0.0;if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}o=+g[f+232>>2]-+g[d+232>>2];n=+g[f+236>>2]-+g[d+236>>2];g[m>>2]=+g[f+228>>2]-+g[d+228>>2];g[m+4>>2]=o;g[m+8>>2]=n;g[m+12>>2]=0.0;if(!(!(Gd(m+332|0,22728,m+272|0,22728,m,m+216|0)|0)?!(Hc(m+332|0,22728,m+272|0,22728,m,m+216|0,0)|0):0))h=19;if((h|0)==19?(c[m+4>>2]=0,c[m+4+4>>2]=0,c[m+4+8>>2]=0,c[m+4+12>>2]=0,c[m+4+16>>2]=0,c[m+4+20>>2]=0,a[m+152>>0]=0,c[m>>2]=3432,zd(b,m+216|0,f,0,0,d,0,0,m)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)j=0;else{c[(d+4+15&-16)+-4>>2]=d;j=d+4+15&-16}e=j+4|0;d=j+152|0;Yk(e|0,0,212)|0;c[j>>2]=3432;f=m+4|0;h=e+100|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));e=j+104|0;c[e>>2]=c[m+104>>2];c[e+4>>2]=c[m+104+4>>2];c[e+8>>2]=c[m+104+8>>2];c[e+12>>2]=c[m+104+12>>2];e=j+120|0;c[e>>2]=c[m+120>>2];c[e+4>>2]=c[m+120+4>>2];c[e+8>>2]=c[m+120+8>>2];c[e+12>>2]=c[m+120+12>>2];e=j+136|0;c[e>>2]=c[m+136>>2];c[e+4>>2]=c[m+136+4>>2];c[e+8>>2]=c[m+136+8>>2];c[e+12>>2]=c[m+136+12>>2];a[d>>0]=a[m+152>>0]|0;e=j+156|0;f=m+156|0;h=e+60|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));h=c[b+24>>2]|0;i=j;d=c[h+912>>2]|0;if((d|0)==(c[h+916>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[h+912>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[h+920>>2]|0;if(e){if(a[h+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[h+912>>2]|0}c[h+920>>2]=0}a[h+924>>0]=1;c[h+920>>2]=f;c[h+916>>2]=k}c[(c[h+920>>2]|0)+(d<<2)>>2]=i;c[h+912>>2]=d+1;i=c[b+24>>2]|0;k=c[b+28>>2]|0;n=+g[i+408>>2];o=+g[k+408>>2];b=j+64|0;g[b>>2]=+g[b>>2]*(n>o?n:o);b=j+68|0;g[b>>2]=+g[b>>2]*(+g[i+420>>2]+ +g[k+420>>2])*.5}l=m;return}function Sd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0;p=l;l=l+128|0;c[b+72>>2]=(c[b+72>>2]|0)+1;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];c[p+16>>2]=c[d+16>>2];c[p+16+4>>2]=c[d+16+4>>2];c[p+16+8>>2]=c[d+16+8>>2];c[p+16+12>>2]=c[d+16+12>>2];c[p+32>>2]=c[d+32>>2];c[p+32+4>>2]=c[d+32+4>>2];c[p+32+8>>2]=c[d+32+8>>2];c[p+32+12>>2]=c[d+32+12>>2];c[p+48>>2]=c[d+48>>2];c[p+48+4>>2]=c[d+48+4>>2];c[p+48+8>>2]=c[d+48+8>>2];c[p+48+12>>2]=c[d+48+12>>2];n=c[e+4>>2]|0;o=+nb[c[(c[e>>2]|0)+48>>2]&15](e);Vb[c[(c[e>>2]|0)+8>>2]&127](e,d,p+112|0,p+96|0);f=+g[p+112>>2];if(+g[b+36>>2]>f)g[b+36>>2]=f;f=+g[p+96>>2];if(+g[b+52>>2]>2]=f;f=+g[p+112+4>>2];if(+g[b+40>>2]>f)g[b+40>>2]=f;f=+g[p+96+4>>2];if(+g[b+56>>2]>2]=f;f=+g[p+112+8>>2];if(+g[b+44>>2]>f)g[b+44>>2]=f;f=+g[p+96+8>>2];if(+g[b+60>>2]>2]=f;k=c[b+68>>2]|0;if(!k){k=b+20|0;j=0}else{c[p+64>>2]=c[p+112>>2];c[p+64+4>>2]=c[p+112+4>>2];c[p+64+8>>2]=c[p+112+8>>2];c[p+64+12>>2]=c[p+112+12>>2];c[p+64+16>>2]=c[p+96>>2];c[p+64+16+4>>2]=c[p+96+4>>2];c[p+64+16+8>>2]=c[p+96+8>>2];c[p+64+16+12>>2]=c[p+96+12>>2];j=c[b+20>>2]|0;d=c[k+4>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;i=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0))}else c[k+4>>2]=0;c[d+32>>2]=0;c[d+36>>2]=j;c[d+40>>2]=0;c[d>>2]=c[p+64>>2];c[d+4>>2]=c[p+64+4>>2];c[d+8>>2]=c[p+64+8>>2];c[d+12>>2]=c[p+64+12>>2];c[d+16>>2]=c[p+64+16>>2];c[d+20>>2]=c[p+64+20>>2];c[d+24>>2]=c[p+64+24>>2];c[d+28>>2]=c[p+64+28>>2];Pe(k,c[k>>2]|0,d);c[k+12>>2]=(c[k+12>>2]|0)+1;k=b+20|0;j=d}d=c[k>>2]|0;if((d|0)==(c[b+24>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((m*80|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[k>>2]|0}if((d|0)>0){h=0;do{q=i+(h*80|0)|0;r=c[b+28>>2]|0;s=r+(h*80|0)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=r+(h*80|0)+16|0;s=i+(h*80|0)+16|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];s=r+(h*80|0)+32|0;q=i+(h*80|0)+32|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+48|0;s=r+(h*80|0)+48|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+64|0;r=r+(h*80|0)+64|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=h+1|0}while((h|0)!=(d|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=i;c[b+24>>2]=m;d=c[k>>2]|0}s=c[b+28>>2]|0;r=s+(d*80|0)|0;c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];r=s+(d*80|0)+16|0;c[r>>2]=c[p+16>>2];c[r+4>>2]=c[p+16+4>>2];c[r+8>>2]=c[p+16+8>>2];c[r+12>>2]=c[p+16+12>>2];r=s+(d*80|0)+32|0;c[r>>2]=c[p+32>>2];c[r+4>>2]=c[p+32+4>>2];c[r+8>>2]=c[p+32+8>>2];c[r+12>>2]=c[p+32+12>>2];r=s+(d*80|0)+48|0;c[r>>2]=c[p+48>>2];c[r+4>>2]=c[p+48+4>>2];c[r+8>>2]=c[p+48+8>>2];c[r+12>>2]=c[p+48+12>>2];s=s+(d*80|0)+64|0;c[s>>2]=e;c[s+4>>2]=n;g[s+8>>2]=o;c[s+12>>2]=j;c[k>>2]=(c[k>>2]|0)+1;l=p;return}function Td(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0;m=l;l=l+16|0;if(!(a[b+1308>>0]|0)){l=m;return}g[b+928>>2]=0.0;g[b+992>>2]=0.0;g[b+1056>>2]=0.0;c[b+712>>2]=0;c[b+712+4>>2]=0;c[b+712+8>>2]=0;c[b+712+12>>2]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);Ib[c[(c[b>>2]|0)+44>>2]&511](b);e=+g[b+1284>>2];f=+g[b+1288>>2];h=+g[b+1292>>2];if(+g[b+696>>2]>=+g[b+680>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+16>>2]|0;k=c[d+32>>2]|0;c[m>>2]=c[d>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+176|0,m,e,f,h,e,f,h)}if(+g[b+700>>2]>=+g[b+684>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+20>>2]|0;k=c[d+36>>2]|0;c[m>>2]=c[d+4>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+260|0,m,e,f,h,e,f,h)}if(+g[b+704>>2]>=+g[b+688>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+24>>2]|0;k=c[d+40>>2]|0;c[m>>2]=c[d+8>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+344|0,m,e,f,h,e,f,h)}k=0;do{f=+g[b+868+(k<<6)>>2];h=+g[b+868+(k<<6)+4>>2];j=+Xj(+g[b+1192+(k<<2)>>2],f,h);g[b+868+(k<<6)+52>>2]=j;do if(!(f>h)){if(f>j){c[b+868+(k<<6)+56>>2]=1;d=b+868+(k<<6)+48|0;g[d>>2]=j-f;if(!(j-f>3.1415927410125732))if(j-f<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-f+e;i=16;break}d=b+868+(k<<6)+56|0;if(h>2]=2;d=b+868+(k<<6)+48|0;g[d>>2]=j-h;if(!(j-h>3.1415927410125732))if(j-h<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-h+e;i=16}else i=15}else{d=b+868+(k<<6)+56|0;i=15}while(0);if((i|0)==15?(i=0,c[d>>2]=0,a[b+868+(k<<6)+44>>0]|0):0)i=16;if((i|0)==16){K=b+1208+(k<<4)|0;c[m>>2]=c[K>>2];c[m+4>>2]=c[K+4>>2];c[m+8>>2]=c[K+8>>2];c[m+12>>2]=c[K+12>>2];K=b+428+(k*84|0)|0;d=c[b+28>>2]|0;J=+g[d+4>>2];I=+g[d+20>>2];H=+g[d+36>>2];F=+g[d+8>>2];E=+g[d+24>>2];D=+g[d+40>>2];B=+g[d+12>>2];A=+g[d+28>>2];z=+g[d+44>>2];i=c[b+32>>2]|0;x=+g[i+4>>2];w=+g[i+20>>2];v=+g[i+36>>2];t=+g[i+8>>2];s=+g[i+24>>2];r=+g[i+40>>2];p=+g[i+12>>2];n=+g[i+28>>2];f=+g[i+44>>2];c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;o=+g[m>>2];e=+g[m+4>>2];h=+g[m+8>>2];g[b+428+(k*84|0)+16>>2]=J*o+I*e+H*h;g[b+428+(k*84|0)+20>>2]=F*o+E*e+D*h;g[b+428+(k*84|0)+24>>2]=B*o+A*e+z*h;g[b+428+(k*84|0)+28>>2]=0.0;g[b+428+(k*84|0)+32>>2]=x*-o+w*-e+v*-h;g[b+428+(k*84|0)+36>>2]=t*-o+s*-e+r*-h;g[b+428+(k*84|0)+40>>2]=p*-o+n*-e+f*-h;g[b+428+(k*84|0)+44>>2]=0.0;G=(J*o+I*e+H*h)*+g[d+456>>2];C=(F*o+E*e+D*h)*+g[d+460>>2];y=(B*o+A*e+z*h)*+g[d+464>>2];g[b+428+(k*84|0)+48>>2]=G;g[b+428+(k*84|0)+52>>2]=C;g[b+428+(k*84|0)+56>>2]=y;g[b+428+(k*84|0)+60>>2]=0.0;u=(x*-o+w*-e+v*-h)*+g[i+456>>2];q=(t*-o+s*-e+r*-h)*+g[i+460>>2];j=(p*-o+n*-e+f*-h)*+g[i+464>>2];g[b+428+(k*84|0)+64>>2]=u;g[b+428+(k*84|0)+68>>2]=q;g[b+428+(k*84|0)+72>>2]=j;g[b+428+(k*84|0)+76>>2]=0.0;g[b+428+(k*84|0)+80>>2]=(J*o+I*e+H*h)*G+(F*o+E*e+D*h)*C+(B*o+A*e+z*h)*y+((x*-o+w*-e+v*-h)*u+(t*-o+s*-e+r*-h)*q+(p*-o+n*-e+f*-h)*j)}k=k+1|0}while((k|0)!=3);l=m;return}function Ud(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0;i=l;l=l+464|0;c[i+128>>2]=c[d>>2];c[i+128+4>>2]=c[d+4>>2];c[i+128+8>>2]=c[d+8>>2];c[i+128+12>>2]=c[d+12>>2];c[i+128+16>>2]=c[d+16>>2];c[i+128+16+4>>2]=c[d+16+4>>2];c[i+128+16+8>>2]=c[d+16+8>>2];c[i+128+16+12>>2]=c[d+16+12>>2];c[i+128+32>>2]=c[d+32>>2];c[i+128+32+4>>2]=c[d+32+4>>2];c[i+128+32+8>>2]=c[d+32+8>>2];c[i+128+32+12>>2]=c[d+32+12>>2];k=i+128+48|0;c[k>>2]=c[d+48>>2];c[k+4>>2]=c[d+48+4>>2];c[k+8>>2]=c[d+48+8>>2];c[k+12>>2]=c[d+48+12>>2];c[i+64>>2]=c[e>>2];c[i+64+4>>2]=c[e+4>>2];c[i+64+8>>2]=c[e+8>>2];c[i+64+12>>2]=c[e+12>>2];c[i+64+16>>2]=c[e+16>>2];c[i+64+16+4>>2]=c[e+16+4>>2];c[i+64+16+8>>2]=c[e+16+8>>2];c[i+64+16+12>>2]=c[e+16+12>>2];c[i+64+32>>2]=c[e+32>>2];c[i+64+32+4>>2]=c[e+32+4>>2];c[i+64+32+8>>2]=c[e+32+8>>2];c[i+64+32+12>>2]=c[e+32+12>>2];j=i+64+48|0;c[j>>2]=c[e+48>>2];c[j+4>>2]=c[e+48+4>>2];c[j+8>>2]=c[e+48+8>>2];c[j+12>>2]=c[e+48+12>>2];If(i+128|0,i+64|0,i+256|0,i+192|0);t=+g[i+192>>2];m=t*+g[i+256+4>>2];r=t*+g[i+256+8>>2];g[i+16>>2]=+g[i+256>>2]*t;g[i+16+4>>2]=m;g[i+16+8>>2]=r;g[i+16+12>>2]=0.0;c[i+256>>2]=0;c[i+256+4>>2]=0;c[i+256+8>>2]=0;c[i+256+12>>2]=0;c[i+192+48>>2]=0;c[i+192+48+4>>2]=0;c[i+192+48+8>>2]=0;c[i+192+48+12>>2]=0;yh(i+128|0,i);r=+g[i>>2];m=+g[i+4>>2];t=+g[i+8>>2];q=+g[i+12>>2];o=r*(2.0/(r*r+m*m+t*t+q*q));n=m*(2.0/(r*r+m*m+t*t+q*q));p=t*(2.0/(r*r+m*m+t*t+q*q));g[i+192>>2]=1.0-(m*n+t*p);g[i+192+4>>2]=r*n-q*p;g[i+192+8>>2]=r*p+q*n;g[i+192+12>>2]=0.0;g[i+192+16>>2]=r*n+q*p;g[i+192+20>>2]=1.0-(r*o+t*p);g[i+192+24>>2]=m*p-q*o;g[i+192+28>>2]=0.0;g[i+192+32>>2]=r*p-q*n;g[i+192+36>>2]=m*p+q*o;g[i+192+40>>2]=1.0-(r*o+m*n);g[i+192+44>>2]=0.0;kh(b,i+192|0,i+256|0,i+16|0,i+48|0,i+32|0);c[i+256>>2]=6284;c[i+256+36>>2]=c[d>>2];c[i+256+36+4>>2]=c[d+4>>2];c[i+256+36+8>>2]=c[d+8>>2];c[i+256+36+12>>2]=c[d+12>>2];c[i+256+52>>2]=c[d+16>>2];c[i+256+52+4>>2]=c[d+16+4>>2];c[i+256+52+8>>2]=c[d+16+8>>2];c[i+256+52+12>>2]=c[d+16+12>>2];c[i+256+68>>2]=c[d+32>>2];c[i+256+68+4>>2]=c[d+32+4>>2];c[i+256+68+8>>2]=c[d+32+8>>2];c[i+256+68+12>>2]=c[d+32+12>>2];s=i+256+84|0;c[s>>2]=c[d+48>>2];c[s+4>>2]=c[d+48+4>>2];c[s+8>>2]=c[d+48+8>>2];c[s+12>>2]=c[d+48+12>>2];c[i+256+100>>2]=c[e>>2];c[i+256+100+4>>2]=c[e+4>>2];c[i+256+100+8>>2]=c[e+8>>2];c[i+256+100+12>>2]=c[e+12>>2];c[i+256+116>>2]=c[e+16>>2];c[i+256+116+4>>2]=c[e+16+4>>2];c[i+256+116+8>>2]=c[e+16+8>>2];c[i+256+116+12>>2]=c[e+16+12>>2];c[i+256+132>>2]=c[e+32>>2];c[i+256+132+4>>2]=c[e+32+4>>2];c[i+256+132+8>>2]=c[e+32+8>>2];c[i+256+132+12>>2]=c[e+32+12>>2];d=i+256+148|0;c[d>>2]=c[e+48>>2];c[d+4>>2]=c[e+48+4>>2];c[d+8>>2]=c[e+48+8>>2];c[d+12>>2]=c[e+48+12>>2];c[i+256+180>>2]=a;c[i+256+184>>2]=f;g[i+256+188>>2]=h;c[i+256+192>>2]=b;n=+g[d>>2]-+g[s>>2];m=+g[i+256+152>>2]-+g[i+256+88>>2];o=+g[i+256+156>>2]-+g[i+256+92>>2];h=1.0/+D(+(n*n+m*m+o*o));r=n*h==0.0?999999984306749440.0:1.0/(n*h);g[i+256+4>>2]=r;q=m*h==0.0?999999984306749440.0:1.0/(m*h);g[i+256+8>>2]=q;p=o*h==0.0?999999984306749440.0:1.0/(o*h);g[i+256+12>>2]=p;c[i+256+20>>2]=r<0.0&1;c[i+256+24>>2]=q<0.0&1;c[i+256+28>>2]=p<0.0&1;g[i+256+32>>2]=o*o*h+(n*n*h+m*m*h);f=c[a+68>>2]|0;$b[c[(c[f>>2]|0)+24>>2]&7](f,k,j,i+256|0,i+48|0,i+32|0);l=i;return}function Vd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=d;g[b+28>>2]=0.0;c[b+32>>2]=0;c[b+36>>2]=1;g[b+40>>2]=1.0;a[b+44>>0]=1;c[b+48>>2]=0;a[b+52>>0]=0;a[b+53>>0]=1;a[b+54>>0]=1;g[b+56>>2]=.03999999910593033;a[b+60>>0]=0;g[b+64>>2]=0.0;c[b+68>>2]=e;c[b+72>>2]=0;a[b+76>>0]=1;c[b+80>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;g[b+92>>2]=.6000000238418579;g[b+96>>2]=1.0;g[b+100>>2]=.30000001192092896;g[b+104>>2]=.01666666753590107;g[b+108>>2]=0.0;g[b+116>>2]=20.0;c[b+112>>2]=10;g[b+124>>2]=.20000000298023224;g[b+128>>2]=.20000000298023224;g[b+132>>2]=0.0;g[b+136>>2]=.20000000298023224;g[b+140>>2]=0.0;g[b+120>>2]=1.0;c[b+144>>2]=1;g[b+148>>2]=-.03999999910593033;g[b+152>>2]=.10000000149011612;g[b+156>>2]=0.0;g[b+160>>2]=.8500000238418579;c[b+164>>2]=260;c[b+168>>2]=2;c[b+172>>2]=128;g[b+176>>2]=100.0;g[b+180>>2]=1000000015047466219876688.0e6;g[b+184>>2]=0.0;g[b+188>>2]=.20000000298023224;c[b>>2]=4360;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+212>>2]=0;c[b+216>>2]=f;a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;c[b+264>>2]=0;c[b+268>>2]=-1054867456;a[b+290>>0]=0;a[b+291>>0]=0;c[b+272>>2]=0;c[b+272+4>>2]=0;c[b+272+8>>2]=0;c[b+272+12>>2]=0;a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;c[b+312>>2]=0;a[b+316>>0]=1;a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;c[b+340>>2]=0;if(!f){c[6995]=(c[6995]|0)+1;e=sc(255)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5052;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;a[e+160>>0]=1;c[e+156>>2]=0;c[e+148>>2]=0;c[e+152>>2]=0;a[e+180>>0]=1;c[e+176>>2]=0;c[e+168>>2]=0;c[e+172>>2]=0;a[e+208>>0]=1;c[e+204>>2]=0;c[e+196>>2]=0;c[e+200>>2]=0;c[e+232>>2]=0;c[e+224>>2]=0;c[e+212>>2]=14;c[e+216>>2]=15;c[e+220>>2]=16;c[b+216>>2]=e;e=1}else e=0;a[b+289>>0]=e;c[6995]=(c[6995]|0)+1;e=sc(87)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5768;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+64>>0]=1;c[b+220>>2]=e;a[b+288>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(107)|0;if(!e){f=0;h=c[b+216>>2]|0;c[f>>2]=4580;e=f+4|0;c[e>>2]=0;e=f+8|0;c[e>>2]=h;e=f+12|0;c[e>>2]=0;e=f+16|0;c[e>>2]=0;e=f+20|0;c[e>>2]=0;e=f+24|0;c[e>>2]=d;d=f+44|0;a[d>>0]=1;d=f+40|0;c[d>>2]=0;d=f+32|0;c[d>>2]=0;d=f+36|0;c[d>>2]=0;d=f+64|0;a[d>>0]=1;d=f+60|0;c[d>>2]=0;d=f+52|0;c[d>>2]=0;d=f+56|0;c[d>>2]=0;d=f+84|0;a[d>>0]=1;d=f+80|0;c[d>>2]=0;d=f+72|0;c[d>>2]=0;d=f+76|0;c[d>>2]=0;c[b+212>>2]=f;return}c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16;e=c[b+216>>2]|0;c[h>>2]=4580;f=h+4|0;c[f>>2]=0;f=h+8|0;c[f>>2]=e;f=h+12|0;c[f>>2]=0;f=h+16|0;c[f>>2]=0;f=h+20|0;c[f>>2]=0;f=h+24|0;c[f>>2]=d;d=h+44|0;a[d>>0]=1;d=h+40|0;c[d>>2]=0;d=h+32|0;c[d>>2]=0;d=h+36|0;c[d>>2]=0;d=h+64|0;a[d>>0]=1;d=h+60|0;c[d>>2]=0;d=h+52|0;c[d>>2]=0;d=h+56|0;c[d>>2]=0;d=h+84|0;a[d>>0]=1;d=h+80|0;c[d>>2]=0;d=h+72|0;c[d>>2]=0;d=h+76|0;c[d>>2]=0;c[b+212>>2]=h;return}function Wd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0;C=l;l=l+272|0;z=+g[e+48>>2]-+g[d+48>>2];A=+g[e+52>>2]-+g[d+52>>2];B=+g[e+56>>2]-+g[d+56>>2];If(d,e,C+256|0,C+208|0);v=+g[C+208>>2];t=+g[C+256>>2]*v;u=v*+g[C+256+4>>2];v=v*+g[C+256+8>>2];g[C+192>>2]=t;g[C+192+4>>2]=u;g[C+192+8>>2]=v;g[C+192+12>>2]=0.0;w=+g[h+48>>2]-+g[f+48>>2];x=+g[h+52>>2]-+g[f+52>>2];y=+g[h+56>>2]-+g[f+56>>2];If(f,h,C+256|0,C+208|0);r=+g[C+208>>2];p=+g[C+256>>2]*r;q=r*+g[C+256+4>>2];r=r*+g[C+256+8>>2];g[C+176>>2]=p;g[C+176+4>>2]=q;g[C+176+8>>2]=r;g[C+176+12>>2]=0.0;e=c[b+12>>2]|0;s=+nb[c[(c[e>>2]|0)+16>>2]&15](e);e=c[b+16>>2]|0;if(!e)m=0.0;else m=+nb[c[(c[e>>2]|0)+16>>2]&15](e);s=s*+D(+(t*t+u*u+v*v))+m*+D(+(p*p+q*q+r*r));if(s+ +D(+((w-z)*(w-z)+(x-A)*(x-A)+(y-B)*(y-B)))==0.0){i=0;l=C;return i|0}c[C+208>>2]=9504;g[C+208+36>>2]=999999984306749440.0;a[C+208+40>>0]=0;Jd(b,d,f,C+208|0);h=(a[C+208+40>>0]|0)==0;c[C+256>>2]=c[C+208+20>>2];c[C+256+4>>2]=c[C+208+20+4>>2];c[C+256+8>>2]=c[C+208+20+8>>2];c[C+256+12>>2]=c[C+208+20+12>>2];a:do if(!h?(o=c[C+208+4>>2]|0,k=c[C+208+8>>2]|0,n=c[C+208+12>>2]|0,v=(w-z)*(c[j>>2]=o,+g[j>>2]),v=v+(x-A)*(c[j>>2]=k,+g[j>>2]),!(s+(v+(y-B)*(c[j>>2]=n,+g[j>>2]))<=1.1920928955078125e-07)):0){m=+g[C+208+16>>2];p=+g[C+208+36>>2]+ +g[i+172>>2];b:do if(p>1.0000000474974513e-03){h=0;q=0.0;r=p;while(1){e=c[i+168>>2]|0;if(e|0){E=c[(c[e>>2]|0)+28>>2]|0;c[C+112>>2]=1065353216;c[C+112+4>>2]=1065353216;c[C+112+8>>2]=1065353216;g[C+112+12>>2]=0.0;Qb[E&7](e,C+256|0,.20000000298023224,C+112|0)}m=(w-z)*(c[j>>2]=o,+g[j>>2]);m=m+(x-A)*(c[j>>2]=k,+g[j>>2]);m=s+(m+(y-B)*(c[j>>2]=n,+g[j>>2]));if(m<=1.1920928955078125e-07){k=0;break a}p=q+r/m;if(!(!(p<=q)&(!(p<0.0)&!(p>1.0)))){k=0;break a}Af(d,z,A,B,C+192|0,p,C+112|0);Af(f,w,x,y,C+176|0,p,C+48|0);k=c[i+168>>2]|0;if(k|0){E=c[(c[k>>2]|0)+28>>2]|0;c[C>>2]=1065353216;c[C+4>>2]=0;c[C+8>>2]=0;g[C+12>>2]=0.0;Qb[E&7](k,C+112+48|0,.20000000298023224,C)}Jb[c[c[i>>2]>>2]&31](i,p);c[C>>2]=9504;g[C+36>>2]=999999984306749440.0;a[C+40>>0]=0;Jd(b,C+112|0,C+48|0,C);if(!(a[C+40>>0]|0)){k=15;break}m=+g[C+36>>2];q=+g[i+172>>2];c[C+256>>2]=c[C+20>>2];c[C+256+4>>2]=c[C+20+4>>2];c[C+256+8>>2]=c[C+20+8>>2];c[C+256+12>>2]=c[C+20+12>>2];e=h+1|0;if((h|0)>63){k=16;break}n=c[C+12>>2]|0;k=c[C+8>>2]|0;o=c[C+4>>2]|0;r=m+q;if(!(r>1.0000000474974513e-03)){m=+g[C+16>>2];break b}else{h=e;q=p}}if((k|0)==15)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-1,h);else if((k|0)==16)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-2,e);k=0;break a}else p=0.0;while(0);g[i+164>>2]=p;c[i+132>>2]=o;c[i+136>>2]=k;c[i+140>>2]=n;g[i+144>>2]=m;c[i+148>>2]=c[C+256>>2];c[i+148+4>>2]=c[C+256+4>>2];c[i+148+8>>2]=c[C+256+8>>2];c[i+148+12>>2]=c[C+256+12>>2];k=1}else k=0;while(0);E=k;l=C;return E|0}function Xd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0;F=l;l=l+32|0;A=+g[b+48>>2]-+g[b+112>>2];h=+g[b+52>>2]-+g[b+116>>2];E=+g[b+56>>2]-+g[b+120>>2];B=A*+g[b+64>>2]+h*+g[b+80>>2]+E*+g[b+96>>2];C=A*+g[b+68>>2]+h*+g[b+84>>2]+E*+g[b+100>>2];E=A*+g[b+72>>2]+h*+g[b+88>>2]+E*+g[b+104>>2];e=c[a+8>>2]|0;z=c[a+4>>2]|0;h=+g[z+32>>2]*+g[z+16>>2];A=h+ +g[a+12>>2];p=+g[e+76>>2];q=+g[e+60>>2];r=+g[e+80>>2];s=+g[e+64>>2];t=+g[e+84>>2];u=+g[e+68>>2];v=+g[e+92>>2];w=+g[e+96>>2];x=+g[e+100>>2];j=(r-s)*(x-u)-(t-u)*(w-s);k=(t-u)*(v-q)-(p-q)*(x-u);o=(p-q)*(w-s)-(r-s)*(v-q);if(!(o*o+(j*j+k*k)>=1.4210854715202004e-14)){l=F;return}n=1.0/+D(+(o*o+(j*j+k*k)));i=(B-q)*j*n+k*n*(C-s)+o*n*(E-u);if(i<0.0){i=-i;m=-(j*n);j=-(k*n);k=-(o*n)}else{m=j*n;j=k*n;k=o*n}if(!(i0.0&(o>0.0&y>0.0)|x<=0.0&(o<=0.0&y<=0.0))){if((xb[c[(c[e>>2]|0)+100>>2]&127](e)|0)<=0){l=F;return}e=0;z=0;o=0.0;n=0.0;i=0.0;do{G=c[a+8>>2]|0;Vb[c[(c[G>>2]|0)+104>>2]&127](G,z,F+16|0,F);s=+g[F+16>>2];x=+g[F+16+4>>2];u=+g[F+16+8>>2];t=+g[F>>2]-s;y=+g[F+4>>2]-x;v=+g[F+8>>2]-u;do if((B-s)*t+(C-x)*y+(E-u)*v>0.0)if((B-s)*t+(C-x)*y+(E-u)*v>2]|0}while((z|0)<(xb[c[(c[G>>2]|0)+100>>2]&127](G)|0));if(!(e&1)){l=F;return}else{p=A*A;s=o;r=n;q=i}}else{p=A*A;s=B-i*m;r=E-i*k;q=C-i*j}n=B-s;o=C-q;i=E-r;if(!(n*n+o*o+i*i1.1920928955078125e-07){j=+D(+(n*n+o*o+i*i));h=h-j;m=n*(1.0/j);k=i*(1.0/j);j=o*(1.0/j)}i=-h;h=+g[b+64>>2];if(f){y=+g[b+68>>2];A=+g[b+72>>2];B=h*m+y*j+A*k;p=+g[b+80>>2];t=+g[b+84>>2];u=+g[b+88>>2];C=m*p+j*t+k*u;v=+g[b+96>>2];w=+g[b+100>>2];x=+g[b+104>>2];E=m*v+j*w+k*x;g[F+16>>2]=-B;g[F+16+4>>2]=-C;g[F+16+8>>2]=-E;g[F+16+12>>2]=0.0;C=s*p+q*t+r*u+ +g[b+116>>2]+C*i;E=s*v+q*w+r*x+ +g[b+120>>2]+E*i;g[F>>2]=s*h+q*y+r*A+ +g[b+112>>2]+B*i;g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[c[(c[d>>2]|0)+16>>2]&15](d,F+16|0,F,i);l=F;return}else{G=c[(c[d>>2]|0)+16>>2]|0;A=+g[b+68>>2];B=+g[b+72>>2];v=+g[b+80>>2];w=+g[b+84>>2];C=+g[b+88>>2];x=+g[b+96>>2];y=+g[b+100>>2];E=+g[b+104>>2];g[F+16>>2]=h*m+A*j+B*k;g[F+16+4>>2]=m*v+j*w+k*C;g[F+16+8>>2]=m*x+j*y+k*E;g[F+16+12>>2]=0.0;C=s*v+q*w+r*C+ +g[b+116>>2];E=s*x+q*y+r*E+ +g[b+120>>2];g[F>>2]=s*h+q*A+r*B+ +g[b+112>>2];g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[G&15](d,F+16|0,F,i);l=F;return}}function Yd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;i=l;l=l+16|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;ef(23152,0.0,0,0,i)}c[5839]=c[5839]|1;g[5889]=0.0;j=+g[5899]*0.0;k=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=j;g[5896]=k;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;k=+g[5891]*0.0;j=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=k;g[5945]=j;g[5946]=0.0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=23152;c[b+32>>2]=d;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+112>>2]=c[e>>2];c[b+112+4>>2]=c[e+4>>2];c[b+112+8>>2]=c[e+8>>2];c[b+112+12>>2]=c[e+12>>2];c[b+128>>2]=c[e+16>>2];c[b+128+4>>2]=c[e+16+4>>2];c[b+128+8>>2]=c[e+16+8>>2];c[b+128+12>>2]=c[e+16+12>>2];c[b+144>>2]=c[e+32>>2];c[b+144+4>>2]=c[e+32+4>>2];c[b+144+8>>2]=c[e+32+8>>2];c[b+144+12>>2]=c[e+32+12>>2];c[b+160>>2]=c[e+48>>2];c[b+160+4>>2]=c[e+48+4>>2];c[b+160+8>>2]=c[e+48+8>>2];c[b+160+12>>2]=c[e+48+12>>2];e=b+680|0;h=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=f&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;y=+g[b+112>>2];E=+g[d+4>>2];x=+g[b+128>>2];D=+g[d+8>>2];w=+g[b+144>>2];C=+g[d+12>>2];v=+g[b+116>>2];u=+g[b+132>>2];t=+g[b+148>>2];s=+g[b+120>>2];q=+g[b+136>>2];o=+g[b+152>>2];B=+g[d+20>>2];A=+g[d+24>>2];z=+g[d+28>>2];r=+g[d+36>>2];p=+g[d+40>>2];n=+g[d+44>>2];G=+g[b+160>>2];F=+g[b+164>>2];k=+g[b+168>>2];m=+g[d+52>>2]+(E*G+D*F+C*k);j=B*G+A*F+z*k+ +g[d+56>>2];k=r*G+p*F+n*k+ +g[d+60>>2];g[b+48>>2]=y*E+x*D+w*C;g[b+52>>2]=E*v+D*u+C*t;g[b+56>>2]=E*s+D*q+C*o;g[b+60>>2]=0.0;g[b+64>>2]=y*B+x*A+w*z;g[b+68>>2]=v*B+u*A+t*z;g[b+72>>2]=s*B+q*A+o*z;g[b+76>>2]=0.0;g[b+80>>2]=y*r+x*p+w*n;g[b+84>>2]=v*r+u*p+t*n;g[b+88>>2]=s*r+q*p+o*n;g[b+92>>2]=0.0;g[b+96>>2]=m;g[b+100>>2]=j;g[b+104>>2]=k;g[b+108>>2]=0.0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);l=i;return}function Zd(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+288|0;c[w+208>>2]=c[d>>2];c[w+208+4>>2]=c[d+4>>2];c[w+208+8>>2]=c[d+8>>2];c[w+208+12>>2]=c[d+12>>2];o=w+208+16|0;c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];e=w+208+32|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];v=c[j>>2]|0;q=c[j+4>>2]|0;r=c[j+8>>2]|0;s=c[j+16>>2]|0;t=c[j+12>>2]|0;p=c[j+20>>2]|0;c[w+156>>2]=c[w+208>>2];c[w+156+4>>2]=c[w+208+4>>2];c[w+156+8>>2]=c[w+208+8>>2];c[w+156+12>>2]=c[w+208+12>>2];c[w+172>>2]=c[o>>2];c[w+172+4>>2]=c[o+4>>2];c[w+172+8>>2]=c[o+8>>2];c[w+172+12>>2]=c[o+12>>2];c[w+188>>2]=c[e>>2];c[w+188+4>>2]=c[e+4>>2];c[w+188+8>>2]=c[e+8>>2];c[w+188+12>>2]=c[e+12>>2];e=c[b+128>>2]|0;if((e|0)==(c[b+132>>2]|0)?(u=e|0?e<<1:1,(e|0)<(u|0)):0){if(!u)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((u*284|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+128>>2]|0}if((e|0)>0){f=0;do{j=c[b+136>>2]|0;m=d+(f*284|0)|0;n=j+(f*284|0)|0;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(f*284|0)+92|0;n=j+(f*284|0)+92|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=j+(f*284|0)+108|0;n=d+(f*284|0)+108|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=j+(f*284|0)+124|0;m=d+(f*284|0)+124|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+140|0;n=j+(f*284|0)+140|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+156|0;n=j+(f*284|0)+156|0;o=m+128|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));f=f+1|0}while((f|0)!=(e|0))}e=c[b+136>>2]|0;if(e|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=d;c[b+132>>2]=u;e=c[b+128>>2]|0}d=c[b+136>>2]|0;m=d+(e*284|0)|0;n=w;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(e*284|0)+92|0;c[m>>2]=c[w+92>>2];c[m+4>>2]=c[w+92+4>>2];c[m+8>>2]=c[w+92+8>>2];c[m+12>>2]=c[w+92+12>>2];m=d+(e*284|0)+108|0;c[m>>2]=c[w+108>>2];c[m+4>>2]=c[w+108+4>>2];c[m+8>>2]=c[w+108+8>>2];c[m+12>>2]=c[w+108+12>>2];m=d+(e*284|0)+124|0;c[m>>2]=c[w+124>>2];c[m+4>>2]=c[w+124+4>>2];c[m+8>>2]=c[w+124+8>>2];c[m+12>>2]=c[w+124+12>>2];m=d+(e*284|0)+140|0;c[m>>2]=c[w+140>>2];c[m+4>>2]=c[w+140+4>>2];c[m+8>>2]=c[w+140+8>>2];c[m+12>>2]=c[w+140+12>>2];d=d+(e*284|0)+156|0;m=d;n=w+156|0;o=m+48|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));g[d+48>>2]=h;c[d+52>>2]=t;g[d+56>>2]=i;c[d+60>>2]=v;c[d+64>>2]=q;c[d+68>>2]=r;c[d+72>>2]=s;g[d+76>>2]=0.0;g[d+80>>2]=0.0;g[d+84>>2]=0.0;g[d+88>>2]=.10000000149011612;c[d+92>>2]=p;g[d+96>>2]=0.0;g[d+100>>2]=0.0;a[d+104>>0]=k&1;m=d+105|0;n=w+256|0;o=m+23|0;do{a[m>>0]=a[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));k=c[b+128>>2]|0;c[b+128>>2]=k+1;k=(c[b+136>>2]|0)+(k*284|0)|0;Tg(c[b+108>>2]|0,k,0);xe(c[b+108>>2]|0,c[b+136>>2]|0,(c[b+128>>2]|0)+-1|0,0);l=w;return k|0}function _d(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((h|0)<0){o=c[b+8>>2]|0;+wb[c[(c[o>>2]|0)+12>>2]&3](o,d,e,f,g,c[b+12>>2]|0,c[b+16>>2]|0,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);return}l=c[b+16>>2]|0;a:do if((l|0)>0){j=c[b+12>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=c[k>>2]|0;n=c[o+28>>2]|0;if((c[((c[n+208>>2]|0)>-1?n:c[o+32>>2]|0)+208>>2]|0)==(h|0)){o=k;break a}i=i+1|0;if((i|0)>=(l|0)){o=0;break}}}else{i=0;o=0}while(0);if((i|0)<(l|0)){k=c[b+12>>2]|0;j=0;do{n=c[k+(i<<2)>>2]|0;m=c[n+28>>2]|0;j=((c[((c[m+208>>2]|0)>-1?m:c[n+32>>2]|0)+208>>2]|0)==(h|0)&1)+j|0;i=i+1|0}while((i|0)!=(l|0));n=j}else n=0;i=c[b+4>>2]|0;if((c[i+80>>2]|0)<2){m=c[b+8>>2]|0;+wb[c[(c[m>>2]|0)+12>>2]&3](m,d,e,f,g,o,n,i,c[b+20>>2]|0,c[b+24>>2]|0);return}if((e|0)>0){l=0;i=c[b+32>>2]|0;j=c[b+36>>2]|0;do{m=d+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+32>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+40>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+40>>2]|0;if(k){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+32>>2]|0}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=i;c[b+36>>2]=h;i=j;j=h}else i=j}c[(c[b+40>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+32>>2]=i;l=l+1|0}while((l|0)!=(e|0))}if((g|0)>0){l=0;i=c[b+52>>2]|0;j=c[b+56>>2]|0;do{m=f+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+52>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+60>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+60>>2]|0;if(k){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+52>>2]|0}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=i;c[b+56>>2]=h;i=j;j=h}else i=j}c[(c[b+60>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+52>>2]=i;l=l+1|0}while((l|0)!=(g|0))}if((n|0)>0){m=0;i=c[b+72>>2]|0;j=c[b+76>>2]|0;do{l=o+(m<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h){k=0;i=j}else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=i;i=c[b+72>>2]|0}if((i|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+80>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[b+80>>2]|0;if(j){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[b+72>>2]|0}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=k;c[b+76>>2]=h;j=h}else i=j}c[(c[b+80>>2]|0)+(i<<2)>>2]=c[l>>2];i=i+1|0;c[b+72>>2]=i;m=m+1|0}while((m|0)!=(n|0))}else i=c[b+72>>2]|0;if(((c[b+52>>2]|0)+i|0)<=(c[(c[b+4>>2]|0)+80>>2]|0))return;gh(b);return}function $d(d,f,h,i){d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;w=l;l=l+80|0;v=c[d+52>>2]|0;c[w>>2]=7212;c[w+4>>2]=v;c[w+8>>2]=f;c[w+60>>2]=0;v=c[d+56>>2]|0;if(!(a[v+60>>0]|0)){f=c[v+56>>2]|0;if((f|0)>0){p=0;d=0;m=c[v+96>>2]|0;while(1){d=d+1|0;if(!(+g[h>>2]>+g[m+16>>2])?!(+g[i>>2]<+g[m>>2]):0)j=1;else j=0;if(!(!(+g[h+8>>2]>+g[m+24>>2])?!(+g[i+8>>2]<+g[m+8>>2]):0))j=0;if(!(+g[h+4>>2]>+g[m+20>>2])?!(+g[i+4>>2]<+g[m+4>>2]):0){k=c[m+32>>2]|0;if(j&(k|0)==-1){Sb[c[(c[w>>2]|0)+8>>2]&127](w,c[m+36>>2]|0,c[m+40>>2]|0);f=c[v+56>>2]|0;o=43}else{n=(k|0)==-1;o=42}}else{k=c[m+32>>2]|0;n=(k|0)==-1;j=0;o=42}if((o|0)==42){o=0;if(n|j)o=43;else{m=m+(k<<6)|0;j=k+p|0}}if((o|0)==43){m=m+64|0;j=p+1|0}if((j|0)<(f|0))p=j;else break}}else d=0;if((c[6160]|0)>=(d|0)){l=w;return}c[6160]=d;l=w;return}z=+g[h>>2];D=+g[h+4>>2];H=+g[h+8>>2];G=+g[v+4>>2];z=z>2];D=D>2];H=H>2];E=+g[v+24>>2];A=+g[v+28>>2];F=+g[v+36>>2];B=+g[v+40>>2];x=+g[v+44>>2];s=~~(((I>1]=s;t=~~(((E>1]=t;b[w+70+4>>1]=u;H=+g[i>>2];D=+g[i+4>>2];z=+g[i+8>>2];H=H>1]=i;q=~~(((E>1]=q;b[w+64+4>>1]=r;switch(c[v+144>>2]|0){case 0:{o=c[v+56>>2]|0;if((o|0)>0){d=0;f=c[v+136>>2]|0;j=0;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{v=c[m>>2]|0;j=j-v|0;f=f+(0-v<<4)|0}}while((j|0)<(o|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d;break}case 1:{if((c[v+152>>2]|0)>0){h=0;do{d=c[v+160>>2]|0;if(((i&65535)>=(e[d+(h<<5)>>1]|0)?(s&65535)<=(e[d+(h<<5)+6>>1]|0):0)&(u&65535)<=(e[d+(h<<5)+10>>1]|0)&(r&65535)>=(e[d+(h<<5)+4>>1]|0)&(t&65535)<=(e[d+(h<<5)+8>>1]|0)&(q&65535)>=(e[d+(h<<5)+2>>1]|0)){p=c[d+(h<<5)+12>>2]|0;o=c[d+(h<<5)+16>>2]|0;if((o|0)>0){d=0;f=(c[v+136>>2]|0)+(p<<4)|0;j=p;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{n=c[m>>2]|0;j=j-n|0;f=f+(0-n<<4)|0}}while((j|0)<(o+p|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d}h=h+1|0}while((h|0)<(c[v+152>>2]|0))}break}case 2:{Ek(c[v+136>>2]|0,w,w+70|0,w+64|0);break}default:{}}l=w;return}function ae(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0;x=l;l=l+192|0;w=c[a+4>>2]|0;o=+g[w+784>>2];if(o>2]|0;i=(c[a+8>>2]|0)+8|0;v=c[i>>2]|0;E=+g[d>>2];j=+g[b>>2]*e+E;B=+g[d+4>>2];m=+g[b+4>>2]*e+B;y=+g[d+8>>2];n=+g[b+8>>2]*e+y;k=(c[a+12>>2]|0)+8|0;f=c[k>>2]|0;t=(u|0)!=(v|0)?f:u;f=(u|0)!=(v|0)?v:f;z=j-+g[t+52>>2];A=m-+g[t+56>>2];r=n-+g[t+60>>2];p=z*+g[t+4>>2]+A*+g[t+20>>2]+r*+g[t+36>>2];q=z*+g[t+8>>2]+A*+g[t+24>>2]+r*+g[t+40>>2];r=z*+g[t+12>>2]+A*+g[t+28>>2]+r*+g[t+44>>2];E=E-+g[f+52>>2];B=B-+g[f+56>>2];y=y-+g[f+60>>2];A=E*+g[f+4>>2]+B*+g[f+20>>2]+y*+g[f+36>>2];z=E*+g[f+8>>2]+B*+g[f+24>>2]+y*+g[f+40>>2];y=E*+g[f+12>>2]+B*+g[f+28>>2]+y*+g[f+44>>2];g[x>>2]=p;g[x+4>>2]=q;g[x+8>>2]=r;g[x+12>>2]=0.0;g[x+16>>2]=A;g[x+20>>2]=z;g[x+24>>2]=y;g[x+28>>2]=0.0;c[x+64>>2]=c[b>>2];c[x+64+4>>2]=c[b+4>>2];c[x+64+8>>2]=c[b+8>>2];c[x+64+12>>2]=c[b+12>>2];g[x+80>>2]=e;c[x+84>>2]=0;c[x+84+4>>2]=0;c[x+84+8>>2]=0;c[x+84+12>>2]=0;b=x+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[x+48>>2]=j;g[x+52>>2]=m;g[x+56>>2]=n;g[x+60>>2]=0.0;c[x+32>>2]=c[d>>2];c[x+32+4>>2]=c[d+4>>2];c[x+32+8>>2]=c[d+8>>2];c[x+32+12>>2]=c[d+12>>2];h=c[w+780>>2]|0;if((h|0)>0){b=-1;d=0;e=o*o;while(1){j=+g[w+4+(d*192|0)>>2]-p;m=+g[w+4+(d*192|0)+4>>2]-q;n=+g[w+4+(d*192|0)+8>>2]-r;f=j*j+m*m+n*n>2]|0;f=c[k>>2]|0;E=+g[b+228>>2];B=+g[f+228>>2];A=E*B<-10.0?-10.0:E*B;g[x+84>>2]=A>10.0?10.0:A;g[x+96>>2]=+g[b+232>>2]*+g[f+232>>2];A=+g[b+236>>2]*B+ +g[f+236>>2]*E;A=A<-10.0?-10.0:A;g[x+88>>2]=A>10.0?10.0:A;E=+g[b+240>>2]*B+ +g[f+240>>2]*E;E=E<-10.0?-10.0:E;g[x+92>>2]=E>10.0?10.0:E;d=c[b+204>>2]|0;if((d&128|0)==0?(c[f+204>>2]&128|0)==0:0)b=0;else{g[x+148>>2]=+g[b+244>>2]+ +g[f+244>>2];g[x+144>>2]=1.0/(1.0/+g[b+248>>2]+1.0/+g[f+248>>2]);c[x+120>>2]=8;b=8}if((d&512|0)==0?(c[f+204>>2]&512|0)==0:0)s=b;else{s=b|16;c[x+120>>2]=s}e=+g[x+72>>2];k=+C(+e)>.7071067690849304;n=+g[x+68>>2];if(k){m=1.0/+D(+(e*e+n*n));q=+g[x+64>>2];o=-(m*e);p=q*-(m*e);q=-(m*n*q);j=(e*e+n*n)*m;m=m*n;e=0.0}else{j=+g[x+64>>2];E=1.0/+D(+(j*j+n*n));o=E*j;p=(j*j+n*n)*E;q=e*-(n*E);j=-(E*j*e);m=0.0;e=-(n*E)}g[x+160>>2]=e;g[x+164>>2]=o;g[x+168>>2]=m;g[x+176>>2]=j;g[x+180>>2]=q;g[x+184>>2]=p;f=c[a+16>>2]|0;b=c[a+20>>2]|0;if((u|0)!=(v|0)){c[x+100>>2]=b;d=a+28|0;b=a+24|0}else{c[x+100>>2]=f;d=a+24|0;f=b;b=a+28|0}a=c[d>>2]|0;c[x+104>>2]=f;c[x+108>>2]=a;c[x+112>>2]=c[b>>2];if((t|0)>-1){b=w+4+(t*192|0)|0;f=w+4+(t*192|0)+156|0;d=c[f>>2]|0;h=w+4+(t*192|0)+124|0;e=+g[h>>2];i=w+4+(t*192|0)+128|0;j=+g[i>>2];k=w+4+(t*192|0)+132|0;m=+g[k>>2];if(!((s&16|0)!=0?(E=e*+g[w+4+(t*192|0)+84>>2]+0.0,!(j*j+m*m>E*E)):0)){w=w+4+(t*192|0)+116|0;a=c[w>>2]|0;gi(b|0,x|0,192)|0;c[w>>2]=a;g[h>>2]=e;g[i>>2]=j;g[k>>2]=m}c[f>>2]=d}else kf(w,x)|0;l=x;return}function be(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+172>>2];t=+g[f+340>>2];p=+g[b+168>>2];n=+g[b+164>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+172>>2];p=+g[f+396>>2];q=+g[b+168>>2];n=+g[b+164>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}p=k+d;r=o+j;q=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){k=0.0;n=0.0;m=0.0;d=0.0;j=0.0;o=0.0}else{t=+g[f+336>>2];j=+g[b+188>>2];w=+g[f+340>>2];v=+g[b+184>>2];o=+g[b+180>>2];u=+g[f+332>>2];k=+g[f+316>>2];n=+g[f+320>>2];m=+g[f+324>>2];d=t*j-w*v;j=w*o-j*u;o=v*u-t*o}}else{w=+g[f+392>>2];j=+g[b+188>>2];t=+g[f+396>>2];u=+g[b+184>>2];o=+g[b+180>>2];v=+g[f+388>>2];k=+g[f+372>>2];n=+g[f+376>>2];m=+g[f+380>>2];d=w*j-t*u;j=t*o-j*v;o=u*v-w*o}p=p-(k+d);n=r-(n+j);d=q-(m+o);j=+g[b+196>>2];k=+g[b+200>>2];m=+g[b+204>>2];a[s+36+32>>0]=1;c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;c[s+36>>2]=c[b+72>>2];c[s+36+4>>2]=c[b+72+4>>2];c[s+36+8>>2]=c[b+72+8>>2];c[s+36+12>>2]=c[b+72+12>>2];if(j*p+n*k+d*m<0.0){u=+g[b+212>>2];v=+g[s+36>>2]+((j*p+n*k+d*m)*j+(p-(j*p+n*k+d*m)*j)*u);g[s+36>>2]=v;w=(j*p+n*k+d*m)*k+u*(n-(j*p+n*k+d*m)*k)+ +g[s+36+4>>2];g[s+36+4>>2]=w;k=(j*p+n*k+d*m)*m+u*(d-(j*p+n*k+d*m)*m)+ +g[s+36+8>>2];g[s+36+8>>2]=k;f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=v;j=w}else{f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=+g[s+36>>2];j=+g[s+36+4>>2];k=+g[s+36+8>>2]}m=(+g[b+104>>2]*d+ +g[b+108>>2]*j+ +g[b+112>>2]*k)*e;n=(d*+g[b+120>>2]+j*+g[b+124>>2]+k*+g[b+128>>2])*e;d=(d*+g[b+136>>2]+j*+g[b+140>>2]+k*+g[b+144>>2])*e;g[i>>2]=m;g[f>>2]=n;g[h>>2]=d;g[s+36+12>>2]=0.0;f=c[b+4>>2]|0;if((f|0)!=(c[b+16>>2]|0)){f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+164|0);Nh(b+16|0,s+36|0,b+180|0);l=s;return}if(!(m==m&n==n&(d==d&0.0==0.0))){l=s;return}w=+D(+(m*m+n*n+d*d));if(w<+g[f+368>>2]){l=s;return}h=c[s+36+32>>2]|0;w=+g[f+372>>2];g[s+12>>2]=0.0;g[s+28>>2]=0.0;c[s+32>>2]=h;g[s>>2]=-(m*w);g[s+4>>2]=-(n*w);g[s+8>>2]=-(d*w);g[s+16>>2]=w*-0.0;g[s+20>>2]=w*-0.0;g[s+24>>2]=w*-0.0;Nh(b+4|0,s,b+164|0);d=+g[(c[b+4>>2]|0)+372>>2];f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));g[s>>2]=d*+g[s>>2];g[s+4>>2]=d*+g[s+4>>2];g[s+8>>2]=d*+g[s+8>>2];g[s+16>>2]=d*+g[s+16>>2];g[s+20>>2]=d*+g[s+20>>2];g[s+24>>2]=d*+g[s+24>>2];Nh(b+16|0,s,b+180|0);l=s;return}function ce(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[b>>2]=5536;k=(c[d+20>>2]|0)==0;c[6995]=(c[6995]|0)+1;e=sc(23)|0;c[(e+4+15&-16)+-4>>2]=e;c[(e+4+15&-16)>>2]=k?9416:9464;c[b+24>>2]=e+4+15&-16;c[6995]=(c[6995]|0)+1;e=sc(39)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}k=c[b+24>>2]|0;a[e+4>>0]=0;c[e>>2]=6380;c[e+12>>2]=0;c[e+16>>2]=3;c[e+8>>2]=k;c[b+28>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5568;c[b+32>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5588;c[b+36>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5608;c[b+40>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5628;c[b+44>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5648;c[b+48>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5668;c[b+52>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5688;c[b+56>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5708;c[b+72>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5708;c[b+76>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5728;c[b+68>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+84>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+80>>2]=e;a[e+4>>0]=1;k=c[d+16>>2]|0;k=(k|0)>80?k:80;e=c[d>>2]|0;if(!e){a[b+12>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+8>>2]|0;c[j>>2]=804;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*804|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+8>>2]=j}else{a[b+12>>0]=0;c[b+8>>2]=e}g=(k|0)>116?k+16&-16:128;e=c[d+4>>2]|0;if(e|0){a[b+20>>0]=0;c[b+16>>2]=e;return}a[b+20>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+12>>2]|0;c[j>>2]=g;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;e=P(e,g)|0;c[6995]=(c[6995]|0)+1;e=sc((e|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+16>>2]=j;return}function de(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+48|0;c[s+16>>2]=c[e>>2];c[s+16+4>>2]=c[e+4>>2];c[s+16+8>>2]=c[e+8>>2];c[s+16+12>>2]=c[e+12>>2];c[s+16+16>>2]=c[f>>2];c[s+16+16+4>>2]=c[f+4>>2];c[s+16+16+8>>2]=c[f+8>>2];c[s+16+16+12>>2]=c[f+12>>2];do if((c[d+60>>2]|0)==2){h=c[d+48>>2]|0;Ag(b+44|0,h)|0;i=c[b+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+48>>2]=h;c[b+56>>2]=(c[b+56>>2]|0)+-1;h=c[b+8>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+8>>2]=0;c[h+32>>2]=0;c[h+36>>2]=d;c[h+40>>2]=0;c[h>>2]=c[s+16>>2];c[h+4>>2]=c[s+16+4>>2];c[h+8>>2]=c[s+16+8>>2];c[h+12>>2]=c[s+16+12>>2];c[h+16>>2]=c[s+16+16>>2];c[h+20>>2]=c[s+16+20>>2];c[h+24>>2]=c[s+16+24>>2];c[h+28>>2]=c[s+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,h);c[b+16>>2]=(c[b+16>>2]|0)+1;c[d+48>>2]=h;h=1}else{c[b+128>>2]=(c[b+128>>2]|0)+1;r=c[d+48>>2]|0;if(((((+g[r>>2]<=+g[s+16+16>>2]?+g[r+16>>2]>=+g[s+16>>2]:0)?+g[r+4>>2]<=+g[s+16+20>>2]:0)?+g[r+20>>2]>=+g[s+16+4>>2]:0)?+g[r+8>>2]<=+g[s+16+24>>2]:0)?+g[r+24>>2]>=+g[s+16+8>>2]:0){k=+g[d+16>>2];t=+g[e>>2]-k;m=+g[d+20>>2];p=+g[e+4>>2]-m;n=+g[d+24>>2];q=+g[e+8>>2]-n;u=+g[b+100>>2];k=(+g[d+32>>2]-k)*.5*u;m=(+g[d+36>>2]-m)*.5*u;n=u*(+g[d+40>>2]-n)*.5;g[s>>2]=k;g[s+4>>2]=m;g[s+8>>2]=n;g[s+12>>2]=0.0;if(t<0.0)g[s>>2]=-k;if(p<0.0)g[s+4>>2]=-m;if(q<0.0)g[s+8>>2]=-n;if(uh(b+4|0,r,s+16|0,s,.05000000074505806)|0){c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}else h=0;break}h=Ag(b+4|0,r)|0;a:do if(h){o=c[b+12>>2]|0;if((o|0)<=-1){h=c[b+4>>2]|0;break}if(o){i=0;while(1){j=c[h+32>>2]|0;i=i+1|0;if(!j)break a;if((i|0)>=(o|0)){h=j;break}else h=j}}}else h=0;while(0);c[r>>2]=c[s+16>>2];c[r+4>>2]=c[s+16+4>>2];c[r+8>>2]=c[s+16+8>>2];c[r+12>>2]=c[s+16+12>>2];c[r+16>>2]=c[s+16+16>>2];c[r+20>>2]=c[s+16+20>>2];c[r+24>>2]=c[s+16+24>>2];c[r+28>>2]=c[s+16+28>>2];Pe(b+4|0,h,r);c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}while(0);i=c[d+52>>2]|0;c[((i|0)==0?b+84+(c[d+60>>2]<<2)|0:i+56|0)>>2]=c[d+56>>2];i=c[d+56>>2]|0;if(i|0)c[i+52>>2]=c[d+52>>2];c[d+16>>2]=c[e>>2];c[d+16+4>>2]=c[e+4>>2];c[d+16+8>>2]=c[e+8>>2];c[d+16+12>>2]=c[e+12>>2];c[d+32>>2]=c[f>>2];c[d+32+4>>2]=c[f+4>>2];c[d+32+8>>2]=c[f+8>>2];c[d+32+12>>2]=c[f+12>>2];i=c[b+104>>2]|0;c[d+60>>2]=i;c[d+52>>2]=0;c[d+56>>2]=c[b+84+(i<<2)>>2];j=c[b+84+(i<<2)>>2]|0;if(j|0)c[j+52>>2]=d;c[b+84+(i<<2)>>2]=d;if(!h){l=s;return}a[b+154>>0]=1;if(a[b+153>>0]|0){l=s;return}c[s>>2]=9248;c[s+4>>2]=b;ne(b+44|0,c[b+44>>2]|0,c[d+48>>2]|0,s);ne(b+4|0,c[b+4>>2]|0,c[d+48>>2]|0,s);l=s;return}function ee(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;D=c[a+772>>2]|0;if((D|0)>0){c[6995]=(c[6995]|0)+1;d=sc((D<<4|3)+16|0)|0;if(!d)h=0;else{c[(d+4+15&-16)+-4>>2]=d;h=d+4+15&-16}Yk(h|0,0,D<<4|0)|0;f=c[a+772>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Yk(d|0,0,f<<2|0)|0;B=d;C=h;A=d;z=h}else{B=0;C=h;A=0;z=h}}else{B=0;C=0;A=0;z=0}y=c[a+1112>>2]|0;if(b){if((y|0)>0){i=c[a+1120>>2]|0;d=0;do{f=c[i+(d<<2)>>2]|0;h=c[f+312>>2]|0;if(h|0){g[f+276>>2]=1.0/+(h|0)*+g[f+276>>2];g[f+280>>2]=1.0/+(h|0)*+g[f+280>>2];g[f+284>>2]=1.0/+(h|0)*+g[f+284>>2];g[f+292>>2]=+g[f+292>>2]*(1.0/+(h|0));g[f+296>>2]=1.0/+(h|0)*+g[f+296>>2];g[f+300>>2]=1.0/+(h|0)*+g[f+300>>2]}d=d+1|0}while((d|0)!=(y|0));i=11}}else i=11;if((i|0)==11?(y|0)>0:0){k=c[a+1120>>2]|0;if(b){f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+312>>2]|0)>0?(w=+g[a+512>>2],r=+g[h+276>>2]*w,s=w*+g[h+280>>2],t=w*+g[h+284>>2],u=w*+g[h+292>>2],v=w*+g[h+296>>2],w=w*+g[h+300>>2],x=c[h+24>>2]|0,(x|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{q=c[i+(d<<2)>>2]|0;p=+g[j+(d<<2)>>2];o=+g[q+8>>2]-+g[h+228>>2];n=+g[q+12>>2]-+g[h+232>>2];m=+g[q+16>>2]-+g[h+236>>2];E=C+(((q-b|0)/104|0)<<4)|0;g[E>>2]=+g[E>>2]+p*(r+(v*m-w*n));E=C+(((q-b|0)/104|0)<<4)+4|0;g[E>>2]=+g[E>>2]+p*(s+(w*o-u*m));E=C+(((q-b|0)/104|0)<<4)+8|0;g[E>>2]=p*(t+(u*n-v*o))+ +g[E>>2];q=B+(((q-b|0)/104|0)<<2)|0;g[q>>2]=p+ +g[q>>2];d=d+1|0}while((d|0)!=(x|0))}f=f+1|0}while((f|0)!=(y|0))}else{f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+308>>2]|0)>0?(p=+g[a+512>>2],e=+g[h+244>>2]*p,l=p*+g[h+248>>2],m=p*+g[h+252>>2],n=p*+g[h+260>>2],o=p*+g[h+264>>2],p=p*+g[h+268>>2],q=c[h+24>>2]|0,(q|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{E=c[i+(d<<2)>>2]|0;w=+g[j+(d<<2)>>2];v=+g[E+8>>2]-+g[h+228>>2];u=+g[E+12>>2]-+g[h+232>>2];t=+g[E+16>>2]-+g[h+236>>2];x=C+(((E-b|0)/104|0)<<4)|0;g[x>>2]=+g[x>>2]+w*(e+(o*t-p*u));x=C+(((E-b|0)/104|0)<<4)+4|0;g[x>>2]=+g[x>>2]+w*(l+(p*v-n*t));x=C+(((E-b|0)/104|0)<<4)+8|0;g[x>>2]=w*(m+(n*u-o*v))+ +g[x>>2];E=B+(((E-b|0)/104|0)<<2)|0;g[E>>2]=w+ +g[E>>2];d=d+1|0}while((d|0)!=(q|0))}f=f+1|0}while((f|0)!=(y|0))}}if((D|0)>0){d=0;do{e=+g[B+(d<<2)>>2];if(e>0.0){v=1.0/e*+g[C+(d<<4)+4>>2];w=1.0/e*+g[C+(d<<4)+8>>2];E=c[a+780>>2]|0;y=E+(d*104|0)+8|0;g[y>>2]=1.0/e*+g[C+(d<<4)>>2]+ +g[y>>2];y=E+(d*104|0)+12|0;g[y>>2]=v+ +g[y>>2];E=E+(d*104|0)+16|0;g[E>>2]=w+ +g[E>>2]}d=d+1|0}while((d|0)!=(D|0))}if(!((B|0)==0|(A|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[A+-4>>2]|0)}if((C|0)==0|(z|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[z+-4>>2]|0);return}function fe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;p=l;l=l+144|0;if((c[a+20>>2]|0)<=0){o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}j=p+16+16|0;k=p+16+32|0;m=p+16+48|0;i=0;do{o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[p+16>>2]=c[n>>2];c[p+16+4>>2]=c[n+4>>2];c[p+16+8>>2]=c[n+8>>2];c[p+16+12>>2]=c[n+12>>2];n=o+(i*80|0)+16|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];n=o+(i*80|0)+32|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];n=o+(i*80|0)+48|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];o=c[o+(i*80|0)+64>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];q=+g[p+4>>2]*+g[b+4>>2]/+g[a+84>>2];r=+g[p+8>>2]*+g[b+8>>2]/+g[a+88>>2];g[p>>2]=+g[p>>2]*+g[b>>2]/+g[a+80>>2];g[p+4>>2]=q;g[p+8>>2]=r;g[p+12>>2]=0.0;o=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Ob[c[(c[o>>2]|0)+24>>2]&127](o,p);r=+g[p+16+52>>2]*+g[b+4>>2]/+g[a+84>>2];q=+g[p+16+56>>2]*+g[b+8>>2]/+g[a+88>>2];g[p+16+48>>2]=+g[m>>2]*+g[b>>2]/+g[a+80>>2];g[p+16+52>>2]=r;g[p+16+56>>2]=q;g[p+16+60>>2]=0.0;o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[n>>2]=c[p+16>>2];c[n+4>>2]=c[p+16+4>>2];c[n+8>>2]=c[p+16+8>>2];c[n+12>>2]=c[p+16+12>>2];n=o+(i*80|0)+16|0;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];n=o+(i*80|0)+32|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];o=o+(i*80|0)+48|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];if(c[a+68>>2]|0){n=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Vb[c[(c[n>>2]|0)+8>>2]&127](n,p+16|0,p+128|0,p+112|0);c[p+80>>2]=c[p+128>>2];c[p+80+4>>2]=c[p+128+4>>2];c[p+80+8>>2]=c[p+128+8>>2];c[p+80+12>>2]=c[p+128+12>>2];c[p+80+16>>2]=c[p+112>>2];c[p+80+16+4>>2]=c[p+112+4>>2];c[p+80+16+8>>2]=c[p+112+8>>2];c[p+80+16+12>>2]=c[p+112+12>>2];n=c[a+68>>2]|0;o=c[(c[a+28>>2]|0)+(i*80|0)+76>>2]|0;d=Ag(n,o)|0;a:do if(d){h=c[n+8>>2]|0;if((h|0)<=-1){d=c[n>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);c[o>>2]=c[p+80>>2];c[o+4>>2]=c[p+80+4>>2];c[o+8>>2]=c[p+80+8>>2];c[o+12>>2]=c[p+80+12>>2];c[o+16>>2]=c[p+80+16>>2];c[o+20>>2]=c[p+80+20>>2];c[o+24>>2]=c[p+80+24>>2];c[o+28>>2]=c[p+80+28>>2];Pe(n,d,o)}i=i+1|0}while((i|0)<(c[a+20>>2]|0));o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}function ge(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+96|0;q=c[b+12>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,(c[b+8>>2]|0)+4|0,s+80|0,s+64|0);q=c[d+68>>2]|0;Zb[c[(c[q>>2]|0)+16>>2]&31](q,c[(c[b+8>>2]|0)+188>>2]|0,s+80|0,s+64|0,c[d+24>>2]|0);q=c[d+24>>2]|0;Vb[c[(c[q>>2]|0)+32>>2]&127](q,c[(c[b+8>>2]|0)+344>>2]|0,d+28|0,q);q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];q=c[q+344>>2]|0;if((xb[c[(c[q>>2]|0)+36>>2]&127](q)|0)>0){d=0;q=0;do{e=c[b+204>>2]|0;if((e|0)<0){if((c[b+208>>2]|0)<0){f=c[b+212>>2]|0;if(f|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+208>>2]=0}do{c[(c[b+212>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[b+204>>2]=0;e=c[(c[b+8>>2]|0)+344>>2]|0;e=c[(xb[c[(c[e>>2]|0)+28>>2]&127](e)|0)+12>>2]|0;f=c[c[e+(q<<4)>>2]>>2]|0;h=c[c[e+(q<<4)+4>>2]>>2]|0;if(!((f|0)!=0?(c[f+204>>2]&4|0)!=0:0))r=14;do if((r|0)==14){r=0;if(h|0?c[h+204>>2]&4|0:0)break;if(Bb[c[(c[b>>2]|0)+56>>2]&63](b,f,h)|0){e=c[e+(q<<4)+8>>2]|0;if(e|0)Ob[c[(c[e>>2]|0)+16>>2]&127](e,b+200|0);p=c[b+204>>2]|0;if((p|0)>0){n=c[b+212>>2]|0;o=c[b+8>>2]|0;m=0;do{f=c[n+(m<<2)>>2]|0;j=(c[f+772>>2]|0)==(o|0)?-1.0:1.0;h=c[f+780>>2]|0;if((h|0)>0){k=-+g[b+16>>2];e=0;do{i=+g[f+4+(e*192|0)+80>>2];if(i>2]*.20000000298023224;t=i*j*+g[f+4+(e*192|0)+72>>2]*.20000000298023224;g[b+132>>2]=i*j*+g[f+4+(e*192|0)+64>>2]*.20000000298023224+ +g[b+132>>2];g[b+136>>2]=u+ +g[b+136>>2];g[b+140>>2]=t+ +g[b+140>>2];d=1}e=e+1|0}while((e|0)!=(h|0))}m=m+1|0}while((m|0)!=(p|0))}}}while(0);q=q+1|0;p=c[(c[b+8>>2]|0)+344>>2]|0}while((q|0)<(xb[c[(c[p>>2]|0)+36>>2]&127](p)|0))}else d=0;r=c[b+8>>2]|0;c[s>>2]=c[r+4>>2];c[s+4>>2]=c[r+4+4>>2];c[s+8>>2]=c[r+4+8>>2];c[s+12>>2]=c[r+4+12>>2];c[s+16>>2]=c[r+20>>2];c[s+16+4>>2]=c[r+20+4>>2];c[s+16+8>>2]=c[r+20+8>>2];c[s+16+12>>2]=c[r+20+12>>2];c[s+32>>2]=c[r+36>>2];c[s+32+4>>2]=c[r+36+4>>2];c[s+32+8>>2]=c[r+36+8>>2];c[s+32+12>>2]=c[r+36+12>>2];c[s+48>>2]=c[b+132>>2];c[s+48+4>>2]=c[b+132+4>>2];c[s+48+8>>2]=c[b+132+8>>2];c[s+48+12>>2]=c[b+132+12>>2];c[r+304>>2]=(c[r+304>>2]|0)+1;c[r+4>>2]=c[s>>2];c[r+4+4>>2]=c[s+4>>2];c[r+4+8>>2]=c[s+8>>2];c[r+4+12>>2]=c[s+12>>2];c[r+20>>2]=c[s+16>>2];c[r+20+4>>2]=c[s+16+4>>2];c[r+20+8>>2]=c[s+16+8>>2];c[r+20+12>>2]=c[s+16+12>>2];c[r+36>>2]=c[s+32>>2];c[r+36+4>>2]=c[s+32+4>>2];c[r+36+8>>2]=c[s+32+8>>2];c[r+36+12>>2]=c[s+32+12>>2];c[r+52>>2]=c[s+48>>2];c[r+52+4>>2]=c[s+48+4>>2];c[r+52+8>>2]=c[s+48+8>>2];c[r+52+12>>2]=c[s+48+12>>2];l=s;return d|0}function he(d,f,h,i,j,k){d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0,n=0.0;c[d>>2]=8928;b[d+4>>1]=-2;b[d+6>>1]=-1;c[d+92>>2]=j;c[d+96>>2]=0;a[d+100>>0]=0;c[d+104>>2]=0;c[d+108>>2]=0;if(!j){c[6995]=(c[6995]|0)+1;j=sc(91)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Li(j);c[d+92>>2]=j;a[d+100>>0]=1}if(!k){c[6995]=(c[6995]|0)+1;j=sc(43)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=j+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[j>>2]=8992;a[j+20>>0]=1;c[j+16>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[d+112>>2]=j;c[6995]=(c[6995]|0)+1;j=sc(195)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Ne(j,c[d+112>>2]|0);c[d+108>>2]=j;a[j+153>>0]=1}c[d+8>>2]=c[f>>2];c[d+8+4>>2]=c[f+4>>2];c[d+8+8>>2]=c[f+8>>2];c[d+8+12>>2]=c[f+12>>2];c[d+24>>2]=c[h>>2];c[d+24+4>>2]=c[h+4>>2];c[d+24+8>>2]=c[h+8>>2];c[d+24+12>>2]=c[h+12>>2];n=+(e[d+6>>1]|0);m=n/(+g[d+28>>2]-+g[d+12>>2]);l=n/(+g[d+32>>2]-+g[d+16>>2]);g[d+40>>2]=n/(+g[d+24>>2]-+g[d+8>>2]);g[d+44>>2]=m;g[d+48>>2]=l;g[d+52>>2]=0.0;h=(i&65535)+1&65535;c[6995]=(c[6995]|0)+1;j=sc(h<<6|19)|0;if(!j)f=0;else{c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16}if(h|0){j=f+(h<<6)|0;k=f;do{c[k>>2]=0;k=k+64|0}while((k|0)!=(j|0))}c[d+60>>2]=f;b[d+58>>1]=(i&65535)+1;b[d+56>>1]=0;b[d+64>>1]=1;if(h>>>0>1){j=1;k=1;do{b[f+(k<<6)+48>>1]=k+1;j=j+1<<16>>16;k=j&65535}while(k>>>0>>0)}b[f+(h+-1<<6)+48>>1]=0;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+80>>2]=j;c[d+68>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+84>>2]=j;c[d+72>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j){f=0;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}function ie(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+8>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=3876;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function je(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+76>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=5848;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function ke(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0;p=+g[e>>2];i=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?i:1566444395;m=+g[e+4>>2];l=(g[j>>2]=m,c[j>>2]|0);v=m<999999984306749440.0?l:1566444395;y=+g[e+8>>2];o=(g[j>>2]=y,c[j>>2]|0);w=y<999999984306749440.0?o:1566444395;i=p>-999999984306749440.0?i:-581039253;l=m>-999999984306749440.0?l:-581039253;o=y>-999999984306749440.0?o:-581039253;y=+g[e+16>>2];t=y<(c[j>>2]=u,+g[j>>2]);k=(g[j>>2]=y,c[j>>2]|0);u=t?k:u;m=+g[e+20>>2];t=m<(c[j>>2]=v,+g[j>>2]);n=(g[j>>2]=m,c[j>>2]|0);v=t?n:v;p=+g[e+24>>2];t=p<(c[j>>2]=w,+g[j>>2]);q=(g[j>>2]=p,c[j>>2]|0);w=t?q:w;k=(c[j>>2]=i,+g[j>>2])>2]=l,+g[j>>2])>2]=o,+g[j>>2])>2];q=y<(c[j>>2]=u,+g[j>>2]);r=(g[j>>2]=y,c[j>>2]|0);m=+g[e+36>>2];s=m<(c[j>>2]=v,+g[j>>2]);t=(g[j>>2]=m,c[j>>2]|0);p=+g[e+40>>2];l=p<(c[j>>2]=w,+g[j>>2]);n=(g[j>>2]=p,c[j>>2]|0);k=(c[j>>2]=k,+g[j>>2])>2]=i,+g[j>>2])>2]=o,+g[j>>2])>2]=k,+g[j>>2]);H=(c[j>>2]=q?r:u,+g[j>>2]);C=(c[j>>2]=i,+g[j>>2]);D=(c[j>>2]=s?t:v,+g[j>>2]);m=(c[j>>2]=o,+g[j>>2]);z=(c[j>>2]=l?n:w,+g[j>>2]);o=c[d+8>>2]|0;F=+g[o+4>>2];B=+g[o+8>>2];p=+g[o+12>>2];E=+g[o+36>>2];A=+g[o+40>>2];y=+g[o+44>>2];o=~~(((G-H<2.0000000949949026e-03?H+-1.0000000474974513e-03:H)-F)*E)&65535&-2;q=~~(((C-D<2.0000000949949026e-03?D+-1.0000000474974513e-03:D)-B)*A)&65535&-2;r=~~(((m-z<2.0000000949949026e-03?z+-1.0000000474974513e-03:z)-p)*y)&65535&-2;s=~~(((G-H<2.0000000949949026e-03?G+1.0000000474974513e-03:G)-F)*E+1.0)&65535|1;t=~~(((C-D<2.0000000949949026e-03?C+1.0000000474974513e-03:C)-B)*A+1.0)&65535|1;e=~~(((m-z<2.0000000949949026e-03?m+1.0000000474974513e-03:m)-p)*y+1.0)&65535|1;n=c[d+4>>2]|0;i=c[n+4>>2]|0;if((i|0)==(c[n+8>>2]|0)?(x=i|0?i<<1:1,(i|0)<(x|0)):0){if(!x)l=0;else{c[6995]=(c[6995]|0)+1;i=sc((x<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}l=i;i=c[n+4>>2]|0}if((i|0)>0){k=0;do{d=l+(k<<4)|0;w=(c[n+12>>2]|0)+(k<<4)|0;c[d>>2]=c[w>>2];c[d+4>>2]=c[w+4>>2];c[d+8>>2]=c[w+8>>2];c[d+12>>2]=c[w+12>>2];k=k+1|0}while((k|0)!=(i|0))}i=c[n+12>>2]|0;if(i|0){if(a[n+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+12>>2]=0}a[n+16>>0]=1;c[n+12>>2]=l;c[n+8>>2]=x;i=c[n+4>>2]|0}x=c[n+12>>2]|0;b[x+(i<<4)>>1]=o;b[x+(i<<4)+2>>1]=q;b[x+(i<<4)+4>>1]=r;b[x+(i<<4)+6>>1]=s;b[x+(i<<4)+8>>1]=t;b[x+(i<<4)+10>>1]=e;c[x+(i<<4)+12>>2]=f<<21|h;c[n+4>>2]=(c[n+4>>2]|0)+1;return}function le(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+336|0;h=c[d+36>>2]|0;c[n+272+4>>2]=35;c[n+272+8>>2]=0;c[n+272+12>>2]=-1;c[n+272+16>>2]=1065353216;c[n+272+20>>2]=1065353216;c[n+272+24>>2]=1065353216;g[n+272+28>>2]=0.0;c[n+272>>2]=3644;c[n+272+56>>2]=h;g[n+272+48>>2]=0.0;k=c[b+28>>2]|0;d=c[k+4>>2]|0;if(c[(c[k+8>>2]|0)+204>>2]&3|0?a[h+376>>0]|0:0){l=n;return}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}e=c[(c[b+28>>2]|0)+12>>2]|0;c[n>>2]=1065353216;c[n+4>>2]=0;c[n+8>>2]=0;g[n+12>>2]=0.0;if(!(!(Gd(n+272|0,22728,d,e,n,n+216|0)|0)?!(Hc(n+272|0,22728,d,e,n,n+216|0,0)|0):0))i=12;if((i|0)==12?(c[n+4>>2]=0,c[n+4+4>>2]=0,c[n+4+8>>2]=0,c[n+4+12>>2]=0,c[n+4+16>>2]=0,c[n+4+20>>2]=0,a[n+152>>0]=0,c[n>>2]=3432,k=c[(c[b+28>>2]|0)+8>>2]|0,zd(b,n+216|0,h,0,0,0,(c[k+252>>2]&2|0)==0?0:k,k,n)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)k=0;else{c[(d+4+15&-16)+-4>>2]=d;k=d+4+15&-16}e=k+4|0;d=k+152|0;Yk(e|0,0,212)|0;c[k>>2]=3432;h=n+4|0;i=e+100|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));e=k+104|0;c[e>>2]=c[n+104>>2];c[e+4>>2]=c[n+104+4>>2];c[e+8>>2]=c[n+104+8>>2];c[e+12>>2]=c[n+104+12>>2];e=k+120|0;c[e>>2]=c[n+120>>2];c[e+4>>2]=c[n+120+4>>2];c[e+8>>2]=c[n+120+8>>2];c[e+12>>2]=c[n+120+12>>2];e=k+136|0;c[e>>2]=c[n+136>>2];c[e+4>>2]=c[n+136+4>>2];c[e+8>>2]=c[n+136+8>>2];c[e+12>>2]=c[n+136+12>>2];a[d>>0]=a[n+152>>0]|0;e=k+156|0;h=n+156|0;i=e+60|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));i=c[b+24>>2]|0;j=k;d=c[i+912>>2]|0;if((d|0)==(c[i+916>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)h=0;else{c[6995]=(c[6995]|0)+1;d=sc((m<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;d=c[i+912>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[i+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[i+920>>2]|0;if(e){if(a[i+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[i+912>>2]|0}c[i+920>>2]=0}a[i+924>>0]=1;c[i+920>>2]=h;c[i+916>>2]=m}c[(c[i+920>>2]|0)+(d<<2)>>2]=j;c[i+912>>2]=d+1;d=c[b+24>>2]|0;e=k+64|0;f=+g[e>>2];if(!(c[(c[(c[b+28>>2]|0)+8>>2]|0)+204>>2]&3)){g[e>>2]=f*+g[d+400>>2];d=d+412|0}else{g[e>>2]=f*+g[d+404>>2];d=d+416|0}b=k+68|0;g[b>>2]=+g[d>>2]*+g[b>>2]}l=n;return}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=c[b>>2]|0;m=c[b+4>>2]|0;i=c[b+8>>2]|0;n=c[a+4>>2]|0;p=Lh(a,d,m,i)|0;c[p+12>>2]=c[b+12>>2];c[p+16>>2]=n+1;c[p+20>>2]=n+2;h=c[(c[a+12>>2]|0)+(c[b+12>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(m|0)&(f|0)==(i|0))){if((e|0)==(i|0)?(f|0)==(m|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(m|0)&(g|0)==(i|0)))if(!((f|0)==(i|0)&(g|0)==(m|0)))if((g|0)!=(m|0)|(e|0)==(i|0)^1){if((g|0)==(i|0)?(e|0)==(m|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=2}else e=h+12|0;else{e=0;o=2}}else{e=2;o=2}while(0);if((o|0)==2)e=h+12+(e<<2)|0;c[e>>2]=n;k=Lh(a,d,i,l)|0;c[k+12>>2]=c[b+12+4>>2];c[k+16>>2]=n+2;c[k+20>>2]=n;h=c[(c[a+12>>2]|0)+(c[b+12+4>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(i|0)&(f|0)==(l|0))){if((e|0)==(l|0)?(f|0)==(i|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(i|0)&(g|0)==(l|0)))if(!((f|0)==(l|0)&(g|0)==(i|0)))if((g|0)!=(i|0)|(e|0)==(l|0)^1){if((g|0)==(l|0)?(e|0)==(i|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=12}else e=h+12|0;else{e=0;o=12}}else{e=2;o=12}while(0);if((o|0)==12)e=h+12+(e<<2)|0;c[e>>2]=n+1;j=Lh(a,d,l,m)|0;c[j+12>>2]=c[b+12+8>>2];c[j+16>>2]=n;c[j+20>>2]=n+1;e=c[a+12>>2]|0;i=c[e+(c[b+12+8>>2]<<2)>>2]|0;f=c[i>>2]|0;g=c[i+4>>2]|0;do if(!((f|0)==(l|0)&(g|0)==(m|0))){if((f|0)==(m|0)?(g|0)==(l|0):0){f=i+12+8|0;break}h=c[i+8>>2]|0;if(!((g|0)==(l|0)&(h|0)==(m|0)))if(!((g|0)==(m|0)&(h|0)==(l|0)))if((h|0)!=(l|0)|(f|0)==(m|0)^1){if((h|0)==(m|0)?(f|0)==(l|0):0){f=i+12+4|0;break}f=9772}else{f=1;o=22}else f=i+12|0;else{f=0;o=22}}else{f=2;o=22}while(0);if((o|0)==22)f=i+12+(f<<2)|0;c[f>>2]=n+2;f=c[e+(c[p+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,p,f);c[(c[a+12>>2]|0)+(c[p+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[k+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,k,f);c[(c[a+12>>2]|0)+(c[k+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[j+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,j,f);c[(c[a+12>>2]|0)+(c[j+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}c[e+(c[b+24>>2]<<2)>>2]=0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function ne(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!((d|0)!=0&(e|0)!=0))return;if((c[b+24>>2]|0)<128?(c[b+28>>2]|0)<128:0){c[6995]=(c[6995]|0)+1;h=sc(1043)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+24>>2]|0;if((i|0)>0){h=0;do{k=(c[b+32>>2]|0)+(h<<3)|0;l=c[k+4>>2]|0;m=j+(h<<3)|0;c[m>>2]=c[k>>2];c[m+4>>2]=l;h=h+1|0}while((h|0)!=(i|0))}h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=j;c[b+28>>2]=128}c[b+24>>2]=128;h=c[b+32>>2]|0;c[h>>2]=d;c[h+4>>2]=e;h=1;i=124;do{m=h+-1|0;j=c[b+32>>2]|0;k=c[j+(m<<3)>>2]|0;l=c[j+(m<<3)+4>>2]|0;if((m|0)>(i|0)){e=c[b+24>>2]|0;if((e|0)<(e<<1|0)?(c[b+28>>2]|0)<(e<<1|0):0){if(e){c[6995]=(c[6995]|0)+1;i=sc((e<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+24>>2]|0;if((d|0)>0){j=0;do{p=(c[b+32>>2]|0)+(j<<3)|0;o=c[p+4>>2]|0;n=i+(j<<3)|0;c[n>>2]=c[p>>2];c[n+4>>2]=o;j=j+1|0}while((j|0)!=(d|0))}}else i=0;j=c[b+32>>2]|0;if(j|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=i;c[b+28>>2]=e<<1;j=i}c[b+24>>2]=e<<1;i=(e<<1)+-4|0}do if((k|0)==(l|0))if(!(c[k+40>>2]|0))h=m;else{o=c[k+36>>2]|0;c[j+(m<<3)>>2]=o;c[j+(m<<3)+4>>2]=o;o=c[k+40>>2]|0;p=h+1|0;n=c[b+32>>2]|0;c[n+(h<<3)>>2]=o;c[n+(h<<3)+4>>2]=o;n=c[k+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+36>>2];c[o+(p<<3)+4>>2]=n;h=h+2|0}else if(((((+g[k>>2]<=+g[l+16>>2]?+g[k+16>>2]>=+g[l>>2]:0)?+g[k+4>>2]<=+g[l+20>>2]:0)?+g[k+20>>2]>=+g[l+4>>2]:0)?+g[k+8>>2]<=+g[l+24>>2]:0)?+g[k+24>>2]>=+g[l+8>>2]:0){d=(c[l+40>>2]|0)!=0;if(!(c[k+40>>2]|0))if(d){o=c[l+36>>2]|0;c[j+(m<<3)>>2]=k;c[j+(m<<3)+4>>2]=o;o=c[l+40>>2]|0;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=k;c[p+(h<<3)+4>>2]=o;h=h+1|0;break}else{Sb[c[(c[f>>2]|0)+8>>2]&127](f,k,l);h=m;break}else{e=c[k+36>>2]|0;if(d){p=c[l+36>>2]|0;c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=p;p=c[l+36>>2]|0;n=h+1|0;m=c[b+32>>2]|0;c[m+(h<<3)>>2]=c[k+40>>2];c[m+(h<<3)+4>>2]=p;m=c[l+40>>2]|0;p=h+2|0;o=c[b+32>>2]|0;c[o+(n<<3)>>2]=c[k+36>>2];c[o+(n<<3)+4>>2]=m;n=c[l+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+40>>2];c[o+(p<<3)+4>>2]=n;h=h+3|0;break}else{c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=l;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=c[k+40>>2];c[p+(h<<3)+4>>2]=l;h=h+1|0;break}}}else h=m;while(0)}while((h|0)!=0);return}function oe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+16|0;f=lt()|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;ef(23152,0.0,0,0,h)}c[5839]=c[5839]|1;g[5889]=0.0;x=+g[5899]*0.0;D=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=x;g[5896]=D;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;D=+g[5891]*0.0;x=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=D;g[5945]=x;g[5946]=0.0;c[f+4>>2]=7;c[f+8>>2]=-1;c[f+12>>2]=-1;g[f+16>>2]=3402823466385288598117041.0e14;a[f+20>>0]=1;a[f+21>>0]=0;c[f+24>>2]=-1;c[f+28>>2]=23152;c[f+32>>2]=b;g[f+36>>2]=0.0;g[f+40>>2]=.05000000074505806;c[f+44>>2]=0;c[f>>2]=4884;a[f+48>>0]=0;c[f+116>>2]=c[d>>2];c[f+116+4>>2]=c[d+4>>2];c[f+116+8>>2]=c[d+8>>2];c[f+116+12>>2]=c[d+12>>2];c[f+132>>2]=c[d+16>>2];c[f+132+4>>2]=c[d+16+4>>2];c[f+132+8>>2]=c[d+16+8>>2];c[f+132+12>>2]=c[d+16+12>>2];c[f+148>>2]=c[d+32>>2];c[f+148+4>>2]=c[d+32+4>>2];c[f+148+8>>2]=c[d+32+8>>2];c[f+148+12>>2]=c[d+32+12>>2];c[f+164>>2]=c[d+48>>2];c[f+164+4>>2]=c[d+48+4>>2];c[f+164+8>>2]=c[d+48+8>>2];c[f+164+12>>2]=c[d+48+12>>2];a[f+180>>0]=e&1;x=+g[f+116>>2];D=+g[b+4>>2];w=+g[f+132>>2];C=+g[b+8>>2];v=+g[f+148>>2];B=+g[b+12>>2];u=+g[f+120>>2];t=+g[f+136>>2];s=+g[f+152>>2];r=+g[f+124>>2];p=+g[f+140>>2];n=+g[f+156>>2];A=+g[b+20>>2];z=+g[b+24>>2];y=+g[b+28>>2];q=+g[b+36>>2];o=+g[b+40>>2];m=+g[b+44>>2];F=+g[f+164>>2];E=+g[f+168>>2];i=+g[f+172>>2];k=+g[b+52>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[b+56>>2];i=q*F+o*E+m*i+ +g[b+60>>2];g[f+52>>2]=x*D+w*C+v*B;g[f+56>>2]=D*u+C*t+B*s;g[f+60>>2]=D*r+C*p+B*n;g[f+64>>2]=0.0;g[f+68>>2]=x*A+w*z+v*y;g[f+72>>2]=u*A+t*z+s*y;g[f+76>>2]=r*A+p*z+n*y;g[f+80>>2]=0.0;g[f+84>>2]=x*q+w*o+v*m;g[f+88>>2]=u*q+t*o+s*m;g[f+92>>2]=r*q+p*o+n*m;g[f+96>>2]=0.0;g[f+100>>2]=k;g[f+104>>2]=j;g[f+108>>2]=i;g[f+112>>2]=0.0;g[f+184>>2]=1.0;g[f+188>>2]=-1.0;g[f+192>>2]=0.0;g[f+196>>2]=0.0;g[f+200>>2]=1.0;g[f+204>>2]=.699999988079071;g[f+208>>2]=0.0;g[f+212>>2]=0.0;g[f+216>>2]=1.0;g[f+220>>2]=.699999988079071;g[f+224>>2]=0.0;g[f+228>>2]=0.0;g[f+264>>2]=1.0;g[f+268>>2]=.699999988079071;g[f+272>>2]=1.0;g[f+276>>2]=0.0;g[f+280>>2]=1.0;g[f+284>>2]=.699999988079071;g[f+288>>2]=1.0;g[f+292>>2]=0.0;g[f+232>>2]=1.0;g[f+236>>2]=.699999988079071;g[f+240>>2]=1.0;g[f+244>>2]=0.0;g[f+248>>2]=1.0;g[f+252>>2]=.699999988079071;g[f+256>>2]=1.0;g[f+260>>2]=0.0;a[f+1096>>0]=0;g[f+1116>>2]=0.0;g[f+1120>>2]=0.0;g[f+1124>>2]=0.0;c[f+300>>2]=0;c[f+1100>>2]=0;c[f+1100+4>>2]=0;c[f+1100+8>>2]=0;a[f+1100+12>>0]=0;a[f+49>>0]=1;Zc(f,(c[f+28>>2]|0)+4|0,(c[f+32>>2]|0)+4|0);l=h;return f|0}function pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=0;do{k=l;l=l+1|0;m=(l|0)==3;j=c[b+((m?0:l)<<2)>>2]|0;k=c[b+(((k+2|0)%3|0)<<2)>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=3}else e=d+12|0;else{e=0;n=3}}else e=d+12+8|0;else{e=2;n=3}if((n|0)==3){n=0;e=d+12+(e<<2)|0}i=c[e>>2]|0;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=10}else e=b+12|0;else{e=0;n=10}}else e=b+12+8|0;else{e=2;n=10}if((n|0)==10){n=0;e=b+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(k|0)&(f|0)==(j|0))){if((e|0)==(j|0)?(f|0)==(k|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1){if((g|0)==(j|0)?(e|0)==(k|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=17}else e=h+12|0;else{e=0;n=17}}else{e=2;n=17}while(0);if((n|0)==17){n=0;e=h+12+(e<<2)|0}c[e>>2]=i;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=27}else e=b+12|0;else{e=0;n=27}}else e=b+12+8|0;else{e=2;n=27}if((n|0)==27){n=0;e=b+12+(e<<2)|0}i=c[e>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=34}else e=d+12|0;else{e=0;n=34}}else e=d+12+8|0;else{e=2;n=34}if((n|0)==34){n=0;e=d+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(j|0)&(f|0)==(k|0))){if((e|0)==(k|0)?(f|0)==(j|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1){if((g|0)==(k|0)?(e|0)==(j|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=41}else e=h+12|0;else{e=0;n=41}}else{e=2;n=41}while(0);if((n|0)==41){n=0;e=h+12+(e<<2)|0}c[e>>2]=i}while(!m);return}function qe(b){b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0;u=l;l=l+176|0;if(!(a[b+527>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+520>>2]=0.0;g[b+516>>2]=0.0;c[b+576>>2]=0;c[b+576+4>>2]=0;c[b+576+8>>2]=0;c[b+576+12>>2]=0;if(!(a[b+524>>0]|0)){d=c[b+28>>2]|0;j=+g[b+348>>2];k=+g[b+352>>2];q=+g[b+356>>2];s=j*+g[d+20>>2]+k*+g[d+24>>2]+q*+g[d+28>>2]+ +g[d+56>>2];e=c[b+32>>2]|0;m=+g[b+412>>2];n=+g[b+416>>2];r=+g[b+420>>2];t=m*+g[e+20>>2]+n*+g[e+24>>2]+r*+g[e+28>>2]+ +g[e+56>>2];o=m*+g[e+36>>2]+n*+g[e+40>>2]+r*+g[e+44>>2]+ +g[e+60>>2];p=j*+g[d+4>>2]+k*+g[d+8>>2]+q*+g[d+12>>2]+ +g[d+52>>2];q=j*+g[d+36>>2]+k*+g[d+40>>2]+q*+g[d+44>>2]+ +g[d+60>>2];r=m*+g[e+4>>2]+n*+g[e+8>>2]+r*+g[e+12>>2]+ +g[e+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){h=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*h;g[u+128+4>>2]=(t-s)*h;g[u+128+8>>2]=(o-q)*h;c[u+128+12>>2]=0;m=(o-q)*h;f=(t-s)*h;h=(r-p)*h}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;f=0.0;h=1.0}if(+C(+m)>.7071067690849304){w=m*m+f*f;v=1.0/+D(+w);j=-(v*m);m=v*f;n=-(m*h);i=h*j;k=0.0;f=w*v;h=m}else{j=h*h+f*f;i=1.0/+D(+j);k=-(f*i);f=i*h;n=m*k;i=j*i;j=f;f=-(f*m);h=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=h;g[u+128+32>>2]=f;g[u+128+36>>2]=n;g[u+128+40>>2]=i;d=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[e+4>>2];c[u+32+4>>2]=c[e+20>>2];c[u+32+8>>2]=c[e+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[e+8>>2];c[u+32+20>>2]=c[e+24>>2];c[u+32+24>>2]=c[e+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[e+12>>2];c[u+32+36>>2]=c[e+28>>2];c[u+32+40>>2]=c[e+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[e+56>>2];w=o-+g[e+60>>2];g[u>>2]=r-+g[e+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;e=c[b+32>>2]|0;Rg(b+48+(d*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(d<<4)|0,x+456|0,+g[x+404>>2],e+456|0,+g[e+404>>2]);d=d+1|0;if((d|0)==3)break;e=c[b+32>>2]|0}d=b+32|0}else d=b+32|0;e=c[b+28>>2]|0;x=c[d>>2]|0;xc(b,e+4|0,x+4|0,e+324|0,x+324|0);l=u;return}function re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+80|0;c[a+72>>2]=(c[a+72>>2]|0)+1;f=c[a+68>>2]|0;if(f|0){d=c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0;Ag(f,d)|0;e=c[f+4>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[f+4>>2]=d;c[f+12>>2]=(c[f+12>>2]|0)+-1}f=(c[a+20>>2]|0)+-1|0;e=c[a+28>>2]|0;c[g>>2]=c[e+(b*80|0)>>2];c[g+4>>2]=c[e+(b*80|0)+4>>2];c[g+8>>2]=c[e+(b*80|0)+8>>2];c[g+12>>2]=c[e+(b*80|0)+12>>2];c[g+16>>2]=c[e+(b*80|0)+16>>2];c[g+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[g+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[g+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[g+32>>2]=c[e+(b*80|0)+32>>2];c[g+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[g+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[g+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[g+48>>2]=c[e+(b*80|0)+48>>2];c[g+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[g+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[g+48+12>>2]=c[e+(b*80|0)+48+12>>2];c[g+64>>2]=c[e+(b*80|0)+64>>2];c[g+64+4>>2]=c[e+(b*80|0)+64+4>>2];c[g+64+8>>2]=c[e+(b*80|0)+64+8>>2];c[g+64+12>>2]=c[e+(b*80|0)+64+12>>2];c[e+(b*80|0)>>2]=c[e+(f*80|0)>>2];c[e+(b*80|0)+4>>2]=c[e+(f*80|0)+4>>2];c[e+(b*80|0)+8>>2]=c[e+(f*80|0)+8>>2];c[e+(b*80|0)+12>>2]=c[e+(f*80|0)+12>>2];c[e+(b*80|0)+16>>2]=c[e+(f*80|0)+16>>2];c[e+(b*80|0)+16+4>>2]=c[e+(f*80|0)+16+4>>2];c[e+(b*80|0)+16+8>>2]=c[e+(f*80|0)+16+8>>2];c[e+(b*80|0)+16+12>>2]=c[e+(f*80|0)+16+12>>2];c[e+(b*80|0)+32>>2]=c[e+(f*80|0)+32>>2];c[e+(b*80|0)+32+4>>2]=c[e+(f*80|0)+32+4>>2];c[e+(b*80|0)+32+8>>2]=c[e+(f*80|0)+32+8>>2];c[e+(b*80|0)+32+12>>2]=c[e+(f*80|0)+32+12>>2];c[e+(b*80|0)+48>>2]=c[e+(f*80|0)+48>>2];c[e+(b*80|0)+48+4>>2]=c[e+(f*80|0)+48+4>>2];c[e+(b*80|0)+48+8>>2]=c[e+(f*80|0)+48+8>>2];c[e+(b*80|0)+48+12>>2]=c[e+(f*80|0)+48+12>>2];c[e+(b*80|0)+64>>2]=c[e+(f*80|0)+64>>2];c[e+(b*80|0)+64+4>>2]=c[e+(f*80|0)+64+4>>2];c[e+(b*80|0)+64+8>>2]=c[e+(f*80|0)+64+8>>2];c[e+(b*80|0)+64+12>>2]=c[e+(f*80|0)+64+12>>2];e=c[a+28>>2]|0;c[e+(f*80|0)>>2]=c[g>>2];c[e+(f*80|0)+4>>2]=c[g+4>>2];c[e+(f*80|0)+8>>2]=c[g+8>>2];c[e+(f*80|0)+12>>2]=c[g+12>>2];c[e+(f*80|0)+16>>2]=c[g+16>>2];c[e+(f*80|0)+16+4>>2]=c[g+16+4>>2];c[e+(f*80|0)+16+8>>2]=c[g+16+8>>2];c[e+(f*80|0)+16+12>>2]=c[g+16+12>>2];c[e+(f*80|0)+32>>2]=c[g+32>>2];c[e+(f*80|0)+32+4>>2]=c[g+32+4>>2];c[e+(f*80|0)+32+8>>2]=c[g+32+8>>2];c[e+(f*80|0)+32+12>>2]=c[g+32+12>>2];c[e+(f*80|0)+48>>2]=c[g+48>>2];c[e+(f*80|0)+48+4>>2]=c[g+48+4>>2];c[e+(f*80|0)+48+8>>2]=c[g+48+8>>2];c[e+(f*80|0)+48+12>>2]=c[g+48+12>>2];c[e+(f*80|0)+64>>2]=c[g+64>>2];c[e+(f*80|0)+64+4>>2]=c[g+64+4>>2];c[e+(f*80|0)+64+8>>2]=c[g+64+8>>2];c[e+(f*80|0)+64+12>>2]=c[g+64+12>>2];if(!(c[a+68>>2]|0)){f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}c[(c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0)+36>>2]=b;f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}function se(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[b+92>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0))return;o=c[b+92>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;f=c[o+4>>2]|0;if((f|0)>1){te(o,0,f+-1|0);j=c[o+4>>2]|0}else j=f;m=c[b+104>>2]|0;f=j-m|0;if((m|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){g=0;i=j}else{c[6995]=(c[6995]|0)+1;g=sc((f<<4|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{m=c[o+12>>2]|0;c[g+(h<<4)>>2]=c[m+(h<<4)>>2];c[g+(h<<4)+4>>2]=c[m+(h<<4)+4>>2];c[g+(h<<4)+8>>2]=c[m+(h<<4)+8>>2];c[g+(h<<4)+12>>2]=c[m+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=g;c[o+8>>2]=f;h=o+12|0}else h=o+12|0;g=j;do{m=(c[h>>2]|0)+(g<<4)|0;g=g+1|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0}while((g|0)!=(f|0))}c[o+4>>2]=f;c[b+104>>2]=0;if((f|0)>0){l=0;m=0;g=0;h=0;do{k=c[o+12>>2]|0;j=k+(l<<4)|0;p=m;m=c[j>>2]|0;k=k+(l<<4)+4|0;i=c[k>>2]|0;if(!((m|0)==(p|0)&(i|0)==(g|0))){p=m+48|0;if((((((e[m+54>>1]|0)>=(e[i+48>>1]|0)?(e[i+54>>1]|0)>=(e[p>>1]|0):0)?(e[m+56>>1]|0)>=(e[i+48+2>>1]|0):0)?(e[i+56>>1]|0)>=(e[p+2>>1]|0):0)?(e[m+58>>1]|0)>=(e[i+52>>1]|0):0)?(e[i+58>>1]|0)>=(e[m+52>>1]|0):0)g=i;else{f=i;n=29}}else{f=g;n=29}if((n|0)==29){n=0;h=c[b+92>>2]|0;Sb[c[(c[h>>2]|0)+32>>2]&127](h,j,d);c[j>>2]=0;c[k>>2]=0;h=(c[b+104>>2]|0)+1|0;c[b+104>>2]=h;c[6156]=(c[6156]|0)+-1;g=f;f=c[o+4>>2]|0}l=l+1|0}while((l|0)<(f|0));if((f|0)>1){te(o,0,f+-1|0);g=c[o+4>>2]|0;h=c[b+104>>2]|0}else g=f;f=g-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){h=0;j=g}else{c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+4>>2]|0}if((j|0)>0){i=0;do{p=c[o+12>>2]|0;c[h+(i<<4)>>2]=c[p+(i<<4)>>2];c[h+(i<<4)+4>>2]=c[p+(i<<4)+4>>2];c[h+(i<<4)+8>>2]=c[p+(i<<4)+8>>2];c[h+(i<<4)+12>>2]=c[p+(i<<4)+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[o+12>>2]|0;if(i|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=h;c[o+8>>2]=f}do{p=(c[o+12>>2]|0)+(g<<4)|0;g=g+1|0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0}while((g|0)!=(f|0))}}c[o+4>>2]=f;c[b+104>>2]=0;return}function te(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;while(1){m=c[a+12>>2]|0;o=(b+d|0)/2|0;p=c[m+(o<<4)>>2]|0;n=c[m+(o<<4)+4>>2]|0;o=c[m+(o<<4)+8>>2]|0;e=d;f=b;while(1){a:do if(!p)while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=(l|0)){g=(h|0)>(i|0);if(g|(j|0)==(p|0)^1)if((j|0)==(p|0)&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}}while(0);b:do if(!p)while(1){j=c[m+(e<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;if(!n)h=-1;else h=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)i=-1;else i=c[k+12>>2]|0;do if((g|0)>=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(e<<4)>>2]|0;if(!j)i=-1;else i=c[j+12>>2]|0;if(!n)g=-1;else g=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;do if((l|0)<=(i|0)){g=(g|0)>(h|0);if(g|(p|0)==(j|0)^1)if((p|0)==(j|0)&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}}while(0);if((f|0)<=(e|0)){h=m+(f<<4)|0;i=c[h>>2]|0;j=c[m+(f<<4)+4>>2]|0;k=c[m+(f<<4)+8>>2]|0;l=c[m+(f<<4)+12>>2]|0;m=m+(e<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];m=c[a+12>>2]|0;c[m+(e<<4)>>2]=i;c[m+(e<<4)+4>>2]=j;c[m+(e<<4)+8>>2]=k;c[m+(e<<4)+12>>2]=l;e=e+-1|0;f=f+1|0}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))te(a,b,e);if((f|0)<(d|0))b=f;else break}return}function ue(a,d,f,h,i,j,k,m,n){a=a|0;d=d|0;f=f|0;h=+h;i=+i;j=+j;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0;W=l;l=l+32|0;T=+g[f>>2];F=+g[f+4>>2];L=+g[f+8>>2];M=1.0/+D(+((h-T)*(h-T)+(i-F)*(i-F)+(j-L)*(j-L)));Q=(h-T)*M==0.0?999999984306749440.0:1.0/((h-T)*M);R=(i-F)*M==0.0?999999984306749440.0:1.0/((i-F)*M);S=(j-L)*M==0.0?999999984306749440.0:1.0/((j-L)*M);fa=(T>h?h:T)+ +g[k>>2];ea=(F>i?i:F)+ +g[k+4>>2];da=(L>j?j:L)+ +g[k+8>>2];ba=(T>2];Z=(F>2];r=(L>2];aa=+g[a+4>>2];fa=fa>2];ea=ea>2];da=da>2];_=+g[a+24>>2];q=+g[a+28>>2];$=+g[a+36>>2];X=+g[a+40>>2];t=+g[a+44>>2];U=~~(((ca0){B=0;o=0;E=c[a+136>>2]|0;while(1){o=o+1|0;p=E+6|0;u=b[E>>1]|0;v=E+10|0;w=b[E+4>>1]|0;x=E+8|0;y=b[E+2>>1]|0;z=E+12|0;A=(c[z>>2]|0)>-1;do if(((I&65535)>=(u&65535)?(U&65535)<=(e[p>>1]|0):0)&(H&65535)<=(e[v>>1]|0)&(K&65535)>=(w&65535)&(G&65535)<=(e[x>>1]|0)&(J&65535)>=(y&65535)){ba=+g[a+36>>2];da=+g[a+40>>2];fa=+g[a+44>>2];ca=+g[a+4>>2];ea=+g[a+8>>2];s=+g[a+12>>2];g[W+12>>2]=0.0;t=+(e[p>>1]|0)/ba+ca;q=+(e[x>>1]|0)/da+ea;r=+(e[v>>1]|0)/fa+s;g[W+28>>2]=0.0;g[W>>2]=+(u&65535)/ba+ca-+g[m>>2];g[W+4>>2]=+(y&65535)/da+ea-+g[m+4>>2];g[W+8>>2]=+(w&65535)/fa+s-+g[m+8>>2];g[W+16>>2]=t-+g[k>>2];g[W+20>>2]=q-+g[k+4>>2];g[W+24>>2]=r-+g[k+8>>2];r=+g[f>>2];q=Q*(+g[W+((Q<0.0&1)<<4)>>2]-r);r=Q*(+g[W+((Q<0.0^1)<<4)>>2]-r);t=+g[f+4>>2];s=R*(+g[W+((R<0.0&1)<<4)+4>>2]-t);t=R*(+g[W+((R<0.0^1)<<4)+4>>2]-t);if(!(s>r|q>t)?(N=s>q?s:q,C=t>2],O=S*(+g[W+((S<0.0&1)<<4)+8>>2]-P),P=S*(+g[W+((S<0.0^1)<<4)+8>>2]-P),!(O>C|N>P)):0){p=(P0.0?(O>N?O:N)<(j-L)*(j-L)*M+((h-T)*(h-T)*M+(i-F)*(i-F)*M):0;if(!(A&p)){V=9;break}p=c[z>>2]|0;Sb[c[(c[d>>2]|0)+8>>2]&127](d,p>>21,p&2097151);p=1;break}p=0;V=9}else{p=0;V=9}while(0);if((V|0)==9){V=0;if(A|p)p=1;else p=0-(c[z>>2]|0)|0}B=p+B|0;if((B|0)>=(n|0))break;else E=E+(p<<4)|0}}else o=0;if((c[6160]|0)>=(o|0)){l=W;return}c[6160]=o;l=W;return}function ve(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0;o=l;l=l+80|0;h=+g[b+12>>2];k=+g[a+264>>2];f=+g[b+8>>2];n=+g[a+260>>2];e=+g[b+4>>2];if((k==f?+g[a+268>>2]==h:0)&n==e?+g[a+256>>2]==+g[b>>2]:0){l=o;return}m=+g[a+256>>2];d=+g[b>>2];if(d*d+e*e+f*f>0.0){j=1.0/+D(+(d*d+e*e+f*f));g[a+256>>2]=d*j;g[a+260>>2]=e*j;g[a+264>>2]=f*j;i=d*j;e=e*j;f=f*j;d=h}else{c[a+256>>2]=0;c[a+260>>2]=0;c[a+264>>2]=0;i=0.0;e=0.0;f=0.0;d=0.0}g[a+268>>2]=d;b=c[a+8>>2]|0;if(!b){l=o;return}d=i*i+e*e+f*f;do if(!(d==0.0)?!(m*m+n*n+k*k==0.0):0){d=1.0/+D(+d);j=i*d;g[a+256>>2]=j;h=e*d;g[a+260>>2]=h;d=f*d;g[a+264>>2]=d;e=1.0/+D(+(m*m+n*n+k*k));if(!(d*k*e+(h*n*e+m*e*j)<-.9999998807907104)){p=+D(+((d*k*e+(h*n*e+m*e*j)+1.0)*2.0));i=(d*m*e-k*e*j)*(1.0/p);f=(h*k*e-d*n*e)*(1.0/p);d=(n*e*j-h*m*e)*(1.0/p);e=p*.5;break}if(+C(+d)>.7071067690849304){e=1.0/+D(+(d*d+h*h));i=-(d*e);f=0.0;d=h*e;e=0.0;break}else{f=1.0/+D(+(h*h+j*j));i=j*f;f=-(h*f);d=0.0;e=0.0;break}}else{i=0.0;f=0.0;d=0.0;e=0.0}while(0);c[o+16>>2]=c[b+4>>2];c[o+16+4>>2]=c[b+4+4>>2];c[o+16+8>>2]=c[b+4+8>>2];c[o+16+12>>2]=c[b+4+12>>2];s=o+16+16|0;c[s>>2]=c[b+20>>2];c[s+4>>2]=c[b+20+4>>2];c[s+8>>2]=c[b+20+8>>2];c[s+12>>2]=c[b+20+12>>2];r=o+16+32|0;c[r>>2]=c[b+36>>2];c[r+4>>2]=c[b+36+4>>2];c[r+8>>2]=c[b+36+8>>2];c[r+12>>2]=c[b+36+12>>2];q=o+16+48|0;c[q>>2]=c[b+52>>2];c[q+4>>2]=c[b+52+4>>2];c[q+8>>2]=c[b+52+8>>2];c[q+12>>2]=c[b+52+12>>2];f=-f;p=-i;j=-d;yh(o+16|0,o);d=+g[o>>2];t=+g[o+12>>2];m=+g[o+8>>2];i=+g[o+4>>2];k=e*d+t*f+m*p-i*j;n=d*j+(t*p+e*i)-m*f;h=t*j+e*m+i*f-d*p;j=e*t-d*f-i*p-m*j;m=k*(2.0/(j*j+(h*h+(k*k+n*n))));p=n*(2.0/(j*j+(h*h+(k*k+n*n))));i=h*(2.0/(j*j+(h*h+(k*k+n*n))));g[o+16>>2]=1.0-(n*p+h*i);g[o+16+4>>2]=k*p-j*i;g[o+16+8>>2]=k*i+j*p;g[o+16+12>>2]=0.0;g[o+16+16>>2]=k*p+j*i;g[o+16+20>>2]=1.0-(k*m+h*i);g[o+16+24>>2]=n*i-j*m;g[o+16+28>>2]=0.0;g[o+16+32>>2]=k*i-j*p;g[o+16+36>>2]=n*i+j*m;g[o+16+40>>2]=1.0-(k*m+n*p);g[o+16+44>>2]=0.0;a=c[a+8>>2]|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+4>>2]=c[o+16>>2];c[a+4+4>>2]=c[o+16+4>>2];c[a+4+8>>2]=c[o+16+8>>2];c[a+4+12>>2]=c[o+16+12>>2];c[a+20>>2]=c[s>>2];c[a+20+4>>2]=c[s+4>>2];c[a+20+8>>2]=c[s+8>>2];c[a+20+12>>2]=c[s+12>>2];c[a+36>>2]=c[r>>2];c[a+36+4>>2]=c[r+4>>2];c[a+36+8>>2]=c[r+8>>2];c[a+36+12>>2]=c[r+12>>2];c[a+52>>2]=c[q>>2];c[a+52+4>>2]=c[q+4>>2];c[a+52+8>>2]=c[q+8>>2];c[a+52+12>>2]=c[q+12>>2];l=o;return}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+160|0;e=c[a+4>>2]|0;f=c[e+12>>2]|0;D=+g[f>>2];C=+g[f+4>>2];B=+g[f+8>>2];A=+g[f+16>>2];z=+g[f+20>>2];y=+g[f+24>>2];r=+g[f+32>>2];p=+g[f+36>>2];n=+g[f+40>>2];e=c[(c[e+4>>2]|0)+28>>2]|0;x=+g[e+(d*80|0)>>2];w=+g[e+(d*80|0)+16>>2];v=+g[e+(d*80|0)+32>>2];u=+g[e+(d*80|0)+4>>2];t=+g[e+(d*80|0)+20>>2];s=+g[e+(d*80|0)+36>>2];q=+g[e+(d*80|0)+8>>2];o=+g[e+(d*80|0)+24>>2];m=+g[e+(d*80|0)+40>>2];F=+g[e+(d*80|0)+48>>2];E=+g[e+(d*80|0)+52>>2];i=+g[e+(d*80|0)+56>>2];k=+g[f+48>>2]+(D*F+C*E+B*i);j=+g[f+52>>2]+(A*F+z*E+y*i);i=+g[f+56>>2]+(r*F+p*E+n*i);g[h+88>>2]=D*x+C*w+B*v;g[h+88+4>>2]=D*u+C*t+B*s;g[h+88+8>>2]=D*q+C*o+B*m;g[h+88+12>>2]=0.0;g[h+88+16>>2]=A*x+z*w+y*v;g[h+88+20>>2]=A*u+z*t+y*s;g[h+88+24>>2]=A*q+z*o+y*m;g[h+88+28>>2]=0.0;g[h+88+32>>2]=r*x+p*w+n*v;g[h+88+36>>2]=r*u+p*t+n*s;g[h+88+40>>2]=r*q+p*o+n*m;g[h+88+44>>2]=0.0;g[h+88+48>>2]=k;g[h+88+52>>2]=j;g[h+88+56>>2]=i;g[h+88+60>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,h+88|0,h+72|0,h+56|0);i=+g[(c[a+20>>2]|0)+32>>2];g[h+72>>2]=+g[h+72>>2]-i;g[h+72+4>>2]=+g[h+72+4>>2]-i;g[h+72+8>>2]=+g[h+72+8>>2]-i;g[h+56>>2]=i+ +g[h+56>>2];g[h+56+4>>2]=i+ +g[h+56+4>>2];g[h+56+8>>2]=i+ +g[h+56+8>>2];f=c[a+8>>2]|0;e=c[f+4>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,c[f+12>>2]|0,h+40|0,h+24|0);if(!(+g[h+72>>2]>+g[h+24>>2])?!(+g[h+56>>2]<+g[h+40>>2]):0)e=1;else e=0;if(!(!(+g[h+72+8>>2]>+g[h+24+8>>2])?!(+g[h+56+8>>2]<+g[h+40+8>>2]):0))e=0;if(+g[h+72+4>>2]>+g[h+24+4>>2]){l=h;return}if(+g[h+56+4>>2]<+g[h+40+4>>2]|e^1){l=h;return}e=c[a+4>>2]|0;f=c[e+8>>2]|0;c[h>>2]=e;c[h+4>>2]=b;c[h+8>>2]=f;c[h+12>>2]=h+88;c[h+16>>2]=-1;c[h+20>>2]=d;if(!(+g[(c[a+20>>2]|0)+32>>2]>0.0)){e=c[(c[a+24>>2]|0)+(d<<2)>>2]|0;if(!e){f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,c[a+28>>2]|0,1)|0;c[(c[a+24>>2]|0)+(d<<2)>>2]=f;f=c[(c[a+24>>2]|0)+(d<<2)>>2]|0}else f=e}else{f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,0,2)|0}b=c[a+20>>2]|0;e=c[b+8>>2]|0;if((c[e+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)){c[b+8>>2]=h;Sb[c[(c[b>>2]|0)+8>>2]&127](b,-1,d)}else{e=c[b+12>>2]|0;c[b+12>>2]=h;Sb[c[(c[b>>2]|0)+12>>2]&127](b,-1,d)}Zb[c[(c[f>>2]|0)+8>>2]&31](f,h,c[a+8>>2]|0,c[a+16>>2]|0,c[a+20>>2]|0);d=c[a+20>>2]|0;c[((c[(c[d+8>>2]|0)+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)?d+8|0:d+12|0)>>2]=e;l=h;return}function xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,H=0.0,I=0.0,J=0.0;Tg(a,b+(c*284|0)|0,d);m=+g[b+(c*284|0)+52>>2];h=+g[b+(c*284|0)+56>>2];q=+g[b+(c*284|0)+60>>2];J=+g[b+(c*284|0)+76>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+68>>2];w=1.0/+D(+((x*-m-z*-h)*(x*-m-z*-h)+((J*-h-x*-q)*(J*-h-x*-q)+(z*-q-J*-m)*(z*-q-J*-m))));v=(J*-h-x*-q)*w;u=w*(z*-q-J*-m);w=w*(x*-m-z*-h);e=+g[b+(c*284|0)+232>>2]*.5;k=+G(+e)/+D(+(m*m+h*h+q*q));e=+F(+e);l=2.0/(e*e+(k*-q*k*-q+(k*-m*k*-m+k*-h*k*-h)));H=1.0-(k*-h*k*-h*l+k*-q*k*-q*l);E=k*-m*k*-h*l-e*k*-q*l;I=k*-m*k*-q*l+e*k*-h*l;B=k*-m*k*-h*l+e*k*-q*l;A=1.0-(k*-m*k*-m*l+k*-q*k*-q*l);C=k*-h*k*-q*l-e*k*-m*l;j=k*-m*k*-q*l-e*k*-h*l;e=k*-h*k*-q*l+e*k*-m*l;l=1.0-(k*-m*k*-m*l+k*-h*k*-h*l);k=+g[b+(c*284|0)+236>>2]*-.5;y=+G(+k)/+D(+(J*J+(x*x+z*z)));k=+F(+k);r=2.0/(k*k+(J*y*J*y+(z*y*z*y+x*y*x*y)));n=1.0-(x*y*x*y*r+J*y*J*y*r);i=z*y*x*y*r-k*J*y*r;t=z*y*J*y*r+k*x*y*r;o=z*y*x*y*r+k*J*y*r;f=1.0-(z*y*z*y*r+J*y*J*y*r);s=x*y*J*y*r-k*z*y*r;p=z*y*J*y*r-k*x*y*r;k=x*y*J*y*r+k*z*y*r;r=1.0-(z*y*z*y*r+x*y*x*y*r);y=+g[b+(c*284|0)+68>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+76>>2];g[b+(c*284|0)+92>>2]=z*(H*t+E*s+I*r)+(y*(I*p+(E*o+H*n))+x*(I*k+(H*i+E*f)));g[b+(c*284|0)+96>>2]=w*(H*t+E*s+I*r)+(v*(I*p+(E*o+H*n))+u*(I*k+(H*i+E*f)));g[b+(c*284|0)+100>>2]=(H*t+E*s+I*r)*-q+((I*p+(E*o+H*n))*-m+(I*k+(H*i+E*f))*-h);g[b+(c*284|0)+104>>2]=0.0;g[b+(c*284|0)+108>>2]=z*(B*t+A*s+C*r)+(y*(C*p+(A*o+B*n))+x*(C*k+(B*i+A*f)));g[b+(c*284|0)+112>>2]=w*(B*t+A*s+C*r)+(v*(C*p+(A*o+B*n))+u*(C*k+(B*i+A*f)));g[b+(c*284|0)+116>>2]=(B*t+A*s+C*r)*-q+((C*p+(A*o+B*n))*-m+(C*k+(B*i+A*f))*-h);g[b+(c*284|0)+120>>2]=0.0;g[b+(c*284|0)+124>>2]=z*(j*t+e*s+l*r)+(y*(l*p+(e*o+j*n))+x*(l*k+(j*i+e*f)));g[b+(c*284|0)+128>>2]=w*(j*t+e*s+l*r)+(v*(l*p+(e*o+j*n))+u*(l*k+(j*i+e*f)));g[b+(c*284|0)+132>>2]=(j*t+e*s+l*r)*-q+((l*p+(e*o+j*n))*-m+(l*k+(j*i+e*f))*-h);g[b+(c*284|0)+136>>2]=0.0;h=+g[b+(c*284|0)+32>>2];f=h*+g[b+(c*284|0)+56>>2]+ +g[b+(c*284|0)+40>>2];e=h*+g[b+(c*284|0)+60>>2]+ +g[b+(c*284|0)+44>>2];g[b+(c*284|0)+140>>2]=+g[b+(c*284|0)+52>>2]*h+ +g[b+(c*284|0)+36>>2];g[b+(c*284|0)+144>>2]=f;g[b+(c*284|0)+148>>2]=e;g[b+(c*284|0)+152>>2]=0.0;return}function ye(b,d,e,f,h,i,k,l){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;c[b+4>>2]=4;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4996;g[b+688>>2]=0.0;g[b+692>>2]=-1.0;g[b+696>>2]=.8999999761581421;g[b+700>>2]=.30000001192092896;g[b+704>>2]=1.0;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;a[b+736>>0]=0;a[b+737>>0]=0;a[b+738>>0]=0;a[b+739>>0]=1;a[b+740>>0]=l&1;c[b+748>>2]=0;c[b+748+4>>2]=0;c[b+748+8>>2]=0;c[b+748+12>>2]=0;c[b+748+16>>2]=0;c[b+600>>2]=c[f>>2];c[b+600+4>>2]=c[f+4>>2];c[b+600+8>>2]=c[f+8>>2];c[b+600+12>>2]=c[f+12>>2];m=+g[d+4>>2];n=+g[d+20>>2];o=+g[d+36>>2];p=+g[i>>2];q=+g[i+4>>2];r=+g[i+8>>2];do if(!(m*p+n*q+o*r>=.9999998807907104))if(!(m*p+n*q+o*r<=-.9999998807907104)){e=(g[j>>2]=o*q-n*r,c[j>>2]|0);s=(g[j>>2]=m*r-o*p,c[j>>2]|0);f=(g[j>>2]=n*p-m*q,c[j>>2]|0);x=r*(m*r-o*p)-q*(n*p-m*q);y=p*(n*p-m*q)-r*(o*q-n*r);w=q*(o*q-n*r)-p*(m*r-o*p);break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=+g[d+12>>2];y=+g[d+28>>2];w=+g[d+44>>2];break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=-+g[d+12>>2];y=-+g[d+28>>2];w=-+g[d+44>>2]}while(0);g[b+552>>2]=x;c[b+556>>2]=e;c[b+560>>2]=c[i>>2];g[b+564>>2]=0.0;g[b+568>>2]=y;c[b+572>>2]=s;c[b+576>>2]=c[i+4>>2];g[b+580>>2]=0.0;g[b+584>>2]=w;c[b+588>>2]=f;c[b+592>>2]=c[i+8>>2];g[b+596>>2]=0.0;p=+g[i+4>>2];t=+g[k+8>>2];q=+g[i+8>>2];u=+g[k+4>>2];v=+g[k>>2];m=+g[i>>2];do if(t*q+(p*u+v*m)<-.9999998807907104)if(+C(+q)>.7071067690849304){n=1.0/+D(+(p*p+q*q));o=-(q*n);r=0.0;n=p*n;m=0.0;break}else{q=1.0/+D(+(p*p+m*m));o=m*q;r=0.0;n=0.0;m=-(p*q);break}else{z=+D(+((t*q+(p*u+v*m)+1.0)*2.0));o=(q*v-t*m)*(1.0/z);r=z*.5;n=(u*m-p*v)*(1.0/z);m=(p*t-q*u)*(1.0/z)}while(0);B=w*o+x*r-y*n;q=x*n+y*r-w*m;p=y*m+w*r-x*o;A=-(x*m)-y*o-w*n;x=-m;o=-o;w=-n;z=q*w+(A*x+r*B)-p*o;y=p*x+(A*o+r*q)-B*w;x=B*o+(A*w+r*p)-q*x;c[b+664>>2]=c[h>>2];c[b+664+4>>2]=c[h+4>>2];c[b+664+8>>2]=c[h+8>>2];c[b+664+12>>2]=c[h+12>>2];g[b+616>>2]=z;g[b+620>>2]=u*x-t*y;c[b+624>>2]=c[k>>2];g[b+628>>2]=0.0;g[b+632>>2]=y;g[b+636>>2]=t*z-v*x;c[b+640>>2]=c[k+4>>2];g[b+644>>2]=0.0;g[b+648>>2]=x;g[b+652>>2]=v*y-u*z;c[b+656>>2]=c[k+8>>2];g[b+660>>2]=0.0;g[b+732>>2]=l?-1.0:1.0;return}function ze(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0;D=l;l=l+32|0;if(!b){l=D;return}n=c[k+4>>2]|0;if((n|0)<128){if((c[k+8>>2]|0)<128){c[6995]=(c[6995]|0)+1;o=sc(531)|0;if(!o)q=0;else{c[(o+4+15&-16)+-4>>2]=o;q=o+4+15&-16}p=c[k+4>>2]|0;if((p|0)>0){o=0;do{c[q+(o<<2)>>2]=c[(c[k+12>>2]|0)+(o<<2)>>2];o=o+1|0}while((o|0)!=(p|0))}o=c[k+12>>2]|0;if(o|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[k+12>>2]=0}a[k+16>>0]=1;c[k+12>>2]=q;c[k+8>>2]=128;o=k+12|0}else o=k+12|0;do{c[(c[o>>2]|0)+(n<<2)>>2]=0;n=n+1|0}while((n|0)!=128);y=k+8|0}else{o=k+12|0;y=k+8|0}c[k+4>>2]=128;c[c[o>>2]>>2]=b;p=1;n=126;do{w=p+-1|0;q=c[o>>2]|0;x=c[q+(w<<2)>>2]|0;u=+g[x+4>>2]-+g[j+4>>2];s=+g[x+8>>2]-+g[j+8>>2];g[D>>2]=+g[x>>2]-+g[j>>2];g[D+4>>2]=u;g[D+8>>2]=s;g[D+12>>2]=0.0;s=+g[x+20>>2]-+g[i+4>>2];u=+g[x+24>>2]-+g[i+8>>2];g[D+16>>2]=+g[x+16>>2]-+g[i>>2];g[D+20>>2]=s;g[D+24>>2]=u;g[D+28>>2]=0.0;v=c[f>>2]|0;u=+g[d>>2];s=+g[e>>2];t=(+g[D+(v<<4)>>2]-u)*s;u=s*(+g[D+(1-v<<4)>>2]-u);v=c[f+4>>2]|0;s=+g[d+4>>2];E=+g[e+4>>2];r=(+g[D+(v<<4)+4>>2]-s)*E;s=E*(+g[D+(1-v<<4)+4>>2]-s);do if((!(r>u|t>s)?(A=r>t?r:t,z=s>2]|0,C=+g[d+8>>2],E=+g[e+8>>2],B=(+g[D+(v<<4)+8>>2]-C)*E,C=E*(+g[D+(1-v<<4)+8>>2]-C),!(B>z|A>C)):0)?((C0.0?(B>A?B:A)>2]|0)){Ob[c[(c[m>>2]|0)+12>>2]&127](m,x);p=w;break}if((w|0)>(n|0)){v=c[k+4>>2]|0;if((v|0)<(v<<1|0)){if((c[y>>2]|0)<(v<<1|0)){if(v){c[6995]=(c[6995]|0)+1;n=sc((v<<3|3)+16|0)|0;if(!n)q=0;else{c[(n+4+15&-16)+-4>>2]=n;q=n+4+15&-16}b=c[k+4>>2]|0;if((b|0)>0){n=0;do{c[q+(n<<2)>>2]=c[(c[o>>2]|0)+(n<<2)>>2];n=n+1|0}while((n|0)!=(b|0))}}else q=0;n=c[o>>2]|0;if(n|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[o>>2]=0}a[k+16>>0]=1;c[o>>2]=q;c[y>>2]=v<<1;n=v}else n=v;do{c[q+(n<<2)>>2]=0;n=n+1|0;q=c[o>>2]|0}while((n|0)!=(v<<1|0))}c[k+4>>2]=v<<1;n=(v<<1)+-2|0}c[q+(w<<2)>>2]=c[x+36>>2];c[(c[o>>2]|0)+(p<<2)>>2]=c[x+40>>2];p=p+1|0}else p=w;while(0)}while((p|0)!=0);l=D;return}function Ae(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0.0;D=l;l=l+32|0;q=+g[d>>2];h=(g[j>>2]=q,c[j>>2]|0);t=q<999999984306749440.0?h:1566444395;p=+g[d+4>>2];k=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?k:1566444395;E=+g[d+8>>2];n=(g[j>>2]=E,c[j>>2]|0);w=E<999999984306749440.0?n:1566444395;r=+g[d+12>>2];y=r<0.0?r:0.0;h=q>-999999984306749440.0?h:-581039253;k=p>-999999984306749440.0?k:-581039253;n=E>-999999984306749440.0?n:-581039253;r=r>0.0?r:0.0;E=+g[d+16>>2];B=E<(c[j>>2]=t,+g[j>>2]);i=(g[j>>2]=E,c[j>>2]|0);t=B?i:t;p=+g[d+20>>2];B=p<(c[j>>2]=u,+g[j>>2]);m=(g[j>>2]=p,c[j>>2]|0);u=B?m:u;q=+g[d+24>>2];B=q<(c[j>>2]=w,+g[j>>2]);o=(g[j>>2]=q,c[j>>2]|0);w=B?o:w;s=+g[d+28>>2];y=s>2]=h,+g[j>>2])>2]=k,+g[j>>2])>2]=n,+g[j>>2])>2];B=E<(c[j>>2]=t,+g[j>>2]);h=(g[j>>2]=E,c[j>>2]|0);B=B?h:t;q=+g[d+36>>2];A=q<(c[j>>2]=u,+g[j>>2]);i=(g[j>>2]=q,c[j>>2]|0);A=A?i:u;r=+g[d+40>>2];z=r<(c[j>>2]=w,+g[j>>2]);k=(g[j>>2]=r,c[j>>2]|0);z=z?k:w;p=+g[d+44>>2];y=p>2]=x,+g[j>>2])>2]=v,+g[j>>2])>2]=m,+g[j>>2])>2]|0;h=c[t+4>>2]|0;if((h|0)==(c[t+8>>2]|0)?(C=h|0?h<<1:1,(h|0)<(C|0)):0){if(!C)o=0;else{c[6995]=(c[6995]|0)+1;h=sc(C<<6|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[t+4>>2]|0}if((h|0)>0){i=0;do{k=o+(i<<6)|0;m=(c[t+12>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(h|0))}h=c[t+12>>2]|0;if(h|0){if(a[t+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[t+12>>2]=0}a[t+16>>0]=1;c[t+12>>2]=o;c[t+8>>2]=C;h=c[t+4>>2]|0}C=c[t+12>>2]|0;c[C+(h<<6)>>2]=B;c[C+(h<<6)+4>>2]=A;c[C+(h<<6)+8>>2]=z;g[C+(h<<6)+12>>2]=y;c[C+(h<<6)+16>>2]=w;c[C+(h<<6)+20>>2]=v;c[C+(h<<6)+24>>2]=u;g[C+(h<<6)+28>>2]=p;c[C+(h<<6)+32>>2]=-1;c[C+(h<<6)+36>>2]=e;c[C+(h<<6)+40>>2]=f;f=C+(h<<6)+44|0;c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];c[f+16>>2]=c[D+16>>2];c[t+4>>2]=(c[t+4>>2]|0)+1;l=D;return}function Be(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;o=l;l=l+16|0;n=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];k=+g[e>>2];m=+g[e+4>>2];h=+g[e+8>>2];if(!(a[b+232>>0]|0)){z=+g[b+104>>2];w=+g[b+120>>2];C=+g[b+136>>2];y=+g[b+108>>2];u=+g[b+124>>2];B=+g[b+140>>2];x=+g[b+112>>2];s=+g[b+128>>2];A=+g[b+144>>2];F=-+g[b+152>>2];E=-+g[b+156>>2];D=-+g[b+160>>2];J=+g[b+168>>2];I=+g[b+172>>2];r=+g[b+176>>2];H=+g[b+184>>2];G=+g[b+188>>2];q=+g[b+192>>2];v=+g[b+200>>2];t=+g[b+204>>2];p=+g[b+208>>2];r=h*(C*J+B*I+A*r)+(k*(z*J+y*I+x*r)+m*(w*J+u*I+s*r))+(J*(z*F+w*E+C*D)+(y*F+u*E+B*D)*I+(x*F+s*E+A*D)*r+ +g[b+216>>2]);q=h*(C*H+B*G+A*q)+(k*(z*H+y*G+x*q)+m*(w*H+u*G+s*q))+((z*F+w*E+C*D)*H+(y*F+u*E+B*D)*G+(x*F+s*E+A*D)*q+ +g[b+220>>2]);p=(z*F+w*E+C*D)*v+(y*F+u*E+B*D)*t+(x*F+s*E+A*D)*p+ +g[b+224>>2]+(h*(C*v+B*t+A*p)+(k*(z*v+y*t+x*p)+m*(w*v+u*t+s*p)));g[o>>2]=r;g[o+4>>2]=q;g[o+8>>2]=p;n=(n*f+k-r)*+g[d>>2]+(i*f+m-q)*+g[d+4>>2]+(j*f+h-p)*+g[d+8>>2];e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,n);l=o;return}else{z=+g[b+40>>2];C=+g[b+56>>2];w=+g[b+72>>2];A=+g[b+44>>2];E=+g[b+60>>2];x=+g[b+76>>2];B=+g[b+48>>2];G=+g[b+64>>2];y=+g[b+80>>2];t=-+g[b+88>>2];u=-+g[b+92>>2];v=-+g[b+96>>2];p=+g[b+168>>2];q=+g[b+172>>2];H=+g[b+176>>2];r=+g[b+184>>2];s=+g[b+188>>2];I=+g[b+192>>2];D=+g[b+200>>2];F=+g[b+204>>2];J=+g[b+208>>2];H=(j*f+h)*(w*p+x*q+y*H)+((n*f+k)*(z*p+A*q+B*H)+(i*f+m)*(C*p+E*q+G*H))+(p*(z*t+C*u+w*v)+(A*t+E*u+x*v)*q+(B*t+G*u+y*v)*H+ +g[b+216>>2]);I=(j*f+h)*(w*r+x*s+y*I)+((n*f+k)*(z*r+A*s+B*I)+(i*f+m)*(C*r+E*s+G*I))+((z*t+C*u+w*v)*r+(A*t+E*u+x*v)*s+(B*t+G*u+y*v)*I+ +g[b+220>>2]);J=(z*t+C*u+w*v)*D+(A*t+E*u+x*v)*F+(B*t+G*u+y*v)*J+ +g[b+224>>2]+((j*f+h)*(w*D+x*F+y*J)+((n*f+k)*(z*D+A*F+B*J)+(i*f+m)*(C*D+E*F+G*J)));g[o>>2]=H+n*(n*(H-k)+i*(I-m)+j*(J-h));g[o+4>>2]=I+i*(n*(H-k)+i*(I-m)+j*(J-h));g[o+8>>2]=J+j*(n*(H-k)+i*(I-m)+j*(J-h));J=n*(H-k)+i*(I-m)+j*(J-h);e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,J);l=o;return}}function Ce(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;c[a+556>>2]=c[b>>2];c[a+556+4>>2]=c[b+4>>2];c[a+556+8>>2]=c[b+8>>2];c[a+556+12>>2]=c[b+12>>2];q=+g[a+568>>2];j=+g[5957];r=+g[a+560>>2];e=+g[5959];o=+g[a+564>>2];h=+g[5958];p=+g[a+556>>2];i=(j*o+q*h-e*p)*-o+(q*(q*j+r*e-o*h)+(-(j*p)-r*h-e*o)*-p)-(q*e+h*p-j*r)*-r;k=(q*e+h*p-j*r)*-p+(q*(j*o+q*h-e*p)+(-(j*p)-r*h-e*o)*-r)-(q*j+r*e-o*h)*-o;d=(q*j+r*e-o*h)*-r+((-(j*p)-r*h-e*o)*-o+q*(q*e+h*p-j*r))-(j*o+q*h-e*p)*-p;do if(e*d+(h*k+j*i)<-.9999998807907104)if(+C(+e)>.7071067690849304){d=1.0/+D(+(e*e+h*h));l=-(e*d);f=0.0;d=h*d;e=0.0;break}else{f=1.0/+D(+(j*j+h*h));l=j*f;f=-(h*f);d=0.0;e=0.0;break}else{v=+D(+((e*d+(h*k+j*i)+1.0)*2.0));l=(e*i-j*d)*(1.0/v);f=(h*d-e*k)*(1.0/v);d=(j*k-h*i)*(1.0/v);e=v*.5}while(0);m=1.0/+D(+(f*f+l*l+d*d+e*e));t=f*m;n=l*m;s=d*m;m=e*m;e=1.0/+D(+((m*q-p*-t-r*-n-o*-s)*(m*q-p*-t-r*-n-o*-s)+((q*-s+m*o+r*-t-p*-n)*(q*-s+m*o+r*-t-p*-n)+((p*m+q*-t+o*-n-r*-s)*(p*m+q*-t+o*-n-r*-s)+(p*-s+(q*-n+m*r)-o*-t)*(p*-s+(q*-n+m*r)-o*-t)))));h=(p*m+q*-t+o*-n-r*-s)*e;v=e*(p*-s+(q*-n+m*r)-o*-t);f=e*(q*-s+m*o+r*-t-p*-n);p=e*(m*q-p*-t-r*-n-o*-s);e=+g[a+444>>2];if(e>=.05000000074505806?(u=+g[a+448>>2],u>=.05000000074505806):0){d=m<-1.0?-1.0:m;d=+I(+(d>1.0?1.0:d))*2.0;if(d>1.1920928955078125e-07){i=1.0/+D(+(s*s+(t*t+n*n)));if(+C(+(n*i))>1.1920928955078125e-07){k=t*i;j=n*i;l=s*i;e=+D(+((s*i*s*i/(n*i*n*i)+1.0)/(1.0/(u*u)+s*i*s*i/(n*i*n*i)/(e*e))))}else{k=t*i;j=n*i;l=s*i}}else{k=0.0;j=0.0;l=0.0;e=0.0}if(+C(+d)>1.1920928955078125e-07){if(!(d>e)){e=-e;if(d>2];if(k>=.05000000074505806){d=p<-1.0?-1.0:p;d=+I(+(d>1.0?1.0:d))*2.0;if(d>3.1415927410125732){d=-p<-1.0?-1.0:-p;d=+I(+(d>1.0?1.0:d))*2.0;e=-h;i=-v;j=-f}else{e=h;i=v;j=f}if(d>1.1920928955078125e-07){u=1.0/+D(+(e*e+i*i+j*j));e=e*u;i=i*u;j=j*u}if(+C(+d)>1.1920928955078125e-07){if(!(d>k)){if(d<-k)d=-k}else d=k;v=d*.5;d=+G(+v)/+D(+(j*j+(i*i+e*e)));h=e*d;f=j*d;e=+F(+v);d=i*d}else{e=p;d=v}}else{e=p;d=v}g[a+556>>2]=n*f+(m*h+o*e)-l*d;g[a+560>>2]=l*h+(m*d+n*e)-o*f;g[a+564>>2]=o*d+(m*f+l*e)-n*h;g[a+568>>2]=m*e-o*h-n*d-l*f;return}function De(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;r=l;l=l+32|0;e=c[b+128>>2]|0;if((e|0)>0){f=0;do{xe(c[b+108>>2]|0,c[b+136>>2]|0,f,0);f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0))}q=c[b+108>>2]|0;m=+g[q+372>>2];n=+g[q+376>>2];h=+g[q+380>>2];h=+D(+(m*m+n*n+h*h))*3.5999999046325684;g[b+104>>2]=h;p=c[b+120>>2]|0;if(+g[q+4+(p<<2)>>2]*+g[q+372>>2]+ +g[q+20+(p<<2)>>2]*+g[q+376>>2]+ +g[q+36+(p<<2)>>2]*+g[q+380>>2]<0.0)g[b+104>>2]=-h;if((e|0)>0){e=0;do{+wf(b,(c[b+136>>2]|0)+(e*284|0)|0);e=e+1|0;f=c[b+128>>2]|0}while((e|0)<(f|0));i=1.0/+g[(c[b+108>>2]|0)+404>>2];if((f|0)>0){f=0;do{e=c[b+136>>2]|0;if(!(a[e+(f*284|0)+84>>0]|0))h=0.0;else{h=+g[e+(f*284|0)+272>>2];h=i*(+g[e+(f*284|0)+216>>2]*(+g[e+(f*284|0)+204>>2]-+g[e+(f*284|0)+32>>2])*+g[e+(f*284|0)+268>>2]-h*+g[(h<0.0?e+(f*284|0)+220|0:e+(f*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[e+(f*284|0)+276>>2]=h;f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0));if((e|0)>0){e=0;do{p=c[b+136>>2]|0;k=+g[p+(e*284|0)+276>>2];n=+g[p+(e*284|0)+248>>2];k=k>n?n:k;n=k*+g[p+(e*284|0)+4>>2]*d;m=k*+g[p+(e*284|0)+8>>2]*d;g[r+16>>2]=+g[p+(e*284|0)>>2]*k*d;g[r+16+4>>2]=n;g[r+16+8>>2]=m;g[r+16+12>>2]=0.0;q=c[b+108>>2]|0;m=+g[p+(e*284|0)+20>>2]-+g[q+56>>2];n=+g[p+(e*284|0)+24>>2]-+g[q+60>>2];g[r>>2]=+g[p+(e*284|0)+16>>2]-+g[q+52>>2];g[r+4>>2]=m;g[r+8>>2]=n;g[r+12>>2]=0.0;ll(q,r+16|0,r);e=e+1|0}while((e|0)<(c[b+128>>2]|0))}}}Jb[c[(c[b>>2]|0)+20>>2]&31](b,d);o=c[b+128>>2]|0;if((o|0)<=0){l=r;return}p=c[b+136>>2]|0;q=c[b+108>>2]|0;f=0;do{h=+g[p+(f*284|0)+36>>2]-+g[q+52>>2];i=+g[p+(f*284|0)+40>>2]-+g[q+56>>2];j=+g[p+(f*284|0)+44>>2]-+g[q+60>>2];k=+g[q+392>>2];m=+g[q+396>>2];n=+g[q+388>>2];if(!(a[p+(f*284|0)+84>>0]|0)){s=p+(f*284|0)+240|0;e=s;h=+g[s>>2]}else{e=c[b+120>>2]|0;y=+g[q+4+(e<<2)>>2];w=+g[q+20+(e<<2)>>2];u=+g[q+36+(e<<2)>>2];x=+g[p+(f*284|0)>>2];v=+g[p+(f*284|0)+4>>2];t=+g[p+(f*284|0)+8>>2];h=((i*n-h*k+ +g[q+380>>2])*(u-t*(y*x+w*v+u*t))+((k*j-i*m+ +g[q+372>>2])*(y-x*(y*x+w*v+u*t))+(h*m-j*n+ +g[q+376>>2])*(w-v*(y*x+w*v+u*t))))*d/+g[p+(f*284|0)+212>>2];e=p+(f*284|0)+240|0;g[e>>2]=h}s=p+(f*284|0)+236|0;g[s>>2]=h+ +g[s>>2];g[e>>2]=h*.9900000095367432;f=f+1|0}while((f|0)!=(o|0));l=r;return}function Ee(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(!((a|0)!=0&(b|0)!=0))return;c[6995]=(c[6995]|0)+1;e=sc(1043)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}c[f>>2]=a;c[f+4>>2]=b;e=1;b=124;h=128;a=f;l=128;k=f;i=f;o=f;while(1){r=e+-1|0;p=c[a+(r<<3)>>2]|0;q=c[a+(r<<3)+4>>2]|0;if((r|0)>(b|0)){n=l<<1;do if((l|0)<(n|0)&(h|0)<(n|0)){if(l){c[6995]=(c[6995]|0)+1;b=sc((l<<4|3)+16|0)|0;if(!b)f=0;else{c[(b+4+15&-16)+-4>>2]=b;f=b+4+15&-16}if((l|0)>0){b=0;do{j=a+(b<<3)|0;k=c[j+4>>2]|0;m=f+(b<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;b=b+1|0}while((b|0)!=(l|0));h=f;a=f}else{h=f;b=f;s=12}}else{h=0;b=0;s=12}if((s|0)==12){s=0;if(!a){j=n;a=b;f=h;i=h;b=h;break}else a=b}if(!o){j=n;f=h;i=h;b=h}else{c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);j=n;f=h;i=h;b=h}}else{j=h;f=k;b=o}while(0);m=n+-4|0;h=j;l=n;k=f;j=b}else{m=b;j=o}do if((p|0)==(q|0))if(!(c[p+40>>2]|0))e=r;else{q=c[p+36>>2]|0;c[a+(r<<3)>>2]=q;c[a+(r<<3)+4>>2]=q;q=c[p+40>>2]|0;r=e+1|0;c[a+(e<<3)>>2]=q;c[a+(e<<3)+4>>2]=q;q=c[p+40>>2]|0;c[a+(r<<3)>>2]=c[p+36>>2];c[a+(r<<3)+4>>2]=q;e=e+2|0}else if(((((+g[p>>2]<=+g[q+16>>2]?+g[p+16>>2]>=+g[q>>2]:0)?+g[p+4>>2]<=+g[q+20>>2]:0)?+g[p+20>>2]>=+g[q+4>>2]:0)?+g[p+8>>2]<=+g[q+24>>2]:0)?+g[p+24>>2]>=+g[q+8>>2]:0){b=(c[q+40>>2]|0)!=0;if(!(c[p+40>>2]|0))if(b){o=c[q+36>>2]|0;c[a+(r<<3)>>2]=p;c[a+(r<<3)+4>>2]=o;r=c[q+40>>2]|0;c[a+(e<<3)>>2]=p;c[a+(e<<3)+4>>2]=r;e=e+1|0;break}else{Sb[c[(c[d>>2]|0)+8>>2]&127](d,p,q);e=r;break}else{f=c[p+36>>2]|0;if(b){n=c[q+36>>2]|0;c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=n;n=c[q+36>>2]|0;o=e+1|0;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=n;n=c[q+40>>2]|0;r=e+2|0;c[a+(o<<3)>>2]=c[p+36>>2];c[a+(o<<3)+4>>2]=n;q=c[q+40>>2]|0;c[a+(r<<3)>>2]=c[p+40>>2];c[a+(r<<3)+4>>2]=q;e=e+3|0;break}else{c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=q;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=q;e=e+1|0;break}}}else e=r;while(0);if(!e)break;else{b=m;o=j}}if((a|0)==0|(k|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);return}function Fe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0,J=0.0;d=l;l=l+96|0;k=+g[b>>2];m=+g[a+28>>2];n=+g[b+4>>2];o=+g[a+32>>2];p=+g[b+8>>2];q=+g[a+36>>2];r=+g[a+44>>2];s=+g[a+48>>2];t=+g[a+52>>2];u=+g[a+60>>2];v=+g[a+64>>2];w=+g[a+68>>2];x=+g[a+76>>2];y=+g[a+80>>2];z=+g[a+84>>2];g[d+80>>2]=k*m+n*o+p*q+x;g[d+80+4>>2]=k*r+n*s+p*t+y;g[d+80+8>>2]=k*u+n*v+p*w+z;g[d+80+12>>2]=0.0;A=+g[b+16>>2];B=+g[b+20>>2];C=+g[b+24>>2];g[d+64>>2]=A*m+B*o+C*q+x;g[d+64+4>>2]=A*r+B*s+C*t+y;g[d+64+8>>2]=A*u+B*v+C*w+z;g[d+64+12>>2]=0.0;E=+g[b+32>>2];F=+g[b+36>>2];j=+g[b+40>>2];g[d+48>>2]=E*m+F*o+j*q+x;g[d+48+4>>2]=E*r+F*s+j*t+y;g[d+48+8>>2]=E*u+F*v+j*w+z;g[d+48+12>>2]=0.0;f=(k*m+n*o+p*q+x+(A*m+B*o+C*q+x)+(E*m+F*o+j*q+x))*.3333333432674408;h=(k*r+n*s+p*t+y+(A*r+B*s+C*t+y)+(E*r+F*s+j*t+y))*.3333333432674408;i=(k*u+n*v+p*w+z+(A*u+B*v+C*w+z)+(E*u+F*v+j*w+z))*.3333333432674408;g[d+32>>2]=f;g[d+32+4>>2]=h;g[d+32+8>>2]=i;g[d+32+12>>2]=0.0;b=c[a+8>>2]|0;if(!((xb[c[(c[b>>2]|0)+56>>2]&127](b)|0)&16384)){e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;b=a+12|0;Vb[G&127](e,d+80|0,d+64|0,b);e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;Vb[G&127](e,d+64|0,d+48|0,b);a=c[a+8>>2]|0;e=c[a>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](a,d+48|0,d+80|0,b);l=d;return}J=+g[d+80>>2];I=A*r+B*s+C*t+y-(k*r+n*s+p*t+y);H=A*u+B*v+C*w+z-(k*u+n*v+p*w+z);y=E*r+F*s+j*t+y-(k*r+n*s+p*t+y);w=E*u+F*v+j*w+z-(k*u+n*v+p*w+z);z=H*(E*m+F*o+j*q+x-J)-(A*m+B*o+C*q+x-J)*w;F=(A*m+B*o+C*q+x-J)*y-I*(E*m+F*o+j*q+x-J);E=1.0/+D(+(F*F+((I*w-H*y)*(I*w-H*y)+z*z)));c[d+16>>2]=1065353216;c[d+16+4>>2]=1065353216;c[d+16+8>>2]=0;g[d+16+12>>2]=0.0;b=c[a+8>>2]|0;e=c[(c[b>>2]|0)+16>>2]|0;g[d>>2]=E*(I*w-H*y)+f;g[d+4>>2]=E*z+h;g[d+8>>2]=E*F+i;g[d+12>>2]=0.0;Vb[e&127](b,d+32|0,d,d+16|0);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;G=a+12|0;Vb[e&127](b,d+80|0,d+64|0,G);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](b,d+64|0,d+48|0,G);a=c[a+8>>2]|0;b=c[a>>2]|0;b=b+16|0;b=c[b>>2]|0;Vb[b&127](a,d+48|0,d+80|0,G);l=d;return}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0.0;a=l;l=l+144|0;switch(c[b+448>>2]&15){case 1:{c[a+112>>2]=3572;h=c[d+8>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;i=c[d+12>>2]|0;j=+g[i+48>>2];e=+g[i+52>>2];f=+g[i+56>>2];f=+D(+((j-j)*(j-j)+(e-e)*(e-e)+(f-f)*(f-f)));i=c[b+192>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+96|0,a+64|0);c[a>>2]=c[a+96>>2];c[a+4>>2]=c[a+96+4>>2];c[a+8>>2]=c[a+96+8>>2];c[a+12>>2]=c[a+96+12>>2];c[a+16>>2]=c[a+64>>2];c[a+16+4>>2]=c[a+64+4>>2];c[a+16+8>>2]=c[a+64+8>>2];c[a+16+12>>2]=c[a+64+12>>2];c[a+32>>2]=c[a>>2];c[a+32+4>>2]=c[a+4>>2];c[a+32+8>>2]=c[a+8>>2];c[a+32+12>>2]=c[a+12>>2];c[a+32+16>>2]=c[a+16>>2];c[a+32+20>>2]=c[a+20>>2];c[a+32+24>>2]=c[a+24>>2];c[a+32+28>>2]=c[a+28>>2];g[a+32>>2]=+g[a+32>>2]-e;g[a+32+4>>2]=+g[a+32+4>>2]-e;g[a+32+8>>2]=+g[a+32+8>>2]-e;g[a+32+16>>2]=e+ +g[a+32+16>>2];g[a+32+20>>2]=e+ +g[a+32+20>>2];g[a+32+24>>2]=e+ +g[a+32+24>>2];c[a+112+4>>2]=b;c[a+112+8>>2]=d;c[a+112+12>>2]=h;g[a+112+16>>2]=f+e;g[a+112+20>>2]=e;Bf(c[b+988>>2]|0,a+32|0,a+112|0);l=a;return}case 2:{g[a+4>>2]=1.0;c[a+8+4>>2]=0;c[a+8+4+4>>2]=0;c[a+8+4+8>>2]=0;c[a>>2]=3608;c[a+24>>2]=b;c[a+28>>2]=d;c[a+8>>2]=c[b+516>>2];i=c[d+4>>2]|0;j=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+192>>2]|0;j=j+ +nb[c[(c[i>>2]|0)+48>>2]&15](i);g[a+12>>2]=j;f=+g[(c[d+8>>2]|0)+228>>2];g[a+112>>2]=f;c[a+16>>2]=c[(+g[b+376>>2]>2];i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+112|0,a+96|0);c[a+32>>2]=c[a+112>>2];c[a+32+4>>2]=c[a+112+4>>2];c[a+32+8>>2]=c[a+112+8>>2];c[a+32+12>>2]=c[a+112+12>>2];c[a+32+16>>2]=c[a+96>>2];c[a+32+16+4>>2]=c[a+96+4>>2];c[a+32+16+8>>2]=c[a+96+8>>2];c[a+32+16+12>>2]=c[a+96+12>>2];c[a+64>>2]=c[a+32>>2];c[a+64+4>>2]=c[a+32+4>>2];c[a+64+8>>2]=c[a+32+8>>2];c[a+64+12>>2]=c[a+32+12>>2];c[a+64+16>>2]=c[a+32+16>>2];c[a+64+20>>2]=c[a+32+20>>2];c[a+64+24>>2]=c[a+32+24>>2];c[a+64+28>>2]=c[a+32+28>>2];g[a+64>>2]=+g[a+64>>2]-j;g[a+64+4>>2]=+g[a+64+4>>2]-j;g[a+64+8>>2]=+g[a+64+8>>2]-j;g[a+64+16>>2]=j+ +g[a+64+16>>2];g[a+64+20>>2]=j+ +g[a+64+20>>2];g[a+64+24>>2]=j+ +g[a+64+24>>2];Bf(c[b+1068>>2]|0,a+64|0,a);l=a;return}default:{l=a;return}}}function He(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+48>>2]=c[f>>2];c[b+48+4>>2]=c[f+4>>2];c[b+48+8>>2]=c[f+8>>2];c[b+48+12>>2]=c[f+12>>2];c[b+64>>2]=c[f+16>>2];c[b+64+4>>2]=c[f+16+4>>2];c[b+64+8>>2]=c[f+16+8>>2];c[b+64+12>>2]=c[f+16+12>>2];c[b+80>>2]=c[f+32>>2];c[b+80+4>>2]=c[f+32+4>>2];c[b+80+8>>2]=c[f+32+8>>2];c[b+80+12>>2]=c[f+32+12>>2];c[b+96>>2]=c[f+48>>2];c[b+96+4>>2]=c[f+48+4>>2];c[b+96+8>>2]=c[f+48+8>>2];c[b+96+12>>2]=c[f+48+12>>2];c[b+112>>2]=c[h>>2];c[b+112+4>>2]=c[h+4>>2];c[b+112+8>>2]=c[h+8>>2];c[b+112+12>>2]=c[h+12>>2];c[b+128>>2]=c[h+16>>2];c[b+128+4>>2]=c[h+16+4>>2];c[b+128+8>>2]=c[h+16+8>>2];c[b+128+12>>2]=c[h+16+12>>2];c[b+144>>2]=c[h+32>>2];c[b+144+4>>2]=c[h+32+4>>2];c[b+144+8>>2]=c[h+32+8>>2];c[b+144+12>>2]=c[h+32+12>>2];c[b+160>>2]=c[h+48>>2];c[b+160+4>>2]=c[h+48+4>>2];c[b+160+8>>2]=c[h+48+8>>2];c[b+160+12>>2]=c[h+48+12>>2];d=b+680|0;e=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=i&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);return}function Ie(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;c[e+16>>2]=c[a+20>>2];c[e+20>>2]=c[a+24>>2];c[e+24>>2]=c[a+28>>2];c[e+28>>2]=c[a+32>>2];c[e>>2]=c[a+4>>2];c[e+4>>2]=c[a+8>>2];c[e+8>>2]=c[a+12>>2];c[e+12>>2]=c[a+16>>2];c[e+32>>2]=c[a+36>>2];c[e+36>>2]=c[a+40>>2];c[e+40>>2]=c[a+44>>2];c[e+44>>2]=c[a+48>>2];c[e+48>>2]=c[a+56>>2];c[e+52>>2]=d[a+60>>0];k=c[a+88>>2]|0;c[e+56>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+96>>2]|0)|0;c[e+64>>2]=k;if(k|0){i=c[a+88>>2]|0;j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,48,i)|0;if((i|0)>0){g=c[j+8>>2]|0;h=0;while(1){k=c[a+96>>2]|0;c[g+16>>2]=c[k+(h<<6)+16>>2];c[g+20>>2]=c[k+(h<<6)+20>>2];c[g+24>>2]=c[k+(h<<6)+24>>2];c[g+28>>2]=c[k+(h<<6)+28>>2];c[g>>2]=c[k+(h<<6)>>2];c[g+4>>2]=c[k+(h<<6)+4>>2];c[g+8>>2]=c[k+(h<<6)+8>>2];c[g+12>>2]=c[k+(h<<6)+12>>2];c[g+32>>2]=c[k+(h<<6)+32>>2];c[g+36>>2]=c[k+(h<<6)+36>>2];c[g+40>>2]=c[k+(h<<6)+40>>2];c[g+44>>2]=0;h=h+1|0;if((h|0)==(i|0))break;else g=g+48|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,18364,1497453121,c[a+96>>2]|0)}}else c[e+64>>2]=0;k=c[a+128>>2]|0;c[e+60>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+136>>2]|0)|0;c[e+68>>2]=k;if(k|0){j=c[a+128>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[a+136>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h+12>>2]=c[g+(i<<4)+12>>2];b[h+6>>1]=b[g+(i<<4)+6>>1]|0;b[h+8>>1]=b[g+(i<<4)+8>>1]|0;b[h+10>>1]=b[g+(i<<4)+10>>1]|0;b[h>>1]=b[g+(i<<4)>>1]|0;b[h+2>>1]=b[g+(i<<4)+2>>1]|0;b[h+4>>1]=b[g+(i<<4)+4>>1]|0;i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[a+136>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18387,1497453121,g)}}else c[e+68>>2]=0;c[e+76>>2]=c[a+144>>2];k=c[a+152>>2]|0;c[e+80>>2]=k;if(!k){c[e+72>>2]=0;return 18431}k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+160>>2]|0)|0;c[e+72>>2]=k;if(!k)return 18431;j=c[a+152>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,j)|0;if((j|0)>0){g=c[a+160>>2]|0;h=c[k+8>>2]|0;i=0;while(1){b[h+14>>1]=b[g+(i<<5)+6>>1]|0;b[h+16>>1]=b[g+(i<<5)+8>>1]|0;b[h+18>>1]=b[g+(i<<5)+10>>1]|0;b[h+8>>1]=b[g+(i<<5)>>1]|0;b[h+10>>1]=b[g+(i<<5)+2>>1]|0;b[h+12>>1]=b[g+(i<<5)+4>>1]|0;c[h>>2]=c[g+(i<<5)+12>>2];c[h+4>>2]=c[g+(i<<5)+16>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+20|0}}else g=c[a+160>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18410,1497453121,g);return 18431}function Je(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0;if(!b)b=0;else b=(c[b+252>>2]&2|0)==0?0:b;c[a+64>>2]=0;c[a+64+4>>2]=0;c[a+64+8>>2]=0;c[a+64+12>>2]=0;c[a+64+16>>2]=0;c[a+64+20>>2]=0;c[a+64+24>>2]=0;c[a+64+28>>2]=0;c[a+144>>2]=0;c[a+144+4>>2]=0;c[a+144+8>>2]=0;c[a+144+12>>2]=0;c[a+144+16>>2]=0;c[a+144+20>>2]=0;c[a+144+24>>2]=0;c[a+144+28>>2]=0;if(!b){c[a>>2]=1065353216;c[a+4>>2]=0;c[a+4+4>>2]=0;c[a+4+8>>2]=0;c[a+4+12>>2]=0;c[a+20>>2]=1065353216;c[a+24>>2]=0;c[a+24+4>>2]=0;c[a+24+8>>2]=0;c[a+24+12>>2]=0;c[a+40>>2]=1065353216;c[a+44>>2]=0;c[a+44+4>>2]=0;c[a+44+8>>2]=0;c[a+44+12>>2]=0;c[a+44+16>>2]=0;c[a+240>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+96>>2]=1065353216;c[a+100>>2]=1065353216;c[a+104>>2]=1065353216;g[a+108>>2]=0.0;c[a+112>>2]=1065353216;c[a+116>>2]=1065353216;c[a+120>>2]=1065353216;g[a+124>>2]=0.0;b=a+176|0;e=b+60|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));a=a+236|0;g[a>>2]=0.0;return}else{e=b+4|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];e=b+20|0;c[a+16>>2]=c[e>>2];c[a+16+4>>2]=c[e+4>>2];c[a+16+8>>2]=c[e+8>>2];c[a+16+12>>2]=c[e+12>>2];e=b+36|0;c[a+32>>2]=c[e>>2];c[a+32+4>>2]=c[e+4>>2];c[a+32+8>>2]=c[e+8>>2];c[a+32+12>>2]=c[e+12>>2];e=b+52|0;c[a+48>>2]=c[e>>2];c[a+48+4>>2]=c[e+4>>2];c[a+48+8>>2]=c[e+8>>2];c[a+48+12>>2]=c[e+12>>2];e=b+404|0;k=+g[e>>2];l=b+408|0;j=k*+g[b+412>>2];i=k*+g[b+416>>2];g[a+128>>2]=k*+g[l>>2];g[a+132>>2]=j;g[a+136>>2]=i;g[a+140>>2]=0.0;c[a+240>>2]=b;m=b+604|0;c[a+96>>2]=c[m>>2];c[a+96+4>>2]=c[m+4>>2];c[a+96+8>>2]=c[m+8>>2];c[a+96+12>>2]=c[m+12>>2];c[a+112>>2]=c[l>>2];c[a+112+4>>2]=c[l+4>>2];c[a+112+8>>2]=c[l+8>>2];c[a+112+12>>2]=c[l+12>>2];l=b+372|0;c[a+176>>2]=c[l>>2];c[a+176+4>>2]=c[l+4>>2];c[a+176+8>>2]=c[l+8>>2];c[a+176+12>>2]=c[l+12>>2];l=b+388|0;c[a+192>>2]=c[l>>2];c[a+192+4>>2]=c[l+4>>2];c[a+192+8>>2]=c[l+8>>2];c[a+192+12>>2]=c[l+12>>2];i=+g[e>>2];j=i*+g[b+476>>2]*d;k=i*+g[b+480>>2]*d;g[a+208>>2]=i*+g[b+472>>2]*d;g[a+212>>2]=j;g[a+216>>2]=k;g[a+220>>2]=0.0;k=+g[b+488>>2];j=+g[b+492>>2];i=+g[b+496>>2];h=(k*+g[b+328>>2]+j*+g[b+344>>2]+i*+g[b+360>>2])*d;f=(k*+g[b+332>>2]+j*+g[b+348>>2]+i*+g[b+364>>2])*d;g[a+224>>2]=(+g[b+324>>2]*k+ +g[b+340>>2]*j+ +g[b+356>>2]*i)*d;g[a+228>>2]=h;g[a+232>>2]=f;a=a+236|0;g[a>>2]=0.0;return}}function Ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0;M=l;l=l+64|0;c[M+48>>2]=a;c[M+48+4>>2]=b;c[M+48+8>>2]=d;L=+g[a>>2];z=+g[b>>2];A=+g[a+4>>2];B=+g[b+4>>2];C=+g[a+8>>2];E=+g[b+8>>2];g[M>>2]=L-z;g[M+4>>2]=A-B;g[M+8>>2]=C-E;g[M+12>>2]=0.0;F=+g[d>>2];G=+g[d+4>>2];H=+g[d+8>>2];g[M+16>>2]=z-F;g[M+20>>2]=B-G;g[M+24>>2]=E-H;g[M+28>>2]=0.0;g[M+32>>2]=F-L;g[M+36>>2]=G-A;g[M+40>>2]=H-C;g[M+44>>2]=0.0;I=(A-B)*(E-H)-(C-E)*(B-G);J=(C-E)*(z-F)-(E-H)*(L-z);K=(B-G)*(L-z)-(A-B)*(z-F);if(K*K+(I*I+J*J)>0.0){k=0;x=-1.0;y=0;m=0;h=0;o=A-B;p=C-E;i=L-z;u=L;v=A;w=C}else{L=-1.0;l=M;return +L}while(1){if(u*(K*o-J*p)+v*(I*p-K*i)+(J*i-I*o)*w>0.0){n=c[5288+(y<<2)>>2]|0;N=c[M+48+(n<<2)>>2]|0;r=+g[N>>2];i=r-u;s=+g[N+4>>2];p=s-v;t=+g[N+8>>2];q=t-w;do if(i*i+p*p+q*q>0.0){o=-(u*i+v*p+w*q)/(i*i+p*p+q*q);if(o>=1.0){k=2;i=r*r+s*s+t*t;m=0;h=1065353216;break}if(!(o<=0.0)){h=(g[j>>2]=o,c[j>>2]|0);u=u+i*o;i=v+p*o;w=w+q*o;k=3;i=w*w+(u*u+i*i);m=(g[j>>2]=1.0-o,c[j>>2]|0);break}else{k=1;i=u*u+v*v+w*w;m=1065353216;h=0;break}}else i=-1.0;while(0);if(x<0.0|i>2]=(k&1|0?1<>2]=m;c[e+(n<<2)>>2]=h;g[e+(c[5288+(n<<2)>>2]<<2)>>2]=0.0}else i=x}else i=x;n=y+1|0;if((n|0)==3)break;N=c[M+48+(n<<2)>>2]|0;x=i;y=n;o=+g[M+(n<<4)+4>>2];p=+g[M+(n<<4)+8>>2];i=+g[M+(n<<4)>>2];u=+g[N>>2];v=+g[N+4>>2];w=+g[N+8>>2]}if(!(i<0.0)){L=i;l=M;return +L}w=+D(+(K*K+(I*I+J*J)));x=(I*+g[a>>2]+J*+g[a+4>>2]+K*+g[a+8>>2])/(K*K+(I*I+J*J));c[f>>2]=7;u=+g[b>>2]-I*x;t=+g[b+4>>2]-J*x;v=+g[b+8>>2]-K*x;E=+D(+((t*(z-F)-u*(B-G))*(t*(z-F)-u*(B-G))+(((B-G)*v-t*(E-H))*((B-G)*v-t*(E-H))+(u*(E-H)-v*(z-F))*(u*(E-H)-v*(z-F)))))/w;g[e>>2]=E;z=+g[d>>2]-I*x;v=+g[d+4>>2]-J*x;B=+g[d+8>>2]-K*x;L=+D(+((v*(F-L)-z*(G-A))*(v*(F-L)-z*(G-A))+(((G-A)*B-v*(H-C))*((G-A)*B-v*(H-C))+(z*(H-C)-B*(F-L))*(z*(H-C)-B*(F-L)))))/w;g[e+4>>2]=L;g[e+8>>2]=1.0-(L+E);L=K*x*K*x+(I*x*I*x+J*x*J*x);l=M;return +L}function Le(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;d=l;l=l+144|0;g[a+36>>2]=0.0;c[d+128>>2]=0;c[d+128+4>>2]=0;c[d+128+8>>2]=0;c[d+128+12>>2]=0;b=0;do{e=d+128+(b<<2)|0;g[e>>2]=1.0;A=c[a+28>>2]|0;I=c[A+4>>2]|0;c[d+80>>2]=I;F=c[A+20>>2]|0;c[d+80+4>>2]=F;C=c[A+36>>2]|0;c[d+80+8>>2]=C;g[d+80+12>>2]=0.0;H=c[A+8>>2]|0;c[d+80+16>>2]=H;E=c[A+24>>2]|0;c[d+80+20>>2]=E;B=c[A+40>>2]|0;c[d+80+24>>2]=B;g[d+80+28>>2]=0.0;G=c[A+12>>2]|0;c[d+80+32>>2]=G;D=c[A+28>>2]|0;c[d+80+36>>2]=D;z=c[A+44>>2]|0;c[d+80+40>>2]=z;g[d+80+44>>2]=0.0;f=c[a+32>>2]|0;y=c[f+4>>2]|0;c[d+32>>2]=y;v=c[f+20>>2]|0;c[d+32+4>>2]=v;s=c[f+36>>2]|0;c[d+32+8>>2]=s;g[d+32+12>>2]=0.0;x=c[f+8>>2]|0;c[d+32+16>>2]=x;u=c[f+24>>2]|0;c[d+32+20>>2]=u;r=c[f+40>>2]|0;c[d+32+24>>2]=r;g[d+32+28>>2]=0.0;w=c[f+12>>2]|0;c[d+32+32>>2]=w;t=c[f+28>>2]|0;c[d+32+36>>2]=t;h=c[f+44>>2]|0;c[d+32+40>>2]=h;g[d+32+44>>2]=0.0;p=+g[a+300>>2];m=p*(c[j>>2]=I,+g[j>>2]);i=+g[a+304>>2];m=m+i*(c[j>>2]=H,+g[j>>2]);k=+g[a+308>>2];m=m+k*(c[j>>2]=G,+g[j>>2]);q=p*(c[j>>2]=F,+g[j>>2]);q=q+i*(c[j>>2]=E,+g[j>>2]);q=q+k*(c[j>>2]=D,+g[j>>2]);p=p*(c[j>>2]=C,+g[j>>2]);i=p+i*(c[j>>2]=B,+g[j>>2]);p=+g[A+52>>2];o=+g[A+56>>2];n=+g[A+60>>2];n=i+k*(c[j>>2]=z,+g[j>>2])+n-n;g[d+16>>2]=m+p-p;g[d+16+4>>2]=q+o-o;g[d+16+8>>2]=n;g[d+16+12>>2]=0.0;n=+g[a+316>>2];o=n*(c[j>>2]=y,+g[j>>2]);q=+g[a+320>>2];o=o+q*(c[j>>2]=x,+g[j>>2]);p=+g[a+324>>2];o=o+p*(c[j>>2]=w,+g[j>>2]);m=n*(c[j>>2]=v,+g[j>>2]);m=m+q*(c[j>>2]=u,+g[j>>2]);m=m+p*(c[j>>2]=t,+g[j>>2]);n=n*(c[j>>2]=s,+g[j>>2]);q=n+q*(c[j>>2]=r,+g[j>>2]);n=+g[f+52>>2];k=+g[f+56>>2];i=+g[f+60>>2];i=q+p*(c[j>>2]=h,+g[j>>2])+i-i;g[d>>2]=o+n-n;g[d+4>>2]=m+k-k;g[d+8>>2]=i;g[d+12>>2]=0.0;h=c[a+28>>2]|0;f=c[a+32>>2]|0;Rg(a+48+(b*84|0)|0,d+80|0,d+32|0,d+16|0,d,d+128|0,h+456|0,+g[h+404>>2],f+456|0,+g[f+404>>2]);g[e>>2]=0.0;b=b+1|0}while((b|0)!=3);l=d;return}function Me(a,b,d){a=a|0;b=b|0;d=d|0;var f=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,r+28|0,r+24|0,r+20|0,r+16|0,r+12|0,r+8|0,r+4|0,r,b);n=(c[r+12>>2]|0)+(P(c[r+8>>2]|0,d)|0)|0;q=c[a+4>>2]|0;p=(c[r+20>>2]|0)==0;o=c[r+28>>2]|0;do if((c[r>>2]|0)==3){m=c[r+16>>2]|0;k=o+(P(m,e[n+4>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+32>>2]=j;g[r+32+36>>2]=i;g[r+32+40>>2]=f;g[r+32+44>>2]=0.0;k=o+(P(m,e[n+2>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+16>>2]=j;g[r+32+20>>2]=i;g[r+32+24>>2]=f;g[r+32+28>>2]=0.0;k=o+(P(m,e[n>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2];break}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3];break}}else{k=c[r+16>>2]|0;m=o+(P(k,c[n+8>>2]|0)|0)|0;if(p){i=+g[m+4>>2]*+g[q+8>>2];j=+g[m+8>>2]*+g[q+12>>2];g[r+32+32>>2]=+g[m>>2]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+g[p+4>>2]*+g[q+8>>2];i=+g[p+8>>2]*+g[q+12>>2];g[r+32+16>>2]=+g[p>>2]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+g[p+4>>2]*+g[q+8>>2];j=+g[p>>2]*+g[q+4>>2];f=+g[p+8>>2];break}else{i=+h[m+8>>3]*+g[q+8>>2];j=+h[m+16>>3]*+g[q+12>>2];g[r+32+32>>2]=+h[m>>3]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+h[p+8>>3]*+g[q+8>>2];i=+h[p+16>>3]*+g[q+12>>2];g[r+32+16>>2]=+h[p>>3]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+h[p+8>>3]*+g[q+8>>2];j=+h[p>>3]*+g[q+4>>2];f=+h[p+16>>3];break}}while(0);f=f*+g[q+12>>2];g[r+32>>2]=j;g[r+32+4>>2]=i;g[r+32+8>>2]=f;g[r+32+12>>2]=0.0;q=c[a+8>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,r+32|0,b,d);q=c[a+4>>2]|0;Ob[c[(c[q>>2]|0)+24>>2]&127](q,b);l=r;return}function Ne(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;c[b>>2]=9184;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=0;c[b+20>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;c[b+52>>2]=-1;c[b+56>>2]=0;c[b+60>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;c[b+164>>2]=0;a[b+153>>0]=0;a[b+154>>0]=1;a[b+152>>0]=((d|0)!=0^1)&1;g[b+100>>2]=0.0;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+128>>2]=0;c[b+132>>2]=0;g[b+136>>2]=0.0;if(d|0)n=0;else{c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Li(d);n=c[b+160>>2]|0}c[b+96>>2]=d;c[b+148>>2]=0;c[b+140>>2]=0;c[b+144>>2]=0;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;a[o+16>>0]=1;c[o+12>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;if((n|0)<=1){if((n|0)!=1){if((c[b+164>>2]|0)<1){c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)m=0;else{c[(d+4+15&-16)+-4>>2]=d;m=d+4+15&-16}e=c[b+160>>2]|0;if((e|0)>0){d=0;do{pj(m+(d*20|0)|0,(c[b+168>>2]|0)+(d*20|0)|0);d=d+1|0}while((d|0)!=(e|0));e=c[b+160>>2]|0;if((e|0)>0){d=0;do{h=c[b+168>>2]|0;i=h+(d*20|0)+4|0;j=h+(d*20|0)+12|0;k=c[j>>2]|0;f=h+(d*20|0)+16|0;if(k|0){if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[f>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(e|0))}}d=c[b+168>>2]|0;if(d|0){if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0}a[b+172>>0]=1;c[b+168>>2]=m;c[b+164>>2]=1;d=n}else d=n;while(1){pj((c[b+168>>2]|0)+(d*20|0)|0,o);if(!d)break;else d=d+1|0}d=c[o+12>>2]|0;c[b+160>>2]=1;if(!d){l=o;return}if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+12>>2]=0;l=o;return}}else{d=1;do{f=c[b+168>>2]|0;h=f+(d*20|0)+4|0;i=f+(d*20|0)+12|0;j=c[i>>2]|0;e=f+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[f+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(n|0))}c[b+160>>2]=1;l=o;return}function Oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;if(!(c[a+204>>2]&2)){c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];c[a+84>>2]=c[b+16>>2];c[a+84+4>>2]=c[b+16+4>>2];c[a+84+8>>2]=c[b+16+8>>2];c[a+84+12>>2]=c[b+16+12>>2];c[a+100>>2]=c[b+32>>2];c[a+100+4>>2]=c[b+32+4>>2];c[a+100+8>>2]=c[b+32+8>>2];c[a+100+12>>2]=c[b+32+12>>2];c[a+116>>2]=c[b+48>>2];c[a+116+4>>2]=c[b+48+4>>2];c[a+116+8>>2]=c[b+48+8>>2];c[a+116+12>>2]=c[b+48+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}else{c[a+68>>2]=c[a+4>>2];c[a+68+4>>2]=c[a+4+4>>2];c[a+68+8>>2]=c[a+4+8>>2];c[a+68+12>>2]=c[a+4+12>>2];c[a+84>>2]=c[a+20>>2];c[a+84+4>>2]=c[a+20+4>>2];c[a+84+8>>2]=c[a+20+8>>2];c[a+84+12>>2]=c[a+20+12>>2];c[a+100>>2]=c[a+36>>2];c[a+100+4>>2]=c[a+36+4>>2];c[a+100+8>>2]=c[a+36+8>>2];c[a+100+12>>2]=c[a+36+12>>2];c[a+116>>2]=c[a+52>>2];c[a+116+4>>2]=c[a+52+4>>2];c[a+116+8>>2]=c[a+52+8>>2];c[a+116+12>>2]=c[a+52+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}c[a+132>>2]=c[a+372>>2];c[a+132+4>>2]=c[a+372+4>>2];c[a+132+8>>2]=c[a+372+8>>2];c[a+132+12>>2]=c[a+372+12>>2];c[a+148>>2]=c[a+388>>2];c[a+148+4>>2]=c[a+388+4>>2];c[a+148+8>>2]=c[a+388+8>>2];c[a+148+12>>2]=c[a+388+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];w=+g[a+4>>2];q=+g[a+456>>2];v=+g[a+8>>2];o=+g[a+460>>2];u=+g[a+12>>2];m=+g[a+464>>2];t=+g[a+20>>2];s=+g[a+24>>2];r=+g[a+28>>2];p=+g[a+36>>2];n=+g[a+40>>2];l=+g[a+44>>2];g[a+324>>2]=w*w*q+v*v*o+u*u*m;g[a+328>>2]=w*q*t+v*o*s+u*m*r;g[a+332>>2]=w*q*p+v*o*n+u*m*l;g[a+336>>2]=0.0;g[a+340>>2]=w*q*t+v*o*s+u*m*r;g[a+344>>2]=t*q*t+s*o*s+r*m*r;g[a+348>>2]=q*t*p+o*s*n+m*r*l;g[a+352>>2]=0.0;g[a+356>>2]=w*q*p+v*o*n+u*m*l;g[a+360>>2]=t*q*p+s*o*n+r*m*l;g[a+364>>2]=p*q*p+n*o*n+l*m*l;g[a+368>>2]=0.0;return}function Pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(!(c[a>>2]|0)){c[a>>2]=d;c[d+32>>2]=0;return}f=c[b+40>>2]|0;if(!f)q=b;else{e=+g[d>>2]+ +g[d+16>>2];h=+g[d+4>>2]+ +g[d+20>>2];k=+g[d+8>>2]+ +g[d+24>>2];do{t=c[b+36>>2]|0;l=+C(+(e-(+g[t>>2]+ +g[t+16>>2])))+ +C(+(h-(+g[t+4>>2]+ +g[t+20>>2])))+ +C(+(k-(+g[t+8>>2]+ +g[t+24>>2])));b=c[b+36+((!(l<+C(+(e-(+g[f>>2]+ +g[f+16>>2])))+ +C(+(h-(+g[f+4>>2]+ +g[f+20>>2])))+ +C(+(k-(+g[f+8>>2]+ +g[f+24>>2]))))&1)<<2)>>2]|0;f=c[b+40>>2]|0}while((f|0)!=0);q=b}s=q+32|0;t=c[s>>2]|0;b=c[a+4>>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;i=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(i|0))}else c[a+4>>2]=0;c[b+32>>2]=t;c[b+36>>2]=0;n=b+40|0;c[n>>2]=0;o=q+16|0;f=c[(+g[d>>2]<+g[q>>2]?d:q)>>2]|0;c[b>>2]=f;i=c[(+g[d+16>>2]>+g[q+16>>2]?d+16|0:o)>>2]|0;c[b+16>>2]=i;r=c[(+g[d+4>>2]<+g[q+4>>2]?d:q)+4>>2]|0;c[b+4>>2]=r;m=c[(+g[d+20>>2]>+g[q+20>>2]?d+16|0:o)+4>>2]|0;c[b+20>>2]=m;p=c[(+g[d+8>>2]<+g[q+8>>2]?d:q)+8>>2]|0;c[b+8>>2]=p;o=c[(+g[d+24>>2]>+g[q+24>>2]?d+16|0:o)+8>>2]|0;c[b+24>>2]=o;if(!t){c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;c[a>>2]=b;return}c[t+36+(((c[(c[s>>2]|0)+40>>2]|0)==(q|0)&1)<<2)>>2]=b;c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;b=p;n=r;while(1){u=(c[j>>2]=f,+g[j>>2]);l=(c[j>>2]=b,+g[j>>2]);k=(c[j>>2]=i,+g[j>>2]);h=(c[j>>2]=m,+g[j>>2]);e=(c[j>>2]=o,+g[j>>2]);if(+g[t>>2]<=u){b=t+4|0;if((((+g[b>>2]<=(c[j>>2]=n,+g[j>>2])?+g[t+8>>2]<=l:0)?+g[t+16>>2]>=k:0)?+g[t+20>>2]>=h:0)?+g[t+24>>2]>=e:0){b=22;break}}else b=t+4|0;d=c[t+36>>2]|0;o=c[t+40>>2]|0;f=c[(+g[d>>2]<+g[o>>2]?d:o)>>2]|0;c[t>>2]=f;i=c[(+g[d+16>>2]>+g[o+16>>2]?d+16|0:o+16|0)>>2]|0;c[t+16>>2]=i;n=c[(+g[d+4>>2]<+g[o+4>>2]?d:o)+4>>2]|0;c[b>>2]=n;m=c[(+g[d+20>>2]>+g[o+20>>2]?d+16|0:o+16|0)+4>>2]|0;c[t+20>>2]=m;b=c[(+g[d+8>>2]<+g[o+8>>2]?d:o)+8>>2]|0;c[t+8>>2]=b;o=c[(+g[d+24>>2]>+g[o+24>>2]?d+16|0:o+16|0)+8>>2]|0;c[t+24>>2]=o;t=c[t+32>>2]|0;if(!t){b=22;break}}if((b|0)==22)return}function Qe(){if(a[22504]|0)return;if(!(Uz(22504)|0))return;c[6161]=0;c[6162]=-2147483648;c[6163]=-1082130432;g[6164]=0.0;c[6165]=1060716128;c[6166]=-1090087446;c[6167]=-1092290076;g[6168]=0.0;c[6169]=-1098022214;c[6170]=-1084636126;c[6171]=-1092290076;g[6172]=0.0;c[6173]=-1083901670;c[6174]=-2147483648;c[6175]=-1092290177;g[6176]=0.0;c[6177]=-1098022214;c[6178]=1062847522;c[6179]=-1092290043;g[6180]=0.0;c[6181]=1060716128;c[6182]=1057396202;c[6183]=-1092290076;g[6184]=0.0;c[6185]=1049461434;c[6186]=-1084636126;c[6187]=1055193605;g[6188]=0.0;c[6189]=-1086767520;c[6190]=-1090087446;c[6191]=1055193572;g[6192]=0.0;c[6193]=-1086767520;c[6194]=1057396202;c[6195]=1055193572;g[6196]=0.0;c[6197]=1049461434;c[6198]=1062847522;c[6199]=1055193572;g[6200]=0.0;c[6201]=1063581978;c[6202]=0;c[6203]=1055193471;g[6204]=0.0;c[6205]=-2147483648;c[6206]=0;c[6207]=1065353216;g[6208]=0.0;c[6209]=1054458864;c[6210]=-1096927567;c[6211]=-1084636042;g[6212]=0.0;c[6213]=-1104782626;c[6214]=-1090519208;c[6215]=-1084636042;g[6216]=0.0;c[6217]=1049007812;c[6218]=-1085334679;c[6219]=-1090087228;g[6220]=0.0;c[6221]=1054458864;c[6222]=1050556081;c[6223]=-1084636042;g[6224]=0.0;c[6225]=1062847505;c[6226]=-2147483648;c[6227]=-1090087262;g[6228]=0.0;c[6229]=-1090087362;c[6230]=-2147483648;c[6231]=-1084636076;g[6232]=0.0;c[6233]=-1087361736;c[6234]=-1090519141;c[6235]=-1090087262;g[6236]=0.0;c[6237]=-1104782626;c[6238]=1056964440;c[6239]=-1084636042;g[6240]=0.0;c[6241]=-1087361736;c[6242]=1056964507;c[6243]=-1090087262;g[6244]=0.0;c[6245]=1049007812;c[6246]=1062148969;c[6247]=-1090087228;g[6248]=0.0;c[6249]=1064532105;c[6250]=1050556148;c[6251]=0;g[6252]=0.0;c[6253]=1064532105;c[6254]=-1096927500;c[6255]=0;g[6256]=0.0;c[6257]=1058437413;c[6258]=-1085334595;c[6259]=0;g[6260]=0.0;c[6261]=0;c[6262]=-1082130432;c[6263]=0;g[6264]=0.0;c[6265]=-1089046235;c[6266]=-1085334595;c[6267]=0;g[6268]=0.0;c[6269]=-1082951543;c[6270]=-1096927500;c[6271]=-2147483648;g[6272]=0.0;c[6273]=-1082951543;c[6274]=1050556148;c[6275]=-2147483648;g[6276]=0.0;c[6277]=-1089046235;c[6278]=1062149053;c[6279]=-2147483648;g[6280]=0.0;c[6281]=-2147483648;c[6282]=1065353216;c[6283]=-2147483648;g[6284]=0.0;c[6285]=1058437413;c[6286]=1062149053;c[6287]=-2147483648;g[6288]=0.0;c[6289]=1060121912;c[6290]=-1090519141;c[6291]=1057396386;g[6292]=0.0;c[6293]=-1098475836;c[6294]=-1085334679;c[6295]=1057396420;g[6296]=0.0;c[6297]=-1084636143;c[6298]=0;c[6299]=1057396386;g[6300]=0.0;c[6301]=-1098475836;c[6302]=1062148969;c[6303]=1057396420;g[6304]=0.0;c[6305]=1060121912;c[6306]=1056964507;c[6307]=1057396386;g[6308]=0.0;c[6309]=1057396286;c[6310]=0;c[6311]=1062847572;g[6312]=0.0;c[6313]=1042701022;c[6314]=-1090519208;c[6315]=1062847606;g[6316]=0.0;c[6317]=-1093024784;c[6318]=-1096927567;c[6319]=1062847606;g[6320]=0.0;c[6321]=-1093024784;c[6322]=1050556081;c[6323]=1062847606;g[6324]=0.0;c[6325]=1042701022;c[6326]=1056964440;c[6327]=1062847606;g[6328]=0.0;return}function Re(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=+e;f=+f;h=+h;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0;V=l;l=l+32|0;z=+g[d>>2];B=+g[d+4>>2];A=+g[d+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2];q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];K=1.0/+D(+((e-z)*(e-z)+(f-B)*(f-B)+(h-A)*(h-A)));L=(e-z)*K==0.0?999999984306749440.0:1.0/((e-z)*K);M=(f-B)*K==0.0?999999984306749440.0:1.0/((f-B)*K);N=(h-A)*K==0.0?999999984306749440.0:1.0/((h-A)*K);O=(z>e?e:z)+v;P=(B>f?f:B)+t;Q=(A>h?h:A)+r;R=(z>2]|0;a:do if((o|0)>0){x=c[a+96>>2]|0;k=0;w=0;while(1){k=k+1|0;c[V>>2]=c[x>>2];c[V+4>>2]=c[x+4>>2];c[V+8>>2]=c[x+8>>2];c[V+12>>2]=c[x+12>>2];p=x+16|0;c[V+16>>2]=c[p>>2];c[V+16+4>>2]=c[p+4>>2];c[V+16+8>>2]=c[p+8>>2];c[V+16+12>>2]=c[p+12>>2];g[V>>2]=+g[V>>2]-q;g[V+4>>2]=+g[V+4>>2]-s;g[V+8>>2]=+g[V+8>>2]-u;g[V+16>>2]=+g[V+16>>2]-v;g[V+20>>2]=+g[V+20>>2]-t;g[V+24>>2]=+g[V+24>>2]-r;if(!(O>+g[p>>2])?!(R<+g[x>>2]):0)m=1;else m=0;if(!(!(Q>+g[x+24>>2])?!(T<+g[x+8>>2]):0))m=0;if(((!(P>+g[x+20>>2])?!(S<+g[x+4>>2]|m^1):0)?(E=+g[d>>2],C=L*(+g[V+((L<0.0&1)<<4)>>2]-E),E=L*(+g[V+((L<0.0^1)<<4)>>2]-E),G=+g[d+4>>2],F=M*(+g[V+((M<0.0&1)<<4)+4>>2]-G),G=M*(+g[V+((M<0.0^1)<<4)+4>>2]-G),!(F>E|C>G)):0)?(H=F>C?F:C,y=G>2],I=N*(+g[V+((N<0.0&1)<<4)+8>>2]-J),J=N*(+g[V+((N<0.0^1)<<4)+8>>2]-J),!(I>y|H>J)):0){m=(J0.0?(I>H?I:H)<(h-A)*(h-A)*K+((e-z)*(e-z)*K+(f-B)*(f-B)*K):0;n=c[x+32>>2]|0;if(m&(n|0)==-1){Sb[c[(c[b>>2]|0)+8>>2]&127](b,c[x+36>>2]|0,c[x+40>>2]|0);n=1;o=c[a+56>>2]|0}else{p=(n|0)==-1;U=16}}else{n=c[x+32>>2]|0;p=(n|0)==-1;m=0;U=16}if((U|0)==16){U=0;n=p|m?1:n}m=n+w|0;if((m|0)>=(o|0))break a;x=x+(n<<6)|0;w=m;q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2]}}else k=0;while(0);if((c[6160]|0)>=(k|0)){l=V;return}c[6160]=k;l=V;return}function Se(a,b,d,e,f,h){a=a|0;b=b|0;d=+d;e=+e;f=+f;h=h|0;var i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;a:while(1){if((b|0)>0){i=-1;j=0;do{do if(c[h+(j<<2)>>2]|0){if((i|0)!=-1?!(+g[a+(j<<4)>>2]*d+ +g[a+(j<<4)+4>>2]*e+ +g[a+(j<<4)+8>>2]*f>+g[a+(i<<4)>>2]*d+ +g[a+(i<<4)+4>>2]*e+ +g[a+(i<<4)+8>>2]*f):0)break;i=j}while(0);j=j+1|0}while((j|0)!=(b|0))}else i=-1;A=h+(i<<2)|0;if((c[A>>2]|0)==3){B=36;break}k=+D(+((e-f*0.0)*(e-f*0.0)+(f*0.0-d)*(f*0.0-d)+(d*0.0-e*0.0)*(d*0.0-e*0.0)));l=+D(+((d-e*0.0)*(d-e*0.0)+((e*0.0-f)*(e*0.0-f)+(f*0.0-d*0.0)*(f*0.0-d*0.0))));if(k>l){y=(d*0.0-e*0.0)*(1.0/k);z=(f*0.0-d)*(1.0/k);s=(e-f*0.0)*(1.0/k)}else{y=(d-e*0.0)*(1.0/l);z=(f*0.0-d*0.0)*(1.0/l);s=(e*0.0-f)*(1.0/l)}t=z*f-y*e;u=y*d-s*f;v=s*e-z*d;w=(i|0)==-1;r=0;j=-1;while(1){x=+(r|0);q=+G(+(x*.01745329238474369));o=+F(+(x*.01745329238474369));k=(s*q+t*o)*.02500000037252903+d;l=(z*q+u*o)*.02500000037252903+e;o=(y*q+v*o)*.02500000037252903+f;if((b|0)>0){m=-1;n=0;do{do if(c[h+(n<<2)>>2]|0){if((m|0)!=-1?!(k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]>k*+g[a+(m<<4)>>2]+l*+g[a+(m<<4)+4>>2]+o*+g[a+(m<<4)+8>>2]):0)break;m=n}while(0);n=n+1|0}while((n|0)!=(b|0))}else m=-1;if((j|0)==(i|0)&(m|0)==(i|0))break a;b:do if(!((j|0)==-1|(j|0)==(m|0))?x+-40.0<=x:0){if((b|0)>0)q=x+-40.0;else{k=x+-40.0;while(1){if((j|0)==(i|0)&w){i=-1;break a}k=k+5.0;if(!(k<=x))break b;else j=-1}}while(1){o=q*.01745329238474369;C=+G(+o);o=+F(+o);k=(s*C+t*o)*.02500000037252903+d;l=(z*C+u*o)*.02500000037252903+e;o=(y*C+v*o)*.02500000037252903+f;n=-1;p=0;do{do if(c[h+(p<<2)>>2]|0){if((n|0)!=-1?!(k*+g[a+(p<<4)>>2]+l*+g[a+(p<<4)+4>>2]+o*+g[a+(p<<4)+8>>2]>k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]):0)break;n=p}while(0);p=p+1|0}while((p|0)!=(b|0));if((j|0)==(i|0)&(n|0)==(i|0))break a;q=q+5.0;if(!(q<=x))break;else j=n}}while(0);r=r+45|0;if((r|0)>360)break;else j=m}c[A>>2]=0}if((B|0)==36)return i|0;c[h+(i<<2)>>2]=3;B=i;return B|0}function Te(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0;m=c[b+472>>2]|0;Sb[c[(c[m>>2]|0)+16>>2]&127](m,b+344|0,0);m=c[b+472>>2]|0;xb[c[(c[m>>2]|0)+12>>2]&127](m)|0;Hj(b,d);m=c[b+348>>2]|0;if((m|0)>0){f=c[b+356>>2]|0;e=0;k=0;do{l=c[(c[f+(e<<2)>>2]|0)+444>>2]|0;k=(k|0)>(l|0)?k:l;e=e+1|0}while((e|0)!=(m|0));e=0;while(1){h=c[f+(e<<2)>>2]|0;if((c[h+912>>2]|0)>0){f=0;do{l=c[(c[h+920>>2]|0)+(f<<2)>>2]|0;Mb[c[(c[l>>2]|0)+8>>2]&15](l,+g[h+512>>2],k);f=f+1|0}while((f|0)<(c[h+912>>2]|0))}e=e+1|0;if((e|0)==(m|0))break;f=c[b+356>>2]|0}if((k|0)>0){h=0;do{e=0;do{i=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;j=c[i+912>>2]|0;if((j|0)>0){f=0;do{l=c[(c[i+920>>2]|0)+(f<<2)>>2]|0;Kb[c[(c[l>>2]|0)+12>>2]&7](l,+g[i+512>>2],1.0);f=f+1|0}while((f|0)!=(j|0))}e=e+1|0}while((e|0)!=(m|0));h=h+1|0}while((h|0)!=(k|0));k=0}else k=0;do{l=c[(c[b+356>>2]|0)+(k<<2)>>2]|0;if((c[l+912>>2]|0)>0){e=0;do{f=c[(c[l+920>>2]|0)+(e<<2)>>2]|0;Jb[c[(c[f>>2]|0)+16>>2]&31](f,+g[l+512>>2]);f=c[l+920>>2]|0;h=c[f+(e<<2)>>2]|0;if(a[h+152>>0]|0){if(!h)j=f;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);j=c[l+920>>2]|0}i=e+-1|0;f=c[l+912>>2]|0;a:do if((f|0)>0){h=c[j+(e<<2)>>2]|0;e=0;while(1){if((c[j+(e<<2)>>2]|0)==(h|0))break a;e=e+1|0;if((e|0)>=(f|0)){e=f;break}}}else e=f;while(0);if((f|0)>(e|0)){h=j+(e<<2)|0;e=c[h>>2]|0;c[h>>2]=c[j+(f+-1<<2)>>2];c[(c[l+920>>2]|0)+(f+-1<<2)>>2]=e;c[l+912>>2]=f+-1;e=i;f=f+-1|0}else e=i}else f=c[l+912>>2]|0;e=e+1|0}while((e|0)<(f|0))}k=k+1|0}while((k|0)!=(m|0))}m=c[b+472>>2]|0;Jb[c[(c[m>>2]|0)+28>>2]&31](m,+g[m+12>>2]*d);if((c[b+348>>2]|0)<=0){b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}e=0;do{m=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;Wh(m,m);e=e+1|0}while((e|0)<(c[b+348>>2]|0));b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}function Ue(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0;I=l;l=l+544|0;if(!a){l=I;return}f=+g[b>>2];G=+g[d>>2]-f;k=+g[b+4>>2];B=+g[d+4>>2]-k;v=+g[d+8>>2]-+g[b+8>>2];w=1.0/+D(+(G*G+B*B+v*v));x=G*w==0.0?999999984306749440.0:1.0/(G*w);y=B*w==0.0?999999984306749440.0:1.0/(B*w);z=v*w==0.0?999999984306749440.0:1.0/(v*w);c[I+32>>2]=a;p=1;o=126;h=128;r=I+32|0;i=128;u=0;while(1){s=p+-1|0;t=c[r+(s<<2)>>2]|0;c[I>>2]=c[t>>2];c[I+4>>2]=c[t+4>>2];c[I+8>>2]=c[t+8>>2];c[I+12>>2]=c[t+12>>2];c[I+16>>2]=c[t+16>>2];c[I+16+4>>2]=c[t+16+4>>2];c[I+16+8>>2]=c[t+16+8>>2];c[I+16+12>>2]=c[t+16+12>>2];n=x*(+g[I+((x<0.0&1)<<4)>>2]-f);j=x*(+g[I+((x<0.0^1)<<4)>>2]-f);m=y*(+g[I+((y<0.0&1)<<4)+4>>2]-k);f=y*(+g[I+((y<0.0^1)<<4)+4>>2]-k);do if((!(m>j|n>f)?(C=m>n?m:n,A=f>2],E=z*(+g[I+((z<0.0&1)<<4)+8>>2]-F),F=z*(+g[I+((z<0.0^1)<<4)+8>>2]-F),!(E>A|C>F)):0)?((F0.0?(E>C?E:C)>2]|0)){Ob[c[(c[e>>2]|0)+12>>2]&127](e,t);p=s;d=r;a=u;break}if((s|0)>(o|0)){q=i<<1;if((i|0)<(q|0)){do if((h|0)<(q|0)){if(i){c[6995]=(c[6995]|0)+1;d=sc((i<<3|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}if((i|0)>0){a=0;do{c[d+(a<<2)>>2]=c[r+(a<<2)>>2];a=a+1|0}while((a|0)!=(i|0));if(!(u<<24>>24)){h=q;a=1;break}}else H=15}else{d=0;H=15}if((H|0)==15){H=0;if(u<<24>>24==0|(r|0)==0){h=q;a=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);h=q;a=1}else{d=r;a=u}while(0);Yk(d+(i<<2)|0,0,i<<2|0)|0}else{d=r;a=u}o=q+-2|0;i=q}else{d=r;a=u}c[d+(s<<2)>>2]=c[t+36>>2];c[d+(p<<2)>>2]=c[t+40>>2];p=p+1|0}else{p=s;d=r;a=u}while(0);if(!p)break;r=d;u=a;f=+g[b>>2];k=+g[b+4>>2]}if(a<<24>>24==0|(d|0)==0){l=I;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);l=I;return}function Ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;d=m+(i*104|0)+8|0;j=+g[b>>2]*+g[d>>2];g[d>>2]=j;d=m+(i*104|0)+12|0;k=+g[b+4>>2]*+g[d>>2];g[d>>2]=k;d=m+(i*104|0)+16|0;l=+g[b+8>>2]*+g[d>>2];g[d>>2]=l;d=m+(i*104|0)+24|0;g[d>>2]=+g[b>>2]*+g[d>>2];d=m+(i*104|0)+28|0;g[d>>2]=+g[b+4>>2]*+g[d>>2];d=m+(i*104|0)+32|0;g[d>>2]=+g[b+8>>2]*+g[d>>2];m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;k=+nb[c[(c[o>>2]|0)+48>>2]&15](o);n=+g[d+4>>2]-k;l=+g[d+8>>2]-k;g[a+952>>2]=+g[d>>2]-k;g[a+956>>2]=n;g[a+960>>2]=l;g[a+964>>2]=0.0;l=k+ +g[d+20>>2];n=k+ +g[d+24>>2];g[a+968>>2]=k+ +g[d+16>>2];g[a+972>>2]=l;g[a+976>>2]=n;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;k=+g[m+8>>2]-+g[o+8>>2];l=+g[m+12>>2]-+g[o+12>>2];n=+g[m+16>>2]-+g[o+16>>2];n=+D(+(k*k+l*l+n*n));g[f+(d*52|0)+32>>2]=n;g[f+(d*52|0)+44>>2]=n*n;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);return}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0;o=l;l=l+144|0;i=+g[b>>2];j=+g[b+16>>2];p=i>2];if((p+g[a+20>>2]){l=o;return}m=i>j?b:b+16|0;if(+g[(+g[m>>2]>h?m:b+32|0)>>2]<+g[a+4>>2]){l=o;return}h=+g[b+8>>2];i=+g[b+24>>2];p=h>2];if((p+g[a+28>>2]){l=o;return}m=h>i?b+8|0:b+24|0;if(+g[(+g[m>>2]>j?m:b+40|0)>>2]<+g[a+12>>2]){l=o;return}h=+g[b+4>>2];i=+g[b+20>>2];p=h>2];if((p+g[a+24>>2]){l=o;return}m=h>i?b+4|0:b+20|0;if(+g[(+g[m>>2]>j?m:b+36|0)>>2]<+g[a+8>>2]){l=o;return}m=c[a+48>>2]|0;f=c[a+36>>2]|0;if((c[(c[f+4>>2]|0)+4>>2]|0)>=20){l=o;return}c[o+24+8>>2]=0;c[o+24+12>>2]=-1;c[o+24+16>>2]=1065353216;c[o+24+20>>2]=1065353216;c[o+24+24>>2]=1065353216;g[o+24+28>>2]=0.0;c[o+24+56>>2]=0;c[o+24>>2]=3924;c[o+24+4>>2]=1;c[o+24+60>>2]=c[b>>2];c[o+24+60+4>>2]=c[b+4>>2];c[o+24+60+8>>2]=c[b+8>>2];c[o+24+60+12>>2]=c[b+12>>2];c[o+24+76>>2]=c[b+16>>2];c[o+24+76+4>>2]=c[b+16+4>>2];c[o+24+76+8>>2]=c[b+16+8>>2];c[o+24+76+12>>2]=c[b+16+12>>2];c[o+24+92>>2]=c[b+32>>2];c[o+24+92+4>>2]=c[b+32+4>>2];c[o+24+92+8>>2]=c[b+32+8>>2];c[o+24+92+12>>2]=c[b+32+12>>2];c[o+24+48>>2]=c[a+56>>2];q=c[a+40>>2]|0;k=c[q+8>>2]|0;b=c[q+12>>2]|0;c[o>>2]=q;c[o+4>>2]=o+24;c[o+8>>2]=k;c[o+12>>2]=b;c[o+16>>2]=d;c[o+20>>2]=e;b=c[(c[m>>2]|0)+8>>2]|0;if(+g[(c[a+44>>2]|0)+32>>2]>0.0)k=Db[b&1](m,f,o,0,2)|0;else k=Db[b&1](m,f,o,c[a+64>>2]|0,1)|0;f=c[a+44>>2]|0;b=c[f+8>>2]|0;if((c[b+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)){c[f+8>>2]=o;Sb[c[(c[f>>2]|0)+8>>2]&127](f,d,e)}else{b=c[f+12>>2]|0;c[f+12>>2]=o;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,e)}Zb[c[(c[k>>2]|0)+8>>2]&31](k,c[a+36>>2]|0,o,c[a+52>>2]|0,c[a+44>>2]|0);q=c[a+44>>2]|0;c[((c[(c[q+8>>2]|0)+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)?q+8|0:q+12|0)>>2]=b;Ib[c[c[k>>2]>>2]&511](k);Ob[c[(c[m>>2]|0)+60>>2]&127](m,k);c[o+24>>2]=7472;b=c[o+24+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),n=c[o+24+56>>2]|0,n|0):0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}l=o;return}function Xe(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=l;l=l+48|0;c[b+8>>2]=0;c[b+12>>2]=-1;g[b+16>>2]=0.0;c[b>>2]=7272;c[b+52>>2]=d;c[b+4>>2]=21;if(xb[c[(c[d>>2]|0)+40>>2]&127](d)|0)Sb[c[(c[d>>2]|0)+48>>2]&127](d,b+20|0,b+36|0);else{d=h+32+4|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;g[h+32>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+36>>2]=+g[h+16>>2]+ +g[b+16>>2];g[h+32>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+20>>2]=+g[h+16>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[d>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+40>>2]=+g[h+16+4>>2]+ +g[b+16>>2];g[d>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+24>>2]=+g[h+16+4>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[h+32+8>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+44>>2]=+g[h+16+8>>2]+ +g[b+16>>2];g[h+32+8>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+28>>2]=+g[h+16+8>>2]-+g[b+16>>2]}c[b>>2]=7120;c[b+56>>2]=0;c[b+60>>2]=0;a[b+64>>0]=e&1;a[b+65>>0]=0;c[b+4>>2]=21;if(!f){l=h;return}c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[b+56>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;l=h;return}function Ye(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!b)if(!e){if(f|0){c[f>>2]=(a>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(a>>>0)/(d>>>0)>>>0;return (A=e,f)|0}else{if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;e=0;f=0;return (A=e,f)|0}do if(d){if(e|0){h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=31){n=h+1|0;i=a>>>((h+1|0)>>>0)&h-31>>31|b<<31-h;m=b>>>((h+1|0)>>>0)&h-31>>31;g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}if(d-1&d|0){h=(S(d|0)|0)+33-(S(b|0)|0)|0;n=h;i=32-h-1>>31&b>>>((h-32|0)>>>0)|(b<<32-h|a>>>(h>>>0))&h-32>>31;m=h-32>>31&b>>>(h>>>0);g=a<<64-h&32-h>>31;h=(b<<64-h|a>>>((h-32|0)>>>0))&32-h>>31|a<<32-h&h-33>>31;break}if(f|0){c[f>>2]=d-1&a;c[f+4>>2]=0}if((d|0)==1){e=b|b&0;f=a|0|0;return (A=e,f)|0}else{f=tq(d|0)|0;e=b>>>(f>>>0)|0;f=b<<32-f|a>>>(f>>>0)|0;return (A=e,f)|0}}else{if(!e){if(f|0){c[f>>2]=(b>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(b>>>0)/(d>>>0)>>>0;return (A=e,f)|0}if(!a){if(f|0){c[f>>2]=0;c[f+4>>2]=(b>>>0)%(e>>>0)}d=0;f=(b>>>0)/(e>>>0)>>>0;return (A=d,f)|0}if(!(e-1&e)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=e-1&b|b&0}d=0;f=b>>>((tq(e|0)|0)>>>0);return (A=d,f)|0}h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=30){n=h+1|0;i=b<<31-h|a>>>((h+1|0)>>>0);m=b>>>((h+1|0)>>>0);g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}while(0);if(!n){j=h;b=m;a=0;h=0}else{k=Ow(d|0|0,e|e&0|0,-1,-1)|0;l=A;j=h;b=m;a=n;h=0;do{p=j;j=g>>>31|j<<1;g=h|g<<1;p=i<<1|p>>>31|0;o=i>>>31|b<<1|0;sw(k|0,l|0,p|0,o|0)|0;n=A;m=n>>31|((n|0)<0?-1:0)<<1;h=m&1;i=sw(p|0,o|0,m&(d|0)|0,(((n|0)<0?-1:0)>>31|((n|0)<0?-1:0)<<1)&(e|e&0)|0)|0;b=A;a=a-1|0}while((a|0)!=0);a=0}if(f|0){c[f>>2]=i;c[f+4>>2]=b}o=(g|0)>>>31|j<<1|(0<<1|g>>>31)&0|a;p=(g<<1|0>>>31)&-2|h;return (A=o,p)|0}function Ze(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;j=l;l=l+64|0;k=(a[b+76>>0]|0)!=0;i=k?e:d;d=k?d:e;e=c[d+4>>2]|0;if(((c[e+4>>2]|0)+-21|0)>>>0>=9){l=j;return}if((c[(c[i+4>>2]|0)+4>>2]|0)>=20){l=j;return}m=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[h+4>>2]=c[b+72>>2];c[b+44>>2]=i;c[b+48>>2]=d;c[b+60>>2]=f;g[b+64>>2]=m;c[b+52>>2]=h;k=c[d+12>>2]|0;B=+g[k>>2];A=+g[k+16>>2];z=+g[k+32>>2];y=+g[k+4>>2];x=+g[k+20>>2];w=+g[k+36>>2];s=+g[k+8>>2];q=+g[k+24>>2];o=+g[k+40>>2];v=-+g[k+48>>2];u=-+g[k+52>>2];t=-+g[k+56>>2];k=c[i+12>>2]|0;K=+g[k>>2];J=+g[k+16>>2];I=+g[k+32>>2];H=+g[k+4>>2];G=+g[k+20>>2];F=+g[k+36>>2];E=+g[k+8>>2];D=+g[k+24>>2];C=+g[k+40>>2];r=+g[k+48>>2];p=+g[k+52>>2];n=+g[k+56>>2];g[j>>2]=B*K+A*J+z*I;g[j+4>>2]=B*H+A*G+z*F;g[j+8>>2]=B*E+A*D+z*C;g[j+12>>2]=0.0;g[j+16>>2]=y*K+x*J+w*I;g[j+20>>2]=y*H+x*G+w*F;g[j+24>>2]=y*E+x*D+w*C;g[j+28>>2]=0.0;g[j+32>>2]=s*K+q*J+o*I;g[j+36>>2]=s*H+q*G+o*F;g[j+40>>2]=s*E+q*D+o*C;g[j+44>>2]=0.0;g[j+48>>2]=B*v+A*u+z*t+(B*r+A*p+z*n);g[j+52>>2]=y*v+x*u+w*t+(y*r+x*p+w*n);g[j+56>>2]=s*v+q*u+o*t+(s*r+q*p+o*n);g[j+60>>2]=0.0;k=c[(c[b+44>>2]|0)+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,j,b+12|0,b+28|0);m=+g[h+32>>2]+m;g[b+28>>2]=m+ +g[b+28>>2];g[b+32>>2]=m+ +g[b+32>>2];g[b+36>>2]=m+ +g[b+36>>2];g[b+12>>2]=+g[b+12>>2]-m;g[b+16>>2]=+g[b+16>>2]-m;g[b+20>>2]=+g[b+20>>2]-m;k=c[b+72>>2]|0;f=c[d+8>>2]|0;c[k+772>>2]=c[i+8>>2];c[k+776>>2]=f;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+8|0,b+12|0,b+28|0);e=c[h+4>>2]|0;do if(c[e+780>>2]|0){f=c[e+772>>2]|0;i=c[(c[h+8>>2]|0)+8>>2]|0;d=c[(c[h+12>>2]|0)+8>>2]|0;if((f|0)==(i|0)){af(e,f+4|0,d+4|0);break}else{af(e,d+4|0,i+4|0);break}}while(0);c[b+44>>2]=0;c[b+48>>2]=0;l=j;return}function _e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;k=l;l=l+128|0;a=c[a+20>>2]|0;n=+g[a+952>>2];x=+g[a+956>>2];v=+g[a+960>>2];w=+g[a+968>>2];f=+g[a+972>>2];i=+g[a+976>>2];z=+g[b>>2];m=+g[b+4>>2];p=v*+g[b+8>>2];q=+g[b+16>>2];r=+g[b+20>>2];t=v*+g[b+24>>2];u=+g[b+32>>2];o=+g[b+36>>2];s=+g[b+40>>2];y=+g[b+48>>2];j=+g[b+52>>2];h=+g[b+56>>2];g[k>>2]=n*z+x*m+p+y;g[k+4>>2]=n*q+x*r+t+j;g[k+8>>2]=n*u+x*o+v*s+h;g[k+12>>2]=0.0;g[k+16>>2]=w*z+x*m+p+y;g[k+20>>2]=w*q+x*r+t+j;g[k+24>>2]=w*u+x*o+v*s+h;g[k+28>>2]=0.0;g[k+32>>2]=w*z+f*m+p+y;g[k+36>>2]=w*q+f*r+t+j;g[k+40>>2]=w*u+f*o+v*s+h;g[k+44>>2]=0.0;g[k+48>>2]=n*z+f*m+p+y;g[k+52>>2]=n*q+f*r+t+j;g[k+56>>2]=n*u+f*o+v*s+h;g[k+60>>2]=0.0;v=+g[b>>2];u=+g[b+4>>2];t=i*+g[b+8>>2];r=+g[b+16>>2];q=+g[b+20>>2];p=i*+g[b+24>>2];m=+g[b+32>>2];g[k+64>>2]=n*v+x*u+t+y;g[k+68>>2]=n*r+x*q+p+j;g[k+72>>2]=n*m+x*o+i*s+h;g[k+76>>2]=0.0;h=+g[b+36>>2];i=i*+g[b+40>>2];s=+g[b+48>>2];o=+g[b+52>>2];j=+g[b+56>>2];g[k+80>>2]=w*v+x*u+t+s;g[k+84>>2]=w*r+x*q+p+o;g[k+88>>2]=w*m+x*h+i+j;g[k+92>>2]=0.0;g[k+96>>2]=w*v+f*u+t+s;g[k+100>>2]=w*r+f*q+p+o;g[k+104>>2]=w*m+f*h+i+j;g[k+108>>2]=0.0;g[k+112>>2]=n*v+f*u+t+s;g[k+116>>2]=n*r+f*q+p+o;g[k+120>>2]=n*m+f*h+i+j;g[k+124>>2]=0.0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];a=1;do{f=+g[k+(a<<4)>>2];if(f<+g[d>>2])g[d>>2]=f;h=+g[k+(a<<4)+4>>2];if(h<+g[d+4>>2])g[d+4>>2]=h;i=+g[k+(a<<4)+8>>2];if(i<+g[d+8>>2])g[d+8>>2]=i;j=+g[k+(a<<4)+12>>2];if(j<+g[d+12>>2])g[d+12>>2]=j;if(+g[e>>2]>2]=f;if(+g[e+4>>2]>2]=h;if(+g[e+8>>2]>2]=i;if(+g[e+12>>2]>2]=j;a=a+1|0}while((a|0)!=8);l=k;return}function $e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0;n=l;l=l+192|0;m=c[(c[a+4>>2]|0)+772>>2]|0;k=c[(c[a+8>>2]|0)+8>>2]|0;y=+g[d>>2];h=+g[b>>2]*e+y;x=+g[d+4>>2];i=+g[b+4>>2]*e+x;o=+g[d+8>>2];j=+g[b+8>>2]*e+o;w=c[(c[a+12>>2]|0)+8>>2]|0;f=(m|0)!=(k|0)?w:m;w=(m|0)!=(k|0)?k:w;v=h-+g[f+52>>2];u=i-+g[f+56>>2];t=j-+g[f+60>>2];s=v*+g[f+8>>2]+u*+g[f+24>>2]+t*+g[f+40>>2];r=v*+g[f+12>>2]+u*+g[f+28>>2]+t*+g[f+44>>2];y=y-+g[w+52>>2];x=x-+g[w+56>>2];o=o-+g[w+60>>2];q=y*+g[w+4>>2]+x*+g[w+20>>2]+o*+g[w+36>>2];p=y*+g[w+8>>2]+x*+g[w+24>>2]+o*+g[w+40>>2];o=y*+g[w+12>>2]+x*+g[w+28>>2]+o*+g[w+44>>2];g[n>>2]=v*+g[f+4>>2]+u*+g[f+20>>2]+t*+g[f+36>>2];g[n+4>>2]=s;g[n+8>>2]=r;g[n+12>>2]=0.0;g[n+16>>2]=q;g[n+20>>2]=p;g[n+24>>2]=o;g[n+28>>2]=0.0;c[n+64>>2]=c[b>>2];c[n+64+4>>2]=c[b+4>>2];c[n+64+8>>2]=c[b+8>>2];c[n+64+12>>2]=c[b+12>>2];g[n+80>>2]=e;c[n+84>>2]=0;c[n+84+4>>2]=0;c[n+84+8>>2]=0;c[n+84+12>>2]=0;b=n+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[n+48>>2]=h;g[n+52>>2]=i;g[n+56>>2]=j;g[n+60>>2]=0.0;c[n+32>>2]=c[d>>2];c[n+32+4>>2]=c[d+4>>2];c[n+32+8>>2]=c[d+8>>2];c[n+32+12>>2]=c[d+12>>2];b=c[a+16>>2]|0;f=c[a+20>>2]|0;if((m|0)!=(k|0)){c[n+100>>2]=f;z=a+28|0;d=b;w=a+24|0;b=f;f=c[z>>2]|0;z=n+104|0;c[z>>2]=d;z=n+108|0;c[z>>2]=f;w=c[w>>2]|0;z=n+112|0;c[z>>2]=w;z=(m|0)!=(k|0)?a+12|0:a+8|0;z=c[z>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,z,b,f,m,d,w);l=n;return}else{c[n+100>>2]=b;d=a+24|0;w=f;z=a+28|0;f=b;d=c[d>>2]|0;b=n+104|0;c[b>>2]=w;b=n+108|0;c[b>>2]=d;z=c[z>>2]|0;b=n+112|0;c[b>>2]=z;b=(m|0)!=(k|0)?a+12|0:a+8|0;b=c[b>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,b,f,d,m,w,z);l=n;return}}function af(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;e=c[a+780>>2]|0;if((e|0)<=0)return;do{j=e;e=e+-1|0;p=+g[a+4+(e*192|0)>>2];q=+g[a+4+(e*192|0)+4>>2];f=+g[a+4+(e*192|0)+8>>2];o=p*+g[b>>2]+q*+g[b+4>>2]+f*+g[b+8>>2]+ +g[b+48>>2];m=p*+g[b+16>>2]+q*+g[b+20>>2]+f*+g[b+24>>2]+ +g[b+52>>2];f=p*+g[b+32>>2]+q*+g[b+36>>2]+f*+g[b+40>>2]+ +g[b+56>>2];g[a+4+(e*192|0)+48>>2]=o;g[a+4+(e*192|0)+52>>2]=m;g[a+4+(e*192|0)+56>>2]=f;g[a+4+(e*192|0)+60>>2]=0.0;q=+g[a+4+(e*192|0)+16>>2];p=+g[a+4+(e*192|0)+20>>2];h=+g[a+4+(e*192|0)+24>>2];n=q*+g[d>>2]+p*+g[d+4>>2]+h*+g[d+8>>2]+ +g[d+48>>2];l=q*+g[d+16>>2]+p*+g[d+20>>2]+h*+g[d+24>>2]+ +g[d+52>>2];h=q*+g[d+32>>2]+p*+g[d+36>>2]+h*+g[d+40>>2]+ +g[d+56>>2];g[a+4+(e*192|0)+32>>2]=n;g[a+4+(e*192|0)+36>>2]=l;g[a+4+(e*192|0)+40>>2]=h;g[a+4+(e*192|0)+44>>2]=0.0;g[a+4+(e*192|0)+80>>2]=(o-n)*+g[a+4+(e*192|0)+64>>2]+(m-l)*+g[a+4+(e*192|0)+68>>2]+(f-h)*+g[a+4+(e*192|0)+72>>2];i=a+4+(e*192|0)+156|0;c[i>>2]=(c[i>>2]|0)+1}while((j|0)>1);e=c[a+780>>2]|0;if((e|0)<=0)return;j=e;do{i=j;j=j+-1|0;d=a+4+(j*192|0)|0;f=+g[a+4+(j*192|0)+80>>2];h=+g[a+784>>2];if(!(f<=h)){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}else{o=+g[a+4+(j*192|0)+32>>2]-(+g[a+4+(j*192|0)+48>>2]-+g[a+4+(j*192|0)+64>>2]*f);p=+g[a+4+(j*192|0)+36>>2]-(+g[a+4+(j*192|0)+52>>2]-f*+g[a+4+(j*192|0)+68>>2]);q=+g[a+4+(j*192|0)+40>>2]-(+g[a+4+(j*192|0)+56>>2]-f*+g[a+4+(j*192|0)+72>>2]);if(o*o+p*p+q*q>h*h){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}}if((k|0)==12){k=0;e=e+-1|0;c[a+780>>2]=e}}while((i|0)>1);return} +function Gc(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0;s=l;l=l+96|0;p=c[b+128>>2]|0;if(!p){l=s;return}e=c[b+8>>2]|0;if((e|0)<(p|0)){if((c[b+12>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+8>>2]|0;if((i|0)>0){h=0;do{n=j+(h<<4)|0;t=(c[b+16>>2]|0)+(h<<4)|0;c[n>>2]=c[t>>2];c[n+4>>2]=c[t+4>>2];c[n+8>>2]=c[t+8>>2];c[n+12>>2]=c[t+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+16>>2]|0;if(h|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=j;c[b+12>>2]=p;h=b+16|0}else h=b+16|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+8>>2]=p;e=c[b+28>>2]|0;if((e|0)<(p|0)){if((c[b+32>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+28>>2]|0;if((i|0)>0){h=0;do{t=j+(h<<4)|0;n=(c[b+36>>2]|0)+(h<<4)|0;c[t>>2]=c[n>>2];c[t+4>>2]=c[n+4>>2];c[t+8>>2]=c[n+8>>2];c[t+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+36>>2]|0;if(h|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=j;c[b+32>>2]=p;h=b+36|0}else h=b+36|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+28>>2]=p;n=c[b+48>>2]|0;if((n|0)<(p|0)){if((c[b+52>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}h=c[b+48>>2]|0;i=c[b+56>>2]|0;if((h|0)<=0)if(!i)e=b+60|0;else o=39;else{e=0;do{c[j+(e<<2)>>2]=c[i+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));o=39}if((o|0)==39)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=j;c[b+52>>2]=p;h=p<<2;e=j}else{h=p<<2;e=c[b+56>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+48>>2]=p;n=c[b+68>>2]|0;if((n|0)<(p|0)){if((c[b+72>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+68>>2]|0;j=c[b+76>>2]|0;if((i|0)<=0)if(!j)h=b+80|0;else o=52;else{h=0;do{c[e+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));o=52}if((o|0)==52)if(!(a[b+80>>0]|0))h=b+80|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+80|0}a[h>>0]=1;c[b+76>>2]=e;c[b+72>>2]=p;h=p<<2}else{h=p<<2;e=c[b+76>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+68>>2]=p;e=c[b+128>>2]|0;if((e|0)<=0){l=s;return}i=c[b+76>>2]|0;j=c[b+56>>2]|0;h=0;do{g[i+(h<<2)>>2]=0.0;g[j+(h<<2)>>2]=0.0;h=h+1|0}while((h|0)!=(e|0));j=0;do{h=c[b+136>>2]|0;i=c[h+(j*284|0)+88>>2]|0;if(i){n=h+(j*284|0)+92|0;c[s+48>>2]=c[n>>2];c[s+48+4>>2]=c[n+4>>2];c[s+48+8>>2]=c[n+8>>2];c[s+48+12>>2]=c[n+12>>2];n=h+(j*284|0)+108|0;c[s+48+16>>2]=c[n>>2];c[s+48+16+4>>2]=c[n+4>>2];c[s+48+16+8>>2]=c[n+8>>2];c[s+48+16+12>>2]=c[n+12>>2];n=h+(j*284|0)+124|0;c[s+48+32>>2]=c[n>>2];c[s+48+32+4>>2]=c[n+4>>2];c[s+48+32+8>>2]=c[n+8>>2];c[s+48+32+12>>2]=c[n+12>>2];n=c[b+112>>2]|0;e=c[s+48+16+(n<<2)>>2]|0;y=c[s+48+32+(n<<2)>>2]|0;o=c[b+36>>2]|0;c[o+(j<<4)>>2]=c[s+48+(n<<2)>>2];c[o+(j<<4)+4>>2]=e;c[o+(j<<4)+8>>2]=y;g[o+(j<<4)+12>>2]=0.0;o=c[b+36>>2]|0;y=o+(j<<4)|0;z=+g[y>>2];e=h+(j*284|0)|0;f=+g[e>>2];n=o+(j<<4)+4|0;x=+g[n>>2];t=h+(j*284|0)+4|0;k=+g[t>>2];o=o+(j<<4)+8|0;u=+g[o>>2];p=h+(j*284|0)+8|0;w=+g[p>>2];m=z-f*(z*f+x*k+u*w);v=x-k*(z*f+x*k+u*w);w=u-w*(z*f+x*k+u*w);u=1.0/+D(+(m*m+v*v+w*w));g[y>>2]=m*u;g[n>>2]=v*u;g[o>>2]=w*u;k=+g[t>>2];x=+g[p>>2];f=+g[e>>2];e=c[b+16>>2]|0;g[e+(j<<4)>>2]=k*w*u-x*v*u;g[e+(j<<4)+4>>2]=x*m*u-w*u*f;g[e+(j<<4)+8>>2]=v*u*f-k*m*u;g[e+(j<<4)+12>>2]=0.0;e=c[b+16>>2]|0;p=e+(j<<4)|0;u=+g[p>>2];t=e+(j<<4)+4|0;m=+g[t>>2];e=e+(j<<4)+8|0;k=+g[e>>2];f=1.0/+D(+(u*u+m*m+k*k));g[p>>2]=u*f;g[t>>2]=m*f;g[e>>2]=k*f;e=c[b+108>>2]|0;t=c[b+36>>2]|0;f=+g[t+(j<<4)>>2];k=+g[t+(j<<4)+4>>2];m=+g[t+(j<<4)+8>>2];if(f*f+k*k+m*m>1.100000023841858)f=0.0;else{C=+g[h+(j*284|0)+16>>2];H=C-+g[e+52>>2];F=+g[h+(j*284|0)+20>>2];J=F-+g[e+56>>2];K=+g[h+(j*284|0)+24>>2];M=K-+g[e+60>>2];C=C-+g[i+52>>2];F=F-+g[i+56>>2];K=K-+g[i+60>>2];G=+g[e+392>>2];N=+g[e+396>>2];I=+g[e+388>>2];B=+g[i+392>>2];L=+g[i+396>>2];E=+g[i+388>>2];A=(m*J-k*M)*+g[e+4>>2]+(f*M-m*H)*+g[e+20>>2]+(k*H-f*J)*+g[e+36>>2];u=(m*J-k*M)*+g[e+8>>2]+(f*M-m*H)*+g[e+24>>2]+(k*H-f*J)*+g[e+40>>2];v=(m*J-k*M)*+g[e+12>>2]+(f*M-m*H)*+g[e+28>>2]+(k*H-f*J)*+g[e+44>>2];w=(F*-m-K*-k)*+g[i+4>>2]+(K*-f-C*-m)*+g[i+20>>2]+(C*-k-F*-f)*+g[i+36>>2];x=(F*-m-K*-k)*+g[i+8>>2]+(K*-f-C*-m)*+g[i+24>>2]+(C*-k-F*-f)*+g[i+40>>2];z=(F*-m-K*-k)*+g[i+12>>2]+(K*-f-C*-m)*+g[i+28>>2]+(C*-k-F*-f)*+g[i+44>>2];f=(f*(M*G-J*N+ +g[e+372>>2]-(K*B-F*L+ +g[i+372>>2]))+k*(+g[e+376>>2]+(H*N-M*I)-(+g[i+376>>2]+(C*L-K*E)))+m*(J*I-H*G+ +g[e+380>>2]-(F*E-C*B+ +g[i+380>>2])))*-.20000000298023224*(1.0/(+g[i+404>>2]+(+g[e+404>>2]+(A*A*+g[e+456>>2]+u*u*+g[e+460>>2]+v*v*+g[e+464>>2]))+(w*w*+g[i+456>>2]+x*x*+g[i+460>>2]+z*z*+g[i+464>>2])))}g[(c[b+76>>2]|0)+(j<<2)>>2]=f;e=c[b+128>>2]|0}j=j+1|0}while((j|0)<(e|0));if((e|0)<=0){l=s;return}i=0;o=0;h=c[b+136>>2]|0;while(1){e=c[h+(o*284|0)+88>>2]|0;if(e){f=+g[h+(o*284|0)+252>>2];if(f!=0.0){f=f*d;p=h}else{N=+g[h+(o*284|0)+256>>2];N=N==0.0?0.0:N;p=c[b+108>>2]|0;y=c[b+16>>2]|0;H=+g[h+(o*284|0)+16>>2];F=+g[h+(o*284|0)+20>>2];A=+g[h+(o*284|0)+24>>2];x=+g[y+(o<<4)>>2];E=+g[y+(o<<4)+4>>2];f=+g[y+(o<<4)+8>>2];P=H-+g[p+52>>2];Q=F-+g[p+56>>2];k=A-+g[p+60>>2];m=+g[p+324>>2]*(Q*f-k*E)+ +g[p+340>>2]*(k*x-P*f)+(P*E-Q*x)*+g[p+356>>2];R=(Q*f-k*E)*+g[p+328>>2]+(k*x-P*f)*+g[p+344>>2]+(P*E-Q*x)*+g[p+360>>2];O=(Q*f-k*E)*+g[p+332>>2]+(k*x-P*f)*+g[p+348>>2]+(P*E-Q*x)*+g[p+364>>2];L=H-+g[e+52>>2];J=F-+g[e+56>>2];C=A-+g[e+60>>2];w=(E*L-x*J)*+g[e+356>>2]+(+g[e+324>>2]*(f*J-E*C)+ +g[e+340>>2]*(x*C-f*L));u=(f*J-E*C)*+g[e+328>>2]+(x*C-f*L)*+g[e+344>>2]+(E*L-x*J)*+g[e+360>>2];v=(f*J-E*C)*+g[e+332>>2]+(x*C-f*L)*+g[e+348>>2]+(E*L-x*J)*+g[e+364>>2];H=H-+g[p+52>>2];F=F-+g[p+56>>2];A=A-+g[p+60>>2];I=+g[p+392>>2];z=+g[p+396>>2];G=+g[p+388>>2];M=+g[e+392>>2];B=+g[e+396>>2];K=+g[e+388>>2];f=-(1.0/(+g[p+404>>2]+(f*(Q*m-P*R)+(x*(k*R-Q*O)+E*(P*O-k*m)))+(+g[e+404>>2]+(f*(J*w-L*u)+(x*(C*u-J*v)+E*(L*v-C*w)))))*((A*I-F*z+ +g[p+372>>2]-(C*M-J*B+ +g[e+372>>2]))*x+(+g[p+376>>2]+(H*z-A*G)-(+g[e+376>>2]+(L*B-C*K)))*E+(F*G-H*I+ +g[p+380>>2]-(J*K-L*M+ +g[e+380>>2]))*f));f=N>2]|0}n=c[b+56>>2]|0;y=n+(o<<2)|0;g[y>>2]=0.0;e=p+(o*284|0)+280|0;g[e>>2]=1.0;m=+g[h+(o*284|0)+276>>2]*d*+g[h+(o*284|0)+228>>2];g[y>>2]=f;f=f*.5;k=+g[(c[b+76>>2]|0)+(o<<2)>>2];if(f*f+k*k>m*m){R=m/+D(+(f*f+k*k));g[e>>2]=R*+g[e>>2];e=1}else e=i}else{n=c[b+56>>2]|0;g[n+(o<<2)>>2]=0.0;g[h+(o*284|0)+280>>2]=1.0;e=i;p=h}o=o+1|0;j=c[b+128>>2]|0;if((o|0)>=(j|0))break;else{i=e;h=p}}if(e){if((j|0)<=0){l=s;return}h=c[b+76>>2]|0;e=0;do{i=h+(e<<2)|0;if(+g[i>>2]!=0.0?(q=p+(e*284|0)+280|0,r=+g[q>>2],r<1.0):0){y=n+(e<<2)|0;g[y>>2]=r*+g[y>>2];g[i>>2]=+g[q>>2]*+g[i>>2]}e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){l=s;return}e=0;h=n;while(1){i=c[b+108>>2]|0;j=p+(e*284|0)+16|0;k=+g[j>>2]-+g[i+52>>2];n=p+(e*284|0)+20|0;m=+g[n>>2]-+g[i+56>>2];o=p+(e*284|0)+24|0;d=+g[o>>2]-+g[i+60>>2];g[s+48>>2]=k;g[s+48+4>>2]=m;g[s+48+8>>2]=d;g[s+48+12>>2]=0.0;f=+g[h+(e<<2)>>2];if(f!=0.0){y=c[b+16>>2]|0;Q=f*+g[y+(e<<4)+4>>2];R=f*+g[y+(e<<4)+8>>2];g[s+32>>2]=+g[y+(e<<4)>>2]*f;g[s+32+4>>2]=Q;g[s+32+8>>2]=R;g[s+32+12>>2]=0.0;ll(i,s+32|0,s+48|0)}f=+g[(c[b+76>>2]|0)+(e<<2)>>2];if(f!=0.0){y=c[(c[b+136>>2]|0)+(e*284|0)+88>>2]|0;Q=+g[n>>2]-+g[y+56>>2];P=+g[o>>2]-+g[y+60>>2];g[s+32>>2]=+g[j>>2]-+g[y+52>>2];g[s+32+4>>2]=Q;g[s+32+8>>2]=P;g[s+32+12>>2]=0.0;t=c[b+36>>2]|0;P=+g[t+(e<<4)>>2]*f;Q=f*+g[t+(e<<4)+4>>2];R=f*+g[t+(e<<4)+8>>2];g[s+16>>2]=P;g[s+16+4>>2]=Q;g[s+16+8>>2]=R;g[s+16+12>>2]=0.0;t=c[b+108>>2]|0;q=c[b+116>>2]|0;L=+g[t+4+(q<<2)>>2];M=+g[t+20+(q<<2)>>2];N=+g[t+36+(q<<2)>>2];O=(L*k+M*m+N*d)*(1.0-+g[p+(e*284|0)+244>>2]);g[s+48>>2]=k-L*O;g[s+48+4>>2]=m-M*O;g[s+48+8>>2]=d-N*O;ll(t,s+16|0,s+48|0);g[s>>2]=-P;g[s+4>>2]=-Q;g[s+8>>2]=-R;g[s+12>>2]=0.0;ll(y,s,s+32|0)}e=e+1|0;if((e|0)>=(c[b+128>>2]|0))break;p=c[b+136>>2]|0;h=c[b+56>>2]|0}l=s;return}function Hc(b,e,f,h,i,j,k){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0;v=l;l=l+19040|0;p=j;q=p+36|0;do{c[p>>2]=0;p=p+4|0}while((p|0)<(q|0));c[v+18896>>2]=b;c[v+18896+4>>2]=f;x=+g[h>>2];K=+g[e>>2];y=+g[h+16>>2];A=+g[e+16>>2];z=+g[h+32>>2];L=+g[e+32>>2];B=+g[e+4>>2];M=+g[e+20>>2];C=+g[e+36>>2];s=+g[e+8>>2];n=+g[e+24>>2];w=+g[e+40>>2];J=+g[h+4>>2];I=+g[h+20>>2];H=+g[h+36>>2];G=+g[h+8>>2];F=+g[h+24>>2];E=+g[h+40>>2];g[v+18896+8>>2]=x*K+y*A+z*L;g[v+18896+12>>2]=x*B+y*M+z*C;g[v+18896+16>>2]=x*s+y*n+z*w;g[v+18896+20>>2]=0.0;g[v+18896+24>>2]=K*J+A*I+L*H;g[v+18896+28>>2]=B*J+M*I+C*H;g[v+18896+32>>2]=s*J+n*I+w*H;g[v+18896+36>>2]=0.0;g[v+18896+40>>2]=K*G+A*F+L*E;g[v+18896+44>>2]=B*G+M*F+C*E;g[v+18896+48>>2]=s*G+n*F+w*E;g[v+18896+52>>2]=0.0;w=+g[h+48>>2]-+g[e+48>>2];n=+g[h+52>>2]-+g[e+52>>2];s=+g[h+56>>2]-+g[e+56>>2];C=+g[e>>2];M=+g[h>>2];B=+g[e+16>>2];L=+g[h+16>>2];A=+g[e+32>>2];K=+g[h+32>>2];z=+g[e+4>>2];y=+g[e+20>>2];x=+g[e+36>>2];m=+g[e+8>>2];o=+g[e+24>>2];r=+g[e+40>>2];g[v+18896+56>>2]=C*M+B*L+A*K;g[v+18896+60>>2]=C*J+B*I+A*H;g[v+18896+64>>2]=C*G+B*F+A*E;g[v+18896+68>>2]=0.0;g[v+18896+72>>2]=M*z+L*y+K*x;g[v+18896+76>>2]=J*z+I*y+H*x;g[v+18896+80>>2]=G*z+F*y+E*x;g[v+18896+84>>2]=0.0;g[v+18896+88>>2]=M*m+L*o+K*r;g[v+18896+92>>2]=J*m+I*o+H*r;g[v+18896+96>>2]=G*m+F*o+E*r;g[v+18896+100>>2]=0.0;g[v+18896+104>>2]=w*C+n*B+s*A;g[v+18896+108>>2]=w*z+n*y+s*x;g[v+18896+112>>2]=w*m+n*o+s*r;g[v+18896+116>>2]=0.0;c[v+18896+120>>2]=k?81:80;c[v+18896+124>>2]=k?0:0;c[v+18512+364>>2]=0;c[v+18512+128>>2]=0;c[v+18512+128+4>>2]=0;c[v+18512+128+8>>2]=0;c[v+18512+128+12>>2]=0;c[v+18512+376>>2]=2;c[v+18512+368>>2]=0;g[v+18512+144>>2]=0.0;r=-+g[i+4>>2];s=-+g[i+8>>2];g[v+19024>>2]=-+g[i>>2];g[v+19024+4>>2]=r;g[v+19024+8>>2]=s;g[v+19024+12>>2]=0.0;switch(Jc(v+18512|0,v+18896|0,v+19024|0)|0){case 1:{c[v+18496>>2]=0;c[v+18496+4>>2]=0;c[v+18496+8>>2]=0;c[v+18496+12>>2]=0;c[v>>2]=9;c[v+18492>>2]=0;c[v+40>>2]=0;c[v+40+4>>2]=0;c[v+40+8>>2]=0;c[v+40+12>>2]=0;c[v+40+16>>2]=0;b=0;do{f=256-b+-1|0;c[v+4156+(f*56|0)+44>>2]=0;h=c[v+18504>>2]|0;c[v+4156+(f*56|0)+48>>2]=h;if(h|0)c[h+44>>2]=v+4156+(f*56|0);c[v+18504>>2]=v+4156+(f*56|0);c[v+18508>>2]=(c[v+18508>>2]|0)+1;b=b+1|0}while((b|0)!=256);o=+g[i>>2];r=+g[i+4>>2];n=+g[i+8>>2];t=c[v+18512+372>>2]|0;do if((c[t+32>>2]|0)>>>0>1?sd(v+18512|0)|0:0){b=c[v+18496>>2]|0;if(b|0){p=c[v+18500>>2]|0;q=c[v+18508>>2]|0;do{f=b+44|0;k=b+48|0;h=c[k>>2]|0;if(h|0)c[h+44>>2]=c[f>>2];f=c[f>>2]|0;if(f|0)c[f+48>>2]=c[k>>2];if((c[v+18496>>2]|0)==(b|0))c[v+18496>>2]=c[k>>2];p=p+-1|0;c[b+44>>2]=0;c[k>>2]=c[v+18504>>2];f=c[v+18504>>2]|0;if(f|0)c[f+44>>2]=b;c[v+18504>>2]=b;q=q+1|0;b=c[v+18496>>2]|0}while((b|0)!=0);c[v+18500>>2]=p;c[v+18508>>2]=q}c[v>>2]=0;c[v+18492>>2]=0;b=c[t>>2]|0;f=c[t+12>>2]|0;M=+g[f+16>>2];E=+g[b+16>>2]-M;G=+g[f+20>>2];H=+g[b+20>>2]-G;J=+g[f+24>>2];K=+g[b+24>>2]-J;f=c[t+4>>2]|0;I=+g[f+16>>2]-M;L=+g[f+20>>2]-G;F=+g[f+24>>2]-J;h=c[t+8>>2]|0;M=+g[h+16>>2]-M;G=+g[h+20>>2]-G;J=+g[h+24>>2]-J;if(E*L*J+(H*F*M+K*I*G-E*F*G-H*I*J)-K*L*M<0.0){c[t>>2]=f;c[t+4>>2]=b;k=c[t+16>>2]|0;c[t+16>>2]=c[t+20>>2];c[t+20>>2]=k;k=f}else{k=b;b=f}k=lf(v,k,b,h,1)|0;p=lf(v,c[t+4>>2]|0,c[t>>2]|0,c[t+12>>2]|0,1)|0;q=lf(v,c[t+8>>2]|0,c[t+4>>2]|0,c[t+12>>2]|0,1)|0;i=lf(v,c[t>>2]|0,c[t+8>>2]|0,c[t+12>>2]|0,1)|0;if((c[v+18500>>2]|0)==4){f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(!b)b=f;else{n=m*m;while(1){m=+g[b+16>>2];h=m*m>2]|0;if(!b)break;else n=h?m*m:n}b=f;m=+g[f+16>>2]}o=+g[b>>2];s=+g[b+4>>2];r=+g[b+8>>2];n=+g[b+12>>2];N=c[b+20>>2]|0;f=c[b+24>>2]|0;h=c[b+28>>2]|0;a[k+52>>0]=0;c[k+32>>2]=p;a[p+52>>0]=0;c[p+32>>2]=k;a[k+53>>0]=0;c[k+36>>2]=q;a[q+52>>0]=1;c[q+32>>2]=k;a[k+54>>0]=0;c[k+40>>2]=i;a[i+52>>0]=2;c[i+32>>2]=k;a[p+53>>0]=2;c[p+36>>2]=i;a[i+54>>0]=1;c[i+40>>2]=p;a[p+54>>0]=1;c[p+40>>2]=q;a[q+53>>0]=2;c[q+36>>2]=p;a[q+54>>0]=1;c[q+40>>2]=i;a[i+53>>0]=2;c[i+36>>2]=q;c[v>>2]=0;i=b;t=0;p=N;q=f;k=h;while(1){f=c[v+18492>>2]|0;if(f>>>0>=128){u=44;break}c[v+19024>>2]=0;c[v+19024+4>>2]=0;c[v+19024+8>>2]=0;c[v+18492>>2]=f+1;t=t+1|0;a[i+55>>0]=t;h=i+4|0;N=i+8|0;Fh(v+18512|0,+g[i>>2],+g[h>>2],+g[N>>2],v+60+(f<<5)|0);if(+g[i>>2]*+g[v+60+(f<<5)+16>>2]+ +g[h>>2]*+g[v+60+(f<<5)+20>>2]+ +g[N>>2]*+g[v+60+(f<<5)+24>>2]-+g[i+16>>2]>9.999999747378752e-05)b=0;else{b=7;u=43;break}do{h=nh(v,t,v+60+(f<<5)|0,c[i+32+(b<<2)>>2]|0,d[i+52+b>>0]|0,v+19024|0)|0;b=b+1|0}while(h&b>>>0<3);if(!(h&(c[v+19024+8>>2]|0)>>>0>2)){b=4;u=43;break}h=c[v+19024>>2]|0;b=c[v+19024+4>>2]|0;a[h+53>>0]=2;c[h+36>>2]=b;a[b+54>>0]=1;c[b+40>>2]=h;b=i+44|0;h=i+48|0;f=c[h>>2]|0;if(f|0)c[f+44>>2]=c[b>>2];b=c[b>>2]|0;if(b|0)c[b+48>>2]=c[h>>2];if((c[v+18496>>2]|0)==(i|0))c[v+18496>>2]=c[h>>2];c[v+18500>>2]=(c[v+18500>>2]|0)+-1;c[i+44>>2]=0;c[h>>2]=c[v+18504>>2];b=c[v+18504>>2]|0;if(b|0)c[b+44>>2]=i;c[v+18504>>2]=i;c[v+18508>>2]=(c[v+18508>>2]|0)+1;f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(b){n=m*m;h=f;while(1){m=+g[b+16>>2];f=m*m>2]|0;if(!b)break;else n=f?m*m:n}f=h;m=+g[h+16>>2]}o=+g[f>>2];s=+g[f+4>>2];r=+g[f+8>>2];n=+g[f+12>>2];b=c[f+20>>2]|0;h=c[f+24>>2]|0;k=c[f+28>>2]|0;if(t>>>0>=255){f=k;break}else{i=f;p=b;q=h}}if((u|0)==43){c[v>>2]=b;b=p;h=q;f=k}else if((u|0)==44){c[v>>2]=6;b=p;h=q;f=k}I=o*m;G=s*m;K=r*m;g[v+40>>2]=o;g[v+44>>2]=s;g[v+48>>2]=r;g[v+52>>2]=n;g[v+56>>2]=m;c[v+36>>2]=3;c[v+4>>2]=b;c[v+8>>2]=h;c[v+12>>2]=f;N=h;L=+g[N+16>>2]-I;E=+g[N+20>>2]-G;C=+g[N+24>>2]-K;t=f;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;L=+D(+((L*F-E*J)*(L*F-E*J)+((E*H-C*F)*(E*H-C*F)+(C*J-L*H)*(C*J-L*H))));g[v+20>>2]=L;J=+g[t+16>>2]-I;C=+g[t+20>>2]-G;t=b;F=+g[t+16>>2]-I;E=+g[t+20>>2]-G;M=+g[t+24>>2]-K;M=+D(+((J*E-C*F)*(J*E-C*F)+((C*M-H*E)*(C*M-H*E)+(H*F-J*M)*(H*F-J*M))));g[v+24>>2]=M;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;I=+g[N+16>>2]-I;G=+g[N+20>>2]-G;K=+g[N+24>>2]-K;K=+D(+((J*G-F*I)*(J*G-F*I)+((F*K-H*G)*(F*K-H*G)+(H*I-J*K)*(H*I-J*K))));g[v+20>>2]=L/(K+(L+M));g[v+24>>2]=M/(K+(L+M));g[v+28>>2]=K/(K+(L+M));if((c[v>>2]|0)!=9)if(!(c[v+36>>2]|0)){o=0.0;n=0.0;m=0.0;break}else{k=v+36|0;u=53;break}c[j>>2]=3;N=0;l=v;return N|0}else u=47}else u=47;while(0);if((u|0)==47){c[v>>2]=8;g[v+40>>2]=o;g[v+44>>2]=r;g[v+48>>2]=n;g[v+52>>2]=0.0;m=+D(+(o*o+r*r+n*n));if(m>0.0){g[v+40>>2]=1.0/m*o;g[v+44>>2]=1.0/m*r;g[v+48>>2]=1.0/m*n}else{c[v+40>>2]=1065353216;c[v+44>>2]=0;c[v+48>>2]=0}g[v+52>>2]=0.0;g[v+56>>2]=0.0;c[v+36>>2]=1;c[v+4>>2]=c[t>>2];g[v+20>>2]=1.0;k=v+36|0;u=53}if((u|0)==53){h=0;m=0.0;n=0.0;o=0.0;do{b=c[v+18896+120>>2]|0;N=c[v+18896+124>>2]|0;f=(c[v+18896>>2]|0)+(N>>1)|0;if(N&1)b=c[(c[f>>2]|0)+b>>2]|0;Sb[b&127](v+19024|0,f,c[v+4+(h<<2)>>2]|0);M=+g[v+20+(h<<2)>>2];m=m+ +g[v+19024>>2]*M;n=n+M*+g[v+19024+4>>2];o=o+M*+g[v+19024+8>>2];h=h+1|0}while(h>>>0<(c[k>>2]|0)>>>0)}c[j>>2]=1;M=m*+g[e+16>>2]+n*+g[e+20>>2]+o*+g[e+24>>2]+ +g[e+52>>2];J=m*+g[e+32>>2]+n*+g[e+36>>2]+o*+g[e+40>>2]+ +g[e+56>>2];g[j+4>>2]=m*+g[e>>2]+n*+g[e+4>>2]+o*+g[e+8>>2]+ +g[e+48>>2];g[j+8>>2]=M;g[j+12>>2]=J;g[j+16>>2]=0.0;J=+g[v+40>>2];M=+g[v+56>>2];K=+g[v+44>>2];L=+g[v+48>>2];E=m-J*M;F=n-M*K;G=o-M*L;H=E*+g[e+16>>2]+F*+g[e+20>>2]+G*+g[e+24>>2]+ +g[e+52>>2];I=E*+g[e+32>>2]+F*+g[e+36>>2]+G*+g[e+40>>2]+ +g[e+56>>2];g[j+20>>2]=E*+g[e>>2]+F*+g[e+4>>2]+G*+g[e+8>>2]+ +g[e+48>>2];g[j+24>>2]=H;g[j+28>>2]=I;g[j+32>>2]=0.0;g[j+36>>2]=-J;g[j+40>>2]=-K;g[j+44>>2]=-L;g[j+48>>2]=0.0;g[j+52>>2]=-M;N=1;l=v;return N|0}case 2:{c[j>>2]=2;N=0;l=v;return N|0}default:{N=0;l=v;return N|0}}return 0}function Ic(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;w=l;l=l+208|0;u=(a[b+68>>0]|0)!=0;t=u?e:d;u=u?d:e;v=c[t+4>>2]|0;if((c[v+72>>2]|0)!=(c[b+80>>2]|0)){j=c[b+52>>2]|0;if((j|0)>0){i=0;do{k=c[(c[b+60>>2]|0)+(i<<2)>>2]|0;if(k|0){Ib[c[c[k>>2]>>2]&511](k);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(i<<2)>>2]|0)}i=i+1|0}while((i|0)!=(j|0))}eh(b,d,e);c[b+80>>2]=c[v+72>>2]}d=c[b+52>>2]|0;if(!d){l=w;return}m=c[v+68>>2]|0;j=c[b+4>>2]|0;k=c[b+60>>2]|0;i=c[b+72>>2]|0;c[w+176>>2]=6540;c[w+176+4>>2]=t;c[w+176+8>>2]=u;c[w+176+12>>2]=j;c[w+176+16>>2]=f;c[w+176+20>>2]=h;c[w+176+24>>2]=k;c[w+176+28>>2]=i;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0);d=c[b+52>>2]|0}c[b+32>>2]=0;if((d|0)>0){f=0;do{i=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if(i){Ob[c[(c[i>>2]|0)+16>>2]&127](i,b+28|0);i=c[b+32>>2]|0;if((i|0)>0){k=0;do{j=c[(c[b+40>>2]|0)+(k<<2)>>2]|0;if(c[j+780>>2]|0){c[h+4>>2]=j;i=c[j+772>>2]|0;d=c[(c[h+8>>2]|0)+8>>2]|0;e=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(d|0))af(j,i+4|0,e+4|0);else af(j,e+4|0,d+4|0);c[h+4>>2]=0;i=c[b+32>>2]|0}k=k+1|0}while((k|0)<(i|0))}if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(!m){if((d|0)>0){i=0;do{we(w+176|0,c[(c[v+28>>2]|0)+(i*80|0)+64>>2]|0,i);i=i+1|0}while((i|0)<(d|0))}}else{k=c[t+12>>2]|0;F=+g[k>>2];E=+g[k+16>>2];D=+g[k+32>>2];C=+g[k+4>>2];B=+g[k+20>>2];A=+g[k+36>>2];r=+g[k+8>>2];p=+g[k+24>>2];n=+g[k+40>>2];z=-+g[k+48>>2];y=-+g[k+52>>2];x=-+g[k+56>>2];k=c[u+12>>2]|0;O=+g[k>>2];N=+g[k+16>>2];M=+g[k+32>>2];L=+g[k+4>>2];K=+g[k+20>>2];J=+g[k+36>>2];I=+g[k+8>>2];H=+g[k+24>>2];G=+g[k+40>>2];q=+g[k+48>>2];o=+g[k+52>>2];s=+g[k+56>>2];g[w+32>>2]=F*O+E*N+D*M;g[w+32+4>>2]=F*L+E*K+D*J;g[w+32+8>>2]=F*I+E*H+D*G;g[w+32+12>>2]=0.0;g[w+32+16>>2]=C*O+B*N+A*M;g[w+32+20>>2]=C*L+B*K+A*J;g[w+32+24>>2]=C*I+B*H+A*G;g[w+32+28>>2]=0.0;g[w+32+32>>2]=r*O+p*N+n*M;g[w+32+36>>2]=r*L+p*K+n*J;g[w+32+40>>2]=r*I+p*H+n*G;g[w+32+44>>2]=0.0;g[w+32+48>>2]=F*z+E*y+D*x+(F*q+E*o+D*s);g[w+32+52>>2]=C*z+B*y+A*x+(C*q+B*o+A*s);g[w+32+56>>2]=r*z+p*y+n*x+(r*q+p*o+n*s);g[w+32+60>>2]=0.0;k=c[u+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,w+32|0,w+112|0,w+96|0);s=+g[h+32>>2];n=+g[w+112>>2]-s;g[w+112>>2]=n;o=+g[w+112+4>>2]-s;g[w+112+4>>2]=o;p=+g[w+112+8>>2]-s;g[w+112+8>>2]=p;q=s+ +g[w+96>>2];g[w+96>>2]=q;r=s+ +g[w+96+4>>2];g[w+96+4>>2]=r;s=s+ +g[w+96+8>>2];g[w+96+8>>2]=s;k=c[m>>2]|0;if(k|0){i=c[b+12>>2]|0;d=c[b+16>>2]|0;if((i|0)<0){if((d|0)<0){d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+16>>2]=0;d=0}do{c[(c[b+20>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+12>>2]=0;if((d|0)<64){c[6995]=(c[6995]|0)+1;i=sc(275)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=64;d=64}else i=0;if((i|0)==(d|0)){j=d<<1;if((d|0)<(j|0)){c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d}c[(c[b+20>>2]|0)+(i<<2)>>2]=k;d=i+1|0;c[b+12>>2]=d;while(1){i=d+-1|0;e=c[b+20>>2]|0;f=c[e+(i<<2)>>2]|0;c[b+12>>2]=i;do if(((((+g[f>>2]<=q?+g[f+16>>2]>=n:0)?+g[f+4>>2]<=r:0)?+g[f+20>>2]>=o:0)?+g[f+8>>2]<=s:0)?+g[f+24>>2]>=p:0){if(!(c[f+40>>2]|0)){Ob[c[(c[w+176>>2]|0)+12>>2]&127](w+176|0,f);i=c[b+12>>2]|0;break}k=c[f+36>>2]|0;j=c[b+16>>2]|0;do if((i|0)==(j|0)){j=i|0?i<<1:1;if((d|0)>(j|0)){d=i;break}if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j;d=i;i=j}else{d=i;i=j}while(0);c[e+(d<<2)>>2]=k;d=d+1|0;c[b+12>>2]=d;k=c[f+40>>2]|0;do if((d|0)==(i|0)){j=i|0?i<<1:1;if((i|0)>=(j|0))break;if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d;while(0);c[(c[b+20>>2]|0)+(i<<2)>>2]=k;i=i+1|0;c[b+12>>2]=i}while(0);if((i|0)>0)d=i;else break}}}e=c[b+52>>2]|0;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;if((e|0)>0){d=0;do{do if(c[(c[b+60>>2]|0)+(d<<2)>>2]|0){f=c[v+28>>2]|0;m=c[f+(d*80|0)+64>>2]|0;h=c[t+12>>2]|0;q=+g[h>>2];r=+g[h+4>>2];s=+g[h+8>>2];x=+g[h+16>>2];y=+g[h+20>>2];z=+g[h+24>>2];G=+g[h+32>>2];I=+g[h+36>>2];K=+g[h+40>>2];A=+g[f+(d*80|0)>>2];B=+g[f+(d*80|0)+16>>2];C=+g[f+(d*80|0)+32>>2];D=+g[f+(d*80|0)+4>>2];E=+g[f+(d*80|0)+20>>2];F=+g[f+(d*80|0)+36>>2];H=+g[f+(d*80|0)+8>>2];J=+g[f+(d*80|0)+24>>2];L=+g[f+(d*80|0)+40>>2];o=+g[f+(d*80|0)+48>>2];p=+g[f+(d*80|0)+52>>2];O=+g[f+(d*80|0)+56>>2];M=+g[h+48>>2]+(q*o+r*p+s*O);N=+g[h+52>>2]+(x*o+y*p+z*O);O=+g[h+56>>2]+(G*o+I*p+K*O);g[w+112>>2]=q*A+r*B+s*C;g[w+112+4>>2]=q*D+r*E+s*F;g[w+112+8>>2]=q*H+r*J+s*L;g[w+112+12>>2]=0.0;g[w+112+16>>2]=x*A+y*B+z*C;g[w+112+20>>2]=x*D+y*E+z*F;g[w+112+24>>2]=x*H+y*J+z*L;g[w+112+28>>2]=0.0;g[w+112+32>>2]=G*A+I*B+K*C;g[w+112+36>>2]=G*D+I*E+K*F;g[w+112+40>>2]=G*H+I*J+K*L;g[w+112+44>>2]=0.0;g[w+112+48>>2]=M;g[w+112+52>>2]=N;g[w+112+56>>2]=O;g[w+112+60>>2]=0.0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,w+112|0,w+96|0,w+32|0);m=c[u+4>>2]|0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,c[u+12>>2]|0,w+16|0,w);if(!(+g[w+96>>2]>+g[w>>2])?!(+g[w+32>>2]<+g[w+16>>2]):0)i=1;else i=0;if(!(!(+g[w+96+8>>2]>+g[w+8>>2])?!(+g[w+32+8>>2]<+g[w+16+8>>2]):0))i=0;if(!(+g[w+96+4>>2]>+g[w+4>>2])?!(+g[w+32+4>>2]<+g[w+16+4>>2]|i^1):0)break;m=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;Ib[c[c[m>>2]>>2]&511](m);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(d<<2)>>2]|0);c[(c[b+60>>2]|0)+(d<<2)>>2]=0}while(0);d=d+1|0}while((d|0)<(e|0))}l=w;return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,E=0.0,F=0.0,G=0.0;C=l;l=l+176|0;c[a+348>>2]=a+220;c[a+352>>2]=a+252;c[a+356>>2]=a+284;c[a+360>>2]=a+316;c[a+364>>2]=4;c[a+368>>2]=0;c[a+376>>2]=0;y=c[b+4>>2]|0;c[a>>2]=c[b>>2];c[a+4>>2]=y;c[a+8>>2]=c[b+8>>2];c[a+8+4>>2]=c[b+8+4>>2];c[a+8+8>>2]=c[b+8+8>>2];c[a+8+12>>2]=c[b+8+12>>2];c[a+24>>2]=c[b+24>>2];c[a+24+4>>2]=c[b+24+4>>2];c[a+24+8>>2]=c[b+24+8>>2];c[a+24+12>>2]=c[b+24+12>>2];c[a+40>>2]=c[b+40>>2];c[a+40+4>>2]=c[b+40+4>>2];c[a+40+8>>2]=c[b+40+8>>2];c[a+40+12>>2]=c[b+40+12>>2];c[a+56>>2]=c[b+56>>2];c[a+56+4>>2]=c[b+56+4>>2];c[a+56+8>>2]=c[b+56+8>>2];c[a+56+12>>2]=c[b+56+12>>2];c[a+72>>2]=c[b+72>>2];c[a+72+4>>2]=c[b+72+4>>2];c[a+72+8>>2]=c[b+72+8>>2];c[a+72+12>>2]=c[b+72+12>>2];c[a+88>>2]=c[b+88>>2];c[a+88+4>>2]=c[b+88+4>>2];c[a+88+8>>2]=c[b+88+8>>2];c[a+88+12>>2]=c[b+88+12>>2];c[a+104>>2]=c[b+104>>2];c[a+104+4>>2]=c[b+104+4>>2];c[a+104+8>>2]=c[b+104+8>>2];c[a+104+12>>2]=c[b+104+12>>2];y=c[b+124>>2]|0;c[a+120>>2]=c[b+120>>2];c[a+124>>2]=y;g[a+144>>2]=0.0;c[a+180>>2]=0;c[a+128>>2]=c[d>>2];c[a+128+4>>2]=c[d+4>>2];c[a+128+8>>2]=c[d+8>>2];c[a+128+12>>2]=c[d+12>>2];e=+g[a+128>>2];f=+g[a+132>>2];h=+g[a+136>>2];if(e*e+f*f+h*h>0.0){g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,-e,-f,-h,a+316|0);b=a+148|0;d=a+164|0}else{g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,1.0,0.0,0.0,a+316|0);b=a+148|0;d=a+164|0}g[d>>2]=1.0;y=(c[b>>2]|0)+16|0;c[a+128>>2]=c[y>>2];c[a+128+4>>2]=c[y+4>>2];c[a+128+8>>2]=c[y+8>>2];c[a+128+12>>2]=c[y+12>>2];c[C+24+48>>2]=c[y>>2];c[C+24+48+4>>2]=c[y+4>>2];c[C+24+48+8>>2]=c[y+8>>2];c[C+24+48+12>>2]=c[y+12>>2];c[C+24+32>>2]=c[y>>2];c[C+24+32+4>>2]=c[y+4>>2];c[C+24+32+8>>2]=c[y+8>>2];c[C+24+32+12>>2]=c[y+12>>2];c[C+24+16>>2]=c[y>>2];c[C+24+16+4>>2]=c[y+4>>2];c[C+24+16+8>>2]=c[y+8>>2];c[C+24+16+12>>2]=c[y+12>>2];c[C+24>>2]=c[y>>2];c[C+24+4>>2]=c[y+4>>2];c[C+24+8>>2]=c[y+8>>2];c[C+24+12>>2]=c[y+12>>2];y=0;z=0.0;e=e*e+f*f+h*h;x=0;a:do{w=c[a+368>>2]|0;f=+g[a+128>>2];h=+g[a+132>>2];i=+g[a+136>>2];o=+D(+(f*f+h*h+i*i));if(o<9.999999747378752e-05){B=6;break}g[a+148+(w*36|0)+16+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=0.0;b=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=b;c[a+148+(w*36|0)+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=c[a+348+(b<<2)>>2];b=c[a+148+(w*36|0)+32>>2]|0;c[a+148+(w*36|0)+32>>2]=b+1;Fh(a,-f,-h,-i,c[a+148+(w*36|0)+(b<<2)>>2]|0);b=c[a+148+(w*36|0)+32>>2]|0;d=c[a+148+(w*36|0)+(b+-1<<2)>>2]|0;f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];r=f-+g[C+24>>2];s=h-+g[C+24+4>>2];v=i-+g[C+24+8>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+16>>2];s=h-+g[C+24+20>>2];v=i-+g[C+24+24>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+32>>2];s=h-+g[C+24+36>>2];v=i-+g[C+24+40>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+48>>2];s=h-+g[C+24+52>>2];v=i-+g[C+24+56>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}x=x+1&3;u=C+24+(x<<4)|0;c[u>>2]=c[d+16>>2];c[u+4>>2]=c[d+16+4>>2];c[u+8>>2]=c[d+16+8>>2];c[u+12>>2]=c[d+16+12>>2];v=(+g[a+128>>2]*f+ +g[a+132>>2]*h+ +g[a+136>>2]*i)/o;z=v>z?v:z;if(o-z-o*9.999999747378752e-05<=0.0){B=10;break}c[C>>2]=0;b:do switch(b|0){case 2:{u=c[a+148+(w*36|0)>>2]|0;t=c[a+148+(w*36|0)+4>>2]|0;e=+g[t+16>>2];f=+g[u+16>>2];h=+g[t+20>>2];i=+g[u+20>>2];o=+g[t+24>>2];p=+g[u+24>>2];if(!((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p)>0.0)){B=38;break a}q=-(f*(e-f)+i*(h-i)+p*(o-p))/((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p));if(q>=1.0){g[C+8>>2]=0.0;g[C+8+4>>2]=1.0;c[C>>2]=2;e=e*e+h*h+o*o;break b}if(!(q<=0.0)){g[C+8+4>>2]=q;g[C+8>>2]=1.0-q;c[C>>2]=3;e=((e-f)*q+f)*((e-f)*q+f)+((h-i)*q+i)*((h-i)*q+i)+((o-p)*q+p)*((o-p)*q+p);break b}else{g[C+8>>2]=1.0;g[C+8+4>>2]=0.0;c[C>>2]=1;e=f*f+i*i+p*p;break b}}case 3:{e=+Ke((c[a+148+(w*36|0)>>2]|0)+16|0,(c[a+148+(w*36|0)+4>>2]|0)+16|0,(c[a+148+(w*36|0)+8>>2]|0)+16|0,C+8|0,C);break}case 4:{m=c[a+148+(w*36|0)>>2]|0;n=c[a+148+(w*36|0)+4>>2]|0;t=c[a+148+(w*36|0)+8>>2]|0;u=c[a+148+(w*36|0)+12>>2]|0;c[C+152>>2]=m+16;c[C+152+4>>2]=n+16;c[C+152+8>>2]=t+16;c[C+152+12>>2]=u+16;i=+g[m+16>>2];o=+g[u+16>>2];f=+g[m+20>>2];p=+g[u+20>>2];h=+g[m+24>>2];q=+g[u+24>>2];g[C+104>>2]=i-o;g[C+104+4>>2]=f-p;g[C+104+8>>2]=h-q;g[C+104+12>>2]=0.0;e=+g[n+16>>2];F=+g[n+20>>2];s=+g[n+24>>2];g[C+104+16>>2]=e-o;g[C+104+20>>2]=F-p;g[C+104+24>>2]=s-q;g[C+104+28>>2]=0.0;r=+g[t+16>>2];G=+g[t+20>>2];E=+g[t+24>>2];g[C+104+32>>2]=r-o;g[C+104+36>>2]=G-p;g[C+104+40>>2]=E-q;g[C+104+44>>2]=0.0;v=(f-p)*(s-q)*(r-o)+(h-q)*(e-o)*(G-p)-(G-p)*(s-q)*(i-o)-(f-p)*(e-o)*(E-q)+(E-q)*(i-o)*(F-p)-(r-o)*(h-q)*(F-p);if(v!=v|0.0!=0.0|v==0.0|!(v*(h*((e-r)*(f-F)-(F-G)*(i-e))+(i*((F-G)*(h-s)-(s-E)*(f-F))+f*((s-E)*(i-e)-(e-r)*(h-s))))<=0.0))e=-1.0;else{c[C+92>>2]=0;c[C+92+4>>2]=0;c[C+92+8>>2]=0;c[C+88>>2]=0;e=-1.0;k=0;s=f-p;r=h-q;h=i-o;f=q;d=c[C>>2]|0;while(1){b=c[5288+(k<<2)>>2]|0;E=+g[C+104+(b<<4)+8>>2];F=+g[C+104+(b<<4)+4>>2];G=+g[C+104+(b<<4)>>2];if(v*((s*E-r*F)*o+p*(r*G-E*h)+(F*h-s*G)*f)>0.0?(A=+Ke(c[C+152+(k<<2)>>2]|0,c[C+152+(b<<2)>>2]|0,u+16|0,C+92|0,C+88|0),e<0.0|A>2]|0;c[C+8+(k<<2)>>2]=c[C+92>>2];c[C+8+(b<<2)>>2]=c[C+92+4>>2];g[C+8+(c[5288+(b<<2)>>2]<<2)>>2]=0.0;c[C+8+12>>2]=c[C+92+8>>2];e=A;d=(d&2|0?1<>2];r=+g[C+104+(b<<4)+8>>2];h=+g[C+104+(b<<4)>>2];o=+g[u+16>>2];p=+g[u+20>>2];f=+g[u+24>>2]}c[C>>2]=d;if(e<0.0){c[C>>2]=15;i=+g[t+20>>2];G=+g[n+24>>2];F=+g[u+16>>2];f=+g[t+24>>2];E=+g[n+16>>2];o=+g[u+20>>2];h=+g[t+16>>2];s=+g[u+24>>2];q=+g[n+20>>2];g[C+8>>2]=(i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v;e=+g[m+20>>2];p=+g[m+24>>2];r=+g[m+16>>2];g[C+8+4>>2]=(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v;g[C+8+8>>2]=(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v;g[C+8+12>>2]=1.0-((i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v+(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v+(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v);e=0.0}}break}default:{}}while(0);if(!(e>=0.0)){B=38;break}c[a+148+((1-w|0)*36|0)+32>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+368>>2]=1-w;d=c[a+148+(w*36|0)+32>>2]|0;k=c[C>>2]|0;if(d|0){b=0;do{m=a+148+(w*36|0)+(b<<2)|0;n=c[m>>2]|0;if(!(k&1<>2]|0;c[a+364>>2]=u+1;c[a+348+(u<<2)>>2]=n}else{c[a+148+((1-w|0)*36|0)+(c[a+148+((1-w|0)*36|0)+32>>2]<<2)>>2]=n;t=c[C+8+(b<<2)>>2]|0;u=c[a+148+((1-w|0)*36|0)+32>>2]|0;c[a+148+((1-w|0)*36|0)+32>>2]=u+1;c[a+148+((1-w|0)*36|0)+16+(u<<2)>>2]=t;u=c[m>>2]|0;E=(c[j>>2]=t,+g[j>>2]);F=E*+g[u+20>>2];G=E*+g[u+24>>2];g[a+128>>2]=+g[u+16>>2]*E+ +g[a+128>>2];g[a+132>>2]=F+ +g[a+132>>2];g[a+136>>2]=G+ +g[a+136>>2]}b=b+1|0}while((b|0)!=(d|0))}if((k|0)==15)c[a+376>>2]=1;y=y+1|0;if(y>>>0>=128){B=40;break}b=c[a+376>>2]|0}while(!(b|0));if((B|0)==6){c[a+376>>2]=1;B=41}else if((B|0)==9){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==10){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==38){b=c[a+368>>2]|0;y=(c[a+148+(b*36|0)+32>>2]|0)+-1|0;c[a+148+(b*36|0)+32>>2]=y;y=c[a+148+(b*36|0)+(y<<2)>>2]|0;b=c[a+364>>2]|0;c[a+364>>2]=b+1;c[a+348+(b<<2)>>2]=y;b=c[a+376>>2]|0}else if((B|0)==40){c[a+376>>2]=2;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);a=2;l=C;return a|0}if((B|0)==41)b=c[a+376>>2]|0;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);switch(b|0){case 0:{F=+g[a+128>>2];G=+g[a+132>>2];e=+g[a+136>>2];e=+D(+(F*F+G*G+e*e));break}case 1:{e=0.0;break}default:{a=b;l=C;return a|0}}g[a+144>>2]=e;a=b;l=C;return a|0}function Kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0;r=l;l=l+144|0;m=c[b+48>>2]|0;j=c[b+52>>2]|0;if((j|0?(k=c[j+20>>2]|0,k|0):0)?(xb[c[(c[k>>2]|0)+56>>2]&127](k)|0)&1|0:0){c[r+48>>2]=1065353216;c[r+48+4>>2]=1065353216;c[r+48+8>>2]=0;g[r+48+12>>2]=0.0;k=c[b+8>>2]|0;p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;x=+g[d>>2];E=+g[d+4>>2];A=+g[d+8>>2];v=+g[k+20>>2];s=+g[k+24>>2];w=+g[k+28>>2];t=+g[k+36>>2];z=+g[k+40>>2];B=+g[k+44>>2];u=+g[k+52>>2];C=+g[k+56>>2];y=+g[k+60>>2];g[r+24>>2]=x*+g[k+4>>2]+E*+g[k+8>>2]+A*+g[k+12>>2]+u;g[r+24+4>>2]=x*v+E*s+A*w+C;g[r+24+8>>2]=x*t+E*z+A*B+y;g[r+24+12>>2]=0.0;A=+g[d+16>>2];E=+g[d+20>>2];x=+g[d+24>>2];g[r>>2]=A*+g[k+4>>2]+E*+g[k+8>>2]+x*+g[k+12>>2]+u;g[r+4>>2]=A*v+E*s+x*w+C;g[r+8>>2]=A*t+E*z+x*B+y;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;y=+g[d+16>>2];B=+g[d+20>>2];x=+g[d+24>>2];z=+g[k+20>>2];E=+g[k+24>>2];t=+g[k+28>>2];A=+g[k+36>>2];C=+g[k+40>>2];w=+g[k+44>>2];s=+g[k+52>>2];v=+g[k+56>>2];u=+g[k+60>>2];g[r+24>>2]=y*+g[k+4>>2]+B*+g[k+8>>2]+x*+g[k+12>>2]+s;g[r+24+4>>2]=y*z+B*E+x*t+v;g[r+24+8>>2]=y*A+B*C+x*w+u;g[r+24+12>>2]=0.0;x=+g[d+32>>2];B=+g[d+36>>2];y=+g[d+40>>2];g[r>>2]=x*+g[k+4>>2]+B*+g[k+8>>2]+y*+g[k+12>>2]+s;g[r+4>>2]=x*z+B*E+y*t+v;g[r+8>>2]=x*A+B*C+y*w+u;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;u=+g[d+32>>2];w=+g[d+36>>2];y=+g[d+40>>2];C=+g[k+20>>2];B=+g[k+24>>2];A=+g[k+28>>2];x=+g[k+36>>2];v=+g[k+40>>2];t=+g[k+44>>2];E=+g[k+52>>2];z=+g[k+56>>2];s=+g[k+60>>2];g[r+24>>2]=u*+g[k+4>>2]+w*+g[k+8>>2]+y*+g[k+12>>2]+E;g[r+24+4>>2]=u*C+w*B+y*A+z;g[r+24+8>>2]=u*x+w*v+y*t+s;g[r+24+12>>2]=0.0;y=+g[d>>2];w=+g[d+4>>2];u=+g[d+8>>2];g[r>>2]=y*+g[k+4>>2]+w*+g[k+8>>2]+u*+g[k+12>>2]+E;g[r+4>>2]=y*C+w*B+u*A+z;g[r+8>>2]=y*x+w*v+u*t+s;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0)}j=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;j=(c[b+108>>2]|0)+-1&(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11));a:do if(j>>>0<(c[b+64>>2]|0)>>>0?(h=c[(c[b+72>>2]|0)+(j<<2)>>2]|0,(h|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(h<<2)>>2]|0))break;h=c[(c[b+92>>2]|0)+(h<<2)>>2]|0;if((h|0)==-1)break a}j=c[b+112>>2]|0;if(j+(h<<3)|0){p=c[j+(h<<3)+4>>2]|0;q=c[b+8>>2]|0;c[p+8>>2]=c[(c[q+192>>2]|0)+8>>2];o=c[b+4>>2]|0;n=c[o+192>>2]|0;c[r+48>>2]=0;c[r+48+4>>2]=n;c[r+48+8>>2]=o;c[r+48+12>>2]=o+4;c[r+48+16>>2]=-1;c[r+48+20>>2]=-1;c[r+24>>2]=0;c[r+24+4>>2]=p;c[r+24+8>>2]=q;c[r+24+12>>2]=q+4;c[r+24+16>>2]=e;c[r+24+20>>2]=f;q=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+48|0,r+24|0,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[q>>2]|0)+8>>2]&31](q,r+48|0,r+24|0,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[q>>2]>>2]&511](q);Ob[c[(c[m>>2]|0)+60>>2]&127](m,q);l=r;return}}while(0);u=+g[d+16>>2];F=+g[d>>2];v=+g[d+20>>2];s=+g[d+4>>2];w=+g[d+24>>2];t=+g[d+8>>2];x=+g[d+32>>2];z=+g[d+36>>2];B=+g[d+40>>2];y=(v-s)*(B-t)-(w-t)*(z-s);A=(w-t)*(x-F)-(u-F)*(B-t);E=(u-F)*(z-s)-(v-s)*(x-F);C=1.0/+D(+(E*E+(y*y+A*A)));g[r+48>>2]=F+C*y*.05999999865889549;g[r+48+4>>2]=s+C*A*.05999999865889549;g[r+48+8>>2]=C*E*.05999999865889549+t;g[r+48+12>>2]=0.0;g[r+48+16>>2]=C*y*.05999999865889549+u;g[r+48+20>>2]=C*A*.05999999865889549+v;g[r+48+24>>2]=C*E*.05999999865889549+w;g[r+48+28>>2]=0.0;g[r+48+32>>2]=C*y*.05999999865889549+x;g[r+48+36>>2]=C*A*.05999999865889549+z;g[r+48+40>>2]=C*E*.05999999865889549+B;g[r+48+44>>2]=0.0;g[r+48+48>>2]=F-C*y*.05999999865889549;g[r+48+52>>2]=s-C*A*.05999999865889549;g[r+48+56>>2]=t-C*E*.05999999865889549;g[r+48+60>>2]=0.0;g[r+48+64>>2]=u-C*y*.05999999865889549;g[r+48+68>>2]=v-C*A*.05999999865889549;g[r+48+72>>2]=w-C*E*.05999999865889549;g[r+48+76>>2]=0.0;g[r+48+80>>2]=x-C*y*.05999999865889549;g[r+48+84>>2]=z-C*A*.05999999865889549;g[r+48+88>>2]=B-C*E*.05999999865889549;g[r+48+92>>2]=0.0;c[6995]=(c[6995]|0)+1;h=sc(135)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}lg(h,r+48|0,6,16);p=c[b+8>>2]|0;c[h+8>>2]=c[(c[p+192>>2]|0)+8>>2];o=c[b+4>>2]|0;d=c[o+192>>2]|0;c[r+24>>2]=0;c[r+24+4>>2]=d;c[r+24+8>>2]=o;c[r+24+12>>2]=o+4;c[r+24+16>>2]=-1;c[r+24+20>>2]=-1;c[r>>2]=0;c[r+4>>2]=h;c[r+8>>2]=p;c[r+12>>2]=p+4;c[r+16>>2]=e;c[r+20>>2]=f;p=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+24|0,r,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[p>>2]|0)+8>>2]&31](p,r+24|0,r,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[p>>2]>>2]&511](p);Ob[c[(c[m>>2]|0)+60>>2]&127](m,p);p=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);m=c[b+108>>2]|0;b:do if((p&m+-1)>>>0<(c[b+64>>2]|0)>>>0?(i=c[(c[b+72>>2]|0)+((p&m+-1)<<2)>>2]|0,(i|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(i<<2)>>2]|0))break;i=c[(c[b+92>>2]|0)+(i<<2)>>2]|0;if((i|0)==-1){q=20;break b}}b=c[b+112>>2]|0;c[b+(i<<3)>>2]=e<<21|f;c[b+(i<<3)+4>>2]=h}else q=20;while(0);if((q|0)==20){o=c[b+104>>2]|0;if((o|0)==(m|0)){d=m|0?m<<1:1;if((m|0)<(d|0)){if(!d){i=0;k=m}else{c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[b+104>>2]|0}if((k|0)>0){j=0;do{I=(c[b+112>>2]|0)+(j<<3)|0;H=c[I+4>>2]|0;G=i+(j<<3)|0;c[G>>2]=c[I>>2];c[G+4>>2]=H;j=j+1|0}while((j|0)!=(k|0))}j=c[b+112>>2]|0;if(j|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=i;c[b+108>>2]=d;i=c[b+104>>2]|0}else i=m}else i=o;I=c[b+112>>2]|0;c[I+(i<<3)>>2]=e<<21|f;c[I+(i<<3)+4>>2]=h;c[b+104>>2]=(c[b+104>>2]|0)+1;h=c[b+124>>2]|0;if((h|0)==(c[b+128>>2]|0)?(n=h|0?h<<1:1,(h|0)<(n|0)):0){if(!n)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+124>>2]|0}j=c[b+132>>2]|0;if((h|0)<=0)if(!j)h=b+136|0;else q=43;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));q=43}if((q|0)==43){if(a[b+136>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+132>>2]=0;h=b+136|0}a[h>>0]=1;c[b+132>>2]=k;c[b+128>>2]=n;h=c[b+124>>2]|0}c[(c[b+132>>2]|0)+(h<<2)>>2]=e<<21|f;c[b+124>>2]=(c[b+124>>2]|0)+1;n=c[b+108>>2]|0;if((m|0)<(n|0)){e=c[b+64>>2]|0;if((e|0)<(n|0)){if((c[b+68>>2]|0)<(n|0)){if(!n){h=0;j=e}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+64>>2]|0}k=c[b+72>>2]|0;if((j|0)<=0)if(!k)i=b+76|0;else q=59;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=59}if((q|0)==59)if(!(a[b+76>>0]|0))i=b+76|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+76|0}a[i>>0]=1;c[b+72>>2]=h;c[b+68>>2]=n;m=b+72|0}else{m=b+72|0;h=c[b+72>>2]|0}Yk(h+(e<<2)|0,0,(n<<2)-(e<<2)|0)|0;c[b+64>>2]=n;d=c[b+84>>2]|0;if((d|0)<(n|0)){if((c[b+88>>2]|0)<(n|0)){if(!n){h=0;j=d}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+84>>2]|0}k=c[b+92>>2]|0;if((j|0)<=0)if(!k)i=b+96|0;else q=73;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=73}if((q|0)==73)if(!(a[b+96>>0]|0))i=b+96|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+96|0}a[i>>0]=1;c[b+92>>2]=h;c[b+88>>2]=n}else h=c[b+92>>2]|0;Yk(h+(d<<2)|0,0,(n<<2)-(d<<2)|0)|0}c[b+84>>2]=n;if((n|0)>0){Yk(c[m>>2]|0,-1,n<<2|0)|0;Yk(c[b+92>>2]|0,-1,n<<2|0)|0}if((e|0)>0){k=c[b+132>>2]|0;i=c[m>>2]|0;j=c[b+92>>2]|0;h=0;do{I=c[k+(h<<2)>>2]|0;I=((I+~(I<<15)|0)>>>10^I+~(I<<15))*9|0;I=i+(((((I>>>6^I)+~((I>>>6^I)<<11)|0)>>>16^(I>>>6^I)+~((I>>>6^I)<<11))&(c[b+108>>2]|0)+-1)<<2)|0;c[j+(h<<2)>>2]=c[I>>2];c[I>>2]=h;h=h+1|0}while((h|0)!=(e|0))}}h=p&(c[b+108>>2]|0)+-1}else h=p&m+-1;I=(c[b+72>>2]|0)+(h<<2)|0;c[(c[b+92>>2]|0)+(o<<2)>>2]=c[I>>2];c[I>>2]=o}l=r;return}function Lc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;u=l;l=l+48|0;A=1.0/+g[b+112>>2];B=1.0/+g[b+116>>2];C=1.0/+g[b+120>>2];v=+g[b+52>>2];w=A*+g[e>>2]+v;p=+g[b+56>>2];o=B*+g[e+4>>2]+p;r=+g[b+60>>2];q=C*+g[e+8>>2]+r;v=A*+g[f>>2]+v;p=B*+g[f+4>>2]+p;r=C*+g[f+8>>2]+r;C=+g[b+20>>2];w=w>2];o=o>2];q=q>2];w=z>2];o=y>2];q=x>2]|0)+-1|0;f=(c[b+72>>2]|0)+-1|0;switch(c[b+108>>2]|0){case 0:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(j|0)<(k|0)?j:k;n=(n|0)>0?n:0;break}case 1:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}case 2:{f=(j|0)<(f|0)?j:f;e=(n|0)>0?n:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}default:{e=0;n=0}}if((e|0)>=(f|0)){l=u;return}s=(n|0)<(k|0);do if(s){j=(e&1|0)==0;m=e+1|0;r=+(e|0);h=n;while(1){do if(!(a[b+104>>0]|0)){if(a[b+105>>0]|0?(h+e&1|0)==0:0){t=16;break}if(!(j&(a[b+106>>0]|0)!=0)){o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=52;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=52;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=52;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==52){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=58;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==58){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=64;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=64;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=64;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==64){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=70;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=70;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=70;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==70){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=76;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==76){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}else t=16}else t=16;while(0);if((t|0)==16){t=0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=21;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=21;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=21;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==21){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=27;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==27){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=33;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==33){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=39;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==39){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=45;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=45;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=45;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==45){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}if((h|0)==(k|0)){e=m;break}}}else e=e+1|0;while((e|0)!=(f|0));l=u;return}function Mc(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;j=+j;k=k|0;var m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0,$=0;W=l;l=l+16|0;m=c[h+4>>2]|0;if((m|0)<0){if((c[h+8>>2]|0)<0){o=c[h+12>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[h+12>>2]=0}a[h+16>>0]=1;c[h+12>>2]=0;c[h+8>>2]=0}do{V=(c[h+12>>2]|0)+(m<<4)|0;c[V>>2]=c[W>>2];c[V+4>>2]=c[W+4>>2];c[V+8>>2]=c[W+8>>2];c[V+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[h+4>>2]=0;r=c[f+4>>2]|0;if((c[h+8>>2]|0)<(r|0)){if(r){c[6995]=(c[6995]|0)+1;m=sc((r<<4|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}p=c[h+4>>2]|0;if((p|0)>0){o=0;do{V=m+(o<<4)|0;U=(c[h+12>>2]|0)+(o<<4)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];o=o+1|0}while((o|0)!=(p|0));p=h+12|0}else p=h+12|0}else{m=0;p=h+12|0}o=c[p>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[p>>2]=0}a[h+16>>0]=1;c[p>>2]=m;c[h+8>>2]=r}p=c[d+28>>2]|0;if((p|0)<=0){l=W;return}V=c[d+36>>2]|0;E=+g[e>>2];F=+g[e+4>>2];G=+g[e+8>>2];H=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];w=+g[b>>2];x=+g[b+4>>2];y=+g[b+8>>2];U=-1;u=3402823466385288598117041.0e14;m=0;while(1){z=+g[V+(m*36|0)+20>>2];A=+g[V+(m*36|0)+24>>2];B=+g[V+(m*36|0)+28>>2];o=(z*E+A*F+B*G)*w+(z*H+A*v+B*t)*x+(z*s+A*q+B*n)*y>2]|0;if((N|0)>0){O=V+(U*36|0)+12|0;P=V+(U*36|0)+20|0;Q=V+(U*36|0)+24|0;R=V+(U*36|0)+28|0;M=0;x=E;y=F;u=G;w=H;while(1){J=c[O>>2]|0;m=c[J+(M<<2)>>2]|0;I=c[d+16>>2]|0;M=M+1|0;L=(M|0)==(N|0);J=c[J+((L?0:M)<<2)>>2]|0;X=+g[I+(m<<4)>>2];Y=X-+g[I+(J<<4)>>2];z=+g[I+(m<<4)+4>>2];Z=z-+g[I+(J<<4)+4>>2];A=+g[I+(m<<4)+8>>2];F=A-+g[I+(J<<4)+8>>2];B=Y*x+Z*y+F*u;E=Y*w+Z*v+F*t;F=Y*s+Z*q+F*n;Z=+g[P>>2];Y=+g[Q>>2];K=+g[R>>2];G=x*Z+y*Y+u*K;H=w*Z+v*Y+t*K;K=s*Z+q*Y+n*K;A=(X*x+z*y+A*u+ +g[e+48>>2])*-(E*K-F*H)+(X*w+z*v+A*t+ +g[e+52>>2])*-(F*G-B*K)+(X*s+z*q+A*n+ +g[e+56>>2])*-(B*H-E*G);J=f;I=h;m=c[J+4>>2]|0;if((m|0)>=2){p=c[J+12>>2]|0;s=+g[p+(m+-1<<4)>>2];u=+g[p+(m+-1<<4)+4>>2];v=+g[p+(m+-1<<4)+8>>2];o=0;q=s*-(E*K-F*H)+u*-(F*G-B*K)+v*-(B*H-E*G)-A;while(1){x=+g[p+(o<<4)>>2];y=+g[p+(o<<4)+4>>2];z=+g[p+(o<<4)+8>>2];n=+g[p+(o<<4)+12>>2];w=x*-(E*K-F*H)+y*-(F*G-B*K)+z*-(B*H-E*G)-A;do if(q<0.0)if(w<0.0){r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){t=x;s=y;q=z;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){t=x;s=y;q=z;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{_=p+(C<<4)|0;$=(c[I+12>>2]|0)+(C<<4)|0;c[_>>2]=c[$>>2];c[_+4>>2]=c[$+4>>2];c[_+8>>2]=c[$+8>>2];c[_+12>>2]=c[$+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87;break}else{q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){n=0.0;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){n=0.0;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;n=0.0;C=87;break}else if(w<0.0){q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)==(c[I+8>>2]|0)?(S=r|0?r<<1:1,(r|0)<(S|0)):0){if(!S)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((S<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=S;p=c[I+4>>2]|0}else p=r;r=c[I+12>>2]|0;g[r+(p<<4)>>2]=t;g[r+(p<<4)+4>>2]=s;g[r+(p<<4)+8>>2]=q;g[r+(p<<4)+12>>2]=0.0;r=(c[I+4>>2]|0)+1|0;c[I+4>>2]=r;if((r|0)==(c[I+8>>2]|0)?(T=r|0?r<<1:1,(r|0)<(T|0)):0){if(!T)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((T<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=T;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87}else{t=x;s=y;q=z;C=87}}while(0);if((C|0)==87){C=0;$=c[I+12>>2]|0;g[$+(r<<4)>>2]=t;g[$+(r<<4)+4>>2]=s;g[$+(r<<4)+8>>2]=q;g[$+(r<<4)+12>>2]=n;c[I+4>>2]=(c[I+4>>2]|0)+1}o=o+1|0;if((o|0)==(m|0))break;q=w;s=x;v=z;u=y;p=c[J+12>>2]|0}m=c[J+4>>2]|0}if((m|0)<0){if((c[J+8>>2]|0)<0){o=c[J+12>>2]|0;if(o|0){if(a[J+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[J+12>>2]=0}a[J+16>>0]=1;c[J+12>>2]=0;c[J+8>>2]=0}do{$=(c[J+12>>2]|0)+(m<<4)|0;c[$>>2]=c[W>>2];c[$+4>>2]=c[W+4>>2];c[$+8>>2]=c[W+8>>2];c[$+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[J+4>>2]=0;x=+g[e>>2];y=+g[e+4>>2];u=+g[e+8>>2];w=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];if(L){p=P;o=Q;m=R;C=e+48|0;D=e+52|0;r=e+56|0;break}else{$=f;f=h;h=$}}}else{p=V+(U*36|0)+20|0;o=V+(U*36|0)+24|0;m=V+(U*36|0)+28|0;C=e+48|0;D=e+52|0;r=e+56|0;h=f;x=E;y=F;u=G;w=H}X=+g[p>>2];Y=+g[o>>2];Z=+g[m>>2];u=X*x+Y*y+Z*u;t=X*w+Y*v+Z*t;s=X*s+Y*q+Z*n;q=+g[V+(U*36|0)+32>>2]-(u*+g[C>>2]+t*+g[D>>2]+s*+g[r>>2]);m=c[h+4>>2]|0;if((m|0)<=0){l=W;return}p=0;do{o=c[h+12>>2]|0;n=q+(u*+g[o+(p<<4)>>2]+t*+g[o+(p<<4)+4>>2]+s*+g[o+(p<<4)+8>>2]);n=n<=i?i:n;if(n<=j){m=o+(p<<4)|0;c[W>>2]=c[m>>2];c[W+4>>2]=c[m+4>>2];c[W+8>>2]=c[m+8>>2];c[W+12>>2]=c[m+12>>2];Tb[c[(c[k>>2]|0)+16>>2]&15](k,b,W,n);m=c[h+4>>2]|0}p=p+1|0}while((p|0)<(m|0));l=W;return}function Nc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;j=c[b+228>>2]|0;i=c[b+196>>2]|0;if((i|0)<(j|0)){if((c[b+200>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+196>>2]|0}if((h|0)>0){f=0;do{c[e+(f<<2)>>2]=c[(c[b+204>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+204>>2]|0;if(f|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=e;c[b+200>>2]=j;f=b+204|0}else f=b+204|0;e=i;do{c[(c[f>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=(j|0))}else f=b+204|0;c[b+196>>2]=j;e=0;while(1){if((e|0)>=(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))break;c[(c[f>>2]|0)+(e<<2)>>2]=c[(c[b+236>>2]|0)+(e<<2)>>2];e=e+1|0}e=c[b+196>>2]|0;if((e|0)>1)Ni(b+192|0,0,e+-1|0);if(!(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))e=0;else e=c[f>>2]|0;h=c[b+212>>2]|0;t=c[b+196>>2]|0;u=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;c[h+4>>2]=d;c[h+12>>2]=e;c[h+16>>2]=t;c[h+20>>2]=u;e=c[h+32>>2]|0;if((e|0)<0){if((c[h+36>>2]|0)<0){f=c[h+40>>2]|0;if(f|0){if(a[h+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+40>>2]=0}a[h+44>>0]=1;c[h+40>>2]=0;c[h+36>>2]=0}do{c[(c[h+40>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+32>>2]=0;e=c[h+52>>2]|0;if((e|0)<0){if((c[h+56>>2]|0)<0){f=c[h+60>>2]|0;if(f|0){if(a[h+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+60>>2]=0}a[h+64>>0]=1;c[h+60>>2]=0;c[h+56>>2]=0}do{c[(c[h+60>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+52>>2]=0;e=c[h+72>>2]|0;if((e|0)<0){if((c[h+76>>2]|0)<0){f=c[h+80>>2]|0;if(f|0){if(a[h+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+80>>2]=0}a[h+84>>0]=1;c[h+80>>2]=0;c[h+76>>2]=0}do{c[(c[h+80>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+72>>2]=0;u=c[b+216>>2]|0;e=c[(c[u>>2]|0)+8>>2]|0;s=c[b+8>>2]|0;t=c[b+24>>2]|0;t=xb[c[(c[t>>2]|0)+36>>2]&127](t)|0;Sb[e&127](u,s,t);t=c[b+220>>2]|0;s=c[b+24>>2]|0;u=c[b+212>>2]|0;e=c[t+28>>2]|0;if((e|0)<0){if((c[t+32>>2]|0)<0){f=c[t+36>>2]|0;if(f|0){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=0;c[t+32>>2]=0}do{c[(c[t+36>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+28>>2]=0;j=c[t+8>>2]|0;if((j|0)>0){k=c[t+16>>2]|0;i=0;do{m=k+(i<<3)|0;e=c[m>>2]|0;if((e|0)==(i|0))e=i;else{f=e;h=m;do{e=k+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=k+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}c[m>>2]=e;i=i+1|0}while((i|0)!=(j|0));if((j|0)>1){vj(t+4|0,0,j+-1|0);j=c[t+8>>2]|0}if((j|0)>0){o=c[t+16>>2]|0;e=0;while(1){p=c[o+(e<<3)>>2]|0;m=e;while(1){k=m+1|0;if((k|0)>=(j|0)){n=0;break}if((c[o+(k<<3)>>2]|0)==(p|0))m=k;else{n=1;break}}a:do if((e|0)<=(m|0)){q=c[b+16>>2]|0;f=1;i=e;while(1){h=c[q+(c[o+(i<<3)+4>>2]<<2)>>2]|0;if((c[h+208>>2]|0)==(p|0)){h=c[h+220>>2]|0;f=(h|0)!=4&(f&(h|0)!=1)}if((i|0)<(m|0))i=i+1|0;else break}if(f)while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]&-2|0)!=4:0)c[f+220>>2]=2;if((e|0)>=(m|0))break a;e=e+1|0}else while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]|0)==2:0){c[f+220>>2]=3;g[f+224>>2]=0.0}if((e|0)>=(m|0))break a;e=e+1|0}}while(0);if(n)e=k;else break}}}j=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;if((j|0)>0){i=0;do{k=zb[c[(c[s>>2]|0)+40>>2]&31](s,i)|0;f=c[k+772>>2]|0;h=c[k+776>>2]|0;if((f|0)!=0?(c[f+220>>2]|0)!=2:0)e=94;else e=92;if(((e|0)==92?(e=0,h|0):0)?(c[h+220>>2]|0)!=2:0)e=94;if((e|0)==94){e=c[f+204>>2]|0;if((e&2|0?((e&4|0)==0?(c[f+220>>2]|0)!=2:0):0)?(c[h+204>>2]&3|0)==0:0){if((c[h+220>>2]&-2|0)!=4)c[h+220>>2]=1;g[h+224>>2]=0.0}q=c[h+204>>2]|0;if(q&2|0?((q&4|e&3|0)==0?(c[h+220>>2]|0)!=2:0):0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}if(a[t+64>>0]|0?Bb[c[(c[s>>2]|0)+28>>2]&63](s,f,h)|0:0){f=c[t+28>>2]|0;if((f|0)==(c[t+32>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((r<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[t+28>>2]|0}if((f|0)>0){h=0;do{c[e+(h<<2)>>2]=c[(c[t+36>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[t+36>>2]|0;if(h){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[t+28>>2]|0}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=e;c[t+32>>2]=r;e=f}else e=f;c[(c[t+36>>2]|0)+(e<<2)>>2]=k;c[t+28>>2]=e+1}}i=i+1|0}while((i|0)<(j|0));e=t+64|0}else e=t+64|0;r=c[t+8>>2]|0;if(!(a[e>>0]|0)){w=xb[c[(c[s>>2]|0)+44>>2]&127](s)|0;v=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;$b[c[(c[u>>2]|0)+8>>2]&7](u,c[b+16>>2]|0,c[b+8>>2]|0,w,v,-1);v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}q=c[t+28>>2]|0;if((q|0)>1)Ji(t+24|0,0,q+-1|0);if((r|0)<=0){v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}e=0;n=1;p=0;while(1){f=c[t+16>>2]|0;o=c[f+(e<<3)>>2]|0;b:do if((e|0)<(r|0)){i=1;j=c[t+48>>2]|0;h=c[t+52>>2]|0;while(1){m=c[(c[b+16>>2]|0)+(c[f+(e<<3)+4>>2]<<2)>>2]|0;if((j|0)==(h|0)){k=h|0?h<<1:1;if((h|0)<(k|0)){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[t+48>>2]|0}if((h|0)>0){j=0;do{c[f+(j<<2)>>2]=c[(c[t+56>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[t+56>>2]|0;if(j){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[t+48>>2]|0}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=f;c[t+52>>2]=k;f=h;h=k}else f=h}else f=j;c[(c[t+56>>2]|0)+(f<<2)>>2]=m;j=f+1|0;c[t+48>>2]=j;s=c[m+220>>2]|0;i=i&((s|0)==2|(s|0)==5);e=e+1|0;if((e|0)>=(r|0)){k=e;f=i;break b}f=c[t+16>>2]|0;if((c[f+(e<<3)>>2]|0)!=(o|0)){k=e;f=i;break}}}else{k=e;f=1}while(0);if((p|0)<(q|0)?(v=c[t+36>>2]|0,w=v+(p<<2)|0,s=c[w>>2]|0,m=c[s+772>>2]|0,(c[((c[m+208>>2]|0)>-1?m:c[s+776>>2]|0)+208>>2]|0)==(o|0)):0){e=p;do{e=e+1|0;if((e|0)>=(q|0))break;s=c[v+(e<<2)>>2]|0;n=c[s+772>>2]|0}while((o|0)==(c[((c[n+208>>2]|0)>-1?n:c[s+776>>2]|0)+208>>2]|0));h=w;i=e-p|0;j=e}else{h=0;i=0;j=n}if(!f)$b[c[(c[u>>2]|0)+8>>2]&7](u,c[t+56>>2]|0,c[t+48>>2]|0,h,i,o);p=(i|0)==0?p:j;e=c[t+48>>2]|0;if((e|0)<0){if((c[t+52>>2]|0)<0){f=c[t+56>>2]|0;if(f|0){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=0;c[t+52>>2]=0}do{c[(c[t+56>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+48>>2]=0;if((k|0)>=(r|0))break;else{e=k;n=j}}v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}function Oc(b){b=b|0;var d=0.0,e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0;u=l;l=l+176|0;if(!(a[b+738>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+744>>2]=0.0;if(!(a[b+736>>0]|0)){f=c[b+28>>2]|0;j=+g[b+600>>2];k=+g[b+604>>2];q=+g[b+608>>2];s=j*+g[f+20>>2]+k*+g[f+24>>2]+q*+g[f+28>>2]+ +g[f+56>>2];i=c[b+32>>2]|0;m=+g[b+664>>2];n=+g[b+668>>2];r=+g[b+672>>2];t=m*+g[i+20>>2]+n*+g[i+24>>2]+r*+g[i+28>>2]+ +g[i+56>>2];o=m*+g[i+36>>2]+n*+g[i+40>>2]+r*+g[i+44>>2]+ +g[i+60>>2];p=j*+g[f+4>>2]+k*+g[f+8>>2]+q*+g[f+12>>2]+ +g[f+52>>2];q=j*+g[f+36>>2]+k*+g[f+40>>2]+q*+g[f+44>>2]+ +g[f+60>>2];r=m*+g[i+4>>2]+n*+g[i+8>>2]+r*+g[i+12>>2]+ +g[i+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){e=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*e;g[u+128+4>>2]=(t-s)*e;g[u+128+8>>2]=(o-q)*e;c[u+128+12>>2]=0;m=(o-q)*e;d=(t-s)*e;e=(r-p)*e}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;d=0.0;e=1.0}if(+C(+m)>.7071067690849304){w=m*m+d*d;v=1.0/+D(+w);j=-(v*m);m=v*d;n=-(m*e);h=e*j;k=0.0;d=w*v;e=m}else{j=e*e+d*d;h=1.0/+D(+j);k=-(d*h);d=h*e;n=m*k;h=j*h;j=d;d=-(d*m);e=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=e;g[u+128+32>>2]=d;g[u+128+36>>2]=n;g[u+128+40>>2]=h;f=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[i+4>>2];c[u+32+4>>2]=c[i+20>>2];c[u+32+8>>2]=c[i+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[i+8>>2];c[u+32+20>>2]=c[i+24>>2];c[u+32+24>>2]=c[i+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[i+12>>2];c[u+32+36>>2]=c[i+28>>2];c[u+32+40>>2]=c[i+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[i+56>>2];w=o-+g[i+60>>2];g[u>>2]=r-+g[i+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;i=c[b+32>>2]|0;Rg(b+48+(f*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(f<<4)|0,x+456|0,+g[x+404>>2],i+456|0,+g[i+404>>2]);f=f+1|0;if((f|0)==3)break;i=c[b+32>>2]|0}}n=+g[b+560>>2];o=+g[b+576>>2];p=+g[b+592>>2];if(+C(+p)>.7071067690849304){m=1.0/+D(+(p*p+o*o));d=n*-(p*m);e=(p*p+o*o)*m;h=0.0;j=o*m;k=-(n*o*m);m=-(p*m)}else{m=1.0/+D(+(n*n+o*o));d=(n*n+o*o)*m;e=-(p*n*m);h=-(o*m);j=0.0;k=p*-(o*m);m=n*m}i=c[b+28>>2]|0;K=+g[i+4>>2];J=+g[i+8>>2];s=+g[i+12>>2];R=h*K+m*J+j*s;I=+g[i+20>>2];H=+g[i+24>>2];v=+g[i+28>>2];T=h*I+m*H+j*v;G=+g[i+36>>2];q=+g[i+40>>2];E=+g[i+44>>2];W=h*G+m*q+j*E;B=e*K+k*J+d*s;M=e*I+k*H+d*v;N=e*G+k*q+d*E;f=c[b+32>>2]|0;A=+g[f+4>>2];z=+g[f+20>>2];y=+g[f+36>>2];k=+g[f+8>>2];m=+g[f+24>>2];t=+g[f+40>>2];P=+g[f+12>>2];S=+g[f+28>>2];V=+g[f+44>>2];c[b+300>>2]=0;c[b+300+4>>2]=0;c[b+300+8>>2]=0;c[b+300+12>>2]=0;g[b+316>>2]=R*K+T*I+W*G;g[b+320>>2]=R*J+T*H+W*q;g[b+324>>2]=R*s+T*v+W*E;g[b+328>>2]=0.0;g[b+332>>2]=A*-R+z*-T+y*-W;g[b+336>>2]=k*-R+m*-T+t*-W;g[b+340>>2]=P*-R+S*-T+V*-W;g[b+344>>2]=0.0;F=(R*K+T*I+W*G)*+g[i+456>>2];L=(R*J+T*H+W*q)*+g[i+460>>2];d=(R*s+T*v+W*E)*+g[i+464>>2];g[b+348>>2]=F;g[b+352>>2]=L;g[b+356>>2]=d;g[b+360>>2]=0.0;j=(A*-R+z*-T+y*-W)*+g[f+456>>2];w=(k*-R+m*-T+t*-W)*+g[f+460>>2];X=(P*-R+S*-T+V*-W)*+g[f+464>>2];g[b+364>>2]=j;g[b+368>>2]=w;g[b+372>>2]=X;g[b+376>>2]=0.0;g[b+380>>2]=(R*K+T*I+W*G)*F+(R*J+T*H+W*q)*L+(R*s+T*v+W*E)*d+((A*-R+z*-T+y*-W)*j+(k*-R+m*-T+t*-W)*w+(P*-R+S*-T+V*-W)*X);f=c[b+28>>2]|0;X=+g[f+4>>2];W=+g[f+20>>2];V=+g[f+36>>2];T=+g[f+8>>2];S=+g[f+24>>2];R=+g[f+40>>2];P=+g[f+12>>2];w=+g[f+28>>2];t=+g[f+44>>2];i=c[b+32>>2]|0;m=+g[i+4>>2];k=+g[i+20>>2];j=+g[i+36>>2];y=+g[i+8>>2];z=+g[i+24>>2];A=+g[i+40>>2];d=+g[i+12>>2];L=+g[i+28>>2];F=+g[i+44>>2];c[b+384>>2]=0;c[b+384+4>>2]=0;c[b+384+8>>2]=0;c[b+384+12>>2]=0;g[b+400>>2]=B*X+M*W+N*V;g[b+404>>2]=B*T+M*S+N*R;g[b+408>>2]=B*P+M*w+N*t;g[b+412>>2]=0.0;g[b+416>>2]=m*-B+k*-M+j*-N;g[b+420>>2]=y*-B+z*-M+A*-N;g[b+424>>2]=d*-B+L*-M+F*-N;g[b+428>>2]=0.0;U=(B*X+M*W+N*V)*+g[f+456>>2];Q=(B*T+M*S+N*R)*+g[f+460>>2];r=(B*P+M*w+N*t)*+g[f+464>>2];g[b+432>>2]=U;g[b+436>>2]=Q;g[b+440>>2]=r;g[b+444>>2]=0.0;e=(m*-B+k*-M+j*-N)*+g[i+456>>2];h=(y*-B+z*-M+A*-N)*+g[i+460>>2];O=(d*-B+L*-M+F*-N)*+g[i+464>>2];g[b+448>>2]=e;g[b+452>>2]=h;g[b+456>>2]=O;g[b+460>>2]=0.0;g[b+464>>2]=(B*X+M*W+N*V)*U+(B*T+M*S+N*R)*Q+(B*P+M*w+N*t)*r+((m*-B+k*-M+j*-N)*e+(y*-B+z*-M+A*-N)*h+(d*-B+L*-M+F*-N)*O);i=c[b+28>>2]|0;O=+g[i+4>>2];N=+g[i+20>>2];F=+g[i+36>>2];M=+g[i+8>>2];L=+g[i+24>>2];B=+g[i+40>>2];d=+g[i+12>>2];h=+g[i+28>>2];A=+g[i+44>>2];f=c[b+32>>2]|0;z=+g[f+4>>2];y=+g[f+20>>2];e=+g[f+36>>2];j=+g[f+8>>2];k=+g[f+24>>2];m=+g[f+40>>2];r=+g[f+12>>2];t=+g[f+28>>2];w=+g[f+44>>2];c[b+468>>2]=0;c[b+468+4>>2]=0;c[b+468+8>>2]=0;c[b+468+12>>2]=0;F=(K*n+J*o+s*p)*O+(I*n+H*o+v*p)*N+(G*n+q*o+E*p)*F;B=(K*n+J*o+s*p)*M+(I*n+H*o+v*p)*L+(G*n+q*o+E*p)*B;A=(K*n+J*o+s*p)*d+(I*n+H*o+v*p)*h+(G*n+q*o+E*p)*A;g[b+484>>2]=F;g[b+488>>2]=B;g[b+492>>2]=A;g[b+496>>2]=0.0;s=-(K*n+J*o+s*p);v=-(I*n+H*o+v*p);h=-(G*n+q*o+E*p);g[b+500>>2]=z*s+y*v+e*h;g[b+504>>2]=j*s+k*v+m*h;g[b+508>>2]=r*s+t*v+w*h;g[b+512>>2]=0.0;E=F*+g[i+456>>2];n=B*+g[i+460>>2];o=A*+g[i+464>>2];g[b+516>>2]=E;g[b+520>>2]=n;g[b+524>>2]=o;g[b+528>>2]=0.0;p=(z*s+y*v+e*h)*+g[f+456>>2];q=(j*s+k*v+m*h)*+g[f+460>>2];d=(r*s+t*v+w*h)*+g[f+464>>2];g[b+532>>2]=p;g[b+536>>2]=q;g[b+540>>2]=d;g[b+544>>2]=0.0;g[b+548>>2]=F*E+B*n+A*o+((z*s+y*v+e*h)*p+(j*s+k*v+m*h)*q+(r*s+t*v+w*h)*d);g[b+724>>2]=0.0;f=c[b+28>>2]|0;i=c[b+32>>2]|0;d=+bj(b,f+4|0,i+4|0);g[b+728>>2]=d;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(h>=0.0){d=+mh(d-+g[b+688>>2],6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;if(d<-h){a[b+716>>0]=1;e=1.0;d=-(d+h)}else{if(!(d>h))break;a[b+716>>0]=1;e=-1.0;d=h-d}g[b+708>>2]=d;g[b+712>>2]=e}while(0);T=+g[b+560>>2];U=+g[b+576>>2];X=+g[b+592>>2];V=T*+g[f+4>>2]+U*+g[f+8>>2]+X*+g[f+12>>2];W=T*+g[f+20>>2]+U*+g[f+24>>2]+X*+g[f+28>>2];X=T*+g[f+36>>2]+U*+g[f+40>>2]+X*+g[f+44>>2];g[b+720>>2]=1.0/(V*(V*+g[f+324>>2]+W*+g[f+340>>2]+X*+g[f+356>>2])+W*(V*+g[f+328>>2]+W*+g[f+344>>2]+X*+g[f+360>>2])+X*(V*+g[f+332>>2]+W*+g[f+348>>2]+X*+g[f+364>>2])+(V*(V*+g[i+324>>2]+W*+g[i+340>>2]+X*+g[i+356>>2])+W*(V*+g[i+328>>2]+W*+g[i+344>>2]+X*+g[i+360>>2])+X*(V*+g[i+332>>2]+W*+g[i+348>>2]+X*+g[i+364>>2])));l=u;return}function Pc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0;M=l;l=l+64|0;if(!(c[b+12>>2]|0)){l=M;return}f=(a[b+16>>0]|0)!=0;P=f?e:d;f=f?d:e;i=c[P+4>>2]|0;j=c[f+4>>2]|0;P=c[P+12>>2]|0;aa=+g[P>>2];$=+g[P+16>>2];_=+g[P+32>>2];Z=+g[P+4>>2];Y=+g[P+20>>2];o=+g[P+36>>2];k=+g[P+8>>2];r=+g[P+24>>2];y=+g[P+40>>2];T=+g[P+48>>2];S=+g[P+52>>2];R=+g[P+56>>2];O=c[f+12>>2]|0;X=+g[O>>2];W=+g[O+16>>2];p=+g[O+32>>2];V=+g[O+4>>2];U=+g[O+20>>2];q=+g[O+36>>2];x=+g[O+8>>2];v=+g[O+24>>2];t=+g[O+40>>2];Q=-+g[O+48>>2];I=-+g[O+52>>2];J=-+g[O+56>>2];K=+g[P>>2];L=+g[P+16>>2];H=+g[P+32>>2];B=+g[P+4>>2];A=+g[P+20>>2];z=+g[P+36>>2];w=+g[P+8>>2];u=+g[P+24>>2];s=+g[P+40>>2];P=c[(c[i>>2]|0)+64>>2]|0;n=-+g[j+52>>2];m=-+g[j+56>>2];E=-+g[j+60>>2];g[M+48>>2]=(aa*X+$*W+_*p)*n+(aa*V+$*U+_*q)*m+(aa*x+$*v+_*t)*E;g[M+48+4>>2]=(Z*X+Y*W+o*p)*n+(Z*V+Y*U+o*q)*m+(Z*x+Y*v+o*t)*E;g[M+48+8>>2]=(k*X+r*W+y*p)*n+(k*V+r*U+y*q)*m+(k*x+r*v+y*t)*E;g[M+48+12>>2]=0.0;Sb[P&127](M,i,M+48|0);E=+g[M>>2];y=+g[M+4>>2];r=+g[M+8>>2];k=+g[j+52>>2];m=+g[j+56>>2];n=+g[j+60>>2];o=n*(T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r))+(k*(T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r))+m*(T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)))-+g[j+68>>2];p=T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r)-k*o;q=T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)-m*o;r=T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r)-n*o;P=c[f+12>>2]|0;s=+g[P>>2];t=+g[P+4>>2];u=+g[P+8>>2];v=+g[P+16>>2];w=+g[P+20>>2];x=+g[P+24>>2];y=+g[P+32>>2];z=+g[P+36>>2];A=+g[P+40>>2];B=+g[P+48>>2];E=+g[P+52>>2];H=+g[P+56>>2];P=c[b+12>>2]|0;O=o<+g[P+784>>2];c[h+4>>2]=P;if(O){P=c[f+12>>2]|0;$=k*+g[P+16>>2]+m*+g[P+20>>2]+n*+g[P+24>>2];aa=k*+g[P+32>>2]+m*+g[P+36>>2]+n*+g[P+40>>2];g[M+48>>2]=+g[P>>2]*k+ +g[P+4>>2]*m+ +g[P+8>>2]*n;g[M+48+4>>2]=$;g[M+48+8>>2]=aa;g[M+48+12>>2]=0.0;g[M+32>>2]=u*r+(s*p+t*q)+B;g[M+32+4>>2]=p*v+q*w+r*x+E;g[M+32+8>>2]=p*y+q*z+r*A+H;g[M+32+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+48|0,M+32|0,o)}if((c[i+4>>2]|0)<7?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+24>>2]|0):0){k=+g[j+60>>2];if(+C(+k)>.7071067690849304){n=+g[j+56>>2];aa=1.0/+D(+(k*k+n*n));m=0.0;n=n*aa;k=-(k*aa)}else{aa=+g[j+52>>2];m=+g[j+56>>2];k=1.0/+D(+(aa*aa+m*m));m=-(m*k);n=0.0;k=aa*k}J=.019999999552965164/+nb[c[(c[i>>2]|0)+16>>2]&15](i);J=(J>.39269909262657166?.39269909262657166:J)*.5;I=+G(+J)/+D(+(m*m+k*k+n*n));L=m*I;K=k*I;I=n*I;J=+F(+J);f=c[b+20>>2]|0;if((f|0)>0){i=0;do{v=+g[j+52>>2];aa=+g[j+56>>2];B=+g[j+60>>2];z=+(i|0)*(6.2831854820251465/+(f|0))*.5;$=+G(+z)/+D(+(v*v+aa*aa+B*B));z=+F(+z);A=I*-(aa*$)+(L*z+J*-(v*$))-K*-(B*$);x=L*-(B*$)+(K*z+J*-(aa*$))-I*-(v*$);da=K*-(v*$)+(I*z+J*-(B*$))-L*-(aa*$);H=J*z-L*-(v*$)-K*-(aa*$)-I*-(B*$);ia=B*$*x+(v*$*H+z*A)-aa*$*da;ha=v*$*da+(z*x+aa*$*H)-B*$*A;la=aa*$*A+(B*$*H+z*da)-v*$*x;da=z*H-v*$*A-aa*$*x-B*$*da;f=(a[b+16>>0]|0)!=0;ba=f?e:d;f=f?d:e;P=c[ba+4>>2]|0;O=c[f+4>>2]|0;ba=c[ba+12>>2]|0;$=+g[ba>>2];B=+g[ba+4>>2];x=+g[ba+8>>2];aa=+g[ba+16>>2];A=+g[ba+20>>2];v=+g[ba+24>>2];H=+g[ba+32>>2];z=+g[ba+36>>2];t=+g[ba+40>>2];V=+g[ba+48>>2];W=+g[ba+52>>2];X=+g[ba+56>>2];ba=c[f+12>>2]|0;R=+g[ba>>2];S=+g[ba+16>>2];p=+g[ba+32>>2];T=+g[ba+4>>2];U=+g[ba+20>>2];q=+g[ba+36>>2];w=+g[ba+8>>2];u=+g[ba+24>>2];s=+g[ba+40>>2];Y=-+g[ba+48>>2];Z=-+g[ba+52>>2];_=-+g[ba+56>>2];ga=ia*(2.0/(ia*ia+ha*ha+la*la+da*da));n=ha*(2.0/(ia*ia+ha*ha+la*la+da*da));ca=la*(2.0/(ia*ia+ha*ha+la*la+da*da));na=x*(ia*ca-da*n)+(B*(ia*n+da*ca)+$*(1.0-(ha*n+la*ca)));ka=x*(ha*ca+da*ga)+($*(ia*n-da*ca)+B*(1.0-(ia*ga+la*ca)));k=$*(ia*ca+da*n)+B*(ha*ca-da*ga)+x*(1.0-(ia*ga+ha*n));ma=v*(ia*ca-da*n)+(A*(ia*n+da*ca)+aa*(1.0-(ha*n+la*ca)));ja=v*(ha*ca+da*ga)+(aa*(ia*n-da*ca)+A*(1.0-(ia*ga+la*ca)));y=aa*(ia*ca+da*n)+A*(ha*ca-da*ga)+v*(1.0-(ia*ga+ha*n));oa=t*(ia*ca-da*n)+(z*(ia*n+da*ca)+H*(1.0-(ha*n+la*ca)));la=t*(ha*ca+da*ga)+(H*(ia*n-da*ca)+z*(1.0-(ia*ga+la*ca)));n=H*(ia*ca+da*n)+z*(ha*ca-da*ga)+t*(1.0-(ia*ga+ha*n));ha=+g[ba>>2];ga=+g[ba+16>>2];ia=+g[ba+32>>2];da=+g[ba+4>>2];ca=+g[ba+20>>2];ea=+g[ba+36>>2];m=+g[ba+8>>2];r=+g[ba+24>>2];o=+g[ba+40>>2];ba=c[(c[P>>2]|0)+64>>2]|0;fa=-+g[O+52>>2];Q=-+g[O+56>>2];E=-+g[O+60>>2];g[M+32>>2]=(ia*oa+(ha*na+ga*ma))*fa+(ea*oa+(da*na+ca*ma))*Q+(o*oa+(m*na+r*ma))*E;g[M+32+4>>2]=(ia*la+(ha*ka+ga*ja))*fa+(ea*la+(da*ka+ca*ja))*Q+(o*la+(m*ka+r*ja))*E;g[M+32+8>>2]=(ia*n+(ha*k+ga*y))*fa+(ea*n+(da*k+ca*y))*Q+(o*n+(m*k+r*y))*E;g[M+32+12>>2]=0.0;Sb[ba&127](M+48|0,P,M+32|0);E=+g[M+48>>2];y=+g[M+48+4>>2];r=+g[M+48+8>>2];k=+g[O+52>>2];m=+g[O+56>>2];n=+g[O+60>>2];o=n*(V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r))+(k*(V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r))+m*(V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)))-+g[O+68>>2];p=V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r)-k*o;q=V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)-m*o;r=V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r)-n*o;O=c[f+12>>2]|0;s=+g[O>>2];t=+g[O+4>>2];u=+g[O+8>>2];v=+g[O+16>>2];w=+g[O+20>>2];x=+g[O+24>>2];y=+g[O+32>>2];z=+g[O+36>>2];A=+g[O+40>>2];B=+g[O+48>>2];E=+g[O+52>>2];H=+g[O+56>>2];O=c[b+12>>2]|0;P=o<+g[O+784>>2];c[h+4>>2]=O;if(P){ba=c[f+12>>2]|0;na=k*+g[ba+16>>2]+m*+g[ba+20>>2]+n*+g[ba+24>>2];oa=k*+g[ba+32>>2]+m*+g[ba+36>>2]+n*+g[ba+40>>2];g[M+32>>2]=+g[ba>>2]*k+ +g[ba+4>>2]*m+ +g[ba+8>>2]*n;g[M+32+4>>2]=na;g[M+32+8>>2]=oa;g[M+32+12>>2]=0.0;g[M+16>>2]=u*r+(s*p+t*q)+B;g[M+16+4>>2]=p*v+q*w+r*x+E;g[M+16+8>>2]=p*y+q*z+r*A+H;g[M+16+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+32|0,M+16|0,o)}i=i+1|0;f=c[b+20>>2]|0}while((i|0)<(f|0))}}do if((a[b+8>>0]|0?c[(c[b+12>>2]|0)+780>>2]|0:0)?(N=c[h+4>>2]|0,c[N+780>>2]|0):0){i=c[N+772>>2]|0;j=c[(c[h+8>>2]|0)+8>>2]|0;f=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(j|0)){af(N,i+4|0,f+4|0);break}else{af(N,f+4|0,j+4|0);break}}while(0);l=M;return}function Qc(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;c[d+168>>2]=c[d+152>>2];c[e>>2]=9356;c[e+52>>2]=287;a[e+60>>0]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;c[e+144>>2]=0;a[e+164>>0]=1;c[e+160>>2]=0;c[e+152>>2]=0;c[e+156>>2]=0;c[e+168>>2]=0;c[e+4>>2]=-8388609;c[e+8>>2]=-8388609;c[e+12>>2]=-8388609;g[e+16>>2]=0.0;c[e+20>>2]=2139095039;c[e+24>>2]=2139095039;c[e+28>>2]=2139095039;g[e+32>>2]=0.0;f=c[d+56>>2]|0;if(h){c[e+56>>2]=KB(f|0)|0;a[e+4>>0]=a[d+4+3>>0]|0;a[e+5>>0]=a[d+4+2>>0]|0;a[e+6>>0]=a[d+4+1>>0]|0;a[e+7>>0]=a[d+4>>0]|0;a[e+8>>0]=a[d+8+3>>0]|0;a[e+9>>0]=a[d+8+2>>0]|0;a[e+10>>0]=a[d+8+1>>0]|0;a[e+11>>0]=a[d+8>>0]|0;a[e+12>>0]=a[d+12+3>>0]|0;a[e+13>>0]=a[d+12+2>>0]|0;a[e+14>>0]=a[d+12+1>>0]|0;a[e+15>>0]=a[d+12>>0]|0;a[e+16>>0]=a[d+16+3>>0]|0;a[e+17>>0]=a[d+16+2>>0]|0;a[e+18>>0]=a[d+16+1>>0]|0;a[e+19>>0]=a[d+16>>0]|0;a[e+20>>0]=a[d+20+3>>0]|0;a[e+21>>0]=a[d+20+2>>0]|0;a[e+22>>0]=a[d+20+1>>0]|0;a[e+23>>0]=a[d+20>>0]|0;a[e+24>>0]=a[d+24+3>>0]|0;a[e+25>>0]=a[d+24+2>>0]|0;a[e+26>>0]=a[d+24+1>>0]|0;a[e+27>>0]=a[d+24>>0]|0;a[e+28>>0]=a[d+28+3>>0]|0;a[e+29>>0]=a[d+28+2>>0]|0;a[e+30>>0]=a[d+28+1>>0]|0;a[e+31>>0]=a[d+28>>0]|0;a[e+32>>0]=a[d+32+3>>0]|0;a[e+33>>0]=a[d+32+2>>0]|0;a[e+34>>0]=a[d+32+1>>0]|0;a[e+35>>0]=a[d+32>>0]|0;a[e+36>>0]=a[d+36+3>>0]|0;a[e+37>>0]=a[d+36+2>>0]|0;a[e+38>>0]=a[d+36+1>>0]|0;a[e+39>>0]=a[d+36>>0]|0;a[e+40>>0]=a[d+40+3>>0]|0;a[e+41>>0]=a[d+40+2>>0]|0;a[e+42>>0]=a[d+40+1>>0]|0;a[e+43>>0]=a[d+40>>0]|0;a[e+44>>0]=a[d+44+3>>0]|0;a[e+45>>0]=a[d+44+2>>0]|0;a[e+46>>0]=a[d+44+1>>0]|0;a[e+47>>0]=a[d+44>>0]|0;a[e+48>>0]=a[d+48+3>>0]|0;a[e+49>>0]=a[d+48+2>>0]|0;a[e+50>>0]=a[d+48+1>>0]|0;a[e+51>>0]=a[d+48>>0]|0;c[e+144>>2]=KB(c[d+144>>2]|0)|0;f=KB(c[d+168>>2]|0)|0}else{c[e+56>>2]=f;c[e+4>>2]=c[d+4>>2];c[e+4+4>>2]=c[d+4+4>>2];c[e+4+8>>2]=c[d+4+8>>2];c[e+4+12>>2]=c[d+4+12>>2];c[e+20>>2]=c[d+20>>2];c[e+20+4>>2]=c[d+20+4>>2];c[e+20+8>>2]=c[d+20+8>>2];c[e+20+12>>2]=c[d+20+12>>2];c[e+36>>2]=c[d+36>>2];c[e+36+4>>2]=c[d+36+4>>2];c[e+36+8>>2]=c[d+36+8>>2];c[e+36+12>>2]=c[d+36+12>>2];c[e+144>>2]=c[d+144>>2];f=c[d+168>>2]|0}c[e+168>>2]=f;a[e+60>>0]=a[d+60>>0]|0;k=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){f=c[e+96>>2]|0;if(f|0){if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0}a[e+100>>0]=0;c[e+96>>2]=e+172;c[e+88>>2]=k;c[e+92>>2]=k;if(h)if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{l=j+(i<<6)|0;n=f+(i<<6)|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+4|0;l=f+(i<<6)+4|0;a[l>>0]=a[n+3>>0]|0;a[l+1>>0]=a[n+2>>0]|0;a[l+2>>0]=a[n+1>>0]|0;a[l+3>>0]=a[n>>0]|0;l=j+(i<<6)+8|0;n=f+(i<<6)+8|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+12|0;f=f+(i<<6)+12|0;a[f>>0]=a[n+3>>0]|0;a[f+1>>0]=a[n+2>>0]|0;a[f+2>>0]=a[n+1>>0]|0;a[f+3>>0]=a[n>>0]|0;f=c[d+96>>2]|0;n=f+(i<<6)+16|0;l=c[e+96>>2]|0;m=l+(i<<6)+16|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;m=f+(i<<6)+20|0;n=l+(i<<6)+20|0;a[n>>0]=a[m+3>>0]|0;a[n+1>>0]=a[m+2>>0]|0;a[n+2>>0]=a[m+1>>0]|0;a[n+3>>0]=a[m>>0]|0;n=f+(i<<6)+24|0;m=l+(i<<6)+24|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;f=f+(i<<6)+28|0;l=l+(i<<6)+28|0;a[l>>0]=a[f+3>>0]|0;a[l+1>>0]=a[f+2>>0]|0;a[l+2>>0]=a[f+1>>0]|0;a[l+3>>0]=a[f>>0]|0;j=c[d+96>>2]|0;l=KB(c[j+(i<<6)+32>>2]|0)|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=l;c[f+(i<<6)+36>>2]=KB(c[j+(i<<6)+36>>2]|0)|0;c[f+(i<<6)+40>>2]=KB(c[j+(i<<6)+40>>2]|0)|0;i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;else if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{m=j+(i<<6)|0;n=f+(i<<6)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=(c[d+96>>2]|0)+(i<<6)+16|0;f=(c[e+96>>2]|0)+(i<<6)+16|0;c[f>>2]=c[n>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];c[f+12>>2]=c[n+12>>2];j=c[d+96>>2]|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=c[j+(i<<6)+32>>2];c[f+(i<<6)+36>>2]=c[j+(i<<6)+36>>2];c[f+(i<<6)+40>>2]=c[j+(i<<6)+40>>2];i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;if(!f){f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}else{if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0;f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}}else{f=c[e+136>>2]|0;if(f|0){if(a[e+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+136>>2]=0}a[e+140>>0]=0;c[e+136>>2]=e+172;c[e+128>>2]=k;c[e+132>>2]=k;if(h){if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=JH(b[i+(f<<4)>>1]|0)|0;b[e+172+(f<<4)+2>>1]=JH(b[i+(f<<4)+2>>1]|0)|0;b[e+172+(f<<4)+4>>1]=JH(b[i+(f<<4)+4>>1]|0)|0;b[e+172+(f<<4)+6>>1]=JH(b[i+(f<<4)+6>>1]|0)|0;b[e+172+(f<<4)+8>>1]=JH(b[i+(f<<4)+8>>1]|0)|0;b[e+172+(f<<4)+10>>1]=JH(b[i+(f<<4)+10>>1]|0)|0;c[e+172+(f<<4)+12>>2]=KB(c[i+(f<<4)+12>>2]|0)|0;f=f+1|0}while((f|0)!=(k|0))}}else if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=b[i+(f<<4)>>1]|0;b[e+172+(f<<4)+2>>1]=b[i+(f<<4)+2>>1]|0;b[e+172+(f<<4)+4>>1]=b[i+(f<<4)+4>>1]|0;b[e+172+(f<<4)+6>>1]=b[i+(f<<4)+6>>1]|0;b[e+172+(f<<4)+8>>1]=b[i+(f<<4)+8>>1]|0;b[e+172+(f<<4)+10>>1]=b[i+(f<<4)+10>>1]|0;c[e+172+(f<<4)+12>>2]=c[i+(f<<4)+12>>2];f=f+1|0}while((f|0)!=(k|0))}c[e+136>>2]=0;f=k<<4;i=e+132|0;j=e+128|0;k=e+136|0;l=e+140|0}a[l>>0]=0;c[k>>2]=0;c[j>>2]=0;c[i>>2]=0;k=e+172+f|0;f=c[d+168>>2]|0;i=c[e+160>>2]|0;if(i|0){if(a[e+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[e+160>>2]=0}a[e+164>>0]=0;c[e+160>>2]=k;c[e+152>>2]=f;c[e+156>>2]=f;j=c[d+168>>2]|0;if(h){if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=JH(b[i+(f<<5)>>1]|0)|0;b[k+(f<<5)+2>>1]=JH(b[i+(f<<5)+2>>1]|0)|0;b[k+(f<<5)+4>>1]=JH(b[i+(f<<5)+4>>1]|0)|0;b[k+(f<<5)+6>>1]=JH(b[i+(f<<5)+6>>1]|0)|0;b[k+(f<<5)+8>>1]=JH(b[i+(f<<5)+8>>1]|0)|0;b[k+(f<<5)+10>>1]=JH(b[i+(f<<5)+10>>1]|0)|0;c[k+(f<<5)+12>>2]=KB(c[i+(f<<5)+12>>2]|0)|0;c[k+(f<<5)+16>>2]=KB(c[i+(f<<5)+16>>2]|0)|0;f=f+1|0}while((f|0)!=(j|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}else{if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=b[i+(f<<5)>>1]|0;b[k+(f<<5)+2>>1]=b[i+(f<<5)+2>>1]|0;b[k+(f<<5)+4>>1]=b[i+(f<<5)+4>>1]|0;b[k+(f<<5)+6>>1]=b[i+(f<<5)+6>>1]|0;b[k+(f<<5)+8>>1]=b[i+(f<<5)+8>>1]|0;b[k+(f<<5)+10>>1]=b[i+(f<<5)+10>>1]|0;c[k+(f<<5)+12>>2]=c[i+(f<<5)+12>>2];c[k+(f<<5)+16>>2]=c[i+(f<<5)+16>>2];c[k+(f<<5)+20>>2]=0;c[k+(f<<5)+24>>2]=0;c[k+(f<<5)+28>>2]=0;f=f+1|0}while((f|0)<(c[d+168>>2]|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}return 0}function Rc(b,d,e,f,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;C=l;l=l+4224|0;if(((c[e+4>>2]|0)+-17|0)>>>0<2)A=((c[f+4>>2]|0)+-17|0)>>>0<2;else A=0;b=0;do{Qe();v=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];x=+g[24644+(b<<4)+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(b<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(b<<4)+4>>2]=z;g[C+1248+(b<<4)+8>>2]=y;g[C+1248+(b<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(b<<4)>>2]=v*+g[i>>2]+w*+g[i+16>>2]+x*+g[i+32>>2];g[C+256+(b<<4)+4>>2]=y;g[C+256+(b<<4)+8>>2]=z;g[C+256+(b<<4)+12>>2]=0.0;b=b+1|0}while((b|0)!=42);q=xb[c[(c[e>>2]|0)+84>>2]&127](e)|0;if((q|0)>0){b=0;p=42;while(1){Sb[c[(c[e>>2]|0)+88>>2]&127](e,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[h+16>>2]+z*+g[h+20>>2]+x*+g[h+24>>2];v=y*+g[h+32>>2]+z*+g[h+36>>2]+x*+g[h+40>>2];g[C+176>>2]=+g[h>>2]*y+ +g[h+4>>2]*z+ +g[h+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();r=24644+(p<<4)|0;c[r>>2]=c[C+176>>2];c[r+4>>2]=c[C+176+4>>2];c[r+8>>2]=c[C+176+8>>2];c[r+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(p<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(p<<4)+4>>2]=z;g[C+1248+(p<<4)+8>>2]=y;g[C+1248+(p<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(p<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(p<<4)+4>>2]=y;g[C+256+(p<<4)+8>>2]=z;g[C+256+(p<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(q|0))break;else p=p+1|0}p=q+42|0}else p=42;r=xb[c[(c[f>>2]|0)+84>>2]&127](f)|0;if((r|0)>0){b=0;q=p;while(1){Sb[c[(c[f>>2]|0)+88>>2]&127](f,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[i+16>>2]+z*+g[i+20>>2]+x*+g[i+24>>2];v=y*+g[i+32>>2]+z*+g[i+36>>2]+x*+g[i+40>>2];g[C+176>>2]=+g[i>>2]*y+ +g[i+4>>2]*z+ +g[i+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();D=24644+(q<<4)|0;c[D>>2]=c[C+176>>2];c[D+4>>2]=c[C+176+4>>2];c[D+8>>2]=c[C+176+8>>2];c[D+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(q<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(q<<4)+4>>2]=z;g[C+1248+(q<<4)+8>>2]=y;g[C+1248+(q<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(q<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(q<<4)+4>>2]=y;g[C+256+(q<<4)+8>>2]=z;g[C+256+(q<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(r|0))break;else q=q+1|0}p=r+p|0}Vb[c[(c[e>>2]|0)+76>>2]&127](e,C+1248|0,C+3232|0,p);Vb[c[(c[f>>2]|0)+76>>2]&127](f,C+256|0,C+2240|0,p);if((p|0)>0){v=999999984306749440.0;b=0;y=0.0;z=0.0;x=0.0;s=0.0;while(1){Qe();u=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];t=+g[24644+(b<<4)+12>>2];o=A?0.0:+g[24644+(b<<4)+8>>2];if(u*u+w*w+o*o>.01?(F=+g[C+3232+(b<<4)>>2],E=+g[C+3232+(b<<4)+4>>2],B=+g[C+3232+(b<<4)+8>>2],I=+g[C+2240+(b<<4)>>2],H=+g[C+2240+(b<<4)+4>>2],G=+g[C+2240+(b<<4)+8>>2],B=u*(I*+g[i>>2]+H*+g[i+4>>2]+G*+g[i+8>>2]+ +g[i+48>>2]-(F*+g[h>>2]+E*+g[h+4>>2]+B*+g[h+8>>2]+ +g[h+48>>2]))+w*(I*+g[i+16>>2]+H*+g[i+20>>2]+G*+g[i+24>>2]+ +g[i+52>>2]-(F*+g[h+16>>2]+E*+g[h+20>>2]+B*+g[h+24>>2]+ +g[h+52>>2]))+o*((A?0.0:I*+g[i+32>>2]+H*+g[i+36>>2]+G*+g[i+40>>2]+ +g[i+56>>2])-(A?0.0:F*+g[h+32>>2]+E*+g[h+36>>2]+B*+g[h+40>>2]+ +g[h+56>>2])),B>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[e>>2]|0)+48>>2]&15](e)}switch(c[f+4>>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[f>>2]|0)+48>>2]&15](f)}if(v<0.0){D=0;l=C;return D|0}switch(c[e+4>>2]|0){case 8:{o=+g[e+32>>2]*+g[e+16>>2];break}case 0:{o=+g[e+48>>2];break}case 1:{o=+g[e+48>>2];break}case 13:{o=+g[e+48>>2];break}case 11:{o=+g[e+48>>2];break}case 10:{o=+g[e+48>>2];break}case 4:case 5:{o=+g[e+48>>2];break}default:o=+nb[c[(c[e>>2]|0)+48>>2]&15](e)}b=c[f+4>>2]|0;switch(b|0){case 8:{s=+g[f+32>>2]*+g[f+16>>2];b=8;break}case 0:{s=+g[f+48>>2];b=0;break}case 1:{s=+g[f+48>>2];b=1;break}case 13:{s=+g[f+48>>2];b=13;break}case 11:{s=+g[f+48>>2];b=11;break}case 10:{s=+g[f+48>>2];b=10;break}case 4:case 5:{s=+g[f+48>>2];break}default:{s=+nb[c[(c[f>>2]|0)+48>>2]&15](f);b=c[f+4>>2]|0}}o=v+(o+s+.5);c[C+176>>2]=9552;c[C+176+4>>2]=0;c[C+176+8>>2]=1065353216;c[C+176+12>>2]=0;g[C+176+16>>2]=0.0;c[C+176+20>>2]=0;c[C+176+24>>2]=d;c[C+176+28>>2]=e;c[C+176+32>>2]=f;c[C+176+36>>2]=c[e+4>>2];c[C+176+40>>2]=b;g[C+176+44>>2]=+nb[c[(c[e>>2]|0)+48>>2]&15](e);g[C+176+48>>2]=+nb[c[(c[f>>2]|0)+48>>2]&15](f);a[C+176+52>>0]=0;c[C+176+60>>2]=-1;c[C+176+72>>2]=1;c[C+176+76>>2]=1;G=u*o+ +g[h+48>>2];H=w*o+ +g[h+52>>2];I=x*o+ +g[h+56>>2];c[C+44>>2]=c[h>>2];c[C+44+4>>2]=c[h+4>>2];c[C+44+8>>2]=c[h+8>>2];c[C+44+12>>2]=c[h+12>>2];c[C+44+16>>2]=c[h+16>>2];c[C+44+16+4>>2]=c[h+16+4>>2];c[C+44+16+8>>2]=c[h+16+8>>2];c[C+44+16+12>>2]=c[h+16+12>>2];c[C+44+32>>2]=c[h+32>>2];c[C+44+32+4>>2]=c[h+32+4>>2];c[C+44+32+8>>2]=c[h+32+8>>2];c[C+44+32+12>>2]=c[h+32+12>>2];g[C+44+48>>2]=G;g[C+44+52>>2]=H;g[C+44+56>>2]=I;g[C+44+60>>2]=0.0;c[C+44+64>>2]=c[i>>2];c[C+44+64+4>>2]=c[i+4>>2];c[C+44+64+8>>2]=c[i+8>>2];c[C+44+64+12>>2]=c[i+12>>2];c[C+44+80>>2]=c[i+16>>2];c[C+44+80+4>>2]=c[i+16+4>>2];c[C+44+80+8>>2]=c[i+16+8>>2];c[C+44+80+12>>2]=c[i+16+12>>2];c[C+44+96>>2]=c[i+32>>2];c[C+44+96+4>>2]=c[i+32+4>>2];c[C+44+96+8>>2]=c[i+32+8>>2];c[C+44+96+12>>2]=c[i+32+12>>2];c[C+44+112>>2]=c[i+48>>2];c[C+44+112+4>>2]=c[i+48+4>>2];c[C+44+112+8>>2]=c[i+48+8>>2];c[C+44+112+12>>2]=c[i+48+12>>2];g[C+44+128>>2]=999999984306749440.0;c[C>>2]=9436;a[C+40>>0]=0;g[C+176+4>>2]=-u;g[C+176+8>>2]=-w;g[C+176+12>>2]=-x;g[C+176+16>>2]=0.0;Dc(C+176|0,C+44|0,C,n,0);o=o-+g[C+36>>2];b=a[C+40>>0]|0;if(b<<24>>24){H=+g[C+24>>2]-w*o;I=+g[C+28>>2]-x*o;g[k>>2]=+g[C+20>>2]-u*o;g[k+4>>2]=H;g[k+8>>2]=I;g[k+12>>2]=0.0;c[m>>2]=c[C+20>>2];c[m+4>>2]=c[C+20+4>>2];c[m+8>>2]=c[C+20+8>>2];c[m+12>>2]=c[C+20+12>>2];g[j>>2]=u;g[j+4>>2]=w;g[j+8>>2]=x;g[j+12>>2]=t}D=b<<24>>24!=0;l=C;return D|0}function Sc(){var a=0;a=Ds(8)|0;c[6994]=a;eb(a|0,0)|0;c[6417]=19310;c[6418]=0;c[6419]=0;c[6420]=0;c[6421]=0;c[6422]=0;c[6423]=0;c[6424]=0;c[6425]=0;Pr(25668);c[6426]=19310;c[6427]=0;c[6428]=0;c[6429]=0;c[6430]=0;c[6431]=0;c[6432]=0;c[6433]=0;c[6434]=0;Pr(25704);c[6435]=19310;c[6436]=0;c[6437]=0;c[6438]=0;c[6439]=0;c[6440]=0;c[6441]=0;c[6442]=0;c[6443]=0;Pr(25740);c[6444]=19310;c[6445]=0;c[6446]=0;c[6447]=0;c[6448]=0;c[6449]=0;c[6450]=0;c[6451]=0;c[6452]=0;Pr(25776);c[6453]=19310;c[6454]=0;c[6455]=0;c[6456]=0;c[6457]=0;c[6458]=0;c[6459]=0;c[6460]=0;c[6461]=0;Pr(25812);c[6462]=19310;c[6463]=0;c[6464]=0;c[6465]=0;c[6466]=0;c[6467]=0;c[6468]=0;c[6469]=0;c[6470]=0;Pr(25848);c[6471]=19310;c[6472]=0;c[6473]=0;c[6474]=0;c[6475]=0;c[6476]=0;c[6477]=0;c[6478]=0;c[6479]=0;Pr(25884);c[6480]=19310;c[6481]=0;c[6482]=0;c[6483]=0;c[6484]=0;c[6485]=0;c[6486]=0;c[6487]=0;c[6488]=0;Pr(25920);c[6489]=19310;c[6490]=0;c[6491]=0;c[6492]=0;c[6493]=0;c[6494]=0;c[6495]=0;c[6496]=0;c[6497]=0;Pr(25956);c[6498]=19310;c[6499]=0;c[6500]=0;c[6501]=0;c[6502]=0;c[6503]=0;c[6504]=0;c[6505]=0;c[6506]=0;Pr(25992);c[6507]=19310;c[6508]=0;c[6509]=0;c[6510]=0;c[6511]=0;c[6512]=0;c[6513]=0;c[6514]=0;c[6515]=0;Pr(26028);c[6516]=19310;c[6517]=0;c[6518]=0;c[6519]=0;c[6520]=0;c[6521]=0;c[6522]=0;c[6523]=0;c[6524]=0;Pr(26064);c[6525]=19310;c[6526]=0;c[6527]=0;c[6528]=0;c[6529]=0;c[6530]=0;c[6531]=0;c[6532]=0;c[6533]=0;Pr(26100);c[6534]=19310;c[6535]=0;c[6536]=0;c[6537]=0;c[6538]=0;c[6539]=0;c[6540]=0;c[6541]=0;c[6542]=0;Pr(26136);c[6543]=19310;c[6544]=0;c[6545]=0;c[6546]=0;c[6547]=0;c[6548]=0;c[6549]=0;c[6550]=0;c[6551]=0;Pr(26172);c[6552]=19310;c[6553]=0;c[6554]=0;c[6555]=0;c[6556]=0;c[6557]=0;c[6558]=0;c[6559]=0;c[6560]=0;Pr(26208);c[6561]=19310;c[6562]=0;c[6563]=0;c[6564]=0;c[6565]=0;c[6566]=0;c[6567]=0;c[6568]=0;c[6569]=0;Pr(26244);c[6570]=19310;c[6571]=0;c[6572]=0;c[6573]=0;c[6574]=0;c[6575]=0;c[6576]=0;c[6577]=0;c[6578]=0;Pr(26280);c[6579]=19310;c[6580]=0;c[6581]=0;c[6582]=0;c[6583]=0;c[6584]=0;c[6585]=0;c[6586]=0;c[6587]=0;Pr(26316);c[6588]=19310;c[6589]=0;c[6590]=0;c[6591]=0;c[6592]=0;c[6593]=0;c[6594]=0;c[6595]=0;c[6596]=0;Pr(26352);c[6597]=19310;c[6598]=0;c[6599]=0;c[6600]=0;c[6601]=0;c[6602]=0;c[6603]=0;c[6604]=0;c[6605]=0;Pr(26388);c[6606]=19310;c[6607]=0;c[6608]=0;c[6609]=0;c[6610]=0;c[6611]=0;c[6612]=0;c[6613]=0;c[6614]=0;Pr(26424);c[6615]=19310;c[6616]=0;c[6617]=0;c[6618]=0;c[6619]=0;c[6620]=0;c[6621]=0;c[6622]=0;c[6623]=0;Pr(26460);c[6624]=19310;c[6625]=0;c[6626]=0;c[6627]=0;c[6628]=0;c[6629]=0;c[6630]=0;c[6631]=0;c[6632]=0;Pr(26496);c[6633]=19310;c[6634]=0;c[6635]=0;c[6636]=0;c[6637]=0;c[6638]=0;c[6639]=0;c[6640]=0;c[6641]=0;Pr(26532);c[6642]=19310;c[6643]=0;c[6644]=0;c[6645]=0;c[6646]=0;c[6647]=0;c[6648]=0;c[6649]=0;c[6650]=0;Pr(26568);c[6651]=19310;c[6652]=0;c[6653]=0;c[6654]=0;c[6655]=0;c[6656]=0;c[6657]=0;c[6658]=0;c[6659]=0;Pr(26604);c[6660]=19310;c[6661]=0;c[6662]=0;c[6663]=0;c[6664]=0;c[6665]=0;c[6666]=0;c[6667]=0;c[6668]=0;Pr(26640);c[6669]=19310;c[6670]=0;c[6671]=0;c[6672]=0;c[6673]=0;c[6674]=0;c[6675]=0;c[6676]=0;c[6677]=0;Pr(26676);c[6678]=19310;c[6679]=0;c[6680]=0;c[6681]=0;c[6682]=0;c[6683]=0;c[6684]=0;c[6685]=0;c[6686]=0;Pr(26712);c[6687]=19310;c[6688]=0;c[6689]=0;c[6690]=0;c[6691]=0;c[6692]=0;c[6693]=0;c[6694]=0;c[6695]=0;Pr(26748);c[6696]=19310;c[6697]=0;c[6698]=0;c[6699]=0;c[6700]=0;c[6701]=0;c[6702]=0;c[6703]=0;c[6704]=0;Pr(26784);c[6705]=19310;c[6706]=0;c[6707]=0;c[6708]=0;c[6709]=0;c[6710]=0;c[6711]=0;c[6712]=0;c[6713]=0;Pr(26820);c[6714]=19310;c[6715]=0;c[6716]=0;c[6717]=0;c[6718]=0;c[6719]=0;c[6720]=0;c[6721]=0;c[6722]=0;Pr(26856);c[6723]=19310;c[6724]=0;c[6725]=0;c[6726]=0;c[6727]=0;c[6728]=0;c[6729]=0;c[6730]=0;c[6731]=0;Pr(26892);c[6732]=19310;c[6733]=0;c[6734]=0;c[6735]=0;c[6736]=0;c[6737]=0;c[6738]=0;c[6739]=0;c[6740]=0;Pr(26928);c[6741]=19310;c[6742]=0;c[6743]=0;c[6744]=0;c[6745]=0;c[6746]=0;c[6747]=0;c[6748]=0;c[6749]=0;Pr(26964);c[6750]=19310;c[6751]=0;c[6752]=0;c[6753]=0;c[6754]=0;c[6755]=0;c[6756]=0;c[6757]=0;c[6758]=0;Pr(27e3);c[6759]=19310;c[6760]=0;c[6761]=0;c[6762]=0;c[6763]=0;c[6764]=0;c[6765]=0;c[6766]=0;c[6767]=0;Pr(27036);c[6768]=19310;c[6769]=0;c[6770]=0;c[6771]=0;c[6772]=0;c[6773]=0;c[6774]=0;c[6775]=0;c[6776]=0;Pr(27072);c[6777]=19310;c[6778]=0;c[6779]=0;c[6780]=0;c[6781]=0;c[6782]=0;c[6783]=0;c[6784]=0;c[6785]=0;Pr(27108);c[6786]=19310;c[6787]=0;c[6788]=0;c[6789]=0;c[6790]=0;c[6791]=0;c[6792]=0;c[6793]=0;c[6794]=0;Pr(27144);c[6795]=19310;c[6796]=0;c[6797]=0;c[6798]=0;c[6799]=0;c[6800]=0;c[6801]=0;c[6802]=0;c[6803]=0;Pr(27180);c[6804]=19310;c[6805]=0;c[6806]=0;c[6807]=0;c[6808]=0;c[6809]=0;c[6810]=0;c[6811]=0;c[6812]=0;Pr(27216);c[6813]=19310;c[6814]=0;c[6815]=0;c[6816]=0;c[6817]=0;c[6818]=0;c[6819]=0;c[6820]=0;c[6821]=0;Pr(27252);c[6822]=19310;c[6823]=0;c[6824]=0;c[6825]=0;c[6826]=0;c[6827]=0;c[6828]=0;c[6829]=0;c[6830]=0;Pr(27288);c[6831]=19310;c[6832]=0;c[6833]=0;c[6834]=0;c[6835]=0;c[6836]=0;c[6837]=0;c[6838]=0;c[6839]=0;Pr(27324);c[6840]=19310;c[6841]=0;c[6842]=0;c[6843]=0;c[6844]=0;c[6845]=0;c[6846]=0;c[6847]=0;c[6848]=0;Pr(27360);c[6849]=19310;c[6850]=0;c[6851]=0;c[6852]=0;c[6853]=0;c[6854]=0;c[6855]=0;c[6856]=0;c[6857]=0;Pr(27396);c[6858]=19310;c[6859]=0;c[6860]=0;c[6861]=0;c[6862]=0;c[6863]=0;c[6864]=0;c[6865]=0;c[6866]=0;Pr(27432);c[6867]=19310;c[6868]=0;c[6869]=0;c[6870]=0;c[6871]=0;c[6872]=0;c[6873]=0;c[6874]=0;c[6875]=0;Pr(27468);c[6876]=19310;c[6877]=0;c[6878]=0;c[6879]=0;c[6880]=0;c[6881]=0;c[6882]=0;c[6883]=0;c[6884]=0;Pr(27504);c[6885]=19310;c[6886]=0;c[6887]=0;c[6888]=0;c[6889]=0;c[6890]=0;c[6891]=0;c[6892]=0;c[6893]=0;Pr(27540);c[6894]=19310;c[6895]=0;c[6896]=0;c[6897]=0;c[6898]=0;c[6899]=0;c[6900]=0;c[6901]=0;c[6902]=0;Pr(27576);c[6903]=19310;c[6904]=0;c[6905]=0;c[6906]=0;c[6907]=0;c[6908]=0;c[6909]=0;c[6910]=0;c[6911]=0;Pr(27612);c[6912]=19310;c[6913]=0;c[6914]=0;c[6915]=0;c[6916]=0;c[6917]=0;c[6918]=0;c[6919]=0;c[6920]=0;Pr(27648);c[6921]=19310;c[6922]=0;c[6923]=0;c[6924]=0;c[6925]=0;c[6926]=0;c[6927]=0;c[6928]=0;c[6929]=0;Pr(27684);c[6930]=19310;c[6931]=0;c[6932]=0;c[6933]=0;c[6934]=0;c[6935]=0;c[6936]=0;c[6937]=0;c[6938]=0;Pr(27720);c[6939]=19310;c[6940]=0;c[6941]=0;c[6942]=0;c[6943]=0;c[6944]=0;c[6945]=0;c[6946]=0;c[6947]=0;Pr(27756);c[6948]=19310;c[6949]=0;c[6950]=0;c[6951]=0;c[6952]=0;c[6953]=0;c[6954]=0;c[6955]=0;c[6956]=0;Pr(27792);c[6957]=19310;c[6958]=0;c[6959]=0;c[6960]=0;c[6961]=0;c[6962]=0;c[6963]=0;c[6964]=0;c[6965]=0;Pr(27828);c[6966]=19310;c[6967]=0;c[6968]=0;c[6969]=0;c[6970]=0;c[6971]=0;c[6972]=0;c[6973]=0;c[6974]=0;Pr(27864);c[6975]=19310;c[6976]=0;c[6977]=0;c[6978]=0;c[6979]=0;c[6980]=0;c[6981]=0;c[6982]=0;c[6983]=0;Pr(27900);c[6984]=19310;c[6985]=0;c[6986]=0;c[6987]=0;c[6988]=0;c[6989]=0;c[6990]=0;c[6991]=0;c[6992]=0;Pr(27936);return}function Tc(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0;H=l;l=l+192|0;d=c[b+1112>>2]|0;if((d|0)<=0){l=H;return}G=0;do{F=c[(c[b+1120>>2]|0)+(G<<2)>>2]|0;E=c[F+24>>2]|0;if(E){i=H+144+4|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));g[H+144>>2]=9.999999747378752e-05;g[H+144+20>>2]=1.9999999494757503e-04;g[H+144+40>>2]=2.9999998514540493e-04;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;d=0;e=0.0;f=0.0;h=0.0;do{D=c[i+(d<<2)>>2]|0;C=+g[j+(d<<2)>>2];e=e+ +g[D+8>>2]*C;f=f+C*+g[D+12>>2];h=h+C*+g[D+16>>2];d=d+1|0}while((d|0)!=(E|0))}else{h=0.0;f=0.0;e=0.0}r=+g[F+128>>2];t=e*r;s=f*r;r=h*r;g[F+228>>2]=t;g[F+232>>2]=s;g[F+236>>2]=r;g[F+240>>2]=0.0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+52>>2]|0;d=0;e=9.999999747378752e-05;f=0.0;h=0.0;k=0.0;m=1.9999999494757503e-04;n=0.0;o=0.0;p=0.0;q=2.9999998514540493e-04;do{D=c[i+(d<<2)>>2]|0;x=+g[D+8>>2]-t;y=+g[D+12>>2]-s;B=+g[D+16>>2]-r;z=+g[j+(d<<4)>>2];A=+g[j+(d<<4)+4>>2];C=+g[j+(d<<4)+8>>2];e=x*z+e;f=x*A+f;h=x*C+h;k=y*z+k;m=y*A+m;n=y*C+n;o=B*z+o;p=B*A+p;q=B*C+q;d=d+1|0}while((d|0)!=(E|0));g[H+144>>2]=e;g[H+144+4>>2]=f;g[H+144+8>>2]=h;g[H+144+16>>2]=k;g[H+144+20>>2]=m;g[H+144+24>>2]=n;g[H+144+32>>2]=o;g[H+144+36>>2]=p;g[H+144+40>>2]=q}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(H+144|0,H+96|0,H+48|0);c[F+108>>2]=c[F+228>>2];c[F+108+4>>2]=c[F+228+4>>2];c[F+108+8>>2]=c[F+228+8>>2];c[F+108+12>>2]=c[F+228+12>>2];c[F+60>>2]=c[H+96>>2];c[F+60+4>>2]=c[H+96+4>>2];c[F+60+8>>2]=c[H+96+8>>2];c[F+60+12>>2]=c[H+96+12>>2];c[F+76>>2]=c[H+96+16>>2];c[F+76+4>>2]=c[H+96+16+4>>2];c[F+76+8>>2]=c[H+96+16+8>>2];c[F+76+12>>2]=c[H+96+16+12>>2];c[F+92>>2]=c[H+96+32>>2];c[F+92+4>>2]=c[H+96+32+4>>2];c[F+92+8>>2]=c[H+96+32+8>>2];c[F+92+12>>2]=c[H+96+32+12>>2];m=+g[F+132>>2];K=+g[F+60>>2];n=+g[F+148>>2];J=+g[F+64>>2];o=+g[F+164>>2];A=+g[F+68>>2];p=+g[F+136>>2];q=+g[F+152>>2];r=+g[F+168>>2];s=+g[F+140>>2];t=+g[F+156>>2];C=+g[F+172>>2];I=+g[F+76>>2];e=+g[F+80>>2];B=+g[F+84>>2];k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];u=(m*K+n*J+o*A)*K+(K*p+J*q+A*r)*J+(K*s+J*t+A*C)*A;v=(m*K+n*J+o*A)*I+(K*p+J*q+A*r)*e+(K*s+J*t+A*C)*B;w=(m*K+n*J+o*A)*k+(K*p+J*q+A*r)*h+(K*s+J*t+A*C)*f;x=(m*I+n*e+o*B)*K+(p*I+q*e+r*B)*J+(s*I+t*e+C*B)*A;y=(m*I+n*e+o*B)*I+(p*I+q*e+r*B)*e+(s*I+t*e+C*B)*B;z=(m*I+n*e+o*B)*k+(p*I+q*e+r*B)*h+(s*I+t*e+C*B)*f;A=K*(m*k+n*h+o*f)+(p*k+q*h+r*f)*J+(s*k+t*h+C*f)*A;B=I*(m*k+n*h+o*f)+(p*k+q*h+r*f)*e+(s*k+t*h+C*f)*B;C=(m*k+n*h+o*f)*k+(p*k+q*h+r*f)*h+(s*k+t*h+C*f)*f;g[F+180>>2]=u;g[F+184>>2]=v;g[F+188>>2]=w;g[F+192>>2]=0.0;g[F+196>>2]=x;g[F+200>>2]=y;g[F+204>>2]=z;g[F+208>>2]=0.0;g[F+212>>2]=A;g[F+216>>2]=B;g[F+220>>2]=C;g[F+224>>2]=0.0;c[F+316>>2]=0;c[F+316+4>>2]=0;c[F+316+8>>2]=0;c[F+316+12>>2]=0;c[F+316+16>>2]=0;c[F+316+20>>2]=0;c[F+316+24>>2]=0;c[F+316+28>>2]=0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;r=+g[F+228>>2];s=+g[F+232>>2];t=+g[F+236>>2];d=0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0;do{D=c[i+(d<<2)>>2]|0;M=+g[j+(d<<2)>>2];J=+g[D+40>>2]*M;L=M*+g[D+44>>2];M=M*+g[D+48>>2];q=J+q;g[F+316>>2]=q;p=L+p;g[F+320>>2]=p;o=M+o;g[F+324>>2]=o;I=+g[D+8>>2]-r;K=+g[D+12>>2]-s;N=+g[D+16>>2]-t;n=n+(M*K-L*N);g[F+332>>2]=n;m=J*N-M*I+m;g[F+336>>2]=m;e=L*I-J*K+e;g[F+340>>2]=e;d=d+1|0}while((d|0)!=(E|0));D=F+316|0;d=F+332|0}else{D=F+316|0;d=F+332|0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0}M=+g[F+128>>2];N=1.0-+g[F+356>>2];g[F+316>>2]=q*M*N;g[F+320>>2]=M*p*N;g[F+324>>2]=M*o*N;g[F+328>>2]=0.0;N=1.0-+g[F+360>>2];g[d>>2]=(u*n+v*m+w*e)*N;g[F+336>>2]=(n*x+m*y+e*z)*N;g[F+340>>2]=N*(n*A+m*B+e*C);g[F+344>>2]=0.0;i=F+244|0;j=i+72|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));e=+g[F+364>>2];a:do if(e>0.0?(c[F+24>>2]|0)>0:0){d=0;while(1){j=c[(c[F+32>>2]|0)+(d<<2)>>2]|0;i=c[F+52>>2]|0;I=+g[i+(d<<4)>>2];J=+g[i+(d<<4)+4>>2];K=+g[i+(d<<4)+8>>2];L=+g[j+8>>2];M=+g[j+12>>2];N=+g[j+16>>2];M=M+e*(I*+g[F+76>>2]+J*+g[F+80>>2]+K*+g[F+84>>2]+ +g[F+112>>2]-M);N=N+e*(I*k+J*h+K*f+ +g[F+116>>2]-N);g[j+8>>2]=L+e*(I*+g[F+60>>2]+J*+g[F+64>>2]+K*+g[F+68>>2]+ +g[F+108>>2]-L);g[j+12>>2]=M;g[j+16>>2]=N;g[j+20>>2]=0.0;d=d+1|0;if((d|0)>=(c[F+24>>2]|0))break a;k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];e=+g[F+364>>2]}}while(0);if(a[F+377>>0]|0){i=c[F+32>>2]|0;j=c[i>>2]|0;e=+g[j+8>>2];q=+g[j+12>>2];r=+g[j+16>>2];f=+g[j+20>>2];if((E|0)>1){d=1;m=e;p=e;n=f;o=r;k=f;h=q;f=q;e=r;do{j=c[i+(d<<2)>>2]|0;K=+g[j+8>>2];p=K>2];f=L>2];o=M>2];k=N>2]=p;g[H+16+4>>2]=f;g[H+16+8>>2]=o;g[H+16+12>>2]=k;g[H+16+16>>2]=m;g[H+16+20>>2]=h;g[H+16+24>>2]=e;g[H+16+28>>2]=n;d=c[F+348>>2]|0;if(!d){d=c[b+1072>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+1072>>2]=0;c[d+32>>2]=0;c[d+36>>2]=F;c[d+40>>2]=0;c[d>>2]=c[H+16>>2];c[d+4>>2]=c[H+16+4>>2];c[d+8>>2]=c[H+16+8>>2];c[d+12>>2]=c[H+16+12>>2];c[d+16>>2]=c[H+16+16>>2];c[d+20>>2]=c[H+16+20>>2];c[d+24>>2]=c[H+16+24>>2];c[d+28>>2]=c[H+16+28>>2];Pe(b+1068|0,c[b+1068>>2]|0,d);c[b+1080>>2]=(c[b+1080>>2]|0)+1;c[F+348>>2]=d}else{L=+g[b+512>>2];M=L*+g[F+320>>2]*3.0;N=L*+g[F+324>>2]*3.0;g[H>>2]=+g[D>>2]*L*3.0;g[H+4>>2]=M;g[H+8>>2]=N;g[H+12>>2]=0.0;uh(b+1068|0,d,H+16|0,H,+g[b+524>>2])|0}}d=c[b+1112>>2]|0}G=G+1|0}while((G|0)<(d|0));l=H;return}function Uc(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;o=l;l=l+48|0;d=c[a+24>>2]|0;if((d|0)<=0){l=o;return}n=0;a:while(1){m=c[(c[a+32>>2]|0)+(n<<2)>>2]|0;switch(c[m+220>>2]|0){case 2:case 5:break;default:{ee(m,0);e=c[m+792>>2]|0;if((e|0)>0){d=0;do{k=c[m+800>>2]|0;i=c[k+(d*52|0)+28>>2]|0;j=c[k+(d*52|0)+24>>2]|0;y=+g[i+24>>2]-+g[j+24>>2];x=+g[i+28>>2]-+g[j+28>>2];b=+g[i+32>>2]-+g[j+32>>2];g[k+(d*52|0)+8>>2]=y;g[k+(d*52|0)+12>>2]=x;g[k+(d*52|0)+16>>2]=b;g[k+(d*52|0)+20>>2]=0.0;g[k+(d*52|0)+48>>2]=1.0/(+g[k+(d*52|0)+40>>2]*(y*y+x*x+b*b));d=d+1|0}while((d|0)!=(e|0))}f=c[m+852>>2]|0;if((f|0)>0){d=0;b=+g[m+512>>2];do{k=c[m+860>>2]|0;e=k+(d*96|0)+20|0;i=c[e>>2]|0;H=+g[k+(d*96|0)+4>>2];J=+g[k+(d*96|0)+8>>2];y=+g[k+(d*96|0)+12>>2];z=+g[i+4>>2]*H+ +g[i+8>>2]*J+ +g[i+12>>2]*y;x=H*+g[i+20>>2]+J*+g[i+24>>2]+y*+g[i+28>>2];y=H*+g[i+36>>2]+J*+g[i+40>>2]+y*+g[i+44>>2];j=k+(d*96|0)|0;J=+g[(c[j>>2]|0)+88>>2];H=1.0/b;Uh(o,+g[i+404>>2],i+324|0,z,x,y);C=J+ +g[o>>2];G=+g[o+4>>2]+0.0;E=+g[o+8>>2]+0.0;D=+g[o+16>>2]+0.0;F=J+ +g[o+20>>2];B=+g[o+24>>2]+0.0;I=+g[o+32>>2]+0.0;K=+g[o+36>>2]+0.0;J=J+ +g[o+40>>2];A=1.0/(E*(D*K-F*I)+(C*(F*J-B*K)+G*(B*I-D*J)));g[k+(d*96|0)+28>>2]=(D*K-F*I)*A*0.0+(H*(F*J-B*K)*A+(B*I-D*J)*A*0.0);g[k+(d*96|0)+32>>2]=(G*I-C*K)*A*0.0+(H*(E*K-G*J)*A+(C*J-E*I)*A*0.0);g[k+(d*96|0)+36>>2]=(C*F-G*D)*A*0.0+(H*(G*B-E*F)*A+(E*D-C*B)*A*0.0);g[k+(d*96|0)+40>>2]=0.0;g[k+(d*96|0)+44>>2]=(D*K-F*I)*A*0.0+((F*J-B*K)*A*0.0+H*(B*I-D*J)*A);g[k+(d*96|0)+48>>2]=(G*I-C*K)*A*0.0+((E*K-G*J)*A*0.0+H*(C*J-E*I)*A);g[k+(d*96|0)+52>>2]=(C*F-G*D)*A*0.0+((G*B-E*F)*A*0.0+H*(E*D-C*B)*A);g[k+(d*96|0)+56>>2]=0.0;g[k+(d*96|0)+60>>2]=H*(D*K-F*I)*A+((F*J-B*K)*A*0.0+(B*I-D*J)*A*0.0);g[k+(d*96|0)+64>>2]=H*(G*I-C*K)*A+((E*K-G*J)*A*0.0+(C*J-E*I)*A*0.0);g[k+(d*96|0)+68>>2]=H*(C*F-G*D)*A+((G*B-E*F)*A*0.0+(E*D-C*B)*A*0.0);g[k+(d*96|0)+72>>2]=0.0;g[k+(d*96|0)+76>>2]=z;g[k+(d*96|0)+80>>2]=x;g[k+(d*96|0)+84>>2]=y;g[k+(d*96|0)+88>>2]=0.0;b=+g[m+512>>2];g[k+(d*96|0)+92>>2]=b*+g[(c[j>>2]|0)+88>>2];e=c[e>>2]|0;if(!(c[e+204>>2]&3)){if((c[e+220>>2]&-2|0)!=4)c[e+220>>2]=1;g[e+224>>2]=0.0}d=d+1|0}while((d|0)!=(f|0))}d=c[m+432>>2]|0;if((d|0)>0){f=0;e=c[m+456>>2]|0;do{if((e|0)>0){d=0;do{Jb[((c[(c[m+464>>2]|0)+(d<<2)>>2]|0)==0?25:0)&31](m,1.0);d=d+1|0;e=c[m+456>>2]|0}while((d|0)<(e|0));d=c[m+432>>2]|0}f=f+1|0}while((f|0)<(d|0));e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;I=+g[m+512>>2];J=I*+g[k+(d*104|0)+44>>2]+ +g[k+(d*104|0)+28>>2];K=I*+g[k+(d*104|0)+48>>2]+ +g[k+(d*104|0)+32>>2];g[k+(d*104|0)+8>>2]=+g[k+(d*104|0)+40>>2]*I+ +g[k+(d*104|0)+24>>2];g[k+(d*104|0)+12>>2]=J;g[k+(d*104|0)+16>>2]=K;g[k+(d*104|0)+20>>2]=0.0;d=d+1|0}while((d|0)!=(e|0))}}d=c[m+436>>2]|0;if((d|0)>0){h=0;e=c[m+476>>2]|0;do{b=+(h|0)/+(d|0);if((e|0)>0){f=0;do{switch(c[(c[m+484>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=35;break a}}Kb[d&7](m,1.0,b);f=f+1|0;e=c[m+476>>2]|0}while((f|0)<(e|0));d=c[m+436>>2]|0}h=h+1|0}while((h|0)<(d|0));b=+g[m+516>>2]*(1.0-+g[m+356>>2]);e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;J=b*(+g[k+(d*104|0)+12>>2]-+g[k+(d*104|0)+28>>2]);K=b*(+g[k+(d*104|0)+16>>2]-+g[k+(d*104|0)+32>>2]);g[k+(d*104|0)+40>>2]=b*(+g[k+(d*104|0)+8>>2]-+g[k+(d*104|0)+24>>2]);g[k+(d*104|0)+44>>2]=J;g[k+(d*104|0)+48>>2]=K;k=k+(d*104|0)+52|0;d=d+1|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0}while((d|0)!=(e|0))}}d=c[m+440>>2]|0;if((d|0)>0){b=+g[m+352>>2]*+g[m+516>>2];e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;j=k+(d*104|0)+8|0;k=k+(d*104|0)+24|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(e|0));d=c[m+440>>2]|0;if((d|0)>0)w=42}else w=42;if((w|0)==42){w=0;h=0;e=c[m+496>>2]|0;do{if((e|0)>0){f=0;do{switch(c[(c[m+504>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=53;break a}}Kb[d&7](m,1.0,0.0);f=f+1|0;e=c[m+496>>2]|0}while((f|0)<(e|0));d=c[m+440>>2]|0}h=h+1|0}while((h|0)<(d|0))}e=c[m+772>>2]|0;if((e|0)>0){f=c[m+780>>2]|0;d=0;do{J=b*(+g[f+(d*104|0)+12>>2]-+g[f+(d*104|0)+28>>2]);K=b*(+g[f+(d*104|0)+16>>2]-+g[f+(d*104|0)+32>>2]);k=f+(d*104|0)+40|0;g[k>>2]=b*(+g[f+(d*104|0)+8>>2]-+g[f+(d*104|0)+24>>2])+ +g[k>>2];k=f+(d*104|0)+44|0;g[k>>2]=J+ +g[k>>2];k=f+(d*104|0)+48|0;g[k>>2]=K+ +g[k>>2];d=d+1|0}while((d|0)!=(e|0))}}f=c[m+1112>>2]|0;if((f|0)>0){h=c[m+1120>>2]|0;e=0;do{i=c[h+(e<<2)>>2]|0;if(+g[i+352>>2]>0.0?(p=c[i+24>>2]|0,(p|0)>0):0){j=c[i+32>>2]|0;d=0;do{k=c[j+(d<<2)>>2]|0;if(+g[k+88>>2]>0.0?(t=+g[k+24>>2]-+g[i+228>>2],v=+g[k+28>>2]-+g[i+232>>2],r=+g[k+32>>2]-+g[i+236>>2],s=+g[i+336>>2],K=+g[i+340>>2],u=+g[i+332>>2],q=+g[i+316>>2]+(s*r-v*K),r=+g[i+320>>2]+(t*K-r*u),s=v*u-t*s+ +g[i+324>>2],t=+g[k+40>>2],u=+g[k+44>>2],v=+g[k+48>>2],q*q+r*r+s*s<=t*t+u*u+v*v):0){K=+g[i+352>>2];g[k+40>>2]=t+(q-t)*K;g[k+44>>2]=(r-u)*K+u;g[k+48>>2]=(s-v)*K+v}d=d+1|0}while((d|0)!=(p|0))}e=e+1|0}while((e|0)!=(f|0))}ee(m,1);d=c[a+24>>2]|0}}n=n+1|0;if((n|0)>=(d|0)){w=3;break}}if((w|0)==3){l=o;return}}function Vc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0;q=l;l=l+80|0;i=c[b+28>>2]|0;d=c[f+72>>2]|0;if((d&4|0)!=0&(i|0)>0){e=c[b+36>>2]|0;h=c[b+76>>2]|0;if(!(d&16)){d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];c[m+128>>2]=c[h+((c[e+(d*152|0)+140>>2]|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}else{d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];k=c[e+(d*152|0)+140>>2]|0;c[m+128>>2]=c[h+(k*152|0)+100>>2];c[m+132>>2]=c[h+((k+1|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}}h=c[b+48>>2]|0;if((h|0)>0){d=0;do{i=c[b+56>>2]|0;k=c[i+(d*152|0)+132>>2]|0;m=c[k+44>>2]|0;e=i+(d*152|0)+100|0;if(m|0){p=+g[e>>2];s=c[k+28>>2]|0;o=1.0/+g[f+12>>2];n=p*+g[i+(d*152|0)+20>>2]*+g[s+412>>2]*o;r=p*+g[i+(d*152|0)+24>>2]*+g[s+416>>2]*o;g[m>>2]=+g[m>>2]+ +g[i+(d*152|0)+16>>2]*p*+g[s+408>>2]*o;g[m+4>>2]=n+ +g[m+4>>2];g[m+8>>2]=r+ +g[m+8>>2];r=+g[e>>2];s=c[k+32>>2]|0;n=1.0/+g[f+12>>2];o=r*+g[i+(d*152|0)+52>>2]*+g[s+412>>2]*n;p=r*+g[i+(d*152|0)+56>>2]*+g[s+416>>2]*n;g[m+32>>2]=+g[m+32>>2]+ +g[i+(d*152|0)+48>>2]*r*+g[s+408>>2]*n;g[m+36>>2]=o+ +g[m+36>>2];g[m+40>>2]=p+ +g[m+40>>2];s=c[k+28>>2]|0;p=+g[e>>2];o=1.0/+g[f+12>>2];n=+g[i+(d*152|0)+4>>2]*+g[s+608>>2]*p*o;r=p*+g[i+(d*152|0)+8>>2]*+g[s+612>>2]*o;g[m+16>>2]=+g[m+16>>2]+ +g[i+(d*152|0)>>2]*+g[s+604>>2]*p*o;g[m+20>>2]=n+ +g[m+20>>2];g[m+24>>2]=r+ +g[m+24>>2];s=c[k+32>>2]|0;r=+g[e>>2];n=1.0/+g[f+12>>2];o=+g[i+(d*152|0)+36>>2]*+g[s+608>>2]*r*n;p=r*+g[i+(d*152|0)+40>>2]*+g[s+612>>2]*n;g[m+48>>2]=+g[m+48>>2]+ +g[i+(d*152|0)+32>>2]*+g[s+604>>2]*r*n;g[m+52>>2]=o+ +g[m+52>>2];g[m+56>>2]=p+ +g[m+56>>2]}s=c[e>>2]|0;c[k+36>>2]=s;r=+C(+(c[j>>2]=s,+g[j>>2]));if(r>=+g[k+16>>2])a[k+20>>0]=0;d=d+1|0}while((d|0)!=(h|0))}e=c[b+8>>2]|0;if((e|0)>0){k=0;d=c[b+16>>2]|0;do{h=d+(k*244|0)|0;i=c[d+(k*244|0)+240>>2]|0;if(i){if(!(c[f+52>>2]|0)){h=d+(k*244|0)+176|0;o=+g[d+(k*244|0)+64>>2]+ +g[h>>2];g[h>>2]=o;h=d+(k*244|0)+180|0;p=+g[d+(k*244|0)+68>>2]+ +g[h>>2];g[h>>2]=p;h=d+(k*244|0)+184|0;n=+g[d+(k*244|0)+72>>2]+ +g[h>>2];g[h>>2]=n;h=d+(k*244|0)+192|0;g[h>>2]=+g[d+(k*244|0)+80>>2]+ +g[h>>2];h=d+(k*244|0)+196|0;g[h>>2]=+g[d+(k*244|0)+84>>2]+ +g[h>>2];h=d+(k*244|0)+200|0;g[h>>2]=+g[d+(k*244|0)+88>>2]+ +g[h>>2];h=d;d=i}else{n=+g[f+12>>2];o=+g[f+60>>2];e=d+(k*244|0)+176|0;g[e>>2]=+g[d+(k*244|0)+64>>2]+ +g[e>>2];e=d+(k*244|0)+180|0;g[e>>2]=+g[d+(k*244|0)+68>>2]+ +g[e>>2];e=d+(k*244|0)+184|0;g[e>>2]=+g[d+(k*244|0)+72>>2]+ +g[e>>2];e=d+(k*244|0)+192|0;g[e>>2]=+g[d+(k*244|0)+80>>2]+ +g[e>>2];e=d+(k*244|0)+196|0;g[e>>2]=+g[d+(k*244|0)+84>>2]+ +g[e>>2];e=d+(k*244|0)+200|0;g[e>>2]=+g[d+(k*244|0)+88>>2]+ +g[e>>2];p=+g[d+(k*244|0)+144>>2];e=d+(k*244|0)+148|0;if(((((!(p!=0.0)?!(+g[e>>2]!=0.0):0)?!(+g[d+(k*244|0)+152>>2]!=0.0):0)?!(+g[d+(k*244|0)+160>>2]!=0.0):0)?!(+g[d+(k*244|0)+164>>2]!=0.0):0)?!(+g[d+(k*244|0)+168>>2]!=0.0):0)e=i;else{t=+g[d+(k*244|0)+164>>2]*o;r=+g[d+(k*244|0)+168>>2]*o;g[q>>2]=+g[d+(k*244|0)+160>>2]*o;g[q+4>>2]=t;g[q+8>>2]=r;g[q+12>>2]=0.0;Af(h,p,+g[e>>2],+g[d+(k*244|0)+152>>2],q,n,q+16|0);c[h>>2]=c[q+16>>2];c[h+4>>2]=c[q+16+4>>2];c[h+8>>2]=c[q+16+8>>2];c[h+12>>2]=c[q+16+12>>2];e=d+(k*244|0)+16|0;c[e>>2]=c[q+16+16>>2];c[e+4>>2]=c[q+16+16+4>>2];c[e+8>>2]=c[q+16+16+8>>2];c[e+12>>2]=c[q+16+16+12>>2];e=d+(k*244|0)+32|0;c[e>>2]=c[q+16+32>>2];c[e+4>>2]=c[q+16+32+4>>2];c[e+8>>2]=c[q+16+32+8>>2];c[e+12>>2]=c[q+16+32+12>>2];e=d+(k*244|0)+48|0;c[e>>2]=c[q+16+48>>2];c[e+4>>2]=c[q+16+48+4>>2];c[e+8>>2]=c[q+16+48+8>>2];c[e+12>>2]=c[q+16+48+12>>2];e=c[b+16>>2]|0;d=e;e=c[e+(k*244|0)+240>>2]|0}h=d;o=+g[d+(k*244|0)+176>>2];p=+g[d+(k*244|0)+180>>2];n=+g[d+(k*244|0)+184>>2];d=e}t=o+ +g[h+(k*244|0)+208>>2];r=p+ +g[h+(k*244|0)+212>>2];p=n+ +g[h+(k*244|0)+216>>2];m=d+304|0;c[m>>2]=(c[m>>2]|0)+1;g[d+372>>2]=t;g[d+376>>2]=r;g[d+380>>2]=p;g[d+384>>2]=0.0;m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;p=+g[m+(k*244|0)+192>>2]+ +g[m+(k*244|0)+224>>2];r=+g[m+(k*244|0)+196>>2]+ +g[m+(k*244|0)+228>>2];t=+g[m+(k*244|0)+200>>2]+ +g[m+(k*244|0)+232>>2];c[s+304>>2]=(c[s+304>>2]|0)+1;g[s+388>>2]=p;g[s+392>>2]=r;g[s+396>>2]=t;g[s+400>>2]=0.0;if(c[f+52>>2]|0){m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;i=m+(k*244|0)|0;c[s+304>>2]=(c[s+304>>2]|0)+1;c[s+4>>2]=c[i>>2];c[s+4+4>>2]=c[i+4>>2];c[s+4+8>>2]=c[i+8>>2];c[s+4+12>>2]=c[i+12>>2];i=m+(k*244|0)+16|0;c[s+20>>2]=c[i>>2];c[s+20+4>>2]=c[i+4>>2];c[s+20+8>>2]=c[i+8>>2];c[s+20+12>>2]=c[i+12>>2];i=m+(k*244|0)+32|0;c[s+36>>2]=c[i>>2];c[s+36+4>>2]=c[i+4>>2];c[s+36+8>>2]=c[i+8>>2];c[s+36+12>>2]=c[i+12>>2];m=m+(k*244|0)+48|0;c[s+52>>2]=c[m>>2];c[s+52+4>>2]=c[m+4>>2];c[s+52+8>>2]=c[m+8>>2];c[s+52+12>>2]=c[m+12>>2]}d=c[b+16>>2]|0;c[(c[d+(k*244|0)+240>>2]|0)+212>>2]=-1;e=c[b+8>>2]|0}k=k+1|0}while((k|0)<(e|0))}if((c[b+28>>2]|0)<0?(c[b+32>>2]|0)<0:0){d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+32>>2]=0}c[b+28>>2]=0;if((c[b+48>>2]|0)<0?(c[b+52>>2]|0)<0:0){d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+52>>2]=0}c[b+48>>2]=0;if((c[b+68>>2]|0)<0?(c[b+72>>2]|0)<0:0){d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+72>>2]=0}c[b+68>>2]=0;if((c[b+88>>2]|0)<0?(c[b+92>>2]|0)<0:0){d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+92>>2]=0}c[b+88>>2]=0;if((c[b+8>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}if((c[b+12>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0;c[b+8>>2]=0;l=q;return 0.0}function Wc(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0;D=l;l=l+560|0;C=D+524|0;c[D>>2]=0;B=D+512+12|0;lw(e)|0;if((A|0)<0){e=-e;y=1;x=19796}else{y=(h&2049|0)!=0&1;x=(h&2048|0)==0?((h&1|0)==0?19797:19802):19799}lw(e)|0;z=A&2146435072;do if(z>>>0<2146435072|(z|0)==2146435072&0<0){p=+dI(e,D)*2.0;if(p!=0.0)c[D>>2]=(c[D>>2]|0)+-1;if((i|32|0)==97){o=(i&32|0)==0?x:x+9|0;n=y|2;do if(!(g>>>0>11|(12-g|0)==0)){e=8.0;j=12-g|0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[o>>0]|0)==45){e=-(e+(-p-e));break}else{e=p+e-e;break}}else e=p;while(0);k=c[D>>2]|0;j=(k|0)<0?0-k|0:k;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((j|0)==(B|0)){a[D+512+11>>0]=48;j=D+512+11|0}a[j+-1>>0]=(k>>31&2)+43;m=j+-2|0;a[m>>0]=i+15;j=D+524|0;do{z=~~e;k=j+1|0;a[j>>0]=d[19831+z>>0]|i&32;e=(e-+(z|0))*16.0;if((k-C|0)==1?!((h&8|0)==0&((g|0)<1&e==0.0)):0){a[k>>0]=46;j=j+2|0}else j=k}while(e!=0.0);C=j-C|0;j=(g|0)!=0&(C+-2|0)<(g|0)?g+2|0:C;un(b,32,f,B-m+n+j|0,h);fA(b,o,n);un(b,48,f,B-m+n+j|0,h^65536);fA(b,D+524|0,C);un(b,48,j-C|0,0,0);fA(b,m,B-m|0);un(b,32,f,B-m+n+j|0,h^8192);j=B-m+n+j|0;break}k=(g|0)<0?6:g;if(p!=0.0){n=(c[D>>2]|0)+-28|0;c[D>>2]=n;e=p*268435456.0}else{e=p;n=c[D>>2]|0}z=(n|0)<0?D+8|0:D+8+288|0;j=z;do{v=~~e>>>0;c[j>>2]=v;j=j+4|0;e=(e-+(v>>>0))*1.0e9}while(e!=0.0);if((n|0)>0){m=z;do{g=(n|0)<29?n:29;n=j+-4|0;if(n>>>0>=m>>>0){o=0;do{u=wu(c[n>>2]|0,0,g|0)|0;u=Ow(u|0,A|0,o|0,0)|0;v=A;t=xs(u|0,v|0,1e9,0)|0;c[n>>2]=t;o=rB(u|0,v|0,1e9,0)|0;n=n+-4|0}while(n>>>0>=m>>>0);if(o){m=m+-4|0;c[m>>2]=o}}while(1){if(j>>>0<=m>>>0)break;n=j+-4|0;if(!(c[n>>2]|0))j=n;else break}n=(c[D>>2]|0)-g|0;c[D>>2]=n}while((n|0)>0)}else m=z;if((n|0)<0)do{g=0-n|0;g=(g|0)<9?g:9;if(m>>>0>>0){o=0;n=m;do{v=c[n>>2]|0;c[n>>2]=(v>>>g)+o;o=P(v&(1<>>g)|0;n=n+4|0}while(n>>>0>>0);m=(c[m>>2]|0)==0?m+4|0:m;if(o){c[j>>2]=o;j=j+4|0}}else m=(c[m>>2]|0)==0?m+4|0:m;n=(i|32|0)==102?z:m;j=(j-n>>2|0)>(((k+25|0)/9|0)+1|0)?n+(((k+25|0)/9|0)+1<<2)|0:j;n=(c[D>>2]|0)+g|0;c[D>>2]=n}while((n|0)<0);if(m>>>0>>0){n=(z-m>>2)*9|0;g=c[m>>2]|0;if(g>>>0<10)s=n;else{o=10;do{o=o*10|0;n=n+1|0}while(g>>>0>=o>>>0);s=n}}else s=0;o=k-((i|32|0)!=102?s:0)+(((k|0)!=0&(i|32|0)==103)<<31>>31)|0;if((o|0)<(((j-z>>2)*9|0)+-9|0)){n=z+4+(((o+9216|0)/9|0)+-1024<<2)|0;if((((o+9216|0)%9|0)+1|0)<9){g=((o+9216|0)%9|0)+1|0;o=10;do{o=o*10|0;g=g+1|0}while((g|0)!=9)}else o=10;q=c[n>>2]|0;r=(q>>>0)%(o>>>0)|0;g=(n+4|0)==(j|0);if(!(g&(r|0)==0)){p=(((q>>>0)/(o>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;v=(o|0)/2|0;e=r>>>0>>0?.5:g&(r|0)==(v|0)?1.0:1.5;if(y){v=(a[x>>0]|0)==45;e=v?-e:e;p=v?-p:p}c[n>>2]=q-r;if(p+e!=p){v=q-r+o|0;c[n>>2]=v;if(v>>>0>999999999)while(1){o=n+-4|0;c[n>>2]=0;if(o>>>0>>0){m=m+-4|0;c[m>>2]=0}v=(c[o>>2]|0)+1|0;c[o>>2]=v;if(v>>>0>999999999)n=o;else{n=o;break}}o=(z-m>>2)*9|0;q=c[m>>2]|0;if(q>>>0>=10){g=10;do{g=g*10|0;o=o+1|0}while(q>>>0>=g>>>0)}}else o=s}else o=s;u=n+4|0;j=j>>>0>u>>>0?u:j;u=m}else{o=s;u=m}v=j;while(1){if(v>>>0<=u>>>0){t=0;break}j=v+-4|0;if(!(c[j>>2]|0))v=j;else{t=1;break}}q=0-o|0;do if((i|32|0)==103){if((o|0)>-5?((((k|0)!=0^1)&1)+k|0)>(o|0):0){n=i+-1|0;k=(((k|0)!=0^1)&1)+k+-1-o|0}else{n=i+-2|0;k=(((k|0)!=0^1)&1)+k+-1|0}if(!(h&8)){if(t?(w=c[v+-4>>2]|0,(w|0)!=0):0)if(!((w>>>0)%10|0)){j=0;m=10;do{m=m*10|0;j=j+1|0}while(!((w>>>0)%(m>>>0)|0|0))}else j=0;else j=9;m=((v-z>>2)*9|0)+-9|0;if((n|32|0)==102){g=m-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}else{g=m+o-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}}else g=h&8}else{n=i;g=h&8}while(0);s=k|g;m=(n|32|0)==102;if(m){r=0;j=(o|0)>0?o:0}else{j=(o|0)<0?q:o;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((B-j|0)<2)do{j=j+-1|0;a[j>>0]=48}while((B-j|0)<2);a[j+-1>>0]=(o>>31&2)+43;j=j+-2|0;a[j>>0]=n;r=j;j=B-j|0}j=y+1+k+((s|0)!=0&1)+j|0;un(b,32,f,j,h);fA(b,x,y);un(b,48,f,j,h^65536);if(m){o=u>>>0>z>>>0?z:u;n=o;do{m=Om(c[n>>2]|0,0,D+524+9|0)|0;if((n|0)==(o|0)){if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}}else if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,D+524+9-m|0);n=n+4|0}while(n>>>0<=z>>>0);if(s|0)fA(b,19847,1);if(n>>>0>>0&(k|0)>0)while(1){m=Om(c[n>>2]|0,0,D+524+9|0)|0;if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0>>0&(k|0)>9)){k=m;break}else k=m}un(b,48,k+9|0,9,0)}else{q=t?v:u+4|0;if((k|0)>-1){g=(g|0)==0;o=u;do{m=Om(c[o>>2]|0,0,D+524+9|0)|0;if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}do if((o|0)==(u|0)){n=m+1|0;fA(b,m,1);if(g&(k|0)<1){m=n;break}fA(b,19847,1);m=n}else{if(m>>>0<=(D+524|0)>>>0)break;Yk(D+524|0,48,m+(0-C)|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}while(0);z=D+524+9-m|0;fA(b,m,(k|0)>(z|0)?z:k);k=k-z|0;o=o+4|0}while(o>>>0>>0&(k|0)>-1)}un(b,48,k+18|0,18,0);fA(b,r,B-r|0)}un(b,32,f,j,h^8192)}else{j=y+3|0;un(b,32,f,j,h&-65537);fA(b,x,y);fA(b,e!=e|0.0!=0.0?(i&32|0?19823:19827):i&32|0?19815:19819,3);un(b,32,f,j,h^8192)}while(0);l=D;return ((j|0)<(f|0)?f:j)|0}function Xc(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;x=l;l=l+64|0;c[x+16>>2]=e;w=x+24+40|0;k=0;j=0;p=0;a:while(1){do if((j|0)>-1)if((k|0)>(2147483647-j|0)){c[7137]=75;j=-1;break}else{j=k+j|0;break}while(0);k=a[e>>0]|0;if(!(k<<24>>24)){v=87;break}else m=e;b:while(1){switch(k<<24>>24){case 37:{k=m;v=9;break b}case 0:{k=m;break b}default:{}}u=m+1|0;c[x+16>>2]=u;k=a[u>>0]|0;m=u}c:do if((v|0)==9)while(1){v=0;if((a[m+1>>0]|0)!=37)break c;k=k+1|0;m=m+2|0;c[x+16>>2]=m;if((a[m>>0]|0)==37)v=9;else break}while(0);k=k-e|0;if(d|0)fA(d,e,k);if(k|0){e=m;continue}n=m+1|0;k=(a[n>>0]|0)+-48|0;if(k>>>0<10){u=(a[m+2>>0]|0)==36;s=u?k:-1;p=u?1:p;n=u?m+3|0:n}else s=-1;c[x+16>>2]=n;k=a[n>>0]|0;d:do if(((k<<24>>24)+-32|0)>>>0<32){m=0;q=k;o=(k<<24>>24)+-32|0;while(1){k=1<>2]=n;k=a[n>>0]|0;o=(k<<24>>24)+-32|0;if(o>>>0>=32)break;else q=k}}else m=0;while(0);if(k<<24>>24==42){o=n+1|0;k=(a[o>>0]|0)+-48|0;if(k>>>0<10?(a[n+2>>0]|0)==36:0){c[i+(k<<2)>>2]=10;k=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;p=1;n=n+3|0}else{if(p|0){j=-1;break}if(d|0){p=(c[f>>2]|0)+(4-1)&~(4-1);k=c[p>>2]|0;c[f>>2]=p+4;p=0;n=o}else{k=0;p=0;n=o}}c[x+16>>2]=n;t=(k|0)<0;k=t?0-k|0:k;t=t?m|8192:m}else{k=gq(x+16|0)|0;if((k|0)<0){j=-1;break}t=m;n=c[x+16>>2]|0}do if((a[n>>0]|0)==46){m=n+1|0;if((a[m>>0]|0)!=42){c[x+16>>2]=m;m=gq(x+16|0)|0;n=c[x+16>>2]|0;break}o=n+2|0;m=(a[o>>0]|0)+-48|0;if(m>>>0<10?(a[n+3>>0]|0)==36:0){c[i+(m<<2)>>2]=10;m=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;n=n+4|0;c[x+16>>2]=n;break}if(p|0){j=-1;break a}if(d|0){u=(c[f>>2]|0)+(4-1)&~(4-1);m=c[u>>2]|0;c[f>>2]=u+4}else m=0;c[x+16>>2]=o;n=o}else m=-1;while(0);r=0;while(1){if(((a[n>>0]|0)+-65|0)>>>0>57){j=-1;break a}u=n+1|0;c[x+16>>2]=u;o=a[(a[n>>0]|0)+-65+(19315+(r*58|0))>>0]|0;if(((o&255)+-1|0)>>>0<8){r=o&255;n=u}else break}if(!(o<<24>>24)){j=-1;break}q=(s|0)>-1;do if(o<<24>>24==19)if(q){j=-1;break a}else v=49;else{if(q){c[i+(s<<2)>>2]=o&255;s=g+(s<<3)|0;v=c[s+4>>2]|0;c[x>>2]=c[s>>2];c[x+4>>2]=v;v=49;break}if(!d){j=0;break a}Ug(x,o&255,f)}while(0);if((v|0)==49?(v=0,(d|0)==0):0){k=0;e=u;continue}n=a[n>>0]|0;n=(r|0)!=0&(n&15|0)==3?n&-33:n;s=t&-65537;t=(t&8192|0)==0?t:s;e:do switch(n|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 1:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 2:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}case 3:{b[c[x>>2]>>1]=j;k=0;e=u;continue a}case 4:{a[c[x>>2]>>0]=j;k=0;e=u;continue a}case 6:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 7:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}default:{k=0;e=u;continue a}}case 112:{n=120;m=m>>>0>8?m:8;e=t|8;v=61;break}case 88:case 120:{e=t;v=61;break}case 111:{e=c[x>>2]|0;n=c[x+4>>2]|0;s=sr(e,n,w)|0;r=s;o=0;q=19779;m=(t&8|0)==0|(m|0)>(w-s|0)?m:w-s+1|0;s=t;v=67;break}case 105:case 100:{e=c[x>>2]|0;n=c[x+4>>2]|0;if((n|0)<0){e=sw(0,0,e|0,n|0)|0;n=A;c[x>>2]=e;c[x+4>>2]=n;o=1;q=19779;v=66;break e}else{o=(t&2049|0)!=0&1;q=(t&2048|0)==0?((t&1|0)==0?19779:19781):19780;v=66;break e}}case 117:{o=0;q=19779;e=c[x>>2]|0;n=c[x+4>>2]|0;v=66;break}case 99:{a[x+24+39>>0]=c[x>>2];e=x+24+39|0;o=0;q=19779;r=w;n=1;m=s;break}case 109:{n=pI(c[7137]|0)|0;v=71;break}case 115:{n=c[x>>2]|0;n=n|0?n:19789;v=71;break}case 67:{c[x+8>>2]=c[x>>2];c[x+8+4>>2]=0;c[x>>2]=x+8;r=-1;n=x+8|0;v=75;break}case 83:{e=c[x>>2]|0;if(!m){un(d,32,k,0,t);e=0;v=84}else{r=m;n=e;v=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{k=Wc(d,+h[x>>3],k,m,t,n)|0;e=u;continue a}default:{o=0;q=19779;r=w;n=m;m=t}}while(0);f:do if((v|0)==61){y=c[x>>2]|0;t=c[x+4>>2]|0;r=qq(y,t,w,n&32)|0;q=(e&8|0)==0|(y|0)==0&(t|0)==0;o=q?0:2;q=q?19779:19779+(n>>4)|0;s=e;e=y;n=t;v=67}else if((v|0)==66){r=Om(e,n,w)|0;s=t;v=67}else if((v|0)==71){v=0;y=Kj(n,m)|0;e=n;o=0;q=19779;r=(y|0)==0?n+m|0:y;n=(y|0)==0?m:y-n|0;m=s}else if((v|0)==75){v=0;q=n;e=0;m=0;while(1){o=c[q>>2]|0;if(!o)break;m=OA(x+20|0,o)|0;if((m|0)<0|m>>>0>(r-e|0)>>>0)break;e=m+e|0;if(r>>>0>e>>>0)q=q+4|0;else break}if((m|0)<0){j=-1;break a}un(d,32,k,e,t);if(!e){e=0;v=84}else{o=0;while(1){m=c[n>>2]|0;if(!m){v=84;break f}m=OA(x+20|0,m)|0;o=m+o|0;if((o|0)>(e|0)){v=84;break f}fA(d,x+20|0,m);if(o>>>0>=e>>>0){v=84;break}else n=n+4|0}}}while(0);if((v|0)==67){v=0;n=(e|0)!=0|(n|0)!=0;y=(m|0)!=0|n;n=((n^1)&1)+(w-r)|0;e=y?r:w;r=w;n=y?((m|0)>(n|0)?m:n):m;m=(m|0)>-1?s&-65537:s}else if((v|0)==84){v=0;un(d,32,k,e,t^8192);k=(k|0)>(e|0)?k:e;e=u;continue}t=r-e|0;s=(n|0)<(t|0)?t:n;y=s+o|0;k=(k|0)<(y|0)?y:k;un(d,32,k,y,m);fA(d,q,o);un(d,48,k,y,m^65536);un(d,48,s,t,0);fA(d,e,t);un(d,32,k,y,m^8192);e=u}g:do if((v|0)==87)if(!d)if(!p)j=0;else{j=1;while(1){e=c[i+(j<<2)>>2]|0;if(!e){k=0;break}Ug(g+(j<<3)|0,e,f);j=j+1|0;if((j|0)>=10){j=1;break g}}while(1){e=j+1|0;if(k|0){j=-1;break g}if((e|0)>=10){j=1;break g}j=e;k=c[i+(e<<2)>>2]|0}}while(0);l=x;return j|0}function Yc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0;u=l;l=l+672|0;c[u+448+8>>2]=0;c[u+448+12>>2]=-1;m=u+448+28|0;c[u+448>>2]=7020;c[u+448+4>>2]=8;c[u+448+16>>2]=1065353216;c[u+448+20>>2]=1065353216;c[u+448+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;g[u+384>>2]=1.0;m=u+384+4|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;g[u+384+20>>2]=1.0;n=u+384+24|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[u+384+40>>2]=1.0;g[u+384+44>>2]=0.0;c[u+384+48>>2]=c[a>>2];c[u+384+48+4>>2]=c[a+4>>2];c[u+384+48+8>>2]=c[a+8>>2];c[u+384+48+12>>2]=c[a+12>>2];a=e;k=a+36|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(k|0));c[u+504>>2]=b;c[u+504+4>>2]=u+448;w=+g[d>>2];v=+g[d+16>>2];f=+g[d+32>>2];h=+g[d+4>>2];i=+g[d+20>>2];j=+g[d+36>>2];s=+g[d+8>>2];q=+g[d+24>>2];o=+g[d+40>>2];g[u+504+8>>2]=w+v*0.0+f*0.0;g[u+504+12>>2]=h+i*0.0+j*0.0;g[u+504+16>>2]=s+q*0.0+o*0.0;g[u+504+20>>2]=0.0;g[u+504+24>>2]=w*0.0+v+f*0.0;g[u+504+28>>2]=h*0.0+i+j*0.0;g[u+504+32>>2]=s*0.0+q+o*0.0;g[u+504+36>>2]=0.0;g[u+504+40>>2]=w*0.0+v*0.0+f;g[u+504+44>>2]=h*0.0+i*0.0+j;g[u+504+48>>2]=s*0.0+q*0.0+o;g[u+504+52>>2]=0.0;o=+g[u+384+48>>2]-+g[d+48>>2];q=+g[u+384+52>>2]-+g[d+52>>2];s=+g[u+384+56>>2]-+g[d+56>>2];G=+g[u+384>>2];F=+g[u+384+16>>2];E=+g[u+384+32>>2];C=+g[m>>2];B=+g[u+384+20>>2];A=+g[u+384+36>>2];z=+g[u+384+8>>2];y=+g[n>>2];x=+g[u+384+40>>2];p=+g[d+8>>2];r=+g[d+24>>2];t=+g[d+40>>2];g[u+504+56>>2]=w*G+v*F+f*E;g[u+504+60>>2]=w*C+v*B+f*A;g[u+504+64>>2]=w*z+v*y+f*x;g[u+504+68>>2]=0.0;g[u+504+72>>2]=G*h+F*i+E*j;g[u+504+76>>2]=C*h+B*i+A*j;g[u+504+80>>2]=z*h+y*i+x*j;g[u+504+84>>2]=0.0;g[u+504+88>>2]=G*p+F*r+E*t;g[u+504+92>>2]=C*p+B*r+A*t;g[u+504+96>>2]=z*p+y*r+x*t;g[u+504+100>>2]=0.0;g[u+504+104>>2]=o*w+q*v+s*f;g[u+504+108>>2]=o*h+q*i+s*j;g[u+504+112>>2]=o*p+q*r+s*t;g[u+504+116>>2]=0.0;c[u+504+120>>2]=80;c[u+504+124>>2]=0;c[u+364>>2]=0;c[u+128>>2]=0;c[u+128+4>>2]=0;c[u+128+8>>2]=0;c[u+128+12>>2]=0;c[u+376>>2]=2;c[u+368>>2]=0;g[u+144>>2]=0.0;c[u+648>>2]=1065353216;c[u+648+4>>2]=1065353216;c[u+648+8>>2]=1065353216;g[u+648+12>>2]=0.0;switch(Jc(u,u+504|0,u+648|0)|0){case 0:{a=c[u+372>>2]|0;if(!(c[a+32>>2]|0)){j=0.0;i=0.0;f=0.0;r=0.0;q=0.0;h=0.0}else{n=0;f=0.0;i=0.0;j=0.0;h=0.0;q=0.0;r=0.0;do{t=+g[a+16+(n<<2)>>2];k=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;m=(c[u+504>>2]|0)+(H>>1)|0;if(H&1)k=c[(c[m>>2]|0)+k>>2]|0;Sb[k&127](u+648|0,m,c[a+(n<<2)>>2]|0);f=f+t*+g[u+648>>2];i=i+t*+g[u+648+4>>2];j=j+t*+g[u+648+8>>2];a=c[(c[u+372>>2]|0)+(n<<2)>>2]|0;o=-+g[a>>2];p=-+g[a+4>>2];s=-+g[a+8>>2];a=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;k=(c[u+504+4>>2]|0)+(H>>1)|0;if(H&1)a=c[(c[k>>2]|0)+a>>2]|0;F=+g[u+504+24>>2]*o+ +g[u+504+28>>2]*p+ +g[u+504+32>>2]*s;E=+g[u+504+40>>2]*o+ +g[u+504+44>>2]*p+ +g[u+504+48>>2]*s;g[u+632>>2]=+g[u+504+8>>2]*o+ +g[u+504+12>>2]*p+ +g[u+504+16>>2]*s;g[u+632+4>>2]=F;g[u+632+8>>2]=E;g[u+632+12>>2]=0.0;Sb[a&127](u+648|0,k,u+632|0);E=+g[u+648>>2];F=+g[u+648+4>>2];G=+g[u+648+8>>2];h=h+t*(E*+g[u+504+56>>2]+F*+g[u+504+60>>2]+G*+g[u+504+64>>2]+ +g[u+504+104>>2]);q=q+t*(E*+g[u+504+72>>2]+F*+g[u+504+76>>2]+G*+g[u+504+80>>2]+ +g[u+504+108>>2]);r=r+t*(E*+g[u+504+88>>2]+F*+g[u+504+92>>2]+G*+g[u+504+96>>2]+ +g[u+504+112>>2]);n=n+1|0;a=c[u+372>>2]|0}while(n>>>0<(c[a+32>>2]|0)>>>0)}s=f*+g[d>>2]+i*+g[d+4>>2]+j*+g[d+8>>2]+ +g[d+48>>2];t=f*+g[d+16>>2]+i*+g[d+20>>2]+j*+g[d+24>>2]+ +g[d+52>>2];j=f*+g[d+32>>2]+i*+g[d+36>>2]+j*+g[d+40>>2]+ +g[d+56>>2];g[e+4>>2]=s;g[e+8>>2]=t;g[e+12>>2]=j;g[e+16>>2]=0.0;o=h*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2]+ +g[d+48>>2];p=h*+g[d+16>>2]+q*+g[d+20>>2]+r*+g[d+24>>2]+ +g[d+52>>2];i=h*+g[d+32>>2]+q*+g[d+36>>2]+r*+g[d+40>>2]+ +g[d+56>>2];g[e+20>>2]=o;g[e+24>>2]=p;g[e+28>>2]=i;g[e+32>>2]=0.0;switch(c[b+4>>2]|0){case 8:{f=+g[b+32>>2]*+g[b+16>>2];break}case 0:{f=+g[b+48>>2];break}case 1:{f=+g[b+48>>2];break}case 13:{f=+g[b+48>>2];break}case 11:{f=+g[b+48>>2];break}case 10:{f=+g[b+48>>2];break}case 4:case 5:{f=+g[b+48>>2];break}default:f=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}switch(c[u+448+4>>2]|0){case 8:{h=+g[u+448+32>>2]*+g[u+448+16>>2];break}case 0:{h=+g[u+448+48>>2];break}case 1:{h=+g[u+448+48>>2];break}case 13:{h=+g[u+448+48>>2];break}case 11:{h=+g[u+448+48>>2];break}case 10:{h=+g[u+448+48>>2];break}case 4:case 5:{h=+g[u+448+48>>2];break}default:h=+nb[c[(c[u+448>>2]|0)+48>>2]&15](u+448|0)}G=f+h;F=+D(+((o-s)*(o-s)+(p-t)*(p-t)+(i-j)*(i-j)));g[e+36>>2]=(o-s)*(1.0/F);g[e+40>>2]=(p-t)*(1.0/F);g[e+44>>2]=(i-j)*(1.0/F);g[e+48>>2]=0.0;g[e+4>>2]=G*(o-s)*(1.0/F)+ +g[e+4>>2];g[e+8>>2]=G*(p-t)*(1.0/F)+ +g[e+8>>2];g[e+12>>2]=G*(i-j)*(1.0/F)+ +g[e+12>>2];G=F-G;l=u;return +G}case 1:{if(!(Hc(b,d,u+448|0,u+384|0,u+128|0,e,1)|0)){G=3402823466385288598117041.0e14;l=u;return +G}f=+g[e+4>>2]-+g[e+20>>2];h=+g[e+8>>2]-+g[e+24>>2];i=+g[e+12>>2]-+g[e+28>>2];j=+D(+(f*f+h*h+i*i));if(j>=1.1920928955078125e-07){g[e+36>>2]=f*(1.0/j);g[e+40>>2]=h*(1.0/j);g[e+44>>2]=i*(1.0/j);g[e+48>>2]=0.0}G=-j;l=u;return +G}default:{G=3402823466385288598117041.0e14;l=u;return +G}}return 0.0}function Zc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)!=0:0){r=+g[b+116>>2];h=+g[e>>2];I=+g[b+132>>2];f=+g[e+4>>2];J=+g[b+148>>2];y=+g[e+8>>2];s=+g[b+120>>2];G=+g[b+136>>2];H=+g[b+152>>2];t=+g[b+124>>2];F=+g[b+140>>2];u=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];z=+g[e+24>>2];E=+g[e+32>>2];v=+g[e+36>>2];A=+g[e+40>>2];m=+g[b+164>>2];i=+g[b+168>>2];D=+g[b+172>>2];C=+g[e+48>>2]+(h*m+f*i+y*D);B=w*m+x*i+z*D+ +g[e+52>>2];D=E*m+v*i+A*D+ +g[e+56>>2];g[b+824>>2]=r*h+I*f+J*y;g[b+828>>2]=h*s+f*G+y*H;g[b+832>>2]=h*t+f*F+y*u;g[b+836>>2]=0.0;g[b+840>>2]=r*w+I*x+J*z;g[b+844>>2]=s*w+G*x+H*z;g[b+848>>2]=t*w+F*x+u*z;g[b+852>>2]=0.0;g[b+856>>2]=r*E+I*v+J*A;g[b+860>>2]=s*E+G*v+H*A;g[b+864>>2]=t*E+F*v+u*A;g[b+868>>2]=0.0;g[b+872>>2]=C;g[b+876>>2]=B;g[b+880>>2]=D;g[b+884>>2]=0.0;D=+g[b+52>>2];B=+g[d>>2];C=+g[b+68>>2];A=+g[d+4>>2];u=+g[b+84>>2];v=+g[d+8>>2];F=+g[b+56>>2];E=+g[b+72>>2];t=+g[b+88>>2];H=+g[b+60>>2];G=+g[b+76>>2];s=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];r=+g[d+24>>2];z=+g[d+32>>2];x=+g[d+36>>2];w=+g[d+40>>2];y=+g[b+100>>2];f=+g[b+104>>2];h=+g[b+108>>2];k=b+856|0;l=b+840|0;i=J*y+I*f+r*h;m=H*z+G*x+s*w;n=F*z+E*x+t*w;o=D*z+C*x+u*w;p=H*J+G*I+s*r;q=F*J+E*I+t*r;r=D*J+C*I+u*r;s=B*H+A*G+v*s;t=B*F+A*E+v*t;u=D*B+C*A+u*v;v=B*y+A*f+v*h;f=z*y+x*f;h=w*h}else{r=+g[b+52>>2];h=+g[d>>2];x=+g[b+68>>2];f=+g[d+4>>2];w=+g[b+84>>2];H=+g[d+8>>2];s=+g[b+56>>2];z=+g[b+72>>2];y=+g[b+88>>2];t=+g[b+60>>2];A=+g[b+76>>2];u=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];G=+g[d+24>>2];B=+g[d+32>>2];v=+g[d+36>>2];F=+g[d+40>>2];m=+g[b+100>>2];i=+g[b+104>>2];C=+g[b+108>>2];D=+g[d+48>>2]+(h*m+f*i+H*C);E=J*m+I*i+G*C+ +g[d+52>>2];C=B*m+v*i+F*C+ +g[d+56>>2];g[b+824>>2]=r*h+x*f+w*H;g[b+828>>2]=h*s+f*z+H*y;g[b+832>>2]=h*t+f*A+H*u;g[b+836>>2]=0.0;g[b+840>>2]=r*J+x*I+w*G;g[b+844>>2]=s*J+z*I+y*G;g[b+848>>2]=t*J+A*I+u*G;g[b+852>>2]=0.0;g[b+856>>2]=r*B+x*v+w*F;g[b+860>>2]=s*B+z*v+y*F;g[b+864>>2]=t*B+A*v+u*F;g[b+868>>2]=0.0;g[b+872>>2]=D;g[b+876>>2]=E;g[b+880>>2]=C;g[b+884>>2]=0.0;C=+g[b+116>>2];E=+g[e>>2];D=+g[b+132>>2];F=+g[e+4>>2];u=+g[b+148>>2];v=+g[e+8>>2];A=+g[b+120>>2];B=+g[b+136>>2];t=+g[b+152>>2];y=+g[b+124>>2];z=+g[b+140>>2];s=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];r=+g[e+24>>2];G=+g[e+32>>2];I=+g[e+36>>2];J=+g[e+40>>2];H=+g[b+164>>2];f=+g[b+168>>2];h=+g[b+172>>2];k=b+856|0;l=b+840|0;i=w*H+x*f+r*h;m=y*G+z*I+s*J;n=A*G+B*I+t*J;o=C*G+D*I+u*J;p=y*w+z*x+s*r;q=A*w+B*x+t*r;r=C*w+D*x+u*r;s=E*y+F*z+v*s;t=E*A+F*B+v*t;u=C*E+D*F+u*v;v=E*H+F*f+v*h;d=e;f=G*H+I*f;h=J*h}J=v+ +g[d+48>>2];i=i+ +g[d+52>>2];f=h+f+ +g[d+56>>2];g[b+888>>2]=u;g[b+892>>2]=t;g[b+896>>2]=s;g[b+900>>2]=0.0;g[b+904>>2]=r;g[b+908>>2]=q;g[b+912>>2]=p;g[b+916>>2]=0.0;g[b+920>>2]=o;g[b+924>>2]=n;g[b+928>>2]=m;g[b+932>>2]=0.0;g[b+936>>2]=J;g[b+940>>2]=i;g[b+944>>2]=f;g[b+948>>2]=0.0;c[b+968>>2]=c[b+872>>2];c[b+968+4>>2]=c[b+872+4>>2];c[b+968+8>>2]=c[b+872+8>>2];c[b+968+12>>2]=c[b+872+12>>2];c[b+984>>2]=c[b+936>>2];c[b+984+4>>2]=c[b+936+4>>2];c[b+984+8>>2]=c[b+936+8>>2];c[b+984+12>>2]=c[b+936+12>>2];d=c[b+824>>2]|0;e=c[l>>2]|0;l=c[k>>2]|0;c[b+952>>2]=d;c[b+956>>2]=e;c[b+960>>2]=l;g[b+964>>2]=0.0;f=(c[j>>2]=d,+g[j>>2]);h=(c[j>>2]=e,+g[j>>2]);i=(c[j>>2]=l,+g[j>>2]);if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)==0:0){l=b+984|0;k=b+968|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}l=b+968|0;k=b+984|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}function _c(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0;if((d|0)<=1){x=0;return x|0}w=c[b+772>>2]|0;x=P(w,w)|0;x=$I(x>>>0>1073741823?-1:x<<2)|0;if((w|0)>0){h=0;do{i=P(h,w)|0;f=0;do{p=x+((P(f,w)|0)+h<<2)|0;t=(f|0)==(h|0)?0:2147483647;c[p>>2]=t;c[x+(f+i<<2)>>2]=t;f=f+1|0}while((f|0)!=(w|0));h=h+1|0}while((h|0)!=(w|0))}h=c[b+792>>2]|0;if((h|0)>0){i=c[b+800>>2]|0;j=c[b+780>>2]|0;f=0;do{p=((c[i+(f*52|0)+24>>2]|0)-j|0)/104|0;t=((c[i+(f*52|0)+28>>2]|0)-j|0)/104|0;c[x+((P(t,w)|0)+p<<2)>>2]=1;c[x+((P(p,w)|0)+t<<2)>>2]=1;f=f+1|0}while((f|0)!=(h|0))}do if((d|0)!=2)if((w|0)>0){f=0;do{k=P(f,w)|0;h=0;do{i=h;h=h+1|0;if((h|0)<(w|0)){n=P(i,w)|0;l=x+(n+f<<2)|0;j=h;do{m=(c[l>>2]|0)+(c[x+(j+k<<2)>>2]|0)|0;o=x+(j+n<<2)|0;if((c[o>>2]|0)>>>0>m>>>0){c[x+((P(j,w)|0)+i<<2)>>2]=m;c[o>>2]=m}j=j+1|0}while((j|0)!=(w|0))}}while((h|0)!=(w|0));f=f+1|0}while((f|0)!=(w|0));q=79}else f=0;else{if((w|0)<0)gb();if(!w)t=0;else{c[6995]=(c[6995]|0)+1;f=sc((w*20|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=0;do{a[f+(h*20|0)+16>>0]=1;t=f+(h*20|0)+4|0;h=h+1|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0}while((h|0)!=(w|0));t=f}if((c[b+792>>2]|0)>0){n=0;do{m=c[b+800>>2]|0;p=c[b+780>>2]|0;o=((c[m+(n*52|0)+24>>2]|0)-p|0)/104|0;p=((c[m+(n*52|0)+28>>2]|0)-p|0)/104|0;m=t+(o*20|0)+4|0;f=c[m>>2]|0;a:do if((f|0)>0){i=c[t+(o*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(p|0))break;h=h+1|0;if((h|0)>=(f|0)){q=34;break a}}if((h|0)==(f|0))q=34}else q=34;while(0);if((q|0)==34){q=0;l=t+(o*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(o*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(o*20|0)+16|0;else q=44;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=44}if((q|0)==44){q=0;f=t+(o*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=r}c[(c[t+(o*20|0)+12>>2]|0)+(f<<2)>>2]=p;c[m>>2]=(c[m>>2]|0)+1}m=t+(p*20|0)+4|0;f=c[m>>2]|0;b:do if((f|0)>0){i=c[t+(p*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(o|0))break;h=h+1|0;if((h|0)>=(f|0)){q=54;break b}}if((h|0)==(f|0))q=54}else q=54;while(0);if((q|0)==54){q=0;l=t+(p*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(s=f|0?f<<1:1,(f|0)<(s|0)):0){if(!s)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(p*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(p*20|0)+16|0;else q=64;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=64}if((q|0)==64){q=0;f=t+(p*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=s}c[(c[t+(p*20|0)+12>>2]|0)+(f<<2)>>2]=o;c[m>>2]=(c[m>>2]|0)+1}n=n+1|0}while((n|0)<(c[b+792>>2]|0))}if((w|0)<=0){if(!t){f=0;break}}else{o=0;do{q=t+(o*20|0)+4|0;f=c[q>>2]|0;if((f|0)>0){r=P(o,w)|0;p=c[t+(o*20|0)+12>>2]|0;n=0;do{l=c[p+(n<<2)>>2]|0;m=t+(l*20|0)+4|0;h=c[m>>2]|0;if((h|0)>0){k=x+((P(l,w)|0)+o<<2)|0;j=c[t+(l*20|0)+12>>2]|0;i=0;f=h;do{h=c[j+(i<<2)>>2]|0;if((o|0)!=(h|0)?(v=P(h,w)|0,u=(c[x+(v+l<<2)>>2]|0)+(c[k>>2]|0)|0,v=x+(v+o<<2)|0,(c[v>>2]|0)>>>0>u>>>0):0){c[x+(h+r<<2)>>2]=u;c[v>>2]=u;f=c[m>>2]|0}i=i+1|0}while((i|0)<(f|0));f=c[q>>2]|0}n=n+1|0}while((n|0)<(f|0))}o=o+1|0}while((o|0)!=(w|0));f=0;do{i=t+(f*20|0)+4|0;j=t+(f*20|0)+12|0;k=c[j>>2]|0;h=t+(f*20|0)+16|0;if(k|0){if(a[h>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[h>>0]=1;c[j>>2]=0;c[i>>2]=0;c[t+(f*20|0)+8>>2]=0;f=f+1|0}while((f|0)!=(w|0))}c[6996]=(c[6996]|0)+1;Cd(c[t+-4>>2]|0);q=79}while(0);if((q|0)==79)if((w|0)>0){f=0;k=0;do{i=k;k=k+1|0;if((k|0)<(w|0)){j=P(i,w)|0;h=k;do{if((c[x+(h+j<<2)>>2]|0)==(d|0)){t=c[b+780>>2]|0;Xh(b,e);v=(c[b+792>>2]|0)+-1|0;u=c[b+800>>2]|0;c[u+(v*52|0)+24>>2]=t+(h*104|0);c[u+(v*52|0)+28>>2]=t+(i*104|0);A=+g[t+(h*104|0)+8>>2]-+g[t+(i*104|0)+8>>2];z=+g[t+(h*104|0)+12>>2]-+g[t+(i*104|0)+12>>2];y=+g[t+(h*104|0)+16>>2]-+g[t+(i*104|0)+16>>2];g[u+(v*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[b+984>>0]=1;v=(c[b+800>>2]|0)+(v*52|0)+36|0;a[v>>0]=a[v>>0]|1;f=f+1|0}h=h+1|0}while((h|0)!=(w|0))}}while((k|0)!=(w|0))}else f=0;aJ(x);x=f;return x|0}function $c(b,d,e){b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0,s=0;s=l;l=l+112|0;j=c[b+776>>2]|0;if((j|0)==(c[b+772>>2]|0)){a:do if(j){i=c[b+780>>2]|0;if((j|0)>0){f=0;h=i;while(1){h=c[h+(f*104|0)+96>>2]|0;if(h|0)c[h+36>>2]=f;f=f+1|0;if((f|0)==(j|0)){o=i;break a}h=c[b+780>>2]|0}}else o=i}else o=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=c[(c[b+820>>2]|0)+(f*44|0)+40>>2]|0;if(i|0)c[i+36>>2]=f;f=f+1|0}while((f|0)!=(h|0))}h=c[b+852>>2]|0;if((h|0)>0){i=c[b+860>>2]|0;f=0;do{p=i+(f*96|0)|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}k=c[b+752>>2]|0;if((k|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=((c[f>>2]|0)-o|0)/104|0;h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(k|0))}if((j|0)<(j<<1|1|0)){c[6995]=(c[6995]|0)+1;f=sc(((j<<1|1)*104|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[b+772>>2]|0;if((h|0)>0){f=0;do{o=i+(f*104|0)|0;k=(c[b+780>>2]|0)+(f*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));f=f+1|0}while((f|0)!=(h|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=j<<1|1;j=c[b+772>>2]|0}b:do if(j){k=c[b+780>>2]|0;if((j|0)>0){f=0;h=k;while(1){i=c[h+(f*104|0)+96>>2]|0;if(i|0)c[i+36>>2]=h+(f*104|0);f=f+1|0;if((f|0)==(j|0))break b;h=c[b+780>>2]|0}}}else k=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=k+((c[p>>2]|0)*104|0);p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=c[b+820>>2]|0;j=c[i+(f*44|0)+40>>2]|0;if(j|0)c[j+36>>2]=i+(f*44|0);f=f+1|0}while((f|0)!=(h|0))}i=c[b+852>>2]|0;if((i|0)>0){h=c[b+860>>2]|0;f=0;do{p=h+(f*96|0)|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(i|0))}j=c[b+752>>2]|0;if((j|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=k+((c[f>>2]|0)*104|0);h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(j|0))}}o=c[b+192>>2]|0;q=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=s;p=o+100|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));f=c[b+772>>2]|0;if((f|0)==(c[b+776>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((r*104|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+772>>2]|0}if((f|0)>0){h=0;do{o=i+(h*104|0)|0;k=(c[b+780>>2]|0)+(h*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=h+1|0}while((h|0)!=(f|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=r;f=c[b+772>>2]|0}o=c[b+780>>2]|0;c[o+(f*104|0)>>2]=0;o=o+(f*104|0)+4|0;k=s;p=o+100|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=c[b+772>>2]|0;c[b+772>>2]=h+1;i=c[b+780>>2]|0;o=i+(h*104|0)|0;p=o+104|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[i+(h*104|0)+8>>2]=c[d>>2];c[i+(h*104|0)+8+4>>2]=c[d+4>>2];c[i+(h*104|0)+8+8>>2]=c[d+8>>2];c[i+(h*104|0)+8+12>>2]=c[d+12>>2];$p(i+(h*104|0)+24|0,d|0,16)|0;g[i+(h*104|0)+88>>2]=e>0.0?1.0/e:0.0;c[i+(h*104|0)+4>>2]=c[c[b+940>>2]>>2];e=+g[i+(h*104|0)+8>>2];m=+g[i+(h*104|0)+12>>2];n=+g[i+(h*104|0)+16>>2];f=c[b+992>>2]|0;if(f|0){c[b+992>>2]=0;d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}o=f;p=o+44|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}function ad(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0;s=l;l=l+752|0;c[s+136+8>>2]=0;c[s+136+12>>2]=-1;q=s+136+28|0;c[s+136>>2]=7020;c[s+136+4>>2]=8;c[s+136+16>>2]=1065353216;c[s+136+20>>2]=1065353216;c[s+136+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;q=c[e+4>>2]|0;r=c[e+12>>2]|0;h=c[q+4>>2]|0;if((h|0)<20){c[s+568>>2]=3896;c[s+568+168>>2]=0;g[s+568+172>>2]=0.0;c[s+568+164>>2]=c[f+4>>2];g[s+208+308>>2]=9.999999747378752e-05;a[s+208+332>>0]=0;c[s+192>>2]=5276;c[s+192+4>>2]=s+208;c[s+192+8>>2]=s+136;c[s+192+12>>2]=q;c[s+120>>2]=9484;c[s+120+4>>2]=s+208;c[s+120+8>>2]=s+136;c[s+120+12>>2]=q;q=(c[f+20>>2]&8|0)==0?s+192|0:s+120|0;if((Eb[c[(c[q>>2]|0)+8>>2]&3](q,b,d,r,r,s+568|0)|0?(i=s+568+132|0,j=+g[i>>2],k=+g[s+568+136>>2],m=+g[s+568+140>>2],j*j+k*k+m*m>9.999999747378752e-05):0)?(n=+g[s+568+164>>2],n<+g[f+4>>2]):0){p=1.0/+D(+(j*j+k*k+m*m));g[i>>2]=j*p;g[s+568+136>>2]=k*p;g[s+568+140>>2]=m*p;c[s>>2]=c[e+8>>2];c[s+4>>2]=0;c[s+8>>2]=c[i>>2];c[s+8+4>>2]=c[i+4>>2];c[s+8+8>>2]=c[i+8>>2];c[s+8+12>>2]=c[i+12>>2];g[s+24>>2]=n;+qb[c[(c[f>>2]|0)+12>>2]&31](f,s,1)}l=s;return}if((h+-21|0)>>>0>=9){if((h|0)!=31){l=s;return}h=c[q+68>>2]|0;e=c[e+8>>2]|0;c[s+568>>2]=6072;c[s+568+4>>2]=e;c[s+568+8>>2]=q;c[s+568+12>>2]=r;c[s+568+16>>2]=b;c[s+568+20>>2]=d;c[s+568+24>>2]=f;if(!h){i=c[q+20>>2]|0;if((i|0)>0){h=0;do{Wf(s+568|0,h);h=h+1|0}while((h|0)<(i|0))}}else{j=+g[r+48>>2];B=+g[b+48>>2]-j;m=+g[r+52>>2];A=+g[b+52>>2]-m;o=+g[r+56>>2];z=+g[b+56>>2]-o;y=+g[r>>2];x=+g[r+16>>2];w=+g[r+32>>2];v=+g[r+4>>2];u=+g[r+20>>2];t=+g[r+36>>2];k=+g[r+8>>2];n=+g[r+24>>2];p=+g[r+40>>2];g[s+208>>2]=B*y+A*x+z*w;g[s+208+4>>2]=B*v+A*u+z*t;g[s+208+8>>2]=B*k+A*n+z*p;g[s+208+12>>2]=0.0;j=+g[d+48>>2]-j;m=+g[d+52>>2]-m;o=+g[d+56>>2]-o;g[s+192>>2]=j*y+m*x+o*w;g[s+192+4>>2]=j*v+m*u+o*t;g[s+192+8>>2]=j*k+m*n+o*p;g[s+192+12>>2]=0.0;Ue(c[h>>2]|0,s+208|0,s+192|0,s+568|0)}l=s;return}F=+g[r>>2];E=+g[r+16>>2];n=+g[r+32>>2];C=+g[r+4>>2];t=+g[r+20>>2];o=+g[r+36>>2];x=+g[r+8>>2];z=+g[r+24>>2];B=+g[r+40>>2];u=-+g[r+48>>2];v=-+g[r+52>>2];w=-+g[r+56>>2];A=+g[b+48>>2];y=+g[b+52>>2];m=+g[b+56>>2];j=F*u+E*v+n*w+(F*A+E*y+n*m);k=C*u+t*v+o*w+(C*A+t*y+o*m);m=x*u+z*v+B*w+(x*A+z*y+B*m);g[s+120>>2]=j;g[s+120+4>>2]=k;g[s+120+8>>2]=m;g[s+120+12>>2]=0.0;y=+g[d+48>>2];A=+g[d+52>>2];p=+g[d+56>>2];n=F*u+E*v+n*w+(F*y+E*A+n*p);o=C*u+t*v+o*w+(C*y+t*A+o*p);p=x*u+z*v+B*w+(x*y+z*A+B*p);if((c[q+4>>2]|0)==21){h=c[e+8>>2]|0;e=c[f+20>>2]|0;c[s+4>>2]=c[s+120>>2];c[s+4+4>>2]=c[s+120+4>>2];c[s+4+8>>2]=c[s+120+8>>2];c[s+4+12>>2]=c[s+120+12>>2];g[s+20>>2]=n;g[s+24>>2]=o;g[s+28>>2]=p;g[s+32>>2]=0.0;c[s+36>>2]=e;g[s+40>>2]=1.0;c[s>>2]=6024;c[s+44>>2]=f;c[s+48>>2]=h;c[s+52>>2]=q;c[s+56>>2]=c[r>>2];c[s+56+4>>2]=c[r+4>>2];c[s+56+8>>2]=c[r+8>>2];c[s+56+12>>2]=c[r+12>>2];c[s+72>>2]=c[r+16>>2];c[s+72+4>>2]=c[r+16+4>>2];c[s+72+8>>2]=c[r+16+8>>2];c[s+72+12>>2]=c[r+16+12>>2];c[s+88>>2]=c[r+32>>2];c[s+88+4>>2]=c[r+32+4>>2];c[s+88+8>>2]=c[r+32+8>>2];c[s+88+12>>2]=c[r+32+12>>2];c[s+104>>2]=c[r+48>>2];c[s+104+4>>2]=c[r+48+4>>2];c[s+104+8>>2]=c[r+48+8>>2];c[s+104+12>>2]=c[r+48+12>>2];c[s+40>>2]=c[f+4>>2];h=c[q+52>>2]|0;c[s+192>>2]=7232;c[s+192+4>>2]=h;c[s+192+8>>2]=s;h=c[q+56>>2]|0;c[s+568>>2]=0;c[s+568+4>>2]=0;c[s+568+8>>2]=0;c[s+568+12>>2]=0;c[s+208>>2]=0;c[s+208+4>>2]=0;c[s+208+8>>2]=0;c[s+208+12>>2]=0;if(!(a[h+60>>0]|0))Re(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0);else ue(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0,c[h+56>>2]|0)}else{e=c[e+8>>2]|0;d=c[f+20>>2]|0;g[s+568+4>>2]=j;g[s+568+8>>2]=k;g[s+568+12>>2]=m;g[s+568+16>>2]=0.0;g[s+568+20>>2]=n;g[s+568+24>>2]=o;g[s+568+28>>2]=p;g[s+568+32>>2]=0.0;c[s+568+36>>2]=d;g[s+568+40>>2]=1.0;c[s+568>>2]=6048;c[s+568+44>>2]=f;c[s+568+48>>2]=e;c[s+568+52>>2]=q;c[s+568+56>>2]=c[r>>2];c[s+568+56+4>>2]=c[r+4>>2];c[s+568+56+8>>2]=c[r+8>>2];c[s+568+56+12>>2]=c[r+12>>2];c[s+568+72>>2]=c[r+16>>2];c[s+568+72+4>>2]=c[r+16+4>>2];c[s+568+72+8>>2]=c[r+16+8>>2];c[s+568+72+12>>2]=c[r+16+12>>2];c[s+568+88>>2]=c[r+32>>2];c[s+568+88+4>>2]=c[r+32+4>>2];c[s+568+88+8>>2]=c[r+32+8>>2];c[s+568+88+12>>2]=c[r+32+12>>2];c[s+568+104>>2]=c[r+48>>2];c[s+568+104+4>>2]=c[r+48+4>>2];c[s+568+104+8>>2]=c[r+48+8>>2];c[s+568+104+12>>2]=c[r+48+12>>2];c[s+568+40>>2]=c[f+4>>2];g[s+208>>2]=j;g[s+208+4>>2]=k;g[s+208+8>>2]=m;g[s+208+12>>2]=0.0;if(n>2]=n;if(o>2]=o;if(p>2]=p;g[s+192>>2]=j;g[s+192+4>>2]=k;g[s+192+8>>2]=m;g[s+192+12>>2]=0.0;if(j>2]=n;if(k>2]=o;if(m>2]=p;Vb[c[(c[q>>2]|0)+64>>2]&127](q,s+568|0,s+208|0,s+192|0)}l=s;return}function bd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];c[b+16>>2]=c[a+16>>2];c[b+16+4>>2]=c[a+16+4>>2];c[b+16+8>>2]=c[a+16+8>>2];c[b+16+12>>2]=c[a+16+12>>2];c[b+32>>2]=c[a+32>>2];c[b+32+4>>2]=c[a+32+4>>2];c[b+32+8>>2]=c[a+32+8>>2];c[b+32+12>>2]=c[a+32+12>>2];q=+g[a+20>>2];m=+g[a+40>>2];r=+g[a+24>>2];n=+g[a+36>>2];o=+g[a+32>>2];s=+g[a+16>>2];t=+g[a>>2];p=+g[a+4>>2];u=+g[a+8>>2];v=1.0/((q*m-r*n)*t+p*(r*o-m*s)+(n*s-q*o)*u);g[d>>2]=(q*m-r*n)*v;g[d+4>>2]=(n*u-m*p)*v;g[d+8>>2]=(r*p-q*u)*v;g[d+12>>2]=0.0;g[d+16>>2]=(r*o-m*s)*v;g[d+20>>2]=(m*t-o*u)*v;g[d+24>>2]=(s*u-r*t)*v;g[d+28>>2]=0.0;g[d+32>>2]=(n*s-q*o)*v;g[d+36>>2]=(o*p-n*t)*v;g[d+40>>2]=(q*t-s*p)*v;g[d+44>>2]=0.0;a:do if(!(c[5759]|0)){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0}else{e=0;D=(q*t-s*p)*v;F=(q*m-r*n)*v;G=(r*o-m*s)*v;H=(n*s-q*o)*v;I=(n*u-m*p)*v;B=(m*t-o*u)*v;A=(o*p-n*t)*v;z=(r*p-q*u)*v;y=(s*u-r*t)*v;while(1){o=+C(+F);n=+C(+G);N=+C(+H);W=+C(+I);O=+C(+B);M=+C(+A);Q=+C(+z);P=+C(+y);w=+C(+D);R=o+n+N>W+O+M?o+n+N:W+O+M;O=o+W+Q>n+O+P?o+W+Q:n+O+P;n=+g[b>>2];W=+C(+n);o=+g[b+16>>2];T=+C(+o);p=+g[b+32>>2];K=+C(+p);q=+g[b+4>>2];V=+C(+q);r=+g[b+20>>2];S=+C(+r);s=+g[b+36>>2];J=+C(+s);t=+g[b+8>>2];U=+C(+t);u=+g[b+24>>2];L=+C(+u);v=+g[b+40>>2];x=+C(+v);m=W+T+K>V+S+J?W+T+K:V+S+J;m=m>U+L+x?m:U+L+x;L=W+V+U>T+S+L?W+V+U:T+S+L;w=(R>Q+P+w?R:Q+P+w)*(O>N+M+w?O:N+M+w);x=m*(L>K+J+x?L:K+J+x);if(+C(+w)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}if(+C(+x)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}W=+E(+(w/x),.25);O=(n*(W+-2.0)+F*(1.0/W))*.5;Q=(q*(W+-2.0)+1.0/W*G)*.5;S=(t*(W+-2.0)+1.0/W*H)*.5;P=(o*(W+-2.0)+1.0/W*I)*.5;R=(r*(W+-2.0)+1.0/W*B)*.5;T=(u*(W+-2.0)+1.0/W*A)*.5;U=(p*(W+-2.0)+1.0/W*z)*.5;V=(s*(W+-2.0)+1.0/W*y)*.5;W=(v*(W+-2.0)+1.0/W*D)*.5;g[b>>2]=n+O;g[b+4>>2]=q+Q;g[b+8>>2]=t+S;g[b+12>>2]=0.0;g[b+16>>2]=o+P;g[b+20>>2]=r+R;g[b+24>>2]=u+T;g[b+28>>2]=0.0;g[b+32>>2]=p+U;g[b+36>>2]=s+V;g[b+40>>2]=v+W;g[b+44>>2]=0.0;N=1.0/(((v+W)*(r+R)-(u+T)*(s+V))*(n+O)+(q+Q)*((u+T)*(p+U)-(v+W)*(o+P))+((s+V)*(o+P)-(r+R)*(p+U))*(t+S));F=((v+W)*(r+R)-(u+T)*(s+V))*N;I=((s+V)*(t+S)-(v+W)*(q+Q))*N;z=((u+T)*(q+Q)-(r+R)*(t+S))*N;G=((u+T)*(p+U)-(v+W)*(o+P))*N;B=((v+W)*(n+O)-(p+U)*(t+S))*N;y=((o+P)*(t+S)-(u+T)*(n+O))*N;H=((s+V)*(o+P)-(r+R)*(p+U))*N;A=((p+U)*(q+Q)-(s+V)*(n+O))*N;D=((r+R)*(n+O)-(o+P)*(q+Q))*N;g[d>>2]=F;g[d+4>>2]=I;g[d+8>>2]=z;g[d+12>>2]=0.0;g[d+16>>2]=G;g[d+20>>2]=B;g[d+24>>2]=y;g[d+28>>2]=0.0;g[d+32>>2]=H;g[d+36>>2]=A;g[d+40>>2]=D;g[d+44>>2]=0.0;U=+C(+O)+ +C(+P)+ +C(+U);V=+C(+Q)+ +C(+R)+ +C(+V);W=+C(+S)+ +C(+T)+ +C(+W);V=U>V?U:V;if((V>W?V:W)<=m*+g[5758])break;e=e+1|0;if(e>>>0>=(c[5759]|0)>>>0){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}}M=+g[b>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[b+4>>2];J=+g[b+20>>2];L=+g[b+36>>2];A=+g[b+8>>2];D=+g[b+24>>2];G=+g[b+40>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}while(0);M=+g[k>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[l>>2];J=+g[e>>2];L=+g[f>>2];A=+g[h>>2];D=+g[i>>2];G=+g[j>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}function cd(a,b,f,i){a=a|0;b=b|0;f=f|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0;o=l;l=l+80|0;n=xb[c[(c[a>>2]|0)+28>>2]&127](a)|0;j=+g[a+4>>2];k=+g[a+8>>2];m=+g[a+12>>2];if((n|0)<=0){l=o;return}i=0;do{cc[c[(c[a>>2]|0)+16>>2]&3](a,o+76|0,o+52|0,o+64|0,o+56|0,o+72|0,o+68|0,o+48|0,o+60|0,i);a:do switch(c[o+64>>2]|0){case 0:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{r=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;t=c[o+76>>2]|0;s=c[o+56>>2]|0;u=t+(P(s,c[r>>2]|0)|0)|0;q=k*+g[u+4>>2];p=m*+g[u+8>>2];g[o>>2]=j*+g[u>>2];g[o+4>>2]=q;g[o+8>>2]=p;g[o+12>>2]=0.0;u=t+(P(s,c[r+4>>2]|0)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+16>>2]=j*+g[u>>2];g[o+20>>2]=p;g[o+24>>2]=q;g[o+28>>2]=0.0;r=t+(P(s,c[r+8>>2]|0)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+32>>2]=j*+g[r>>2];g[o+36>>2]=q;g[o+40>>2]=p;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}case 1:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{u=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;t=c[o+56>>2]|0;r=s+(P(t,c[u>>2]|0)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(t,c[u+4>>2]|0)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(t,c[u+8>>2]|0)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}default:{}}while(0);Ob[c[(c[a>>2]|0)+24>>2]&127](a,i);i=i+1|0}while((i|0)!=(n|0));l=o;return}function dd(d,e,f,h,i){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;y=l;l=l+128|0;a[d+60>>0]=f&1;if(f){r=+g[h>>2]+-1.0;u=+g[h+4>>2]+-1.0;v=+g[h+8>>2]+-1.0;g[d+4>>2]=r;g[d+8>>2]=u;g[d+12>>2]=v;g[d+16>>2]=0.0;x=+g[i>>2]+1.0;m=+g[i+4>>2]+1.0;j=+g[i+8>>2]+1.0;g[d+20>>2]=x;g[d+24>>2]=m;g[d+28>>2]=j;g[d+32>>2]=0.0;g[d+36>>2]=65533.0/(x-r);g[d+40>>2]=65533.0/(m-u);g[d+44>>2]=65533.0/(j-v);g[d+48>>2]=0.0;a[d+60>>0]=1;n=r+ +(~~((r-r)*(65533.0/(x-r)))&65535&-2&65535)/(65533.0/(x-r))+-1.0;o=u+ +(~~((u-u)*(65533.0/(m-u)))&65535&-2&65535)/(65533.0/(m-u))+-1.0;t=v+ +(~~((v-v)*(65533.0/(j-v)))&65535&-2&65535)/(65533.0/(j-v))+-1.0;if(n>2]=n;else n=r;if(o>2]=o;w=o}else w=u;if(t>2]=t;else t=v;o=x-n;r=m-w;u=j-t;g[d+36>>2]=65533.0/o;g[d+40>>2]=65533.0/r;g[d+44>>2]=65533.0/u;g[d+48>>2]=0.0;o=n+ +((~~(o*(65533.0/o)+1.0)&65535|1)&65535)/(65533.0/o)+1.0;r=w+ +((~~(r*(65533.0/r)+1.0)&65535|1)&65535)/(65533.0/r)+1.0;u=t+ +((~~(u*(65533.0/u)+1.0)&65535|1)&65535)/(65533.0/u)+1.0;if(x>2]=o;else o=x;if(m>2]=r;m=r}if(j>2]=u;j=u}g[d+36>>2]=65533.0/(o-n);g[d+40>>2]=65533.0/(m-w);g[d+44>>2]=65533.0/(j-t);g[d+48>>2]=0.0;c[y+96>>2]=8364;c[y+96+4>>2]=d+104;c[y+96+8>>2]=d;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,d+4|0,d+20|0);f=c[d+108>>2]|0;c[y+80>>2]=0;c[y+80+4>>2]=0;c[y+80+8>>2]=0;c[y+80+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(f<<1|0)){if((c[d+132>>2]|0)<(f<<1|0)){if(!f){h=0;e=k}else{c[6995]=(c[6995]|0)+1;h=sc(f<<5|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+128>>2]|0}if((e|0)>0){i=0;do{s=h+(i<<4)|0;q=(c[d+136>>2]|0)+(i<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=i+1|0}while((i|0)!=(e|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=h;c[d+132>>2]=f<<1;i=d+136|0}else i=d+136|0;h=k;do{s=(c[i>>2]|0)+(h<<4)|0;c[s>>2]=c[y+80>>2];c[s+4>>2]=c[y+80+4>>2];c[s+8>>2]=c[y+80+8>>2];c[s+12>>2]=c[y+80+12>>2];h=h+1|0}while((h|0)!=(f<<1|0))}c[d+128>>2]=f<<1}else{c[y+96>>2]=8384;c[y+96+4>>2]=d+64;c[y+80>>2]=-581039253;c[y+80+4>>2]=-581039253;c[y+80+8>>2]=-581039253;g[y+80+12>>2]=0.0;c[y+64>>2]=1566444395;c[y+64+4>>2]=1566444395;c[y+64+8>>2]=1566444395;g[y+64+12>>2]=0.0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,y+80|0,y+64|0);f=c[d+68>>2]|0;k=y;q=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(q|0));s=c[d+88>>2]|0;if((s|0)<(f<<1|0)){if((c[d+92>>2]|0)<(f<<1|0)){if(!f){h=0;e=s}else{c[6995]=(c[6995]|0)+1;h=sc(f<<7|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+88>>2]|0}if((e|0)>0){i=0;do{k=h+(i<<6)|0;p=(c[d+96>>2]|0)+(i<<6)|0;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));i=i+1|0}while((i|0)!=(e|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=h;c[d+92>>2]=f<<1;i=d+96|0}else i=d+96|0;h=s;do{k=(c[i>>2]|0)+(h<<6)|0;p=y;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));h=h+1|0}while((h|0)!=(f<<1|0))}c[d+88>>2]=f<<1}c[d+56>>2]=0;Cc(d,0,f);if(a[d+60>>0]|0?(c[d+152>>2]|0)==0:0){if(!(c[d+156>>2]|0)){c[6995]=(c[6995]|0)+1;f=sc(51)|0;if(!f)e=0;else{c[(f+4+15&-16)+-4>>2]=f;e=f+4+15&-16}h=c[d+152>>2]|0;if((h|0)>0){f=0;do{s=e+(f<<5)|0;q=(c[d+160>>2]|0)+(f<<5)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[s+16>>2]=c[q+16>>2];c[s+20>>2]=c[q+20>>2];c[s+24>>2]=c[q+24>>2];c[s+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[d+160>>2]|0;if(f|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=e;c[d+156>>2]=1;h=d+160|0;i=(c[d+152>>2]|0)+1|0;f=e}else{h=d+160|0;i=1;f=c[d+160>>2]|0}c[d+152>>2]=i;c[f>>2]=c[y+96>>2];c[f+4>>2]=c[y+96+4>>2];c[f+8>>2]=c[y+96+8>>2];c[f+12>>2]=c[y+96+12>>2];c[f+16>>2]=c[y+96+16>>2];c[f+20>>2]=c[y+96+20>>2];c[f+24>>2]=c[y+96+24>>2];c[f+28>>2]=c[y+96+28>>2];s=c[h>>2]|0;q=c[d+136>>2]|0;b[s>>1]=b[q>>1]|0;b[s+2>>1]=b[q+2>>1]|0;b[s+4>>1]=b[q+4>>1]|0;b[s+6>>1]=b[q+6>>1]|0;b[s+8>>1]=b[q+8>>1]|0;b[s+10>>1]=b[q+10>>1]|0;c[s+12>>2]=0;q=c[q+12>>2]|0;c[s+16>>2]=(q|0)>-1?1:0-q|0}c[d+168>>2]=c[d+152>>2];f=c[d+116>>2]|0;if(f|0){if(a[d+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+116>>2]=0}a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;f=c[d+76>>2]|0;if(!f){a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}if(a[d+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+76>>2]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}function ed(b,d,e,f,h,i,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;m=+m;n=n|0;o=+o;p=+p;var q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,R=0.0,S=0.0;Q=c[b+68>>2]|0;if((Q|0)==(c[b+72>>2]|0)?(u=Q|0?Q<<1:1,(Q|0)<(u|0)):0){if(!u){r=0;t=Q}else{c[6995]=(c[6995]|0)+1;r=sc((u*152|3)+16|0)|0;if(!r)r=0;else{c[(r+4+15&-16)+-4>>2]=r;r=r+4+15&-16}t=c[b+68>>2]|0}if((t|0)>0){s=0;do{gi(r+(s*152|0)|0,(c[b+76>>2]|0)+(s*152|0)|0,152)|0;s=s+1|0}while((s|0)!=(t|0))}s=c[b+76>>2]|0;if(s|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[s+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=r;c[b+72>>2]=u;r=c[b+68>>2]|0}else r=Q;c[b+68>>2]=r+1;P=c[b+76>>2]|0;c[P+(Q*152|0)+140>>2]=h;t=c[b+16>>2]|0;r=c[t+(e*244|0)+240>>2]|0;s=c[t+(f*244|0)+240>>2]|0;c[P+(Q*152|0)+144>>2]=e;c[P+(Q*152|0)+148>>2]=f;u=c[i+84>>2]|0;c[P+(Q*152|0)+104>>2]=u;c[P+(Q*152|0)+132>>2]=0;g[P+(Q*152|0)+100>>2]=0.0;g[P+(Q*152|0)+96>>2]=0.0;O=(c[j>>2]=u,+g[j>>2]);if(r|0){c[P+(Q*152|0)+16>>2]=c[d>>2];c[P+(Q*152|0)+16+4>>2]=c[d+4>>2];c[P+(Q*152|0)+16+8>>2]=c[d+8>>2];c[P+(Q*152|0)+16+12>>2]=c[d+12>>2];N=+g[k+4>>2];J=+g[P+(Q*152|0)+24>>2];H=+g[k+8>>2];L=+g[P+(Q*152|0)+20>>2];K=+g[P+(Q*152|0)+16>>2];M=+g[k>>2];g[P+(Q*152|0)>>2]=N*J-H*L;g[P+(Q*152|0)+4>>2]=H*K-J*M;g[P+(Q*152|0)+8>>2]=L*M-N*K;g[P+(Q*152|0)+12>>2]=0.0;w=((N*J-H*L)*+g[r+324>>2]+(H*K-J*M)*+g[r+328>>2]+(L*M-N*K)*+g[r+332>>2])*+g[r+604>>2];q=((N*J-H*L)*+g[r+340>>2]+(H*K-J*M)*+g[r+344>>2]+(L*M-N*K)*+g[r+348>>2])*+g[r+608>>2];v=((N*J-H*L)*+g[r+356>>2]+(H*K-J*M)*+g[r+360>>2]+(L*M-N*K)*+g[r+364>>2])*+g[r+612>>2];g[P+(Q*152|0)+64>>2]=w;g[P+(Q*152|0)+68>>2]=q;g[P+(Q*152|0)+72>>2]=v;g[P+(Q*152|0)+76>>2]=0.0;C=K;D=L;E=J;I=N*J-H*L;J=H*K-J*M;K=L*M-N*K}else{c[P+(Q*152|0)+64>>2]=0;c[P+(Q*152|0)+64+4>>2]=0;c[P+(Q*152|0)+64+8>>2]=0;c[P+(Q*152|0)+64+12>>2]=0;c[P+(Q*152|0)>>2]=0;c[P+(Q*152|0)+4>>2]=0;c[P+(Q*152|0)+8>>2]=0;c[P+(Q*152|0)+12>>2]=0;c[P+(Q*152|0)+16>>2]=0;c[P+(Q*152|0)+20>>2]=0;c[P+(Q*152|0)+24>>2]=0;c[P+(Q*152|0)+28>>2]=0;q=0.0;v=0.0;w=0.0;C=0.0;D=0.0;E=0.0;I=0.0;J=0.0;K=0.0}if(s|0){N=-+g[d>>2];A=-+g[d+4>>2];M=-+g[d+8>>2];g[P+(Q*152|0)+48>>2]=N;g[P+(Q*152|0)+52>>2]=A;g[P+(Q*152|0)+56>>2]=M;g[P+(Q*152|0)+60>>2]=0.0;B=+g[l+4>>2];S=+g[l+8>>2];R=+g[l>>2];g[P+(Q*152|0)+32>>2]=B*M-S*A;g[P+(Q*152|0)+36>>2]=S*N-R*M;g[P+(Q*152|0)+40>>2]=R*A-B*N;g[P+(Q*152|0)+44>>2]=0.0;x=((B*M-S*A)*+g[s+324>>2]+(S*N-R*M)*+g[s+328>>2]+(R*A-B*N)*+g[s+332>>2])*+g[s+604>>2];y=((B*M-S*A)*+g[s+340>>2]+(S*N-R*M)*+g[s+344>>2]+(R*A-B*N)*+g[s+348>>2])*+g[s+608>>2];z=((B*M-S*A)*+g[s+356>>2]+(S*N-R*M)*+g[s+360>>2]+(R*A-B*N)*+g[s+364>>2])*+g[s+612>>2];g[P+(Q*152|0)+80>>2]=x;g[P+(Q*152|0)+84>>2]=y;g[P+(Q*152|0)+88>>2]=z;g[P+(Q*152|0)+92>>2]=0.0;F=N;G=A;H=M;L=B*M-S*A;M=S*N-R*M;N=R*A-B*N}else{c[P+(Q*152|0)+80>>2]=0;c[P+(Q*152|0)+80+4>>2]=0;c[P+(Q*152|0)+80+8>>2]=0;c[P+(Q*152|0)+80+12>>2]=0;c[P+(Q*152|0)+32>>2]=0;c[P+(Q*152|0)+32+4>>2]=0;c[P+(Q*152|0)+32+8>>2]=0;c[P+(Q*152|0)+32+12>>2]=0;c[P+(Q*152|0)+32+16>>2]=0;c[P+(Q*152|0)+32+20>>2]=0;c[P+(Q*152|0)+32+24>>2]=0;c[P+(Q*152|0)+32+28>>2]=0;x=0.0;y=0.0;z=0.0;F=0.0;G=0.0;H=0.0;L=0.0;M=0.0;N=0.0}if(r|0){B=+g[k+8>>2];R=+g[k+4>>2];S=+g[k>>2];v=+g[r+404>>2]+((q*B-v*R)*+g[d>>2]+(v*S-B*w)*+g[d+4>>2]+(R*w-q*S)*+g[d+8>>2])}else v=0.0;if(s|0){R=-x;q=-y;z=-z;A=+g[l+8>>2];B=+g[l+4>>2];S=+g[l>>2];q=+g[s+404>>2]+((A*q-B*z)*+g[d>>2]+(S*z-A*R)*+g[d+4>>2]+(B*R-S*q)*+g[d+8>>2])}else q=0.0;B=m/(v+q);g[P+(Q*152|0)+108>>2]=B;if(r|0){z=+g[t+(e*244|0)+192>>2];m=+g[t+(e*244|0)+196>>2];A=+g[t+(e*244|0)+200>>2];y=(+g[t+(e*244|0)+176>>2]+ +g[t+(e*244|0)+208>>2])*C+(+g[t+(e*244|0)+180>>2]+ +g[t+(e*244|0)+212>>2])*D+(+g[t+(e*244|0)+184>>2]+ +g[t+(e*244|0)+216>>2])*E}else{z=0.0;m=0.0;A=0.0;y=C*0.0+D*0.0+E*0.0}if(s|0){v=+g[t+(f*244|0)+192>>2];w=+g[t+(f*244|0)+196>>2];x=+g[t+(f*244|0)+200>>2];q=(+g[t+(f*244|0)+176>>2]+ +g[t+(f*244|0)+208>>2])*F+(+g[t+(f*244|0)+180>>2]+ +g[t+(f*244|0)+212>>2])*G+(+g[t+(f*244|0)+184>>2]+ +g[t+(f*244|0)+216>>2])*H}else{v=0.0;w=0.0;x=0.0;q=F*0.0+G*0.0+H*0.0}q=B*(o-(y+(z*I+m*J+A*K)+(q+(v*L+w*M+x*N))));if(!(c[i+120>>2]&16)){S=0.0;S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}S=B*(-(+g[n+44>>2]*((+g[i+48>>2]-+g[i+32>>2])*+g[d>>2]+(+g[i+52>>2]-+g[i+36>>2])*+g[d+4>>2]+(+g[i+56>>2]-+g[i+40>>2])*+g[d+8>>2]))/+g[n+12>>2]);S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}function fd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0;ea=l;l=l+32|0;J=c[b+4>>2]|0;a[J+312>>0]=0;c[J>>2]=0;a[J+356>>0]=1;c[J+292>>2]=1566444395;c[J+296>>2]=1566444395;c[J+300>>2]=1566444395;g[J+304>>2]=0.0;c[J+336>>2]=0;c[J+336+4>>2]=0;c[J+336+8>>2]=0;c[J+336+12>>2]=0;a[J+336+16>>0]=0;a[J+332>>0]=a[J+332>>0]&-16;p=+g[d+48>>2];r=+g[d+52>>2];u=+g[d+56>>2];o=+g[f+48>>2];q=+g[f+52>>2];t=+g[f+56>>2];L=+g[d>>2];X=+g[d+4>>2];Z=+g[d+8>>2];$=+g[d+16>>2];N=+g[d+20>>2];P=+g[d+24>>2];R=+g[d+32>>2];T=+g[d+36>>2];V=+g[d+40>>2];K=+g[f>>2];W=+g[f+4>>2];Y=+g[f+8>>2];_=+g[f+16>>2];M=+g[f+20>>2];O=+g[f+24>>2];Q=+g[f+32>>2];S=+g[f+36>>2];U=+g[f+40>>2];ba=+g[e+48>>2]-p-(+g[h+48>>2]-o);ca=+g[e+52>>2]-r-(+g[h+52>>2]-q);da=+g[e+56>>2]-u-(+g[h+56>>2]-t);J=c[b+8>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;g[ea>>2]=L*-ba+$*-ca+R*-da;g[ea+4>>2]=X*-ba+N*-ca+T*-da;g[ea+8>>2]=Z*-ba+P*-ca+V*-da;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];G=+g[ea+16+8>>2];m=H*+g[d>>2]+I*+g[d+4>>2]+G*+g[d+8>>2]+ +g[d+48>>2];w=H*+g[d+16>>2]+I*+g[d+20>>2]+G*+g[d+24>>2]+ +g[d+52>>2];G=H*+g[d+32>>2]+I*+g[d+36>>2]+G*+g[d+40>>2]+ +g[d+56>>2];J=c[b+12>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;I=ba*+g[f+4>>2]+ca*+g[f+20>>2]+da*+g[f+36>>2];H=ba*+g[f+8>>2]+ca*+g[f+24>>2]+da*+g[f+40>>2];g[ea>>2]=ba*+g[f>>2]+ca*+g[f+16>>2]+da*+g[f+32>>2];g[ea+4>>2]=I;g[ea+8>>2]=H;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];n=+g[ea+16+8>>2];m=m-(H*+g[f>>2]+I*+g[f+4>>2]+n*+g[f+8>>2]+ +g[f+48>>2]);w=w-(H*+g[f+16>>2]+I*+g[f+20>>2]+n*+g[f+24>>2]+ +g[f+52>>2]);n=G-(H*+g[f+32>>2]+I*+g[f+36>>2]+n*+g[f+40>>2]+ +g[f+56>>2]);a:do if(m*m+w*w+n*n>9.999999747378752e-05){k=0.0;J=32;I=m;j=0;H=n;s=0;z=o;o=0.0;n=0.0;m=0.0;while(1){if(!J)break a;J=J+-1|0;x=c[b+8>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;C=-I;fa=-w;y=-H;g[ea>>2]=L*C+$*fa+R*y;g[ea+4>>2]=X*C+N*fa+T*y;g[ea+8>>2]=Z*C+P*fa+V*y;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);y=+g[ea+16>>2];fa=+g[ea+16+4>>2];C=+g[ea+16+8>>2];A=p+(L*y+X*fa+Z*C);B=r+($*y+N*fa+P*C);C=u+(R*y+T*fa+V*C);x=c[b+12>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;g[ea>>2]=K*I+_*w+Q*H;g[ea+4>>2]=W*I+M*w+S*H;g[ea+8>>2]=Y*I+O*w+U*H;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);fa=+g[ea+16>>2];y=+g[ea+16+4>>2];G=+g[ea+16+8>>2];E=z+(K*fa+W*y+Y*G);F=q+(_*fa+M*y+O*G);G=t+(Q*fa+S*y+U*G);y=I*(A-E)+w*(B-F)+H*(C-G);if(k>1.0){j=0;aa=25;break}if(y>0.0){m=ba*I+ca*w+da*H;if(m>=-1.4210854715202004e-14){j=0;aa=25;break}u=k-y/m;k=u;j=s;y=(1.0-u)*+g[f+48>>2]+u*+g[h+48>>2];p=(1.0-u)*+g[d+48>>2]+u*+g[e+48>>2];q=(1.0-u)*+g[f+52>>2]+u*+g[h+52>>2];r=(1.0-u)*+g[d+52>>2]+u*+g[e+52>>2];t=(1.0-u)*+g[f+56>>2]+u*+g[h+56>>2];u=(1.0-u)*+g[d+56>>2]+u*+g[e+56>>2];m=I;n=w;o=H}else y=z;s=c[b+4>>2]|0;x=c[s>>2]|0;b:do if((x|0)>0){w=+g[s+308>>2];v=0;while(1){H=A-E-+g[s+4+(v<<4)>>2];I=B-F-+g[s+4+(v<<4)+4>>2];fa=C-G-+g[s+4+(v<<4)+8>>2];v=v+1|0;if(H*H+I*I+fa*fa<=w){v=1;break b}if((v|0)>=(x|0)){v=0;break}}}else v=0;while(0);if((+g[s+304>>2]==0.0?C-G==+g[s+300>>2]:0)?B-F==+g[s+296>>2]:0){if(!(A-E==+g[s+292>>2]|v))aa=17}else if(!v)aa=17;if((aa|0)==17){aa=0;g[s+292>>2]=A-E;g[s+296>>2]=B-F;g[s+300>>2]=C-G;g[s+304>>2]=0.0;a[s+356>>0]=1;g[s+4+(x<<4)>>2]=A-E;g[s+4+(x<<4)+4>>2]=B-F;g[s+4+(x<<4)+8>>2]=C-G;g[s+4+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+84+(x<<4)>>2]=A;g[s+84+(x<<4)+4>>2]=B;g[s+84+(x<<4)+8>>2]=C;g[s+84+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+164+(x<<4)>>2]=E;g[s+164+(x<<4)+4>>2]=F;g[s+164+(x<<4)+8>>2]=G;g[s+164+(x<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;s=c[b+4>>2]|0}x=wc(s)|0;I=+g[s+276>>2];w=+g[s+280>>2];H=+g[s+284>>2];if(!x)break a;if(!(I*I+w*w+H*H>9.999999747378752e-05))break a;else{s=c[s+288>>2]|0;z=y}}if((aa|0)==25){l=ea;return j|0}}else{k=0.0;o=0.0;n=0.0;m=0.0;j=0}while(0);g[i+164>>2]=k;k=m*m+n*n+o*o;if(!(k>=1.4210854715202004e-14)){c[i+132>>2]=0;c[i+132+4>>2]=0;c[i+132+8>>2]=0;c[i+132+12>>2]=0;k=0.0;m=0.0;n=0.0}else{fa=1.0/+D(+k);k=m*fa;m=n*fa;n=o*fa;g[i+132>>2]=k;g[i+136>>2]=m;g[i+140>>2]=n;c[i+144>>2]=j}if(ba*k+ca*m+da*n>=-+g[i+172>>2]){i=0;l=ea;return i|0}b=c[b+4>>2]|0;wc(b)|0;$p(i+148|0,b+260|0,16)|0;i=1;l=ea;return i|0}function gd(b,d,e,f,h,i,j,k,l,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,E=0.0,F=0,G=0,H=0;if((j|0)<2|(k|0)<2){m=0;return m|0}y=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(y>>>0>268435455?18:(y<<4|3)+16|0)|0;if(!b)q=0;else{c[(b+4+15&-16)+-4>>2]=b;q=b+4+15&-16}s=$I(y>>>0>1073741823?-1:y<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{E=+(b|0)/+(k+-1|0);r=+g[e>>2];r=r+E*(+g[h>>2]-r);t=+g[e+4>>2];t=t+E*(+g[h+4>>2]-t);u=+g[e+8>>2];u=u+E*(+g[h+8>>2]-u);v=+g[f>>2];w=+g[f+4>>2];x=+g[f+8>>2];v=v+E*(+g[i>>2]-v)-r;w=w+E*(+g[i+4>>2]-w)-t;x=x+E*(+g[i+8>>2]-x)-u;p=P(b,j)|0;o=0;do{E=+(o|0)/+(j+-1|0);C=o+p|0;g[q+(C<<4)>>2]=r+v*E;g[q+(C<<4)+4>>2]=t+w*E;g[q+(C<<4)+8>>2]=u+x*E;g[q+(C<<4)+12>>2]=0.0;g[s+(C<<2)>>2]=1.0;o=o+1|0}while((o|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,y,q,s);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){C=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){C=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&16|0){g[(c[b+780>>2]|0)+(((j+-1|0)/2|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&32|0){C=P((k+-1|0)/2|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&64|0){C=j+-1+(P((k+-1|0)/2|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&128|0){C=(P(k+-1|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&256|0){C=(P((k+-1|0)/2|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(q|0){c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0)}aJ(s);if((k|0)<=0){m=b;return m|0}d=b+780|0;l=b+792|0;z=b+800|0;A=b+984|0;o=0;y=0;B=j+-1|0;C=(j<<1)+-1|0;while(1){p=y;y=y+1|0;a:do if((j|0)>0){i=P(p,j)|0;h=P(y,j)|0;t=1.0/+(k+-1|0)*+(k+-1-p|0);r=1.0/+(k+-1|0)*+(k+-2-p|0);if((y|0)<(k|0)){p=0;q=o}else{p=0;while(1){q=p;p=p+1|0;if((p|0)<(j|0)){s=p+i|0;e=c[d>>2]|0;Xh(b,0);h=(c[l>>2]|0)+-1|0;f=c[z>>2]|0;c[f+(h*52|0)+24>>2]=e+((q+i|0)*104|0);c[f+(h*52|0)+28>>2]=e+(s*104|0);w=+g[e+((q+i|0)*104|0)+8>>2]-+g[e+(s*104|0)+8>>2];x=+g[e+((q+i|0)*104|0)+12>>2]-+g[e+(s*104|0)+12>>2];E=+g[e+((q+i|0)*104|0)+16>>2]-+g[e+(s*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}if((p|0)==(j|0))break a}}while(1){e=p+1|0;s=p+i|0;f=p+h|0;if((p|0)==(j+-1|0))break;G=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;F=c[z>>2]|0;c[F+(H*52|0)+24>>2]=G+(s*104|0);c[F+(H*52|0)+28>>2]=G+((e+i|0)*104|0);E=+g[G+(s*104|0)+8>>2]-+g[G+((e+i|0)*104|0)+8>>2];x=+g[G+(s*104|0)+12>>2]-+g[G+((e+i|0)*104|0)+12>>2];w=+g[G+(s*104|0)+16>>2]-+g[G+((e+i|0)*104|0)+16>>2];g[F+(H*52|0)+32>>2]=+D(+(E*E+x*x+w*w));a[A>>0]=1;H=c[d>>2]|0;Xh(b,0);F=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(F*52|0)+24>>2]=H+(s*104|0);c[G+(F*52|0)+28>>2]=H+(f*104|0);w=+g[H+(s*104|0)+8>>2]-+g[H+(f*104|0)+8>>2];x=+g[H+(s*104|0)+12>>2]-+g[H+(f*104|0)+12>>2];E=+g[H+(s*104|0)+16>>2]-+g[H+(f*104|0)+16>>2];g[G+(F*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;bg(b,s,f,e+h|0,0);if(!n)bg(b,e+h|0,e+i|0,s,0);else{E=1.0/+(j+-1|0)*+(p|0);g[n+(q<<2)>>2]=E;g[n+(q+1<<2)>>2]=t;g[n+(q+2<<2)>>2]=E;g[n+(q+3<<2)>>2]=r;x=1.0/+(j+-1|0)*+(e|0);g[n+(q+4<<2)>>2]=x;g[n+(q+5<<2)>>2]=r;bg(b,e+h|0,e+i|0,s,0);g[n+(q+6<<2)>>2]=x;g[n+(q+7<<2)>>2]=r;g[n+(q+8<<2)>>2]=x;g[n+(q+9<<2)>>2]=t;g[n+(q+10<<2)>>2]=E;g[n+(q+11<<2)>>2]=t}if(m){F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(s*104|0);c[G+(H*52|0)+28>>2]=F+((e+h|0)*104|0);w=+g[F+(s*104|0)+8>>2]-+g[F+((e+h|0)*104|0)+8>>2];x=+g[F+(s*104|0)+12>>2]-+g[F+((e+h|0)*104|0)+12>>2];E=+g[F+(s*104|0)+16>>2]-+g[F+((e+h|0)*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}p=e;q=q+12|0}F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(B*104|0);c[G+(H*52|0)+28>>2]=F+(C*104|0);w=+g[F+(B*104|0)+8>>2]-+g[F+(C*104|0)+8>>2];x=+g[F+(B*104|0)+12>>2]-+g[F+(C*104|0)+12>>2];E=+g[F+(B*104|0)+16>>2]-+g[F+(C*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;o=(j*12|0)+-12+o|0}while(0);if((y|0)==(k|0))break;else{B=B+j|0;C=C+j|0}}return b|0}function hd(b,d,e,f,h){b=b|0;d=d|0;e=+e;f=+f;h=+h;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0;y=l;l=l+240|0;n=+g[b+136>>2]+f;o=+g[b+140>>2]+h;g[b+152>>2]=+g[b+132>>2]+e;g[b+156>>2]=n;g[b+160>>2]=o;g[b+164>>2]=0.0;c[y+176>>2]=1065353216;q=y+176+4|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[y+176+20>>2]=1065353216;r=y+176+24|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[y+176+40>>2]=1065353216;s=y+176+44|0;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[s+16>>2]=0;c[y+112>>2]=1065353216;t=y+112+4|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[y+112+20>>2]=1065353216;u=y+112+24|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[y+112+40>>2]=1065353216;v=y+112+44|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;o=1.0;p=10;while(1){if((p|0)<=0){x=29;break}p=p+-1|0;c[y+176+48>>2]=c[b+132>>2];c[y+176+48+4>>2]=c[b+132+4>>2];c[y+176+48+8>>2]=c[b+132+8>>2];c[y+176+48+12>>2]=c[b+132+12>>2];c[y+112+48>>2]=c[b+152>>2];c[y+112+48+4>>2]=c[b+152+4>>2];c[y+112+48+8>>2]=c[b+152+8>>2];c[y+112+48+12>>2]=c[b+152+12>>2];m=+g[b+132>>2]-+g[b+152>>2];n=+g[b+136>>2]-+g[b+156>>2];e=+g[b+140>>2]-+g[b+160>>2];z=+g[b+168>>2];j=+g[b+172>>2];A=+g[b+176>>2];h=+g[b+180>>2];B=z*(2.0/(z*z+j*j+A*A+h*h));f=j*(2.0/(z*z+j*j+A*A+h*h));k=A*(2.0/(z*z+j*j+A*A+h*h));g[y+176>>2]=1.0-(j*f+A*k);g[q>>2]=z*f-h*k;g[y+176+8>>2]=z*k+h*f;g[y+176+12>>2]=0.0;g[y+176+16>>2]=z*f+h*k;g[y+176+20>>2]=1.0-(z*B+A*k);g[r>>2]=j*k-h*B;g[y+176+28>>2]=0.0;g[y+176+32>>2]=z*k-h*f;g[y+176+36>>2]=j*k+h*B;g[y+176+40>>2]=1.0-(z*B+j*f);g[s>>2]=0.0;f=+g[b+184>>2];j=+g[b+188>>2];B=+g[b+192>>2];z=+g[b+196>>2];h=f*(2.0/(f*f+j*j+B*B+z*z));k=j*(2.0/(f*f+j*j+B*B+z*z));A=B*(2.0/(f*f+j*j+B*B+z*z));g[y+112>>2]=1.0-(j*k+B*A);g[t>>2]=f*k-z*A;g[y+112+8>>2]=f*A+z*k;g[y+112+12>>2]=0.0;g[y+112+16>>2]=f*k+z*A;g[y+112+20>>2]=1.0-(f*h+B*A);g[u>>2]=j*A-z*h;g[y+112+28>>2]=0.0;g[y+112+32>>2]=f*A-z*k;g[y+112+36>>2]=j*A+z*h;g[y+112+40>>2]=1.0-(f*h+j*k);g[v>>2]=0.0;i=c[b+8>>2]|0;g[y+4>>2]=1.0;c[y+80>>2]=0;c[y+16>>2]=0;c[y+16+4>>2]=0;c[y+16+8>>2]=0;c[y+16+12>>2]=0;c[y+16+16>>2]=0;c[y+16+20>>2]=0;c[y+16+24>>2]=0;c[y+16+28>>2]=0;c[y>>2]=5252;c[y+84>>2]=i;g[y+88>>2]=m;g[y+92>>2]=n;g[y+96>>2]=e;g[y+100>>2]=0.0;g[y+104>>2]=0.0;i=c[i+188>>2]|0;c[y+8>>2]=c[i+4>>2];c[y+12>>2]=c[i+8>>2];i=c[b+12>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e+ +g[b+64>>2]);if(!((((((((((((+g[y+176>>2]==+g[y+112>>2]?+g[y+176+16>>2]==+g[y+112+16>>2]:0)?+g[y+176+32>>2]==+g[y+112+32>>2]:0)?+g[q>>2]==+g[t>>2]:0)?+g[y+176+20>>2]==+g[y+112+20>>2]:0)?+g[y+176+36>>2]==+g[y+112+36>>2]:0)?+g[y+176+8>>2]==+g[y+112+8>>2]:0)?+g[r>>2]==+g[u>>2]:0)?+g[y+176+40>>2]==+g[y+112+40>>2]:0)?+g[y+176+60>>2]==+g[y+112+60>>2]:0)?+g[y+176+56>>2]==+g[y+112+56>>2]:0)?+g[y+176+52>>2]==+g[y+112+52>>2]:0)?+g[y+176+48>>2]==+g[y+112+48>>2]:0))x=16;do if((x|0)==16){x=0;i=c[b+12>>2]|0;if(!(a[b+250>>0]|0)){Ud(d,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}else{pd(c[b+8>>2]|0,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}}while(0);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e);B=+g[y+4>>2];o=o-B;if((B<1.0?(w=c[b+8>>2]|0,(c[w+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,w,c[y+80>>2]|0)|0:0){e=+g[b+152>>2];k=+g[b+132>>2];h=+g[b+156>>2];m=+g[b+136>>2];j=+g[b+160>>2];n=+g[b+140>>2];f=+D(+((e-k)*(e-k)+(h-m)*(h-m)+(j-n)*(j-n)));if(f>1.1920928955078125e-07){E=+g[y+48>>2];z=+g[y+52>>2];F=+g[y+56>>2];B=((e-k)*(1.0/f)*E+(h-m)*(1.0/f)*z+(j-n)*(1.0/f)*F)*2.0;C=(e-k)*(1.0/f)-E*B;A=(h-m)*(1.0/f)-z*B;h=(j-n)*(1.0/f)-F*B;j=1.0/+D(+(h*h+(C*C+A*A)));c[b+152>>2]=c[b+132>>2];c[b+152+4>>2]=c[b+132+4>>2];c[b+152+8>>2]=c[b+132+8>>2];c[b+152+12>>2]=c[b+132+12>>2];e=f*(j*C-E*(F*j*h+(E*j*C+z*j*A)))+ +g[b+152>>2];g[b+152>>2]=e;B=f*(j*A-z*(F*j*h+(E*j*C+z*j*A)))+ +g[b+156>>2];g[b+156>>2]=B;j=f*(j*h-F*(F*j*h+(E*j*C+z*j*A)))+ +g[b+160>>2];g[b+160>>2]=j;f=B}else f=h;h=e-k;f=f-m;e=j-n;if(!(h*h+f*f+e*e>1.1920928955078125e-07)){x=26;break}F=1.0/+D(+(h*h+f*f+e*e));if(+g[b+84>>2]*h*F+f*F*+g[b+88>>2]+e*F*+g[b+92>>2]<=0.0){x=26;break}}else{c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(o>.009999999776482582)){x=29;break}}if((x|0)==26){l=y;return}else if((x|0)==29){l=y;return}}function id(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+80|0;a[x+16>>0]=1;c[x+12>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;a[x+36>>0]=1;c[x+32>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;a[x+56>>0]=1;c[x+52>>2]=0;c[x+44>>2]=0;c[x+48>>2]=0;a[x+76>>0]=1;c[x+72>>2]=0;c[x+64>>2]=0;c[x+68>>2]=0;e=c[b+8>>2]|0;if((e|0)<=0){kj(x);l=x;return}f=0;o=0;i=0;h=0;n=0;while(1){r=c[(c[(c[b+16>>2]|0)+(f<<2)>>2]|0)+192>>2]|0;q=((r+~(r<<15)|0)>>>10^r+~(r<<15))*9|0;q=((q>>>6^q)+~((q>>>6^q)<<11)|0)>>>16^(q>>>6^q)+~((q>>>6^q)<<11);g=q&o+-1;k=g>>>0>>0;a:do if(k){i=c[h+(g<<2)>>2]|0;if((i|0)!=-1){m=c[x+72>>2]|0;while(1){if((r|0)==(c[m+(i<<3)>>2]|0)){p=9;break}j=c[n+(i<<2)>>2]|0;if((j|0)==-1)break;else i=j}if((p|0)==9?(p=0,(c[x+52>>2]|0)+(i<<2)|0):0){i=o;g=n;break}if(!k){p=16;break}}e=c[h+(g<<2)>>2]|0;if((e|0)!=-1){i=c[x+72>>2]|0;while(1){if((r|0)==(c[i+(e<<3)>>2]|0))break;e=c[n+(e<<2)>>2]|0;if((e|0)==-1){p=16;break a}}c[(c[x+52>>2]|0)+(e<<2)>>2]=r;e=o;g=n;p=74}else p=16}else p=16;while(0);if((p|0)==16){p=0;n=c[x+44>>2]|0;if((n|0)==(o|0)){e=o|0?o<<1:1;if((o|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((e<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;if((o|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[x+52>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0))}h=c[x+52>>2]|0;if(h|0){if(a[x+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[x+52>>2]=0}a[x+56>>0]=1;c[x+52>>2]=i;c[x+48>>2]=e;h=o}else{h=o;e=o}}else{h=n;e=o}c[(c[x+52>>2]|0)+(h<<2)>>2]=r;c[x+44>>2]=h+1;h=c[x+64>>2]|0;if((h|0)==(c[x+68>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if((s|0)!=0?(c[6995]=(c[6995]|0)+1,t=sc((s<<3|3)+16|0)|0,(t|0)!=0):0){c[(t+4+15&-16)+-4>>2]=t;i=t+4+15&-16}else i=0;if((h|0)>0){e=0;do{j=(c[x+72>>2]|0)+(e<<3)|0;k=c[j+4>>2]|0;m=i+(e<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;e=e+1|0}while((e|0)!=(h|0))}e=c[x+72>>2]|0;if(e|0){if(a[x+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[x+72>>2]=0}a[x+76>>0]=1;c[x+72>>2]=i;c[x+68>>2]=s;h=c[x+64>>2]|0;e=c[x+48>>2]|0}m=(c[x+72>>2]|0)+(h<<3)|0;c[m>>2]=r;c[m+4>>2]=0;c[x+64>>2]=h+1;if((o|0)<(e|0)){m=c[x+4>>2]|0;do if((m|0)<(e|0)){if((c[x+8>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((e<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;g=u+4+15&-16}else g=0;i=c[x+12>>2]|0;if((m|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(a[x+16>>0]|0)p=51}else if(!((i|0)==0|(a[x+16>>0]|0)==0))p=51;if((p|0)==51){p=0;c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+16>>0]=1;c[x+12>>2]=g;c[x+8>>2]=e}else g=c[x+12>>2]|0;k=e<<2;Yk(g+(m<<2)|0,0,k-(m<<2)|0)|0;c[x+4>>2]=e;j=c[x+24>>2]|0;if((j|0)<(e|0)){if((c[x+28>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((k|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;g=v+4+15&-16}else g=0;i=c[x+32>>2]|0;if((j|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(j|0));if(a[x+36>>0]|0)p=63}else if(!((i|0)==0|(a[x+36>>0]|0)==0))p=63;if((p|0)==63){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+36>>0]=1;c[x+32>>2]=g;c[x+28>>2]=e}else g=c[x+32>>2]|0;Yk(g+(j<<2)|0,0,k-(j<<2)|0)|0}c[x+24>>2]=e;if((e|0)>0){Yk(c[x+12>>2]|0,-1,k|0)|0;Yk(c[x+32>>2]|0,-1,k|0)|0}if((m|0)<=0){e=c[x+48>>2]|0;break}h=c[x+72>>2]|0;i=c[x+12>>2]|0;j=c[x+32>>2]|0;e=c[x+48>>2]|0;g=0;do{p=c[h+(g<<3)>>2]|0;p=((p+~(p<<15)|0)>>>10^p+~(p<<15))*9|0;p=i+(((((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11))&e+-1)<<2)|0;c[j+(g<<2)>>2]=c[p>>2];c[p>>2]=g;g=g+1|0}while((g|0)!=(m|0))}while(0);g=q&e+-1}h=c[x+12>>2]|0;p=h+(g<<2)|0;g=c[x+32>>2]|0;c[g+(n<<2)>>2]=c[p>>2];c[p>>2]=n;p=74}if((p|0)==74){p=0;Ob[c[(c[r>>2]|0)+60>>2]&127](r,d);i=e;e=c[b+8>>2]|0}f=f+1|0;if((f|0)>=(e|0))break;o=i;i=c[x+4>>2]|0;n=g}if((e|0)>0)g=0;else{kj(x);l=x;return}do{f=c[(c[b+16>>2]|0)+(g<<2)>>2]|0;switch(c[f+252>>2]|0){case 64:case 1:{Ob[c[(c[f>>2]|0)+24>>2]&127](f,d);e=c[b+8>>2]|0;break}default:{}}g=g+1|0}while((g|0)<(e|0));kj(x);l=x;return}function jd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;A=+g[b+48>>2];i=+g[d>>2];B=+g[b+64>>2];j=+g[d+4>>2];H=+g[b+80>>2];p=+g[d+8>>2];s=+g[b+52>>2];r=+g[b+68>>2];q=+g[b+84>>2];w=+g[b+56>>2];G=+g[b+72>>2];x=+g[b+88>>2];v=+g[d+16>>2];u=+g[d+20>>2];t=+g[d+24>>2];F=+g[d+32>>2];C=+g[d+36>>2];E=+g[d+40>>2];k=+g[b+96>>2];h=+g[b+100>>2];z=+g[b+104>>2];y=+g[d+48>>2]+(i*k+j*h+p*z);f=v*k+u*h+t*z+ +g[d+52>>2];z=F*k+C*h+E*z+ +g[d+56>>2];g[b+1064>>2]=A*i+B*j+H*p;g[b+1068>>2]=i*s+j*r+p*q;g[b+1072>>2]=i*w+j*G+p*x;g[b+1076>>2]=0.0;g[b+1080>>2]=A*v+B*u+H*t;g[b+1084>>2]=s*v+r*u+q*t;g[b+1088>>2]=w*v+G*u+x*t;g[b+1092>>2]=0.0;g[b+1096>>2]=A*F+B*C+H*E;g[b+1100>>2]=s*F+r*C+q*E;g[b+1104>>2]=w*F+G*C+x*E;g[b+1108>>2]=0.0;g[b+1112>>2]=y;g[b+1116>>2]=f;g[b+1120>>2]=z;g[b+1124>>2]=0.0;z=+g[b+112>>2];f=+g[e>>2];y=+g[b+128>>2];E=+g[e+4>>2];x=+g[b+144>>2];C=+g[e+8>>2];G=+g[b+116>>2];F=+g[b+132>>2];w=+g[b+148>>2];q=+g[b+120>>2];r=+g[b+136>>2];s=+g[b+152>>2];H=+g[e+16>>2];B=+g[e+20>>2];A=+g[e+24>>2];t=+g[e+32>>2];u=+g[e+36>>2];v=+g[e+40>>2];p=+g[b+160>>2];j=+g[b+164>>2];i=+g[b+168>>2];h=+g[e+48>>2]+(f*p+E*j+C*i);k=H*p+B*j+A*i+ +g[e+52>>2];i=t*p+u*j+v*i+ +g[e+56>>2];g[b+1128>>2]=z*f+y*E+x*C;g[b+1132>>2]=f*G+E*F+C*w;g[b+1136>>2]=f*q+E*r+C*s;g[b+1140>>2]=0.0;g[b+1144>>2]=z*H+y*B+x*A;g[b+1148>>2]=G*H+F*B+w*A;g[b+1152>>2]=q*H+r*B+s*A;g[b+1156>>2]=0.0;g[b+1160>>2]=z*t+y*u+x*v;g[b+1164>>2]=G*t+F*u+w*v;g[b+1168>>2]=q*t+r*u+s*v;g[b+1172>>2]=0.0;g[b+1176>>2]=h;g[b+1180>>2]=k;g[b+1184>>2]=i;g[b+1188>>2]=0.0;h=h-+g[b+1112>>2];k=k-+g[b+1116>>2];i=i-+g[b+1120>>2];w=+g[b+1084>>2];F=+g[b+1104>>2];G=+g[b+1088>>2];x=+g[b+1100>>2];y=+g[b+1096>>2];z=+g[b+1080>>2];A=+g[b+1064>>2];B=+g[b+1068>>2];H=+g[b+1072>>2];C=1.0/((w*F-G*x)*A+B*(G*y-F*z)+(x*z-w*y)*H);E=(x*z-w*y)*C;f=i*(G*B-w*H)*C+(h*(w*F-G*x)*C+k*(x*H-F*B)*C);j=i*(z*H-G*A)*C+(h*(G*y-F*z)*C+k*(F*A-y*H)*C);k=i*(w*A-z*B)*C+(h*E+k*(y*B-x*A)*C);g[b+1256>>2]=f;g[b+1260>>2]=j;g[b+1264>>2]=k;g[b+1268>>2]=0.0;g[b+840>>2]=f;h=+g[b+680>>2];i=+g[b+696>>2];do if(!(h>i)){if(h>f){c[b+856>>2]=2;f=f-h;break}if(i>2]=1;f=f-i;break}else{c[b+856>>2]=0;f=0.0;break}}else{c[b+856>>2]=0;f=0.0}while(0);g[b+824>>2]=f;g[b+844>>2]=j;f=+g[b+684>>2];h=+g[b+700>>2];do if(!(f>h)){if(f>j){c[b+860>>2]=2;f=j-f;break}if(h>2]=1;f=j-h;break}else{c[b+860>>2]=0;f=0.0;break}}else{c[b+860>>2]=0;f=0.0}while(0);g[b+828>>2]=f;g[b+848>>2]=k;f=+g[b+688>>2];h=+g[b+704>>2];do if(!(f>h)){if(f>k){c[b+864>>2]=2;f=k-f;break}if(h>2]=1;f=k-h;break}else{c[b+864>>2]=0;f=0.0;break}}else{c[b+864>>2]=0;f=0.0}while(0);g[b+832>>2]=f;n=+g[b+1128>>2];o=+g[b+1144>>2];p=+g[b+1160>>2];h=+g[b+1132>>2];i=+g[b+1148>>2];j=+g[b+1164>>2];k=(w*F-G*x)*C*h+(x*H-F*B)*C*i+(G*B-w*H)*C*j;l=h*(G*y-F*z)*C+(F*A-y*H)*C*i+(z*H-G*A)*C*j;m=p*(w*A-z*B)*C+(n*E+o*(y*B-x*A)*C);f=E*+g[b+1136>>2]+(y*B-x*A)*C*+g[b+1152>>2]+(w*A-z*B)*C*(q*t+r*u+s*v);do if(m<1.0)if(m>-1.0){g[b+1192>>2]=+L(+-(h*E+(y*B-x*A)*C*i+(w*A-z*B)*C*j),+f);f=m<-1.0?-1.0:m;g[b+1196>>2]=+J(+(f>1.0?1.0:f));f=+L(+-(p*(z*H-G*A)*C+(n*(G*y-F*z)*C+o*(F*A-y*H)*C)),+(p*(G*B-w*H)*C+(n*(w*F-G*x)*C+o*(x*H-F*B)*C)));break}else{g[b+1192>>2]=-+L(+k,+l);g[b+1196>>2]=-1.5707963705062866;f=0.0;break}else{g[b+1192>>2]=+L(+k,+l);g[b+1196>>2]=1.5707963705062866;f=0.0}while(0);g[b+1200>>2]=f;g[b+1236>>2]=0.0;x=F*(n*F-p*H)-G*(o*H-n*G);y=H*(o*H-n*G)-F*(p*G-o*F);z=G*(p*G-o*F)-H*(n*F-p*H);g[b+1220>>2]=0.0;B=o*(o*H-n*G)-p*(n*F-p*H);C=p*(p*G-o*F)-n*(o*H-n*G);E=n*(n*F-p*H)-o*(p*G-o*F);g[b+1252>>2]=0.0;A=1.0/+D(+(x*x+y*y+z*z));g[b+1208>>2]=x*A;g[b+1212>>2]=y*A;g[b+1216>>2]=z*A;A=1.0/+D(+((p*G-o*F)*(p*G-o*F)+(n*F-p*H)*(n*F-p*H)+(o*H-n*G)*(o*H-n*G)));g[b+1224>>2]=(p*G-o*F)*A;g[b+1228>>2]=(n*F-p*H)*A;g[b+1232>>2]=(o*H-n*G)*A;H=1.0/+D(+(B*B+C*C+E*E));g[b+1240>>2]=B*H;g[b+1244>>2]=C*H;g[b+1248>>2]=E*H;if(!(a[b+1301>>0]|0))return;G=+g[(c[b+28>>2]|0)+404>>2];H=+g[(c[b+32>>2]|0)+404>>2];a[b+1280>>0]=(G<1.1920928955078125e-07|H<1.1920928955078125e-07)&1;H=G+H>0.0?H/(G+H):.5;g[b+1272>>2]=H;g[b+1276>>2]=1.0-H;return}function kd(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;E=l;l=l+480|0;e=c[b+332>>2]|0;if((c[b+324>>2]|0)>0){f=0;do{v=c[b+24>>2]|0;Ob[c[(c[v>>2]|0)+16>>2]&127](v,c[e+(f<<2)>>2]|0);f=f+1|0;e=c[b+332>>2]|0}while((f|0)<(c[b+324>>2]|0))}if(e|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;q=c[b+248>>2]|0;if((q|0)<=0){l=E;return}r=c[b+256>>2]|0;s=E+416+48|0;t=E+256+28|0;u=E+312+48|0;o=0;do{v=c[r+(o<<2)>>2]|0;g[v+268>>2]=1.0;switch(c[v+220>>2]|0){case 2:case 5:break;default:if(((((c[v+204>>2]&3|0)==0?(Af(v+4|0,+g[v+372>>2],+g[v+376>>2],+g[v+380>>2],v+388|0,d,E+416|0),y=+g[s>>2],z=y-+g[v+52>>2],A=+g[E+416+52>>2],B=A-+g[v+56>>2],C=+g[E+416+56>>2],D=C-+g[v+60>>2],a[b+44>>0]|0):0)?(n=+g[v+276>>2],n*n!=0.0?n*n>2]|0)+4>>2]|0)<20:0)?(c[5787]=(c[5787]|0)+1,i=c[b+68>>2]|0,i=xb[c[(c[i>>2]|0)+36>>2]&127](i)|0,p=c[b+24>>2]|0,g[E+312+4>>2]=1.0,c[E+312+16>>2]=c[v+52>>2],c[E+312+16+4>>2]=c[v+52+4>>2],c[E+312+16+8>>2]=c[v+52+8>>2],c[E+312+16+12>>2]=c[v+52+12>>2],c[E+312+32>>2]=c[s>>2],c[E+312+32+4>>2]=c[s+4>>2],c[E+312+32+8>>2]=c[s+8>>2],c[E+312+32+12>>2]=c[s+12>>2],c[E+312+80>>2]=0,c[E+312>>2]=4556,c[E+312+84>>2]=v,c[E+312+92>>2]=i,c[E+312+96>>2]=p,p=c[v+272>>2]|0,c[E+256+8>>2]=0,c[E+256+12>>2]=-1,c[E+256>>2]=7020,c[E+256+4>>2]=8,c[E+256+16>>2]=1065353216,c[E+256+20>>2]=1065353216,c[E+256+24>>2]=1065353216,c[t>>2]=0,c[t+4>>2]=0,c[t+8>>2]=0,c[t+12>>2]=0,c[t+16>>2]=0,c[E+256+32>>2]=p,c[E+256+48>>2]=p,g[E+256+52>>2]=0.0,c[E+312+88>>2]=c[b+56>>2],p=c[v+188>>2]|0,c[E+312+8>>2]=c[p+4>>2],c[E+312+12>>2]=c[p+8>>2],c[E+192+48>>2]=c[s>>2],c[E+192+48+4>>2]=c[s+4>>2],c[E+192+48+8>>2]=c[s+8>>2],c[E+192+48+12>>2]=c[s+12>>2],c[E+192>>2]=c[v+4>>2],c[E+192+4>>2]=c[v+4+4>>2],c[E+192+8>>2]=c[v+4+8>>2],c[E+192+12>>2]=c[v+4+12>>2],c[E+192+16>>2]=c[v+20>>2],c[E+192+16+4>>2]=c[v+20+4>>2],c[E+192+16+8>>2]=c[v+20+8>>2],c[E+192+16+12>>2]=c[v+20+12>>2],c[E+192+32>>2]=c[v+36>>2],c[E+192+32+4>>2]=c[v+36+4>>2],c[E+192+32+8>>2]=c[v+36+8>>2],c[E+192+32+12>>2]=c[v+36+12>>2],Ud(b,E+256|0,v+4|0,E+192|0,E+312|0,0.0),w=+g[E+312+4>>2],w<1.0):0){h=w*(y-+g[v+52>>2]);j=w*(A-+g[v+56>>2]);m=w*(C-+g[v+60>>2]);n=-(j*+g[E+312+52>>2])-h*+g[u>>2]-m*+g[E+312+56>>2];p=c[b+24>>2]|0;p=Bb[c[(c[p>>2]|0)+12>>2]&63](p,v,c[E+312+80>>2]|0)|0;f=c[b+324>>2]|0;if((f|0)==(c[b+328>>2]|0)?(x=f|0?f<<1:1,(f|0)<(x|0)):0){if(!x)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((x<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+324>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+332>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+332>>2]|0;if(i){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+324>>2]|0}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=e;c[b+328>>2]=x;e=f}else e=f;c[(c[b+332>>2]|0)+(e<<2)>>2]=p;c[b+324>>2]=e+1;k=h+ +g[v+52>>2];j=j+ +g[v+56>>2];h=m+ +g[v+60>>2];e=c[E+312+80>>2]|0;P=+g[e+4>>2];O=+g[e+20>>2];N=+g[e+36>>2];M=+g[e+8>>2];L=+g[e+24>>2];K=+g[e+40>>2];J=+g[e+12>>2];H=+g[e+28>>2];F=+g[e+44>>2];I=-+g[e+52>>2];G=-+g[e+56>>2];m=-+g[e+60>>2];c[E>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;c[E+12>>2]=0;g[E+16>>2]=k*P+j*O+h*N+(P*I+O*G+N*m);g[E+20>>2]=k*M+j*L+h*K+(M*I+L*G+K*m);g[E+24>>2]=k*J+j*H+h*F+(J*I+H*G+F*m);g[E+28>>2]=0.0;c[E+64>>2]=c[u>>2];c[E+64+4>>2]=c[u+4>>2];c[E+64+8>>2]=c[u+8>>2];c[E+64+12>>2]=c[u+12>>2];g[E+80>>2]=n;c[E+84>>2]=0;c[E+84+4>>2]=0;c[E+84+8>>2]=0;c[E+84+12>>2]=0;e=E+116|0;f=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));i=kf(p,E)|0;g[p+4+(i*192|0)+96>>2]=0.0;P=+g[v+228>>2]*+g[(c[E+312+80>>2]|0)+228>>2];P=P<-10.0?-10.0:P;g[p+4+(i*192|0)+84>>2]=P>10.0?10.0:P;c[p+4+(i*192|0)+48>>2]=c[v+52>>2];c[p+4+(i*192|0)+48+4>>2]=c[v+52+4>>2];c[p+4+(i*192|0)+48+8>>2]=c[v+52+8>>2];c[p+4+(i*192|0)+48+12>>2]=c[v+52+12>>2];g[p+4+(i*192|0)+32>>2]=k;g[p+4+(i*192|0)+36>>2]=j;g[p+4+(i*192|0)+40>>2]=h;g[p+4+(i*192|0)+44>>2]=0.0}}o=o+1|0}while((o|0)<(q|0));l=E;return}function ld(a,d,f,h,i,j,k,l){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0;v=+g[a+8>>2];x=+g[a+12>>2];A=+g[a+16>>2];w=+g[a+40>>2];p=(+g[d>>2]-v)*w;y=+g[a+44>>2];s=(+g[d+4>>2]-x)*y;B=+g[a+48>>2];u=(+g[d+8>>2]-A)*B;if(!(p<=0.0)){t=b[a+6>>1]|0;t=(!(p>=+(t&65535))?~~p&65535:t)&b[a+4>>1]}else t=0;if(!(s<=0.0)){r=b[a+6>>1]|0;r=(!(s>=+(r&65535))?~~s&65535:r)&b[a+4>>1]}else r=0;if(!(u<=0.0)){q=b[a+6>>1]|0;q=(!(u>=+(q&65535))?~~u&65535:q)&b[a+4>>1]}else q=0;u=(+g[f>>2]-v)*w;s=(+g[f+4>>2]-x)*y;p=(+g[f+8>>2]-A)*B;if(!(u<=0.0)){o=b[a+6>>1]|0;o=(!(u>=+(o&65535))?~~u&65535:o)&b[a+4>>1]|1}else o=1;if(!(s<=0.0)){n=b[a+6>>1]|0;n=(!(s>=+(n&65535))?~~s&65535:n)&b[a+4>>1]|1}else n=1;if(!(p<=0.0)){m=b[a+6>>1]|0;m=(!(p>=+(m&65535))?~~p&65535:m)&b[a+4>>1]|1}else m=1;D=b[a+64>>1]|0;C=c[a+60>>2]|0;b[a+64>>1]=b[C+((D&65535)<<6)+48>>1]|0;z=(b[a+56>>1]|0)+1<<16>>16;b[a+56>>1]=z;c[C+((D&65535)<<6)+12>>2]=D&65535;c[C+((D&65535)<<6)>>2]=i;c[C+((D&65535)<<6)+4>>2]=j;c[C+((D&65535)<<6)+8>>2]=k;E=(z&65535)<<1&65534;b[C+54>>1]=(e[C+54>>1]|0)+2;F=c[a+68>>2]|0;G=e[F+(E+-1<<2)>>1]|e[F+(E+-1<<2)+2>>1]<<16;b[F+((E|1)<<2)>>1]=G;b[F+((E|1)<<2)+2>>1]=G>>>16;F=c[a+68>>2]|0;b[F+(E+-1<<2)>>1]=t;b[F+(E+-1<<2)+2>>1]=D;b[F+(E<<2)>>1]=o;b[F+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+48>>1]=E+-1;b[C+((D&65535)<<6)+54>>1]=(z&65535)<<1;o=(c[a+60>>2]|0)+56|0;b[o>>1]=(e[o>>1]|0)+2;o=c[a+72>>2]|0;t=e[o+(E+-1<<2)>>1]|e[o+(E+-1<<2)+2>>1]<<16;b[o+((E|1)<<2)>>1]=t;b[o+((E|1)<<2)+2>>1]=t>>>16;o=c[a+72>>2]|0;b[o+(E+-1<<2)>>1]=r;b[o+(E+-1<<2)+2>>1]=D;b[o+(E<<2)>>1]=n;b[o+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+50>>1]=E+-1;b[C+((D&65535)<<6)+56>>1]=(z&65535)<<1;n=(c[a+60>>2]|0)+58|0;b[n>>1]=(e[n>>1]|0)+2;n=c[a+76>>2]|0;o=e[n+(E+-1<<2)>>1]|e[n+(E+-1<<2)+2>>1]<<16;b[n+((E|1)<<2)>>1]=o;b[n+((E|1)<<2)+2>>1]=o>>>16;n=c[a+76>>2]|0;b[n+(E+-1<<2)>>1]=q;b[n+(E+-1<<2)+2>>1]=D;b[n+(E<<2)>>1]=m;b[n+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+52>>1]=E+-1;b[C+((D&65535)<<6)+58>>1]=(z&65535)<<1;n=c[a+68>>2]|0;o=e[C+((D&65535)<<6)+48>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+48|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+48|0:n+(G<<6)+54|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+68>>2]|0}m=e[C+((D&65535)<<6)+54>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;a:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+54|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+48|0:o+(G<<6)+54|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break a;q=o;o=c[a+60>>2]|0}}while(0);n=c[a+72>>2]|0;o=e[C+((D&65535)<<6)+50>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+50|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+50|0:n+(G<<6)+56|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+72>>2]|0}m=e[C+((D&65535)<<6)+56>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;b:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+56|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+50|0:o+(G<<6)+56|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break b;q=o;o=c[a+60>>2]|0}}while(0);xh(a,2,b[C+((D&65535)<<6)+52>>1]|0);sh(a,2,b[C+((D&65535)<<6)+58>>1]|0,l);n=c[a+60>>2]|0;m=c[a+108>>2]|0;if(!m){G=n+((D&65535)<<6)|0;return G|0}c[n+((D&65535)<<6)+60>>2]=Fb[c[(c[m>>2]|0)+8>>2]&3](m,d,f,h,i,j,k,l)|0;G=n+((D&65535)<<6)|0;return G|0}function md(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+32|0;ng(b+4|0,((P(c[b+112>>2]|0,c[b+16>>2]|0)|0)/100|0)+1|0);if(c[b+124>>2]|0){o=((P(c[b+108>>2]|0,c[b+56>>2]|0)|0)/100|0)+1|0;ng(b+44|0,o);o=(c[b+124>>2]|0)-o|0;c[b+124>>2]=(o|0)>0?o:0}f=((c[b+104>>2]|0)+1|0)%2|0;c[b+104>>2]=f;f=c[b+84+(f<<2)>>2]|0;if(f|0){do{h=f+56|0;k=f;f=c[h>>2]|0;i=c[k+52>>2]|0;c[((i|0)==0?b+84+(c[k+60>>2]<<2)|0:i+56|0)>>2]=f;i=c[h>>2]|0;if(i|0)c[i+52>>2]=c[k+52>>2];c[k+52>>2]=0;c[h>>2]=c[b+92>>2];h=c[b+92>>2]|0;if(h|0)c[h+52>>2]=k;c[b+92>>2]=k;h=c[k+48>>2]|0;Ag(b+4|0,h)|0;i=c[b+8>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+8>>2]=h;c[b+16>>2]=(c[b+16>>2]|0)+-1;c[q>>2]=c[k+16>>2];c[q+4>>2]=c[k+16+4>>2];c[q+8>>2]=c[k+16+8>>2];c[q+12>>2]=c[k+16+12>>2];c[q+16>>2]=c[k+32>>2];c[q+16+4>>2]=c[k+32+4>>2];c[q+16+8>>2]=c[k+32+8>>2];c[q+16+12>>2]=c[k+32+12>>2];h=c[b+48>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+48>>2]=0;c[h+32>>2]=0;c[h+36>>2]=k;c[h+40>>2]=0;c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[h+16>>2]=c[q+16>>2];c[h+20>>2]=c[q+20>>2];c[h+24>>2]=c[q+24>>2];c[h+28>>2]=c[q+28>>2];Pe(b+44|0,c[b+44>>2]|0,h);i=(c[b+56>>2]|0)+1|0;c[b+56>>2]=i;c[k+48>>2]=h;c[k+60>>2]=2}while((f|0)!=0);c[b+124>>2]=i;a[b+154>>0]=1}c[q>>2]=9248;c[q+4>>2]=b;if(a[b+153>>0]|0?(ne(b+4|0,c[b+4>>2]|0,c[b+44>>2]|0,q),a[b+153>>0]|0):0){o=c[b+4>>2]|0;ne(b+4|0,o,o,q)}if(a[b+154>>0]|0?(m=c[b+96>>2]|0,m=xb[c[(c[m>>2]|0)+28>>2]&127](m)|0,e=c[m+4>>2]|0,(e|0)>0):0){f=(P(c[b+116>>2]|0,e)|0)/100|0;o=c[b+120>>2]|0;f=(o|0)>(f|0)?o:f;f=(e|0)<(f|0)?e:f;if((f|0)>0){h=0;do{j=((c[b+144>>2]|0)+h|0)%(e|0)|0;n=c[m+12>>2]|0;i=c[n+(j<<4)>>2]|0;j=c[n+(j<<4)+4>>2]|0;n=c[i+48>>2]|0;o=c[j+48>>2]|0;if(!(((((+g[n>>2]<=+g[o+16>>2]?+g[n+16>>2]>=+g[o>>2]:0)?+g[n+4>>2]<=+g[o+20>>2]:0)?+g[n+20>>2]>=+g[o+4>>2]:0)?+g[n+8>>2]<=+g[o+24>>2]:0)?+g[n+24>>2]>=+g[o+8>>2]:0)){e=c[b+96>>2]|0;Cb[c[(c[e>>2]|0)+12>>2]&31](e,i,j,d)|0;f=f+-1|0;h=h+-1|0;e=c[m+4>>2]|0}h=h+1|0}while((h|0)<(f|0));if((e|0)>0)p=34;else e=0}else p=34;if((p|0)==34)e=((c[b+144>>2]|0)+f|0)%(e|0)|0;c[b+144>>2]=e}c[b+140>>2]=(c[b+140>>2]|0)+1;c[b+120>>2]=1;a[b+154>>0]=0;o=c[b+128>>2]|0;n=c[b+132>>2]|0;g[b+136>>2]=(o|0)==0?0.0:+(n>>>0)/+(o>>>0);c[b+132>>2]=n>>>1;c[b+128>>2]=o>>>1;o=c[b+96>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0)){l=q;return}o=c[b+96>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;e=c[o+4>>2]|0;if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}if((e|0)>0){m=0;k=0;n=0;f=0;while(1){i=c[o+12>>2]|0;h=i+(m<<4)|0;r=n;n=c[h>>2]|0;i=i+(m<<4)+4|0;j=c[i>>2]|0;if(!((n|0)==(r|0)&(j|0)==(f|0))){f=c[n+48>>2]|0;r=c[j+48>>2]|0;if(((((+g[f>>2]<=+g[r+16>>2]?+g[f+16>>2]>=+g[r>>2]:0)?+g[f+4>>2]<=+g[r+20>>2]:0)?+g[f+20>>2]>=+g[r+4>>2]:0)?+g[f+8>>2]<=+g[r+24>>2]:0)?+g[f+24>>2]>=+g[r+8>>2]:0){h=k;f=j}else{f=j;p=48}}else p=48;if((p|0)==48){p=0;e=c[b+96>>2]|0;Sb[c[(c[e>>2]|0)+32>>2]&127](e,h,d);c[h>>2]=0;c[i>>2]=0;h=k+1|0;e=c[o+4>>2]|0}m=m+1|0;if((m|0)>=(e|0))break;else k=h}if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}j=e-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(j|0)){if(!j){f=0;i=e}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{r=c[o+12>>2]|0;c[f+(h<<4)>>2]=c[r+(h<<4)>>2];c[f+(h<<4)+4>>2]=c[r+(h<<4)+4>>2];c[f+(h<<4)+8>>2]=c[r+(h<<4)+8>>2];c[f+(h<<4)+12>>2]=c[r+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=f;c[o+8>>2]=j}do{r=(c[o+12>>2]|0)+(e<<4)|0;e=e+1|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0}while((e|0)!=(j|0));e=j}else e=j}c[o+4>>2]=e;l=q;return}function nd(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;r=c[b+28>>2]|0;k=c[b+32>>2]|0;xc(b,r+4|0,k+4|0,r+324|0,k+324|0);j=c[d+8>>2]|0;g[j>>2]=1.0;l=c[d+24>>2]|0;g[j+(l+1<<2)>>2]=1.0;g[j+((l<<1)+2<<2)>>2]=1.0;n=+g[b+348>>2];v=+g[b+352>>2];p=+g[b+356>>2];t=+g[r+4>>2]*n+ +g[r+8>>2]*v+ +g[r+12>>2]*p;o=n*+g[r+20>>2]+v*+g[r+24>>2]+p*+g[r+28>>2];p=n*+g[r+36>>2]+v*+g[r+40>>2]+p*+g[r+44>>2];j=c[d+12>>2]|0;c[j>>2]=0;g[j+4>>2]=p;g[j+8>>2]=-o;g[j+12>>2]=0.0;g[j+(l<<2)>>2]=-p;c[j+(l<<2)+4>>2]=0;g[j+(l<<2)+8>>2]=t;g[j+(l<<2)+12>>2]=0.0;g[j+(l<<1<<2)>>2]=o;g[j+(l<<1<<2)+4>>2]=-t;c[j+(l<<1<<2)+8>>2]=0;g[j+(l<<1<<2)+12>>2]=0.0;j=c[d+16>>2]|0;g[j>>2]=-1.0;g[j+(l+1<<2)>>2]=-1.0;g[j+((l<<1)+2<<2)>>2]=-1.0;v=+g[b+412>>2];n=+g[b+416>>2];m=+g[b+420>>2];u=+g[k+4>>2]*v+ +g[k+8>>2]*n+ +g[k+12>>2]*m;f=v*+g[k+20>>2]+n*+g[k+24>>2]+m*+g[k+28>>2];m=v*+g[k+36>>2]+n*+g[k+40>>2]+m*+g[k+44>>2];l=c[d+20>>2]|0;j=c[d+24>>2]|0;c[l>>2]=0;g[l+4>>2]=-m;g[l+8>>2]=f;g[l+12>>2]=0.0;g[l+(j<<2)>>2]=m;c[l+(j<<2)+4>>2]=0;g[l+(j<<2)+8>>2]=-u;g[l+(j<<2)+12>>2]=0.0;g[l+(j<<1<<2)>>2]=-f;g[l+(j<<1<<2)+4>>2]=u;c[l+(j<<1<<2)+8>>2]=0;g[l+(j<<1<<2)+12>>2]=0.0;q=c[b+592>>2]|0;n=+g[(q&2|0?b+600|0:d+4|0)>>2]*+g[d>>2];i=c[d+28>>2]|0;s=c[d+36>>2]|0;h=c[d+40>>2]|0;g[i>>2]=n*(u+ +g[k+52>>2]-t-+g[r+52>>2]);g[s>>2]=-3402823466385288598117041.0e14;g[h>>2]=3402823466385288598117041.0e14;if(!(q&1)){g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14}else{w=c[d+32>>2]|0;c[w>>2]=c[b+596>>2];g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<2)>>2]=c[b+596>>2];g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<1<<2)>>2]=c[b+596>>2]}if(!(a[b+526>>0]|0)){l=j*3|0;j=s}else{k=c[d+12>>2]|0;v=+g[b+456>>2];if(+g[b+444>>2]>2]>2];y=+g[r+8>>2];x=+g[r+12>>2];D=+g[b+304>>2];C=+g[b+320>>2];B=+g[b+336>>2];o=+g[b+308>>2];t=+g[b+324>>2];v=+g[b+340>>2];f=+g[r+20>>2];m=+g[r+24>>2];n=+g[r+28>>2];p=+g[r+36>>2];u=+g[r+40>>2];e=+g[r+44>>2];g[k+(j*3<<2)>>2]=z*D+y*C+x*B;g[k+((j*3|0)+1<<2)>>2]=D*f+C*m+B*n;g[k+((j*3|0)+2<<2)>>2]=D*p+C*u+B*e;g[k+(j<<2<<2)>>2]=z*o+y*t+x*v;g[k+((j<<2|1)<<2)>>2]=o*f+t*m+v*n;g[k+((j<<2|2)<<2)>>2]=o*p+t*u+v*e;g[l+(j*3<<2)>>2]=-(z*D+y*C+x*B);g[l+((j*3|0)+1<<2)>>2]=-(D*f+C*m+B*n);g[l+((j*3|0)+2<<2)>>2]=-(D*p+C*u+B*e);g[l+(j<<2<<2)>>2]=-(z*o+y*t+x*v);g[l+((j<<2|1)<<2)>>2]=-(o*f+t*m+v*n);g[l+((j<<2|2)<<2)>>2]=-(o*p+t*u+v*e);A=+g[d>>2]*+g[b+436>>2];i=c[d+28>>2]|0;g[i+(j*3<<2)>>2]=A*((z*D+y*C+x*B)*+g[b+460>>2]+(D*f+C*m+B*n)*+g[b+464>>2]+(D*p+C*u+B*e)*+g[b+468>>2]);g[i+(j<<2<<2)>>2]=A*((z*o+y*t+x*v)*+g[b+460>>2]+(o*f+t*m+v*n)*+g[b+464>>2]+(o*p+t*u+v*e)*+g[b+468>>2]);k=c[d+36>>2]|0;g[k+(j*3<<2)>>2]=-3402823466385288598117041.0e14;h=c[d+40>>2]|0;g[h+(j*3<<2)>>2]=3402823466385288598117041.0e14;g[k+(j<<2<<2)>>2]=-3402823466385288598117041.0e14;e=3402823466385288598117041.0e14;l=j<<2;j=c[d+24>>2]|0}else{D=+g[b+436>>2];B=D*+g[b+460>>2]*D;C=D*D*+g[b+464>>2];D=D*D*+g[b+468>>2];g[k+(j*3<<2)>>2]=B;g[k+((j*3|0)+1<<2)>>2]=C;g[k+((j*3|0)+2<<2)>>2]=D;g[l+(j*3<<2)>>2]=-B;g[l+((j*3|0)+1<<2)>>2]=-C;g[l+((j*3|0)+2<<2)>>2]=-D;g[i+(j*3<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+504>>2];if(q&4|0)c[(c[d+32>>2]|0)+(j*3<<2)>>2]=c[b+604>>2];g[s+(j*3<<2)>>2]=0.0;if((a[b+552>>0]|0)!=0?(e=+g[b+572>>2],e>=0.0):0){l=j*3|0;k=s}else{e=3402823466385288598117041.0e14;l=j*3|0;k=s}}g[h+(l<<2)>>2]=e;l=j+l|0;j=k}if(!(a[b+525>>0]|0))return;D=+g[b+436>>2];B=D*+g[b+476>>2]*D;C=D*D*+g[b+480>>2];D=D*D*+g[b+484>>2];q=c[d+12>>2]|0;s=c[d+20>>2]|0;g[q+(l<<2)>>2]=B;r=l+1|0;g[q+(r<<2)>>2]=C;w=l+2|0;g[q+(w<<2)>>2]=D;g[s+(l<<2)>>2]=-B;g[s+(r<<2)>>2]=-C;g[s+(w<<2)>>2]=-D;g[i+(l<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+508>>2];if(c[b+592>>2]&4|0)c[(c[d+32>>2]|0)+(l<<2)>>2]=c[b+604>>2];if(+g[b+452>>2]>0.0){w=+g[b+508>>2]>0.0;e=w?0.0:-3402823466385288598117041.0e14;f=w?3402823466385288598117041.0e14:0.0}else{e=-3402823466385288598117041.0e14;f=3402823466385288598117041.0e14}g[j+(l<<2)>>2]=e;g[h+(l<<2)>>2]=f;return}function od(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0;if((j|0)<2|(k|0)<2){m=0;return m|0}r=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(r>>>0>268435455?18:(r<<4|3)+16|0)|0;if(!b)p=0;else{c[(b+4+15&-16)+-4>>2]=b;p=b+4+15&-16}q=$I(r>>>0>1073741823?-1:r<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{A=+(b|0)/+(k+-1|0);u=+g[e>>2];u=u+A*(+g[h>>2]-u);v=+g[e+4>>2];v=v+A*(+g[h+4>>2]-v);w=+g[e+8>>2];w=w+A*(+g[h+8>>2]-w);x=+g[f>>2];y=+g[f+4>>2];z=+g[f+8>>2];x=x+A*(+g[i>>2]-x)-u;y=y+A*(+g[i+4>>2]-y)-v;z=z+A*(+g[i+8>>2]-z)-w;o=P(b,j)|0;n=0;do{A=+(n|0)/+(j+-1|0);t=n+o|0;g[p+(t<<4)>>2]=u+x*A;g[p+(t<<4)+4>>2]=v+y*A;g[p+(t<<4)+8>>2]=w+z*A;g[p+(t<<4)+12>>2]=0.0;g[q+(t<<2)>>2]=1.0;n=n+1|0}while((n|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,r,p,q);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){t=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){t=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(p|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}aJ(q);if((k|0)<=0){m=b;return m|0}r=b+780|0;d=b+792|0;l=b+800|0;s=b+984|0;i=0;do{p=i;i=i+1|0;a:do if((j|0)>0){t=P(p,j)|0;e=P(i,j)|0;if((i|0)<(k|0))n=0;else{n=0;while(1){o=n;n=n+1|0;if((n|0)<(j|0)){q=n+t|0;e=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;f=c[l>>2]|0;c[f+(h*52|0)+24>>2]=e+((o+t|0)*104|0);c[f+(h*52|0)+28>>2]=e+(q*104|0);y=+g[e+((o+t|0)*104|0)+8>>2]-+g[e+(q*104|0)+8>>2];z=+g[e+((o+t|0)*104|0)+12>>2]-+g[e+(q*104|0)+12>>2];A=+g[e+((o+t|0)*104|0)+16>>2]-+g[e+(q*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}if((n|0)==(j|0))break a}}do{q=n+t|0;o=n;n=n+1|0;do if((n|0)<(j|0)){f=n+t|0;B=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;h=c[l>>2]|0;c[h+(C*52|0)+24>>2]=B+(q*104|0);c[h+(C*52|0)+28>>2]=B+(f*104|0);A=+g[B+(q*104|0)+8>>2]-+g[B+(f*104|0)+8>>2];z=+g[B+(q*104|0)+12>>2]-+g[B+(f*104|0)+12>>2];y=+g[B+(q*104|0)+16>>2]-+g[B+(f*104|0)+16>>2];g[h+(C*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[s>>0]=1;C=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(h*52|0)+24>>2]=C+(q*104|0);c[B+(h*52|0)+28>>2]=C+((o+e|0)*104|0);y=+g[C+(q*104|0)+8>>2]-+g[C+((o+e|0)*104|0)+8>>2];z=+g[C+(q*104|0)+12>>2]-+g[C+((o+e|0)*104|0)+12>>2];A=+g[C+(q*104|0)+16>>2]-+g[C+((o+e|0)*104|0)+16>>2];g[B+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;if(!(o+p&1)){bg(b,o+e|0,q,f,0);bg(b,o+e|0,f,n+e|0,0);if(!m)break;h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(f*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(f*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(f*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(f*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}else{h=n+e|0;bg(b,q,f,h,0);bg(b,q,h,o+e|0,0);if(!m)break;f=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=f+(q*104|0);c[B+(C*52|0)+28>>2]=f+(h*104|0);y=+g[f+(q*104|0)+8>>2]-+g[f+(h*104|0)+8>>2];z=+g[f+(q*104|0)+12>>2]-+g[f+(h*104|0)+12>>2];A=+g[f+(q*104|0)+16>>2]-+g[f+(h*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}}else{h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(q*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(q*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(q*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(q*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}while(0)}while((n|0)!=(j|0))}while(0)}while((i|0)!=(k|0));return b|0}function pd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0;B=l;l=l+272|0;c[B+128>>2]=c[d>>2];c[B+128+4>>2]=c[d+4>>2];c[B+128+8>>2]=c[d+8>>2];c[B+128+12>>2]=c[d+12>>2];c[B+128+16>>2]=c[d+16>>2];c[B+128+16+4>>2]=c[d+16+4>>2];c[B+128+16+8>>2]=c[d+16+8>>2];c[B+128+16+12>>2]=c[d+16+12>>2];c[B+128+32>>2]=c[d+32>>2];c[B+128+32+4>>2]=c[d+32+4>>2];c[B+128+32+8>>2]=c[d+32+8>>2];c[B+128+32+12>>2]=c[d+32+12>>2];c[B+128+48>>2]=c[d+48>>2];c[B+128+48+4>>2]=c[d+48+4>>2];c[B+128+48+8>>2]=c[d+48+8>>2];c[B+128+48+12>>2]=c[d+48+12>>2];c[B+64>>2]=c[e>>2];c[B+64+4>>2]=c[e+4>>2];c[B+64+8>>2]=c[e+8>>2];c[B+64+12>>2]=c[e+12>>2];c[B+64+16>>2]=c[e+16>>2];c[B+64+16+4>>2]=c[e+16+4>>2];c[B+64+16+8>>2]=c[e+16+8>>2];c[B+64+16+12>>2]=c[e+16+12>>2];c[B+64+32>>2]=c[e+32>>2];c[B+64+32+4>>2]=c[e+32+4>>2];c[B+64+32+8>>2]=c[e+32+8>>2];c[B+64+32+12>>2]=c[e+32+12>>2];c[B+64+48>>2]=c[e+48>>2];c[B+64+48+4>>2]=c[e+48+4>>2];c[B+64+48+8>>2]=c[e+48+8>>2];c[B+64+48+12>>2]=c[e+48+12>>2];i=+g[B+64+52>>2]-+g[B+128+52>>2];G=+g[B+64+56>>2]-+g[B+128+56>>2];g[B+16>>2]=+g[B+64+48>>2]-+g[B+128+48>>2];g[B+16+4>>2]=i;g[B+16+8>>2]=G;g[B+16+12>>2]=0.0;If(B+128|0,B+64|0,B+208|0,B+192|0);G=+g[B+192>>2];i=G*+g[B+208+4>>2];D=G*+g[B+208+8>>2];g[B>>2]=+g[B+208>>2]*G;g[B+4>>2]=i;g[B+8>>2]=D;g[B+12>>2]=0.0;c[B+208+48>>2]=0;c[B+208+48+4>>2]=0;c[B+208+48+8>>2]=0;c[B+208+48+12>>2]=0;yh(B+128|0,B+192|0);D=+g[B+192>>2];i=+g[B+192+4>>2];G=+g[B+192+8>>2];E=+g[B+192+12>>2];C=D*(2.0/(D*D+i*i+G*G+E*E));j=i*(2.0/(D*D+i*i+G*G+E*E));F=G*(2.0/(D*D+i*i+G*G+E*E));g[B+208>>2]=1.0-(i*j+G*F);g[B+208+4>>2]=D*j-E*F;g[B+208+8>>2]=D*F+E*j;g[B+208+12>>2]=0.0;g[B+208+16>>2]=D*j+E*F;g[B+208+20>>2]=1.0-(D*C+G*F);g[B+208+24>>2]=i*F-E*C;g[B+208+28>>2]=0.0;g[B+208+32>>2]=D*F-E*j;g[B+208+36>>2]=i*F+E*C;g[B+208+40>>2]=1.0-(D*C+i*j);g[B+208+44>>2]=0.0;kh(b,B+208|0,B+16|0,B,B+48|0,B+32|0);if((c[a+328>>2]|0)<=0){l=B;return}k=0;do{m=c[(c[a+336>>2]|0)+(k<<2)>>2]|0;if(zb[c[(c[f>>2]|0)+8>>2]&31](f,c[m+188>>2]|0)|0?(z=c[m+192>>2]|0,Vb[c[(c[z>>2]|0)+8>>2]&127](z,m+4|0,B+192|0,B+16|0),n=+g[B+192>>2]+ +g[B+48>>2],o=+g[B+192+4>>2]+ +g[B+48+4>>2],p=+g[B+192+8>>2]+ +g[B+48+8>>2],g[B+192>>2]=n,g[B+192+4>>2]=o,g[B+192+8>>2]=p,g[B+192+12>>2]=0.0,q=+g[B+16>>2]+ +g[B+32>>2],r=+g[B+16+4>>2]+ +g[B+32+4>>2],s=+g[B+16+8>>2]+ +g[B+32+8>>2],g[B+16>>2]=q,g[B+16+4>>2]=r,g[B+16+8>>2]=s,g[B+16+12>>2]=0.0,t=+g[d+48>>2]-(q+n)*.5,u=+g[d+52>>2]-(r+o)*.5,v=+g[d+56>>2]-(s+p)*.5,w=+g[e+48>>2]-(q+n)*.5,x=+g[e+52>>2]-(r+o)*.5,y=+g[e+56>>2]-(s+p)*.5,z=t<-((q-n)*.5)|(t>(q-n)*.5?8:0)|(u<-((r-o)*.5)?2:0)|(u>(r-o)*.5?16:0)|(v<-((s-p)*.5)?4:0)|(v>(s-p)*.5?32:0),A=w<-((q-n)*.5)|(w>(q-n)*.5?8:0)|(x<-((r-o)*.5)?2:0)|(x>(r-o)*.5?16:0)|(y<-((s-p)*.5)?4:0)|(y>(s-p)*.5?32:0),(z&A|0)==0):0){if(t<-((q-n)*.5))if(!((-t-(q-n)*.5)/(w-t)>=0.0)){i=0.0;j=1.0}else{i=(-t-(q-n)*.5)/(w-t);j=1.0}else if(w<-((q-n)*.5)?(-t-(q-n)*.5)/(w-t)<1.0:0){i=0.0;j=(-t-(q-n)*.5)/(w-t)}else{i=0.0;j=1.0}if(u<-((r-o)*.5)){if(i<=(-u-(r-o)*.5)/(x-u))i=(-u-(r-o)*.5)/(x-u)}else if(x<-((r-o)*.5)?(-u-(r-o)*.5)/(x-u)(q-n)*.5){if(i<=((q-n)*.5-t)/(w-t))i=((q-n)*.5-t)/(w-t)}else if(w>(q-n)*.5?((q-n)*.5-t)/(w-t)(r-o)*.5){if(i<=((r-o)*.5-u)/(x-u))i=((r-o)*.5-u)/(x-u)}else if(x>(r-o)*.5?((r-o)*.5-u)/(x-u)>2]|0;c[B+208>>2]=0;c[B+208+4>>2]=H;c[B+208+8>>2]=m;c[B+208+12>>2]=m+4;c[B+208+16>>2]=-1;c[B+208+20>>2]=-1;vc(b,B+128|0,B+64|0,B+208|0,f,h)}}k=k+1|0}while((k|0)<(c[a+328>>2]|0));l=B;return}function qd(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;h=c[b+48>>2]|0;r=c[b+28>>2]|0;s=c[b+68>>2]|0;if(c[l+72>>2]&1|0){if((h|0)>0){i=c[b+136>>2]|0;f=0;q=c[b+232>>2]|0;do{m=i+(f<<2)|0;p=c[m>>2]|0;f=f+1|0;q=(P(q,1664525)|0)+1013904223|0;if(f>>>0<65537){e=q>>>16^q;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=q;e=i+(((e>>>0)%(f>>>0)|0)<<2)|0;c[m>>2]=c[e>>2];c[e>>2]=p}while((f|0)!=(h|0));c[b+232>>2]=q}if((c[l+20>>2]|0)>(d|0)){if((r|0)>0){h=c[b+116>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;q=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[q>>2];c[q>>2]=m}while((f|0)!=(r|0));c[b+232>>2]=p}if((s|0)>0){h=c[b+156>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;r=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[r>>2];c[r>>2]=m}while((f|0)!=(s|0));c[b+232>>2]=p}}}e=c[b+48>>2]|0;if((e|0)>0){i=0;n=0.0;do{f=c[(c[b+136>>2]|0)+(i<<2)>>2]|0;h=c[b+56>>2]|0;if((c[h+(f*152|0)+136>>2]|0)>(d|0)){e=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](e+((c[h+(f*152|0)+144>>2]|0)*244|0)|0,e+((c[h+(f*152|0)+148>>2]|0)*244|0)|0,h+(f*152|0)|0);n=n+o*o;e=c[b+48>>2]|0}i=i+1|0}while((i|0)<(e|0))}else n=0.0;if((c[l+20>>2]|0)<=(d|0)){o=n;return +o}if((k|0)>0){e=0;do{f=j+(e<<2)|0;h=c[f>>2]|0;if(a[h+20>>0]|0){r=Rj(b,c[h+28>>2]|0,+g[l+12>>2])|0;d=Rj(b,c[(c[f>>2]|0)+32>>2]|0,+g[l+12>>2])|0;s=c[b+16>>2]|0;q=c[f>>2]|0;Tb[c[(c[q>>2]|0)+24>>2]&15](q,s+(r*244|0)|0,s+(d*244|0)|0,+g[l+12>>2])}e=e+1|0}while((e|0)!=(k|0))}m=c[l+72>>2]|0;p=c[b+28>>2]|0;if(!(m&512)){if((p|0)>0){e=0;do{l=c[(c[b+116>>2]|0)+(e<<2)>>2]|0;u=c[b+36>>2]|0;t=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](t+((c[u+(l*152|0)+144>>2]|0)*244|0)|0,t+((c[u+(l*152|0)+148>>2]|0)*244|0)|0,u+(l*152|0)|0);n=n+o*o;e=e+1|0}while((e|0)!=(p|0))}i=c[b+68>>2]|0;if((i|0)>0){h=0;do{e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;o=+g[(c[b+36>>2]|0)+((c[f+(e*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){o=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-o;g[f+(e*152|0)+124>>2]=o;l=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](l+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,l+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+o*o}h=h+1|0}while((h|0)!=(i|0))}}else if((p|0)>0){i=0;do{h=c[(c[b+116>>2]|0)+(i<<2)>>2]|0;e=c[b+36>>2]|0;f=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](f+((c[e+(h*152|0)+144>>2]|0)*244|0)|0,f+((c[e+(h*152|0)+148>>2]|0)*244|0)|0,e+(h*152|0)|0);n=n+o*o;o=+g[e+(h*152|0)+100>>2];h=P(i,(m>>>4&1)+1|0)|0;e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;if(o>0.0){v=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-v;g[f+(e*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,k+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+v*v}if((c[l+72>>2]&16|0)!=0?(t=c[(c[b+156>>2]|0)+(h+1<<2)>>2]|0,u=c[b+76>>2]|0,o>0.0):0){v=o*+g[u+(t*152|0)+104>>2];g[u+(t*152|0)+120>>2]=-v;g[u+(t*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[u+(t*152|0)+144>>2]|0)*244|0)|0,k+((c[u+(t*152|0)+148>>2]|0)*244|0)|0,u+(t*152|0)|0);n=n+v*v}i=i+1|0}while((i|0)!=(p|0))}h=c[b+88>>2]|0;if((h|0)<=0){v=n;return +v}f=0;do{e=c[b+96>>2]|0;o=+g[(c[b+36>>2]|0)+((c[e+(f*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){v=+g[e+(f*152|0)+104>>2];v=o*v>v?v:o*v;g[e+(f*152|0)+120>>2]=-v;g[e+(f*152|0)+124>>2]=v;l=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](l+((c[e+(f*152|0)+144>>2]|0)*244|0)|0,l+((c[e+(f*152|0)+148>>2]|0)*244|0)|0,e+(f*152|0)|0);n=n+v*v}f=f+1|0}while((f|0)!=(h|0));return +n}function rd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=3356;d=c[b+192>>2]|0;if(d|0)Ib[c[(c[d>>2]|0)+4>>2]&511](d);if((c[b+1112>>2]|0)>0)do{g=c[c[b+1120>>2]>>2]|0;d=c[g+348>>2]|0;if(d|0){Ag(b+1068|0,d)|0;e=c[b+1072>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+1072>>2]=d;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}d=c[g+52>>2]|0;if(d|0){if(a[g+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+52>>2]=0}a[g+56>>0]=1;c[g+52>>2]=0;c[g+44>>2]=0;c[g+48>>2]=0;d=c[g+32>>2]|0;if(d|0){if(a[g+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+32>>2]=0}a[g+36>>0]=1;c[g+32>>2]=0;c[g+24>>2]=0;c[g+28>>2]=0;d=c[g+12>>2]|0;if(d|0){if(a[g+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+12>>2]=0}a[g+16>>0]=1;c[g+12>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);d=c[b+1112>>2]|0;a:do if((d|0)>0){f=c[b+1120>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){h=c[b+1120>>2]|0;f=h+(e<<2)|0;g=c[f>>2]|0;c[f>>2]=c[h+(d+-1<<2)>>2];c[(c[b+1120>>2]|0)+(d+-1<<2)>>2]=g;c[b+1112>>2]=d+-1;d=d+-1|0}}while((d|0)>0);d=c[b+932>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+940>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+932>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+912>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+920>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+912>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+1244>>2]|0;if(d|0){if(a[b+1248>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1244>>2]=0}a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;d=c[b+1140>>2]|0;if(d|0){if(a[b+1144>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1140>>2]=0}a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;d=c[b+1120>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;Bl(b+1068|0);Bl(b+1028|0);Bl(b+988|0);d=c[b+940>>2]|0;if(d|0){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;d=c[b+920>>2]|0;if(d|0){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;d=c[b+900>>2]|0;if(d|0){if(a[b+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+900>>2]=0}a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;d=c[b+880>>2]|0;if(d|0){if(a[b+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+880>>2]=0}a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;d=c[b+860>>2]|0;if(d|0){if(a[b+864>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+860>>2]=0}a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;d=c[b+840>>2]|0;if(d|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;d=c[b+820>>2]|0;if(d|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;d=c[b+780>>2]|0;if(d|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;d=c[b+760>>2]|0;if(d|0){if(a[b+764>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+760>>2]=0}a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;d=c[b+572>>2]|0;if(d|0){if(a[b+576>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+572>>2]=0}a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;d=c[b+552>>2]|0;if(d|0){if(a[b+556>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+552>>2]=0}a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;Ju(b+348|0);d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}function sd(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0;n=l;l=l+16|0;i=c[a+372>>2]|0;a:do switch(c[i+32>>2]|0){case 1:{b=0;d=1;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;o=i+32|0;g[i+16+(d<<2)>>2]=0.0;d=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=d;c[i+(c[o>>2]<<2)>>2]=c[a+348+(d<<2)>>2];d=c[o>>2]|0;c[o>>2]=d+1;e=+g[n>>2];f=+g[n+4>>2];h=+g[n+8>>2];Fh(a,e,f,h,c[i+(d<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-e,-f,-h,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;b=b+1|0;if(b>>>0>=3)break a;d=c[a+372>>2]|0;i=d;d=c[d+32>>2]|0}o=1;l=n;return o|0}case 2:{o=c[i+4>>2]|0;b=c[i>>2]|0;e=+g[o+16>>2]-+g[b+16>>2];f=+g[o+20>>2]-+g[b+20>>2];h=+g[o+24>>2]-+g[b+24>>2];b=0;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;j=+g[n+8>>2];k=+g[n+4>>2];m=+g[n>>2];if((f*j-h*k)*(f*j-h*k)+(h*m-e*j)*(h*m-e*j)+(e*k-f*m)*(e*k-f*m)>0.0){i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*j-h*k,h*m-e*j,e*k-f*m,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*j-h*k),-(h*m-e*j),-(e*k-f*m),c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i}b=b+1|0;if(b>>>0>=3)break a}o=1;l=n;return o|0}case 3:{o=c[i+4>>2]|0;d=c[i>>2]|0;j=+g[d+16>>2];e=+g[o+16>>2]-j;k=+g[d+20>>2];f=+g[o+20>>2]-k;m=+g[d+24>>2];h=+g[o+24>>2]-m;o=c[i+8>>2]|0;j=+g[o+16>>2]-j;k=+g[o+20>>2]-k;m=+g[o+24>>2]-m;if((f*m-h*k)*(f*m-h*k)+(h*j-e*m)*(h*j-e*m)+(e*k-f*j)*(e*k-f*j)>0.0){g[i+28>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+12>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*m-h*k,h*j-e*m,e*k-f*j,c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*m-h*k),-(h*j-e*m),-(e*k-f*j),c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}else{o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;break a}}break}case 4:{o=c[i>>2]|0;a=c[i+12>>2]|0;m=+g[a+16>>2];r=+g[o+16>>2]-m;p=+g[a+20>>2];e=+g[o+20>>2]-p;h=+g[a+24>>2];j=+g[o+24>>2]-h;o=c[i+4>>2]|0;f=+g[o+16>>2]-m;k=+g[o+20>>2]-p;q=+g[o+24>>2]-h;o=c[i+8>>2]|0;m=+g[o+16>>2]-m;p=+g[o+20>>2]-p;h=+g[o+24>>2]-h;if(!((0.0!=0.0?1:r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m!=r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m)|r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m==0.0)){o=1;l=n;return o|0}break}default:{}}while(0);o=0;l=n;return o|0}function td(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0,Y=0,Z=0;Z=c[d+36>>2]|0;X=c[e+36>>2]|0;L=+g[Z+8>>2];N=+g[Z+12>>2];M=+g[Z+16>>2];h=c[X+8>>2]|0;R=+g[h+8>>2];S=+g[h+12>>2];T=+g[h+16>>2];d=c[X+12>>2]|0;O=+g[d+8>>2];P=+g[d+12>>2];Q=+g[d+16>>2];e=c[X+16>>2]|0;U=+g[e+8>>2];V=+g[e+12>>2];W=+g[e+16>>2];t=O-L-(R-L);A=P-N-(S-N);v=Q-M-(T-M);u=A*(W-M-(T-M))-v*(V-N-(S-N));B=v*(U-L-(R-L))-t*(W-M-(T-M));w=t*(V-N-(S-N))-A*(U-L-(R-L));do if(w*w+(u*u+B*B)>1.1920928955078125e-07?(E=1.0/+D(+(w*w+(u*u+B*B))),F=(T-M)*w*E+((R-L)*u*E+(S-N)*B*E),F*F<3402823466385288598117041.0e14):0){f=R-L-u*E*F;k=S-N-B*E*F;n=T-M-w*E*F;p=O-L-u*E*F;r=P-N-B*E*F;s=Q-M-w*E*F;if((w*(r*f-k*p)+(u*(k*s-n*r)+B*(n*p-s*f))>0.0?(x=U-L-u*E*F,y=V-N-B*E*F,z=W-M-w*E*F,w*(y*p-r*x)+(u*(r*z-s*y)+B*(s*x-z*p))>0.0):0)?w*(k*x-y*f)+(u*(y*n-z*k)+B*(z*f-n*x))>0.0:0){q=F*F;p=u*E*F;n=w*E*F;m=B*E*F;break}if(t*t+A*A+v*v>1.1920928955078125e-07?(C=-((R-L)*t+(S-N)*A+(T-M)*v)/(t*t+A*A+v*v),C=C<0.0?0.0:C>1.0?1.0:C,q=(T-M+v*C)*(T-M+v*C)+((R-L+t*C)*(R-L+t*C)+(S-N+A*C)*(S-N+A*C)),q<3402823466385288598117041.0e14):0){p=R-L+t*C;n=T-M+v*C;k=S-N+A*C}else{q=3402823466385288598117041.0e14;p=0.0;n=0.0;k=0.0}f=(U-L-(O-L))*(U-L-(O-L))+(V-N-(P-N))*(V-N-(P-N))+(W-M-(Q-M))*(W-M-(Q-M));if(f>1.1920928955078125e-07?(H=-((O-L)*(U-L-(O-L))+(P-N)*(V-N-(P-N))+(Q-M)*(W-M-(Q-M)))/f,H=H<0.0?0.0:H>1.0?1.0:H,G=O-L+(U-L-(O-L))*H,I=P-N+(V-N-(P-N))*H,H=Q-M+(W-M-(Q-M))*H,H*H+(G*G+I*I)1.1920928955078125e-07?(K=-((U-L)*(R-L-(U-L))+(V-N)*(S-N-(V-N))+(W-M)*(T-M-(W-M)))/f,K=K<0.0?0.0:K>1.0?1.0:K,J=U-L+(R-L-(U-L))*K,m=V-N+(S-N-(V-N))*K,K=W-M+(T-M-(W-M))*K,K*K+(J*J+m*m)>2];K=N-+g[Z+28>>2];u=M-+g[Z+32>>2];u=+g[b+12>>2]+ +D(+(J*J+K*K+u*u))*2.0;if(!(q>2];V=+g[h+88>>2];W=+g[d+88>>2];f=+g[e+88>>2];f=!(V<=0.0)&!(W<=0.0)&!(f<=0.0)?V*s*(1.0/(t+s+r))+W*r*(1.0/(t+s+r))+t*(1.0/(t+s+r))*f:0.0;if(!(k+f>0.0))return;W=1.0/-+D(+q);q=p*W;p=m*W;n=n*W;o=c[b+4>>2]|0;d=c[b+8>>2]|0;l=c[(+g[o+376>>2]>+g[d+376>>2]?o+376|0:d+376|0)>>2]|0;m=k/(k+f)*+g[o+392>>2];f=f/(k+f)*+g[d+392>>2];d=c[o+892>>2]|0;if((d|0)==(c[o+896>>2]|0)?(Y=d|0?d<<1:1,(d|0)<(Y|0)):0){if(!Y)j=0;else{c[6995]=(c[6995]|0)+1;d=sc((Y*56|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=d;d=c[o+892>>2]|0}if((d|0)>0){e=0;do{h=j+(e*56|0)|0;b=(c[o+900>>2]|0)+(e*56|0)|0;i=h+56|0;do{c[h>>2]=c[b>>2];h=h+4|0;b=b+4|0}while((h|0)<(i|0));e=e+1|0}while((e|0)!=(d|0))}d=c[o+900>>2]|0;if(d|0){if(a[o+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+900>>2]=0}a[o+904>>0]=1;c[o+900>>2]=j;c[o+896>>2]=Y;d=c[o+892>>2]|0}Y=c[o+900>>2]|0;c[Y+(d*56|0)>>2]=Z;c[Y+(d*56|0)+4>>2]=X;g[Y+(d*56|0)+8>>2]=s*(1.0/(t+s+r));g[Y+(d*56|0)+12>>2]=r*(1.0/(t+s+r));g[Y+(d*56|0)+16>>2]=t*(1.0/(t+s+r));g[Y+(d*56|0)+20>>2]=0.0;g[Y+(d*56|0)+24>>2]=q;g[Y+(d*56|0)+28>>2]=p;g[Y+(d*56|0)+32>>2]=n;g[Y+(d*56|0)+36>>2]=0.0;g[Y+(d*56|0)+40>>2]=u;c[Y+(d*56|0)+44>>2]=l;g[Y+(d*56|0)+48>>2]=m;g[Y+(d*56|0)+52>>2]=f;c[o+892>>2]=(c[o+892>>2]|0)+1;return}function ud(d,e){d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+64|0;g[d+20>>2]=+h[e+32>>3];g[d+24>>2]=+h[e+40>>3];g[d+28>>2]=+h[e+48>>3];g[d+32>>2]=+h[e+56>>3];g[d+4>>2]=+h[e>>3];g[d+8>>2]=+h[e+8>>3];g[d+12>>2]=+h[e+16>>3];g[d+16>>2]=+h[e+24>>3];g[d+36>>2]=+h[e+64>>3];g[d+40>>2]=+h[e+72>>3];g[d+44>>2]=+h[e+80>>3];g[d+48>>2]=+h[e+88>>3];c[d+56>>2]=c[e+96>>2];a[d+60>>0]=(c[e+100>>2]|0)!=0&1;p=c[e+104>>2]|0;k=q;n=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(n|0));o=c[d+88>>2]|0;if((o|0)<(p|0)){if((c[d+92>>2]|0)<(p|0)){if(!p){f=0;j=o}else{c[6995]=(c[6995]|0)+1;f=sc(p<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+88>>2]|0}if((j|0)>0){i=0;do{k=f+(i<<6)|0;m=(c[d+96>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(j|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=p;i=d+96|0}else i=d+96|0;f=o;do{k=(c[i>>2]|0)+(f<<6)|0;m=q;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));f=f+1|0}while((f|0)!=(p|0))}c[d+88>>2]=p;if((p|0)>0){j=c[d+96>>2]|0;f=c[e+112>>2]|0;i=0;while(1){g[j+(i<<6)+16>>2]=+h[f+32>>3];g[j+(i<<6)+20>>2]=+h[f+40>>3];g[j+(i<<6)+24>>2]=+h[f+48>>3];g[j+(i<<6)+28>>2]=+h[f+56>>3];g[j+(i<<6)>>2]=+h[f>>3];g[j+(i<<6)+4>>2]=+h[f+8>>3];g[j+(i<<6)+8>>2]=+h[f+16>>3];g[j+(i<<6)+12>>2]=+h[f+24>>3];c[j+(i<<6)+32>>2]=c[f+64>>2];c[j+(i<<6)+36>>2]=c[f+68>>2];c[j+(i<<6)+40>>2]=c[f+72>>2];i=i+1|0;if((i|0)==(p|0))break;else f=f+80|0}}m=c[e+108>>2]|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(m|0)){if((c[d+132>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc((m<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+128>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<4)|0;o=(c[d+136>>2]|0)+(i<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=m;i=d+136|0}else i=d+136|0;f=k;do{p=(c[i>>2]|0)+(f<<4)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+128>>2]=m;if((m|0)>0){j=c[d+136>>2]|0;f=0;i=c[e+116>>2]|0;while(1){c[j+(f<<4)+12>>2]=c[i+12>>2];b[j+(f<<4)+6>>1]=b[i+6>>1]|0;b[j+(f<<4)+8>>1]=b[i+8>>1]|0;b[j+(f<<4)+10>>1]=b[i+10>>1]|0;b[j+(f<<4)>>1]=b[i>>1]|0;b[j+(f<<4)+2>>1]=b[i+2>>1]|0;b[j+(f<<4)+4>>1]=b[i+4>>1]|0;f=f+1|0;if((f|0)==(m|0))break;else i=i+16|0}}c[d+144>>2]=c[e+120>>2];m=c[e+124>>2]|0;k=c[d+152>>2]|0;if((k|0)<(m|0)){if((c[d+156>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc(m<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+152>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<5)|0;o=(c[d+160>>2]|0)+(i<<5)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[p+16>>2]=c[o+16>>2];c[p+20>>2]=c[o+20>>2];c[p+24>>2]=c[o+24>>2];c[p+28>>2]=c[o+28>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+160>>2]|0;if(i|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=m;i=d+160|0}else i=d+160|0;f=k;do{p=(c[i>>2]|0)+(f<<5)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];c[p+16>>2]=c[q+16>>2];c[p+20>>2]=c[q+20>>2];c[p+24>>2]=c[q+24>>2];c[p+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+152>>2]=m;if((m|0)<=0){l=q;return}j=c[d+160>>2]|0;i=0;f=c[e+128>>2]|0;while(1){b[j+(i<<5)+6>>1]=b[f+14>>1]|0;b[j+(i<<5)+8>>1]=b[f+16>>1]|0;b[j+(i<<5)+10>>1]=b[f+18>>1]|0;b[j+(i<<5)>>1]=b[f+8>>1]|0;b[j+(i<<5)+2>>1]=b[f+10>>1]|0;b[j+(i<<5)+4>>1]=b[f+12>>1]|0;c[j+(i<<5)+12>>2]=c[f>>2];c[j+(i<<5)+16>>2]=c[f+4>>2];i=i+1|0;if((i|0)==(m|0))break;else f=f+20|0}l=q;return}function vd(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;c[d+20>>2]=c[e+16>>2];c[d+24>>2]=c[e+20>>2];c[d+28>>2]=c[e+24>>2];c[d+32>>2]=c[e+28>>2];c[d+4>>2]=c[e>>2];c[d+8>>2]=c[e+4>>2];c[d+12>>2]=c[e+8>>2];c[d+16>>2]=c[e+12>>2];c[d+36>>2]=c[e+32>>2];c[d+40>>2]=c[e+36>>2];c[d+44>>2]=c[e+40>>2];c[d+48>>2]=c[e+44>>2];c[d+56>>2]=c[e+48>>2];a[d+60>>0]=(c[e+52>>2]|0)!=0&1;n=c[e+56>>2]|0;i=o;k=i+64|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(k|0));m=c[d+88>>2]|0;if((m|0)<(n|0)){if((c[d+92>>2]|0)<(n|0)){if(!n){f=0;h=m}else{c[6995]=(c[6995]|0)+1;f=sc(n<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+88>>2]|0}if((h|0)>0){g=0;do{i=f+(g<<6)|0;j=(c[d+96>>2]|0)+(g<<6)|0;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));g=g+1|0}while((g|0)!=(h|0))}g=c[d+96>>2]|0;if(g|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=n;g=d+96|0}else g=d+96|0;f=m;do{i=(c[g>>2]|0)+(f<<6)|0;j=o;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));f=f+1|0}while((f|0)!=(n|0))}c[d+88>>2]=n;if((n|0)>0){h=c[d+96>>2]|0;f=c[e+64>>2]|0;g=0;while(1){c[h+(g<<6)+16>>2]=c[f+16>>2];c[h+(g<<6)+20>>2]=c[f+20>>2];c[h+(g<<6)+24>>2]=c[f+24>>2];c[h+(g<<6)+28>>2]=c[f+28>>2];c[h+(g<<6)>>2]=c[f>>2];c[h+(g<<6)+4>>2]=c[f+4>>2];c[h+(g<<6)+8>>2]=c[f+8>>2];c[h+(g<<6)+12>>2]=c[f+12>>2];c[h+(g<<6)+32>>2]=c[f+32>>2];c[h+(g<<6)+36>>2]=c[f+36>>2];c[h+(g<<6)+40>>2]=c[f+40>>2];g=g+1|0;if((g|0)==(n|0))break;else f=f+48|0}}j=c[e+60>>2]|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;i=c[d+128>>2]|0;if((i|0)<(j|0)){if((c[d+132>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+128>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<4)|0;m=(c[d+136>>2]|0)+(g<<4)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+136>>2]|0;if(g|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=j;g=d+136|0}else g=d+136|0;f=i;do{n=(c[g>>2]|0)+(f<<4)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+128>>2]=j;if((j|0)>0){h=c[d+136>>2]|0;f=0;g=c[e+68>>2]|0;while(1){c[h+(f<<4)+12>>2]=c[g+12>>2];b[h+(f<<4)+6>>1]=b[g+6>>1]|0;b[h+(f<<4)+8>>1]=b[g+8>>1]|0;b[h+(f<<4)+10>>1]=b[g+10>>1]|0;b[h+(f<<4)>>1]=b[g>>1]|0;b[h+(f<<4)+2>>1]=b[g+2>>1]|0;b[h+(f<<4)+4>>1]=b[g+4>>1]|0;f=f+1|0;if((f|0)==(j|0))break;else g=g+16|0}}c[d+144>>2]=c[e+76>>2];j=c[e+80>>2]|0;i=c[d+152>>2]|0;if((i|0)<(j|0)){if((c[d+156>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc(j<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+152>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<5)|0;m=(c[d+160>>2]|0)+(g<<5)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];c[n+16>>2]=c[m+16>>2];c[n+20>>2]=c[m+20>>2];c[n+24>>2]=c[m+24>>2];c[n+28>>2]=c[m+28>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+160>>2]|0;if(g|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=j;g=d+160|0}else g=d+160|0;f=i;do{n=(c[g>>2]|0)+(f<<5)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+152>>2]=j;if((j|0)<=0){l=o;return}h=c[d+160>>2]|0;g=0;f=c[e+72>>2]|0;while(1){b[h+(g<<5)+6>>1]=b[f+14>>1]|0;b[h+(g<<5)+8>>1]=b[f+16>>1]|0;b[h+(g<<5)+10>>1]=b[f+18>>1]|0;b[h+(g<<5)>>1]=b[f+8>>1]|0;b[h+(g<<5)+2>>1]=b[f+10>>1]|0;b[h+(g<<5)+4>>1]=b[f+12>>1]|0;c[h+(g<<5)+12>>2]=c[f>>2];c[h+(g<<5)+16>>2]=c[f+4>>2];g=g+1|0;if((g|0)==(j|0))break;else f=f+20|0}l=o;return} +function nc(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ea=l;l=l+240|0;e=c[b+24>>2]|0;if((e|0)<=0){l=ea;return}K=ea+128+76|0;L=ea+80+16|0;P=ea+80+32|0;J=0;do{I=c[(c[b+32>>2]|0)+(J<<2)>>2]|0;switch(c[I+220>>2]|0){case 2:case 5:break;default:{if(a[I+984>>0]|0){a[I+984>>0]=0;f=c[I+792>>2]|0;if((f|0)>0){h=c[I+800>>2]|0;e=0;do{x=c[h+(e*52|0)+24>>2]|0;H=c[h+(e*52|0)+28>>2]|0;E=+g[x+8>>2]-+g[H+8>>2];F=+g[x+12>>2]-+g[H+12>>2];G=+g[x+16>>2]-+g[H+16>>2];G=+D(+(E*E+F*F+G*G));g[h+(e*52|0)+32>>2]=G;g[h+(e*52|0)+44>>2]=G*G;e=e+1|0}while((e|0)!=(f|0));e=0;do{g[h+(e*52|0)+40>>2]=(+g[(c[h+(e*52|0)+24>>2]|0)+88>>2]+ +g[(c[h+(e*52|0)+28>>2]|0)+88>>2])/+g[(c[h+(e*52|0)+4>>2]|0)+4>>2];e=e+1|0}while((e|0)!=(f|0))}Vf(I);Dl(I+1028|0);if(c[I+448>>2]&16|0)$g(I)}m=+g[I+428>>2]*d;g[I+512>>2]=m;g[I+516>>2]=1.0/m;g[I+520>>2]=m*3.0;x=c[I+192>>2]|0;m=+nb[c[(c[x>>2]|0)+48>>2]&15](x);g[I+524>>2]=m;g[I+528>>2]=m*.25;x=c[I+744>>2]|0;m=+g[I+512>>2];i=+g[x+40>>2]*m;k=m*+g[x+44>>2];m=m*+g[x+48>>2];H=c[I+772>>2]|0;if((H|0)>0){f=c[I+780>>2]|0;e=0;do{if(+g[f+(e*104|0)+88>>2]>0.0){n=f+(e*104|0)+40|0;g[n>>2]=i+ +g[n>>2];n=f+(e*104|0)+44|0;g[n>>2]=k+ +g[n>>2];n=f+(e*104|0)+48|0;g[n>>2]=m+ +g[n>>2]}e=e+1|0}while((e|0)!=(H|0))}F=+g[I+368>>2];G=+g[I+372>>2];n=+g[I+364>>2]>0.0?1:+g[I+360>>2]>0.0;if(F!=0.0|G>0.0){if((H|0)>0){f=c[I+780>>2]|0;k=+g[f+8>>2];m=+g[f+12>>2];o=+g[f+16>>2];f=c[I+812>>2]|0;if((f|0)>0){h=c[I+820>>2]|0;e=0;i=0.0;do{fa=c[h+(e*44|0)+8>>2]|0;ga=c[h+(e*44|0)+12>>2]|0;B=+g[ga+8>>2]-k;w=+g[ga+12>>2]-m;z=+g[ga+16>>2]-o;ga=c[h+(e*44|0)+16>>2]|0;A=+g[ga+8>>2]-k;y=+g[ga+12>>2]-m;E=+g[ga+16>>2]-o;i=i+((+g[fa+16>>2]-o)*(B*y-w*A)+((+g[fa+8>>2]-k)*(w*E-z*y)+(+g[fa+12>>2]-m)*(z*A-B*E)));e=e+1|0}while((e|0)!=(f|0))}else i=0.0;i=i/6.0}else i=0.0;E=F*(1.0/+C(+i));B=G*(+g[I+536>>2]-i)}else{B=0.0;E=0.0}a:do if((H|0)>0){if(!n){f=c[I+780>>2]|0;e=0;while(1){if(+g[f+(e*104|0)+88>>2]>0.0){if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0;if((e|0)==(H|0))break a}}f=c[I+780>>2]|0;e=0;do{w=+g[f+(e*104|0)+88>>2];if(w>0.0){y=+g[I+512>>2];u=+g[I+364>>2];s=+g[I+360>>2];b:do if((u>0.0|s>0.0?(M=c[x>>2]|0,(c[I+348>>2]|0)<4):0)?(N=+g[f+(e*104|0)+40>>2],O=N-+g[I+1212>>2],Q=+g[f+(e*104|0)+44>>2],R=Q-+g[I+1216>>2],S=+g[f+(e*104|0)+48>>2],T=S-+g[I+1220>>2],U=+D(+(O*O+R*R+T*T)),O*O+R*R+T*T>1.1920928955078125e-07):0){v=O*(1.0/U);z=R*(1.0/U);A=T*(1.0/U);k=+g[f+(e*104|0)+72>>2];o=+g[f+(e*104|0)+76>>2];p=+g[f+(e*104|0)+80>>2];switch(c[I+348>>2]|0){case 2:{r=O*k+R*o+T*p<0.0?-1.0:1.0;i=A*p*r+(v*k*r+z*o*r);m=+g[f+(e*104|0)+92>>2]*.5;q=(c[j>>2]=M,+g[j>>2]);t=i*s*.5*q*(O*O+R*R+T*T)*m;if(i>0.0&i<.9847999811172485){u=u*.5*q*U*m*+D(+(1.0-i*i));q=(A*(v*p*r-A*k*r)-z*(z*k*r-v*o*r))*u;s=(v*(z*k*r-v*o*r)-A*(A*o*r-z*p*r))*u;o=(z*(A*o*r-z*p*r)-v*(v*p*r-A*k*r))*u}else{q=0.0;s=0.0;o=0.0}i=y*w*-(A*t)*y*w*-(A*t)+(w*-(v*t)*y*w*-(v*t)*y+y*w*-(z*t)*y*w*-(z*t));if(i>0.0?i>=N*N+Q*Q+S*S:0){i=+D(+(N*N+Q*Q+S*S))/+D(+i)*.800000011920929;m=i*-(v*t);k=i*-(A*t);i=i*-(z*t)}else{m=-(v*t);k=-(A*t);i=-(z*t)}n=f+(e*104|0)+56|0;fa=f+(e*104|0)+60|0;z=i+ +g[fa>>2];ga=f+(e*104|0)+64|0;A=k+ +g[ga>>2];g[n>>2]=q+(m+ +g[n>>2]);g[fa>>2]=s+z;g[ga>>2]=o+A;break b}case 1:{t=O*k+R*o+T*p<0.0?-1.0:1.0;k=k*t;o=o*t;p=p*t;break}case 3:case 0:break;default:break b}i=O*k+R*o+T*p;if(i>0.0){i=-((c[j>>2]=M,+g[j>>2])*(O*O+R*R+T*T)*i*+g[f+(e*104|0)+92>>2]*.5);m=v*s*i+(k*u*i+0.0);k=z*s*i+(o*u*i+0.0);i=A*s*i+(p*u*i+0.0);if(y*w*i*y*w*i+(y*w*m*y*w*m+y*w*k*y*w*k)>N*N+Q*Q+S*S){A=1.0/+D(+(i*i+(m*m+k*k)));ga=f+(e*104|0)+56|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*m*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+60|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*k*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+64|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*i*A*(S*i*A+(N*m*A+Q*k*A));break}else{ga=f+(e*104|0)+56|0;g[ga>>2]=m+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=k+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=i+ +g[ga>>2];break}}}while(0);if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0}while((e|0)!=(H|0))}while(0);n=c[I+812>>2]|0;if((n|0)>0){h=0;do{u=+g[I+512>>2];t=+g[I+364>>2];s=+g[I+360>>2];c:do if((t>0.0|s>0.0?(V=c[I+348>>2]|0,(V|0)>3):0)?(W=c[I+820>>2]|0,X=c[W+(h*44|0)+8>>2]|0,fa=c[W+(h*44|0)+12>>2]|0,Y=+g[X+40>>2],Z=+g[X+44>>2],_=+g[X+48>>2],ga=c[W+(h*44|0)+16>>2]|0,$=c[x>>2]|0,aa=(Y+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408-+g[I+1212>>2],ba=(Z+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408-+g[I+1216>>2],ca=(_+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408-+g[I+1220>>2],da=+D(+(aa*aa+ba*ba+ca*ca)),aa*aa+ba*ba+ca*ca>1.1920928955078125e-07):0){v=aa*(1.0/da);w=ba*(1.0/da);z=ca*(1.0/da);k=+g[W+(h*44|0)+20>>2];m=+g[W+(h*44|0)+24>>2];o=+g[W+(h*44|0)+28>>2];switch(V|0){case 5:{r=aa*k+ba*m+ca*o<0.0?-1.0:1.0;i=z*o*r+(v*k*r+w*m*r);p=+g[W+(h*44|0)+36>>2]*.5;q=(c[j>>2]=$,+g[j>>2]);s=i*(aa*aa+ba*ba+ca*ca)*s*.5*q*p;if(i>0.0&i<.9847999811172485){A=da*t*.5*q*p*+D(+(1.0-i*i));B=(z*(v*o*r-z*k*r)-w*(w*k*r-v*m*r))*A*.3333333432674408;E=(v*(w*k*r-v*m*r)-z*(z*m*r-w*o*r))*A*.3333333432674408;A=(w*(z*m*r-w*o*r)-v*(v*o*r-z*k*r))*A*.3333333432674408}else{B=0.0;E=0.0;A=0.0}f=0;i=z*s*-.3333333432674408;m=w*s*-.3333333432674408;y=v*s*-.3333333432674408;e=X;o=v*s*-.3333333432674408;p=w*s*-.3333333432674408;v=z*s*-.3333333432674408;while(1){k=+g[e+88>>2];if(k>0.0){q=+g[I+512>>2];t=o*k*q;u=p*k*q;k=v*k*q;q=+g[e+40>>2];r=+g[e+44>>2];s=+g[e+48>>2];if(k*k+(t*t+u*u)>0.0?k*k+(t*t+u*u)>=q*q+r*r+s*s:0){i=+D(+(q*q+r*r+s*s))/+D(+(k*k+(t*t+u*u)))*.800000011920929;k=o*i;m=p*i;i=v*i;o=k;p=m;q=i}else{q=v;k=y}ha=e+56|0;fa=e+60|0;F=m+ +g[fa>>2];ga=e+64|0;G=i+ +g[ga>>2];g[ha>>2]=B+(k+ +g[ha>>2]);g[fa>>2]=E+F;g[ga>>2]=A+G}else{k=y;q=v}e=f+1|0;if((e|0)==3)break c;f=e;y=k;e=c[W+(h*44|0)+8+(e<<2)>>2]|0;v=q}}case 4:{G=aa*k+ba*m+ca*o<0.0?-1.0:1.0;k=k*G;m=m*G;o=o*G;break}case 6:break;default:break c}i=aa*k+ba*m+ca*o;if(i>0.0){p=-((c[j>>2]=$,+g[j>>2])*(aa*aa+ba*ba+ca*ca)*i*+g[W+(h*44|0)+36>>2]);r=(v*s*p+(k*t*p+0.0))*.3333333432674408;q=(w*s*p+(m*t*p+0.0))*.3333333432674408;p=(z*s*p+(o*t*p+0.0))*.3333333432674408;e=0;f=X;k=Y;m=Z;o=_;while(1){i=u*+g[f+88>>2];if(p*i*p*i+(r*i*r*i+q*i*q*i)>k*k+m*m+o*o){F=1.0/+D(+(p*p+(r*r+q*q)));G=o*p*F+(k*r*F+m*q*F);ha=f+56|0;g[ha>>2]=+g[ha>>2]-1.0/i*r*F*G;ha=f+60|0;g[ha>>2]=+g[ha>>2]-1.0/i*q*F*G;ha=f+64|0;g[ha>>2]=+g[ha>>2]-1.0/i*p*F*G}else{ha=f+56|0;g[ha>>2]=r+ +g[ha>>2];ha=f+60|0;g[ha>>2]=q+ +g[ha>>2];ha=f+64|0;g[ha>>2]=p+ +g[ha>>2]}e=e+1|0;if((e|0)==3)break c;ha=c[W+(h*44|0)+8+(e<<2)>>2]|0;f=ha;k=+g[ha+40>>2];m=+g[ha+44>>2];o=+g[ha+48>>2]}}}while(0);h=h+1|0}while((h|0)!=(n|0))}if((H|0)>0){e=0;do{ga=c[I+780>>2]|0;fa=ga+(e*104|0)+8|0;ha=ga+(e*104|0)+24|0;c[ha>>2]=c[fa>>2];c[ha+4>>2]=c[fa+4>>2];c[ha+8>>2]=c[fa+8>>2];c[ha+12>>2]=c[fa+12>>2];ha=ga+(e*104|0)+56|0;F=+g[ga+(e*104|0)+88>>2];G=+g[I+512>>2];B=+g[ha>>2]*F*G;E=F*+g[ga+(e*104|0)+60>>2]*G;F=G*F*+g[ga+(e*104|0)+64>>2];G=+g[(c[I+744>>2]|0)+12>>2]/G;B=B>G?G:B;E=E>G?G:E;F=F>G?G:F;x=ga+(e*104|0)+40|0;B=(B<-G?-G:B)+ +g[x>>2];g[x>>2]=B;x=ga+(e*104|0)+44|0;E=(E<-G?-G:E)+ +g[x>>2];g[x>>2]=E;x=ga+(e*104|0)+48|0;F=(F<-G?-G:F)+ +g[x>>2];g[x>>2]=F;G=+g[I+512>>2];g[fa>>2]=B*G+ +g[fa>>2];fa=ga+(e*104|0)+12|0;g[fa>>2]=G*E+ +g[fa>>2];ga=ga+(e*104|0)+16|0;g[ga>>2]=F*G+ +g[ga>>2];c[ha>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;c[ha+12>>2]=0;e=e+1|0}while((e|0)!=(H|0))}Tc(I);e=c[I+988>>2]|0;if(e){ha=c[I+192>>2]|0;E=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);G=+g[e+4>>2]-E;F=+g[e+8>>2]-E;g[I+952>>2]=+g[e>>2]-E;g[I+956>>2]=G;g[I+960>>2]=F;g[I+964>>2]=0.0;F=E+ +g[e+20>>2];G=E+ +g[e+24>>2];g[I+968>>2]=E+ +g[e+16>>2];g[I+972>>2]=F;g[I+976>>2]=G;g[I+980>>2]=0.0;e=c[I+188>>2]|0;if(e|0){ha=c[I+744>>2]|0;ga=c[ha+32>>2]|0;Zb[c[(c[ga>>2]|0)+16>>2]&31](ga,e,I+952|0,I+968|0,c[ha+36>>2]|0)}}else{c[I+952>>2]=0;c[I+952+4>>2]=0;c[I+952+8>>2]=0;c[I+952+12>>2]=0;c[I+952+16>>2]=0;c[I+952+20>>2]=0;c[I+952+24>>2]=0;c[I+952+28>>2]=0}f=c[I+772>>2]|0;if((f|0)>0){e=0;do{ga=c[I+780>>2]|0;F=+g[I+524>>2];B=+g[ga+(e*104|0)+8>>2];G=+g[ga+(e*104|0)+12>>2];E=+g[ga+(e*104|0)+16>>2];g[ea>>2]=B-F;g[ea+4>>2]=G-F;g[ea+8>>2]=E-F;g[ea+12>>2]=0.0;g[ea+16>>2]=F+B;g[ea+20>>2]=F+G;g[ea+24>>2]=F+E;g[ea+28>>2]=0.0;ha=c[ga+(e*104|0)+96>>2]|0;E=+g[I+520>>2];F=E*+g[ga+(e*104|0)+44>>2];G=E*+g[ga+(e*104|0)+48>>2];g[ea+128>>2]=+g[ga+(e*104|0)+40>>2]*E;g[ea+128+4>>2]=F;g[ea+128+8>>2]=G;g[ea+128+12>>2]=0.0;uh(I+988|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)!=(f|0))}if(c[I+1028>>2]|0?(c[I+812>>2]|0)>0:0){e=0;do{ha=c[I+820>>2]|0;H=c[ha+(e*44|0)+8>>2]|0;fa=c[ha+(e*44|0)+12>>2]|0;ga=c[ha+(e*44|0)+16>>2]|0;B=(+g[H+40>>2]+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408;E=(+g[H+44>>2]+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408;F=(+g[H+48>>2]+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408;w=+g[I+524>>2];t=+g[H+8>>2];v=+g[H+12>>2];z=+g[H+16>>2];G=+g[H+20>>2];A=+g[fa+8>>2];o=A>2];p=y>2];q=u>2];r=s>2];u=+g[ga+12>>2];y=+g[ga+16>>2];A=+g[ga+20>>2];g[ea>>2]=(s>2]=(u>2]=(y>2]=A>2]=w+(t>2]=w+(v>2]=w+(z>2]=G>2]|0;G=+g[I+520>>2];g[ea+128>>2]=B*G;g[ea+128+4>>2]=E*G;g[ea+128+8>>2]=F*G;g[ea+128+12>>2]=0.0;uh(I+1028|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)<(c[I+812>>2]|0))}do if(a[I+533>>0]|0){x=c[I+772>>2]|0;if((x|0)>0){f=c[I+780>>2]|0;h=c[I+572>>2]|0;e=0;i=0.0;k=0.0;m=0.0;do{G=+g[h+(e<<2)>>2];i=i+ +g[f+(e*104|0)+8>>2]*G;k=k+G*+g[f+(e*104|0)+12>>2];m=m+G*+g[f+(e*104|0)+16>>2];e=e+1|0}while((e|0)!=(x|0))}else{i=0.0;k=0.0;m=0.0}g[I+580>>2]=i;g[I+584>>2]=k;g[I+588>>2]=m;g[I+592>>2]=0.0;h=ea+128+4|0;n=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));g[ea+128>>2]=1.1920928955078125e-07;g[ea+128+20>>2]=2.384185791015625e-07;g[ea+128+40>>2]=3.5762786865234375e-07;if((x|0)>0){f=c[I+572>>2]|0;h=c[I+780>>2]|0;n=c[I+552>>2]|0;e=0;o=1.1920928955078125e-07;p=0.0;q=0.0;r=0.0;s=2.384185791015625e-07;t=0.0;u=0.0;v=0.0;w=3.5762786865234375e-07;do{F=+g[f+(e<<2)>>2];z=(+g[h+(e*104|0)+8>>2]-i)*F;A=(+g[h+(e*104|0)+12>>2]-k)*F;F=F*(+g[h+(e*104|0)+16>>2]-m);B=+g[n+(e<<4)>>2];E=+g[n+(e<<4)+4>>2];G=+g[n+(e<<4)+8>>2];o=z*B+o;p=z*E+p;q=z*G+q;r=A*B+r;s=A*E+s;t=A*G+t;u=F*B+u;v=F*E+v;w=F*G+w;e=e+1|0}while((e|0)!=(x|0));g[ea+128>>2]=o;g[ea+128+4>>2]=p;g[ea+128+8>>2]=q;g[ea+128+16>>2]=r;g[ea+128+20>>2]=s;g[ea+128+24>>2]=t;g[ea+128+32>>2]=u;g[ea+128+36>>2]=v;g[ea+128+40>>2]=w}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(ea+128|0,ea+80|0,ea+32|0);c[I+596>>2]=c[ea+80>>2];c[I+596+4>>2]=c[ea+80+4>>2];c[I+596+8>>2]=c[ea+80+8>>2];c[I+596+12>>2]=c[ea+80+12>>2];c[I+612>>2]=c[L>>2];c[I+612+4>>2]=c[L+4>>2];c[I+612+8>>2]=c[L+8>>2];c[I+612+12>>2]=c[L+12>>2];c[I+628>>2]=c[P>>2];c[I+628+4>>2]=c[P+4>>2];c[I+628+8>>2]=c[P+8>>2];c[I+628+12>>2]=c[P+12>>2];la=+g[ea+80>>2];v=+g[L>>2];A=+g[P>>2];ka=+g[ea+80+4>>2];w=+g[ea+80+20>>2];E=+g[ea+80+36>>2];ja=+g[ea+80+8>>2];y=+g[ea+80+24>>2];G=+g[ea+80+40>>2];p=+g[I+692>>2];o=+g[I+696>>2];m=+g[I+700>>2];ra=+g[I+708>>2];qa=+g[I+712>>2];q=+g[I+716>>2];B=+g[I+724>>2];F=+g[I+728>>2];u=+g[I+732>>2];pa=+g[ea+128>>2];oa=+g[ea+128+16>>2];r=+g[ea+128+32>>2];i=(la*p+ka*o+ja*m)*pa+(v*p+w*o+y*m)*oa+(A*p+E*o+G*m)*r;na=+g[ea+128+4>>2];ma=+g[ea+128+20>>2];s=+g[ea+128+36>>2];k=(la*p+ka*o+ja*m)*na+(v*p+w*o+y*m)*ma+(A*p+E*o+G*m)*s;ia=+g[ea+128+8>>2];z=+g[ea+128+24>>2];t=+g[ea+128+40>>2];m=(la*p+ka*o+ja*m)*ia+(v*p+w*o+y*m)*z+(A*p+E*o+G*m)*t;o=(la*ra+ka*qa+ja*q)*pa+(v*ra+w*qa+y*q)*oa+(A*ra+E*qa+G*q)*r;p=(la*ra+ka*qa+ja*q)*na+(v*ra+w*qa+y*q)*ma+(A*ra+E*qa+G*q)*s;q=(la*ra+ka*qa+ja*q)*ia+(v*ra+w*qa+y*q)*z+(A*ra+E*qa+G*q)*t;r=pa*(la*B+ka*F+ja*u)+oa*(v*B+w*F+y*u)+(A*B+E*F+G*u)*r;s=(la*B+ka*F+ja*u)*na+(v*B+w*F+y*u)*ma+(A*B+E*F+G*u)*s;t=(la*B+ka*F+ja*u)*ia+(v*B+w*F+y*u)*z+(A*B+E*F+G*u)*t;g[I+644>>2]=i;g[I+648>>2]=k;g[I+652>>2]=m;g[I+656>>2]=0.0;g[I+660>>2]=o;g[I+664>>2]=p;g[I+668>>2]=q;g[I+672>>2]=0.0;g[I+676>>2]=r;g[I+680>>2]=s;g[I+684>>2]=t;g[I+688>>2]=0.0;u=+g[I+424>>2];if(u>1.0){ra=1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))<1.0?1.0:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))>u?u:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)));g[I+644>>2]=i*ra;g[I+648>>2]=k*ra;g[I+652>>2]=m*ra;g[I+656>>2]=0.0;g[I+660>>2]=o*ra;g[I+664>>2]=p*ra;g[I+668>>2]=q*ra;g[I+672>>2]=0.0;g[I+676>>2]=r*ra;g[I+680>>2]=s*ra;g[I+684>>2]=ra*t;g[I+688>>2]=0.0}if(a[I+533>>0]|0?+g[I+380>>2]>0.0:0){i=+g[I+596>>2];p=+g[I+600>>2];q=+g[I+604>>2];r=+g[I+612>>2];s=+g[I+616>>2];t=+g[I+620>>2];k=+g[I+628>>2];m=+g[I+632>>2];o=+g[I+636>>2];f=c[I+772>>2]|0;if((f|0)<=0)break;e=0;do{h=c[I+780>>2]|0;if(+g[h+(e*104|0)+88>>2]>0.0){fa=c[I+552>>2]|0;ma=+g[fa+(e<<4)>>2];na=+g[fa+(e<<4)+4>>2];oa=+g[fa+(e<<4)+8>>2];la=+g[I+380>>2];fa=h+(e*104|0)+8|0;pa=+g[fa>>2];ga=h+(e*104|0)+12|0;qa=+g[ga>>2];ha=h+(e*104|0)+16|0;ra=+g[ha>>2];qa=qa+la*(r*ma+s*na+t*oa+ +g[I+584>>2]-qa);ra=ra+la*(k*ma+m*na+o*oa+ +g[I+588>>2]-ra);g[fa>>2]=pa+la*(+g[I+580>>2]+(i*ma+p*na+q*oa)-pa);g[ga>>2]=qa;g[ha>>2]=ra;g[h+(e*104|0)+20>>2]=0.0}e=e+1|0}while((e|0)!=(f|0))}}while(0);h=ea+128|0;n=h+104|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+872>>2]|0;if((e|0)<0){if((c[I+876>>2]|0)<0){f=c[I+880>>2]|0;if(f|0){if(a[I+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+880>>2]=0}a[I+884>>0]=1;c[I+880>>2]=0;c[I+876>>2]=0}do{ha=c[I+880>>2]|0;ga=ha+(e*104|0)|0;c[ga>>2]=c[ea+128>>2];c[ga+4>>2]=c[ea+128+4>>2];c[ga+8>>2]=c[ea+128+8>>2];c[ga+12>>2]=c[ea+128+12>>2];c[ga+16>>2]=c[ea+128+16>>2];c[ga+20>>2]=c[ea+128+20>>2];c[ga+24>>2]=c[ea+128+24>>2];ga=ha+(e*104|0)+28|0;c[ga>>2]=c[ea+128+28>>2];c[ga+4>>2]=c[ea+128+28+4>>2];c[ga+8>>2]=c[ea+128+28+8>>2];c[ga+12>>2]=c[ea+128+28+12>>2];ga=ha+(e*104|0)+44|0;c[ga>>2]=c[ea+128+44>>2];c[ga+4>>2]=c[ea+128+44+4>>2];c[ga+8>>2]=c[ea+128+44+8>>2];c[ga+12>>2]=c[ea+128+44+12>>2];ga=ha+(e*104|0)+60|0;c[ga>>2]=c[ea+128+60>>2];c[ga+4>>2]=c[ea+128+60+4>>2];c[ga+8>>2]=c[ea+128+60+8>>2];c[ga+12>>2]=c[ea+128+60+12>>2];ha=ha+(e*104|0)+76|0;c[ha>>2]=c[K>>2];c[ha+4>>2]=c[K+4>>2];c[ha+8>>2]=c[K+8>>2];c[ha+12>>2]=c[K+12>>2];c[ha+16>>2]=c[K+16>>2];c[ha+20>>2]=c[K+20>>2];c[ha+24>>2]=c[K+24>>2];e=e+1|0}while((e|0)!=0)}c[I+872>>2]=0;h=ea+128|0;n=h+56|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+892>>2]|0;if((e|0)<0){if((c[I+896>>2]|0)<0){f=c[I+900>>2]|0;if(f|0){if(a[I+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+900>>2]=0}a[I+904>>0]=1;c[I+900>>2]=0;c[I+896>>2]=0}do{h=(c[I+900>>2]|0)+(e*56|0)|0;f=ea+128|0;n=h+56|0;do{c[h>>2]=c[f>>2];h=h+4|0;f=f+4|0}while((h|0)<(n|0));e=e+1|0}while((e|0)!=0)}c[I+892>>2]=0;ng(I+988|0,1);ng(I+1028|0,1);ng(I+1068|0,1);e=c[b+24>>2]|0}}J=J+1|0}while((J|0)<(e|0));l=ea;return}function oc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0;Q=l;l=l+448|0;if(!(a[b+527>>0]|0)){l=Q;return}P=c[b+28>>2]|0;C=+g[b+348>>2];B=+g[b+352>>2];J=+g[b+356>>2];E=+g[P+52>>2];F=C*+g[P+4>>2]+B*+g[P+8>>2]+J*+g[P+12>>2]+E;G=+g[P+56>>2];H=C*+g[P+20>>2]+B*+g[P+24>>2]+J*+g[P+28>>2]+G;I=+g[P+60>>2];J=C*+g[P+36>>2]+B*+g[P+40>>2]+J*+g[P+44>>2]+I;P=c[b+32>>2]|0;B=+g[b+412>>2];C=+g[b+416>>2];r=+g[b+420>>2];k=+g[P+52>>2];m=B*+g[P+4>>2]+C*+g[P+8>>2]+r*+g[P+12>>2]+k;n=+g[P+56>>2];o=B*+g[P+20>>2]+C*+g[P+24>>2]+r*+g[P+28>>2]+n;q=+g[P+60>>2];r=B*+g[P+36>>2]+C*+g[P+40>>2]+r*+g[P+44>>2]+q;if(!(a[b+524>>0]|0)){A=+g[d+192>>2]+ +g[d+80>>2];B=+g[d+196>>2]+ +g[d+84>>2];z=+g[d+200>>2]+ +g[d+88>>2];C=+g[e+192>>2]+ +g[e+80>>2];y=+g[e+196>>2]+ +g[e+84>>2];w=+g[e+200>>2]+ +g[e+88>>2];s=+g[d+176>>2]+ +g[d+64>>2]+((J-I)*B-(H-G)*z)-(+g[e+176>>2]+ +g[e+64>>2]+((r-q)*y-(o-n)*w));w=+g[d+180>>2]+ +g[d+68>>2]+((F-E)*z-(J-I)*A)-(+g[e+180>>2]+ +g[e+68>>2]+((m-k)*w-(r-q)*C));y=+g[d+184>>2]+ +g[d+72>>2]+((H-G)*A-(F-E)*B)-(+g[e+184>>2]+ +g[e+72>>2]+((o-n)*C-(m-k)*y));t=(c[d+240>>2]|0)==0;p=0;do{C=1.0/+g[b+48+(p*84|0)+80>>2];u=b+48+(p*84|0)|0;B=+g[u>>2];v=b+48+(p*84|0)+4|0;A=+g[v>>2];x=b+48+(p*84|0)+8|0;z=+g[x>>2];z=C*(((F-m)*B+(H-o)*A+(J-r)*z)*-.30000001192092896/f)-C*(s*B+w*A+y*z);g[b+36>>2]=+g[b+36>>2]+z;A=+g[x>>2];B=+g[v>>2];C=+g[u>>2];h=c[b+28>>2]|0;i=+g[h+404>>2];if(!t){T=((H-G)*A-(J-I)*B)*+g[h+356>>2]+((J-I)*C-(F-E)*A)*+g[h+360>>2]+((F-E)*B-(H-G)*C)*+g[h+364>>2];R=((H-G)*A-(J-I)*B)*+g[h+340>>2]+((J-I)*C-(F-E)*A)*+g[h+344>>2]+((F-E)*B-(H-G)*C)*+g[h+348>>2];S=((H-G)*A-(J-I)*B)*+g[h+324>>2]+((J-I)*C-(F-E)*A)*+g[h+328>>2]+((F-E)*B-(H-G)*C)*+g[h+332>>2];V=z*B*i*+g[d+116>>2];U=z*A*i*+g[d+120>>2];g[d+64>>2]=z*C*i*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];R=R*z*+g[d+100>>2];i=T*z*+g[d+104>>2];g[d+80>>2]=S*z*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=R+ +g[d+84>>2];g[d+88>>2]=i+ +g[d+88>>2]}h=c[b+32>>2]|0;i=+g[h+404>>2];if(c[e+240>>2]|0){V=((o-n)*A-(r-q)*B)*+g[h+356>>2]+((r-q)*C-(m-k)*A)*+g[h+360>>2]+((m-k)*B-(o-n)*C)*+g[h+364>>2];U=((o-n)*A-(r-q)*B)*+g[h+340>>2]+((r-q)*C-(m-k)*A)*+g[h+344>>2]+((m-k)*B-(o-n)*C)*+g[h+348>>2];T=((o-n)*A-(r-q)*B)*+g[h+324>>2]+((r-q)*C-(m-k)*A)*+g[h+328>>2]+((m-k)*B-(o-n)*C)*+g[h+332>>2];R=i*+g[v>>2]*-z*+g[e+116>>2];S=i*+g[x>>2]*-z*+g[e+120>>2];g[e+64>>2]=+g[e+112>>2]*i*+g[u>>2]*-z+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-z;V=V*+g[e+104>>2]*-z;g[e+80>>2]=T*+g[e+96>>2]*-z+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2]}p=p+1|0}while((p|0)!=3)}do if(!(a[b+552>>0]|0)){i=+g[b+440>>2];if(!(i>1.1920928955078125e-07)){K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0;break}k=+g[e+192>>2]+ +g[e+80>>2]-(+g[d+192>>2]+ +g[d+80>>2]);m=+g[e+196>>2]+ +g[e+84>>2]-(+g[d+196>>2]+ +g[d+84>>2]);n=+g[e+200>>2]+ +g[e+88>>2]-(+g[d+200>>2]+ +g[d+88>>2]);if(k*k+m*m+n*n>1.1920928955078125e-07){E=1.0/+D(+(k*k+m*m+n*n));h=c[b+28>>2]|0;q=+g[h+324>>2];r=+g[h+340>>2];s=+g[h+356>>2];w=+g[h+328>>2];y=+g[h+344>>2];z=+g[h+360>>2];A=+g[h+332>>2];B=+g[h+348>>2];C=+g[h+364>>2];h=c[b+32>>2]|0;i=i*(1.0/(k*E*(q*k*E+m*E*r+n*E*s)+m*E*(k*E*w+m*E*y+n*E*z)+n*E*(k*E*A+m*E*B+n*E*C)+(k*E*(k*E*+g[h+324>>2]+m*E*+g[h+340>>2]+n*E*+g[h+356>>2])+m*E*(k*E*+g[h+328>>2]+m*E*+g[h+344>>2]+n*E*+g[h+360>>2])+n*E*(k*E*+g[h+332>>2]+m*E*+g[h+348>>2]+n*E*+g[h+364>>2]))));E=+D(+(n*i*n*i+(k*i*k*i+m*i*m*i)));o=1.0/E*k*i;k=1.0/E*m*i;i=1.0/E*n*i;if(c[d+240>>2]|0){V=E*0.0*+g[d+116>>2];U=E*0.0*+g[d+120>>2];g[d+64>>2]=E*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];U=(o*r+k*y+i*B)*E*+g[d+100>>2];V=(o*s+k*z+i*C)*E*+g[d+104>>2];g[d+80>>2]=(o*q+k*w+i*A)*E*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=U+ +g[d+84>>2];g[d+88>>2]=V+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){V=o*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];U=o*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];T=o*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];R=E*-0.0*+g[e+116>>2];S=E*-0.0*+g[e+120>>2];g[e+64>>2]=E*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-E;V=V*+g[e+104>>2]*-E;g[e+80>>2]=T*+g[e+96>>2]*-E+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2];K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{O=c[b+28>>2]|0;c[Q+352>>2]=c[O+4>>2];c[Q+352+4>>2]=c[O+4+4>>2];c[Q+352+8>>2]=c[O+4+8>>2];c[Q+352+12>>2]=c[O+4+12>>2];c[Q+352+16>>2]=c[O+20>>2];c[Q+352+16+4>>2]=c[O+20+4>>2];c[Q+352+16+8>>2]=c[O+20+8>>2];c[Q+352+16+12>>2]=c[O+20+12>>2];c[Q+352+32>>2]=c[O+36>>2];c[Q+352+32+4>>2]=c[O+36+4>>2];c[Q+352+32+8>>2]=c[O+36+8>>2];c[Q+352+32+12>>2]=c[O+36+12>>2];c[Q+352+48>>2]=c[O+52>>2];c[Q+352+48+4>>2]=c[O+52+4>>2];c[Q+352+48+8>>2]=c[O+52+8>>2];c[Q+352+48+12>>2]=c[O+52+12>>2];O=c[b+32>>2]|0;c[Q+288>>2]=c[O+4>>2];c[Q+288+4>>2]=c[O+4+4>>2];c[Q+288+8>>2]=c[O+4+8>>2];c[Q+288+12>>2]=c[O+4+12>>2];c[Q+288+16>>2]=c[O+20>>2];c[Q+288+16+4>>2]=c[O+20+4>>2];c[Q+288+16+8>>2]=c[O+20+8>>2];c[Q+288+16+12>>2]=c[O+20+12>>2];c[Q+288+32>>2]=c[O+36>>2];c[Q+288+32+4>>2]=c[O+36+4>>2];c[Q+288+32+8>>2]=c[O+36+8>>2];c[Q+288+32+12>>2]=c[O+36+12>>2];c[Q+288+48>>2]=c[O+52>>2];c[Q+288+48+4>>2]=c[O+52+4>>2];c[Q+288+48+8>>2]=c[O+52+8>>2];c[Q+288+48+12>>2]=c[O+52+12>>2];T=+g[d+196>>2]+ +g[d+84>>2];s=+g[d+200>>2]+ +g[d+88>>2];g[Q+272>>2]=+g[d+192>>2]+ +g[d+80>>2];g[Q+272+4>>2]=T;g[Q+272+8>>2]=s;g[Q+272+12>>2]=0.0;s=+g[e+196>>2]+ +g[e+84>>2];T=+g[e+200>>2]+ +g[e+88>>2];g[Q+256>>2]=+g[e+192>>2]+ +g[e+80>>2];g[Q+256+4>>2]=s;g[Q+256+8>>2]=T;g[Q+256+12>>2]=0.0;c[Q+192>>2]=1065353216;O=Q+192+4|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;c[Q+192+20>>2]=1065353216;P=Q+192+24|0;c[P>>2]=0;c[P+4>>2]=0;c[P+8>>2]=0;c[P+12>>2]=0;c[Q+192+40>>2]=1065353216;M=Q+192+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;Af(Q+352|0,0.0,0.0,0.0,Q+272|0,f,Q+192|0);c[Q+128>>2]=1065353216;M=Q+128+4|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[Q+128+20>>2]=1065353216;N=Q+128+24|0;c[N>>2]=0;c[N+4>>2]=0;c[N+8>>2]=0;c[N+12>>2]=0;c[Q+128+40>>2]=1065353216;L=Q+128+44|0;c[L>>2]=0;c[L+4>>2]=0;c[L+8>>2]=0;c[L+12>>2]=0;c[L+16>>2]=0;Af(Q+288|0,0.0,0.0,0.0,Q+256|0,f,Q+128|0);T=+g[b+556>>2];s=+g[b+560>>2];U=+g[b+564>>2];w=+g[b+568>>2];H=T*(2.0/(T*T+s*s+U*U+w*w));B=s*(2.0/(T*T+s*s+U*U+w*w));I=U*(2.0/(T*T+s*s+U*U+w*w));X=+g[b+364>>2];W=+g[b+368>>2];_=+g[b+372>>2];k=_*(T*I-w*B)+(W*(T*B+w*I)+X*(1.0-(s*B+U*I)));m=_*(s*I+w*H)+(X*(T*B-w*I)+W*(1.0-(T*H+U*I)));n=X*(T*I+w*B)+W*(s*I-w*H)+_*(1.0-(T*H+s*B));i=+g[b+380>>2];G=+g[b+384>>2];C=+g[b+388>>2];o=(T*I-w*B)*C+(G*(T*B+w*I)+i*(1.0-(s*B+U*I)));q=(s*I+w*H)*C+(i*(T*B-w*I)+G*(1.0-(T*H+U*I)));r=i*(T*I+w*B)+G*(s*I-w*H)+C*(1.0-(T*H+s*B));R=+g[b+396>>2];E=+g[b+400>>2];A=+g[b+404>>2];S=(1.0-(s*B+U*I))*R+(T*B+w*I)*E+(T*I-w*B)*A;U=(T*B-w*I)*R+(1.0-(T*H+U*I))*E+(s*I+w*H)*A;B=(T*I+w*B)*R+(s*I-w*H)*E+(1.0-(T*H+s*B))*A;s=+g[b+300>>2];H=+g[b+316>>2];T=+g[b+332>>2];w=+g[b+304>>2];I=+g[b+320>>2];V=+g[b+336>>2];F=+g[b+308>>2];J=+g[b+324>>2];z=+g[b+340>>2];y=-+g[b+348>>2];ba=-+g[b+352>>2];Z=-+g[b+356>>2];_=X*0.0+W*0.0+_*0.0+ +g[b+412>>2]+(n*(F*y+J*ba+z*Z)+(k*(s*y+H*ba+T*Z)+m*(w*y+I*ba+V*Z)));C=i*0.0+G*0.0+C*0.0+ +g[b+416>>2]+(r*(F*y+J*ba+z*Z)+(o*(s*y+H*ba+T*Z)+q*(w*y+I*ba+V*Z)));Z=R*0.0+E*0.0+A*0.0+ +g[b+420>>2]+(B*(F*y+J*ba+z*Z)+(S*(s*y+H*ba+T*Z)+U*(w*y+I*ba+V*Z)));ba=+g[Q+128>>2];y=+g[M>>2];A=+g[Q+128+8>>2];E=+g[Q+128+16>>2];R=+g[Q+128+20>>2];G=+g[N>>2];i=+g[Q+128+32>>2];W=+g[Q+128+36>>2];X=+g[Q+128+40>>2];Y=A*Z+(ba*_+y*C)+ +g[Q+128+48>>2];$=E*_+C*R+Z*G+ +g[Q+128+52>>2];aa=_*i+C*W+Z*X+ +g[Q+128+56>>2];g[Q+64>>2]=(k*s+m*w+n*F)*ba+(o*s+q*w+r*F)*y+(S*s+U*w+B*F)*A;g[Q+64+4>>2]=(k*H+m*I+n*J)*ba+(o*H+q*I+r*J)*y+(S*H+U*I+B*J)*A;g[Q+64+8>>2]=(k*T+m*V+n*z)*ba+(o*T+q*V+r*z)*y+(S*T+U*V+B*z)*A;g[Q+64+12>>2]=0.0;g[Q+64+16>>2]=(k*s+m*w+n*F)*E+(o*s+q*w+r*F)*R+(S*s+U*w+B*F)*G;g[Q+64+20>>2]=(k*H+m*I+n*J)*E+(o*H+q*I+r*J)*R+(S*H+U*I+B*J)*G;g[Q+64+24>>2]=(k*T+m*V+n*z)*E+(o*T+q*V+r*z)*R+(S*T+U*V+B*z)*G;g[Q+64+28>>2]=0.0;g[Q+64+32>>2]=(k*s+m*w+n*F)*i+(o*s+q*w+r*F)*W+(S*s+U*w+B*F)*X;g[Q+64+36>>2]=(k*H+m*I+n*J)*i+(o*H+q*I+r*J)*W+(S*H+U*I+B*J)*X;g[Q+64+40>>2]=(k*T+m*V+n*z)*i+(o*T+q*V+r*z)*W+(S*T+U*V+B*z)*X;g[Q+64+44>>2]=0.0;g[Q+64+48>>2]=Y;g[Q+64+52>>2]=$;g[Q+64+56>>2]=aa;g[Q+64+60>>2]=0.0;aa=(S*s+U*w+B*F)*-Z+((k*s+m*w+n*F)*-_+(o*s+q*w+r*F)*-C);$=(S*H+U*I+B*J)*-Z+((k*H+m*I+n*J)*-_+(o*H+q*I+r*J)*-C);C=(S*T+U*V+B*z)*-Z+((k*T+m*V+n*z)*-_+(o*T+q*V+r*z)*-C);_=+g[Q+192>>2];Z=+g[O>>2];Y=+g[Q+192+8>>2];X=+g[Q+192+16>>2];W=+g[Q+192+20>>2];i=+g[P>>2];G=+g[Q+192+32>>2];R=+g[Q+192+36>>2];E=+g[Q+192+40>>2];A=aa*_+$*Z+C*Y+ +g[Q+192+48>>2];y=aa*X+$*W+C*i+ +g[Q+192+52>>2];C=aa*G+$*R+C*E+ +g[Q+192+56>>2];g[Q>>2]=(k*s+m*w+n*F)*_+(k*H+m*I+n*J)*Z+(k*T+m*V+n*z)*Y;g[Q+4>>2]=(o*s+q*w+r*F)*_+(o*H+q*I+r*J)*Z+(o*T+q*V+r*z)*Y;g[Q+8>>2]=(S*s+U*w+B*F)*_+(S*H+U*I+B*J)*Z+(S*T+U*V+B*z)*Y;g[Q+12>>2]=0.0;g[Q+16>>2]=(k*s+m*w+n*F)*X+(k*H+m*I+n*J)*W+(k*T+m*V+n*z)*i;g[Q+20>>2]=(o*s+q*w+r*F)*X+(o*H+q*I+r*J)*W+(o*T+q*V+r*z)*i;g[Q+24>>2]=(S*s+U*w+B*F)*X+(S*H+U*I+B*J)*W+(S*T+U*V+B*z)*i;g[Q+28>>2]=0.0;g[Q+32>>2]=(k*s+m*w+n*F)*G+(k*H+m*I+n*J)*R+(k*T+m*V+n*z)*E;g[Q+36>>2]=(o*s+q*w+r*F)*G+(o*H+q*I+r*J)*R+(o*T+q*V+r*z)*E;g[Q+40>>2]=(S*s+U*w+B*F)*G+(S*H+U*I+B*J)*R+(S*T+U*V+B*z)*E;g[Q+44>>2]=0.0;g[Q+48>>2]=A;g[Q+52>>2]=y;g[Q+56>>2]=C;g[Q+60>>2]=0.0;If(Q+352|0,Q+64|0,Q+424|0,Q+416|0);C=+g[Q+416>>2];y=1.0/f*+g[Q+424>>2]*C;A=1.0/f*C*+g[Q+424+4>>2];C=1.0/f*C*+g[Q+424+8>>2];If(Q+288|0,Q,Q+424|0,Q+416|0);E=+g[Q+416>>2];y=y-+g[Q+272>>2];A=A-+g[Q+272+4>>2];C=C-+g[Q+272+8>>2];z=1.0/f*+g[Q+424>>2]*E-+g[Q+256>>2];B=1.0/f*E*+g[Q+424+4>>2]-+g[Q+256+4>>2];E=1.0/f*E*+g[Q+424+8>>2]-+g[Q+256+8>>2];if(y*y+A*A+C*C>1.1920928955078125e-07){s=1.0/+D(+(y*y+A*A+C*C));P=c[b+28>>2]|0;o=y*s*(+g[P+324>>2]*y*s+A*s*+g[P+340>>2]+C*s*+g[P+356>>2])+A*s*(y*s*+g[P+328>>2]+A*s*+g[P+344>>2]+C*s*+g[P+360>>2])+C*s*(y*s*+g[P+332>>2]+A*s*+g[P+348>>2]+C*s*+g[P+364>>2]);k=y*s;n=A*s;s=C*s}else{o=0.0;k=0.0;n=0.0;s=0.0}if(z*z+B*B+E*E>1.1920928955078125e-07){r=1.0/+D(+(z*z+B*B+E*E));P=c[b+32>>2]|0;q=z*r*(+g[P+324>>2]*z*r+B*r*+g[P+340>>2]+E*r*+g[P+356>>2])+B*r*(z*r*+g[P+328>>2]+B*r*+g[P+344>>2]+E*r*+g[P+360>>2])+E*r*(z*r*+g[P+332>>2]+B*r*+g[P+348>>2]+E*r*+g[P+364>>2]);i=z*r;m=B*r;r=E*r}else{q=0.0;i=0.0;m=0.0;r=0.0}w=o*k+q*i;k=o*n+q*m;i=o*s+q*r;if(w*w+k*k+i*i>1.1920928955078125e-07){n=1.0/+D(+(w*w+k*k+i*i));p=c[b+28>>2]|0;m=w*n*(+g[p+324>>2]*w*n+k*n*+g[p+340>>2]+i*n*+g[p+356>>2])+k*n*(w*n*+g[p+328>>2]+k*n*+g[p+344>>2]+i*n*+g[p+360>>2])+i*n*(w*n*+g[p+332>>2]+k*n*+g[p+348>>2]+i*n*+g[p+364>>2]);h=c[b+32>>2]|0;n=w*n*(w*n*+g[h+324>>2]+k*n*+g[h+340>>2]+i*n*+g[h+356>>2])+k*n*(w*n*+g[h+328>>2]+k*n*+g[h+344>>2]+i*n*+g[h+360>>2])+i*n*(w*n*+g[h+332>>2]+k*n*+g[h+348>>2]+i*n*+g[h+364>>2]);w=(y*m-z*n)*(1.0/((m+n)*(m+n)));i=(A*m-B*n)*(1.0/((m+n)*(m+n)));n=(C*m-E*n)*(1.0/((m+n)*(m+n)));k=+g[b+572>>2];if(!(k>=0.0))k=w;else{m=(a[b+553>>0]|0)==0?k:k/m;q=+g[b+576>>2];r=+g[b+580>>2];s=+g[b+584>>2];o=+D(+((w+q)*(w+q)+(i+r)*(i+r)+(n+s)*(n+s)));if(o>m){k=m*(w+q)*(1.0/o)-q;n=m*(n+s)*(1.0/o)-s;i=m*(i+r)*(1.0/o)-r}else k=w;g[b+576>>2]=k+q;g[b+580>>2]=i+r;g[b+584>>2]=n+s}o=+D(+(k*k+i*i+n*n));m=k*(1.0/o);k=i*(1.0/o);i=n*(1.0/o);if(c[d+240>>2]|0){ba=m*+g[p+356>>2]+k*+g[p+360>>2]+i*+g[p+364>>2];aa=m*+g[p+340>>2]+k*+g[p+344>>2]+i*+g[p+348>>2];$=m*+g[p+324>>2]+k*+g[p+328>>2]+i*+g[p+332>>2];Z=o*0.0*+g[d+116>>2];_=o*0.0*+g[d+120>>2];g[d+64>>2]=o*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*o*+g[d+100>>2];ba=ba*o*+g[d+104>>2];g[d+80>>2]=$*o*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=aa+ +g[d+84>>2];g[d+88>>2]=ba+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=o*-0.0*+g[e+116>>2];_=o*-0.0*+g[e+120>>2];g[e+64>>2]=o*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-o;ba=ba*+g[e+104>>2]*-o;g[e+80>>2]=$*+g[e+96>>2]*-o+ +g[e+80>>2];g[e+84>>2]=aa+ +g[e+84>>2];g[e+88>>2]=ba+ +g[e+88>>2]}}K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}while(0);z=+g[h>>2]+ +g[K>>2];y=+g[p>>2]+ +g[L>>2];w=+g[t>>2]+ +g[M>>2];s=+g[u>>2]+ +g[N>>2];r=+g[v>>2]+ +g[O>>2];q=+g[x>>2]+ +g[P>>2];if(a[b+526>>0]|0){k=+g[b+528>>2];i=k*+g[b+504>>2]*+g[b+432>>2]/f;m=+g[b+460>>2];n=+g[b+464>>2];o=+g[b+468>>2];if((s-z)*m+(r-y)*n+(q-w)*o>0.0)i=i+k*((s-z)*m+(r-y)*n+(q-w)*o)*+g[b+436>>2];aa=+g[b+516>>2];_=aa+i*+g[b+492>>2];g[Q+424>>2]=_;g[Q+416>>2]=0.0;h=c[(_>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+516>>2]=h;aa=(c[j>>2]=h,+g[j>>2])-aa;_=+g[b+536>>2];$=+g[b+540>>2];i=+g[b+544>>2];k=aa*m-_*(aa*m*_+aa*n*$+aa*o*i);ba=aa*n-$*(aa*m*_+aa*n*$+aa*o*i);n=aa*o-i*(aa*m*_+aa*n*$+aa*o*i);i=+D(+(n*n+(k*k+ba*ba)));k=1.0/i*k;m=1.0/i*ba;n=1.0/i*n;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*0.0*+g[d+116>>2];_=i*0.0*+g[d+120>>2];g[d+64>>2]=i*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*i*+g[d+100>>2];ba=ba*i*+g[d+104>>2];g[K>>2]=$*i*+g[d+96>>2]+ +g[K>>2];g[L>>2]=aa+ +g[L>>2];g[M>>2]=ba+ +g[M>>2]}h=c[b+32>>2]|0;if(c[e+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*-0.0*+g[e+116>>2];_=i*-0.0*+g[e+120>>2];g[e+64>>2]=i*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-i;ba=ba*+g[e+104>>2]*-i;g[N>>2]=$*+g[e+96>>2]*-i+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2]}}if(!(a[b+525>>0]|0)){l=Q;return}o=+g[b+532>>2];n=o*+g[b+508>>2]*+g[b+432>>2]/f;m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2];if((s-z)*m+(r-y)*k+(q-w)*i>0.0)n=n+o*((s-z)*m+(r-y)*k+(q-w)*i)*+g[b+436>>2];ba=+g[b+520>>2];n=ba+n*+g[b+496>>2];g[Q+424>>2]=n;g[Q+416>>2]=0.0;h=c[(n>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+520>>2]=h;n=(c[j>>2]=h,+g[j>>2])-ba;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];i=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];m=n*0.0*+g[d+116>>2];k=n*0.0*+g[d+120>>2];g[d+64>>2]=n*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=m+ +g[d+68>>2];g[d+72>>2]=k+ +g[d+72>>2];k=aa*n*+g[d+100>>2];m=ba*n*+g[d+104>>2];g[K>>2]=i*n*+g[d+96>>2]+ +g[K>>2];g[L>>2]=k+ +g[L>>2];g[M>>2]=m+ +g[M>>2];m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2]}h=c[b+32>>2]|0;if(!(c[e+240>>2]|0)){l=Q;return}ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=n*-0.0*+g[e+116>>2];_=n*-0.0*+g[e+120>>2];g[e+64>>2]=n*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-n;ba=ba*+g[e+104>>2]*-n;g[N>>2]=$*+g[e+96>>2]*-n+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2];l=Q;return}function pc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0.0,_=0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0;Ea=l;l=l+528|0;c[Ea+56>>2]=c[b>>2];c[Ea+8>>2]=c[b+64>>2];k=Ea+56+4|0;c[k>>2]=c[b+4>>2];c[Ea+8+4>>2]=c[b+68>>2];c[Ea+56+8>>2]=c[b+8>>2];c[Ea+8+8>>2]=c[b+72>>2];c[Ea+56+16>>2]=c[b+16>>2];c[Ea+8+16>>2]=c[b+80>>2];c[Ea+56+20>>2]=c[b+20>>2];c[Ea+8+20>>2]=c[b+84>>2];c[Ea+56+24>>2]=c[b+24>>2];c[Ea+8+24>>2]=c[b+88>>2];c[Ea+56+32>>2]=c[b+32>>2];c[Ea+8+32>>2]=c[b+96>>2];c[Ea+56+36>>2]=c[b+36>>2];c[Ea+8+36>>2]=c[b+100>>2];c[Ea+56+40>>2]=c[b+40>>2];c[Ea+8+40>>2]=c[b+104>>2];Aa=c[a+4>>2]|0;ia=+g[Aa+32>>2];ja=+g[Aa+36>>2];ma=+g[Aa+40>>2];ka=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);la=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);ma=(ma+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;Aa=c[a+8>>2]|0;qa=+g[Aa+32>>2];ra=+g[Aa+36>>2];wa=+g[Aa+40>>2];ta=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);sa=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);wa=(wa+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;R=+g[b+112>>2]-+g[b+48>>2];S=+g[b+116>>2]-+g[b+52>>2];T=+g[b+120>>2]-+g[b+56>>2];da=+g[Ea+56>>2];ba=+g[Ea+56+16>>2];ca=+g[Ea+56+32>>2];aa=+g[k>>2];Z=+g[Ea+56+20>>2];$=+g[Ea+56+36>>2];fa=+g[Ea+56+8>>2];ha=+g[Ea+56+24>>2];na=+g[Ea+56+40>>2];g[Ea+412>>2]=(ia+ka)*2.0*.5;g[Ea+412+4>>2]=(ja+la)*2.0*.5;g[Ea+412+8>>2]=ma*.5;g[Ea+400>>2]=(qa+ta)*2.0*.5;g[Ea+400+4>>2]=(ra+sa)*2.0*.5;g[Ea+400+8>>2]=wa*.5;za=+g[Ea+8>>2];pa=+g[Ea+8+16>>2];va=+g[Ea+8+32>>2];ya=+g[Ea+8+4>>2];oa=+g[Ea+8+20>>2];ua=+g[Ea+8+36>>2];xa=+g[Ea+8+8>>2];Ba=+g[Ea+8+24>>2];Ca=+g[Ea+8+40>>2];B=+C(+(da*za+ba*pa+ca*va));O=+C(+(da*ya+ba*oa+ca*ua));U=+C(+(da*xa+ba*Ba+ca*Ca));N=+C(+(za*aa+pa*Z+va*$));P=+C(+(ya*aa+oa*Z+ua*$));V=+C(+(xa*aa+Ba*Z+Ca*$));W=+C(+(za*fa+pa*ha+va*na));X=+C(+(ya*fa+oa*ha+ua*na));Q=+C(+(xa*fa+Ba*ha+Ca*na));i=+C(+(R*da+S*ba+T*ca))-(wa*.5*U+((ia+ka)*2.0*.5+B*(qa+ta)*2.0*.5+O*(ra+sa)*2.0*.5));if(i>0.0){l=Ea;return}if(i>-3402823466385288598117041.0e14){a=Ea+56|0;e=1;f=R*da+S*ba+T*ca<0.0&1}else{a=0;e=0;f=0;i=-3402823466385288598117041.0e14}h=+C(+(R*aa+S*Z+T*$))-((ja+la)*2.0*.5+N*(qa+ta)*2.0*.5+P*(ra+sa)*2.0*.5+V*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=k;e=2;f=R*aa+S*Z+T*$<0.0&1;i=h}h=+C(+(R*fa+S*ha+T*na))-(ma*.5+W*(qa+ta)*2.0*.5+X*(ra+sa)*2.0*.5+Q*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=Ea+56+8|0;e=3;f=R*fa+S*ha+T*na<0.0&1;i=h}h=+C(+(R*za+S*pa+T*va))-((qa+ta)*2.0*.5+(B*(ia+ka)*2.0*.5+N*(ja+la)*2.0*.5+W*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8|0;e=4;f=R*za+S*pa+T*va<0.0&1;i=h}h=+C(+(R*ya+S*oa+T*ua))-((ra+sa)*2.0*.5+(O*(ia+ka)*2.0*.5+P*(ja+la)*2.0*.5+X*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+4|0;e=5;f=R*ya+S*oa+T*ua<0.0&1;i=h}h=+C(+(R*xa+S*Ba+T*Ca))-(wa*.5+(U*(ia+ka)*2.0*.5+V*(ja+la)*2.0*.5+Q*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+8|0;e=6;f=R*xa+S*Ba+T*Ca<0.0&1;i=h}h=(R*fa+S*ha+T*na)*(za*aa+pa*Z+va*$)-(R*aa+S*Z+T*$)*(za*fa+pa*ha+va*na);n=+C(+h)-((W+9.999999747378752e-06)*(ja+la)*2.0*.5+(N+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(ra+sa)*2.0*.5+(O+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}s=(za*fa+pa*ha+va*na)*(za*fa+pa*ha+va*na)+0.0;x=(za*aa+pa*Z+va*$)*(za*aa+pa*Z+va*$);q=+D(+(x+s));if(q>1.1920928955078125e-07?n/q*1.0499999523162842>i:0){a=0;e=7;f=h<0.0&1;i=n/q;p=0.0/q;o=-(za*fa+pa*ha+va*na)/q;h=(za*aa+pa*Z+va*$)/q}else{p=0.0;o=0.0;h=0.0}n=(R*fa+S*ha+T*na)*(ya*aa+oa*Z+ua*$)-(R*aa+S*Z+T*$)*(ya*fa+oa*ha+ua*na);q=+C(+n)-((X+9.999999747378752e-06)*(ja+la)*2.0*.5+(P+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}t=(ya*fa+oa*ha+ua*na)*(ya*fa+oa*ha+ua*na)+0.0;y=(ya*aa+oa*Z+ua*$)*(ya*aa+oa*Z+ua*$);r=+D(+(y+t));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=8;f=n<0.0&1;i=q/r;p=0.0/r;o=-(ya*fa+oa*ha+ua*na)/r;h=(ya*aa+oa*Z+ua*$)/r}n=(R*fa+S*ha+T*na)*(xa*aa+Ba*Z+Ca*$)-(R*aa+S*Z+T*$)*(xa*fa+Ba*ha+Ca*na);q=+C(+n)-((Q+9.999999747378752e-06)*(ja+la)*2.0*.5+(V+9.999999747378752e-06)*ma*.5+(O+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}v=(xa*fa+Ba*ha+Ca*na)*(xa*fa+Ba*ha+Ca*na)+0.0;z=(xa*aa+Ba*Z+Ca*$)*(xa*aa+Ba*Z+Ca*$);r=+D(+(z+v));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=9;f=n<0.0&1;i=q/r;p=0.0/r;o=-(xa*fa+Ba*ha+Ca*na)/r;h=(xa*aa+Ba*Z+Ca*$)/r}n=(R*da+S*ba+T*ca)*(za*fa+pa*ha+va*na)-(R*fa+S*ha+T*na)*(da*za+ba*pa+ca*va);q=+C(+n)-((W+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(ra+sa)*2.0*.5+(P+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}w=(da*za+ba*pa+ca*va)*(da*za+ba*pa+ca*va);r=+D(+(w+s));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=10;f=n<0.0&1;i=q/r;p=(za*fa+pa*ha+va*na)/r;o=0.0/r;h=-(da*za+ba*pa+ca*va)/r}while(0);n=(R*da+S*ba+T*ca)*(ya*fa+oa*ha+ua*na)-(R*fa+S*ha+T*na)*(da*ya+ba*oa+ca*ua);q=+C(+n)-((X+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}u=(da*ya+ba*oa+ca*ua)*(da*ya+ba*oa+ca*ua);r=+D(+(u+t));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=11;f=n<0.0&1;i=q/r;p=(ya*fa+oa*ha+ua*na)/r;o=0.0/r;h=-(da*ya+ba*oa+ca*ua)/r}while(0);n=(R*da+S*ba+T*ca)*(xa*fa+Ba*ha+Ca*na)-(R*fa+S*ha+T*na)*(da*xa+ba*Ba+ca*Ca);q=+C(+n)-((Q+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*ma*.5+(P+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}s=(da*xa+ba*Ba+ca*Ca)*(da*xa+ba*Ba+ca*Ca);r=+D(+(s+v));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=12;f=n<0.0&1;i=q/r;p=(xa*fa+Ba*ha+Ca*na)/r;o=0.0/r;h=-(da*xa+ba*Ba+ca*Ca)/r}while(0);q=(R*aa+S*Z+T*$)*(da*za+ba*pa+ca*va)-(R*da+S*ba+T*ca)*(za*aa+pa*Z+va*$);n=+C(+q)-((N+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(ra+sa)*2.0*.5+(X+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}r=+D(+(w+x+0.0));do if(r>1.1920928955078125e-07){if(!(n/r*1.0499999523162842>i))break;a=0;e=13;f=q<0.0&1;i=n/r;p=-(za*aa+pa*Z+va*$)/r;o=(da*za+ba*pa+ca*va)/r;h=0.0/r}while(0);r=(R*aa+S*Z+T*$)*(da*ya+ba*oa+ca*ua)-(R*da+S*ba+T*ca)*(ya*aa+oa*Z+ua*$);n=+C(+r)-((P+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(u+y+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i))break;a=0;e=14;f=r<0.0&1;i=n/q;p=-(ya*aa+oa*Z+ua*$)/q;o=(da*ya+ba*oa+ca*ua)/q;h=0.0/q}while(0);r=(R*aa+S*Z+T*$)*(da*xa+ba*Ba+ca*Ca)-(R*da+S*ba+T*ca)*(xa*aa+Ba*Z+Ca*$);n=+C(+r)-((V+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*(ja+la)*2.0*.5+(X+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(s+z+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i)){Aa=55;break}e=15;f=r<0.0&1;i=n/q;p=-(xa*aa+Ba*Z+Ca*$)/q;o=(da*xa+ba*Ba+ca*Ca)/q;h=0.0/q;Aa=58}else Aa=55;while(0);do if((Aa|0)==55){if(!e){l=Ea;return}if(!a){Aa=58;break}m=c[a>>2]|0;c[Ea>>2]=m;ga=c[a+16>>2]|0;n=(c[j>>2]=m,+g[j>>2]);m=e;B=i;e=ga;i=(c[j>>2]=ga,+g[j>>2]);h=+g[a+32>>2]}while(0);if((Aa|0)==58){n=p*+g[Ea+56>>2]+o*+g[k>>2]+h*fa;g[Ea>>2]=n;Da=p*+g[Ea+56+16>>2]+o*+g[Ea+56+20>>2]+h*ha;m=e;B=i;e=(g[j>>2]=Da,c[j>>2]|0);i=Da;h=p*+g[Ea+56+32>>2]+o*+g[Ea+56+36>>2]+h*na}if(!f)Da=h;else{n=-n;g[Ea>>2]=n;Da=-h;e=(g[j>>2]=-i,c[j>>2]|0)}if((m|0)>6){z=(c[j>>2]=e,+g[j>>2]);i=+g[Ea+56>>2];t=+g[Ea+56+16>>2];v=+g[Ea+56+32>>2];u=(n*i+z*t+Da*v>0.0?1.0:-1.0)*(ia+ka)*2.0*.5;y=+g[k>>2];x=+g[Ea+56+20>>2];h=+g[Ea+56+36>>2];s=(n*y+z*x+Da*h>0.0?1.0:-1.0)*(ja+la)*2.0*.5;w=(n*fa+z*ha+Da*na>0.0?1.0:-1.0)*ma*.5;y=+g[b+48>>2]+u*i+s*y+w*fa;x=+g[b+52>>2]+u*t+s*x+w*ha;w=+g[b+56>>2]+u*v+s*h+w*na;c[Ea+456>>2]=c[b+112>>2];c[Ea+456+4>>2]=c[b+112+4>>2];c[Ea+456+8>>2]=c[b+112+8>>2];h=(n*za+z*pa+Da*va>0.0?-1.0:1.0)*(qa+ta)*2.0*.5;s=(n*ya+z*oa+Da*ua>0.0?-1.0:1.0)*(ra+sa)*2.0*.5;v=+g[Ea+456+4>>2]+h*pa+s*oa;u=+g[Ea+456+8>>2]+h*va+s*ua;t=(n*xa+z*Ba+Da*Ca>0.0?-1.0:1.0)*wa*.5;s=+g[Ea+456>>2]+h*za+s*ya+t*xa;g[Ea+456>>2]=s;g[Ea+456+4>>2]=v+t*Ba;g[Ea+456+8>>2]=u+t*Ca;Aa=m+-7|0;h=+g[Ea+56+(((Aa|0)/3|0)<<2)>>2];i=+g[Ea+56+(((Aa|0)/3|0)+4<<2)>>2];n=+g[Ea+56+(((Aa|0)/3|0)+8<<2)>>2];p=+g[Ea+8+(((Aa|0)%3|0)<<2)>>2];q=+g[Ea+8+(((Aa|0)%3|0)+4<<2)>>2];r=+g[Ea+8+(((Aa|0)%3|0)+8<<2)>>2];o=1.0-(h*p+i*q+n*r)*(h*p+i*q+n*r);if(!(o<=9.999999747378752e-05))h=(((s-y)*h+(v+t*Ba-x)*i+(u+t*Ca-w)*n)*(h*p+i*q+n*r)-((s-y)*p+(v+t*Ba-x)*q+(u+t*Ca-w)*r))*(1.0/o);else h=0.0;g[Ea+456>>2]=s+h*p;g[Ea+456+4>>2]=v+t*Ba+h*q;g[Ea+456+8>>2]=u+t*Ca+h*r;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-z;g[Ea+424+8>>2]=-Da;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,B);l=Ea;return}ea=(m|0)<4;ga=ea?b+48|0:b+112|0;f=ea?b+112|0:b+48|0;a=ea?Ea+56|0:Ea+8|0;_=ea?Ea+8|0:Ea+56|0;M=ea?Ea+412|0:Ea+400|0;k=ea?Ea+400|0:Ea+412|0;fa=(c[j>>2]=e,+g[j>>2]);if(ea){da=Da;ba=n;ca=fa}else{da=-Da;ba=-n;ca=-fa}U=ba*+g[_>>2]+ca*+g[_+16>>2]+da*+g[_+32>>2];g[Ea+384>>2]=U;V=ba*+g[_+4>>2]+ca*+g[_+20>>2]+da*+g[_+36>>2];g[Ea+384+4>>2]=V;W=ba*+g[_+8>>2]+ca*+g[_+24>>2]+da*+g[_+40>>2];g[Ea+384+8>>2]=W;U=+C(+U);V=+C(+V);W=+C(+W);e=V>U?(V>W?1:2):U>W?0:2;Y=(V>U?V>W:U>W)?2:1;n=+g[k+(e<<2)>>2];h=+g[f>>2]-+g[ga>>2];i=n*+g[_+(e<<2)>>2];o=+g[f+4>>2];p=+g[ga+4>>2];if(+g[Ea+384+(e<<2)>>2]<0.0){aa=+g[f+8>>2]-+g[ga+8>>2]+n*+g[_+((e|8)<<2)>>2];$=h+i;Z=o-p+n*+g[_+((e|4)<<2)>>2]}else{aa=+g[f+8>>2]-+g[ga+8>>2]-n*+g[_+((e|8)<<2)>>2];$=h-i;Z=o-p-n*+g[_+((e|4)<<2)>>2]}J=(ea?-1:-4)+m|0;switch(J|0){case 0:{e=2;f=1;break}case 1:{e=2;f=0;break}default:{e=1;f=0}}K=a+(f<<2)|0;T=+g[K>>2];R=+g[K+16>>2];S=+g[K+32>>2];X=$*T+Z*R+aa*S;K=a+(e<<2)|0;N=+g[K>>2];v=+g[K+16>>2];w=+g[K+32>>2];Q=$*N+Z*v+aa*w;K=_+((U>W&(V>U^1)&1)<<2)|0;P=+g[K>>2];z=+g[K+16>>2];B=+g[K+32>>2];O=+g[_+(Y<<2)>>2];x=+g[_+(Y<<2)+16>>2];y=+g[_+(Y<<2)+32>>2];Ba=+g[k+((U>W&(V>U^1)&1)<<2)>>2];Ca=+g[k+(Y<<2)>>2];za=(T*O+R*x+S*y)*Ca;Ca=(N*O+v*x+w*y)*Ca;g[Ea+352>>2]=X-(T*P+R*z+S*B)*Ba-za;g[Ea+352+4>>2]=Q-(N*P+v*z+w*B)*Ba-Ca;g[Ea+352+8>>2]=X-(T*P+R*z+S*B)*Ba+za;g[Ea+352+12>>2]=Q-(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+16>>2]=X+(T*P+R*z+S*B)*Ba+za;g[Ea+352+20>>2]=Q+(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+24>>2]=X+(T*P+R*z+S*B)*Ba-za;g[Ea+352+28>>2]=Q+(N*P+v*z+w*B)*Ba-Ca;c[Ea+344>>2]=c[M+(f<<2)>>2];c[Ea+344+4>>2]=c[M+(e<<2)>>2];H=0;I=Ea+280|0;e=Ea+352|0;f=4;a:while(1){F=Ea+344+(H<<2)|0;G=1-H|0;do if((f|0)>0){a=I;E=e;k=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(i>-h){c[a>>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];k=k+1|0;if(k&8|0){e=I;f=k;break a}a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(f|0)>1;m=E;E=E+8|0;b=A?E:e;n=+g[b+(H<<2)>>2];if(i>-h^i>-n){Ca=+g[m+(G<<2)>>2];g[a+(G<<2)>>2]=Ca+(-i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));g[a+(H<<2)>>2]=-+g[F>>2];k=k+1|0;if(!(k&8))a=a+8|0;else{e=I;f=k;break a}}if(!A)break;else f=f+-1|0}e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0;if((k|0)<=0){f=0;break}a=e;E=I;f=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(h>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];f=f+1|0;if(f&8|0)break a;a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(k|0)>1;m=E;E=E+8|0;b=A?E:I;n=+g[b+(H<<2)>>2];if(h>2];g[a+(G<<2)>>2]=Ca+(i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));c[a+(H<<2)>>2]=c[F>>2];f=f+1|0;if(!(f&8))a=a+8|0;else break a}if(!A)break;else k=k+-1|0}}else{f=0;e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}while(0);H=H+1|0;if((H|0)>=2)break;else I=(e|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}if((e|0)!=(Ea+280|0))gi(Ea+280|0,e|0,f<<3|0)|0;if((f|0)>=1){u=1.0/((T*P+R*z+S*B)*(N*O+v*x+w*y)-(N*P+v*z+w*B)*(T*O+R*x+S*y));t=+g[M+(J<<2)>>2];p=+g[K>>2];q=+g[_+(Y<<2)>>2];r=+g[_+((U>W&(V>U^1)&1|4)<<2)>>2];s=+g[_+((Y|4)<<2)>>2];o=+g[_+((U>W&(V>U^1)&1|8)<<2)>>2];n=+g[_+((Y|8)<<2)>>2];b=0;a=0;do{e=a<<1;i=+g[Ea+280+(e<<2)>>2];h=+g[Ea+280+((e|1)<<2)>>2];ya=(N*O+v*x+w*y)*u*(i-X)-(T*O+R*x+S*y)*u*(h-Q);Ca=(T*P+R*z+S*B)*u*(h-Q)-(N*P+v*z+w*B)*u*(i-X);e=b*3|0;za=$+ya*p+Ca*q;g[Ea+184+(e<<2)>>2]=za;Ba=Z+ya*r+Ca*s;g[Ea+184+(e+1<<2)>>2]=Ba;Ca=aa+ya*o+Ca*n;g[Ea+184+(e+2<<2)>>2]=Ca;Ca=t-(ba*za+ca*Ba+da*Ca);g[Ea+152+(b<<2)>>2]=Ca;e=b<<1;if(Ca>=0.0){g[Ea+280+(e<<2)>>2]=i;g[Ea+280+((e|1)<<2)>>2]=h;b=b+1|0}a=a+1|0}while((a|0)!=(f|0));b:do if((b|0)>=1){A=(b|0)<4?b:4;E=(A|0)>1?A:1;if((b|0)<=(E|0))if(ea){h=-Da;e=0;while(1){Aa=e*3|0;g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2];Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(e<<2)>>2]);e=e+1|0;if((e|0)==(b|0))break b}}else{h=-Da;e=0;while(1){Aa=e*3|0;Ca=+g[Ea+152+(e<<2)>>2];Ba=+g[Ea>>2];g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2]-Ba*Ca;g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2]-fa*Ca;g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2]-Da*Ca;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-Ba;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-Ca);e=e+1|0;if((e|0)==(b|0))break b}}c:do if((b|0)>1){h=+g[Ea+152>>2];e=0;f=1;while(1){i=+g[Ea+152+(f<<2)>>2];a=i>h;e=a?f:e;f=f+1|0;if((f|0)==(b|0))break;else h=a?i:h}switch(b|0){case 1:{f=1;a=Ea+120|0;k=Ea+120|0;Aa=111;break c}case 2:{h=(+g[Ea+280+4>>2]+ +g[Ea+280+12>>2])*.5;i=(+g[Ea+280>>2]+ +g[Ea+280+8>>2])*.5;f=2;a=Ea+120|0;k=Ea+120|0;Aa=114;break c}default:{}}a=b+-1|0;r=0.0;s=0.0;h=0.0;f=0;do{_=f<<1;ya=+g[Ea+280+(_<<2)>>2];za=+g[Ea+280+(_+3<<2)>>2];Ba=+g[Ea+280+(_+2<<2)>>2];Ca=+g[Ea+280+((_|1)<<2)>>2];h=h+(ya*za-Ba*Ca);s=s+(ya+Ba)*(ya*za-Ba*Ca);r=r+(za+Ca)*(ya*za-Ba*Ca);f=f+1|0}while((f|0)!=(a|0));_=b<<1;n=+g[Ea+280+(_+-2<<2)>>2];o=+g[Ea+280+4>>2];p=+g[Ea+280>>2];q=+g[Ea+280+(_+-1<<2)>>2];i=h+(n*o-p*q);_=+C(+i)>1.1920928955078125e-07;i=_?1.0/(i*3.0):999999984306749440.0;if((b|0)>0){h=i*(r+(n*o-p*q)*(q+o));i=i*(s+(n*o-p*q)*(n+p));a=Ea+120|0;k=Ea+120|0;m=Ea+456|0;Aa=117;break}m=e;e=Ea+120|0;f=0}else{e=0;f=b;a=Ea+120|0;k=Ea+120|0;Aa=111}while(0);if((Aa|0)==111){h=+g[Ea+280+4>>2];i=+g[Ea+280>>2];Aa=114}if((Aa|0)==114){b=f;m=Ea+456|0;Aa=117}if((Aa|0)==117){f=0;do{Aa=f<<1;g[Ea+456+(f<<2)>>2]=+L(+(+g[Ea+280+((Aa|1)<<2)>>2]-h),+(+g[Ea+280+(Aa<<2)>>2]-i));f=f+1|0}while((f|0)!=(b|0));f=0;do{c[Ea+424+(f<<2)>>2]=1;f=f+1|0}while((f|0)!=(b|0));m=e;e=a;f=1}a=Ea+424+(m<<2)|0;c[a>>2]=0;c[e>>2]=m;d:do if((A|0)>1){o=+g[Ea+456+(m<<2)>>2];if(f){f=1;a=Ea+120+4|0}else{e=1;f=Ea+120+4|0;while(1){c[f>>2]=m;c[a>>2]=0;e=e+1|0;if((e|0)==(E|0))break d;else f=f+4|0}}while(1){n=6.2831854820251465/+(E|0)*+(f|0)+o;n=n>3.1415927410125732?n+-6.2831854820251465:n;c[a>>2]=m;i=1.0e9;k=0;e=m;while(1){do if(!(c[Ea+424+(k<<2)>>2]|0))h=i;else{h=+C(+(+g[Ea+456+(k<<2)>>2]-n));h=h>3.1415927410125732?6.2831854820251465-h:h;if(!(h>2]=k;e=k}while(0);k=k+1|0;if((k|0)==(b|0))break;else i=h}c[Ea+424+(e<<2)>>2]=0;f=f+1|0;if((f|0)==(E|0))break;else a=a+4|0}}while(0);if((E|0)>0){h=-Da;if(ea){e=0;do{Aa=c[Ea+120+(e<<2)>>2]|0;g[Ea+456>>2]=+g[Ea+184+(Aa*3<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+((Aa*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+((Aa*3|0)+2<<2)>>2]+ +g[ga+8>>2];ea=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[ea&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(Aa<<2)>>2]);e=e+1|0}while((e|0)<(E|0))}else{e=0;do{ea=c[Ea+120+(e<<2)>>2]|0;xa=+g[Ea+184+(ea*3<<2)>>2]+ +g[ga>>2];g[Ea+456>>2]=xa;za=+g[Ea+184+((ea*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+4>>2]=za;Ba=+g[Ea+184+((ea*3|0)+2<<2)>>2]+ +g[ga+8>>2];g[Ea+456+8>>2]=Ba;Aa=c[(c[d>>2]|0)+16>>2]|0;ya=+g[Ea>>2];g[Ea+424>>2]=-ya;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Ca=+g[Ea+152+(ea<<2)>>2];g[Ea+104>>2]=xa-ya*Ca;g[Ea+104+4>>2]=za-Ca*fa;g[Ea+104+8>>2]=Ba-Ca*Da;g[Ea+104+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+104|0,-Ca);e=e+1|0}while((e|0)<(E|0))}}}while(0)}l=Ea;return}function qc(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0;Y=l;l=l+256|0;c[b+188>>2]=-1;m=c[k+72>>2]|0;if((m|0)!=(c[b+224>>2]|0)){c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;c[b+224>>2]=m}c[b+184>>2]=0;if((e|0)>0){m=0;do{c[(c[d+(m<<2)>>2]|0)+212>>2]=-1;m=m+1|0}while((m|0)!=(e|0))}m=c[b+12>>2]|0;if((m|0)>(e|0)){o=b+8|0;n=m}else{if((e+1|0)!=0?(c[6995]=(c[6995]|0)+1,n=sc(((e+1|0)*244|3)+16|0)|0,(n|0)!=0):0){c[(n+4+15&-16)+-4>>2]=n;o=n+4+15&-16}else o=0;n=c[b+8>>2]|0;if((n|0)>0){m=0;do{V=o+(m*244|0)|0;W=c[b+16>>2]|0;U=W+(m*244|0)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=W+(m*244|0)+16|0;U=o+(m*244|0)+16|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];U=W+(m*244|0)+32|0;V=o+(m*244|0)+32|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=o+(m*244|0)+48|0;U=W+(m*244|0)+48|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];gi(o+(m*244|0)+64|0,W+(m*244|0)+64|0,180)|0;m=m+1|0}while((m|0)!=(n|0))}m=c[b+16>>2]|0;if(m|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=o;c[b+12>>2]=e+1;o=b+8|0;n=e+1|0}Yk(Y|0,0,244)|0;m=c[o>>2]|0;if((m|0)<0){if((n|0)<0){n=c[b+16>>2]|0;if(n|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0}do{W=c[b+16>>2]|0;V=W+(m*244|0)|0;c[V>>2]=c[Y>>2];c[V+4>>2]=c[Y+4>>2];c[V+8>>2]=c[Y+8>>2];c[V+12>>2]=c[Y+12>>2];V=W+(m*244|0)+16|0;c[V>>2]=c[Y+16>>2];c[V+4>>2]=c[Y+16+4>>2];c[V+8>>2]=c[Y+16+8>>2];c[V+12>>2]=c[Y+16+12>>2];V=W+(m*244|0)+32|0;c[V>>2]=c[Y+32>>2];c[V+4>>2]=c[Y+32+4>>2];c[V+8>>2]=c[Y+32+8>>2];c[V+12>>2]=c[Y+32+12>>2];V=W+(m*244|0)+48|0;c[V>>2]=c[Y+48>>2];c[V+4>>2]=c[Y+48+4>>2];c[V+8>>2]=c[Y+48+8>>2];c[V+12>>2]=c[Y+48+12>>2];gi(W+(m*244|0)+64|0,Y+64|0,180)|0;m=m+1|0}while((m|0)!=0)}c[o>>2]=0;if((e|0)>0){n=0;do{p=d+(n<<2)|0;o=Rj(b,c[p>>2]|0,+g[k+12>>2])|0;p=c[p>>2]|0;if(!((p|0)==0?1:(c[p+252>>2]&2|0)==0)?+g[p+404>>2]!=0.0:0){r=c[b+16>>2]|0;m=c[p+564>>2]|0;if(m&2){q=+g[k+84>>2];M=+g[p+456>>2];O=+g[p+460>>2];s=+g[p+464>>2];G=+g[p+4>>2];M=M!=0.0?1.0/M:0.0;H=+g[p+8>>2];O=O!=0.0?1.0/O:0.0;I=+g[p+12>>2];s=s!=0.0?1.0/s:0.0;J=+g[p+20>>2];K=+g[p+24>>2];L=+g[p+28>>2];N=+g[p+36>>2];P=+g[p+40>>2];v=+g[p+44>>2];w=+g[p+388>>2];x=+g[p+392>>2];u=+g[p+396>>2];y=(M*G*G+O*H*H+s*I*I)*w+(M*G*J+O*H*K+s*I*L)*x+(M*G*N+O*H*P+s*I*v)*u;z=(M*J*G+O*K*H+s*L*I)*w+(M*J*J+O*K*K+s*L*L)*x+(M*J*N+O*K*P+s*L*v)*u;v=(M*N*G+O*P*H+s*v*I)*w+(M*N*J+O*P*K+s*v*L)*x+(M*N*N+O*P*P+s*v*v)*u;s=(x*v-u*z)*(x*v-u*z)+(u*y-w*v)*(u*y-w*v)+(w*z-x*y)*(w*z-x*y);if(s>q*q){q=1.0/+D(+s)*q;t=(x*v-u*z)*q;s=q*(u*y-w*v);q=q*(w*z-x*y)}else{t=x*v-u*z;s=u*y-w*v;q=w*z-x*y}N=+g[k+12>>2];O=(t*+g[p+328>>2]+s*+g[p+344>>2]+q*+g[p+360>>2])*N;P=N*(t*+g[p+332>>2]+s*+g[p+348>>2]+q*+g[p+364>>2]);g[r+(o*244|0)+224>>2]=+g[r+(o*244|0)+224>>2]-(t*+g[p+324>>2]+s*+g[p+340>>2]+q*+g[p+356>>2])*N;g[r+(o*244|0)+228>>2]=+g[r+(o*244|0)+228>>2]-O;g[r+(o*244|0)+232>>2]=+g[r+(o*244|0)+232>>2]-P;m=c[p+564>>2]|0}if(m&4){H=+g[k+12>>2];s=+g[p+456>>2];N=+g[p+460>>2];L=+g[p+464>>2];E=+g[p+388>>2];x=+g[p+392>>2];P=+g[p+396>>2];K=+g[p+4>>2];s=s!=0.0?1.0/s:0.0;w=+g[p+8>>2];N=N!=0.0?1.0/N:0.0;y=+g[p+12>>2];L=L!=0.0?1.0/L:0.0;q=+g[p+20>>2];J=+g[p+24>>2];B=+g[p+28>>2];M=+g[p+36>>2];I=+g[p+40>>2];t=+g[p+44>>2];z=s*K*K+N*w*w+L*y*y;G=s*K*q+N*w*J+L*y*B;u=s*K*M+N*w*I+L*y*t;A=s*q*K+N*J*w+L*B*y;F=s*q*q+N*J*J+L*B*B;v=s*q*M+N*J*I+L*B*t;y=s*M*K+N*I*w+L*t*y;B=s*M*q+N*I*J+L*t*B;t=s*M*M+N*I*I+L*t*t;L=E*z+x*G+P*u+(x*(E*y+x*B+P*t)-P*(E*A+x*F+P*v))*H-(H*0.0+(E*z+x*G+P*u));I=E*A+x*F+P*v+(P*(E*z+x*G+P*u)-E*(E*y+x*B+P*t))*H-(H*0.0+(E*A+x*F+P*v));N=E*y+x*B+P*t+(E*(E*A+x*F+P*v)-x*(E*z+x*G+P*u))*H-(H*0.0+(E*y+x*B+P*t));M=G+(E*y+x*B+P*t+(x*B+(G*0.0+F*-P)))*H;s=u+(x*t+(u*0.0+v*-P)-(E*A+x*F+P*v))*H;J=A+(y*-E+(A*0.0+P*z)-(E*y+x*B+P*t))*H;q=v+(E*z+x*G+P*u+(t*-E+(v*0.0+P*u)))*H;w=y+(y*0.0+(z*-x+E*A)+(E*A+x*F+P*v))*H;K=B+(B*0.0+(G*-x+E*F)-(E*z+x*G+P*u))*H;_=(F+(B*-E+(F*0.0+P*G))*H)*(t+(t*0.0+(u*-x+E*v))*H)-K*q;Z=K*s-M*(t+(t*0.0+(u*-x+E*v))*H);$=M*q-(F+(B*-E+(F*0.0+P*G))*H)*s;O=w*$+((z+(x*y+(z*0.0+A*-P))*H)*_+J*Z);m=+C(+O)>1.1920928955078125e-07;O=m?1.0/O:O;g[r+(o*244|0)+224>>2]=E-(N*$+(L*_+I*Z))*O-E+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=x-(w*(q*L-s*I)+((z+(x*y+(z*0.0+A*-P))*H)*((t+(t*0.0+(u*-x+E*v))*H)*I-q*N)+J*(s*N-(t+(t*0.0+(u*-x+E*v))*H)*L)))*O-x+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=P-(w*(M*I-(F+(B*-E+(F*0.0+P*G))*H)*L)+((z+(x*y+(z*0.0+A*-P))*H)*((F+(B*-E+(F*0.0+P*G))*H)*N-K*I)+J*(K*L-M*N)))*O-P+ +g[r+(o*244|0)+232>>2];m=c[p+564>>2]|0}if(m&8|0){O=+g[k+12>>2];z=+g[p+456>>2];A=+g[p+460>>2];w=+g[p+464>>2];J=+g[p+388>>2];K=+g[p+392>>2];$=+g[p+396>>2];yh(p+4|0,Y);_=+g[Y>>2];L=+g[Y+4>>2];M=+g[Y+8>>2];B=+g[Y+12>>2];F=M*(J*-M+K*B-$*-_)+(_*(-(J*-_)-K*-L-$*-M)+B*($*-L+J*B-K*-M))-L*(K*-_+$*B-J*-L);H=_*(K*-_+$*B-J*-L)+(L*(-(J*-_)-K*-L-$*-M)+B*(J*-M+K*B-$*-_))-M*($*-L+J*B-K*-M);B=L*($*-L+J*B-K*-M)+(M*(-(J*-_)-K*-L-$*-M)+B*(K*-_+$*B-J*-L))-_*(J*-M+K*B-$*-_);z=z!=0.0?1.0/z:0.0;I=B*0.0+(z*F+H*0.0);A=A!=0.0?1.0/A:0.0;G=B*0.0+(F*0.0+A*H);w=w!=0.0?1.0/w:0.0;E=w*B+(F*0.0+H*0.0);x=z+(H*0.0+(z*0.0+B*-0.0))*O;y=A+(F*-0.0+(A*0.0+B*0.0))*O;P=w+(w*0.0+(H*-0.0+F*0.0))*O;v=y*P-((H*-0.0+A*F+0.0-I)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0);N=((H*-0.0+A*F+0.0-I)*O+0.0)*((w*H+(B*-0.0+0.0)-G)*O+0.0)-P*((H*0.0+(0.0-A*B)+E)*O+0.0);u=((H*0.0+(0.0-A*B)+E)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0)-y*((w*H+(B*-0.0+0.0)-G)*O+0.0);Z=((F*0.0-z*H+0.0+G)*O+0.0)*u+(x*v+((F*-0.0+(z*B+0.0)-E)*O+0.0)*N);W=+C(+Z)>1.1920928955078125e-07;Z=W?1.0/Z:Z;N=F-((F*G-H*I)*O*u+((H*E-B*G)*O*v+(B*I-F*E)*O*N))*Z;P=H-(((F*0.0-z*H+0.0+G)*O+0.0)*(((B*0.0+0.0-w*F+I)*O+0.0)*(H*E-B*G)*O-((w*H+(B*-0.0+0.0)-G)*O+0.0)*(B*I-F*E)*O)+(x*(P*(B*I-F*E)*O-((B*0.0+0.0-w*F+I)*O+0.0)*(F*G-H*I)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((w*H+(B*-0.0+0.0)-G)*O+0.0)*(F*G-H*I)*O-P*(H*E-B*G)*O)))*Z;Z=B-(((F*0.0-z*H+0.0+G)*O+0.0)*(((H*0.0+(0.0-A*B)+E)*O+0.0)*(B*I-F*E)*O-y*(H*E-B*G)*O)+(x*(y*(F*G-H*I)*O-((H*-0.0+A*F+0.0-I)*O+0.0)*(B*I-F*E)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((H*-0.0+A*F+0.0-I)*O+0.0)*(H*E-B*G)*O-((H*0.0+(0.0-A*B)+E)*O+0.0)*(F*G-H*I)*O)))*Z;O=+g[Y+12>>2];g[r+(o*244|0)+224>>2]=(M*N+O*P-_*Z)*-M+(O*(O*N+L*Z-M*P)+(-(_*N)-L*P-M*Z)*-_)-(O*Z+_*P-L*N)*-L-J+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=(O*Z+_*P-L*N)*-_+(O*(M*N+O*P-_*Z)+(-(_*N)-L*P-M*Z)*-L)-(O*N+L*Z-M*P)*-M-K+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=(O*N+L*Z-M*P)*-L+((-(_*N)-L*P-M*Z)*-M+O*(O*Z+_*P-L*N))-(M*N+O*P-_*Z)*-_-$+ +g[r+(o*244|0)+232>>2]}}n=n+1|0}while((n|0)!=(e|0))}if((j|0)>0){m=0;do{W=c[i+(m<<2)>>2]|0;Ib[c[(c[W>>2]|0)+8>>2]&511](W);g[W+36>>2]=0.0;m=m+1|0}while((m|0)<(j|0))}n=c[b+168>>2]|0;if((n|0)<(j|0)?(c[b+172>>2]|0)<(j|0):0){if(!j)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((j<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+168>>2]|0}if((n|0)>0){o=0;do{U=(c[b+176>>2]|0)+(o<<3)|0;V=c[U+4>>2]|0;W=m+(o<<3)|0;c[W>>2]=c[U>>2];c[W+4>>2]=V;o=o+1|0}while((o|0)!=(n|0))}n=c[b+176>>2]|0;if(n|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=m;c[b+172>>2]=j}c[b+168>>2]=j;if((j|0)>0){m=0;e=0;do{r=c[b+176>>2]|0;d=r+(e<<3)|0;p=i+(e<<2)|0;n=c[p>>2]|0;o=c[n+44>>2]|0;if(o){n=o+64|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(n|0));n=c[p>>2]|0}if(!(a[n+20>>0]|0)){c[d>>2]=0;c[r+(e<<3)+4>>2]=0;n=0}else{Ob[c[(c[n>>2]|0)+16>>2]&127](n,d);n=c[d>>2]|0}m=n+m|0;e=e+1|0}while((e|0)<(j|0));p=m}else p=0;n=c[b+48>>2]|0;if((n|0)<(p|0)?(c[b+52>>2]|0)<(p|0):0){if(!p)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((p*152|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+48>>2]|0}if((n|0)>0){o=0;do{gi(m+(o*152|0)|0,(c[b+56>>2]|0)+(o*152|0)|0,152)|0;o=o+1|0}while((o|0)!=(n|0))}n=c[b+56>>2]|0;if(n|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=m;c[b+52>>2]=p}c[b+48>>2]=p;if((j|0)>0){V=0;W=0;m=c[b+176>>2]|0;while(1){U=m+(W<<3)|0;if(!(c[U>>2]|0))n=0;else{n=c[b+56>>2]|0;p=n+(V*152|0)|0;r=i+(W<<2)|0;d=c[r>>2]|0;e=c[d+28>>2]|0;Q=c[d+32>>2]|0;R=Rj(b,e,+g[k+12>>2])|0;S=Rj(b,Q,+g[k+12>>2])|0;T=c[b+16>>2]|0;o=c[d+24>>2]|0;o=(o|0)>0?o:c[k+20>>2]|0;if((o|0)>(c[b+184>>2]|0))c[b+184>>2]=o;if((c[U>>2]|0)>0){m=0;do{Yk(p+(m*152|0)|0,0,152)|0;g[p+(m*152|0)+120>>2]=-3402823466385288598117041.0e14;g[p+(m*152|0)+124>>2]=3402823466385288598117041.0e14;g[p+(m*152|0)+100>>2]=0.0;g[p+(m*152|0)+96>>2]=0.0;c[p+(m*152|0)+144>>2]=R;c[p+(m*152|0)+148>>2]=S;c[p+(m*152|0)+136>>2]=o;m=m+1|0}while((m|0)<(c[U>>2]|0))}c[T+(R*244|0)+64>>2]=0;c[T+(R*244|0)+64+4>>2]=0;c[T+(R*244|0)+64+8>>2]=0;c[T+(R*244|0)+64+12>>2]=0;c[T+(R*244|0)+64+16>>2]=0;c[T+(R*244|0)+64+20>>2]=0;c[T+(R*244|0)+64+24>>2]=0;c[T+(R*244|0)+64+28>>2]=0;c[T+(R*244|0)+144>>2]=0;c[T+(R*244|0)+144+4>>2]=0;c[T+(R*244|0)+144+8>>2]=0;c[T+(R*244|0)+144+12>>2]=0;c[T+(R*244|0)+144+16>>2]=0;c[T+(R*244|0)+144+20>>2]=0;c[T+(R*244|0)+144+24>>2]=0;c[T+(R*244|0)+144+28>>2]=0;c[T+(S*244|0)+64>>2]=0;c[T+(S*244|0)+64+4>>2]=0;c[T+(S*244|0)+64+8>>2]=0;c[T+(S*244|0)+64+12>>2]=0;c[T+(S*244|0)+64+16>>2]=0;c[T+(S*244|0)+64+20>>2]=0;c[T+(S*244|0)+64+24>>2]=0;c[T+(S*244|0)+64+28>>2]=0;c[T+(S*244|0)+144>>2]=0;c[T+(S*244|0)+144+4>>2]=0;c[T+(S*244|0)+144+8>>2]=0;c[T+(S*244|0)+144+12>>2]=0;c[T+(S*244|0)+144+16>>2]=0;c[T+(S*244|0)+144+20>>2]=0;c[T+(S*244|0)+144+24>>2]=0;c[T+(S*244|0)+144+28>>2]=0;g[Y>>2]=1.0/+g[k+12>>2];c[Y+4>>2]=c[k+32>>2];c[Y+8>>2]=n+(V*152|0)+16;c[Y+12>>2]=p;c[Y+16>>2]=n+(V*152|0)+48;c[Y+20>>2]=n+(V*152|0)+32;c[Y+24>>2]=38;c[Y+28>>2]=n+(V*152|0)+112;o=n+(V*152|0)+116|0;c[o>>2]=c[k+40>>2];c[Y+48>>2]=c[k+4>>2];c[Y+32>>2]=o;c[Y+36>>2]=n+(V*152|0)+120;c[Y+40>>2]=n+(V*152|0)+124;c[Y+44>>2]=c[k+20>>2];o=c[r>>2]|0;Ob[c[(c[o>>2]|0)+20>>2]&127](o,Y);if((c[U>>2]|0)>0){n=0;do{m=p+(n*152|0)+124|0;q=+g[(c[r>>2]|0)+16>>2];if(+g[m>>2]>=q)g[m>>2]=q;m=p+(n*152|0)+120|0;if(+g[m>>2]<=-q)g[m>>2]=-q;c[p+(n*152|0)+132>>2]=d;aa=p+(n*152|0)|0;ba=c[d+28>>2]|0;$=+g[aa>>2];Z=+g[aa+4>>2];_=+g[aa+8>>2];q=($*+g[ba+340>>2]+Z*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];s=($*+g[ba+356>>2]+Z*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];o=p+(n*152|0)+64|0;g[o>>2]=(+g[ba+324>>2]*$+ +g[ba+328>>2]*Z+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[o+4>>2]=q;g[o+8>>2]=s;g[o+12>>2]=0.0;o=p+(n*152|0)+32|0;ba=c[d+32>>2]|0;s=+g[o>>2];q=+g[o+4>>2];_=+g[o+8>>2];Z=(s*+g[ba+340>>2]+q*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];$=(s*+g[ba+356>>2]+q*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];m=p+(n*152|0)+80|0;g[m>>2]=(+g[ba+324>>2]*s+ +g[ba+328>>2]*q+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[m+4>>2]=Z;g[m+8>>2]=$;g[m+12>>2]=0.0;m=p+(n*152|0)+16|0;$=+g[e+404>>2];Z=+g[m>>2];_=+g[m+4>>2];q=+g[m+8>>2];s=+g[aa>>2];t=+g[aa+4>>2];u=+g[aa+8>>2];aa=p+(n*152|0)+48|0;B=+g[Q+404>>2];v=+g[aa>>2];w=+g[aa+4>>2];x=+g[aa+8>>2];y=+g[o>>2];z=+g[o+4>>2];A=+g[o+8>>2];B=Z*$*Z+_*$*_+q*$*q+(s*(+g[e+324>>2]*s+ +g[e+328>>2]*t+ +g[e+332>>2]*u)+t*(s*+g[e+340>>2]+t*+g[e+344>>2]+u*+g[e+348>>2])+u*(s*+g[e+356>>2]+t*+g[e+360>>2]+u*+g[e+364>>2]))+(v*B*v+w*B*w+x*B*x)+(y*(+g[Q+324>>2]*y+ +g[Q+328>>2]*z+ +g[Q+332>>2]*A)+z*(y*+g[Q+340>>2]+z*+g[Q+344>>2]+A*+g[Q+348>>2])+A*(y*+g[Q+356>>2]+z*+g[Q+360>>2]+A*+g[Q+364>>2]));o=+C(+B)>1.1920928955078125e-07;B=o?1.0/B:0.0;g[p+(n*152|0)+108>>2]=B;if(!(c[T+(R*244|0)+240>>2]|0)){E=0.0;F=0.0;G=0.0;H=0.0;I=0.0;J=0.0}else{E=+g[T+(R*244|0)+208>>2];F=+g[T+(R*244|0)+212>>2];G=+g[T+(R*244|0)+216>>2];H=+g[T+(R*244|0)+224>>2];I=+g[T+(R*244|0)+228>>2];J=+g[T+(R*244|0)+232>>2]}if(!(c[T+(S*244|0)+240>>2]|0)){K=0.0;L=0.0;M=0.0;N=0.0;O=0.0;P=0.0}else{K=+g[T+(S*244|0)+208>>2];L=+g[T+(S*244|0)+212>>2];M=+g[T+(S*244|0)+216>>2];N=+g[T+(S*244|0)+224>>2];O=+g[T+(S*244|0)+228>>2];P=+g[T+(S*244|0)+232>>2]}ba=p+(n*152|0)+112|0;g[ba>>2]=+g[ba>>2]*B+B*(0.0-+g[Y+48>>2]*((E+ +g[e+372>>2])*+g[m>>2]+(F+ +g[e+376>>2])*+g[m+4>>2]+(G+ +g[e+380>>2])*q+((H+ +g[e+388>>2])*s+(I+ +g[e+392>>2])*t+(J+ +g[e+396>>2])*u)+((K+ +g[Q+372>>2])*v+(L+ +g[Q+376>>2])*w+(M+ +g[Q+380>>2])*x+((N+ +g[Q+388>>2])*y+(O+ +g[Q+392>>2])*z+(P+ +g[Q+396>>2])*A))));g[p+(n*152|0)+100>>2]=0.0;n=n+1|0}while((n|0)<(c[U>>2]|0))}m=c[b+176>>2]|0;n=c[m+(W<<3)>>2]|0}W=W+1|0;if((W|0)>=(j|0))break;else V=n+V|0}}Vb[c[(c[b>>2]|0)+28>>2]&127](b,f,h,k);r=c[b+48>>2]|0;d=c[b+28>>2]|0;e=c[b+68>>2]|0;n=c[b+128>>2]|0;if((n|0)<(r|0)?(c[b+132>>2]|0)<(r|0):0){if(!r)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((r<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+128>>2]|0}p=c[b+136>>2]|0;if((n|0)<=0)if(!p)n=b+140|0;else X=105;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=105}if((X|0)==105){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+136>>2]=0;n=b+140|0}a[n>>0]=1;c[b+136>>2]=m;c[b+132>>2]=r}c[b+128>>2]=r;if(!(c[k+72>>2]&16)){n=c[b+108>>2]|0;if((n|0)<(d|0)?(c[b+112>>2]|0)<(d|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=135;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=135}if((X|0)==135){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d}c[b+108>>2]=d}else{n=c[b+108>>2]|0;if((n|0)<(d<<1|0)?(c[b+112>>2]|0)<(d<<1|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=120;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=120}if((X|0)==120){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d<<1}c[b+108>>2]=d<<1}n=c[b+148>>2]|0;if((n|0)<(e|0)?(c[b+152>>2]|0)<(e|0):0){if(!e)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((e<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+148>>2]|0}p=c[b+156>>2]|0;if((n|0)<=0)if(!p)n=b+160|0;else X=150;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=150}if((X|0)==150){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+156>>2]=0;n=b+160|0}a[n>>0]=1;c[b+156>>2]=m;c[b+152>>2]=e}c[b+148>>2]=e;if((r|0)>0){n=c[b+136>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(r|0))}if((d|0)>0){n=c[b+116>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(d|0))}if((e|0)<=0){l=Y;return 0.0}n=c[b+156>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(e|0));l=Y;return 0.0}function rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;V=c[e>>2]|0;fa=c[f>>2]|0;if(V|0)g=c[V+12>>2]|0;else g=b;h=c[g+88>>2]|0;i=c[g+92>>2]|0;j=c[g+96>>2]|0;if(!fa)g=d;else g=c[fa+12>>2]|0;r=c[g+88>>2]|0;p=c[g+92>>2]|0;q=c[g+96>>2]|0;Z=c[b+88>>2]|0;da=(c[d+88>>2]|0)-Z|0;u=c[b+92>>2]|0;ea=(c[d+92>>2]|0)-u|0;l=c[b+96>>2]|0;W=(c[d+96>>2]|0)-l|0;Y=c[(V|0?V:fa)+12>>2]|0;_=(c[Y+88>>2]|0)-Z|0;U=(c[Y+92>>2]|0)-u|0;Y=(c[Y+96>>2]|0)-l|0;X=(P(U,W)|0)-(P(Y,ea)|0)|0;Y=(P(Y,da)|0)-(P(_,W)|0)|0;U=(P(_,ea)|0)-(P(U,da)|0)|0;Z=ct(X|0,((X|0)<0)<<31>>31|0,Z|0,((Z|0)<0)<<31>>31|0)|0;_=A;u=ct(Y|0,((Y|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=A;l=ct(U|0,((U|0)<0)<<31>>31|0,l|0,((l|0)<0)<<31>>31|0)|0;l=Ow(Z|0,_|0,l|0,A|0)|0;t=Ow(l|0,A|0,u|0,t|0)|0;u=A;l=ct(U|0,((U|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;_=A;Z=ct(Y|0,((Y|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;Z=sw(l|0,_|0,Z|0,A|0)|0;_=A;l=ct(X|0,((X|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;aa=A;$=ct(U|0,((U|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;$=sw(l|0,aa|0,$|0,A|0)|0;aa=A;l=ct(Y|0,((Y|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;ca=A;ba=ct(X|0,((X|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;ba=sw(l|0,ca|0,ba|0,A|0)|0;ca=A;l=ct(Z|0,_|0,h|0,((h|0)<0)<<31>>31|0)|0;T=A;k=ct($|0,aa|0,i|0,((i|0)<0)<<31>>31|0)|0;T=Ow(k|0,A|0,l|0,T|0)|0;l=A;k=ct(ba|0,ca|0,j|0,((j|0)<0)<<31>>31|0)|0;k=Ow(T|0,l|0,k|0,A|0)|0;l=A;if((V|0)!=0?(c[V+12>>2]|0)!=0:0){g=h;b=i;d=j;n=V;o=l;m=k;while(1){n=c[(c[n+8>>2]|0)+4>>2]|0;l=n+12|0;j=c[l>>2]|0;h=c[j+88>>2]|0;S=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;i=c[j+92>>2]|0;T=ct(i|0,((i|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;j=c[j+96>>2]|0;T=ct(j|0,((j|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0){k=m;j=o;break}if((c[n+20>>2]|0)==(c[a+100>>2]|0)){k=m;j=o;break}T=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;S=A;k=ct(i|0,((i|0)<0)<<31>>31|0,$|0,aa|0)|0;S=Ow(k|0,A|0,T|0,S|0)|0;T=A;k=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(S|0,T|0,k|0,A|0)|0;j=A;if(!((j|0)>(o|0)|(j|0)==(o|0)&k>>>0>m>>>0)){k=m;j=o;break}c[e>>2]=n;T=c[l>>2]|0;g=c[T+88>>2]|0;b=c[T+92>>2]|0;d=c[T+96>>2]|0;if(!T)break;else{o=j;m=k}}h=g;i=c[f>>2]|0;s=j}else{b=i;d=j;i=fa;s=l}g=ct(Z|0,_|0,r|0,((r|0)<0)<<31>>31|0)|0;T=A;j=ct($|0,aa|0,p|0,((p|0)<0)<<31>>31|0)|0;T=Ow(j|0,A|0,g|0,T|0)|0;g=A;j=ct(ba|0,ca|0,q|0,((q|0)<0)<<31>>31|0)|0;j=Ow(T|0,g|0,j|0,A|0)|0;g=A;a:do if(i)if(!(c[i+12>>2]|0))o=q;else{o=q;while(1){q=c[c[i+8>>2]>>2]|0;n=c[q+12>>2]|0;l=c[n+88>>2]|0;S=ct(l|0,((l|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;m=c[n+92>>2]|0;T=ct(m|0,((m|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;n=c[n+96>>2]|0;T=ct(n|0,((n|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0)break a;if((c[q+20>>2]|0)==(c[a+100>>2]|0))break a;l=ct(l|0,((l|0)<0)<<31>>31|0,Z|0,_|0)|0;T=A;m=ct(m|0,((m|0)<0)<<31>>31|0,$|0,aa|0)|0;T=Ow(m|0,A|0,l|0,T|0)|0;m=A;l=ct(n|0,((n|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(T|0,m|0,l|0,A|0)|0;m=A;if(!((m|0)>(g|0)|(m|0)==(g|0)&l>>>0>j>>>0))break a;c[f>>2]=q;T=c[q+12>>2]|0;g=c[T+88>>2]|0;i=c[T+92>>2]|0;j=c[T+96>>2]|0;if(!T){r=g;p=i;o=j;i=q;j=l;g=m;break}else{r=g;p=i;o=j;i=q;g=m;j=l}}}else{o=q;i=0}while(0);j=sw(j|0,g|0,k|0,s|0)|0;T=A;if((T|0)>0|(T|0)==0&j>>>0>0){R=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;S=A;N=r;k=h;O=p;m=b;Q=o;n=d;l=i;u=j;q=T;while(1){s=(P(O-m|0,ea)|0)+(P(N-k|0,da)|0)+(P(Q-n|0,W)|0)|0;g=c[e>>2]|0;if(!g){E=s;I=k;H=m;B=s;g=((s|0)<0)<<31>>31;C=q;z=u}else{K=k;t=s;M=s;L=((s|0)<0)<<31>>31;b:while(1){if(!(c[g+12>>2]|0)){s=K;k=M;g=L;break}G=c[(c[g>>2]|0)+8>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){s=K;k=M;g=L;break}J=c[G+12>>2]|0;H=c[J+88>>2]|0;F=H-K|0;I=c[J+92>>2]|0;E=I-m|0;J=c[J+96>>2]|0;k=J-n|0;s=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;D=A;l=ct(E|0,((E|0)<0)<<31>>31|0,$|0,aa|0)|0;D=Ow(l|0,A|0,s|0,D|0)|0;s=A;l=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(D|0,s|0,l|0,A|0)|0;s=A;k=(P(E,ea)|0)+(P(F,da)|0)+(P(k,W)|0)|0;do if((l|0)==0&(s|0)==0){if((k|0)>=0){s=K;k=M;g=L;break b}}else{if((s|0)>=0){s=K;k=M;g=L;break b}if((k|0)>0){w=1;x=k;v=((k|0)<0)<<31>>31}else{x=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;w=((k|0)!=0)<<31>>31;x=k|0?x:0;v=k|0?A:0}B=sw(0,0,l|0,s|0)|0;C=A;F=0-w|0;if((t|0)>0){k=1;D=M;E=L}else{E=(t|0)!=0;D=sw(0,0,M|0,L|0)|0;k=E<<31>>31;D=E?D:0;E=E?A:0}if((q|0)>0|(q|0)==0&u>>>0>0){l=u;s=q}else{s=(u|0)!=0|(q|0)!=0;l=sw(0,0,u|0,q|0)|0;k=s?0-k|0:k;l=s?l:0;s=s?A:0}if((k|0)==(F|0)){if(!w)break;k=ct(l|0,0,x|0,0)|0;w=A;ja=ct(s|0,0,x|0,0)|0;ia=A;y=ct(l|0,0,v|0,0)|0;z=A;ha=ct(s|0,0,v|0,0)|0;x=A;y=Ow(ja|0,0,y|0,0)|0;l=A;x=Ow(ia|0,0,ha|0,x|0)|0;z=Ow(x|0,A|0,z|0,0)|0;l=Ow(z|0,A|0,l|0,0)|0;z=A;w=Ow(0,y|0,k|0,w|0)|0;x=A;y=Ow(l|0,z|0,(x>>>0>>0|(x|0)==(y|0)&w>>>0<0)&1|0,0)|0;z=A;l=ct(D|0,0,B|0,0)|0;k=A;ha=ct(E|0,0,B|0,0)|0;B=A;s=ct(D|0,0,C|0,0)|0;v=A;C=ct(E|0,0,C|0,0)|0;D=A;s=Ow(ha|0,0,s|0,0)|0;E=A;D=Ow(B|0,0,C|0,D|0)|0;v=Ow(D|0,A|0,v|0,0)|0;E=Ow(v|0,A|0,E|0,0)|0;v=A;k=Ow(0,s|0,l|0,k|0)|0;l=A;s=Ow(E|0,v|0,(l>>>0>>0|(l|0)==(s|0)&k>>>0<0)&1|0,0)|0;v=A;if(z>>>0>>0|(z|0)==(v|0)&y>>>0>>0)k=-1;else k=z>>>0>v>>>0|(z|0)==(v|0)&y>>>0>s>>>0?1:x>>>0>>0|(x|0)==(l|0)&w>>>0>>0?-1:(x>>>0>l>>>0|(x|0)==(l|0)&w>>>0>k>>>0)&1;k=P(k,F)|0}else k=F-k|0;if((k|0)<=-1){s=K;k=M;g=L;break b}}while(0);ja=N-H|0;ia=O-I|0;l=Q-J|0;q=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,q|0,ha|0)|0;q=A;k=ct(l|0,((l|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,q|0,k|0,A|0)|0;q=A;g=(g|0)==(V|0)?0:G;c[e>>2]=g;l=(P(ia,ea)|0)+(P(ja,da)|0)+(P(l,W)|0)|0;if(!g){t=l;s=H;m=I;n=J;u=k;k=l;g=((l|0)<0)<<31>>31;break}else{K=H;m=I;n=J;t=l;M=l;L=((l|0)<0)<<31>>31;u=k}}E=t;I=s;H=m;l=c[f>>2]|0;B=k;C=q;z=u}if(!l){g=110;break}if(!(c[l+12>>2]|0)){g=110;break}G=c[c[l+8>>2]>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break}q=c[G+12>>2]|0;t=c[q+88>>2]|0;m=t-N|0;s=c[q+92>>2]|0;l=s-O|0;q=c[q+96>>2]|0;k=q-Q|0;ja=ct(m|0,((m|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(l|0,((l|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(k|0,((k|0)<0)<<31>>31|0,R|0,S|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break}v=ct(m|0,((m|0)<0)<<31>>31|0,Z|0,_|0)|0;F=A;u=ct(l|0,((l|0)<0)<<31>>31|0,$|0,aa|0)|0;F=Ow(u|0,A|0,v|0,F|0)|0;v=A;u=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;u=Ow(F|0,v|0,u|0,A|0)|0;v=A;k=(P(l,ea)|0)+(P(m,da)|0)+(P(k,W)|0)|0;F=t-I|0;ia=s-H|0;D=q-n|0;F=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,F|0,ja|0)|0;F=A;D=ct(D|0,((D|0)<0)<<31>>31|0,ba|0,ca|0)|0;D=Ow(ja|0,F|0,D|0,A|0)|0;F=A;if(!((F|0)>0|(F|0)==0&D>>>0>0)){g=110;break}if((u|0)==0&(v|0)==0){if((k|0)>=0){g=110;break}}else{if((v|0)>=0){g=110;break}if((k|0)>0){s=1;t=k;q=((k|0)<0)<<31>>31}else{t=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;s=((k|0)!=0)<<31>>31;t=k|0?t:0;q=k|0?A:0}w=sw(0,0,u|0,v|0)|0;x=A;y=0-s|0;if((E|0)>0){k=1;v=B}else{ja=(E|0)!=0;v=sw(0,0,B|0,g|0)|0;k=ja<<31>>31;v=ja?v:0;g=ja?A:0}if((C|0)>0|(C|0)==0&z>>>0>0){m=k;l=z;k=C}else{ja=(z|0)!=0|(C|0)!=0;l=sw(0,0,z|0,C|0)|0;m=ja?0-k|0:k;l=ja?l:0;k=ja?A:0}if((m|0)==(y|0)){if(!s){g=110;break}ja=ct(l|0,0,t|0,0)|0;s=A;ia=ct(k|0,0,t|0,0)|0;Q=A;t=ct(l|0,0,q|0,0)|0;u=A;k=ct(k|0,0,q|0,0)|0;q=A;t=Ow(ia|0,0,t|0,0)|0;ia=A;q=Ow(Q|0,0,k|0,q|0)|0;u=Ow(q|0,A|0,u|0,0)|0;ia=Ow(u|0,A|0,ia|0,0)|0;u=A;q=Ow(0,t|0,ja|0,s|0)|0;s=A;t=Ow(ia|0,u|0,(s>>>0>>0|(s|0)==(t|0)&q>>>0<0)&1|0,0)|0;u=A;ia=ct(v|0,0,w|0,0)|0;k=A;ja=ct(g|0,0,w|0,0)|0;Q=A;l=ct(v|0,0,x|0,0)|0;m=A;ha=ct(g|0,0,x|0,0)|0;g=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;g=Ow(Q|0,0,ha|0,g|0)|0;m=Ow(g|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,ia|0,k|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(u>>>0>>0|(u|0)==(m|0)&t>>>0>>0)g=-1;else g=u>>>0>m>>>0|(u|0)==(m|0)&t>>>0>l>>>0?1:s>>>0>>0|(s|0)==(k|0)&q>>>0>>0?-1:(s>>>0>k>>>0|(s|0)==(k|0)&q>>>0>g>>>0)&1;g=P(g,y)|0}else g=y-m|0;if((g|0)<=0){g=110;break}}c[f>>2]=G;Q=c[G+12>>2]|0;N=c[Q+88>>2]|0;k=I;O=c[Q+92>>2]|0;m=H;Q=c[Q+96>>2]|0;l=G;u=D;q=F}if((g|0)==110)return}if((T|0)>=0)return;F=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;G=A;E=r;g=T;c:while(1){D=g;d:while(1){C=(P(p-b|0,ea)|0)+(P(E-h|0,da)|0)+(P(o-d|0,W)|0)|0;do if((i|0?c[i+12>>2]|0:0)?(ga=c[(c[i+4>>2]|0)+8>>2]|0,(c[ga+20>>2]|0)>(c[a+100>>2]|0)):0){B=c[ga+12>>2]|0;y=c[B+88>>2]|0;ja=y-E|0;z=c[B+92>>2]|0;ia=z-p|0;B=c[B+96>>2]|0;g=B-o|0;l=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,l|0,ha|0)|0;l=A;k=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,l|0,k|0,A|0)|0;l=A;g=(P(ia,ea)|0)+(P(ja,da)|0)+(P(g,W)|0)|0;if((k|0)==0&(l|0)==0)if((g|0)>0)break d;else break;if((l|0)<0){if((g|0)>0){n=1;q=g;m=((g|0)<0)<<31>>31}else{q=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;n=((g|0)!=0)<<31>>31;q=g|0?q:0;m=g|0?A:0}t=sw(0,0,k|0,l|0)|0;u=A;x=0-n|0;if((C|0)>0){g=1;v=C;w=((C|0)<0)<<31>>31}else{v=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;g=((C|0)!=0)<<31>>31;v=C|0?v:0;w=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){k=j;l=D}else{l=(j|0)!=0|(D|0)!=0;k=sw(0,0,j|0,D|0)|0;g=l?0-g|0:g;k=l?k:0;l=l?A:0}if((g|0)==(x|0)){if(!n)break d;g=ct(k|0,0,q|0,0)|0;n=A;ha=ct(l|0,0,q|0,0)|0;V=A;r=ct(k|0,0,m|0,0)|0;s=A;ja=ct(l|0,0,m|0,0)|0;q=A;r=Ow(ha|0,0,r|0,0)|0;k=A;q=Ow(V|0,0,ja|0,q|0)|0;s=Ow(q|0,A|0,s|0,0)|0;k=Ow(s|0,A|0,k|0,0)|0;s=A;n=Ow(0,r|0,g|0,n|0)|0;q=A;r=Ow(k|0,s|0,(q>>>0>>0|(q|0)==(r|0)&n>>>0<0)&1|0,0)|0;s=A;k=ct(v|0,0,t|0,0)|0;g=A;ja=ct(w|0,0,t|0,0)|0;V=A;l=ct(v|0,0,u|0,0)|0;m=A;ha=ct(w|0,0,u|0,0)|0;ia=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;m=Ow(ia|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,k|0,g|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(s>>>0>>0|(s|0)==(m|0)&r>>>0>>0)g=-1;else g=s>>>0>m>>>0|(s|0)==(m|0)&r>>>0>l>>>0?1:q>>>0>>0|(q|0)==(k|0)&n>>>0>>0?-1:(q>>>0>k>>>0|(q|0)==(k|0)&n>>>0>g>>>0)&1;g=P(g,x)|0}else g=x-g|0;if((g|0)<1)break d}}while(0);g=c[e>>2]|0;if(!g){g=110;break c}if(!(c[g+12>>2]|0)){g=110;break c}v=c[(c[g+8>>2]|0)+4>>2]|0;if((c[v+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break c}i=c[v+12>>2]|0;l=c[i+88>>2]|0;h=l-h|0;k=c[i+92>>2]|0;b=k-b|0;i=c[i+96>>2]|0;g=i-d|0;ja=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(b|0,((b|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(g|0,((g|0)<0)<<31>>31|0,F|0,G|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break c}m=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;u=A;d=ct(b|0,((b|0)<0)<<31>>31|0,$|0,aa|0)|0;u=Ow(d|0,A|0,m|0,u|0)|0;m=A;d=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;d=Ow(u|0,m|0,d|0,A|0)|0;m=A;g=(P(b,ea)|0)+(P(h,da)|0)+(P(g,W)|0)|0;u=E-l|0;ia=p-k|0;t=o-i|0;u=ct(u|0,((u|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,u|0,ja|0)|0;u=A;t=ct(t|0,((t|0)<0)<<31>>31|0,ba|0,ca|0)|0;t=Ow(ja|0,u|0,t|0,A|0)|0;u=A;if((u|0)>=0){g=110;break c}if((d|0)==0&(m|0)==0){if((g|0)<=0){g=110;break c}}else{if((m|0)>=0){g=110;break c}if((g|0)>0){h=((g|0)<0)<<31>>31;i=1}else{ja=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;h=g|0?A:0;i=((g|0)!=0)<<31>>31;g=g|0?ja:0}q=sw(0,0,d|0,m|0)|0;r=A;s=0-i|0;if((C|0)>0){b=1;n=C;m=((C|0)<0)<<31>>31}else{n=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;b=((C|0)!=0)<<31>>31;n=C|0?n:0;m=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){d=b;b=D}else{ja=(j|0)!=0|(D|0)!=0;j=sw(0,0,j|0,D|0)|0;d=ja?0-b|0:b;j=ja?j:0;b=ja?A:0}if((d|0)==(s|0)){if(!i){g=110;break c}ja=ct(j|0,0,g|0,0)|0;i=A;d=ct(b|0,0,g|0,0)|0;V=A;k=ct(j|0,0,h|0,0)|0;l=A;g=ct(b|0,0,h|0,0)|0;j=A;k=Ow(d|0,0,k|0,0)|0;b=A;j=Ow(V|0,0,g|0,j|0)|0;l=Ow(j|0,A|0,l|0,0)|0;b=Ow(l|0,A|0,b|0,0)|0;l=A;i=Ow(0,k|0,ja|0,i|0)|0;j=A;k=Ow(b|0,l|0,(j>>>0>>0|(j|0)==(k|0)&i>>>0<0)&1|0,0)|0;l=A;b=ct(n|0,0,q|0,0)|0;g=A;ja=ct(m|0,0,q|0,0)|0;V=A;d=ct(n|0,0,r|0,0)|0;h=A;ha=ct(m|0,0,r|0,0)|0;ia=A;d=Ow(ja|0,0,d|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;h=Ow(ia|0,A|0,h|0,0)|0;ja=Ow(h|0,A|0,ja|0,0)|0;h=A;g=Ow(0,d|0,b|0,g|0)|0;b=A;d=Ow(ja|0,h|0,(b>>>0>>0|(b|0)==(d|0)&g>>>0<0)&1|0,0)|0;h=A;if(l>>>0>>0|(l|0)==(h|0)&k>>>0>>0)g=-1;else g=l>>>0>h>>>0|(l|0)==(h|0)&k>>>0>d>>>0?1:j>>>0>>0|(j|0)==(b|0)&i>>>0>>0?-1:(j>>>0>b>>>0|(j|0)==(b|0)&i>>>0>g>>>0)&1;g=P(g,s)|0}else g=s-d|0;if((g|0)>=0){g=110;break c}}c[e>>2]=v;d=c[v+12>>2]|0;h=c[d+88>>2]|0;b=c[d+92>>2]|0;d=c[d+96>>2]|0;i=c[f>>2]|0;D=u;j=t}E=y-h|0;o=z-b|0;j=B-d|0;E=ct(E|0,((E|0)<0)<<31>>31|0,Z|0,_|0)|0;p=A;o=ct(o|0,((o|0)<0)<<31>>31|0,$|0,aa|0)|0;p=Ow(o|0,A|0,E|0,p|0)|0;E=A;j=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;j=Ow(p|0,E|0,j|0,A|0)|0;i=(i|0)==(fa|0)?0:ga;c[f>>2]=i;E=y;p=z;o=B;g=A}if((g|0)==110)return}function sc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;m=c[6997]|0;if(m>>>(o>>>3)&3|0){a=28028+((m>>>(o>>>3)&1^1)+(o>>>3)<<1<<2)|0;b=c[a+8>>2]|0;d=c[b+8>>2]|0;if((a|0)==(d|0))c[6997]=m&~(1<<(m>>>(o>>>3)&1^1)+(o>>>3));else{c[d+12>>2]=a;c[a+8>>2]=d}v=(m>>>(o>>>3)&1^1)+(o>>>3)<<3;c[b+4>>2]=v|3;c[b+v+4>>2]=c[b+v+4>>2]|1;v=b+8|0;l=w;return v|0}n=c[6999]|0;if(o>>>0>n>>>0){if(m>>>(o>>>3)|0){a=m>>>(o>>>3)<<(o>>>3)&(2<<(o>>>3)|0-(2<<(o>>>3)));f=((a&0-a)+-1|0)>>>(((a&0-a)+-1|0)>>>12&16);e=f>>>(f>>>5&8)>>>(f>>>(f>>>5&8)>>>2&4);e=(f>>>5&8|((a&0-a)+-1|0)>>>12&16|f>>>(f>>>5&8)>>>2&4|e>>>1&2|e>>>(e>>>1&2)>>>1&1)+(e>>>(e>>>1&2)>>>(e>>>(e>>>1&2)>>>1&1))|0;f=c[28028+(e<<1<<2)+8>>2]|0;a=c[f+8>>2]|0;if((28028+(e<<1<<2)|0)==(a|0)){c[6997]=m&~(1<>2]=28028+(e<<1<<2);c[28028+(e<<1<<2)+8>>2]=a;a=m}c[f+4>>2]=o|3;c[f+o+4>>2]=(e<<3)-o|1;c[f+o+((e<<3)-o)>>2]=(e<<3)-o;if(n|0){d=c[7002]|0;if(!(a&1<<(n>>>3))){c[6997]=a|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=(e<<3)-o;c[7002]=f+o;v=f+8|0;l=w;return v|0}k=c[6998]|0;if(k){b=((k&0-k)+-1|0)>>>(((k&0-k)+-1|0)>>>12&16);a=b>>>(b>>>5&8)>>>(b>>>(b>>>5&8)>>>2&4);a=c[28292+((b>>>5&8|((k&0-k)+-1|0)>>>12&16|b>>>(b>>>5&8)>>>2&4|a>>>1&2|a>>>(a>>>1&2)>>>1&1)+(a>>>(a>>>1&2)>>>(a>>>(a>>>1&2)>>>1&1))<<2)>>2]|0;b=(c[a+4>>2]&-8)-o|0;d=c[a+16+(((c[a+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=a;h=b}else{do{i=(c[d+4>>2]&-8)-o|0;j=i>>>0>>0;b=j?i:b;a=j?d:a;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=a;h=b}i=j+o|0;if(j>>>0>>0){f=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){b=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);do if(f|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=k&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=f;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+20>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);if(h>>>0<16){v=h+o|0;c[j+4>>2]=v|3;v=j+v+4|0;c[v>>2]=c[v>>2]|1}else{c[j+4>>2]=o|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(n|0){d=c[7002]|0;if(!(m&1<<(n>>>3))){c[6997]=m|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=h;c[7002]=i}v=j+8|0;l=w;return v|0}}}}else if(a>>>0<=4294967231){o=a+11&-8;j=c[6998]|0;if(j){if((a+11|0)>>>8)if(o>>>0>16777215)i=31;else{i=(a+11|0)>>>8<<((((a+11|0)>>>8)+1048320|0)>>>16&8);i=14-((i+520192|0)>>>16&4|(((a+11|0)>>>8)+1048320|0)>>>16&8|((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)+(i<<((i+520192|0)>>>16&4)<<(((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;i=o>>>(i+7|0)&1|i<<1}else i=0;b=c[28292+(i<<2)>>2]|0;a:do if(!b){b=0;a=0;d=0-o|0;u=57}else{a=0;d=0-o|0;h=o<<((i|0)==31?0:25-(i>>>1)|0);f=0;while(1){e=(c[b+4>>2]&-8)-o|0;if(e>>>0>>0)if(!e){a=b;d=0;e=b;u=61;break a}else{a=b;d=e}e=c[b+20>>2]|0;b=c[b+16+(h>>>31<<2)>>2]|0;f=(e|0)==0|(e|0)==(b|0)?f:e;e=(b|0)==0;if(e){b=f;u=57;break}else h=h<<((e^1)&1)}}while(0);if((u|0)==57){if((b|0)==0&(a|0)==0){a=2<>>(m>>>12&16)>>>(m>>>(m>>>12&16)>>>5&8);b=n>>>(n>>>2&4)>>>(n>>>(n>>>2&4)>>>1&2);a=0;b=c[28292+((m>>>(m>>>12&16)>>>5&8|m>>>12&16|n>>>2&4|n>>>(n>>>2&4)>>>1&2|b>>>1&1)+(b>>>(b>>>1&1))<<2)>>2]|0}if(!b){i=a;h=d}else{e=b;u=61}}if((u|0)==61)while(1){u=0;b=(c[e+4>>2]&-8)-o|0;n=b>>>0>>0;b=n?b:d;a=n?e:a;e=c[e+16+(((c[e+16>>2]|0)==0&1)<<2)>>2]|0;if(!e){i=a;h=b;break}else{d=b;u=61}}if((i|0)!=0?h>>>0<((c[6999]|0)-o|0)>>>0:0){g=i+o|0;if(i>>>0>=g>>>0){v=0;l=w;return v|0}f=c[i+24>>2]|0;a=c[i+12>>2]|0;do if((a|0)==(i|0)){b=i+20|0;a=c[b>>2]|0;if(!a){b=i+16|0;a=c[b>>2]|0;if(!a){a=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0}else{v=c[i+8>>2]|0;c[v+12>>2]=a;c[a+8>>2]=v}while(0);do if(f){b=c[i+28>>2]|0;if((i|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=j&~(1<>2]|0)!=(i|0)&1)<<2)>>2]=a;if(!a){e=j;break}}c[a+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[i+20>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;e=j}else e=j}else e=j;while(0);do if(h>>>0>=16){c[i+4>>2]=o|3;c[g+4>>2]=h|1;c[g+h>>2]=h;d=h>>>3;if(h>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=g;c[a+12>>2]=g;c[g+8>>2]=a;c[g+12>>2]=28028+(d<<1<<2);break}a=h>>>8;if(a)if(h>>>0>16777215)a=31;else{v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=h>>>(a+7|0)&1|a<<1}else a=0;d=28292+(a<<2)|0;c[g+28>>2]=a;c[g+16+4>>2]=0;c[g+16>>2]=0;b=1<>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}b=h<<((a|0)==31?0:25-(a>>>1)|0);d=c[d>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(h|0)){u=97;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=96;break}else{b=b<<1;d=a}}if((u|0)==96){c[e>>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}else if((u|0)==97){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=g;c[u>>2]=g;c[g+8>>2]=v;c[g+12>>2]=d;c[g+24>>2]=0;break}}else{v=h+o|0;c[i+4>>2]=v|3;v=i+v+4|0;c[v>>2]=c[v>>2]|1}while(0);v=i+8|0;l=w;return v|0}}}else o=-1;while(0);d=c[6999]|0;if(d>>>0>=o>>>0){a=d-o|0;b=c[7002]|0;if(a>>>0>15){v=b+o|0;c[7002]=v;c[6999]=a;c[v+4>>2]=a|1;c[v+a>>2]=a;c[b+4>>2]=o|3}else{c[6999]=0;c[7002]=0;c[b+4>>2]=d|3;c[b+d+4>>2]=c[b+d+4>>2]|1}v=b+8|0;l=w;return v|0}f=c[7e3]|0;if(f>>>0>o>>>0){t=f-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}if(!(c[7115]|0)){c[7117]=4096;c[7116]=4096;c[7118]=-1;c[7119]=-1;c[7120]=0;c[7108]=0;c[w>>2]=w&-16^1431655768;c[7115]=w&-16^1431655768;a=4096}else a=c[7117]|0;h=o+48|0;i=o+47|0;k=a+i|0;j=0-a|0;if((k&j)>>>0<=o>>>0){v=0;l=w;return v|0}a=c[7107]|0;if(a|0?(n=c[7105]|0,(n+(k&j)|0)>>>0<=n>>>0?1:(n+(k&j)|0)>>>0>a>>>0):0){v=0;l=w;return v|0}b:do if(!(c[7108]&4)){d=c[7003]|0;c:do if(d){b=28436;while(1){a=c[b>>2]|0;if(a>>>0<=d>>>0?(p=b+4|0,(a+(c[p>>2]|0)|0)>>>0>d>>>0):0)break;a=c[b+8>>2]|0;if(!a){u=118;break c}else b=a}if((k-f&j)>>>0<2147483647){a=_o(k-f&j|0)|0;if((a|0)==((c[b>>2]|0)+(c[p>>2]|0)|0))if((a|0)==(-1|0))a=k-f&j;else{h=k-f&j;g=a;u=135;break b}else{e=a;d=k-f&j;u=126}}else a=0}else u=118;while(0);do if((u|0)==118){b=_o(0)|0;if((b|0)!=(-1|0)?(r=c[7116]|0,r=((r+-1&b|0)==0?0:(r+-1+b&0-r)-b|0)+(k&j)|0,q=c[7105]|0,r>>>0>o>>>0&r>>>0<2147483647):0){p=c[7107]|0;if(p|0?(r+q|0)>>>0<=q>>>0|(r+q|0)>>>0>p>>>0:0){a=0;break}a=_o(r|0)|0;if((a|0)==(b|0)){h=r;g=b;u=135;break b}else{e=a;d=r;u=126}}else a=0}while(0);do if((u|0)==126){b=0-d|0;if(!(h>>>0>d>>>0&(d>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){a=0;break}else{h=d;g=e;u=135;break b}a=c[7117]|0;a=i-d+a&0-a;if(a>>>0>=2147483647){h=d;g=e;u=135;break b}if((_o(a|0)|0)==(-1|0)){_o(b|0)|0;a=0;break}else{h=a+d|0;g=e;u=135;break b}}while(0);c[7108]=c[7108]|4;u=133}else{a=0;u=133}while(0);if(((u|0)==133?(k&j)>>>0<2147483647:0)?(g=_o(k&j|0)|0,s=_o(0)|0,t=(s-g|0)>>>0>(o+40|0)>>>0,!((g|0)==(-1|0)|t^1|g>>>0>>0&((g|0)!=(-1|0)&(s|0)!=(-1|0))^1)):0){h=t?s-g|0:a;u=135}if((u|0)==135){a=(c[7105]|0)+h|0;c[7105]=a;if(a>>>0>(c[7106]|0)>>>0)c[7106]=a;j=c[7003]|0;do if(j){a=28436;while(1){b=c[a>>2]|0;d=a+4|0;e=c[d>>2]|0;if((g|0)==(b+e|0)){u=145;break}f=c[a+8>>2]|0;if(!f)break;else a=f}if(((u|0)==145?(c[a+12>>2]&8|0)==0:0)?j>>>0>>0&j>>>0>=b>>>0:0){c[d>>2]=e+h;u=(j+8&7|0)==0?0:0-(j+8)&7;v=(c[7e3]|0)+(h-u)|0;c[7003]=j+u;c[7e3]=v;c[j+u+4>>2]=v|1;c[j+u+v+4>>2]=40;c[7004]=c[7119];break}if(g>>>0<(c[7001]|0)>>>0)c[7001]=g;d=g+h|0;a=28436;while(1){if((c[a>>2]|0)==(d|0)){u=153;break}b=c[a+8>>2]|0;if(!b)break;else a=b}if((u|0)==153?(c[a+12>>2]&8|0)==0:0){c[a>>2]=g;m=a+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;a=d+((d+8&7|0)==0?0:0-(d+8)&7)|0;k=m+o|0;i=a-m-o|0;c[m+4>>2]=o|3;do if((a|0)!=(j|0)){if((a|0)==(c[7002]|0)){v=(c[6999]|0)+i|0;c[6999]=v;c[7002]=k;c[k+4>>2]=v|1;c[k+v>>2]=v;break}h=c[a+4>>2]|0;if((h&3|0)==1){d:do if(h>>>0<256){b=c[a+8>>2]|0;d=c[a+12>>2]|0;if((d|0)==(b|0)){c[6997]=c[6997]&~(1<<(h>>>3));break}else{c[b+12>>2]=d;c[d+8>>2]=b;break}}else{g=c[a+24>>2]|0;b=c[a+12>>2]|0;do if((b|0)==(a|0)){b=c[a+16+4>>2]|0;if(!b){b=c[a+16>>2]|0;if(!b){b=0;break}else f=a+16|0}else f=a+16+4|0;while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;f=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;f=d}}c[f>>2]=0}else{v=c[a+8>>2]|0;c[v+12>>2]=b;c[b+8>>2]=v}while(0);if(!g)break;d=c[a+28>>2]|0;do if((a|0)!=(c[28292+(d<<2)>>2]|0)){c[g+16+(((c[g+16>>2]|0)!=(a|0)&1)<<2)>>2]=b;if(!b)break d}else{c[28292+(d<<2)>>2]=b;if(b|0)break;c[6998]=c[6998]&~(1<>2]=g;d=c[a+16>>2]|0;if(d|0){c[b+16>>2]=d;c[d+24>>2]=b}d=c[a+16+4>>2]|0;if(!d)break;c[b+20>>2]=d;c[d+24>>2]=b}while(0);a=a+(h&-8)|0;f=(h&-8)+i|0}else f=i;d=a+4|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=k;c[a+12>>2]=k;c[k+8>>2]=a;c[k+12>>2]=28028+(d<<1<<2);break}a=f>>>8;do if(!a)a=0;else{if(f>>>0>16777215){a=31;break}v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}while(0);e=28292+(a<<2)|0;c[k+28>>2]=a;c[k+16+4>>2]=0;c[k+16>>2]=0;b=c[6998]|0;d=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}b=f<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){u=194;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=193;break}else{b=b<<1;d=a}}if((u|0)==193){c[e>>2]=k;c[k+24>>2]=d;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((u|0)==194){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=k;c[u>>2]=k;c[k+8>>2]=v;c[k+12>>2]=d;c[k+24>>2]=0;break}}else{v=(c[7e3]|0)+i|0;c[7e3]=v;c[7003]=k;c[k+4>>2]=v|1}while(0);v=m+8|0;l=w;return v|0}a=28436;while(1){b=c[a>>2]|0;if(b>>>0<=j>>>0?(v=b+(c[a+4>>2]|0)|0,v>>>0>j>>>0):0)break;a=c[a+8>>2]|0}f=v+-47+((v+-47+8&7|0)==0?0:0-(v+-47+8)&7)|0;f=f>>>0<(j+16|0)>>>0?j:f;a=g+8|0;a=(a&7|0)==0?0:0-a&7;u=g+a|0;a=h+-40-a|0;c[7003]=u;c[7e3]=a;c[u+4>>2]=a|1;c[u+a+4>>2]=40;c[7004]=c[7119];c[f+4>>2]=27;c[f+8>>2]=c[7109];c[f+8+4>>2]=c[7110];c[f+8+8>>2]=c[7111];c[f+8+12>>2]=c[7112];c[7109]=g;c[7110]=h;c[7112]=0;c[7111]=f+8;a=f+24|0;do{u=a;a=a+4|0;c[a>>2]=7}while((u+8|0)>>>0>>0);if((f|0)!=(j|0)){c[f+4>>2]=c[f+4>>2]&-2;c[j+4>>2]=f-j|1;c[f>>2]=f-j;if((f-j|0)>>>0<256){d=28028+((f-j|0)>>>3<<1<<2)|0;a=c[6997]|0;if(!(a&1<<((f-j|0)>>>3))){c[6997]=a|1<<((f-j|0)>>>3);a=d;b=d+8|0}else{a=c[d+8>>2]|0;b=d+8|0}c[b>>2]=j;c[a+12>>2]=j;c[j+8>>2]=a;c[j+12>>2]=d;break}if((f-j|0)>>>8)if((f-j|0)>>>0>16777215)a=31;else{a=(f-j|0)>>>8<<((((f-j|0)>>>8)+1048320|0)>>>16&8);a=14-((a+520192|0)>>>16&4|(((f-j|0)>>>8)+1048320|0)>>>16&8|((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)+(a<<((a+520192|0)>>>16&4)<<(((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;a=(f-j|0)>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[j+28>>2]=a;c[j+20>>2]=0;c[j+16>>2]=0;b=c[6998]|0;d=1<>2]=j;c[j+24>>2]=e;c[j+12>>2]=j;c[j+8>>2]=j;break}b=f-j<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f-j|0)){u=216;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=215;break}else{b=b<<1;d=a}}if((u|0)==215){c[e>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}else if((u|0)==216){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=j;c[u>>2]=j;c[j+8>>2]=v;c[j+12>>2]=d;c[j+24>>2]=0;break}}}else{v=c[7001]|0;if((v|0)==0|g>>>0>>0)c[7001]=g;c[7109]=g;c[7110]=h;c[7112]=0;c[7006]=c[7115];c[7005]=-1;a=0;do{v=28028+(a<<1<<2)|0;c[v+12>>2]=v;c[v+8>>2]=v;a=a+1|0}while((a|0)!=32);v=g+8|0;v=(v&7|0)==0?0:0-v&7;u=g+v|0;v=h+-40-v|0;c[7003]=u;c[7e3]=v;c[u+4>>2]=v|1;c[u+v+4>>2]=40;c[7004]=c[7119]}while(0);a=c[7e3]|0;if(a>>>0>o>>>0){t=a-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}}c[7137]=12;v=0;l=w;return v|0}function tc(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,H=0.0,I=0.0,J=0.0,K=0.0;x=l;l=l+544|0;f=+g[b+100>>2];k=+g[b+104>>2];h=+g[b+108>>2];if(f*f+k*k+h*h>0.0){m=+E(+(1.0-+g[b+244>>2]),+e);g[b+100>>2]=f*m;g[b+104>>2]=m*k;g[b+108>>2]=m*h;f=f*m;k=m*k;h=m*h}m=f*f+k*k+h*h;if(m>0.0){q=c[b+8>>2]|0;c[x+472>>2]=c[q+4>>2];c[x+472+4>>2]=c[q+4+4>>2];c[x+472+8>>2]=c[q+4+8>>2];c[x+472+12>>2]=c[q+4+12>>2];i=x+472+16|0;c[i>>2]=c[q+20>>2];c[i+4>>2]=c[q+20+4>>2];c[i+8>>2]=c[q+20+8>>2];c[i+12>>2]=c[q+20+12>>2];j=x+472+32|0;c[j>>2]=c[q+36>>2];c[j+4>>2]=c[q+36+4>>2];c[j+8>>2]=c[q+36+8>>2];c[j+12>>2]=c[q+36+12>>2];o=x+472+48|0;c[o>>2]=c[q+52>>2];c[o+4>>2]=c[q+52+4>>2];c[o+8>>2]=c[q+52+8>>2];c[o+12>>2]=c[q+52+12>>2];K=+D(+m);I=f*(1.0/K);B=k*(1.0/K);m=h*(1.0/K);h=+G(+(K*e*.5))/+D(+(m*m+(I*I+B*B)));K=+F(+(K*e*.5));yh(x+472|0,x+408|0);H=+g[x+408>>2];J=+g[x+408+12>>2];y=+g[x+408+8>>2];z=+g[x+408+4>>2];f=K*H+I*h*J+B*h*y-m*h*z;k=m*h*H+(B*h*J+K*z)-I*h*y;A=m*h*J+K*y+I*h*z-B*h*H;y=K*J-I*h*H-B*h*z-m*h*y;h=f*(2.0/(y*y+(A*A+(f*f+k*k))));m=k*(2.0/(y*y+(A*A+(f*f+k*k))));z=A*(2.0/(y*y+(A*A+(f*f+k*k))));g[x+472>>2]=1.0-(k*m+A*z);g[x+472+4>>2]=f*m-y*z;g[x+472+8>>2]=f*z+y*m;g[x+472+12>>2]=0.0;g[x+472+16>>2]=f*m+y*z;g[x+472+20>>2]=1.0-(f*h+A*z);g[x+472+24>>2]=k*z-y*h;g[x+472+28>>2]=0.0;g[x+472+32>>2]=f*z-y*m;g[x+472+36>>2]=k*z+y*h;g[x+472+40>>2]=1.0-(f*h+k*m);g[x+472+44>>2]=0.0;q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[x+472>>2];c[q+4+4>>2]=c[x+472+4>>2];c[q+4+8>>2]=c[x+472+8>>2];c[q+4+12>>2]=c[x+472+12>>2];c[q+20>>2]=c[i>>2];c[q+20+4>>2]=c[i+4>>2];c[q+20+8>>2]=c[i+8>>2];c[q+20+12>>2]=c[i+12>>2];c[q+36>>2]=c[j>>2];c[q+36+4>>2]=c[j+4>>2];c[q+36+8>>2]=c[j+8>>2];c[q+36+12>>2]=c[j+12>>2];c[q+52>>2]=c[o>>2];c[q+52+4>>2]=c[o+4>>2];c[q+52+8>>2]=c[o+8>>2];c[q+52+12>>2]=c[o+12>>2];q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];$p(b+152|0,q+52|0,16)|0;yh(q+4|0,x+408|0);c[b+168>>2]=c[x+408>>2];c[b+168+4>>2]=c[x+408+4>>2];c[b+168+8>>2]=c[x+408+8>>2];c[b+168+12>>2]=c[x+408+12>>2];c[b+184>>2]=c[b+168>>2];c[b+184+4>>2]=c[b+168+4>>2];c[b+184+8>>2]=c[b+168+8>>2];c[b+184+12>>2]=c[b+168+12>>2]}if((a[b+251>>0]|0)==0?+g[b+252>>2]<=0.0:0){l=x;return}a[b+248>>0]=(xb[c[(c[b>>2]|0)+48>>2]&127](b)|0)&1;f=+g[b+68>>2];h=+g[b+72>>2];k=+g[b+76>>2];m=+E(+(1.0-+g[b+240>>2]),+e);if(f*f+h*h+k*k>0.0){g[b+68>>2]=f*m;g[b+72>>2]=m*h;g[b+76>>2]=m*k}f=m*+g[b+20>>2]-+g[b+52>>2]*e;g[b+20>>2]=f;if(f>0.0?(p=+g[b+32>>2],f>p):0){g[b+20>>2]=p;f=p}if(f<0.0?(K=+C(+f),r=+C(+(+g[b+28>>2])),K>r):0){g[b+20>>2]=-r;f=-r}h=f*e;g[b+24>>2]=h;q=c[b+8>>2]|0;c[x>>2]=c[q+4>>2];c[x+4>>2]=c[q+4+4>>2];c[x+8>>2]=c[q+4+8>>2];c[x+12>>2]=c[q+4+12>>2];c[x+16>>2]=c[q+20>>2];c[x+16+4>>2]=c[q+20+4>>2];c[x+16+8>>2]=c[q+20+8>>2];c[x+16+12>>2]=c[q+20+12>>2];c[x+32>>2]=c[q+36>>2];c[x+32+4>>2]=c[q+36+4>>2];c[x+32+8>>2]=c[q+36+8>>2];c[x+32+12>>2]=c[q+36+12>>2];c[x+48>>2]=c[q+52>>2];c[x+48+4>>2]=c[q+52+4>>2];c[x+48+8>>2]=c[q+52+8>>2];c[x+48+12>>2]=c[q+52+12>>2];if(f<0.0)k=+g[b+60>>2];else k=0.0;c[x+472>>2]=1065353216;o=x+472+4|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[x+472+20>>2]=1065353216;q=x+472+24|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[x+472+40>>2]=1065353216;c[x+472+44>>2]=0;c[x+408>>2]=1065353216;j=x+408+4|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[x+408+20>>2]=1065353216;i=x+408+24|0;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];A=h>0.0?h:0.0;J=k*+g[b+260>>2]+ +g[b+136>>2]+A*+g[b+276>>2];B=k*+g[b+264>>2]+ +g[b+140>>2]+A*+g[b+280>>2];g[b+152>>2]=k*+g[b+256>>2]+ +g[b+132>>2]+ +g[b+272>>2]*A;g[b+156>>2]=J;g[b+160>>2]=B;g[b+164>>2]=0.0;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];J=+g[b+172>>2];A=+g[b+176>>2];K=+g[b+180>>2];z=B*(2.0/(B*B+J*J+A*A+K*K));H=J*(2.0/(B*B+J*J+A*A+K*K));I=A*(2.0/(B*B+J*J+A*A+K*K));g[x+472>>2]=1.0-(J*H+A*I);g[o>>2]=B*H-K*I;g[x+472+8>>2]=B*I+K*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+K*I;g[x+472+20>>2]=1.0-(B*z+A*I);g[q>>2]=J*I-K*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*I-K*H;g[x+472+36>>2]=J*I+K*z;g[x+472+40>>2]=1.0-(B*z+J*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];J=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];K=H*(2.0/(H*H+J*J+z*z+B*B));I=J*(2.0/(H*H+J*J+z*z+B*B));A=z*(2.0/(H*H+J*J+z*z+B*B));g[x+408>>2]=1.0-(J*I+z*A);g[j>>2]=H*I-B*A;g[x+408+8>>2]=H*A+B*I;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*I+B*A;g[x+408+20>>2]=1.0-(H*K+z*A);g[i>>2]=J*A-B*K;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*I;g[x+408+36>>2]=J*A+B*K;g[x+408+40>>2]=1.0-(H*K+J*I);g[x+408+44>>2]=0.0;i=c[b+8>>2]|0;I=-+g[b+256>>2];J=-+g[b+260>>2];K=-+g[b+264>>2];j=c[b+48>>2]|0;g[x+296+4>>2]=1.0;q=x+296+16|0;c[x+296+80>>2]=0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;c[q+28>>2]=0;c[x+296>>2]=5252;c[x+296+84>>2]=i;g[x+296+88>>2]=I;g[x+296+92>>2]=J;g[x+296+96>>2]=K;g[x+296+100>>2]=0.0;c[x+296+104>>2]=j;j=c[i+188>>2]|0;c[x+296+8>>2]=c[j+4>>2];c[x+296+12>>2]=c[j+8>>2];j=c[b+12>>2]|0;if(!(a[b+250>>0]|0))Ud(d,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);else pd(i,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);if((+g[x+296+4>>2]<1.0?(n=c[b+8>>2]|0,(c[n+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,n,c[x+296+80>>2]|0)|0:0){do if(+g[x+296+48>>2]*+g[b+256>>2]+ +g[x+296+52>>2]*+g[b+260>>2]+ +g[x+296+56>>2]*+g[b+264>>2]>0.0){f=+g[x+296+4>>2];g[b+148>>2]=k*f;if(!(a[b+288>>0]|0)){c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];break}else{g[b+132>>2]=(1.0-f)*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=(1.0-f)*+g[b+136>>2]+f*+g[b+156>>2];g[b+140>>2]=(1.0-f)*+g[b+140>>2]+f*+g[b+160>>2];break}}while(0);o=c[b+8>>2]|0;c[o+52>>2]=c[b+132>>2];c[o+52+4>>2]=c[b+132+4>>2];c[o+52+8>>2]=c[b+132+8>>2];c[o+52+12>>2]=c[b+132+12>>2];q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[o+4>>2];c[q+4+4>>2]=c[o+4+4>>2];c[q+4+8>>2]=c[o+4+8>>2];c[q+4+12>>2]=c[o+4+12>>2];c[q+20>>2]=c[o+20>>2];c[q+20+4>>2]=c[o+20+4>>2];c[q+20+8>>2]=c[o+20+8>>2];c[q+20+12>>2]=c[o+20+12>>2];c[q+36>>2]=c[o+36>>2];c[q+36+4>>2]=c[o+36+4>>2];c[q+36+8>>2]=c[o+36+8>>2];c[q+36+12>>2]=c[o+36+12>>2];c[q+52>>2]=c[o+52>>2];c[q+52+4>>2]=c[o+52+4>>2];c[q+52+8>>2]=c[o+52+8>>2];c[q+52+12>>2]=c[o+52+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;q=(c[b+8>>2]|0)+52|0;c[b+152>>2]=c[q>>2];c[b+152+4>>2]=c[q+4>>2];c[b+152+8>>2]=c[q+8>>2];c[b+152+12>>2]=c[q+12>>2];$p(b+132|0,q|0,16)|0;if(+g[b+24>>2]>0.0){g[b+24>>2]=0.0;g[b+20>>2]=0.0;c[b+148>>2]=c[b+60>>2]}}else{g[b+148>>2]=k;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(a[b+251>>0]|0)){J=+g[b+252>>2];K=J>e?e:J;g[b+252>>2]=J-e;hd(b,d,K*+g[b+68>>2],K*+g[b+72>>2],K*+g[b+76>>2])}else hd(b,d,+g[b+68>>2],+g[b+72>>2],+g[b+76>>2]);c[x+280>>2]=c[b+152>>2];c[x+280+4>>2]=c[b+152+4>>2];c[x+280+8>>2]=c[b+152+8>>2];c[x+280+12>>2]=c[b+152+12>>2];K=+g[b+20>>2];f=(K<0.0?-K:0.0)*e;if(!(K>0.0)){do if(f>0.0?(s=+g[b+28>>2],f>s):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;f=s}while(0);p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=c[b+8>>2]|0;o=c[b+48>>2]|0;q=x+172+4|0;g[q>>2]=1.0;n=x+172+16|0;c[x+172+80>>2]=0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;c[n+28>>2]=0;c[x+172>>2]=5252;c[x+172+84>>2]=i;c[x+172+88>>2]=c[b+256>>2];c[x+172+88+4>>2]=c[b+256+4>>2];c[x+172+88+8>>2]=c[b+256+8>>2];c[x+172+88+12>>2]=c[b+256+12>>2];c[x+172+104>>2]=o;n=c[i+188>>2]|0;c[x+172+8>>2]=c[n+4>>2];c[x+172+12>>2]=c[n+8>>2];g[x+64+4>>2]=1.0;j=x+64+16|0;c[x+64+80>>2]=0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[x+64>>2]=5252;c[x+64+84>>2]=i;c[x+64+88>>2]=c[b+256>>2];c[x+64+88+4>>2]=c[b+256+4>>2];c[x+64+88+8>>2]=c[b+256+8>>2];c[x+64+88+12>>2]=c[b+256+12>>2];c[x+64+104>>2]=o;c[x+64+8>>2]=c[n+4>>2];c[x+64+12>>2]=c[n+8>>2];n=x+408+24|0;o=x+296+44|0;i=0;while(1){c[x+408+12>>2]=0;c[x+408+12+4>>2]=0;c[x+408+20>>2]=1065353216;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+296>>2]=1065353216;c[x+296+4>>2]=0;c[x+296+4+4>>2]=0;c[x+296+4+8>>2]=0;c[x+296+4+12>>2]=0;c[x+296+20>>2]=1065353216;c[x+296+24>>2]=0;c[x+296+24+4>>2]=0;c[x+296+24+8>>2]=0;c[x+296+24+12>>2]=0;c[x+296+40>>2]=1065353216;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];K=+g[b+172>>2];A=+g[b+176>>2];I=+g[b+180>>2];z=B*(2.0/(B*B+K*K+A*A+I*I));H=K*(2.0/(B*B+K*K+A*A+I*I));J=A*(2.0/(B*B+K*K+A*A+I*I));g[x+472>>2]=1.0-(K*H+A*J);g[x+472+4>>2]=B*H-I*J;g[x+472+8>>2]=B*J+I*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+I*J;g[x+472+20>>2]=1.0-(B*z+A*J);g[x+472+24>>2]=K*J-I*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*J-I*H;g[x+472+36>>2]=K*J+I*z;g[x+472+40>>2]=1.0-(B*z+K*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];K=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];I=H*(2.0/(H*H+K*K+z*z+B*B));J=K*(2.0/(H*H+K*K+z*z+B*B));A=z*(2.0/(H*H+K*K+z*z+B*B));g[x+408>>2]=1.0-(K*J+z*A);g[x+408+4>>2]=H*J-B*A;g[x+408+8>>2]=H*A+B*J;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*J+B*A;g[x+408+20>>2]=1.0-(H*I+z*A);g[n>>2]=K*A-B*I;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*J;g[x+408+36>>2]=K*A+B*I;g[x+408+40>>2]=1.0-(H*I+K*J);g[x+408+44>>2]=0.0;J=+g[b+156>>2]-m;K=+g[b+160>>2]-p;g[x+296+48>>2]=+g[b+152>>2]-k;g[x+296+52>>2]=J;g[x+296+56>>2]=K;g[x+296+60>>2]=0.0;if(!(a[b+250>>0]|0)){Ud(d,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(c[(c[b+8>>2]|0)+204>>2]&4|0)==0:0)Ud(d,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}else{pd(c[b+8>>2]|0,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(t=c[b+8>>2]|0,(c[t+204>>2]&4|0)==0):0)pd(t,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}h=+g[b+20>>2];h=(h<0.0?-h:0.0)*e;if(!(a[b+290>>0]|0))if(+g[x+64+4>>2]<1.0?(v=c[b+8>>2]|0,(c[v+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,v,c[x+64+80>>2]|0)|0;else j=0;else if((+g[q>>2]<1.0?1:+g[x+64+4>>2]<1.0)?(u=c[b+8>>2]|0,(c[u+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,u,c[x+172+80>>2]|0)|0;else j=0;if(+g[b+20>>2]<0.0)f=+g[b+60>>2];else f=0.0;if(i|(!(h>0.0)|!(h>0]|0)==0?a[b+249>>0]|0:0){i=0;break}c[b+152>>2]=c[x+280>>2];c[b+152+4>>2]=c[x+280+4>>2];c[b+152+8>>2]=c[x+280+8>>2];c[b+152+12>>2]=c[x+280+12>>2];p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=1}j=c[b+8>>2]|0;if(+g[q>>2]<1.0?(c[j+204>>2]&4|0)==0:0)if(i|(Bb[c[(c[b>>2]|0)+56>>2]&63](b,j,c[x+172+80>>2]|0)|0))i=69;else i=73;else if(i)i=69;else i=73;if((i|0)==69){if(!(a[b+290>>0]|0)){i=b+289|0;f=+g[q>>2];h=+g[b+136>>2]}else{h=+g[b+136>>2];i=b+289|0;f=(a[b+289>>0]|0)==0?(h-+g[x+172+68>>2])*.5:+g[q>>2]}K=1.0-f;g[b+132>>2]=K*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=K*h+f*+g[b+156>>2];g[b+140>>2]=K*+g[b+140>>2]+f*+g[b+160>>2];a[i>>0]=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+249>>0]=0}else if((i|0)==73){a[b+289>>0]=1;do if(a[b+290>>0]|0?(K=+g[b+20>>2],w=+g[b+28>>2],(K<0.0?-K:0.0)*e>w):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;H=m+ +g[b+156>>2];J=p+ +g[b+160>>2];B=w+ +g[b+148>>2];I=B*+g[b+260>>2];K=B*+g[b+264>>2];g[b+152>>2]=k+ +g[b+152>>2]-+g[b+256>>2]*B;g[b+156>>2]=H-I;g[b+160>>2]=J-K}while(0);c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}}c[x+48>>2]=c[b+132>>2];c[x+48+4>>2]=c[b+132+4>>2];c[x+48+8>>2]=c[b+132+8>>2];c[x+48+12>>2]=c[b+132+12>>2];v=c[b+8>>2]|0;c[v+304>>2]=(c[v+304>>2]|0)+1;c[v+4>>2]=c[x>>2];c[v+4+4>>2]=c[x+4>>2];c[v+4+8>>2]=c[x+8>>2];c[v+4+12>>2]=c[x+12>>2];c[v+20>>2]=c[x+16>>2];c[v+20+4>>2]=c[x+16+4>>2];c[v+20+8>>2]=c[x+16+8>>2];c[v+20+12>>2]=c[x+16+12>>2];c[v+36>>2]=c[x+32>>2];c[v+36+4>>2]=c[x+32+4>>2];c[v+36+8>>2]=c[x+32+8>>2];c[v+36+12>>2]=c[x+32+12>>2];c[v+52>>2]=c[x+48>>2];c[v+52+4>>2]=c[x+48+4>>2];c[v+52+8>>2]=c[x+48+8>>2];c[v+52+12>>2]=c[x+48+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;l=x;return}function uc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+192|0;if((e|0)<1){f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;f=c[b+32>>2]|0;if(f|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;f=c[b+52>>2]|0;if(f|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;l=I;return}c[I+32>>2]=0;c[I+36>>2]=0;c[I+40>>2]=0;c[I+44>>2]=256;c[I+48>>2]=0;c[I+52>>2]=0;c[I+56>>2]=0;c[I+60>>2]=256;c[I+64>>2]=0;c[I+68>>2]=0;c[I+72>>2]=0;c[I+76>>2]=256;a[I+96>>0]=1;c[I+92>>2]=0;c[I+84>>2]=0;c[I+88>>2]=0;f=0;h=d;i=-246811958;s=1900671690;v=-246811958;w=1900671690;y=-246811958;A=1900671690;while(1){k=c[h>>2]|0;p=c[h+4>>2]|0;q=c[h+8>>2]|0;m=(c[j>>2]=k,+g[j>>2]);s=m<(c[j>>2]=s,+g[j>>2])?k:s;n=(c[j>>2]=p,+g[j>>2]);w=n<(c[j>>2]=w,+g[j>>2])?p:w;o=(c[j>>2]=q,+g[j>>2]);A=o<(c[j>>2]=A,+g[j>>2])?q:A;i=(c[j>>2]=i,+g[j>>2])>2]=v,+g[j>>2])>2]=y,+g[j>>2])>2]=i,+g[j>>2]);z=(c[j>>2]=s,+g[j>>2]);x=(c[j>>2]=v,+g[j>>2]);u=(c[j>>2]=w,+g[j>>2]);t=(c[j>>2]=y,+g[j>>2]);r=(c[j>>2]=A,+g[j>>2]);g[I+168>>2]=B-z;s=I+168+4|0;g[s>>2]=x-u;v=I+168+8|0;g[v>>2]=t-r;g[I+168+12>>2]=0.0;h=+g[I+168+((B-z>2]>2]=h;f=+g[I+168+((!(B-z>2]>>0)%3|0;c[I+104>>2]=f;G=(h^3)-f|0;c[I+108>>2]=G;g[I+168>>2]=(B-z)*9.788566967472434e-05;g[s>>2]=(x-u)*9.788566967472434e-05;g[v>>2]=(t-r)*9.788566967472434e-05;if(((G+1|0)%3|0|0)==(h|0)){m=(B-z)*9.788566967472434e-05;n=(x-u)*9.788566967472434e-05;o=(t-r)*9.788566967472434e-05}else{g[I+168>>2]=-((B-z)*9.788566967472434e-05);g[s>>2]=-((x-u)*9.788566967472434e-05);g[v>>2]=-((t-r)*9.788566967472434e-05);m=-((B-z)*9.788566967472434e-05);n=-((x-u)*9.788566967472434e-05);o=-((t-r)*9.788566967472434e-05)}c[I>>2]=c[I+168>>2];c[I+4>>2]=c[I+168+4>>2];c[I+8>>2]=c[I+168+8>>2];c[I+12>>2]=c[I+168+12>>2];if(m!=0.0)g[I+168>>2]=1.0/m;if(n!=0.0)g[s>>2]=1.0/n;if(o!=0.0)g[v>>2]=1.0/o;g[I+16>>2]=(B+z)*.5;g[I+20>>2]=(x+u)*.5;g[I+24>>2]=(t+r)*.5;g[I+28>>2]=0.0;w=I+144+16|0;a[w>>0]=1;y=I+144+12|0;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((e<<4|3)+16|0)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}i=c[I+144+4>>2]|0;k=c[y>>2]|0;if((i|0)<=0){if(k|0)H=32}else{f=0;do{H=h+(f<<4)|0;G=k+(f<<4)|0;c[H>>2]=c[G>>2];c[H+4>>2]=c[G+4>>2];c[H+8>>2]=c[G+8>>2];c[H+12>>2]=c[G+12>>2];f=f+1|0}while((f|0)!=(i|0));H=32}if((H|0)==32){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=h;c[I+144+8>>2]=e;c[h>>2]=c[I+128>>2];c[h+4>>2]=c[I+128+4>>2];c[h+8>>2]=c[I+128+8>>2];c[h+12>>2]=c[I+128+12>>2];if((e|0)!=1){f=1;do{G=(c[y>>2]|0)+(f<<4)|0;c[G>>2]=c[I+128>>2];c[G+4>>2]=c[I+128+4>>2];c[G+8>>2]=c[I+128+8>>2];c[G+12>>2]=c[I+128+12>>2];f=f+1|0}while((f|0)!=(e|0))}c[I+144+4>>2]=e;i=I+128+(c[I+108>>2]<<2)|0;k=c[y>>2]|0;p=I+128+(c[I+112>>2]<<2)|0;q=I+128+(c[I+104>>2]<<2)|0;o=+g[I+16>>2];r=+g[I+20>>2];t=+g[I+24>>2];u=+g[I+168>>2];n=+g[s>>2];m=+g[v>>2];h=0;f=d;while(1){z=(+g[f+4>>2]-r)*n;B=(+g[f+8>>2]-t)*m;g[I+128>>2]=(+g[f>>2]-o)*u;g[I+128+4>>2]=z;g[I+128+8>>2]=B;g[I+128+12>>2]=0.0;c[k+(h<<4)>>2]=~~+g[i>>2];c[k+(h<<4)+4>>2]=~~+g[p>>2];c[k+(h<<4)+8>>2]=~~+g[q>>2];c[k+(h<<4)+12>>2]=h;h=h+1|0;if((h|0)==(e|0))break;else f=f+16|0}if((e|0)>1)ah(I+144|0,0,e+-1|0);c[I+36>>2]=c[I+32>>2];c[I+40>>2]=0;c[I+44>>2]=e;f=c[I+84>>2]|0;if((f|0)<(e|0)){if((c[I+88>>2]|0)<(e|0)){if(!e){h=0;k=f}else{c[6995]=(c[6995]|0)+1;h=sc((e<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[I+84>>2]|0}if((k|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[I+92>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[I+92>>2]|0;if(i|0){if(a[I+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[I+92>>2]=0}a[I+96>>0]=1;c[I+92>>2]=h;c[I+88>>2]=e}do{c[(c[I+92>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(e|0))}c[I+84>>2]=e;p=0;do{f=c[I+40>>2]|0;if(!f){f=c[I+36>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(31)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}f=c[I+44>>2]|0;c[h+4>>2]=f;i=h+8|0;c[i>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*112|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[h>>2]=f;c[i>>2]=c[I+32>>2];c[I+32>>2]=h}else{c[I+36>>2]=c[f+8>>2];h=f}f=c[h>>2]|0;k=c[h+4>>2]|0;if((k|0)>0){h=0;i=f;do{h=h+1|0;G=i;i=i+112|0;c[G>>2]=(h|0)<(k|0)?i:0}while((h|0)!=(k|0))}}c[I+40>>2]=c[f>>2];G=f+104|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[G>>2]=-1;c[f+8>>2]=0;E=(c[y>>2]|0)+(p<<4)|0;F=f+88|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[G>>2]=-1;c[(c[I+92>>2]|0)+(p<<2)>>2]=f;p=p+1|0}while((p|0)<(e|0));f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[I+52>>2]=c[I+48>>2];c[I+56>>2]=0;c[I+60>>2]=e*6;c[I+116>>2]=0;c[I+120>>2]=0;c[I+100>>2]=-3;c[I+128>>2]=0;c[I+128+4>>2]=0;c[I+128+8>>2]=0;c[I+128+12>>2]=0;mc(I,0,e,I+128|0);c[I+124>>2]=c[I+128>>2];f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}f=c[b+4>>2]|0;if((f|0)<0){if((c[b+8>>2]|0)<0){h=c[b+12>>2]|0;if(h|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+8>>2]=0}do{G=(c[b+12>>2]|0)+(f<<4)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];c[G+12>>2]=c[I+168+12>>2];f=f+1|0}while((f|0)!=0)}c[b+4>>2]=0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;f=c[b+24>>2]|0;if((f|0)<0){if((c[b+28>>2]|0)<0){h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+28>>2]=0}do{G=(c[b+32>>2]|0)+(f*12|0)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];f=f+1|0}while((f|0)!=0)}c[b+24>>2]=0;h=c[b+44>>2]|0;if((h|0)<0){f=c[b+52>>2]|0;if((c[b+48>>2]|0)<0){do if(f|0){if(!(a[b+56>>0]|0))break;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}while(0);a[b+56>>0]=1;c[b+52>>2]=0;c[b+48>>2]=0;f=0}Yk(f+(h<<2)|0,0,P(h,-4)|0)|0}c[b+44>>2]=0;h=c[I+124>>2]|0;do if((c[h+104>>2]|0)<0){c[h+104>>2]=0;c[6995]=(c[6995]|0)+1;f=sc(23)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[f>>2]=h;G=0;s=1;v=f;w=1;i=f;y=f;while(1){if((c[h+100>>2]|0)>-1){g[I+168+(c[I+108>>2]<<2)>>2]=+(c[h+88>>2]|0);g[I+168+(c[I+112>>2]<<2)>>2]=+(c[h+92>>2]|0);m=+(c[h+96>>2]|0)}else{F=h+24|0;E=h+32|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0);E=h+72|0;F=h+80|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0);g[I+168+(c[I+108>>2]<<2)>>2]=B/m;F=h+40|0;E=h+48|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0)/m;g[I+168+(c[I+112>>2]<<2)>>2]=B;E=h+56|0;F=h+64|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0)/m}g[I+168+(c[I+104>>2]<<2)>>2]=m;m=+g[I+168>>2]*+g[I>>2]+ +g[I+16>>2];n=+g[I+168+4>>2]*+g[I+4>>2]+ +g[I+20>>2];o=+g[I+168+8>>2]*+g[I+8>>2]+ +g[I+24>>2];f=c[b+4>>2]|0;do if((f|0)==(c[b+8>>2]|0)){q=f|0?f<<1:1;if((f|0)>=(q|0))break;if(!q)p=0;else{c[6995]=(c[6995]|0)+1;f=sc((q<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}p=f;f=c[b+4>>2]|0}if((f|0)>0){k=0;do{F=p+(k<<4)|0;E=(c[b+12>>2]|0)+(k<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];k=k+1|0}while((k|0)!=(f|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=p;c[b+8>>2]=q;f=c[b+4>>2]|0}while(0);F=c[b+12>>2]|0;g[F+(f<<4)>>2]=m;g[F+(f<<4)+4>>2]=n;g[F+(f<<4)+8>>2]=o;g[F+(f<<4)+12>>2]=0.0;c[b+4>>2]=(c[b+4>>2]|0)+1;F=c[h+8>>2]|0;if(!F){k=s;A=v;h=w}else{D=F;E=-1;f=-1;A=s;e=v;h=w;while(1){C=D+20|0;p=c[C>>2]|0;if((p|0)<0){d=c[b+24>>2]|0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((d|0)==(c[b+28>>2]|0)){s=d|0?d<<1:1;if((d|0)>=(s|0)){k=d;break}if(!s){k=0;q=d}else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=c[b+24>>2]|0}if((q|0)>0){p=0;do{w=k+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(q|0))}p=c[b+32>>2]|0;if(p|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=k;c[b+28>>2]=s;k=c[b+24>>2]|0}else k=d;while(0);k=(c[b+32>>2]|0)+(k*12|0)|0;c[k>>2]=c[I+168>>2];c[k+4>>2]=c[I+168+4>>2];c[k+8>>2]=c[I+168+8>>2];k=(c[b+24>>2]|0)+1|0;c[b+24>>2]=k;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((k|0)==(c[b+28>>2]|0)){s=k|0?k<<1:1;if((k|0)>=(s|0))break;if(!s)q=0;else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=k;k=c[b+24>>2]|0}if((k|0)>0){p=0;do{w=q+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(k|0))}k=c[b+32>>2]|0;if(k|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=q;c[b+28>>2]=s;k=c[b+24>>2]|0}while(0);w=(c[b+32>>2]|0)+(k*12|0)|0;c[w>>2]=c[I+168>>2];c[w+4>>2]=c[I+168+4>>2];c[w+8>>2]=c[I+168+8>>2];c[b+24>>2]=(c[b+24>>2]|0)+1;w=c[b+32>>2]|0;c[C>>2]=d;c[(c[D+8>>2]|0)+20>>2]=d+1;c[w+(d*12|0)+4>>2]=1;c[w+((d+1|0)*12|0)+4>>2]=-1;v=c[D+12>>2]|0;k=c[v+104>>2]|0;if((k|0)<0){c[v+104>>2]=h;do if((h|0)==(A|0)){k=A|0?A<<1:1;if((A|0)>=(k|0)){k=A;p=e;s=y;break}do if(!k)q=0;else{c[6995]=(c[6995]|0)+1;p=sc((k<<2|3)+16|0)|0;if(!p){q=0;break}c[(p+4+15&-16)+-4>>2]=p;q=p+4+15&-16}while(0);if((A|0)>0){p=0;do{c[q+(p<<2)>>2]=c[e+(p<<2)>>2];p=p+1|0}while((p|0)!=(A|0));if(!i){p=q;s=q;i=q;break}}else if((e|0)==0|(i|0)==0){p=q;s=q;i=q;break}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);p=q;s=q;i=q}else{k=A;p=e;s=y}while(0);c[p+(h<<2)>>2]=v;v=h;h=h+1|0;q=s}else{v=k;k=A;p=e;q=y}c[w+(d*12|0)+8>>2]=v;c[w+((d+1|0)*12|0)+8>>2]=G;s=p;p=c[C>>2]|0}else{k=A;s=e;q=y}if((E|0)>-1)c[(c[b+32>>2]|0)+(p*12|0)>>2]=E-p;else f=p;D=c[D>>2]|0;if((D|0)==(F|0))break;else{E=p;A=k;e=s;y=q}}c[(c[b+32>>2]|0)+(f*12|0)>>2]=p-f;A=s;y=q}f=G+1|0;if((f|0)>=(h|0))break;G=f;s=k;v=A;w=h;h=c[A+(f<<2)>>2]|0}if((G|0)>-1){v=0;while(1){w=c[(c[A+(v<<2)>>2]|0)+8>>2]|0;if(w|0){s=w;do{q=s+20|0;f=c[q>>2]|0;if((f|0)>-1){h=c[b+44>>2]|0;do if((h|0)==(c[b+48>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[b+44>>2]|0}k=c[b+52>>2]|0;if((h|0)<=0){if(k)H=180}else{i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));H=180}if((H|0)==180){H=0;if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+52>>2]=0;h=c[b+44>>2]|0}a[b+56>>0]=1;c[b+52>>2]=f;c[b+48>>2]=p;f=c[q>>2]|0}while(0);c[(c[b+52>>2]|0)+(h<<2)>>2]=f;c[b+44>>2]=(c[b+44>>2]|0)+1;f=s;do{c[f+20>>2]=-1;f=c[(c[f+8>>2]|0)+4>>2]|0}while((f|0)!=(s|0))}s=c[s>>2]|0}while((s|0)!=(w|0))}if((v|0)==(G|0))break;else v=v+1|0}}if((A|0)==0|(y|0)==0)break;c[6996]=(c[6996]|0)+1;Cd(c[y+-4>>2]|0)}while(0);Ri(I);l=I;return}function vc(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;F=l;l=l+960|0;E=c[f+4>>2]|0;C=c[f+12>>2]|0;j=c[E+4>>2]|0;if((j|0)<20){c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];g[F+416+308>>2]=9.999999747378752e-05;a[F+416+332>>0]=0;c[F+352>>2]=9464;c[F+128>>2]=9532;c[F+128+4>>2]=F+416;c[F+128+8>>2]=F+352;c[F+128+12>>2]=b;c[F+128+16>>2]=E;c[F+128+20>>2]=0;if((Wd(F+128|0,d,e,C,C,F+776|0)|0?(u=F+776+132|0,p=+g[u>>2],q=+g[F+776+136>>2],r=+g[F+776+140>>2],p*p+q*q+r*r>9.999999747378752e-05):0)?(s=+g[F+776+164>>2],s<+g[h+4>>2]):0){i=1.0/+D(+(p*p+q*q+r*r));g[u>>2]=p*i;g[F+776+136>>2]=q*i;g[F+776+140>>2]=r*i;c[F+64>>2]=c[f+8>>2];c[F+64+4>>2]=0;c[F+64+8>>2]=c[u>>2];c[F+64+8+4>>2]=c[u+4>>2];c[F+64+8+8>>2]=c[u+8>>2];c[F+64+8+12>>2]=c[u+12>>2];c[F+64+24>>2]=c[F+776+148>>2];c[F+64+24+4>>2]=c[F+776+148+4>>2];c[F+64+24+8>>2]=c[F+776+148+8>>2];c[F+64+24+12>>2]=c[F+776+148+12>>2];g[F+64+40>>2]=s;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+64|0,1)}l=F;return}if((j+-21|0)>>>0>=9){if((j|0)!=31){l=F;return}u=c[(c[b>>2]|0)+8>>2]|0;M=+g[C>>2];N=+g[C+16>>2];O=+g[C+32>>2];w=+g[C+4>>2];v=+g[C+20>>2];s=+g[C+36>>2];r=+g[C+8>>2];p=+g[C+24>>2];n=+g[C+40>>2];B=-+g[C+48>>2];z=-+g[C+52>>2];x=-+g[C+56>>2];k=+g[d>>2];A=+g[d+16>>2];y=+g[d+32>>2];G=+g[d+4>>2];H=+g[d+20>>2];I=+g[d+36>>2];J=+g[d+8>>2];K=+g[d+24>>2];L=+g[d+40>>2];q=+g[d+48>>2];o=+g[d+52>>2];m=+g[d+56>>2];g[F+64>>2]=M*k+N*A+O*y;g[F+64+4>>2]=M*G+N*H+O*I;g[F+64+8>>2]=M*J+N*K+O*L;g[F+64+12>>2]=0.0;g[F+64+16>>2]=w*k+v*A+s*y;g[F+64+20>>2]=w*G+v*H+s*I;g[F+64+24>>2]=w*J+v*K+s*L;g[F+64+28>>2]=0.0;g[F+64+32>>2]=r*k+p*A+n*y;g[F+64+36>>2]=r*G+p*H+n*I;g[F+64+40>>2]=r*J+p*K+n*L;g[F+64+44>>2]=0.0;g[F+64+48>>2]=M*B+N*z+O*x+(M*q+N*o+O*m);g[F+64+52>>2]=w*B+v*z+s*x+(w*q+v*o+s*m);g[F+64+56>>2]=r*B+p*z+n*x+(r*q+p*o+n*m);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+776|0,F+416|0);u=c[(c[b>>2]|0)+8>>2]|0;m=+g[C>>2];n=+g[C+16>>2];o=+g[C+32>>2];p=+g[C+4>>2];q=+g[C+20>>2];r=+g[C+36>>2];x=+g[C+8>>2];z=+g[C+24>>2];B=+g[C+40>>2];s=-+g[C+48>>2];v=-+g[C+52>>2];w=-+g[C+56>>2];O=+g[e>>2];N=+g[e+16>>2];M=+g[e+32>>2];L=+g[e+4>>2];K=+g[e+20>>2];J=+g[e+36>>2];I=+g[e+8>>2];H=+g[e+24>>2];G=+g[e+40>>2];y=+g[e+48>>2];A=+g[e+52>>2];k=+g[e+56>>2];g[F+64>>2]=m*O+n*N+o*M;g[F+64+4>>2]=m*L+n*K+o*J;g[F+64+8>>2]=m*I+n*H+o*G;g[F+64+12>>2]=0.0;g[F+64+16>>2]=p*O+q*N+r*M;g[F+64+20>>2]=p*L+q*K+r*J;g[F+64+24>>2]=p*I+q*H+r*G;g[F+64+28>>2]=0.0;g[F+64+32>>2]=x*O+z*N+B*M;g[F+64+36>>2]=x*L+z*K+B*J;g[F+64+40>>2]=x*I+z*H+B*G;g[F+64+44>>2]=0.0;g[F+64+48>>2]=m*s+n*v+o*w+(m*y+n*A+o*k);g[F+64+52>>2]=p*s+q*v+r*w+(p*y+q*A+r*k);g[F+64+56>>2]=x*s+z*v+B*w+(x*y+z*A+B*k);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+352|0,F+128|0);k=+g[F+352>>2];if(k<+g[F+776>>2])g[F+776>>2]=k;k=+g[F+352+4>>2];if(k<+g[F+776+4>>2])g[F+776+4>>2]=k;k=+g[F+352+8>>2];if(k<+g[F+776+8>>2])g[F+776+8>>2]=k;k=+g[F+352+12>>2];if(k<+g[F+776+12>>2])g[F+776+12>>2]=k;k=+g[F+128>>2];if(+g[F+416>>2]>2]=k;k=+g[F+128+4>>2];if(+g[F+416+4>>2]>2]=k;k=+g[F+128+8>>2];if(+g[F+416+8>>2]>2]=k;k=+g[F+128+12>>2];if(+g[F+416+12>>2]>2]=k;c[F+64>>2]=6224;c[F+64+4>>2]=f;c[F+64+8>>2]=b;c[F+64+12>>2]=d;c[F+64+16>>2]=e;g[F+64+20>>2]=i;c[F+64+24>>2]=E;c[F+64+28>>2]=C;c[F+64+32>>2]=h;j=c[E+68>>2]|0;if(!j){if((c[E+20>>2]|0)>0){j=0;do{f=c[E+28>>2]|0;h=c[f+(j*80|0)+64>>2]|0;e=f+(j*80|0)|0;c[F>>2]=c[e>>2];c[F+4>>2]=c[e+4>>2];c[F+8>>2]=c[e+8>>2];c[F+12>>2]=c[e+12>>2];e=f+(j*80|0)+16|0;c[F+16>>2]=c[e>>2];c[F+16+4>>2]=c[e+4>>2];c[F+16+8>>2]=c[e+8>>2];c[F+16+12>>2]=c[e+12>>2];e=f+(j*80|0)+32|0;c[F+32>>2]=c[e>>2];c[F+32+4>>2]=c[e+4>>2];c[F+32+8>>2]=c[e+8>>2];c[F+32+12>>2]=c[e+12>>2];f=f+(j*80|0)+48|0;c[F+48>>2]=c[f>>2];c[F+48+4>>2]=c[f+4>>2];c[F+48+8>>2]=c[f+8>>2];c[F+48+12>>2]=c[f+12>>2];jg(F+64|0,j,F,h);j=j+1|0}while((j|0)<(c[E+20>>2]|0))}}else{c[F>>2]=c[F+776>>2];c[F+4>>2]=c[F+776+4>>2];c[F+8>>2]=c[F+776+8>>2];c[F+12>>2]=c[F+776+12>>2];c[F+16>>2]=c[F+416>>2];c[F+16+4>>2]=c[F+416+4>>2];c[F+16+8>>2]=c[F+416+8>>2];c[F+16+12>>2]=c[F+416+12>>2];Bf(c[j>>2]|0,F,F+64|0)}l=F;return}switch(j|0){case 21:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];r=+g[C+4>>2];s=+g[C+20>>2];v=+g[C+36>>2];w=+g[C+8>>2];x=+g[C+24>>2];y=+g[C+40>>2];z=-+g[C+48>>2];A=-+g[C+52>>2];B=-+g[C+56>>2];n=+g[d+48>>2];m=+g[d+52>>2];k=+g[d+56>>2];g[F+416>>2]=o*z+p*A+q*B+(o*n+p*m+q*k);g[F+416+4>>2]=r*z+s*A+v*B+(r*n+s*m+v*k);g[F+416+8>>2]=w*z+x*A+y*B+(w*n+x*m+y*k);g[F+416+12>>2]=0.0;k=+g[e+48>>2];m=+g[e+52>>2];n=+g[e+56>>2];G=+g[e>>2];H=+g[e+16>>2];I=+g[e+32>>2];J=+g[e+4>>2];K=+g[e+20>>2];L=+g[e+36>>2];M=+g[e+8>>2];N=+g[e+24>>2];O=+g[e+40>>2];g[F+352>>2]=o*G+p*H+q*I;g[F+352+4>>2]=o*J+p*K+q*L;g[F+352+8>>2]=o*M+p*N+q*O;g[F+352+12>>2]=0.0;g[F+352+16>>2]=r*G+s*H+v*I;g[F+352+20>>2]=r*J+s*K+v*L;g[F+352+24>>2]=r*M+s*N+v*O;g[F+352+28>>2]=0.0;g[F+352+32>>2]=w*G+x*H+y*I;g[F+352+36>>2]=w*J+x*K+y*L;g[F+352+40>>2]=w*M+x*N+y*O;j=F+352+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;j=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+128>>2]=9392;c[F+128+4>>2]=b;c[F+128+8>>2]=c[d>>2];c[F+128+8+4>>2]=c[d+4>>2];c[F+128+8+8>>2]=c[d+8>>2];c[F+128+8+12>>2]=c[d+12>>2];c[F+128+24>>2]=c[d+16>>2];c[F+128+24+4>>2]=c[d+16+4>>2];c[F+128+24+8>>2]=c[d+16+8>>2];c[F+128+24+12>>2]=c[d+16+12>>2];c[F+128+40>>2]=c[d+32>>2];c[F+128+40+4>>2]=c[d+32+4>>2];c[F+128+40+8>>2]=c[d+32+8>>2];c[F+128+40+12>>2]=c[d+32+12>>2];c[F+128+56>>2]=c[d+48>>2];c[F+128+56+4>>2]=c[d+48+4>>2];c[F+128+56+8>>2]=c[d+48+8>>2];c[F+128+56+12>>2]=c[d+48+12>>2];c[F+128+72>>2]=c[e>>2];c[F+128+72+4>>2]=c[e+4>>2];c[F+128+72+8>>2]=c[e+8>>2];c[F+128+72+12>>2]=c[e+12>>2];c[F+128+88>>2]=c[e+16>>2];c[F+128+88+4>>2]=c[e+16+4>>2];c[F+128+88+8>>2]=c[e+16+8>>2];c[F+128+88+12>>2]=c[e+16+12>>2];c[F+128+104>>2]=c[e+32>>2];c[F+128+104+4>>2]=c[e+32+4>>2];c[F+128+104+8>>2]=c[e+32+8>>2];c[F+128+104+12>>2]=c[e+32+12>>2];c[F+128+120>>2]=c[e+48>>2];c[F+128+120+4>>2]=c[e+48+4>>2];c[F+128+120+8>>2]=c[e+48+8>>2];c[F+128+120+12>>2]=c[e+48+12>>2];c[F+128+136>>2]=c[C>>2];c[F+128+136+4>>2]=c[C+4>>2];c[F+128+136+8>>2]=c[C+8>>2];c[F+128+136+12>>2]=c[C+12>>2];c[F+128+152>>2]=c[C+16>>2];c[F+128+152+4>>2]=c[C+16+4>>2];c[F+128+152+8>>2]=c[C+16+8>>2];c[F+128+152+12>>2]=c[C+16+12>>2];c[F+128+168>>2]=c[C+32>>2];c[F+128+168+4>>2]=c[C+32+4>>2];c[F+128+168+8>>2]=c[C+32+8>>2];c[F+128+168+12>>2]=c[C+32+12>>2];c[F+128+184>>2]=c[C+48>>2];c[F+128+184+4>>2]=c[C+48+4>>2];c[F+128+184+8>>2]=c[C+48+8>>2];c[F+128+184+12>>2]=c[C+48+12>>2];g[F+128+204>>2]=O;c[F+128>>2]=6176;c[F+128+212>>2]=h;c[F+128+216>>2]=j;c[F+128+220>>2]=E;c[F+128+200>>2]=c[h+4>>2];g[F+128+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+352|0,F+64|0,F);j=c[E+52>>2]|0;c[F+776>>2]=7252;c[F+776+4>>2]=j;c[F+776+8>>2]=F+128;j=c[E+56>>2]|0;if(!(a[j+60>>0]|0))Re(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F);else ue(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F,c[j+56>>2]|0);l=F;return}case 28:{c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];c[F+416>>2]=9532;c[F+416+4>>2]=0;c[F+416+8>>2]=0;c[F+416+12>>2]=b;c[F+416+16>>2]=0;c[F+416+20>>2]=E;if((Wd(F+416|0,d,e,C,C,F+776|0)|0?(t=F+776+132|0,k=+g[t>>2],m=+g[F+776+136>>2],n=+g[F+776+140>>2],k*k+m*m+n*n>9.999999747378752e-05):0)?(o=+g[F+776+164>>2],o<+g[h+4>>2]):0){O=1.0/+D(+(k*k+m*m+n*n));g[t>>2]=k*O;g[F+776+136>>2]=m*O;g[F+776+140>>2]=n*O;c[F+352>>2]=c[f+8>>2];c[F+352+4>>2]=0;c[F+352+8>>2]=c[t>>2];c[F+352+8+4>>2]=c[t+4>>2];c[F+352+8+8>>2]=c[t+8>>2];c[F+352+8+12>>2]=c[t+12>>2];c[F+352+24>>2]=c[F+776+148>>2];c[F+352+24+4>>2]=c[F+776+148+4>>2];c[F+352+24+8>>2]=c[F+776+148+8>>2];c[F+352+24+12>>2]=c[F+776+148+12>>2];g[F+352+40>>2]=o;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+352|0,1)}l=F;return}default:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];w=+g[C+4>>2];x=+g[C+20>>2];y=+g[C+36>>2];J=+g[C+8>>2];L=+g[C+24>>2];N=+g[C+40>>2];H=-+g[C+48>>2];G=-+g[C+52>>2];B=-+g[C+56>>2];z=+g[d+48>>2];A=+g[d+52>>2];k=+g[d+56>>2];n=o*H+p*G+q*B+(o*z+p*A+q*k);m=w*H+x*G+y*B+(w*z+x*A+y*k);k=J*H+L*G+N*B+(J*z+L*A+N*k);A=+g[e+48>>2];z=+g[e+52>>2];v=+g[e+56>>2];r=o*H+p*G+q*B+(o*A+p*z+q*v);s=w*H+x*G+y*B+(w*A+x*z+y*v);v=J*H+L*G+N*B+(J*A+L*z+N*v);z=+g[e>>2];A=+g[e+16>>2];B=+g[e+32>>2];G=+g[e+4>>2];H=+g[e+20>>2];I=+g[e+36>>2];K=+g[e+8>>2];M=+g[e+24>>2];O=+g[e+40>>2];g[F+776>>2]=o*z+p*A+q*B;g[F+776+4>>2]=o*G+p*H+q*I;g[F+776+8>>2]=o*K+p*M+q*O;g[F+776+12>>2]=0.0;g[F+776+16>>2]=w*z+x*A+y*B;g[F+776+20>>2]=w*G+x*H+y*I;g[F+776+24>>2]=w*K+x*M+y*O;g[F+776+28>>2]=0.0;g[F+776+32>>2]=J*z+L*A+N*B;g[F+776+36>>2]=J*G+L*H+N*I;g[F+776+40>>2]=J*K+L*M+N*O;u=F+776+44|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;f=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+416>>2]=9392;c[F+416+4>>2]=b;c[F+416+8>>2]=c[d>>2];c[F+416+8+4>>2]=c[d+4>>2];c[F+416+8+8>>2]=c[d+8>>2];c[F+416+8+12>>2]=c[d+12>>2];c[F+416+24>>2]=c[d+16>>2];c[F+416+24+4>>2]=c[d+16+4>>2];c[F+416+24+8>>2]=c[d+16+8>>2];c[F+416+24+12>>2]=c[d+16+12>>2];c[F+416+40>>2]=c[d+32>>2];c[F+416+40+4>>2]=c[d+32+4>>2];c[F+416+40+8>>2]=c[d+32+8>>2];c[F+416+40+12>>2]=c[d+32+12>>2];c[F+416+56>>2]=c[d+48>>2];c[F+416+56+4>>2]=c[d+48+4>>2];c[F+416+56+8>>2]=c[d+48+8>>2];c[F+416+56+12>>2]=c[d+48+12>>2];c[F+416+72>>2]=c[e>>2];c[F+416+72+4>>2]=c[e+4>>2];c[F+416+72+8>>2]=c[e+8>>2];c[F+416+72+12>>2]=c[e+12>>2];c[F+416+88>>2]=c[e+16>>2];c[F+416+88+4>>2]=c[e+16+4>>2];c[F+416+88+8>>2]=c[e+16+8>>2];c[F+416+88+12>>2]=c[e+16+12>>2];c[F+416+104>>2]=c[e+32>>2];c[F+416+104+4>>2]=c[e+32+4>>2];c[F+416+104+8>>2]=c[e+32+8>>2];c[F+416+104+12>>2]=c[e+32+12>>2];c[F+416+120>>2]=c[e+48>>2];c[F+416+120+4>>2]=c[e+48+4>>2];c[F+416+120+8>>2]=c[e+48+8>>2];c[F+416+120+12>>2]=c[e+48+12>>2];c[F+416+136>>2]=c[C>>2];c[F+416+136+4>>2]=c[C+4>>2];c[F+416+136+8>>2]=c[C+8>>2];c[F+416+136+12>>2]=c[C+12>>2];c[F+416+152>>2]=c[C+16>>2];c[F+416+152+4>>2]=c[C+16+4>>2];c[F+416+152+8>>2]=c[C+16+8>>2];c[F+416+152+12>>2]=c[C+16+12>>2];c[F+416+168>>2]=c[C+32>>2];c[F+416+168+4>>2]=c[C+32+4>>2];c[F+416+168+8>>2]=c[C+32+8>>2];c[F+416+168+12>>2]=c[C+32+12>>2];c[F+416+184>>2]=c[C+48>>2];c[F+416+184+4>>2]=c[C+48+4>>2];c[F+416+184+8>>2]=c[C+48+8>>2];c[F+416+184+12>>2]=c[C+48+12>>2];g[F+416+204>>2]=O;c[F+416>>2]=6200;c[F+416+212>>2]=h;c[F+416+216>>2]=f;c[F+416+220>>2]=E;c[F+416+200>>2]=c[h+4>>2];g[F+416+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+776|0,F+352|0,F+128|0);g[F+64>>2]=n;g[F+64+4>>2]=m;g[F+64+8>>2]=k;g[F+64+12>>2]=0.0;if(r>2]=r;o=r}else o=n;if(s>2]=s;p=s}else p=m;if(v>2]=v;q=v}else q=k;g[F>>2]=n;g[F+4>>2]=m;g[F+8>>2]=k;g[F+12>>2]=0.0;if(n>2]=r;n=r}if(m>2]=s;m=s}if(k>2]=v;k=v}g[F+64>>2]=+g[F+352>>2]+o;g[F+64+4>>2]=+g[F+352+4>>2]+p;g[F+64+8>>2]=+g[F+352+8>>2]+q;g[F>>2]=+g[F+128>>2]+n;g[F+4>>2]=+g[F+128+4>>2]+m;g[F+8>>2]=+g[F+128+8>>2]+k;Vb[c[(c[E>>2]|0)+64>>2]&127](E,F+416|0,F+64|0,F);l=F;return}}}function wc(b){b=b|0;var d=0,e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0;J=l;l=l+64|0;if(!(a[b+356>>0]|0)){b=a[b+312>>0]|0;b=b<<24>>24!=0;l=J;return b|0}c[b+336>>2]=0;c[b+336+4>>2]=0;c[b+336+8>>2]=0;c[b+336+12>>2]=0;a[b+336+16>>0]=0;p=a[b+332>>0]|0;a[b+332>>0]=p&-16;a[b+356>>0]=0;switch(c[b>>2]|0){case 0:{a[b+312>>0]=0;b=0;b=b<<24>>24!=0;l=J;return b|0}case 1:{c[b+244>>2]=c[b+84>>2];c[b+244+4>>2]=c[b+84+4>>2];c[b+244+8>>2]=c[b+84+8>>2];c[b+244+12>>2]=c[b+84+12>>2];c[b+260>>2]=c[b+164>>2];c[b+260+4>>2]=c[b+164+4>>2];c[b+260+8>>2]=c[b+164+8>>2];c[b+260+12>>2]=c[b+164+12>>2];F=+g[b+248>>2]-+g[b+264>>2];G=+g[b+252>>2]-+g[b+268>>2];g[b+276>>2]=+g[b+244>>2]-+g[b+260>>2];g[b+280>>2]=F;g[b+284>>2]=G;g[b+288>>2]=0.0;a[b+352>>0]=0;a[b+332>>0]=p&-16;g[b+336>>2]=1.0;g[b+340>>2]=0.0;g[b+344>>2]=0.0;g[b+348>>2]=0.0;a[b+312>>0]=1;b=1;b=b<<24>>24!=0;l=J;return b|0}case 2:{f=+g[b+4>>2];i=+g[b+8>>2];j=+g[b+12>>2];k=+g[b+20>>2]-f;m=+g[b+24>>2]-i;n=+g[b+28>>2]-j;if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0.0)if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0]=p&-16|1;e=2;d=p&-16|1;i=((0.0-f)*k+(0.0-i)*m+(0.0-j)*n)/(k*k+m*m+n*n)}else{e=2;d=p&-16;i=1.0}else{e=1;d=p&-16;i=0.0}e=d|e;a[b+332>>0]=e;f=1.0-i;g[b+336>>2]=f;g[b+340>>2]=i;g[b+344>>2]=0.0;g[b+348>>2]=0.0;B=+g[b+84>>2];D=+g[b+88>>2];F=+g[b+92>>2];B=B+i*(+g[b+100>>2]-B);D=D+i*(+g[b+104>>2]-D);F=F+i*(+g[b+108>>2]-F);g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2];E=+g[b+168>>2];G=+g[b+172>>2];C=C+i*(+g[b+180>>2]-C);E=E+i*(+g[b+184>>2]-E);G=G+i*(+g[b+188>>2]-G);g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;if(!(e&2)){c[b>>2]=1;d=0}else d=1;if(!(e&1)){I=b+164+(d<<4)|0;H=b+84+(d<<4)|0;r=b+4+(d<<4)|0;c[b>>2]=d;c[b+4>>2]=c[r>>2];c[b+4+4>>2]=c[r+4>>2];c[b+4+8>>2]=c[r+8>>2];c[b+4+12>>2]=c[r+12>>2];c[b+84>>2]=c[H>>2];c[b+84+4>>2]=c[H+4>>2];c[b+84+8>>2]=c[H+8>>2];c[b+84+12>>2]=c[H+12>>2];c[b+164>>2]=c[I>>2];c[b+164+4>>2]=c[I+4>>2];c[b+164+8>>2]=c[I+8>>2];c[b+164+12>>2]=c[I+12>>2]}I=i>=0.0&f>=0.0&1;a[b+312>>0]=I;b=I;b=b<<24>>24!=0;l=J;return b|0}case 3:{c[J+16>>2]=0;c[J+16+4>>2]=0;c[J+16+8>>2]=0;c[J+16+12>>2]=0;cf(J+16|0,b+4|0,b+20|0,b+36|0,b+316|0);G=+g[b+336>>2];f=+g[b+340>>2];i=+g[b+344>>2];B=+g[b+84>>2]*G+ +g[b+100>>2]*f+ +g[b+116>>2]*i;D=G*+g[b+88>>2]+f*+g[b+104>>2]+i*+g[b+120>>2];F=G*+g[b+92>>2]+f*+g[b+108>>2]+i*+g[b+124>>2];g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2]*G+ +g[b+180>>2]*f+ +g[b+196>>2]*i;E=G*+g[b+168>>2]+f*+g[b+184>>2]+i*+g[b+200>>2];G=G*+g[b+172>>2]+f*+g[b+188>>2]+i*+g[b+204>>2];g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;e=c[b>>2]|0;do if((e|0)>3){d=a[b+332>>0]|0;if(!(d&8)){h=b+164+(e+-1<<4)|0;I=b+84+(e+-1<<4)|0;H=b+4+(e+-1<<4)|0;c[b>>2]=e+-1;c[b+52>>2]=c[H>>2];c[b+52+4>>2]=c[H+4>>2];c[b+52+8>>2]=c[H+8>>2];c[b+52+12>>2]=c[H+12>>2];c[b+132>>2]=c[I>>2];c[b+132+4>>2]=c[I+4>>2];c[b+132+8>>2]=c[I+8>>2];c[b+132+12>>2]=c[I+12>>2];c[b+212>>2]=c[h>>2];c[b+212+4>>2]=c[h+4>>2];c[b+212+8>>2]=c[h+8>>2];c[b+212+12>>2]=c[h+12>>2];h=e+-1|0;I=19}else{h=e;I=19}}else{if((e|0)==3){d=a[b+332>>0]|0;h=3;I=19;break}if((e|0)>1){d=a[b+332>>0]|0;e=2;I=23;break}if((e|0)==1){o=a[b+332>>0]|0;h=1;I=27}}while(0);if((I|0)==19){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=23}else{e=h;I=23}}if((I|0)==23){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];o=d;I=27}else{o=d;h=e;I=27}}if((I|0)==27?(q=h+-1|0,(o&1)==0):0){c[b>>2]=q;c[b+4>>2]=c[b+4+(q<<4)>>2];c[b+4+4>>2]=c[b+4+(q<<4)+4>>2];c[b+4+8>>2]=c[b+4+(q<<4)+8>>2];c[b+4+12>>2]=c[b+4+(q<<4)+12>>2];c[b+84>>2]=c[b+84+(q<<4)>>2];c[b+84+4>>2]=c[b+84+(q<<4)+4>>2];c[b+84+8>>2]=c[b+84+(q<<4)+8>>2];c[b+84+12>>2]=c[b+84+(q<<4)+12>>2];c[b+164>>2]=c[b+164+(q<<4)>>2];c[b+164+4>>2]=c[b+164+(q<<4)+4>>2];c[b+164+8>>2]=c[b+164+(q<<4)+8>>2];c[b+164+12>>2]=c[b+164+(q<<4)+12>>2]}if((f>=0.0?!(+g[b+336>>2]>=0.0):1)|!(i>=0.0))d=0;else d=+g[b+348>>2]>=0.0&1;a[b+312>>0]=d;b=d;b=b<<24>>24!=0;l=J;return b|0}case 4:{c[J>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;r=J+16+16|0;a[r>>0]=0;c[b+316>>2]=0;c[b+316+4>>2]=0;c[b+316+8>>2]=0;c[b+316+12>>2]=0;a[b+332>>0]=p|15;L=+g[b+20>>2];U=+g[b+4>>2];R=+g[b+24>>2];K=+g[b+8>>2];N=+g[b+28>>2];V=+g[b+12>>2];Q=+g[b+36>>2];S=+g[b+40>>2];O=+g[b+44>>2];M=+g[b+52>>2];T=+g[b+56>>2];P=+g[b+60>>2];W=((R-K)*(O-V)-(N-V)*(S-K))*(M-U)+((N-V)*(Q-U)-(L-U)*(O-V))*(T-K)+((L-U)*(S-K)-(R-K)*(Q-U))*(P-V);h=W*W<9.99999905104687e-09?-1:((0.0-U)*((R-K)*(O-V)-(N-V)*(S-K))+(0.0-K)*((N-V)*(Q-U)-(L-U)*(O-V))+((L-U)*(S-K)-(R-K)*(Q-U))*(0.0-V))*W<0.0&1;W=(N-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((L-U)*((S-K)*(P-V)-(O-V)*(T-K))+(R-K)*((O-V)*(M-U)-(Q-U)*(P-V)));o=W*W<9.99999905104687e-09?-1:((0.0-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((0.0-U)*((S-K)*(P-V)-(O-V)*(T-K))+(0.0-K)*((O-V)*(M-U)-(Q-U)*(P-V))))*W<0.0&1;W=(O-V)*((R-K)*(M-U)-(L-U)*(T-K))+((Q-U)*((N-V)*(T-K)-(R-K)*(P-V))+(S-K)*((L-U)*(P-V)-(N-V)*(M-U)));p=W*W<9.99999905104687e-09?-1:((0.0-V)*((R-K)*(M-U)-(L-U)*(T-K))+((0.0-U)*((N-V)*(T-K)-(R-K)*(P-V))+(0.0-K)*((L-U)*(P-V)-(N-V)*(M-U))))*W<0.0&1;K=(V-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((U-L)*((O-N)*(T-R)-(S-R)*(P-N))+(K-R)*((Q-L)*(P-N)-(O-N)*(M-L)));q=K*K<9.99999905104687e-09?-1:((0.0-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((0.0-L)*((O-N)*(T-R)-(S-R)*(P-N))+(0.0-R)*((Q-L)*(P-N)-(O-N)*(M-L))))*K<0.0&1;do if((o|h|p|q|0)<0){a[b+352>>0]=1;d=b+312|0;I=68}else{if(!(o|h|p|q)){if(a[b+352>>0]|0){d=b+312|0;I=68;break}a[b+312>>0]=1;c[b+276>>2]=0;c[b+276+4>>2]=0;c[b+276+8>>2]=0;c[b+276+12>>2]=0;d=1;break}if((h|0)!=0?(cf(J,b+4|0,b+20|0,b+36|0,J+16|0),f=+g[J+16>>2],i=+g[J+16+4>>2],j=+g[J+16+8>>2],k=f-+g[J>>2],m=i-+g[J+4>>2],n=j-+g[J+8>>2],k*k+m*m+n*n<3402823466385288598117041.0e14):0){X=c[J+16+12>>2]|0;g[b+316>>2]=f;g[b+320>>2]=i;g[b+324>>2]=j;c[b+328>>2]=X;X=a[r>>0]|0;a[b+332>>0]=X&1|a[b+332>>0]&-16|X&2|X&4;X=c[J+16+24>>2]|0;h=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=X;c[b+344>>2]=h;g[b+348>>2]=0.0;f=k*k+m*m+n*n}else f=3402823466385288598117041.0e14;if((o|0)!=0?(cf(J,b+4|0,b+36|0,b+52|0,J+16|0),s=+g[J+16>>2],t=+g[J+16+4>>2],u=+g[J+16+8>>2],v=s-+g[J>>2],w=t-+g[J+4>>2],x=u-+g[J+8>>2],v*v+w*w+x*x>2]|0;g[b+316>>2]=s;g[b+320>>2]=t;g[b+324>>2]=u;c[b+328>>2]=o;o=a[r>>0]|0;a[b+332>>0]=o<<1&8|(o&1|a[b+332>>0]&-16|o<<1&4);o=c[J+16+24>>2]|0;X=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];g[b+340>>2]=0.0;c[b+344>>2]=o;c[b+348>>2]=X;f=v*v+w*w+x*x}if((p|0)!=0?(cf(J,b+4|0,b+52|0,b+20|0,J+16|0),y=+g[J+16>>2],z=+g[J+16+4>>2],A=+g[J+16+8>>2],B=y-+g[J>>2],C=z-+g[J+4>>2],D=A-+g[J+8>>2],B*B+C*C+D*D>2]|0;g[b+316>>2]=y;g[b+320>>2]=z;g[b+324>>2]=A;c[b+328>>2]=p;p=a[r>>0]|0;a[b+332>>0]=p<<2&8|(p&1|a[b+332>>0]&-16|(p&255)>>>1&2);p=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=p;g[b+344>>2]=0.0;c[b+348>>2]=X;f=B*B+C*C+D*D}if(q|0?(cf(J,b+20|0,b+52|0,b+36|0,J+16|0),E=+g[J+16>>2],F=+g[J+16+4>>2],G=+g[J+16+8>>2],U=E-+g[J>>2],V=F-+g[J+4>>2],W=G-+g[J+8>>2],U*U+V*V+W*W>2]|0;g[b+316>>2]=E;g[b+320>>2]=F;g[b+324>>2]=G;c[b+328>>2]=q;q=a[r>>0]|0;a[b+332>>0]=q&4|a[b+332>>0]&-16|q<<1&2|q<<2&8;q=c[J+16+20>>2]|0;r=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;g[b+336>>2]=0.0;c[b+340>>2]=q;c[b+344>>2]=r;c[b+348>>2]=X}P=+g[b+336>>2];Q=+g[b+340>>2];W=+g[b+344>>2];f=+g[b+348>>2];R=+g[b+84>>2]*P+ +g[b+100>>2]*Q+ +g[b+116>>2]*W+ +g[b+132>>2]*f;T=P*+g[b+88>>2]+Q*+g[b+104>>2]+W*+g[b+120>>2]+f*+g[b+136>>2];V=P*+g[b+92>>2]+Q*+g[b+108>>2]+W*+g[b+124>>2]+f*+g[b+140>>2];g[b+244>>2]=R;g[b+248>>2]=T;g[b+252>>2]=V;g[b+256>>2]=0.0;S=+g[b+164>>2]*P+ +g[b+180>>2]*Q+ +g[b+196>>2]*W+ +g[b+212>>2]*f;U=P*+g[b+168>>2]+Q*+g[b+184>>2]+W*+g[b+200>>2]+f*+g[b+216>>2];W=P*+g[b+172>>2]+Q*+g[b+188>>2]+W*+g[b+204>>2]+f*+g[b+220>>2];g[b+260>>2]=S;g[b+264>>2]=U;g[b+268>>2]=W;g[b+272>>2]=0.0;g[b+276>>2]=R-S;g[b+280>>2]=T-U;g[b+284>>2]=V-W;g[b+288>>2]=0.0;h=c[b>>2]|0;do if((h|0)>3){d=a[b+332>>0]|0;if(!(d&8)){I=b+164+(h+-1<<4)|0;X=b+84+(h+-1<<4)|0;r=b+4+(h+-1<<4)|0;c[b>>2]=h+-1;c[b+52>>2]=c[r>>2];c[b+52+4>>2]=c[r+4>>2];c[b+52+8>>2]=c[r+8>>2];c[b+52+12>>2]=c[r+12>>2];c[b+132>>2]=c[X>>2];c[b+132+4>>2]=c[X+4>>2];c[b+132+8>>2]=c[X+8>>2];c[b+132+12>>2]=c[X+12>>2];c[b+212>>2]=c[I>>2];c[b+212+4>>2]=c[I+4>>2];c[b+212+8>>2]=c[I+8>>2];c[b+212+12>>2]=c[I+12>>2];h=h+-1|0;I=52}else I=52}else{if((h|0)==3){d=a[b+332>>0]|0;h=3;I=52;break}if((h|0)>1){d=a[b+332>>0]|0;e=2;I=56;break}if((h|0)==1){d=a[b+332>>0]|0;e=1;I=60}}while(0);if((I|0)==52){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=56}else{e=h;I=56}}if((I|0)==56){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];e=h;I=60}else I=60}if((I|0)==60?(H=e+-1|0,(d&1)==0):0){c[b>>2]=H;c[b+4>>2]=c[b+4+(H<<4)>>2];c[b+4+4>>2]=c[b+4+(H<<4)+4>>2];c[b+4+8>>2]=c[b+4+(H<<4)+8>>2];c[b+4+12>>2]=c[b+4+(H<<4)+12>>2];c[b+84>>2]=c[b+84+(H<<4)>>2];c[b+84+4>>2]=c[b+84+(H<<4)+4>>2];c[b+84+8>>2]=c[b+84+(H<<4)+8>>2];c[b+84+12>>2]=c[b+84+(H<<4)+12>>2];c[b+164>>2]=c[b+164+(H<<4)>>2];c[b+164+4>>2]=c[b+164+(H<<4)+4>>2];c[b+164+8>>2]=c[b+164+(H<<4)+8>>2];c[b+164+12>>2]=c[b+164+(H<<4)+12>>2]}if((+g[b+336>>2]>=0.0?+g[b+340>>2]>=0.0:0)?+g[b+344>>2]>=0.0:0)d=f>=0.0&1;else d=0;a[b+312>>0]=d}while(0);if((I|0)==68){a[d>>0]=0;d=0}X=d;X=X<<24>>24!=0;l=J;return X|0}default:{a[b+312>>0]=0;X=0;X=X<<24>>24!=0;l=J;return X|0}}return 0}function xc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,J=0.0,K=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0;la=l;l=l+80|0;g[b+504>>2]=0.0;g[b+500>>2]=0.0;a[b+525>>0]=0;a[b+526>>0]=0;if(a[b+552>>0]|0?(a[b+527>>0]|0)==0:0){sa=+g[b+556>>2];qa=+g[b+560>>2];ka=+g[b+564>>2];pa=+g[b+568>>2];$=sa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));ra=qa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));oa=ka*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));aa=+g[b+300>>2];S=+g[d>>2];ba=+g[b+316>>2];T=+g[d+4>>2];ca=+g[b+332>>2];U=+g[d+8>>2];ea=+g[b+304>>2];ga=+g[b+320>>2];ia=+g[b+336>>2];Y=+g[b+308>>2];Z=+g[b+324>>2];_=+g[b+340>>2];V=+g[d+16>>2];W=+g[d+20>>2];X=+g[d+24>>2];fa=+g[d+32>>2];ha=+g[d+36>>2];ja=+g[d+40>>2];q=+g[b+348>>2];p=+g[b+352>>2];o=+g[b+356>>2];u=+g[b+364>>2];na=+g[e>>2];v=+g[b+380>>2];ma=+g[e+4>>2];w=+g[b+396>>2];k=+g[e+8>>2];x=+g[b+368>>2];y=+g[b+384>>2];z=+g[b+400>>2];r=+g[b+372>>2];s=+g[b+388>>2];t=+g[b+404>>2];m=+g[e+16>>2];n=+g[e+20>>2];j=+g[e+24>>2];A=+g[e+32>>2];E=+g[e+36>>2];J=+g[e+40>>2];B=+g[b+412>>2];H=+g[b+416>>2];i=+g[b+420>>2];M=(1.0-(qa*ra+ka*oa))*(u*na+v*ma+w*k)+(sa*ra+pa*oa)*(na*x+ma*y+k*z)+(sa*oa-pa*ra)*(na*r+ma*s+k*t);N=(sa*ra-pa*oa)*(u*na+v*ma+w*k)+(1.0-(sa*$+ka*oa))*(na*x+ma*y+k*z)+(qa*oa+pa*$)*(na*r+ma*s+k*t);K=(sa*oa+pa*ra)*(u*na+v*ma+w*k)+(qa*oa-pa*$)*(na*x+ma*y+k*z)+(1.0-(sa*$+qa*ra))*(na*r+ma*s+k*t);P=(sa*oa-pa*ra)*(r*m+s*n+t*j)+((1.0-(qa*ra+ka*oa))*(u*m+v*n+w*j)+(sa*ra+pa*oa)*(x*m+y*n+z*j));R=(qa*oa+pa*$)*(r*m+s*n+t*j)+((sa*ra-pa*oa)*(u*m+v*n+w*j)+(1.0-(sa*$+ka*oa))*(x*m+y*n+z*j));O=(1.0-(sa*$+qa*ra))*(r*m+s*n+t*j)+((sa*oa+pa*ra)*(u*m+v*n+w*j)+(qa*oa-pa*$)*(x*m+y*n+z*j));da=(sa*oa-pa*ra)*(r*A+s*E+t*J)+((1.0-(qa*ra+ka*oa))*(u*A+v*E+w*J)+(sa*ra+pa*oa)*(x*A+y*E+z*J));ka=(qa*oa+pa*$)*(r*A+s*E+t*J)+((sa*ra-pa*oa)*(u*A+v*E+w*J)+(1.0-(sa*$+ka*oa))*(x*A+y*E+z*J));$=(1.0-(sa*$+qa*ra))*(r*A+s*E+t*J)+((sa*oa+pa*ra)*(u*A+v*E+w*J)+(qa*oa-pa*$)*(x*A+y*E+z*J));pa=-(+g[d+48>>2]+(S*q+T*p+U*o));oa=-(V*q+W*p+X*o+ +g[d+52>>2]);o=-(fa*q+ha*p+ja*o+ +g[d+56>>2]);p=(aa*S+ba*T+ca*U)*pa+(aa*V+ba*W+ca*X)*oa+(aa*fa+ba*ha+ca*ja)*o;q=(S*ea+T*ga+U*ia)*pa+(ea*V+ga*W+ia*X)*oa+(ea*fa+ga*ha+ia*ja)*o;o=(S*Y+T*Z+U*_)*pa+(Y*V+Z*W+_*X)*oa+(Y*fa+Z*ha+_*ja)*o;k=o*K+(p*M+q*N)+((u*na+v*ma+w*k)*0.0+(na*x+ma*y+k*z)*0.0+(na*r+ma*s+k*t)*0.0+(+g[e+48>>2]+(na*B+ma*H+k*i)));j=o*O+(p*P+q*R)+((r*m+s*n+t*j)*0.0+((u*m+v*n+w*j)*0.0+(x*m+y*n+z*j)*0.0)+(m*B+n*H+j*i+ +g[e+52>>2]));i=o*$+(p*da+q*ka)+((r*A+s*E+t*J)*0.0+((u*A+v*E+w*J)*0.0+(x*A+y*E+z*J)*0.0)+(A*B+E*H+J*i+ +g[e+56>>2]));g[la+16>>2]=(S*Y+T*Z+U*_)*K+((aa*S+ba*T+ca*U)*M+(S*ea+T*ga+U*ia)*N);g[la+16+4>>2]=(Y*V+Z*W+_*X)*K+((aa*V+ba*W+ca*X)*M+(ea*V+ga*W+ia*X)*N);g[la+16+8>>2]=(Y*fa+Z*ha+_*ja)*K+((aa*fa+ba*ha+ca*ja)*M+(ea*fa+ga*ha+ia*ja)*N);g[la+16+12>>2]=0.0;g[la+16+16>>2]=(S*Y+T*Z+U*_)*O+((aa*S+ba*T+ca*U)*P+(S*ea+T*ga+U*ia)*R);g[la+16+20>>2]=(Y*V+Z*W+_*X)*O+((aa*V+ba*W+ca*X)*P+(ea*V+ga*W+ia*X)*R);g[la+16+24>>2]=(Y*fa+Z*ha+_*ja)*O+((aa*fa+ba*ha+ca*ja)*P+(ea*fa+ga*ha+ia*ja)*R);g[la+16+28>>2]=0.0;g[la+16+32>>2]=(S*Y+T*Z+U*_)*$+((aa*S+ba*T+ca*U)*da+(S*ea+T*ga+U*ia)*ka);g[la+16+36>>2]=(Y*V+Z*W+_*X)*$+((aa*V+ba*W+ca*X)*da+(ea*V+ga*W+ia*X)*ka);g[la+16+40>>2]=(Y*fa+Z*ha+_*ja)*$+((aa*fa+ba*ha+ca*ja)*da+(ea*fa+ga*ha+ia*ja)*ka);g[la+16+44>>2]=0.0;g[la+16+48>>2]=k;g[la+16+52>>2]=j;g[la+16+56>>2]=i;g[la+16+60>>2]=0.0;yh(la+16|0,la);i=+g[la>>2];j=+g[la+4>>2];k=+g[la+8>>2];if(!(+C(+(i*i+j*j+k*k))<1.1920928955078125e-07)?(g[b+472>>2]=0.0,sa=1.0/+D(+(i*i+j*j+k*k)),g[b+460>>2]=i*sa,g[b+464>>2]=j*sa,g[b+468>>2]=k*sa,sa=+g[la+12>>2],sa=sa<-1.0?-1.0:sa,sa=+I(+(sa>1.0?1.0:sa))*2.0,g[b+504>>2]=sa,!(+C(+sa)<1.1920928955078125e-07)):0)a[b+526>>0]=1;l=la;return}yh(d,la+16|0);yh(b+300|0,la);U=+g[la+16+12>>2];V=+g[la>>2];W=+g[la+16>>2];X=+g[la+12>>2];Y=+g[la+16+4>>2];Z=+g[la+8>>2];_=+g[la+16+8>>2];$=+g[la+4>>2];yh(e,la+16|0);yh(b+364|0,la);aa=+g[la+16+12>>2];ba=+g[la>>2];ca=+g[la+16>>2];da=+g[la+12>>2];ea=+g[la+16+4>>2];fa=+g[la+8>>2];ga=+g[la+16+8>>2];ha=+g[la+4>>2];ia=-(aa*ba+ca*da+ea*fa-ga*ha);ja=-(ba*ga+(da*ea+aa*ha)-ca*fa);ka=-(aa*fa+da*ga+ca*ha-ba*ea);s=(U*X-V*W-Y*$-Z*_)*ia+(U*V+W*X+Y*Z-_*$)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*Z+X*_+W*$-V*Y)*ja-(V*_+(X*Y+U*$)-W*Z)*ka;t=(U*V+W*X+Y*Z-_*$)*ka+((V*_+(X*Y+U*$)-W*Z)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ja)-(U*Z+X*_+W*$-V*Y)*ia;u=(V*_+(X*Y+U*$)-W*Z)*ia+((U*Z+X*_+W*$-V*Y)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ka)-(U*V+W*X+Y*Z-_*$)*ja;v=(U*X-V*W-Y*$-Z*_)*(aa*da-ba*ca-ea*ha-fa*ga)-(U*V+W*X+Y*Z-_*$)*ia-(V*_+(X*Y+U*$)-W*Z)*ja-(U*Z+X*_+W*$-V*Y)*ka;k=+g[5957];i=+g[5959];m=+g[5958];n=(k*u+m*v-i*s)*-u+(v*(k*v+i*t-m*u)+(-(k*s)-m*t-i*u)*-s)-(i*v+m*s-k*t)*-t;o=(i*v+m*s-k*t)*-s+(v*(k*u+m*v-i*s)+(-(k*s)-m*t-i*u)*-t)-(k*v+i*t-m*u)*-u;j=(k*v+i*t-m*u)*-t+(v*(i*v+m*s-k*t)+(-(k*s)-m*t-i*u)*-u)-(k*u+m*v-i*s)*-s;p=1.0/+D(+(j*j+(n*n+o*o)));do if(i*p*j+(m*p*o+k*p*n)<-.9999998807907104)if(+C(+i)>.7071067690849304){j=1.0/+D(+(i*i+m*m));r=-(i*j);q=0.0;i=m*j;j=0.0;break}else{q=1.0/+D(+(k*k+m*m));r=k*q;q=-(m*q);i=0.0;j=0.0;break}else{sa=+D(+((i*p*j+(m*p*o+k*p*n)+1.0)*2.0));r=(i*p*n-k*p*j)*(1.0/sa);q=(m*p*j-i*p*o)*(1.0/sa);i=(k*p*o-m*p*n)*(1.0/sa);j=sa*.5}while(0);m=1.0/+D(+(q*q+r*r+i*i+j*j));o=q*m;r=r*m;q=i*m;m=j*m;T=1.0/+D(+((v*m-s*-o-t*-r-u*-q)*(v*m-s*-o-t*-r-u*-q)+((t*-o+(u*m+v*-q)-s*-r)*(t*-o+(u*m+v*-q)-s*-r)+((u*-r+(s*m+v*-o)-t*-q)*(u*-r+(s*m+v*-o)-t*-q)+(s*-q+(v*-r+t*m)-u*-o)*(s*-q+(v*-r+t*m)-u*-o)))));k=T*(u*-r+(s*m+v*-o)-t*-q);n=T*(s*-q+(v*-r+t*m)-u*-o);j=T*(t*-o+(u*m+v*-q)-s*-r);T=T*(v*m-s*-o-t*-r-u*-q);t=+g[b+444>>2];i=+g[b+456>>2];if(t>=i?(w=+g[b+448>>2],w>=i):0){s=m<-1.0?-1.0:m;s=+I(+(s>1.0?1.0:s))*2.0;if(s>1.1920928955078125e-07){p=1.0/+D(+(q*q+(o*o+r*r)));if(+C(+(r*p))>1.1920928955078125e-07){o=o*p;m=q*p;i=r*p;q=+D(+((q*p*q*p/(r*p*r*p)+1.0)/(1.0/(w*w)+q*p*q*p/(r*p*r*p)/(t*t))))}else{o=o*p;m=q*p;i=r*p;q=t}}else{o=0.0;m=0.0;i=0.0;q=0.0}p=+g[b+428>>2];r=q*p;if(s>r){a[b+526>>0]=1;if(s>2]=p;g[b+504>>2]=s-r;if(+C(+i)>1.1920928955078125e-07){sa=+C(+(i*-m/i*(w/t)));m=m<-0.0?sa:-sa;sa=1.0/+D(+(o*o+i*i+m*m));o=o*sa;m=-(m*sa);i=i*sa}ra=-o;qa=-i;oa=-m;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+460>>2]=qa;g[b+464>>2]=ra;g[b+468>>2]=sa;g[b+472>>2]=0.0;c[b+536>>2]=0;c[b+536+4>>2]=0;c[b+536+8>>2]=0;c[b+536+12>>2]=0;g[b+492>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}}else Q=23;a:do if((Q|0)==23){J=+g[b+300>>2];K=+g[b+316>>2];M=+g[b+332>>2];r=+g[d>>2];s=+g[d+4>>2];t=+g[d+8>>2];u=+g[d+16>>2];v=+g[d+20>>2];w=+g[d+24>>2];N=+g[d+32>>2];O=+g[d+36>>2];x=+g[d+40>>2];y=+g[b+304>>2];z=+g[b+320>>2];A=+g[b+336>>2];B=+g[b+308>>2];E=+g[b+324>>2];H=+g[b+340>>2];o=+g[b+364>>2];q=+g[b+380>>2];P=+g[b+396>>2];R=o*+g[e>>2]+q*+g[e+4>>2]+P*+g[e+8>>2];S=o*+g[e+16>>2]+q*+g[e+20>>2]+P*+g[e+24>>2];P=o*+g[e+32>>2]+q*+g[e+36>>2]+P*+g[e+40>>2];q=(J*r+K*s+M*t)*R+(J*u+K*v+M*w)*S+(J*N+K*O+M*x)*P;o=(r*y+s*z+t*A)*R+(u*y+v*z+w*A)*S+(N*y+O*z+x*A)*P;m=(r*B+s*E+t*H)*R+(u*B+v*E+w*H)*S+(N*B+O*E+x*H)*P;p=+g[b+444>>2];i=+g[b+456>>2];do if(p>2];if(p>0]=1;g[b+460>>2]=-((J*N+K*O+M*x)*S-(J*u+K*v+M*w)*P);g[b+464>>2]=-((J*r+K*s+M*t)*P-(J*N+K*O+M*x)*R);g[b+468>>2]=-((J*u+K*v+M*w)*R-(J*r+K*s+M*t)*S);g[b+472>>2]=0.0;break a}if(+C(+q)<1.1920928955078125e-07?+C(+m)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+m,+q);if(i>p){m=+G(+p);o=0.0;i=+F(+p);break}if(i<-p){m=-+G(+p);o=0.0;i=+F(+p)}else{o=0.0;i=q}}else i=q}else{if(+C(+q)<1.1920928955078125e-07?+C(+o)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+o,+q);if(i>p){m=0.0;o=+G(+p);i=+F(+p);break}if(i<-p){m=0.0;o=-+G(+p);i=+F(+p)}else{m=0.0;i=q}}else i=q}while(0);q=(r*B+s*E+t*H)*m+((r*y+s*z+t*A)*o+(J*r+K*s+M*t)*i);p=(u*B+v*E+w*H)*m+((u*y+v*z+w*A)*o+(J*u+K*v+M*w)*i);i=(N*B+O*E+x*H)*m+((N*y+O*z+x*A)*o+(J*N+K*O+M*x)*i);m=1.0/+D(+(i*i+(q*q+p*p)));g[b+460>>2]=-(S*m*i-P*m*p);g[b+464>>2]=-(P*m*q-R*m*i);g[b+468>>2]=-(R*m*p-S*m*q);g[b+472>>2]=0.0;o=+D(+((S*m*i-P*m*p)*(S*m*i-P*m*p)+(P*m*q-R*m*i)*(P*m*q-R*m*i)+(R*m*p-S*m*q)*(R*m*p-S*m*q)));g[b+504>>2]=o;if(!(+C(+o)<1.1920928955078125e-07)){g[b+460>>2]=1.0/o*-(S*m*i-P*m*p);g[b+464>>2]=1.0/o*-(P*m*q-R*m*i);g[b+468>>2]=1.0/o*-(R*m*p-S*m*q)}}while(0);p=+g[b+452>>2];if(!(p>=0.0)){g[b+512>>2]=0.0;l=la;return}i=T<-1.0?-1.0:T;i=+I(+(i>1.0?1.0:i))*2.0;if(i>3.1415927410125732){i=-T<-1.0?-1.0:-T;i=+I(+(i>1.0?1.0:i))*2.0;k=-k;n=-n;j=-j}g[b+512>>2]=i;if(i>1.1920928955078125e-07){sa=1.0/+D(+(k*k+n*n+j*j));k=k*sa;j=j*sa;n=n*sa}m=+g[b+428>>2];if(i>p*m){a[b+525>>0]=1;o=i-p*m;if(i>2]=i;g[b+508>>2]=o;ra=-k;qa=-n;oa=-j;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+476>>2]=qa;g[b+480>>2]=ra;g[b+484>>2]=sa;g[b+488>>2]=0.0;g[b+496>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}if(!(a[b+526>>0]|0)){l=la;return}na=-k;sa=-n;oa=-j;ma=(U*X-V*W-Y*$-Z*_)*na+(V*_+(X*Y+U*$)-W*Z)*oa-(U*Z+X*_+W*$-V*Y)*sa;ra=(U*Z+X*_+W*$-V*Y)*na+(U*X-V*W-Y*$-Z*_)*sa-(U*V+W*X+Y*Z-_*$)*oa;qa=(U*V+W*X+Y*Z-_*$)*sa+(U*X-V*W-Y*$-Z*_)*oa-(V*_+(X*Y+U*$)-W*Z)*na;oa=-((U*V+W*X+Y*Z-_*$)*na)-(V*_+(X*Y+U*$)-W*Z)*sa-(U*Z+X*_+W*$-V*Y)*oa;sa=-(U*V+W*X+Y*Z-_*$);na=-(V*_+(X*Y+U*$)-W*Z);pa=-(U*Z+X*_+W*$-V*Y);g[b+536>>2]=ra*pa+(oa*sa+(U*X-V*W-Y*$-Z*_)*ma)-qa*na;g[b+540>>2]=qa*sa+((U*X-V*W-Y*$-Z*_)*ra+oa*na)-ma*pa;g[b+544>>2]=ma*na+(oa*pa+(U*X-V*W-Y*$-Z*_)*qa)-ra*sa;g[b+548>>2]=0.0;l=la;return}function yc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ga=l;l=l+4352|0;da=c[d+4>>2]|0;ea=c[e+4>>2]|0;s=c[da+68>>2]|0;t=c[ea+68>>2]|0;if(!((s|0)!=0&(t|0)!=0)){Ic(b,d,e,f,h);l=ga;return}if(!((c[da+72>>2]|0)==(c[b+108>>2]|0)?(c[ea+72>>2]|0)==(c[b+112>>2]|0):0)){i=c[b+84>>2]|0;k=c[i+8>>2]|0;if((k|0)>0){j=0;do{m=c[(c[i+16>>2]|0)+(j*12|0)+8>>2]|0;if(m|0){Ib[c[c[m>>2]>>2]&511](m);u=c[b+4>>2]|0;Ob[c[(c[u>>2]|0)+60>>2]&127](u,m)}j=j+1|0}while((j|0)!=(k|0));i=c[b+84>>2]|0}Rh(i);c[b+108>>2]=c[da+72>>2];c[b+112>>2]=c[ea+72>>2]}a[ga+3328+16>>0]=1;r=ga+3328+12|0;c[r>>2]=0;q=ga+3328+4|0;c[q>>2]=0;c[ga+3328+8>>2]=0;c[ga+112>>2]=1025;i=ga+112+120|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+312|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+504|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+696|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+772>>2]=0;c[ga+112+776>>2]=0;c[ga+112+780>>2]=0;c[ga+112+800>>2]=0;c[ga+112+804>>2]=1025;i=ga+112+924|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1116|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1308|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1500|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+1576>>2]=0;c[ga+112+1580>>2]=0;c[ga+112+1584>>2]=0;c[ga+112+1604>>2]=0;c[ga+112+1608>>2]=1025;i=ga+112+1728|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1920|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2112|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2304|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+2380>>2]=0;c[ga+112+2384>>2]=0;c[ga+112+2388>>2]=0;c[ga+112+2408>>2]=0;c[ga+112+2412>>2]=1025;i=ga+112+2532|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2724|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2916|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+3108|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+3184>>2]=0;c[ga+112+3188>>2]=0;c[ga+112+3192>>2]=0;c[ga+112+3212>>2]=0;a[q+12>>0]=0;c[r>>2]=ga+112;c[q>>2]=0;c[ga+3328+8>>2]=4;p=c[b+84>>2]|0;i=c[p+8>>2]|0;if((i|0)>0){o=0;do{j=c[(c[p+16>>2]|0)+(o*12|0)+8>>2]|0;if(j){Ob[c[(c[j>>2]|0)+16>>2]&127](j,ga+3328|0);i=c[q>>2]|0;if((i|0)>0){n=0;do{m=c[(c[r>>2]|0)+(n<<2)>>2]|0;if(c[m+780>>2]|0){c[h+4>>2]=m;j=c[m+772>>2]|0;k=c[(c[h+8>>2]|0)+8>>2]|0;i=c[(c[h+12>>2]|0)+8>>2]|0;if((j|0)==(k|0))af(m,j+4|0,i+4|0);else af(m,i+4|0,k+4|0);c[h+4>>2]=0;i=c[q>>2]|0}n=n+1|0}while((n|0)<(i|0))}if((i|0)<0){if((c[ga+3328+8>>2]|0)<0){j=c[r>>2]|0;if(j|0){if(a[ga+3328+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[r>>2]=0}a[ga+3328+16>>0]=1;c[r>>2]=0;c[ga+3328+8>>2]=0}do{c[(c[r>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[q>>2]=0;i=c[p+8>>2]|0}o=o+1|0}while((o|0)<(i|0));i=c[r>>2]|0;if(i|0)if((a[ga+3328+16>>0]|0)==0|(i|0)==0)ca=35;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);ca=35}}else ca=35;if((ca|0)==35)c[r>>2]=0;u=c[b+4>>2]|0;i=c[b+84>>2]|0;j=c[b+72>>2]|0;c[ga+112>>2]=6604;c[ga+112+4>>2]=0;c[ga+112+8>>2]=d;c[ga+112+12>>2]=e;c[ga+112+16>>2]=u;c[ga+112+20>>2]=f;c[ga+112+24>>2]=h;c[ga+112+28>>2]=i;c[ga+112+32>>2]=j;j=c[d+12>>2]|0;G=+g[j>>2];H=+g[j+16>>2];I=+g[j+32>>2];J=+g[j+4>>2];K=+g[j+20>>2];L=+g[j+36>>2];M=+g[j+8>>2];N=+g[j+24>>2];O=+g[j+40>>2];P=-+g[j+48>>2];Q=-+g[j+52>>2];R=-+g[j+56>>2];j=c[e+12>>2]|0;S=+g[j>>2];T=+g[j+16>>2];U=+g[j+32>>2];V=+g[j+4>>2];W=+g[j+20>>2];X=+g[j+36>>2];Y=+g[j+8>>2];Z=+g[j+24>>2];_=+g[j+40>>2];$=+g[j+48>>2];aa=+g[j+52>>2];ba=+g[j+56>>2];j=c[s>>2]|0;i=c[t>>2]|0;F=+g[h+32>>2];if((j|0)!=0&(i|0)!=0){c[ga+3328>>2]=j;c[ga+3328+4>>2]=i;v=+C(+(G*S+H*T+I*U));w=+C(+(G*V+H*W+I*X));x=+C(+(G*Y+H*Z+I*_));y=+C(+(J*S+K*T+L*U));z=+C(+(J*V+K*W+L*X));A=+C(+(J*Y+K*Z+L*_));B=+C(+(M*S+N*T+O*U));D=+C(+(M*V+N*W+O*X));E=+C(+(M*Y+N*Z+O*_));o=1;m=124;n=128;r=ga+3328|0;k=128;t=0;while(1){u=o+-1|0;f=c[r+(u<<3)>>2]|0;s=c[r+(u<<3)+4>>2]|0;ra=+g[s+16>>2];qa=+g[s>>2];pa=+g[s+20>>2];oa=+g[s+4>>2];na=+g[s+24>>2];ha=+g[s+8>>2];ma=G*P+H*Q+I*R+(G*$+H*aa+I*ba)+((G*S+H*T+I*U)*(ra+qa)*.5+(G*V+H*W+I*X)*(pa+oa)*.5+(G*Y+H*Z+I*_)*(na+ha)*.5);ka=J*P+K*Q+L*R+(J*$+K*aa+L*ba)+((J*S+K*T+L*U)*(ra+qa)*.5+(J*V+K*W+L*X)*(pa+oa)*.5+(J*Y+K*Z+L*_)*(na+ha)*.5);ia=M*P+N*Q+O*R+(M*$+N*aa+O*ba)+((M*S+N*T+O*U)*(ra+qa)*.5+(M*V+N*W+O*X)*(pa+oa)*.5+(M*Y+N*Z+O*_)*(na+ha)*.5);la=((ra-qa)*.5+0.0)*v+((pa-oa)*.5+0.0)*w+((na-ha)*.5+0.0)*x;ja=((ra-qa)*.5+0.0)*y+((pa-oa)*.5+0.0)*z+((na-ha)*.5+0.0)*A;ha=((ra-qa)*.5+0.0)*B+((pa-oa)*.5+0.0)*D+((na-ha)*.5+0.0)*E;do if(((((+g[f>>2]<=F+(la+ma)?+g[f+16>>2]>=ma-la-F:0)?+g[f+4>>2]<=F+(ka+ja):0)?+g[f+20>>2]>=ka-ja-F:0)?+g[f+8>>2]<=F+(ia+ha):0)?+g[f+24>>2]>=ia-ha-F:0){if((u|0)>(m|0)){p=k<<1;a:do if((k|0)<(p|0)&(n|0)<(p|0)){do if(k){c[6995]=(c[6995]|0)+1;i=sc((k<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}if((k|0)>0)j=0;else{ca=51;break}do{m=r+(j<<3)|0;n=c[m+4>>2]|0;q=i+(j<<3)|0;c[q>>2]=c[m>>2];c[q+4>>2]=n;j=j+1|0}while((j|0)!=(k|0));if(!(t<<24>>24)){k=p;j=1;break a}}else{i=0;ca=51}while(0);if((ca|0)==51){ca=0;if((r|0)==0|t<<24>>24==0){k=p;j=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);k=p;j=1}else{k=n;i=r;j=t}while(0);q=p+-4|0;n=k}else{q=m;i=r;p=k;j=t}k=(c[s+40>>2]|0)!=0;if(!(c[f+40>>2]|0))if(k){m=c[s+36>>2]|0;c[i+(u<<3)>>2]=f;c[i+(u<<3)+4>>2]=m;m=c[s+40>>2]|0;c[i+(o<<3)>>2]=f;c[i+(o<<3)+4>>2]=m;o=o+1|0;m=q;k=p;break}else{Sb[c[(c[ga+112>>2]|0)+8>>2]&127](ga+112|0,f,s);o=u;m=q;k=p;break}else{m=c[f+36>>2]|0;if(k){k=c[s+36>>2]|0;c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=k;u=c[s+36>>2]|0;k=o+1|0;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=u;u=c[s+40>>2]|0;m=o+2|0;c[i+(k<<3)>>2]=c[f+36>>2];c[i+(k<<3)+4>>2]=u;k=c[s+40>>2]|0;c[i+(m<<3)>>2]=c[f+40>>2];c[i+(m<<3)+4>>2]=k;o=o+3|0;m=q;k=p;break}else{c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=s;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=s;o=o+1|0;m=q;k=p;break}}}else{o=u;i=r;j=t}while(0);if(!o)break;else{r=i;t=j}}if(!((i|0)==0|j<<24>>24==0)){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}}p=c[b+84>>2]|0;if((c[p+8>>2]|0)>0){o=0;do{i=c[p+16>>2]|0;j=c[i+(o*12|0)+8>>2]|0;do if(j|0){ca=c[i+(o*12|0)>>2]|0;u=c[da+28>>2]|0;t=c[u+(ca*80|0)+64>>2]|0;s=c[d+12>>2]|0;S=+g[s>>2];R=+g[s+4>>2];qa=+g[s+8>>2];la=+g[s+16>>2];ja=+g[s+20>>2];ha=+g[s+24>>2];ka=+g[s+32>>2];Y=+g[s+36>>2];W=+g[s+40>>2];ba=+g[u+(ca*80|0)>>2];aa=+g[u+(ca*80|0)+16>>2];$=+g[u+(ca*80|0)+32>>2];_=+g[u+(ca*80|0)+4>>2];Z=+g[u+(ca*80|0)+20>>2];ma=+g[u+(ca*80|0)+36>>2];ia=+g[u+(ca*80|0)+8>>2];X=+g[u+(ca*80|0)+24>>2];V=+g[u+(ca*80|0)+40>>2];pa=+g[u+(ca*80|0)+48>>2];ra=+g[u+(ca*80|0)+52>>2];oa=+g[u+(ca*80|0)+56>>2];U=+g[s+48>>2]+(S*pa+R*ra+qa*oa);T=+g[s+52>>2]+(la*pa+ja*ra+ha*oa);oa=+g[s+56>>2]+(ka*pa+Y*ra+W*oa);g[ga>>2]=S*ba+R*aa+qa*$;g[ga+4>>2]=S*_+R*Z+qa*ma;g[ga+8>>2]=S*ia+R*X+qa*V;g[ga+12>>2]=0.0;g[ga+16>>2]=la*ba+ja*aa+ha*$;g[ga+20>>2]=la*_+ja*Z+ha*ma;g[ga+24>>2]=la*ia+ja*X+ha*V;g[ga+28>>2]=0.0;g[ga+32>>2]=ka*ba+Y*aa+W*$;g[ga+36>>2]=ka*_+Y*Z+W*ma;g[ga+40>>2]=ka*ia+Y*X+W*V;g[ga+44>>2]=0.0;g[ga+48>>2]=U;g[ga+52>>2]=T;g[ga+56>>2]=oa;g[ga+60>>2]=0.0;Vb[c[(c[t>>2]|0)+8>>2]&127](t,ga,ga+3328|0,ga+96|0);oa=+g[h+32>>2];g[ga+3328>>2]=+g[ga+3328>>2]-oa;g[ga+3328+4>>2]=+g[ga+3328+4>>2]-oa;g[ga+3328+8>>2]=+g[ga+3328+8>>2]-oa;g[ga+96>>2]=oa+ +g[ga+96>>2];g[ga+96+4>>2]=oa+ +g[ga+96+4>>2];g[ga+96+8>>2]=oa+ +g[ga+96+8>>2];t=c[(c[p+16>>2]|0)+(o*12|0)+4>>2]|0;s=c[ea+28>>2]|0;ca=c[s+(t*80|0)+64>>2]|0;u=c[e+12>>2]|0;T=+g[u>>2];U=+g[u+4>>2];V=+g[u+8>>2];W=+g[u+16>>2];X=+g[u+20>>2];Y=+g[u+24>>2];ia=+g[u+32>>2];ka=+g[u+36>>2];ma=+g[u+40>>2];Z=+g[s+(t*80|0)>>2];_=+g[s+(t*80|0)+16>>2];$=+g[s+(t*80|0)+32>>2];aa=+g[s+(t*80|0)+4>>2];ba=+g[s+(t*80|0)+20>>2];ha=+g[s+(t*80|0)+36>>2];ja=+g[s+(t*80|0)+8>>2];la=+g[s+(t*80|0)+24>>2];qa=+g[s+(t*80|0)+40>>2];R=+g[s+(t*80|0)+48>>2];S=+g[s+(t*80|0)+52>>2];ra=+g[s+(t*80|0)+56>>2];pa=+g[u+48>>2]+(T*R+U*S+V*ra);na=+g[u+52>>2]+(W*R+X*S+Y*ra);ra=+g[u+56>>2]+(ia*R+ka*S+ma*ra);g[ga>>2]=T*Z+U*_+V*$;g[ga+4>>2]=T*aa+U*ba+V*ha;g[ga+8>>2]=T*ja+U*la+V*qa;g[ga+12>>2]=0.0;g[ga+16>>2]=W*Z+X*_+Y*$;g[ga+20>>2]=W*aa+X*ba+Y*ha;g[ga+24>>2]=W*ja+X*la+Y*qa;g[ga+28>>2]=0.0;g[ga+32>>2]=ia*Z+ka*_+ma*$;g[ga+36>>2]=ia*aa+ka*ba+ma*ha;g[ga+40>>2]=ia*ja+ka*la+ma*qa;g[ga+44>>2]=0.0;g[ga+48>>2]=pa;g[ga+52>>2]=na;g[ga+56>>2]=ra;g[ga+60>>2]=0.0;Vb[c[(c[ca>>2]|0)+8>>2]&127](ca,ga,ga+80|0,ga+64|0);ra=+g[ga+80>>2]-oa;g[ga+80>>2]=ra;na=+g[ga+80+4>>2]-oa;g[ga+80+4>>2]=na;pa=+g[ga+80+8>>2]-oa;g[ga+80+8>>2]=pa;qa=oa+ +g[ga+64>>2];g[ga+64>>2]=qa;ma=oa+ +g[ga+64+4>>2];g[ga+64+4>>2]=ma;oa=oa+ +g[ga+64+8>>2];g[ga+64+8>>2]=oa;if(!(+g[ga+3328+4>>2]>ma)?!(+g[ga+96+4>>2]>2]>oa?1:+g[ga+96+8>>2]>2]>qa?1:+g[ga+96>>2]>2]>>2]&511](j);n=c[b+4>>2]|0;Ob[c[(c[n>>2]|0)+60>>2]&127](n,j);n=c[p+16>>2]|0;m=c[n+(o*12|0)>>2]|0;n=c[n+(o*12|0)+4>>2]|0;j=c[b+92>>2]|0;if((j|0)==(c[b+96>>2]|0)?(fa=j|0?j<<1:1,(j|0)<(fa|0)):0){if(!fa)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((fa*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+92>>2]|0}if((j|0)>0){k=0;do{ca=i+(k*12|0)|0;u=(c[b+100>>2]|0)+(k*12|0)|0;c[ca>>2]=c[u>>2];c[ca+4>>2]=c[u+4>>2];c[ca+8>>2]=c[u+8>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[b+100>>2]|0;if(j|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+100>>2]=0}a[b+104>>0]=1;c[b+100>>2]=i;c[b+96>>2]=fa;i=c[b+92>>2]|0}else i=j;ca=c[b+100>>2]|0;c[ca+(i*12|0)>>2]=m;c[ca+(i*12|0)+4>>2]=n;c[ca+(i*12|0)+8>>2]=0;c[b+92>>2]=(c[b+92>>2]|0)+1}while(0);o=o+1|0}while((o|0)<(c[p+8>>2]|0));j=b+100|0;k=b+92|0}else{j=b+100|0;k=b+92|0}if((c[k>>2]|0)>0){i=0;do{h=c[b+84>>2]|0;fa=c[j>>2]|0;Bb[c[(c[h>>2]|0)+8>>2]&63](h,c[fa+(i*12|0)>>2]|0,c[fa+(i*12|0)+4>>2]|0)|0;i=i+1|0}while((i|0)<(c[k>>2]|0))}i=c[j>>2]|0;if(i|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+104>>0]=1;c[j>>2]=0;c[k>>2]=0;c[b+96>>2]=0;l=ga;return}function zc(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0,ra=0;qa=c[b+28>>2]|0;ra=c[b+32>>2]|0;n=c[d+24>>2]|0;if(!(a[b+739>>0]|0)){z=+g[b+552>>2];U=+g[qa+4>>2];A=+g[b+568>>2];V=+g[qa+8>>2];B=+g[b+584>>2];W=+g[qa+12>>2];C=+g[b+556>>2];E=+g[b+572>>2];F=+g[b+588>>2];X=+g[b+560>>2];Y=+g[b+576>>2];Z=+g[b+592>>2];_=+g[qa+20>>2];$=+g[qa+24>>2];aa=+g[qa+28>>2];ba=+g[qa+36>>2];ca=+g[qa+40>>2];da=+g[qa+44>>2];k=+g[b+600>>2];o=+g[b+604>>2];p=+g[b+608>>2];t=+g[qa+52>>2];u=+g[qa+56>>2];v=+g[qa+60>>2];G=+g[ra+4>>2];H=+g[ra+8>>2];I=+g[ra+12>>2];J=+g[b+624>>2];K=+g[b+640>>2];L=+g[b+656>>2];M=+g[ra+20>>2];N=+g[ra+24>>2];O=+g[ra+28>>2];P=+g[ra+36>>2];Q=+g[ra+40>>2];R=+g[ra+44>>2];oa=+g[b+664>>2];pa=+g[b+668>>2];y=+g[b+672>>2];w=+g[ra+52>>2]+(G*oa+H*pa+I*y);x=M*oa+N*pa+O*y+ +g[ra+56>>2];y=P*oa+Q*pa+R*y+ +g[ra+60>>2];l=(a[b+736>>0]|0)==0;if(l){e=c[d+8>>2]|0;g[e>>2]=1.0;g[e+(n+1<<2)>>2]=1.0;g[e+((n<<1)+2<<2)>>2]=1.0;e=c[d+16>>2]|0;g[e>>2]=-1.0;g[e+(n+1<<2)>>2]=-1.0;g[e+((n<<1)+2<<2)>>2]=-1.0;e=n<<1;f=+g[qa+52>>2];h=+g[qa+56>>2];i=+g[qa+60>>2]}else{e=n<<1;f=t;h=u;i=v}j=t+(U*k+V*o+W*p)-f;f=_*k+$*o+aa*p+u-h;pa=ba*k+ca*o+da*p+v-i;m=c[d+12>>2]|0;r=m+(e<<2)|0;c[m>>2]=0;g[m+4>>2]=pa;g[m+8>>2]=-f;g[m+12>>2]=0.0;g[m+(n<<2)>>2]=-pa;c[m+(n<<2)+4>>2]=0;g[m+(n<<2)+8>>2]=j;g[m+(n<<2)+12>>2]=0.0;g[r>>2]=f;g[r+4>>2]=-j;c[r+8>>2]=0;g[r+12>>2]=0.0;j=w-+g[ra+52>>2];f=x-+g[ra+56>>2];pa=y-+g[ra+60>>2];r=c[d+20>>2]|0;S=r+(e<<2)|0;c[r>>2]=0;g[r+4>>2]=-pa;g[r+8>>2]=f;g[r+12>>2]=0.0;g[r+(n<<2)>>2]=pa;c[r+(n<<2)+4>>2]=0;g[r+(n<<2)+8>>2]=-j;g[r+(n<<2)+12>>2]=0.0;g[S>>2]=-f;g[S+4>>2]=j;c[S+8>>2]=0;g[S+12>>2]=0.0;S=c[b+748>>2]|0;j=+g[(S&8|0?b+756|0:d+4|0)>>2];f=j*+g[d>>2];e=c[d+28>>2]|0;if(l){g[e>>2]=f*(w-(t+(U*k+V*o+W*p)));g[e+(n<<2)>>2]=f*(x-(_*k+$*o+aa*p+u));g[e+(n<<1<<2)>>2]=f*(y-(ba*k+ca*o+da*p+v))}s=c[d+24>>2]|0;g[m+(s*3<<2)>>2]=z*U+A*V+B*W;g[m+((s*3|0)+1<<2)>>2]=z*_+A*$+B*aa;g[m+((s*3|0)+2<<2)>>2]=z*ba+A*ca+B*da;g[m+(s<<2<<2)>>2]=U*C+V*E+W*F;g[m+((s<<2|1)<<2)>>2]=C*_+E*$+F*aa;g[m+((s<<2|2)<<2)>>2]=C*ba+E*ca+F*da;g[r+(s*3<<2)>>2]=-(z*U+A*V+B*W);g[r+((s*3|0)+1<<2)>>2]=-(z*_+A*$+B*aa);g[r+((s*3|0)+2<<2)>>2]=-(z*ba+A*ca+B*da);g[r+(s<<2<<2)>>2]=-(U*C+V*E+W*F);g[r+((s<<2|1)<<2)>>2]=-(C*_+E*$+F*aa);g[r+((s<<2|2)<<2)>>2]=-(C*ba+E*ca+F*da);oa=(X*_+Y*$+Z*aa)*(J*P+K*Q+L*R)-(X*ba+Y*ca+Z*da)*(J*M+K*N+L*O);pa=(X*ba+Y*ca+Z*da)*(G*J+H*K+I*L)-(U*X+V*Y+W*Z)*(J*P+K*Q+L*R);na=(U*X+V*Y+W*Z)*(J*M+K*N+L*O)-(X*_+Y*$+Z*aa)*(G*J+H*K+I*L);g[e+(s*3<<2)>>2]=((z*ba+A*ca+B*da)*na+((z*U+A*V+B*W)*oa+(z*_+A*$+B*aa)*pa))*f;g[e+(s<<2<<2)>>2]=((C*ba+E*ca+F*da)*na+((U*C+V*E+W*F)*oa+(C*_+E*$+F*aa)*pa))*f;if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;q=0;n=0;l=1}else{pa=+g[b+708>>2]*+g[b+732>>2];p=pa;q=pa>0.0?1:2;n=1;l=(a[b+737>>0]|0)!=0}g[m+(s*5<<2)>>2]=U*X+V*Y+W*Z;g[m+((s*5|0)+1<<2)>>2]=X*_+Y*$+Z*aa;g[m+((s*5|0)+2<<2)>>2]=X*ba+Y*ca+Z*da;g[r+(s*5<<2)>>2]=-(U*X+V*Y+W*Z);g[r+((s*5|0)+1<<2)>>2]=-(X*_+Y*$+Z*aa);g[r+((s*5|0)+2<<2)>>2]=-(X*ba+Y*ca+Z*da);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)k=f+-6.2831854820251465;else k=f;else k=f+6.2831854820251465;m=o==k;e=e+(s*5<<2)|0;g[e>>2]=0.0;if(S&2)j=+g[b+764>>2];if(l&(n&m^1)){if(S&4|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+752>>2];h=+g[b+728>>2];i=+g[b+680>>2];f=o>k?1.0:0.0;do if(!(o>=k)){f=i/(j*+g[d>>2]);if(f<0.0)if(h>=o&o-f>h){f=(o-h)/f;break}else{f=h0.0)if(h<=k&k-fk?0.0:1.0;break}else f=0.0}while(0);g[e>>2]=f*i*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s*5<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s*5<<2)>>2]=c[b+684>>2]}if(!n)return;g[e>>2]=+g[e>>2]+p*j*+g[d>>2];if(S&1|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+760>>2];e=c[d+40>>2]|0;if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{T=(q|0)==1;f=T?3402823466385288598117041.0e14:0.0;h=T?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s*5<<2)>>2]=h;g[e+(s*5<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=(U*X+V*Y+W*Z)*+g[qa+388>>2]+(X*_+Y*$+Z*aa)*+g[qa+392>>2]+(X*ba+Y*ca+Z*da)*+g[qa+396>>2]-((U*X+V*Y+W*Z)*+g[ra+388>>2]+(X*_+Y*$+Z*aa)*+g[ra+392>>2]+(X*ba+Y*ca+Z*da)*+g[ra+396>>2]);if((q|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(s*5<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}X=+g[qa+4>>2];Y=+g[qa+8>>2];Z=+g[qa+12>>2];v=+g[b+556>>2];x=+g[b+572>>2];y=+g[b+588>>2];_=+g[b+560>>2];$=+g[b+576>>2];aa=+g[b+592>>2];ba=+g[qa+20>>2];ca=+g[qa+24>>2];da=+g[qa+28>>2];ea=+g[qa+36>>2];fa=+g[qa+40>>2];ga=+g[qa+44>>2];ia=+g[b+600>>2];ha=+g[b+604>>2];o=+g[b+608>>2];h=+g[qa+52>>2]+(X*ia+Y*ha+Z*o);u=ba*ia+ca*ha+da*o+ +g[qa+56>>2];o=ea*ia+fa*ha+ga*o+ +g[qa+60>>2];ha=+g[ra+4>>2];ia=+g[ra+8>>2];ja=+g[ra+12>>2];ka=+g[b+624>>2];la=+g[b+640>>2];O=+g[b+656>>2];P=+g[ra+20>>2];Q=+g[ra+24>>2];R=+g[ra+28>>2];U=+g[ra+36>>2];V=+g[ra+40>>2];W=+g[ra+44>>2];p=+g[b+664>>2];w=+g[b+668>>2];i=+g[b+672>>2];f=+g[ra+52>>2];t=+g[ra+56>>2];k=+g[ra+60>>2];J=f+(ha*p+ia*w+ja*i)-h;K=P*p+Q*w+R*i+t-u;L=U*p+V*w+W*i+k-o;z=+g[(c[b+28>>2]|0)+404>>2];A=+g[(c[b+32>>2]|0)+404>>2];I=z+A>0.0?A/(z+A):.5;ma=(X*_+Y*$+Z*aa)*I+(ha*ka+ia*la+ja*O)*(1.0-I);na=(_*ba+$*ca+aa*da)*I+(ka*P+la*Q+O*R)*(1.0-I);oa=(_*ea+$*fa+aa*ga)*I+(ka*U+la*V+O*W)*(1.0-I);pa=1.0/+D(+(ma*ma+na*na+oa*oa));F=(f+(ha*p+ia*w+ja*i)-f)*ma*pa+(P*p+Q*w+R*i+t-t)*na*pa+(U*p+V*w+W*i+k-k)*oa*pa;f=f+(ha*p+ia*w+ja*i)-f-ma*pa*F;t=P*p+Q*w+R*i+t-t-na*pa*F;k=U*p+V*w+W*i+k-k-oa*pa*F;h=h-+g[qa+52>>2];u=u-+g[qa+56>>2];o=o-+g[qa+60>>2];i=ma*pa*(h*ma*pa+u*na*pa+o*oa*pa);w=na*pa*(h*ma*pa+u*na*pa+o*oa*pa);p=oa*pa*(h*ma*pa+u*na*pa+o*oa*pa);C=h-i+I*(i-ma*pa*F);E=u-w+I*(w-na*pa*F);B=o-p+I*(p-oa*pa*F);G=f-(1.0-I)*(i-ma*pa*F);H=t-(1.0-I)*(w-na*pa*F);F=k-(1.0-I)*(p-oa*pa*F);j=(I*f+(1.0-I)*(h-i))*(I*f+(1.0-I)*(h-i))+(I*t+(1.0-I)*(u-w))*(I*t+(1.0-I)*(u-w))+(I*k+(1.0-I)*(o-p))*(I*k+(1.0-I)*(o-p));if(j>1.1920928955078125e-07){y=1.0/+D(+j);N=(I*f+(1.0-I)*(h-i))*y;M=y*(I*k+(1.0-I)*(o-p));p=y*(I*t+(1.0-I)*(u-w))}else{N=X*v+Y*x+Z*y;M=v*ea+x*fa+y*ga;p=v*ba+x*ca+y*da}t=na*pa*M-oa*pa*p;u=oa*pa*N-M*ma*pa;v=p*ma*pa-na*pa*N;T=c[d+12>>2]|0;g[T>>2]=E*M-B*p;g[T+4>>2]=B*N-C*M;g[T+8>>2]=C*p-E*N;T=c[d+20>>2]|0;g[T>>2]=-(H*M-F*p);g[T+4>>2]=-(F*N-G*M);g[T+8>>2]=-(G*p-H*N);if(z<1.1920928955078125e-07|A<1.1920928955078125e-07?(a[b+716>>0]|0)!=0:0){f=I*(E*v-B*u);h=I*(B*t-C*v);i=I*(C*u-E*t);j=(1.0-I)*(H*v-F*u);k=(1.0-I)*(F*t-G*v);o=(1.0-I)*(G*u-H*t)}else{f=E*v-B*u;h=B*t-C*v;i=C*u-E*t;j=H*v-F*u;k=F*t-G*v;o=G*u-H*t}T=(c[d+12>>2]|0)+(n<<2)|0;g[T>>2]=f;g[T+4>>2]=h;g[T+8>>2]=i;T=c[d+20>>2]|0;g[T+(n<<2)>>2]=-j;g[T+(n+1<<2)>>2]=-k;g[T+(n+2<<2)>>2]=-o;if(z<1.1920928955078125e-07|A<1.1920928955078125e-07){o=I*(E*oa*pa-B*na*pa);k=I*(B*ma*pa-C*oa*pa);h=I*(C*na*pa-E*ma*pa);j=(1.0-I)*(H*oa*pa-F*na*pa);i=(1.0-I)*(F*ma*pa-G*oa*pa);f=(1.0-I)*(G*na*pa-H*ma*pa)}else{o=E*oa*pa-B*na*pa;k=B*ma*pa-C*oa*pa;h=C*na*pa-E*ma*pa;j=H*oa*pa-F*na*pa;i=F*ma*pa-G*oa*pa;f=G*na*pa-H*ma*pa}e=(c[d+12>>2]|0)+(n<<1<<2)|0;g[e>>2]=o;g[e+4>>2]=k;g[e+8>>2]=h;e=c[d+20>>2]|0;g[e+(n<<1<<2)>>2]=-j;g[e+((n<<1|1)<<2)>>2]=-i;g[e+((n<<1)+2<<2)>>2]=-f;k=+g[(c[b+748>>2]&8|0?b+756|0:d+4|0)>>2];f=k*+g[d>>2];if(!(a[b+736>>0]|0)){S=c[d+8>>2]|0;g[S>>2]=N;g[S+4>>2]=p;g[S+8>>2]=M;S=(c[d+8>>2]|0)+(n<<2)|0;g[S>>2]=t;g[S+4>>2]=u;g[S+8>>2]=v;S=(c[d+8>>2]|0)+(n<<1<<2)|0;g[S>>2]=ma*pa;g[S+4>>2]=na*pa;g[S+8>>2]=oa*pa;S=c[d+16>>2]|0;h=-N;g[S>>2]=h;g[S+4>>2]=-p;g[S+8>>2]=-M;g[S+(n<<2)>>2]=-t;g[S+(n+1<<2)>>2]=-u;g[S+(n+2<<2)>>2]=-v;g[S+(n<<1<<2)>>2]=-(ma*pa);g[S+((n<<1|1)<<2)>>2]=-(na*pa);g[S+((n<<1)+2<<2)>>2]=-(oa*pa);S=c[d+28>>2]|0;g[S>>2]=f*(J*N+K*p+L*M);g[S+(n<<2)>>2]=f*(J*t+K*u+L*v);g[S+(n<<1<<2)>>2]=f*(J*ma*pa+K*na*pa+L*oa*pa);f=h;h=-t;i=-u;j=-v;T=d+28|0;e=c[d+20>>2]|0}else{f=-N;h=-t;i=-u;j=-v;T=d+28|0;S=c[d+28>>2]|0}l=c[d+12>>2]|0;g[l+(n*3<<2)>>2]=N;g[l+((n*3|0)+1<<2)>>2]=p;g[l+((n*3|0)+2<<2)>>2]=M;g[l+(n<<2<<2)>>2]=t;g[l+((n<<2|1)<<2)>>2]=u;g[l+((n<<2|2)<<2)>>2]=v;g[e+(n*3<<2)>>2]=f;g[e+((n*3|0)+1<<2)>>2]=-p;g[e+((n*3|0)+2<<2)>>2]=-M;g[e+(n<<2<<2)>>2]=h;g[e+((n<<2|1)<<2)>>2]=i;g[e+((n<<2|2)<<2)>>2]=j;K=k*+g[d>>2];L=(_*ba+$*ca+aa*da)*(ka*U+la*V+O*W)-(_*ea+$*fa+aa*ga)*(ka*P+la*Q+O*R);ga=(_*ea+$*fa+aa*ga)*(ha*ka+ia*la+ja*O)-(X*_+Y*$+Z*aa)*(ka*U+la*V+O*W);la=(X*_+Y*$+Z*aa)*(ka*P+la*Q+O*R)-(_*ba+$*ca+aa*da)*(ha*ka+ia*la+ja*O);g[S+(n*3<<2)>>2]=K*(L*N+ga*p+la*M);g[S+(n<<2<<2)>>2]=K*(L*t+ga*u+la*v);if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;r=0;q=0;n=1}else{la=+g[b+708>>2]*+g[b+732>>2];p=la;r=la>0.0?1:2;q=1;n=(a[b+737>>0]|0)!=0}s=(c[d+24>>2]|0)*5|0;g[l+(s<<2)>>2]=ma*pa;g[l+(s+1<<2)>>2]=na*pa;g[l+(s+2<<2)>>2]=oa*pa;g[e+(s<<2)>>2]=-(ma*pa);g[e+(s+1<<2)>>2]=-(na*pa);g[e+(s+2<<2)>>2]=-(oa*pa);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;m=o==f;e=S+(s<<2)|0;g[e>>2]=0.0;l=c[b+748>>2]|0;if(l&2)k=+g[b+764>>2];if(n&(q&m^1)){if(l&4|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+752>>2];i=+g[b+728>>2];j=+g[b+680>>2];h=o>f?1.0:0.0;do if(!(o>=f)){h=j/(k*+g[d>>2]);if(h<0.0)if(i>=o&o-h>i){f=(o-i)/h;break}else{f=i0.0)if(i<=f&f-hf?0.0:1.0;break}else f=0.0}else f=h;while(0);g[e>>2]=f*j*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s<<2)>>2]=c[b+684>>2]}if(!q)return;g[e>>2]=+g[e>>2]+p*k*+g[d>>2];if(l&1|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+760>>2];if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{S=(r|0)==1;f=S?3402823466385288598117041.0e14:0.0;h=S?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s<<2)>>2]=h;g[(c[d+40>>2]|0)+(s<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=+g[qa+388>>2]*ma*pa+ +g[qa+392>>2]*na*pa+ +g[qa+396>>2]*oa*pa-(ma*pa*+g[ra+388>>2]+na*pa*+g[ra+392>>2]+oa*pa*+g[ra+396>>2]);if((r|0)==1){if(!(f<0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[T>>2]|0)+(s<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}function Ac(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ia=l;l=l+32|0;da=c[b+28>>2]|0;ea=c[b+32>>2]|0;$=+g[da+404>>2];_=+g[ea+404>>2];W=c[d+24>>2]|0;ca=a[b+180>>0]|0?1.0:-1.0;X=+g[b+936>>2]-+g[b+872>>2];Y=+g[b+940>>2]-+g[b+876>>2];Z=+g[b+944>>2]-+g[b+880>>2];aa=$+_>0.0?_/($+_):.5;A=c[b+824>>2]|0;B=c[b+840>>2]|0;E=c[b+856>>2]|0;F=c[b+888>>2]|0;G=c[b+904>>2]|0;H=c[b+920>>2]|0;S=(a[b+49>>0]|0)==0;do if(!S){f=aa*(c[j>>2]=A,+g[j>>2]);k=aa*(c[j>>2]=B,+g[j>>2]);i=aa*(c[j>>2]=E,+g[j>>2]);h=(1.0-aa)*(c[j>>2]=F,+g[j>>2]);n=(1.0-aa)*(c[j>>2]=G,+g[j>>2]);i=i+(1.0-aa)*(c[j>>2]=H,+g[j>>2]);o=1.0/+D(+((f+h)*(f+h)+(k+n)*(k+n)+i*i));e=(g[j>>2]=(f+h)*o,c[j>>2]|0);m=(g[j>>2]=(k+n)*o,c[j>>2]|0);v=(g[j>>2]=i*o,c[j>>2]|0);if(+C(+(i*o))>.7071067690849304){R=1.0/+D(+(i*o*i*o+(k+n)*o*(k+n)*o));c[ia+24>>2]=0;g[ia+20>>2]=-(i*o*R);g[ia+16>>2]=(k+n)*o*R;g[ia>>2]=(i*o*i*o+(k+n)*o*(k+n)*o)*R;g[ia+4>>2]=-((f+h)*o*(k+n)*o*R);U=ia;V=ia+4|0;f=(f+h)*o*-(i*o*R);q=2;fa=e;ga=m;ha=v;e=0;h=0.0;break}else{Q=(f+h)*o*(f+h)*o+(k+n)*o*(k+n)*o;R=1.0/+D(+Q);T=(g[j>>2]=-((k+n)*o*R),c[j>>2]|0);g[ia+24>>2]=-((k+n)*o*R);g[ia+20>>2]=(f+h)*o*R;c[ia+16>>2]=0;g[ia>>2]=-(i*o*(f+h)*o*R);g[ia+4>>2]=i*o*-((k+n)*o*R);U=ia;V=ia+4|0;f=Q*R;q=2;fa=e;ga=m;ha=v;e=T;h=-((k+n)*o*R);break}}else{T=c[b+828>>2]|0;U=c[b+844>>2]|0;V=c[b+860>>2]|0;c[ia+24>>2]=T;c[ia+20>>2]=U;c[ia+16>>2]=V;V=c[b+848>>2]|0;U=c[b+864>>2]|0;c[ia>>2]=c[b+832>>2];c[ia+4>>2]=V;c[ia+8>>2]=U;U=ia;V=ia+4|0;f=0.0;q=3;fa=A;ga=B;ha=E;e=T;h=(c[j>>2]=T,+g[j>>2])}while(0);g[ia+(q<<2)>>2]=f;T=c[d+12>>2]|0;c[T>>2]=e;m=c[ia+20>>2]|0;c[T+4>>2]=m;q=c[ia+16>>2]|0;c[T+8>>2]=q;v=c[ia>>2]|0;c[T+(W<<2)>>2]=v;x=c[V>>2]|0;c[T+(W+1<<2)>>2]=x;y=c[ia+8>>2]|0;c[T+(W+2<<2)>>2]=y;z=c[d+20>>2]|0;g[z>>2]=-h;s=(c[j>>2]=m,+g[j>>2]);g[z+4>>2]=-s;w=(c[j>>2]=q,+g[j>>2]);g[z+8>>2]=-w;t=(c[j>>2]=v,+g[j>>2]);g[z+(W<<2)>>2]=-t;p=(c[j>>2]=x,+g[j>>2]);g[z+(W+1<<2)>>2]=-p;u=(c[j>>2]=y,+g[j>>2]);g[z+(W+2<<2)>>2]=-u;e=c[b+300>>2]|0;f=+g[b+280>>2];if(!(e&128))f=f*+g[d+4>>2];K=f*+g[d>>2];Q=(c[j>>2]=B,+g[j>>2]);M=(c[j>>2]=H,+g[j>>2]);L=(c[j>>2]=E,+g[j>>2]);O=(c[j>>2]=G,+g[j>>2]);R=(c[j>>2]=F,+g[j>>2]);N=(c[j>>2]=A,+g[j>>2]);H=c[d+28>>2]|0;g[H>>2]=K*((Q*M-L*O)*h+(L*R-N*M)*s+(N*O-Q*R)*w);g[H+(W<<2)>>2]=K*((Q*M-L*O)*t+(L*R-N*M)*p+(N*O-Q*R)*u);if(e&64|0){H=c[d+32>>2]|0;c[H>>2]=c[b+292>>2];c[H+(W<<2)>>2]=c[b+292>>2]}R=+g[da+52>>2];L=+g[da+56>>2];O=+g[da+60>>2];J=+g[ea+52>>2];f=+g[ea+56>>2];i=+g[ea+60>>2];if(S){N=(i-O)*h-(J-R)*w;r=(J-R)*s-(f-L)*h;g[T+(W<<1<<2)>>2]=aa*((f-L)*w-(i-O)*s);g[T+((W<<1|1)<<2)>>2]=aa*N;g[T+((W<<1)+2<<2)>>2]=aa*r;g[z+(W<<1<<2)>>2]=(1.0-aa)*((f-L)*w-(i-O)*s);g[z+((W<<1|1)<<2)>>2]=(1.0-aa)*N;g[z+((W<<1)+2<<2)>>2]=(1.0-aa)*r;g[T+(W*3<<2)>>2]=aa*((f-L)*u-(i-O)*p);g[T+((W*3|0)+1<<2)>>2]=aa*((i-O)*t-(J-R)*u);g[T+((W*3|0)+2<<2)>>2]=aa*((J-R)*p-(f-L)*t);g[z+(W*3<<2)>>2]=(1.0-aa)*((f-L)*u-(i-O)*p);g[z+((W*3|0)+1<<2)>>2]=(1.0-aa)*((i-O)*t-(J-R)*u);g[z+((W*3|0)+2<<2)>>2]=(1.0-aa)*((J-R)*p-(f-L)*t);e=c[d+8>>2]|0;V=c[ia+24>>2]|0;c[e+(W<<1<<2)>>2]=V;c[e+((W<<1|1)<<2)>>2]=m;c[e+((W<<1)+2<<2)>>2]=q;c[e+(W*3<<2)>>2]=v;c[e+((W*3|0)+1<<2)>>2]=x;c[e+((W*3|0)+2<<2)>>2]=y;q=c[d+16>>2]|0;r=(c[j>>2]=V,+g[j>>2]);g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;Q=0.0;M=0.0;K=0.0;I=0.0;o=0.0;n=0.0;k=f-L;i=i-O;h=J-R}else{u=+g[b+936>>2]-J;w=+g[b+940>>2]-f;M=+g[b+944>>2]-i;n=(c[j>>2]=fa,+g[j>>2]);k=(c[j>>2]=ga,+g[j>>2]);o=(c[j>>2]=ha,+g[j>>2]);N=+g[b+872>>2]-R;Q=+g[b+876>>2]-L;i=+g[b+880>>2]-O;O=+g[b+1080>>2]-+g[b+1032>>2];R=n*(n*N+k*Q+o*i)+n*O-n*(n*u+k*w+o*M);I=k*(n*N+k*Q+o*i)+k*O-k*(n*u+k*w+o*M);O=o*(n*N+k*Q+o*i)+o*O-o*(n*u+k*w+o*M);K=N-n*(n*N+k*Q+o*i)+aa*R;J=Q-k*(n*N+k*Q+o*i)+aa*I;L=i-o*(n*N+k*Q+o*i)+aa*O;R=u-n*(n*u+k*w+o*M)-(1.0-aa)*R;I=w-k*(n*u+k*w+o*M)-(1.0-aa)*I;O=M-o*(n*u+k*w+o*M)-(1.0-aa)*O;h=aa*(u-n*(n*u+k*w+o*M))+(1.0-aa)*(N-n*(n*N+k*Q+o*i));f=aa*(w-k*(n*u+k*w+o*M))+(1.0-aa)*(Q-k*(n*N+k*Q+o*i));i=aa*(M-o*(n*u+k*w+o*M))+(1.0-aa)*(i-o*(n*N+k*Q+o*i));g[ia+24>>2]=h;g[ia+20>>2]=f;g[ia+16>>2]=i;if(i*i+(h*h+f*f)>1.1920928955078125e-07){Q=1.0/+D(+(i*i+(h*h+f*f)));g[ia+24>>2]=h*Q;g[ia+20>>2]=Q*f;g[ia+16>>2]=Q*i;m=(g[j>>2]=h*Q,c[j>>2]|0);q=(g[j>>2]=Q*f,c[j>>2]|0);w=Q*i;s=Q*f;r=h*Q;e=(g[j>>2]=Q*i,c[j>>2]|0)}else{m=c[b+828>>2]|0;q=c[b+844>>2]|0;e=c[b+860>>2]|0;c[ia+24>>2]=m;c[ia+20>>2]=q;c[ia+16>>2]=e;w=(c[j>>2]=e,+g[j>>2]);s=(c[j>>2]=q,+g[j>>2]);r=(c[j>>2]=m,+g[j>>2])}t=k*w-o*s;u=n*s-k*r;g[U>>2]=t;g[V>>2]=o*r-n*w;g[ia+8>>2]=u;g[ia+12>>2]=0.0;g[T+(W<<1<<2)>>2]=J*w-L*s;g[T+(W<<1<<2)+4>>2]=L*r-K*w;g[T+(W<<1<<2)+8>>2]=K*s-J*r;U=c[d+20>>2]|0;g[U+(W<<1<<2)>>2]=-(I*w-O*s);g[U+((W<<1|1)<<2)>>2]=-(O*r-R*w);g[U+((W<<1)+2<<2)>>2]=-(R*s-I*r);p=+g[V>>2];if($<1.1920928955078125e-07|_<1.1920928955078125e-07?(a[b+297>>0]|0)!=0:0){f=aa*(J*u-L*p);h=aa*(K*p-J*t);i=aa*(L*t-K*u);k=(1.0-aa)*(I*u-O*p);n=(1.0-aa)*(O*t-R*u);o=(1.0-aa)*(R*p-I*t)}else{f=J*u-L*p;h=K*p-J*t;i=L*t-K*u;k=I*u-O*p;n=O*t-R*u;o=R*p-I*t}V=(c[d+12>>2]|0)+(W*3<<2)|0;g[V>>2]=f;g[V+4>>2]=i;g[V+8>>2]=h;V=c[d+20>>2]|0;g[V+(W*3<<2)>>2]=-k;g[V+((W*3|0)+1<<2)>>2]=-n;g[V+((W*3|0)+2<<2)>>2]=-o;V=c[d+8>>2]|0;c[V+(W<<1<<2)>>2]=m;c[V+((W<<1|1)<<2)>>2]=q;c[V+((W<<1)+2<<2)>>2]=e;g[V+(W*3<<2)>>2]=t;g[V+((W*3|0)+1<<2)>>2]=p;g[V+((W*3|0)+2<<2)>>2]=u;q=c[d+16>>2]|0;g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;e=V;Q=J;M=L;o=O;n=R;k=0.0;i=0.0;h=0.0}g[m>>2]=N;A=c[b+300>>2]|0;f=+g[b+264>>2];if(!(A&32))f=f*+g[d+4>>2];R=f*+g[d>>2];B=c[d+28>>2]|0;g[B+(W<<1<<2)>>2]=R*(X*r+Y*s+Z*w);g[B+(W*3<<2)>>2]=R*(X*t+Y*p+Z*u);if(A&16|0){V=c[d+32>>2]|0;c[V+(W<<1<<2)>>2]=c[b+276>>2];c[V+(W*3<<2)>>2]=c[b+276>>2]}if(!(a[b+296>>0]|0))if(!(a[b+1096>>0]|0))e=4;else{p=0.0;y=0;x=0;v=1;ba=26}else{Z=ca*+g[b+1032>>2];p=Z;y=Z>0.0?2:1;x=1;v=(a[b+1096>>0]|0)!=0;ba=26}if((ba|0)==26){z=c[d+24>>2]<<2;c[e+(z<<2)>>2]=fa;c[e+((z|1)<<2)>>2]=ga;c[e+((z|2)<<2)>>2]=ha;r=(c[j>>2]=fa,+g[j>>2]);g[q+(z<<2)>>2]=-r;s=(c[j>>2]=ga,+g[j>>2]);g[q+((z|1)<<2)>>2]=-s;t=(c[j>>2]=ha,+g[j>>2]);g[q+((z|2)<<2)>>2]=-t;if(a[b+49>>0]|0){if(!($<1.1920928955078125e-07|_<1.1920928955078125e-07)){e=c[d+12>>2]|0;g[e+(z<<2)>>2]=t*Q-s*M;g[e+((z|1)<<2)>>2]=r*M-t*K;g[e+((z|2)<<2)>>2]=s*K-r*Q;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=-(t*I-s*o);g[e+((z|1)<<2)>>2]=-(r*o-t*n);f=-(s*n-r*I);ba=30}}else{_=t*k-s*i;$=r*i-t*h;f=s*h-r*k;e=c[d+12>>2]|0;g[e+(z<<2)>>2]=aa*_;g[e+((z|1)<<2)>>2]=aa*$;g[e+((z|2)<<2)>>2]=aa*f;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=(1.0-aa)*_;g[e+((z|1)<<2)>>2]=(1.0-aa)*$;f=(1.0-aa)*f;ba=30}if((ba|0)==30)g[e+((z|2)<<2)>>2]=f;e=+g[b+184>>2]==+g[b+188>>2];g[B+(z<<2)>>2]=0.0;m=(c[d+36>>2]|0)+(z<<2)|0;g[m>>2]=0.0;q=(c[d+40>>2]|0)+(z<<2)|0;g[q>>2]=0.0;o=+g[(A&512|0?b+232|0:d+4|0)>>2];if(v&(x&e^1)){if(A&1|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+212>>2];n=+g[b+1100>>2];f=+g[b+1080>>2];h=+g[b+184>>2];i=+g[b+188>>2];k=o*+g[d>>2];do if(!(h>i))if(!(h==i)){if(n/k<0.0)if(f>=h?h-n/k>f:0){f=(h-f)/(n/k);break}else{f=f0.0)if(f<=i?i-n/ki?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]-ca*f*n;g[m>>2]=-+g[b+1104>>2]/+g[d>>2]+ +g[m>>2];g[q>>2]=+g[b+1104>>2]/+g[d>>2]+ +g[q>>2]}if(x){g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]+p*o*+g[d>>2];if(A&256|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+244>>2];if(e){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ba=(y|0)==1;f=ba?-3402823466385288598117041.0e14:0.0;h=ba?0.0:3402823466385288598117041.0e14}g[m>>2]=f;g[q>>2]=h;aa=1.0-+g[b+240>>2];h=+C(+aa);do if(!(aa!=aa|0.0!=0.0|aa==0.0)){f=ca*(r*+g[da+372>>2]+s*+g[da+376>>2]+t*+g[da+380>>2]-(r*+g[ea+372>>2]+s*+g[ea+376>>2]+t*+g[ea+380>>2]));if((y|0)==1){if(!(f<0.0))break;if(!(+g[B+(z<<2)>>2]<-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}else{if(!(f>0.0))break;if(!(+g[B+(z<<2)>>2]>-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}}while(0);g[B+(z<<2)>>2]=+g[b+232>>2]*+g[B+(z<<2)>>2];e=5}else e=5}if(!(a[b+297>>0]|0))if(!(a[b+1112>>0]|0)){l=ia;return}else{t=0.0;x=0;v=0;m=1}else{ca=+g[b+1088>>2];t=ca;x=ca>0.0?1:2;v=1;m=(a[b+1112>>0]|0)!=0}y=P(c[d+24>>2]|0,e)|0;q=c[d+12>>2]|0;c[q+(y<<2)>>2]=fa;c[q+(y+1<<2)>>2]=ga;c[q+(y+2<<2)>>2]=ha;w=(c[j>>2]=fa,+g[j>>2]);q=c[d+20>>2]|0;g[q+(y<<2)>>2]=-w;u=(c[j>>2]=ga,+g[j>>2]);g[q+(y+1<<2)>>2]=-u;s=(c[j>>2]=ha,+g[j>>2]);g[q+(y+2<<2)>>2]=-s;o=+g[b+192>>2];p=+g[b+196>>2];q=c[b+300>>2]|0;r=+g[(q&2048|0?b+248|0:d+4|0)>>2];if(m&(v&o==p^1)){if(!(q&4)){i=o;k=p}else{c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+228>>2];i=+g[b+192>>2];k=+g[b+196>>2]}f=+g[b+1084>>2];n=+g[b+1116>>2];h=r*+g[d>>2];do if(!(i>k))if(!(i==k)){if(n/h<0.0)if(f>=i?i-n/h>f:0){f=(i-f)/(n/h);break}else{f=f0.0)if(f<=k?k-n/hk?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);e=c[d+28>>2]|0;g[e+(y<<2)>>2]=f*n;g[(c[d+36>>2]|0)+(y<<2)>>2]=-+g[b+1120>>2]/+g[d>>2];g[(c[d+40>>2]|0)+(y<<2)>>2]=+g[b+1120>>2]/+g[d>>2]}else e=B;if(!v){l=ia;return}ha=e+(y<<2)|0;g[ha>>2]=+g[ha>>2]+t*r*+g[d>>2];if(q&1024|0)c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+260>>2];if(o==p){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ha=(x|0)==1;f=ha?0.0:-3402823466385288598117041.0e14;h=ha?3402823466385288598117041.0e14:0.0}g[(c[d+36>>2]|0)+(y<<2)>>2]=f;g[(c[d+40>>2]|0)+(y<<2)>>2]=h;ca=1.0-+g[b+256>>2];h=+C(+ca);do if(!(ca!=ca|0.0!=0.0|ca==0.0)){ga=c[b+28>>2]|0;ha=c[b+32>>2]|0;f=w*+g[ga+388>>2]+u*+g[ga+392>>2]+s*+g[ga+396>>2]-(w*+g[ha+388>>2]+u*+g[ha+392>>2]+s*+g[ha+396>>2]);if((x|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(y<<2)|0;g[d>>2]=+g[b+248>>2]*+g[d>>2];l=ia;return}function Bc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0.0,B=0;B=l;l=l+112|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=3356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+344>>2]=0;a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;c[b+744>>2]=d;a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;a[b+1024>>0]=1;c[b+1020>>2]=0;c[b+1012>>2]=0;c[b+1016>>2]=0;c[b+988>>2]=0;c[b+992>>2]=0;c[b+996>>2]=-1;c[b+1e3>>2]=0;c[b+1004>>2]=0;a[b+1064>>0]=1;c[b+1060>>2]=0;c[b+1052>>2]=0;c[b+1056>>2]=0;c[b+1028>>2]=0;c[b+1032>>2]=0;c[b+1036>>2]=-1;c[b+1040>>2]=0;c[b+1044>>2]=0;a[b+1104>>0]=1;c[b+1100>>2]=0;c[b+1092>>2]=0;c[b+1096>>2]=0;c[b+1068>>2]=0;c[b+1072>>2]=0;c[b+1076>>2]=-1;c[b+1080>>2]=0;c[b+1084>>2]=0;a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;c[b+252>>2]=8;c[b+348>>2]=0;g[b+352>>2]=1.0;c[b+356>>2]=0;c[b+356+4>>2]=0;c[b+356+8>>2]=0;c[b+356+12>>2]=0;c[b+356+16>>2]=0;g[b+376>>2]=.20000000298023224;g[b+380>>2]=0.0;g[b+384>>2]=1.0;g[b+388>>2]=.10000000149011612;g[b+392>>2]=1.0;g[b+396>>2]=.699999988079071;g[b+400>>2]=.10000000149011612;g[b+404>>2]=1.0;g[b+408>>2]=.5;g[b+412>>2]=.5;g[b+416>>2]=.5;g[b+420>>2]=.5;g[b+424>>2]=1.0;g[b+428>>2]=1.0;c[b+432>>2]=0;c[b+436>>2]=1;c[b+440>>2]=0;c[b+444>>2]=4;c[b+448>>2]=1;a[b+532>>0]=0;a[b+533>>0]=0;g[b+536>>2]=0.0;c[b+580>>2]=0;c[b+580+4>>2]=0;c[b+580+8>>2]=0;c[b+580+12>>2]=0;c[b+596>>2]=1065353216;c[b+600>>2]=0;c[b+600+4>>2]=0;c[b+600+8>>2]=0;c[b+600+12>>2]=0;c[b+616>>2]=1065353216;c[b+620>>2]=0;c[b+620+4>>2]=0;c[b+620+8>>2]=0;c[b+620+12>>2]=0;c[b+636>>2]=1065353216;g[b+640>>2]=0.0;c[b+644>>2]=1065353216;c[b+648>>2]=0;c[b+648+4>>2]=0;c[b+648+8>>2]=0;c[b+648+12>>2]=0;c[b+664>>2]=1065353216;c[b+668>>2]=0;c[b+668+4>>2]=0;c[b+668+8>>2]=0;c[b+668+12>>2]=0;c[b+684>>2]=1065353216;g[b+688>>2]=0.0;c[b+740>>2]=0;g[b+948>>2]=0.0;a[b+984>>0]=1;c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;d=c[b+464>>2]|0;if(d|0){if(a[b+468>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+464>>2]=0}a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;d=c[b+484>>2]|0;if(d|0){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;d=c[b+504>>2]|0;do if(d)if(a[b+508>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+476>>2]|0;i=c[b+480>>2]|0;c[b+504>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;if((d|0)==(i|0)){w=14;break}else break}else{c[b+504>>2]=0;w=13;break}else w=13;while(0);if((w|0)==13){a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;i=0;w=14}if((w|0)==14){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0}k=c[b+484>>2]|0;if((i|0)<=0){if(k)w=22}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=22}if((w|0)==22){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;d=i;i=n}else d=i}k=c[b+484>>2]|0;c[k+(d<<2)>>2]=1;d=d+1|0;c[b+476>>2]=d;if((d|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=35}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=35}if((w|0)==35){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;o=d;j=i;i=n}else{o=k;j=i;d=k}}else{o=k;j=d;d=k}c[o+(j<<2)>>2]=2;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){d=0;k=o}else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=48}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=48}if((w|0)==48){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;k=d;j=i;i=n}else{k=o;j=i}}else k=o;c[k+(j<<2)>>2]=3;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=61}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=61}if((w|0)==61){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n}}else i=j;c[d+(i<<2)>>2]=0;c[b+476>>2]=i+1;c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+8>>2]=0;c[d+12>>2]=-1;c[d>>2]=3496;c[d+4>>2]=32;c[d+20>>2]=b;c[b+192>>2]=d;g[d+16>>2]=.25;c[b+1148>>2]=1065353216;c[b+1152>>2]=0;c[b+1152+4>>2]=0;c[b+1152+8>>2]=0;c[b+1152+12>>2]=0;c[b+1168>>2]=1065353216;c[b+1172>>2]=0;c[b+1172+4>>2]=0;c[b+1172+8>>2]=0;c[b+1172+12>>2]=0;c[b+1188>>2]=1065353216;x=b+1192|0;y=x+36|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));g[b+1228>>2]=1.0;z=hh(b)|0;g[z+4>>2]=1.0;g[z+8>>2]=1.0;g[z+12>>2]=1.0;c[z+16>>2]=1;x=c[b+192>>2]|0;A=+nb[c[(c[x>>2]|0)+48>>2]&15](x);x=B;y=x+100|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));n=c[b+772>>2]|0;if((n|0)<(e|0)){if((c[b+776>>2]|0)<(e|0)){if(!e){d=0;j=n}else{c[6995]=(c[6995]|0)+1;d=sc((e*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=c[b+772>>2]|0}if((j|0)>0){i=0;do{x=d+(i*104|0)|0;k=(c[b+780>>2]|0)+(i*104|0)|0;y=x+104|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));i=i+1|0}while((i|0)!=(j|0))}i=c[b+780>>2]|0;if(i|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=d;c[b+776>>2]=e;d=n}else d=n;do{x=c[b+780>>2]|0;c[x+(d*104|0)>>2]=0;x=x+(d*104|0)+4|0;k=B;y=x+100|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));d=d+1|0}while((d|0)!=(e|0))}c[b+772>>2]=e;if((e|0)>0){d=f;i=h;k=0;while(1){o=c[b+780>>2]|0;w=o+(k*104|0)|0;x=w;y=x+104|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));if(!d){n=0;m=0.0;p=0.0;q=0.0;r=0.0}else{n=d+16|0;m=+g[d+12>>2];p=+g[d>>2];q=+g[d+4>>2];r=+g[d+8>>2]}f=o+(k*104|0)+8|0;g[f>>2]=p;g[o+(k*104|0)+12>>2]=q;g[o+(k*104|0)+16>>2]=r;g[o+(k*104|0)+20>>2]=m;h=o+(k*104|0)+24|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];if(!i){j=0;m=1.0}else{j=i+4|0;m=+g[i>>2]}g[o+(k*104|0)+88>>2]=m>0.0?1.0/m:0.0;t=p-A;u=q-A;v=r-A;s=A+p;p=A+q;m=A+r;d=c[b+992>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}x=d;y=x+44|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0))}else c[b+992>>2]=0;c[d+32>>2]=0;c[d+36>>2]=w;c[d+40>>2]=0;g[d>>2]=t;g[d+4>>2]=u;g[d+8>>2]=v;g[d+12>>2]=0.0;g[d+16>>2]=s;g[d+20>>2]=p;g[d+24>>2]=m;g[d+28>>2]=0.0;Pe(b+988|0,c[b+988>>2]|0,d);c[b+1e3>>2]=(c[b+1e3>>2]|0)+1;c[o+(k*104|0)+96>>2]=d;c[o+(k*104|0)+4>>2]=z;k=k+1|0;if((k|0)==(e|0))break;else{d=n;i=j}}}d=c[b+988>>2]|0;if(!d){c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;l=B;return}e=c[b+192>>2]|0;u=+nb[c[(c[e>>2]|0)+48>>2]&15](e);A=+g[d+4>>2]-u;v=+g[d+8>>2]-u;g[b+952>>2]=+g[d>>2]-u;g[b+956>>2]=A;g[b+960>>2]=v;g[b+964>>2]=0.0;v=u+ +g[d+20>>2];A=u+ +g[d+24>>2];g[b+968>>2]=u+ +g[d+16>>2];g[b+972>>2]=v;g[b+976>>2]=A;g[b+980>>2]=0.0;d=c[b+188>>2]|0;if(!d){l=B;return}e=c[b+744>>2]|0;h=c[e+32>>2]|0;Zb[c[(c[h>>2]|0)+16>>2]&31](h,d,b+952|0,b+968|0,c[e+36>>2]|0);l=B;return}function Cc(d,f,h){d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0;K=l;l=l+96|0;H=c[d+56>>2]|0;if((h-f|0)==1){if(!(a[d+60>>0]|0)){q=(c[d+96>>2]|0)+(H<<6)|0;r=(c[d+76>>2]|0)+(f<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{I=(c[d+116>>2]|0)+(f<<4)|0;J=(c[d+136>>2]|0)+(H<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2]}c[d+56>>2]=(c[d+56>>2]|0)+1;l=K;return}c[K+32>>2]=0;c[K+32+4>>2]=0;c[K+32+8>>2]=0;c[K+32+12>>2]=0;if((h|0)>(f|0)){m=(a[d+60>>0]|0)==0;if(m){j=c[d+76>>2]|0;i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5;n=n+(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5;o=o+(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5;n=n+(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5;o=o+(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5;i=i+1|0}while((i|0)!=(h|0))}C=1.0/+(h-f|0);E=C*k;D=C*n;C=C*o;if(m){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{x=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5-E;y=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5-D;z=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5-C;o=o+x*x;n=y*y+n;k=z*z+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{N=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5-E;M=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5-D;L=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5-C;o=o+N*N;n=M*M+n;k=L*L+k;i=i+1|0}while((i|0)!=(h|0))}g[K+32>>2]=o;g[K+32+4>>2]=n;g[K+32+8>>2]=k;i=K+32|0;p=+(h-f|0)}else{i=K+32|0;p=+(h-f|0);o=0.0;n=0.0;k=0.0}L=1.0/(p+-1.0);M=L*o;g[i>>2]=M;N=L*n;g[K+32+4>>2]=N;L=L*k;g[K+32+8>>2]=L;w=+g[K+32+((M>2]>2]=0;c[K+16+4>>2]=0;c[K+16+8>>2]=0;c[K+16+12>>2]=0;if((h|0)>(f|0)){if(!(a[d+60>>0]|0)){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{o=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5+o;n=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5+n;k=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{o=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5+o;n=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5+n;k=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5+k;i=i+1|0}while((i|0)!=(h|0))}g[K+16>>2]=o;g[K+16+4>>2]=n;g[K+16+8>>2]=k;i=K+16|0}else{i=K+16|0;o=0.0;n=0.0;k=0.0}g[i>>2]=1.0/+(h-f|0)*o;g[K+16+4>>2]=1.0/+(h-f|0)*n;g[K+16+8>>2]=1.0/+(h-f|0)*k;x=+g[K+16+(w<<2)>>2];if((h|0)>(f|0)){i=f;v=f;do{j=(a[d+60>>0]|0)==0;if(j){G=c[d+76>>2]|0;k=+g[G+(v<<6)>>2];n=+g[G+(v<<6)+16>>2];o=+g[G+(v<<6)+4>>2];p=+g[G+(v<<6)+20>>2];t=+g[G+(v<<6)+8>>2];u=+g[G+(v<<6)+24>>2]}else{G=c[d+116>>2]|0;o=+g[d+36>>2];t=+g[d+40>>2];N=+g[d+44>>2];n=+g[d+4>>2];p=+g[d+8>>2];u=+g[d+12>>2];k=+(e[G+(v<<4)>>1]|0)/o+n;n=+(e[G+(v<<4)+6>>1]|0)/o+n;o=+(e[G+(v<<4)+2>>1]|0)/t+p;p=+(e[G+(v<<4)+8>>1]|0)/t+p;t=+(e[G+(v<<4)+4>>1]|0)/N+u;u=+(e[G+(v<<4)+10>>1]|0)/N+u}g[K>>2]=(n+k)*.5;g[K+4>>2]=(p+o)*.5;g[K+8>>2]=(u+t)*.5;g[K+12>>2]=0.0;if(+g[K+(w<<2)>>2]>x){if(j){j=c[d+76>>2]|0;m=j+(v<<6)|0;q=K+32|0;r=m;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=m;r=j+(i<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=(c[d+76>>2]|0)+(i<<6)|0;r=K+32|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{F=c[d+116>>2]|0;G=F+(v<<4)|0;c[K+32>>2]=c[G>>2];c[K+32+4>>2]=c[G+4>>2];c[K+32+8>>2]=c[G+8>>2];c[K+32+12>>2]=c[G+12>>2];F=F+(i<<4)|0;c[G>>2]=c[F>>2];c[G+4>>2]=c[F+4>>2];c[G+8>>2]=c[F+8>>2];c[G+12>>2]=c[F+12>>2];G=(c[d+116>>2]|0)+(i<<4)|0;c[G>>2]=c[K+32>>2];c[G+4>>2]=c[K+32+4>>2];c[G+8>>2]=c[K+32+8>>2];c[G+12>>2]=c[K+32+12>>2]}i=i+1|0}v=v+1|0}while((v|0)!=(h|0))}else i=f;if(!((i|0)>(((h-f|0)/3|0)+f|0)?(i|0)<(h+-1-((h-f|0)/3|0)|0):0))i=(h-f>>1)+f|0;G=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(G<<6)|0;c[F>>2]=c[d+20>>2];c[F+4>>2]=c[d+20+4>>2];c[F+8>>2]=c[d+20+8>>2];c[F+12>>2]=c[d+20+12>>2]}else{F=c[d+136>>2]|0;M=(+g[d+24>>2]-+g[d+8>>2])*+g[d+40>>2];N=(+g[d+28>>2]-+g[d+12>>2])*+g[d+44>>2];b[F+(G<<4)>>1]=~~((+g[d+20>>2]-+g[d+4>>2])*+g[d+36>>2])&65535&-2;b[F+(G<<4)+2>>1]=~~M&65535&-2;b[F+(G<<4)+4>>1]=~~N&65535&-2}j=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(j<<6)+16|0;c[F>>2]=c[d+4>>2];c[F+4>>2]=c[d+4+4>>2];c[F+8>>2]=c[d+4+8>>2];c[F+12>>2]=c[d+4+12>>2]}else{F=c[d+136>>2]|0;L=+g[d+4>>2];M=+g[d+8>>2];N=+g[d+12>>2];M=(M-M)*+g[d+40>>2];N=(N-N)*+g[d+44>>2];b[F+(j<<4)+6>>1]=~~((L-L)*+g[d+36>>2]+1.0)&65535|1;b[F+(j<<4)+8>>1]=~~(M+1.0)&65535|1;b[F+(j<<4)+10>>1]=~~(N+1.0)&65535|1}F=c[d+56>>2]|0;if((h|0)>(f|0)){B=a[d+60>>0]|0;A=f;do{if(!(B<<24>>24)){j=c[d+76>>2]|0;n=+g[j+(A<<6)>>2];u=+g[j+(A<<6)+4>>2];y=+g[j+(A<<6)+8>>2];p=+g[j+(A<<6)+12>>2];k=+g[j+(A<<6)+16>>2];x=+g[j+(A<<6)+20>>2];o=+g[j+(A<<6)+24>>2];t=+g[j+(A<<6)+28>>2];j=c[d+96>>2]|0;if(n<+g[j+(F<<6)>>2])g[j+(F<<6)>>2]=n;if(u<+g[j+(F<<6)+4>>2])g[j+(F<<6)+4>>2]=u;if(y<+g[j+(F<<6)+8>>2])g[j+(F<<6)+8>>2]=y;if(p<+g[j+(F<<6)+12>>2])g[j+(F<<6)+12>>2]=p;if(+g[j+(F<<6)+16>>2]>2]=k;if(+g[j+(F<<6)+20>>2]>2]=x;if(+g[j+(F<<6)+24>>2]>2]=o;if(+g[j+(F<<6)+28>>2]>2]=t}else{v=c[d+116>>2]|0;p=+g[d+36>>2];y=+g[d+40>>2];E=+g[d+44>>2];t=+g[d+4>>2];z=+g[d+8>>2];L=+g[d+12>>2];u=+g[d+4>>2];C=+g[d+8>>2];M=+g[d+12>>2];x=+g[d+36>>2];D=+g[d+40>>2];N=+g[d+44>>2];j=~~((+(e[v+(A<<4)>>1]|0)/p+t-u)*x)&65535&-2;m=~~((+(e[v+(A<<4)+2>>1]|0)/y+z-C)*D)&65535&-2;q=~~((+(e[v+(A<<4)+4>>1]|0)/E+L-M)*N)&65535&-2;r=~~((+(e[v+(A<<4)+6>>1]|0)/p+t-u)*x+1.0)&65535|1;s=~~((+(e[v+(A<<4)+8>>1]|0)/y+z-C)*D+1.0)&65535|1;v=~~((+(e[v+(A<<4)+10>>1]|0)/E+L-M)*N+1.0)&65535|1;w=c[d+136>>2]|0;if((e[w+(F<<4)>>1]|0)>(j&65535))b[w+(F<<4)>>1]=j;if((e[w+(F<<4)+6>>1]|0)<(r&65535))b[w+(F<<4)+6>>1]=r;if((e[w+(F<<4)+2>>1]|0)>(m&65535))b[w+(F<<4)+2>>1]=m;if((e[w+(F<<4)+8>>1]|0)<(s&65535))b[w+(F<<4)+8>>1]=s;if((e[w+(F<<4)+4>>1]|0)>(q&65535))b[w+(F<<4)+4>>1]=q;if((e[w+(F<<4)+10>>1]|0)<(v&65535))b[w+(F<<4)+10>>1]=v}A=A+1|0}while((A|0)!=(h|0))}c[d+56>>2]=F+1;Cc(d,f,i);A=c[d+56>>2]|0;Cc(d,i,h);w=(c[d+56>>2]|0)-H|0;i=a[d+60>>0]|0;if(i<<24>>24!=0&(w<<4|0)>2048){s=c[d+136>>2]|0;q=c[s+(F+1<<4)+12>>2]|0;q=(q|0)>-1?1:0-q|0;v=c[s+(A<<4)+12>>2]|0;v=(v|0)>-1?1:0-v|0;if((q<<4|0)<2049){r=c[d+152>>2]|0;if((r|0)==(c[d+156>>2]|0)?(I=r|0?r<<1:1,(r|0)<(I|0)):0){if(!I){i=0;m=r}else{c[6995]=(c[6995]|0)+1;i=sc(I<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{H=i+(j<<5)|0;h=(c[d+160>>2]|0)+(j<<5)|0;c[H>>2]=c[h>>2];c[H+4>>2]=c[h+4>>2];c[H+8>>2]=c[h+8>>2];c[H+12>>2]=c[h+12>>2];c[H+16>>2]=c[h+16>>2];c[H+20>>2]=c[h+20>>2];c[H+24>>2]=c[h+24>>2];c[H+28>>2]=c[h+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=I;i=c[d+152>>2]|0}else i=r;c[d+152>>2]=i+1;I=(c[d+160>>2]|0)+(r<<5)|0;c[I>>2]=c[K+32>>2];c[I+4>>2]=c[K+32+4>>2];c[I+8>>2]=c[K+32+8>>2];c[I+12>>2]=c[K+32+12>>2];c[I+16>>2]=c[K+32+16>>2];c[I+20>>2]=c[K+32+20>>2];c[I+24>>2]=c[K+32+24>>2];c[I+28>>2]=c[K+32+28>>2];I=c[d+160>>2]|0;b[I+(r<<5)>>1]=b[s+(F+1<<4)>>1]|0;b[I+(r<<5)+2>>1]=b[s+(F+1<<4)+2>>1]|0;b[I+(r<<5)+4>>1]=b[s+(F+1<<4)+4>>1]|0;b[I+(r<<5)+6>>1]=b[s+(F+1<<4)+6>>1]|0;b[I+(r<<5)+8>>1]=b[s+(F+1<<4)+8>>1]|0;b[I+(r<<5)+10>>1]=b[s+(F+1<<4)+10>>1]|0;c[I+(r<<5)+12>>2]=F+1;c[I+(r<<5)+16>>2]=q}if((v<<4|0)<2049){q=c[d+152>>2]|0;if((q|0)==(c[d+156>>2]|0)?(J=q|0?q<<1:1,(q|0)<(J|0)):0){if(!J){i=0;m=q}else{c[6995]=(c[6995]|0)+1;i=sc(J<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{I=i+(j<<5)|0;H=(c[d+160>>2]|0)+(j<<5)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[I+16>>2]=c[H+16>>2];c[I+20>>2]=c[H+20>>2];c[I+24>>2]=c[H+24>>2];c[I+28>>2]=c[H+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=J;i=c[d+152>>2]|0}else i=q;c[d+152>>2]=i+1;i=(c[d+160>>2]|0)+(q<<5)|0;c[i>>2]=c[K+32>>2];c[i+4>>2]=c[K+32+4>>2];c[i+8>>2]=c[K+32+8>>2];c[i+12>>2]=c[K+32+12>>2];c[i+16>>2]=c[K+32+16>>2];c[i+20>>2]=c[K+32+20>>2];c[i+24>>2]=c[K+32+24>>2];c[i+28>>2]=c[K+32+28>>2];i=c[d+160>>2]|0;b[i+(q<<5)>>1]=b[s+(A<<4)>>1]|0;b[i+(q<<5)+2>>1]=b[s+(A<<4)+2>>1]|0;b[i+(q<<5)+4>>1]=b[s+(A<<4)+4>>1]|0;b[i+(q<<5)+6>>1]=b[s+(A<<4)+6>>1]|0;b[i+(q<<5)+8>>1]=b[s+(A<<4)+8>>1]|0;b[i+(q<<5)+10>>1]=b[s+(A<<4)+10>>1]|0;c[i+(q<<5)+12>>2]=A;c[i+(q<<5)+16>>2]=v;i=d+152|0}else i=d+152|0;c[d+168>>2]=c[i>>2];i=a[d+60>>0]|0}if(!(i<<24>>24)){c[(c[d+96>>2]|0)+(G<<6)+32>>2]=w;l=K;return}else{c[(c[d+136>>2]|0)+(G<<4)+12>>2]=0-w;l=K;return}}function Dc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0.0,T=0;T=l;l=l+208|0;g[b+56>>2]=0.0;H=T+192+4|0;I=T+192+8|0;c[T+192>>2]=0;c[T+192+4>>2]=0;c[T+192+8>>2]=0;c[T+192+12>>2]=0;c[T+128>>2]=c[d>>2];c[T+128+4>>2]=c[d+4>>2];c[T+128+8>>2]=c[d+8>>2];c[T+128+12>>2]=c[d+12>>2];c[T+128+16>>2]=c[d+16>>2];c[T+128+16+4>>2]=c[d+16+4>>2];c[T+128+16+8>>2]=c[d+16+8>>2];c[T+128+16+12>>2]=c[d+16+12>>2];c[T+128+32>>2]=c[d+32>>2];c[T+128+32+4>>2]=c[d+32+4>>2];c[T+128+32+8>>2]=c[d+32+8>>2];c[T+128+32+12>>2]=c[d+32+12>>2];C=T+128+48|0;c[C>>2]=c[d+48>>2];c[C+4>>2]=c[d+48+4>>2];c[C+8>>2]=c[d+48+8>>2];c[C+12>>2]=c[d+48+12>>2];c[T+64>>2]=c[d+64>>2];c[T+64+4>>2]=c[d+64+4>>2];c[T+64+8>>2]=c[d+64+8>>2];c[T+64+12>>2]=c[d+64+12>>2];c[T+64+16>>2]=c[d+80>>2];c[T+64+16+4>>2]=c[d+80+4>>2];c[T+64+16+8>>2]=c[d+80+8>>2];c[T+64+16+12>>2]=c[d+80+12>>2];c[T+64+32>>2]=c[d+96>>2];c[T+64+32+4>>2]=c[d+96+4>>2];c[T+64+32+8>>2]=c[d+96+8>>2];c[T+64+32+12>>2]=c[d+96+12>>2];E=T+64+48|0;c[E>>2]=c[d+112>>2];c[E+4>>2]=c[d+112+4>>2];c[E+8>>2]=c[d+112+8>>2];c[E+12>>2]=c[d+112+12>>2];J=+g[C>>2];K=+g[E>>2];L=T+128+52|0;M=+g[L>>2];N=T+64+52|0;O=+g[N>>2];P=T+128+56|0;Q=+g[P>>2];R=T+64+56|0;S=+g[R>>2];g[C>>2]=J-(J+K)*.5;g[L>>2]=M-(M+O)*.5;g[P>>2]=Q-(Q+S)*.5;g[E>>2]=K-(J+K)*.5;g[N>>2]=O-(M+O)*.5;g[R>>2]=S-(Q+S)*.5;if(((c[(c[b+28>>2]|0)+4>>2]|0)+-17|0)>>>0<2)C=((c[(c[b+32>>2]|0)+4>>2]|0)+-17|0)>>>0<2;else C=0;v=+g[b+44>>2];u=+g[b+48>>2];c[6413]=(c[6413]|0)+1;E=a[b+52>>0]|0;c[b+64>>2]=0;c[b+4>>2]=0;c[b+8>>2]=1065353216;c[b+12>>2]=0;g[b+16>>2]=0.0;c[b+68>>2]=0;c[b+60>>2]=-1;n=c[b+24>>2]|0;a[n+312>>0]=0;c[n>>2]=0;a[n+356>>0]=1;c[n+292>>2]=1566444395;c[n+296>>2]=1566444395;c[n+300>>2]=1566444395;g[n+304>>2]=0.0;c[n+336>>2]=0;c[n+336+4>>2]=0;c[n+336+8>>2]=0;c[n+336+12>>2]=0;a[n+336+16>>0]=0;a[n+332>>0]=a[n+332>>0]&-16;n=0;p=999999984306749440.0;do{q=+g[b+4>>2];o=+g[b+8>>2];j=+g[b+12>>2];k=+g[d+4>>2]*-q+ +g[d+20>>2]*-o+ +g[d+36>>2]*-j;m=+g[d+8>>2]*-q+ +g[d+24>>2]*-o+ +g[d+40>>2]*-j;g[T+48>>2]=+g[d>>2]*-q+ +g[d+16>>2]*-o+ +g[d+32>>2]*-j;g[T+48+4>>2]=k;g[T+48+8>>2]=m;g[T+48+12>>2]=0.0;m=q*+g[d+68>>2]+o*+g[d+84>>2]+j*+g[d+100>>2];k=q*+g[d+72>>2]+o*+g[d+88>>2]+j*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*q+ +g[d+80>>2]*o+ +g[d+96>>2]*j;g[T+32+4>>2]=m;g[T+32+8>>2]=k;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);k=+g[T+16>>2];m=+g[T+16+4>>2];j=+g[T+16+8>>2];o=k*+g[T+128>>2]+m*+g[T+128+4>>2]+j*+g[T+128+8>>2]+ +g[T+128+48>>2];q=k*+g[T+128+16>>2]+m*+g[T+128+20>>2]+j*+g[T+128+24>>2]+ +g[L>>2];j=k*+g[T+128+32>>2]+m*+g[T+128+36>>2]+j*+g[T+128+40>>2]+ +g[P>>2];m=+g[T>>2];k=+g[T+4>>2];t=+g[T+8>>2];r=m*+g[T+64>>2]+k*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2];s=m*+g[T+64+16>>2]+k*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2];t=m*+g[T+64+32>>2]+k*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2];k=C?0.0:t;m=C?0.0:j;t=(C?0.0:j)-(C?0.0:t);j=+g[b+4>>2]*(o-r)+ +g[b+8>>2]*(q-s)+ +g[b+12>>2]*t;if(j>0.0?j*j>p*+g[d+128>>2]:0){c[b+68>>2]=10;n=1;h=0}else G=7;do if((G|0)==7){G=0;z=c[b+24>>2]|0;A=c[z>>2]|0;a:do if((A|0)>0){i=+g[z+308>>2];h=0;while(1){x=o-r-+g[z+4+(h<<4)>>2];y=q-s-+g[z+4+(h<<4)+4>>2];B=t-+g[z+4+(h<<4)+8>>2];h=h+1|0;if(x*x+y*y+B*B<=i){h=1;break a}if((h|0)>=(A|0)){h=0;break}}}else h=0;while(0);if((+g[z+304>>2]==0.0?t==+g[z+300>>2]:0)?q-s==+g[z+296>>2]:0){if(o-r==+g[z+292>>2]|h)G=16}else G=15;if((G|0)==15?(G=0,h):0)G=16;if((G|0)==16){G=0;c[b+68>>2]=1;n=1;h=0;break}i=p-j;if(i<=p*9.999999974752427e-07){c[b+68>>2]=i<=0.0?2:11;n=1;h=0;break}g[z+292>>2]=o-r;g[z+296>>2]=q-s;g[z+300>>2]=t;g[z+304>>2]=0.0;a[z+356>>0]=1;g[z+4+(A<<4)>>2]=o-r;g[z+4+(A<<4)+4>>2]=q-s;g[z+4+(A<<4)+8>>2]=t;g[z+4+(A<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+84+(h<<4)>>2]=o;g[z+84+(h<<4)+4>>2]=q;g[z+84+(h<<4)+8>>2]=m;g[z+84+(h<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+164+(h<<4)>>2]=r;g[z+164+(h<<4)+4>>2]=s;g[z+164+(h<<4)+8>>2]=k;g[z+164+(h<<4)+12>>2]=0.0;c[z>>2]=(c[z>>2]|0)+1;h=c[b+24>>2]|0;A=wc(h)|0;i=+g[h+276>>2];j=+g[h+280>>2];k=+g[h+284>>2];h=c[h+288>>2]|0;if(!A){c[b+68>>2]=3;n=1;h=0;break}if(i*i+j*j+k*k<9.999999974752427e-07){g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;c[b+68>>2]=6;n=1;h=0;break}if(p-(i*i+j*j+k*k)<=p*1.1920928955078125e-07){c[b+68>>2]=12;p=i*i+j*j+k*k;n=1;h=0;break}g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;A=c[b+64>>2]|0;c[b+64>>2]=A+1;if((A|0)<=1e3)if((c[c[b+24>>2]>>2]|0)==4){c[b+68>>2]=13;p=i*i+j*j+k*k;h=0}else{p=i*i+j*j+k*k;h=1}else{p=i*i+j*j+k*k;h=0}}while(0)}while(h);w=E<<24>>24==0?u:0.0;v=(E<<24>>24==0?v:0.0)+w;if(n){E=c[b+24>>2]|0;wc(E)|0;i=+g[E+260>>2];o=+g[E+264>>2];m=+g[E+268>>2];c[T+192>>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];j=+g[b+4>>2];k=+g[b+8>>2];q=+g[b+12>>2];if(j*j+k*k+q*q<9.999999974752427e-07)c[b+68>>2]=5;if(j*j+k*k+q*q>1.4210854715202004e-14){y=1.0/+D(+(j*j+k*k+q*q));g[T+192>>2]=y*+g[T+192>>2];g[H>>2]=y*+g[H>>2];g[I>>2]=y*+g[I>>2];B=w/+D(+p);p=1.0/y-v;n=1;h=1;i=B*j+i;o=B*k+o;m=B*q+m}else{p=0.0;n=0;h=2}c[b+60>>2]=h}else{p=0.0;n=0;i=0.0;o=0.0;m=0.0}if(((c[b+72>>2]|0)!=0?(c[b+20>>2]|0)!=0:0)?(c[b+68>>2]|0)!=0:0)h=v+p<1.0000000474974513e-03;else h=0;z=n^1;do if(h|z?(F=c[b+20>>2]|0,(F|0)!=0):0){c[6412]=(c[6412]|0)+1;c[b+4>>2]=0;c[b+4+4>>2]=0;c[b+4+8>>2]=0;c[b+4+12>>2]=0;if(!(Gb[c[(c[F>>2]|0)+8>>2]&3](F,c[b+24>>2]|0,c[b+28>>2]|0,c[b+32>>2]|0,T+128|0,T+64|0,b+4|0,T+48|0,T+32|0,f)|0)){k=+g[b+4>>2];r=+g[b+8>>2];t=+g[b+12>>2];if(!(k*k+r*r+t*t>0.0)){if(n){q=i;break}l=T;return}q=+g[T+32>>2];y=+g[T+48>>2]-q;s=+g[T+32+4>>2];B=+g[T+48+4>>2]-s;u=+g[T+32+8>>2];j=+g[T+48+8>>2]-u;j=+D(+(y*y+B*B+j*j))-v;if(j>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];B=+g[T+192>>2];m=+g[H>>2];o=+g[I>>2];p=1.0/+D(+(B*B+m*m+o*o));g[T+192>>2]=B*p;g[H>>2]=m*p;g[I>>2]=o*p;c[b+60>>2]=6;p=j;q=w*k+q;o=w*r+s;m=w*t+u;break}c[b+60>>2]=5;if(n){q=i;break}l=T;return}q=+g[T+32>>2];k=+g[T+48>>2];y=+g[T+32+4>>2];r=+g[T+48+4>>2];B=+g[T+32+8>>2];s=+g[T+48+8>>2];if(!((q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s)<=1.4210854715202004e-14)){j=(q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s);u=q-k;v=B-s;w=0.0;x=y-r}else{u=+g[b+4>>2];x=+g[b+8>>2];v=+g[b+12>>2];j=u*u+x*x+v*v;w=+g[b+16>>2]}if(!(j>1.4210854715202004e-14)){c[b+60>>2]=9;if(n){q=i;break}l=T;return}t=1.0/+D(+j);j=-+D(+((k-q)*(k-q)+(r-y)*(r-y)+(s-B)*(s-B)));c[b+60>>2]=3;if(p>j|z){g[T+192>>2]=u*t;g[H>>2]=x*t;g[I>>2]=v*t;g[T+192+12>>2]=w;p=j;o=y;m=B;break}c[b+60>>2]=8;if(n)q=i;else{l=T;return}}else G=54;while(0);if((G|0)==54)if(n)q=i;else{l=T;return}if(!(p<0.0)?!(p*p<+g[d+128>>2]):0){l=T;return}c[b+4>>2]=c[T+192>>2];c[b+4+4>>2]=c[T+192+4>>2];c[b+4+8>>2]=c[T+192+8>>2];c[b+4+12>>2]=c[T+192+12>>2];g[b+56>>2]=p;u=+g[T+192>>2];v=+g[H>>2];B=+g[I>>2];j=u*+g[d+4>>2]+v*+g[d+20>>2]+B*+g[d+36>>2];i=u*+g[d+8>>2]+v*+g[d+24>>2]+B*+g[d+40>>2];g[T+48>>2]=+g[d>>2]*u+ +g[d+16>>2]*v+ +g[d+32>>2]*B;g[T+48+4>>2]=j;g[T+48+8>>2]=i;g[T+48+12>>2]=0.0;i=+g[d+68>>2]*-u+ +g[d+84>>2]*-v+ +g[d+100>>2]*-B;j=+g[d+72>>2]*-u+ +g[d+88>>2]*-v+ +g[d+104>>2]*-B;g[T+32>>2]=+g[d+64>>2]*-u+ +g[d+80>>2]*-v+ +g[d+96>>2]*-B;g[T+32+4>>2]=i;g[T+32+8>>2]=j;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);j=+g[T+16>>2];i=+g[T+16+4>>2];B=+g[T+16+8>>2];v=+g[T>>2];u=+g[T+4>>2];t=+g[T+8>>2];y=+g[T+192>>2];x=+g[H>>2];w=+g[I>>2];t=-((j*+g[T+128+16>>2]+i*+g[T+128+20>>2]+B*+g[T+128+24>>2]+ +g[L>>2]-(v*+g[T+64+16>>2]+u*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2]))*x)-(j*+g[T+128>>2]+i*+g[T+128+4>>2]+B*+g[T+128+8>>2]+ +g[T+128+48>>2]-(v*+g[T+64>>2]+u*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2]))*y-(j*+g[T+128+32>>2]+i*+g[T+128+36>>2]+B*+g[T+128+40>>2]+ +g[P>>2]-(v*+g[T+64+32>>2]+u*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2]))*w;u=+g[d+4>>2]*-y+ +g[d+20>>2]*-x+ +g[d+36>>2]*-w;v=+g[d+8>>2]*-y+ +g[d+24>>2]*-x+ +g[d+40>>2]*-w;g[T+48>>2]=+g[d>>2]*-y+ +g[d+16>>2]*-x+ +g[d+32>>2]*-w;g[T+48+4>>2]=u;g[T+48+8>>2]=v;g[T+48+12>>2]=0.0;v=y*+g[d+68>>2]+x*+g[d+84>>2]+w*+g[d+100>>2];u=y*+g[d+72>>2]+x*+g[d+88>>2]+w*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*y+ +g[d+80>>2]*x+ +g[d+96>>2]*w;g[T+32+4>>2]=v;g[T+32+8>>2]=u;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);u=+g[T+16>>2];v=+g[T+16+4>>2];w=+g[T+16+8>>2];x=+g[T>>2];y=+g[T+4>>2];B=+g[T+8>>2];i=+g[T+192>>2];j=+g[H>>2];k=+g[I>>2];if(t>(u*+g[T+128>>2]+v*+g[T+128+4>>2]+w*+g[T+128+8>>2]+ +g[T+128+48>>2]-(x*+g[T+64>>2]+y*+g[T+64+4>>2]+B*+g[T+64+8>>2]+ +g[T+64+48>>2]))*i+(u*+g[T+128+16>>2]+v*+g[T+128+20>>2]+w*+g[T+128+24>>2]+ +g[L>>2]-(x*+g[T+64+16>>2]+y*+g[T+64+20>>2]+B*+g[T+64+24>>2]+ +g[N>>2]))*j+(u*+g[T+128+32>>2]+v*+g[T+128+36>>2]+w*+g[T+128+40>>2]+ +g[P>>2]-(x*+g[T+64+32>>2]+y*+g[T+64+36>>2]+B*+g[T+64+40>>2]+ +g[R>>2]))*k){c[b+60>>2]=10;g[T+192>>2]=-i;g[H>>2]=-j;g[I>>2]=-k}b=c[(c[e>>2]|0)+16>>2]|0;g[T+48>>2]=(J+K)*.5+q;g[T+48+4>>2]=(M+O)*.5+o;g[T+48+8>>2]=(Q+S)*.5+m;g[T+48+12>>2]=0.0;Tb[b&15](e,T+192|0,T+48|0,p);l=T;return}function Ec(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,O=0;t=l;l=l+208|0;if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&32768|0):0){r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Pb[c[(c[r>>2]|0)+64>>2]&7](r,b,.10000000149011612)}f=c[d+4>>2]|0;switch(f|0){case 31:{f=c[d+20>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+28>>2]|0;E=+g[r+(f*80|0)>>2];B=+g[r+(f*80|0)+4>>2];y=+g[r+(f*80|0)+8>>2];D=+g[r+(f*80|0)+16>>2];A=+g[r+(f*80|0)+20>>2];w=+g[r+(f*80|0)+24>>2];C=+g[r+(f*80|0)+32>>2];z=+g[r+(f*80|0)+36>>2];u=+g[r+(f*80|0)+40>>2];M=+g[r+(f*80|0)+48>>2];L=+g[r+(f*80|0)+52>>2];k=+g[r+(f*80|0)+56>>2];r=c[r+(f*80|0)+64>>2]|0;q=c[(c[a>>2]|0)+28>>2]|0;K=+g[b>>2];J=+g[b+4>>2];I=+g[b+8>>2];H=+g[b+16>>2];G=+g[b+20>>2];F=+g[b+24>>2];x=+g[b+32>>2];v=+g[b+36>>2];h=+g[b+40>>2];i=M*K+L*J+k*I+ +g[b+48>>2];j=M*H+L*G+k*F+ +g[b+52>>2];k=M*x+L*v+k*h+ +g[b+56>>2];g[t+144>>2]=E*K+D*J+C*I;g[t+144+4>>2]=B*K+A*J+z*I;g[t+144+8>>2]=y*K+w*J+u*I;g[t+144+12>>2]=0.0;g[t+144+16>>2]=E*H+D*G+C*F;g[t+144+20>>2]=B*H+A*G+z*F;g[t+144+24>>2]=y*H+w*G+u*F;g[t+144+28>>2]=0.0;g[t+144+32>>2]=E*x+D*v+C*h;g[t+144+36>>2]=B*x+A*v+z*h;g[t+144+40>>2]=y*x+w*v+u*h;g[t+144+44>>2]=0.0;g[t+144+48>>2]=i;g[t+144+52>>2]=j;g[t+144+56>>2]=k;g[t+144+60>>2]=0.0;Vb[q&127](a,t+144|0,r,e)}while((s|0)>1);l=t;return}case 0:{c[t+144>>2]=c[d+32>>2];c[t+144+4>>2]=c[d+32+4>>2];c[t+144+8>>2]=c[d+32+8>>2];c[t+144+12>>2]=c[d+32+12>>2];K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);L=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=K+ +g[t+144>>2];g[t+144>>2]=K;L=L+ +g[t+144+4>>2];g[t+144+4>>2]=L;M=M+ +g[t+144+8>>2];g[t+144+8>>2]=M;d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;a=c[(c[d>>2]|0)+80>>2]|0;g[t+112>>2]=-K;g[t+112+4>>2]=-L;g[t+112+8>>2]=-M;g[t+112+12>>2]=0.0;Zb[a&31](d,t+112|0,t+144|0,b,e);l=t;return}case 8:{M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Nb[c[(c[d>>2]|0)+24>>2]&0](d,M,b,e);l=t;return}case 9:{f=c[d+96>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+104>>2]|0;y=+g[r+(f<<4)>>2];z=+g[r+(f<<4)+4>>2];L=+g[r+(f<<4)+8>>2];r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;q=c[(c[r>>2]|0)+24>>2]|0;M=+g[(c[d+124>>2]|0)+(f<<2)>>2];B=+g[b>>2];C=+g[b+4>>2];A=+g[b+8>>2];E=+g[b+16>>2];F=+g[b+20>>2];D=+g[b+24>>2];H=+g[b+32>>2];I=+g[b+36>>2];G=+g[b+40>>2];J=y*B+z*C+L*A+ +g[b+48>>2];K=y*E+z*F+L*D+ +g[b+52>>2];L=y*H+z*I+L*G+ +g[b+56>>2];g[t+144>>2]=B+C*0.0+A*0.0;g[t+144+4>>2]=B*0.0+C+A*0.0;g[t+144+8>>2]=A+(B*0.0+C*0.0);g[t+144+12>>2]=0.0;g[t+144+16>>2]=E+F*0.0+D*0.0;g[t+144+20>>2]=E*0.0+F+D*0.0;g[t+144+24>>2]=D+(E*0.0+F*0.0);g[t+144+28>>2]=0.0;g[t+144+32>>2]=H+I*0.0+G*0.0;g[t+144+36>>2]=H*0.0+I+G*0.0;g[t+144+40>>2]=G+(H*0.0+I*0.0);g[t+144+44>>2]=0.0;g[t+144+48>>2]=J;g[t+144+52>>2]=K;g[t+144+56>>2]=L;g[t+144+60>>2]=0.0;Nb[q&0](r,M,t+144|0,e)}while((s|0)>1);l=t;return}case 10:{s=c[d+56>>2]|0;L=+g[d+32+(((s+2|0)%3|0)<<2)>>2];M=+g[d+32+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+84>>2]&0](d,L,M,s,b,e);l=t;return}case 11:{L=+g[d+60>>2];M=+g[d+64>>2];d=c[d+72>>2]|0;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[a>>2]|0)+92>>2]&0](a,L,M,d,b,e);l=t;return}case 13:{s=c[d+56>>2]|0;L=+nb[c[(c[d>>2]|0)+92>>2]&15](d);c[t+128>>2]=c[d+32>>2];c[t+128+4>>2]=c[d+32+4>>2];c[t+128+8>>2]=c[d+32+8>>2];c[t+128+12>>2]=c[d+32+12>>2];J=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[t+128>>2]=J+ +g[t+128>>2];g[t+128+4>>2]=K+ +g[t+128+4>>2];g[t+128+8>>2]=M+ +g[t+128+8>>2];M=+g[t+128+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+88>>2]&0](d,L,M,s,b,e);l=t;return}case 28:{M=+g[d+68>>2];a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Rb[c[(c[a>>2]|0)+96>>2]&0](a,d+52|0,M,b,e);l=t;return}default:{a:do if((f|0)<7){r=c[d+56>>2]|0;if(!r){if((xb[c[(c[d>>2]|0)+100>>2]&127](d)|0)<=0)break;f=0;while(1){Vb[c[(c[d>>2]|0)+104>>2]&127](d,f,t+144|0,t+112|0);K=+g[t+144>>2];y=+g[b>>2];I=+g[t+144+4>>2];z=+g[b+4>>2];G=+g[t+144+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+16>>2]=K*y+I*z+G*A+B;g[t+16+4>>2]=K*C+I*D+G*E+F;g[t+16+8>>2]=K*H+I*J+G*L+M;g[t+16+12>>2]=0.0;G=+g[t+112>>2];I=+g[t+112+4>>2];K=+g[t+112+8>>2];g[t>>2]=G*y+I*z+K*A+B;g[t+4>>2]=G*C+I*D+K*E+F;g[t+8>>2]=G*H+I*J+K*L+M;g[t+12>>2]=0.0;s=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Vb[c[(c[s>>2]|0)+16>>2]&127](s,t+16|0,t,e);f=f+1|0;if((f|0)>=(xb[c[(c[d>>2]|0)+100>>2]&127](d)|0))break a}}if((c[r+28>>2]|0)>0){q=0;do{f=c[r+36>>2]|0;p=c[f+(q*36|0)+4>>2]|0;b:do if((p|0)!=0?(s=c[f+(q*36|0)+12>>2]|0,(p|0)>0):0){f=0;n=c[s+(p+-1<<2)>>2]|0;m=s;h=0.0;i=0.0;k=0.0;while(1){o=c[m+(f<<2)>>2]|0;m=c[r+16>>2]|0;h=h+ +g[m+(o<<4)>>2];i=i+ +g[m+(o<<4)+4>>2];k=k+ +g[m+(o<<4)+8>>2];m=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[m>>2]|0)+16>>2]|0;O=c[r+16>>2]|0;K=+g[O+(n<<4)>>2];y=+g[b>>2];I=+g[O+(n<<4)+4>>2];z=+g[b+4>>2];G=+g[O+(n<<4)+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+144>>2]=K*y+I*z+G*A+B;g[t+144+4>>2]=K*C+I*D+G*E+F;g[t+144+8>>2]=K*H+I*J+G*L+M;g[t+144+12>>2]=0.0;G=+g[O+(o<<4)>>2];I=+g[O+(o<<4)+4>>2];K=+g[O+(o<<4)+8>>2];g[t+112>>2]=G*y+I*z+K*A+B;g[t+112+4>>2]=G*C+I*D+K*E+F;g[t+112+8>>2]=G*H+I*J+K*L+M;g[t+112+12>>2]=0.0;Vb[N&127](m,t+144|0,t+112|0,e);f=f+1|0;m=c[r+36>>2]|0;if((f|0)>=(c[m+(q*36|0)+4>>2]|0))break b;n=o;m=c[m+(q*36|0)+12>>2]|0}}else{h=0.0;i=0.0;k=0.0}while(0);j=1.0/+(p|0)*h;i=1.0/+(p|0)*i;h=1.0/+(p|0)*k;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;if((xb[c[(c[O>>2]|0)+56>>2]&127](O)|0)&16384|0){c[t+144>>2]=1065353216;c[t+144+4>>2]=1065353216;c[t+144+8>>2]=0;g[t+144+12>>2]=0.0;O=c[r+36>>2]|0;G=+g[O+(q*36|0)+20>>2];I=+g[O+(q*36|0)+24>>2];K=+g[O+(q*36|0)+28>>2];O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[O>>2]|0)+16>>2]|0;y=+g[b>>2];z=+g[b+4>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+112>>2]=j*y+i*z+h*A+B;g[t+112+4>>2]=j*C+i*D+h*E+F;g[t+112+8>>2]=j*H+i*J+h*L+M;g[t+112+12>>2]=0.0;g[t+16>>2]=(j+G)*y+(i+I)*z+(h+K)*A+B;g[t+16+4>>2]=(j+G)*C+(i+I)*D+(h+K)*E+F;g[t+16+8>>2]=(j+G)*H+(i+I)*J+(h+K)*L+M;g[t+16+12>>2]=0.0;Vb[N&127](O,t+112|0,t+16|0,t+144|0)}q=q+1|0}while((q|0)<(c[r+28>>2]|0))}}while(0);f=c[d+4>>2]|0;if((f+-21|0)>>>0<9){c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;f=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=f;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];Vb[c[(c[d>>2]|0)+64>>2]&127](d,t+16|0,t+112|0,t+144|0);f=c[d+4>>2]|0}if((f|0)!=3){l=t;return}c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=O;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];O=c[d+96>>2]|0;Vb[c[(c[O>>2]|0)+8>>2]&127](O,t+16+4|0,t+112|0,t+144|0);l=t;return}}}function Fc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0;T=l;l=l+144|0;R=c[d+36>>2]|0;o=+g[(+g[R+88>>2]>0.0?b+16|0:b+20|0)>>2];if(a[R+100>>0]&1){l=T;return}P=c[b+8>>2]|0;t=c[P+4>>2]|0;Q=c[P+12>>2]|0;L=c[(c[b+4>>2]|0)+744>>2]|0;N=+g[R+8>>2]-+g[Q+48>>2];q=+g[R+12>>2]-+g[Q+52>>2];O=+g[R+16>>2]-+g[Q+56>>2];F=1.0/+g[L+76>>2];E=(N*+g[Q>>2]+q*+g[Q+16>>2]+O*+g[Q+32>>2])*F/3.0;I=E<0.0?~~(1.0-E):0;M=~~((E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0);u=(E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0-+(M|0);I=~~(E+ +(I|0))-I|0;E=F*(N*+g[Q+4>>2]+q*+g[Q+20>>2]+O*+g[Q+36>>2])/3.0;G=E<0.0?~~(1.0-E):0;J=~~((E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0);n=(E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0-+(J|0);G=~~(E+ +(G|0))-G|0;O=F*(N*+g[Q+8>>2]+q*+g[Q+24>>2]+O*+g[Q+40>>2])/3.0;H=O<0.0?~~(1.0-O):0;K=~~((O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0);q=(O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0-+(K|0);H=~~(O+ +(H|0))-H|0;p=(I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)+(G&65535)+((I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)>>>11)|0;p=(p^G>>>16<<11^p<<16)+(H&65535)+((p^G>>>16<<11^p<<16)>>>11)|0;p=(p^H>>>16<<11^p<<16)+(t&65535)+((p^H>>>16<<11^p<<16)>>>11)|0;p=((p^t>>>16<<11^p<<16)>>>11)+(p^t>>>16<<11^p<<16)|0;p=((p<<3^p)>>>5)+(p<<3^p)<<4^((p<<3^p)>>>5)+(p<<3^p);p=(((p>>>17)+p<<25^(p>>>17)+p)>>>6)+((p>>>17)+p<<25^(p>>>17)+p)|0;r=c[L+60>>2]|0;s=c[L+68>>2]|0;d=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]|0;c[L+96>>2]=(c[L+96>>2]|0)+1;e=(c[L+92>>2]|0)+1|0;c[L+92>>2]=e;a:do if(!d)f=9;else while(1){if(((((c[d+272>>2]|0)==(p|0)?(c[d+256>>2]|0)==(I|0):0)?(c[d+260>>2]|0)==(G|0):0)?(c[d+264>>2]|0)==(H|0):0)?(c[d+276>>2]|0)==(t|0):0)break a;d=c[d+280>>2]|0;e=e+1|0;c[L+92>>2]=e;if(!d){f=9;break}}while(0);b:do if((f|0)==9){f=c[L+84>>2]|0;c[L+84>>2]=f+1;if((f|0)>=(c[L+88>>2]|0)){c[5760]=(c[5760]|0)+1;c:do if((r|0)>0){d=0;e=s;while(1){f=e+(d<<2)|0;e=c[f>>2]|0;c[f>>2]=0;if(e|0)do{f=e;e=c[e+280>>2]|0;cJ(f)}while((e|0)!=0);d=d+1|0;if((d|0)==(r|0))break c;e=c[L+68>>2]|0}}while(0);g[L+76>>2]=.25;c[L+80>>2]=0;c[L+84>>2]=0;c[L+92>>2]=1;c[L+96>>2]=1}d=Ds(284)|0;Yk(d|0,0,284)|0;c[d+280>>2]=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2];c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]=d;c[d+276>>2]=t;c[d+272>>2]=p;c[d+256>>2]=I;c[d+260>>2]=G;c[d+264>>2]=H;k=+g[L+76>>2];r=T+72+4|0;s=T+72+24|0;t=T+72+44|0;e=0;h=k;while(1){j=k*+(H|0)*3.0+ +(e|0)*h;f=0;while(1){i=k*+(G|0)*3.0+ +(f|0)*h;g[T>>2]=+(I|0)*3.0*k+h*0.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2];g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+64+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*2.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+128+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*3.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+192+(f<<4)+(e<<2)>>2]=h;f=f+1|0;if((f|0)==4)break;h=+g[L+76>>2]}e=e+1|0;if((e|0)==4)break b;h=+g[L+76>>2]}}while(0);c[d+268>>2]=c[L+80>>2];h=+g[d+(M<<6)+(J<<4)+(K<<2)>>2];C=+g[d+(M+1<<6)+(J<<4)+(K<<2)>>2];A=+g[d+(M+1<<6)+(J+1<<4)+(K<<2)>>2];B=+g[d+(M<<6)+(J+1<<4)+(K<<2)>>2];O=+g[d+(M<<6)+(J<<4)+(K+1<<2)>>2];N=+g[d+(M+1<<6)+(J<<4)+(K+1<<2)>>2];E=+g[d+(M+1<<6)+(J+1<<4)+(K+1<<2)>>2];F=+g[d+(M<<6)+(J+1<<4)+(K+1<<2)>>2];i=C-h+n*(A-B-(C-h))+q*(N-O+n*(E-F-(N-O))-(C-h+n*(A-B-(C-h))));j=B-h+u*(A-C-(B-h))+q*(F-O+u*(E-N-(F-O))-(B-h+u*(A-C-(B-h))));k=O-h+u*(N-C-(O-h))+n*(F-B+u*(E-A-(F-B))-(O-h+u*(N-C-(O-h))));m=1.0/+D(+(i*i+j*j+k*k));h=h+u*(C-h)+n*(B+u*(A-B)-(h+u*(C-h)));h=h+q*(O+u*(N-O)+n*(F+u*(E-F)-(O+u*(N-O)))-h)-o;if(!(h<0.0)){l=T;return}s=c[P+8>>2]|0;N=+g[Q>>2]*i*m+ +g[Q+4>>2]*j*m+ +g[Q+8>>2]*k*m;O=i*m*+g[Q+16>>2]+j*m*+g[Q+20>>2]+k*m*+g[Q+24>>2];F=i*m*+g[Q+32>>2]+j*m*+g[Q+36>>2]+k*m*+g[Q+40>>2];E=-(N*(+g[R+8>>2]-h*N)+O*(+g[R+12>>2]-h*O)+F*(+g[R+16>>2]-h*F));z=+g[R+88>>2];d=c[b+12>>2]|0;if(!d)q=0.0;else q=+g[d+404>>2];if(!(z+q>0.0)){l=T;return}if(!d)d=c[(c[b+8>>2]|0)+8>>2]|0;if((a[22464]|0)==0?Uz(22464)|0:0){e=23044;f=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0))}e=c[b+12>>2]|0;m=+g[R+8>>2];B=m-+g[d+52>>2];n=+g[R+12>>2];C=n-+g[d+56>>2];o=+g[R+16>>2];A=o-+g[d+60>>2];if(!e){Q=c[b+4>>2]|0;h=0.0;i=0.0;j=0.0;d=Q;k=+g[Q+512>>2]}else{j=+g[e+392>>2];i=+g[e+396>>2];y=+g[e+388>>2];d=c[b+4>>2]|0;k=+g[d+512>>2];h=(j*A-i*C+ +g[e+372>>2])*k;i=(+g[e+376>>2]+(i*B-A*y))*k;j=(C*y-j*B+ +g[e+380>>2])*k}W=m-+g[R+24>>2]-h;V=n-+g[R+28>>2]-i;U=o-+g[R+32>>2]-j;i=+g[d+376>>2]*+g[(c[(c[b+8>>2]|0)+8>>2]|0)+228>>2];y=1.0/k;Uh(T+72|0,q,(e|0)==0?23044:e+324|0,B,C,A);j=z+ +g[T+72>>2];k=+g[T+72+4>>2]+0.0;m=+g[T+72+8>>2]+0.0;n=+g[T+72+16>>2]+0.0;o=z+ +g[T+72+20>>2];q=+g[T+72+24>>2]+0.0;u=+g[T+72+32>>2]+0.0;v=+g[T+72+36>>2]+0.0;w=z+ +g[T+72+40>>2];x=1.0/(m*(n*v-o*u)+(j*(o*w-q*v)+k*(q*u-n*w)));r=c[b+4>>2]|0;h=z*+g[r+512>>2];i=(U-F*(W*N+V*O+U*F))*(U-F*(W*N+V*O+U*F))+((W-N*(W*N+V*O+U*F))*(W-N*(W*N+V*O+U*F))+(V-O*(W*N+V*O+U*F))*(V-O*(W*N+V*O+U*F)))>2]|0)+8>>2]|0)+204>>2]&3|0?r+388|0:r+384|0)>>2]|0;d=c[r+872>>2]|0;if((d|0)==(c[r+876>>2]|0)?(S=d|0?d<<1:1,(d|0)<(S|0)):0){if(!S)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((S*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[r+872>>2]|0}if((d|0)>0){e=0;do{Q=f+(e*104|0)|0;P=c[r+880>>2]|0;M=P+(e*104|0)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];c[Q+16>>2]=c[M+16>>2];c[Q+20>>2]=c[M+20>>2];c[Q+24>>2]=c[M+24>>2];Q=f+(e*104|0)+28|0;M=P+(e*104|0)+28|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=P+(e*104|0)+44|0;M=f+(e*104|0)+44|0;c[M>>2]=c[Q>>2];c[M+4>>2]=c[Q+4>>2];c[M+8>>2]=c[Q+8>>2];c[M+12>>2]=c[Q+12>>2];M=P+(e*104|0)+60|0;Q=f+(e*104|0)+60|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=f+(e*104|0)+76|0;P=P+(e*104|0)+76|0;c[Q>>2]=c[P>>2];c[Q+4>>2]=c[P+4>>2];c[Q+8>>2]=c[P+8>>2];c[Q+12>>2]=c[P+12>>2];c[Q+16>>2]=c[P+16>>2];c[Q+20>>2]=c[P+20>>2];c[Q+24>>2]=c[P+24>>2];e=e+1|0}while((e|0)!=(d|0))}d=c[r+880>>2]|0;if(d|0){if(a[r+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[r+880>>2]=0}a[r+884>>0]=1;c[r+880>>2]=f;c[r+876>>2]=S;d=c[r+872>>2]|0}Q=c[r+880>>2]|0;c[Q+(d*104|0)>>2]=s;g[Q+(d*104|0)+4>>2]=N;g[Q+(d*104|0)+8>>2]=O;g[Q+(d*104|0)+12>>2]=F;g[Q+(d*104|0)+16>>2]=0.0;g[Q+(d*104|0)+20>>2]=E;c[Q+(d*104|0)+24>>2]=R;g[Q+(d*104|0)+28>>2]=(n*v-o*u)*x*0.0+(y*(o*w-q*v)*x+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+32>>2]=(k*u-j*v)*x*0.0+(y*(m*v-k*w)*x+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+36>>2]=(j*o-k*n)*x*0.0+(y*(k*q-m*o)*x+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+40>>2]=0.0;g[Q+(d*104|0)+44>>2]=(n*v-o*u)*x*0.0+((o*w-q*v)*x*0.0+y*(q*u-n*w)*x);g[Q+(d*104|0)+48>>2]=(k*u-j*v)*x*0.0+((m*v-k*w)*x*0.0+y*(j*w-m*u)*x);g[Q+(d*104|0)+52>>2]=(j*o-k*n)*x*0.0+((k*q-m*o)*x*0.0+y*(m*n-j*q)*x);g[Q+(d*104|0)+56>>2]=0.0;g[Q+(d*104|0)+60>>2]=y*(n*v-o*u)*x+((o*w-q*v)*x*0.0+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+64>>2]=y*(k*u-j*v)*x+((m*v-k*w)*x*0.0+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+68>>2]=y*(j*o-k*n)*x+((k*q-m*o)*x*0.0+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+72>>2]=0.0;S=Q+(d*104|0)+76|0;g[S>>2]=B;g[Q+(d*104|0)+80>>2]=C;g[Q+(d*104|0)+84>>2]=A;g[Q+(d*104|0)+88>>2]=0.0;g[S+16>>2]=h;g[S+20>>2]=i;c[S+24>>2]=p;c[r+872>>2]=(c[r+872>>2]|0)+1;d=c[b+12>>2]|0;if(!d){l=T;return}if(c[d+204>>2]&3|0){l=T;return}if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=1;g[d+224>>2]=0.0;l=T;return} +function Ki(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9184;if(a[b+152>>0]|0?(d=c[b+96>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+96>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}f=c[b+160>>2]|0;if((f|0)>0){d=0;do{g=c[b+168>>2]|0;h=g+(d*20|0)+4|0;i=g+(d*20|0)+12|0;j=c[i>>2]|0;e=g+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+168>>2]|0;if(!d){a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}function Li(b){b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=9068;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;c[b+68>>2]=0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=c[b+16>>2]|0;c[f+(d<<4)>>2]=c[g+(d<<4)>>2];c[f+(d<<4)+4>>2]=c[g+(d<<4)+4>>2];c[f+(d<<4)+8>>2]=c[g+(d<<4)+8>>2];c[f+(d<<4)+12>>2]=c[g+(d<<4)+12>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}function Mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[d>>2]|0;d=c[b+328>>2]|0;a:do if((d|0)>0){f=c[b+336>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break;e=e+1|0;if((e|0)>=(d|0))break a}if((e|0)!=(d|0))return}while(0);if((d|0)==(c[b+332>>2]|0)?(h=d|0?d<<1:1,(d|0)<(h|0)):0){if(!h)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((h<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[b+328>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[b+336>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+336>>2]|0;if(e){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=f;c[b+332>>2]=h}c[(c[b+336>>2]|0)+(d<<2)>>2]=g;c[b+328>>2]=d+1;return}function Ni(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+28>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+32>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+28>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+32>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+28>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+32>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ni(a,b,e);if((f|0)<(d|0))b=f;else break}return}function Oi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){h=c[b+8>>2]|0;Zb[c[(c[h>>2]|0)+24>>2]&31](h,d,e,f,g);break}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;a[d+52>>0]=0;a[d+53>>0]=0;f=c[b+8>>2]|0;$b[c[(c[f>>2]|0)+20>>2]&7](f,d,e,e,1,g);if(a[d+53>>0]|0)if(!(a[d+52>>0]|0)){b=3;h=11}else b=3;else{b=4;h=11}if((h|0)==11){c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1}c[d+44>>2]=b;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function Pi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0,i=0,k=0.0,m=0.0,n=0.0;i=l;l=l+16|0;c[i>>2]=c[a+32>>2];c[i+4>>2]=c[a+32+4>>2];c[i+8>>2]=c[a+32+8>>2];c[i+12>>2]=c[a+32+12>>2];n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[i>>2]=n+ +g[i>>2];g[i+4>>2]=m+ +g[i+4>>2];g[i+8>>2]=k+ +g[i+8>>2];f=c[a+56>>2]|0;switch(f|0){case 0:{a=0;e=1;break}case 2:{a=2;e=0;break}default:{a=1;e=0}}n=+g[i+(e<<2)>>2];m=+g[i+(a<<2)>>2];h=(g[j>>2]=b*.25*n*n+b/12.0*m*m*4.0,c[j>>2]|0);a=(g[j>>2]=b*.5*n*n,c[j>>2]|0);switch(f|0){case 0:{e=h;f=h;break}case 2:{e=a;f=h;a=h;break}default:{e=h;f=a;a=h}}c[d>>2]=a;c[d+4>>2]=f;c[d+8>>2]=e;g[d+12>>2]=0.0;l=i;return}function Qi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[a>>2]=4060;if((c[a+104>>2]|0)<=0){a=a+60|0;gj(a);kj(a);return}k=0;do{j=c[(c[a+4>>2]|0)+744>>2]|0;h=(c[a+112>>2]|0)+(k<<3)+4|0;b=c[h>>2]|0;if((c[j+60>>2]|0)>0){g=0;do{i=(c[j+68>>2]|0)+(g<<2)|0;d=c[i>>2]|0;a:do if(d|0){e=0;do{f=e|0?e+280|0:i;e=d;while(1){d=c[e+280>>2]|0;if((c[e+276>>2]|0)!=(b|0))break;c[f>>2]=d;cJ(e);if(!d)break a;else e=d}}while((d|0)!=0)}while(0);g=g+1|0}while((g|0)<(c[j+60>>2]|0));b=c[h>>2]|0}if(b|0)Ib[c[(c[b>>2]|0)+4>>2]&511](b);k=k+1|0}while((k|0)<(c[a+104>>2]|0));a=a+60|0;gj(a);kj(a);return}function Ri(b){b=b|0;var d=0,e=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+64>>2]|0;if(d|0)do{c[b+64>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+64>>2]|0}while((d|0)!=0);d=c[b+48>>2]|0;if(d|0)do{c[b+48>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+48>>2]|0}while((d|0)!=0);d=c[b+32>>2]|0;if(!d)return;do{c[b+32>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+32>>2]|0}while((d|0)!=0);return}function Si(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=c[d>>2]|0;i=zb[c[(c[i>>2]|0)+56>>2]&31](i,28)|0;j=(a[b+4>>0]|0)==0;h=c[b+8>>2]|0;g=c[b+12>>2]|0;b=c[d>>2]|0;c[i+4>>2]=b;c[i>>2]=5792;a[i+8>>0]=0;c[i+12>>2]=0;if(j){a[i+16>>0]=0;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[i+8>>0]=1;return i|0}else{a[i+16>>0]=1;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[f+8>>2]|0,c[e+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[f+8>>2]|0,c[e+8>>2]|0)|0;a[i+8>>0]=1;return i|0}return 0}function Ti(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if(qD(b,c[d+8>>2]|0)|0)ml(d,e,f,g);else{j=a[d+52>>0]|0;k=a[d+53>>0]|0;l=c[b+12>>2]|0;a[d+52>>0]=0;a[d+53>>0]=0;ao(b+16|0,d,e,f,g,h);a:do if((l|0)>1){i=b+24|0;do{if(a[d+54>>0]|0)break a;if(!(a[d+52>>0]|0)){if(a[d+53>>0]|0?(c[b+8>>2]&1|0)==0:0)break a}else{if((c[d+24>>2]|0)==1)break a;if(!(c[b+8>>2]&2))break a}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,f,g,h);i=i+8|0}while(i>>>0<(b+16+(l<<3)|0)>>>0)}while(0);a[d+52>>0]=j;a[d+53>>0]=k}return}function Ui(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=(c[b>>2]|0)+1794895138|0;f=mB(c[b+8>>2]|0,n)|0;k=mB(c[b+12>>2]|0,n)|0;m=mB(c[b+16>>2]|0,n)|0;a:do if((f>>>0>>2>>>0?k>>>0<(d-(f<<2)|0)>>>0&m>>>0<(d-(f<<2)|0)>>>0:0)?((m|k)&3|0)==0:0){j=0;while(1){i=f>>>1;l=j+i|0;g=mB(c[b+((l<<1)+(k>>>2)<<2)>>2]|0,n)|0;h=mB(c[b+((l<<1)+(k>>>2)+1<<2)>>2]|0,n)|0;if(!(h>>>0>>0&g>>>0<(d-h|0)>>>0)){f=0;break a}if(a[b+(h+g)>>0]|0){f=0;break a}g=Vo(e,b+h|0)|0;if(!g)break;if((f|0)==1){f=0;break a}else{j=(g|0)<0?j:l;f=(g|0)<0?i:f-i|0}}g=mB(c[b+((l<<1)+(m>>>2)<<2)>>2]|0,n)|0;f=mB(c[b+((l<<1)+(m>>>2)+1<<2)>>2]|0,n)|0;if(f>>>0>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Vi(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0,m=0;f=l;l=l+48|0;if((c[b+128>>2]|0)<=0){l=f;return}e=0;do{m=c[b+136>>2]|0;c[f+32>>2]=(a[m+(e*284|0)+84>>0]|0)==0?1065353216:0;c[f+32+4>>2]=0;c[f+32+8>>2]=1065353216;g[f+32+12>>2]=0.0;k=m+(e*284|0)+140|0;c[f+16>>2]=c[k>>2];c[f+16+4>>2]=c[k+4>>2];c[f+16+8>>2]=c[k+8>>2];c[f+16+12>>2]=c[k+12>>2];k=c[b+112>>2]|0;h=c[(c[d>>2]|0)+16>>2]|0;j=+g[m+(e*284|0)+108+(k<<2)>>2]+ +g[f+16+4>>2];i=+g[m+(e*284|0)+124+(k<<2)>>2]+ +g[f+16+8>>2];g[f>>2]=+g[m+(e*284|0)+92+(k<<2)>>2]+ +g[f+16>>2];g[f+4>>2]=j;g[f+8>>2]=i;g[f+12>>2]=0.0;Vb[h&127](d,f+16|0,f,f+32|0);Vb[c[(c[d>>2]|0)+16>>2]&127](d,f+16|0,(c[b+136>>2]|0)+(e*284|0)+16|0,f+32|0);e=e+1|0}while((e|0)<(c[b+128>>2]|0));l=f;return}function Wi(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:{if((e|0)<1){g[a+232>>2]=d;c[a+300>>2]=c[a+300>>2]|512;return}if((e|0)<3){g[a+264>>2]=d;c[a+300>>2]=c[a+300>>2]|32;return}if((e|0)==3){g[a+248>>2]=d;c[a+300>>2]=c[a+300>>2]|2048;return}if((e|0)>=6)return;g[a+280>>2]=d;c[a+300>>2]=c[a+300>>2]|128;return}case 3:{if((e|0)<1){g[a+212>>2]=d;c[a+300>>2]=c[a+300>>2]|1;return}if((e|0)!=3)return;g[a+228>>2]=d;c[a+300>>2]=c[a+300>>2]|4;return}case 4:{if((e|0)<1){g[a+244>>2]=d;c[a+300>>2]=c[a+300>>2]|256;return}if((e|0)<3){g[a+276>>2]=d;c[a+300>>2]=c[a+300>>2]|16;return}if((e|0)==3){g[a+260>>2]=d;c[a+300>>2]=c[a+300>>2]|1024;return}if((e|0)>=6)return;g[a+292>>2]=d;c[a+300>>2]=c[a+300>>2]|64;return}default:return}}function Xi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;k=e+32+44|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);i=(+g[e>>2]-+g[e+16>>2])*.5;h=(+g[e+4>>2]-+g[e+16+4>>2])*.5;j=(+g[e+8>>2]-+g[e+16+8>>2])*.5;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b*.0833333283662796*((h+f)*2.0*(h+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+4>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+8>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(h+f)*2.0*(h+f)*2.0);g[d+12>>2]=0.0;l=e;return}function Yi(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0;l=c[b+780>>2]|0;a:do if(h?(k=c[b+792>>2]|0,(k|0)>0):0){i=c[b+800>>2]|0;h=0;while(1){j=c[i+(h*52|0)+24>>2]|0;if((j|0)==(l+(d*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(e*104|0)|0):0){h=10;break}if((j|0)==(l+(e*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(d*104|0)|0):0){h=10;break}h=h+1|0;if((h|0)>=(k|0))break a}if((h|0)==10)return}while(0);Xh(b,f);f=(c[b+792>>2]|0)+-1|0;k=c[b+800>>2]|0;c[k+(f*52|0)+24>>2]=l+(d*104|0);c[k+(f*52|0)+28>>2]=l+(e*104|0);o=+g[l+(d*104|0)+8>>2]-+g[l+(e*104|0)+8>>2];n=+g[l+(d*104|0)+12>>2]-+g[l+(e*104|0)+12>>2];m=+g[l+(d*104|0)+16>>2]-+g[l+(e*104|0)+16>>2];g[k+(f*52|0)+32>>2]=+D(+(o*o+n*n+m*m));a[b+984>>0]=1;return}function Zi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=+g[b+52>>2];i=+g[b+56>>2];f=+g[b+60>>2];if(!(a[b+84>>0]|0)){c[b+32>>2]=c[b+204>>2];g[b>>2]=-h;g[b+4>>2]=-i;g[b+8>>2]=-f;g[b+12>>2]=0.0;h=0.0;i=1.0;d=b+272|0;g[d>>2]=h;d=b+268|0;g[d>>2]=i;return}else{m=+g[b>>2];l=+g[b+4>>2];k=+g[b+8>>2];n=+g[b+16>>2]-+g[d+52>>2];p=+g[b+20>>2]-+g[d+56>>2];q=+g[b+24>>2]-+g[d+60>>2];j=+g[d+392>>2];r=+g[d+396>>2];o=+g[d+388>>2];j=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f)*(m*(j*q-p*r+ +g[d+372>>2])+l*(+g[d+376>>2]+(n*r-q*o))+k*(p*o-n*j+ +g[d+380>>2])):0.0;i=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f):10.0;d=b+272|0;g[d>>2]=j;d=b+268|0;g[d>>2]=i;return}}function _i(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;e=l;l=l+96|0;j=+g[c>>2];k=+g[c+4>>2];m=+g[c+8>>2];Qq(e+80|0,j,k,m,+Iy(j,k,m,+g[b>>2],+g[b+4>>2],+g[b+8>>2]));m=+g[e+80>>2];k=+g[e+80+4>>2];j=+g[e+80+8>>2];kq(e+64|0,+g[b>>2],+g[b+4>>2],+g[b+8>>2],m,k,j);Ap(e+48|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]);i=+g[e+48>>2];h=+g[e+48+4>>2];f=+g[e+48+8>>2];n=+XI(d);Qq(e+16|0,+g[e+64>>2],+g[e+64+4>>2],+g[e+64+8>>2],n);iq(e+32|0,m,k,j,+g[e+16>>2],+g[e+16+4>>2],+g[e+16+8>>2]);Qq(e,i,h,f,+WI(d));iq(a,+g[e+32>>2],+g[e+32+4>>2],+g[e+32+8>>2],+g[e>>2],+g[e+4>>2],+g[e+8>>2]);l=e;return}function $i(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c[b+228>>2]|0;if((f|0)==(c[b+232>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+228>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+236>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+236>>2]|0;if(g){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+228>>2]|0}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=h;c[b+232>>2]=i}c[(c[b+236>>2]|0)+(f<<2)>>2]=d;c[b+228>>2]=f+1;if(!e)return;ff(c[d+28>>2]|0,d);ff(c[d+32>>2]|0,d);return}function aj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[a+4>>2]|0;if(e|0)ll(e,b,d);a=c[a>>2]|0;if(!a)return;m=+g[b>>2];k=+g[a+128>>2];l=+g[b+4>>2];j=+g[b+8>>2];f=+g[d+4>>2];o=+g[d+8>>2];n=+g[d>>2];i=+g[a+180>>2]*(j*f-l*o)+ +g[a+184>>2]*(m*o-j*n)+(l*n-m*f)*+g[a+188>>2];h=(j*f-l*o)*+g[a+196>>2]+(m*o-j*n)*+g[a+200>>2]+(l*n-m*f)*+g[a+204>>2];f=(j*f-l*o)*+g[a+212>>2]+(m*o-j*n)*+g[a+216>>2]+(l*n-m*f)*+g[a+220>>2];g[a+276>>2]=m*k+ +g[a+276>>2];g[a+280>>2]=k*l+ +g[a+280>>2];g[a+284>>2]=k*j+ +g[a+284>>2];g[a+292>>2]=i+ +g[a+292>>2];g[a+296>>2]=h+ +g[a+296>>2];g[a+300>>2]=f+ +g[a+300>>2];c[a+312>>2]=(c[a+312>>2]|0)+1;return}function bj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;v=+g[a+552>>2];u=+g[a+568>>2];t=+g[a+584>>2];s=+g[b>>2];r=+g[b+4>>2];q=+g[b+8>>2];o=+g[b+16>>2];n=+g[b+20>>2];m=+g[b+24>>2];k=+g[b+32>>2];i=+g[b+36>>2];f=+g[b+40>>2];j=+g[a+556>>2];h=+g[a+572>>2];e=+g[a+588>>2];x=+g[a+620>>2];w=+g[a+636>>2];d=+g[a+652>>2];p=x*+g[c>>2]+w*+g[c+4>>2]+d*+g[c+8>>2];l=x*+g[c+16>>2]+w*+g[c+20>>2]+d*+g[c+24>>2];d=x*+g[c+32>>2]+w*+g[c+36>>2]+d*+g[c+40>>2];d=+L(+((v*s+u*r+t*q)*p+(v*o+u*n+t*m)*l+(v*k+u*i+t*f)*d),+((s*j+r*h+q*e)*p+(o*j+n*h+m*e)*l+(k*j+i*h+f*e)*d));return +(d*+g[a+732>>2])}function cj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=6576;d=c[b+84>>2]|0;g=c[d+8>>2]|0;if((g|0)>0){e=0;do{f=c[(c[d+16>>2]|0)+(e*12|0)+8>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);h=c[b+4>>2]|0;Ob[c[(c[h>>2]|0)+60>>2]&127](h,f)}e=e+1|0}while((e|0)!=(g|0));d=c[b+84>>2]|0}Rh(d);d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+100>>2]|0;if(!d){a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+100>>2]=0;a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}function dj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[a+8>>2]|0;if((d|0)>0){f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&2){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645650,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0))}if((c[a+228>>2]|0)<=0)return;d=0;do{g=c[(c[a+236>>2]|0)+(d<<2)>>2]|0;e=xb[c[(c[g>>2]|0)+36>>2]&127](g)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;f=Bb[c[(c[g>>2]|0)+40>>2]&63](g,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,f,1397641027,g);d=d+1|0}while((d|0)<(c[a+228>>2]|0));return}function ej(a){a=a|0;var b=0.0,d=0,e=0,f=0,h=0;e=l;l=l+32|0;c[a+36>>2]=1566444395;c[a+40>>2]=1566444395;c[a+44>>2]=1566444395;g[a+48>>2]=0.0;c[a+52>>2]=-581039253;c[a+56>>2]=-581039253;c[a+60>>2]=-581039253;g[a+64>>2]=0.0;if((c[a+20>>2]|0)<=0){l=e;return}d=0;do{f=c[a+28>>2]|0;h=c[f+(d*80|0)+64>>2]|0;Vb[c[(c[h>>2]|0)+8>>2]&127](h,f+(d*80|0)|0,e+16|0,e);b=+g[e+16>>2];if(+g[a+36>>2]>b)g[a+36>>2]=b;b=+g[e>>2];if(+g[a+52>>2]>2]=b;b=+g[e+16+4>>2];if(+g[a+40>>2]>b)g[a+40>>2]=b;b=+g[e+4>>2];if(+g[a+56>>2]>2]=b;b=+g[e+16+8>>2];if(+g[a+44>>2]>b)g[a+44>>2]=b;b=+g[e+8>>2];if(+g[a+60>>2]>2]=b;d=d+1|0}while((d|0)<(c[a+20>>2]|0));l=e;return}function fj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+64|0;h=c[d>>2]|0;g=d+(c[h+-8>>2]|0)|0;h=c[h+-4>>2]|0;c[i>>2]=e;c[i+4>>2]=d;c[i+8>>2]=2808;d=qD(h,e)|0;e=i+12|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));b[i+12+40>>1]=0;a[i+12+42>>0]=0;a:do if(d){c[i+48>>2]=1;$b[c[(c[h>>2]|0)+20>>2]&7](h,i,g,g,1,0);d=(c[i+24>>2]|0)==1?g:0}else{Zb[c[(c[h>>2]|0)+24>>2]&31](h,i,g,1,0);switch(c[i+36>>2]|0){case 0:{d=((c[i+40>>2]|0)==1?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1?c[i+20>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((c[i+24>>2]|0)!=1?!(((c[i+40>>2]|0)==0?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1):0){d=0;break}d=c[i+16>>2]|0}while(0);l=i;return d|0}function gj(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(d|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+72>>2]|0;if(!d){a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0;a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}function hj(){var b=0;b=Os()|0;c[b>>2]=5052;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+232>>2]=0;c[b+224>>2]=0;c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;return b|0}function ij(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=c[b+348>>2]|0;if((g|0)==(c[b+352>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+348>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+356>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+356>>2]|0;if(h){if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+348>>2]|0}c[b+356>>2]=0}a[b+360>>0]=1;c[b+356>>2]=i;c[b+352>>2]=j}c[(c[b+356>>2]|0)+(g<<2)>>2]=d;c[b+348>>2]=g+1;c[d+344>>2]=c[b+472>>2];Og(b,d,e<<16>>16,f<<16>>16);return}function jj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(i+(+g[e>>2]-+g[e+16>>2])*.5)*2.0;f=(i+(+g[e+4>>2]-+g[e+16+4>>2])*.5)*2.0;i=(i+(+g[e+8>>2]-+g[e+16+8>>2])*.5)*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);g[d+12>>2]=0.0;l=e;return}function kj(b){b=b|0;var d=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function lj(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;e=c[a+792>>2]|0;if((e|0)<=0)return;d=c[a+800>>2]|0;a=0;do{n=c[d+(a*52|0)+24>>2]|0;f=c[d+(a*52|0)+28>>2]|0;s=+g[n+40>>2];q=+g[n+44>>2];i=+g[n+48>>2];k=d+(a*52|0)+8|0;r=+g[k>>2];m=d+(a*52|0)+12|0;p=+g[m>>2];l=d+(a*52|0)+16|0;o=+g[l>>2];j=-(+g[d+(a*52|0)+48>>2]*((s-+g[f+40>>2])*r+(q-+g[f+44>>2])*p+(i-+g[f+48>>2])*o)*b);h=+g[n+88>>2]*j;g[n+40>>2]=s+r*h;g[n+44>>2]=q+p*h;g[n+48>>2]=o*h+i;j=+g[f+88>>2]*j;i=j*+g[m>>2];h=j*+g[l>>2];g[f+40>>2]=+g[f+40>>2]-+g[k>>2]*j;g[f+44>>2]=+g[f+44>>2]-i;g[f+48>>2]=+g[f+48>>2]-h;a=a+1|0}while((a|0)!=(e|0));return}function mj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+12>>2]|0;if(!e)return;if(!(a[b+8>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+12>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+56>>2]|0;if(!e)return;if(!(a[b+52>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+56>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function oj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+24>>2];i=+g[a+28>>2];j=+g[a+32>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+20>>2];if(f>h){g[a+20>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+20>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+20>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function pj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;h=c[d+4>>2]|0;if((h|0)<=0){c[b+4>>2]=h;return}c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)g=0;else{c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[g+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=g;c[b+8>>2]=h;e=0;f=g;do{c[f+(e<<2)>>2]=0;e=e+1|0;f=c[b+12>>2]|0}while((e|0)!=(h|0));c[b+4>>2]=h;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));return}function qj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+88>>2];i=+g[a+92>>2];j=+g[a+96>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+84>>2];if(f>h){g[a+84>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+84>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+84>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function rj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=i+ +g[a+32>>2];k=i+ +g[a+36>>2];i=i+ +g[a+40>>2];u=+C(+(+g[b>>2]));t=+C(+(+g[b+4>>2]));s=+C(+(+g[b+8>>2]));q=+C(+(+g[b+16>>2]));p=+C(+(+g[b+20>>2]));o=+C(+(+g[b+24>>2]));l=+C(+(+g[b+32>>2]));j=+C(+(+g[b+36>>2]));h=+C(+(+g[b+40>>2]));r=+g[b+48>>2];n=+g[b+52>>2];f=+g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function sj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+96|0;g=c[b+192>>2]|0;c[f+64>>2]=0;c[f+64+4>>2]=g;c[f+64+8>>2]=b;c[f+64+12>>2]=b+4;c[f+64+16>>2]=-1;c[f+64+20>>2]=-1;b=c[d+192>>2]|0;c[f+40>>2]=0;c[f+40+4>>2]=b;c[f+40+8>>2]=d;c[f+40+12>>2]=d+4;c[f+40+16>>2]=-1;c[f+40+20>>2]=-1;b=c[a+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,f+64|0,f+40|0,0,2)|0;if(!b){l=f;return}c[f+4>>2]=0;c[f+8>>2]=f+64;c[f+12>>2]=f+40;c[f>>2]=6324;c[f+36>>2]=e;c[f+32>>2]=c[e+12>>2];Zb[c[(c[b>>2]|0)+8>>2]&31](b,f+64|0,f+40|0,a+28|0,f);Ib[c[c[b>>2]>>2]&511](b);g=c[a+24>>2]|0;Ob[c[(c[g>>2]|0)+60>>2]&127](g,b);l=f;return}function tj(b){b=b|0;var d=0;c[b>>2]=8928;if(c[b+108>>2]|0){d=c[b+112>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+112>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+108>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+108>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+88>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+60>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}if(!(a[b+100>>0]|0))return;d=c[b+92>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+92>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function uj(b){b=b|0;var d=0,e=0,f=0,h=0.0;e=l;l=l+96|0;a[b+92>>0]=1;if((a[22496]|0)==0?Uz(22496)|0:0){c[6132]=1065353216;c[6133]=0;c[6134]=0;c[6135]=0;c[6136]=0;c[6137]=1065353216;c[6138]=0;c[6139]=0;c[6140]=0;c[6141]=0;c[6142]=1065353216;g[6143]=0.0;c[6144]=-1082130432;c[6145]=0;c[6146]=0;c[6147]=0;c[6148]=0;c[6149]=-1082130432;c[6150]=0;c[6151]=0;c[6152]=0;c[6153]=0;c[6154]=-1082130432;g[6155]=0.0}d=e;f=d+96|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(f|0));Vb[c[(c[b>>2]|0)+76>>2]&127](b,24528,e,6);h=+g[b+48>>2];g[b+76>>2]=+g[e>>2]+h;g[b+60>>2]=+g[e+48>>2]-h;g[b+80>>2]=+g[e+20>>2]+h;g[b+64>>2]=+g[e+68>>2]-h;g[b+84>>2]=+g[e+40>>2]+h;g[b+68>>2]=+g[e+88>>2]-h;l=e;return}function vj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;while(1){i=c[a+12>>2]|0;k=c[i+(((b+d|0)/2|0)<<3)>>2]|0;f=d;e=b;while(1){while(1){j=e+1|0;if((c[i+(e<<3)>>2]|0)<(k|0))e=j;else break}while(1){g=i+(f<<3)|0;h=f+-1|0;if((k|0)<(c[g>>2]|0))f=h;else break}if((e|0)<=(f|0)){l=i+(e<<3)|0;i=c[l>>2]|0;e=c[l+4>>2]|0;m=c[g+4>>2]|0;c[l>>2]=c[g>>2];c[l+4>>2]=m;f=(c[a+12>>2]|0)+(f<<3)|0;c[f>>2]=i;c[f+4>>2]=e;f=h;e=j}if((e|0)>(f|0))break;i=c[a+12>>2]|0}if((f|0)>(b|0))vj(a,b,f);if((e|0)<(d|0))b=e;else break}return}function wj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+72>>2]|0;if(!e)return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+72>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function xj(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;f=c[a+792>>2]|0;if((f|0)<=0)return;e=c[a+800>>2]|0;a=0;do{d=+g[e+(a*52|0)+40>>2];if(d>0.0?(h=c[e+(a*52|0)+24>>2]|0,i=c[e+(a*52|0)+28>>2]|0,j=+g[h+8>>2],k=+g[i+8>>2]-j,l=+g[h+12>>2],m=+g[i+12>>2]-l,n=+g[h+16>>2],o=+g[i+16>>2]-n,p=+g[e+(a*52|0)+44>>2],p+(k*k+m*m+o*o)>1.1920928955078125e-07):0){d=(p-(k*k+m*m+o*o))/(d*(p+(k*k+m*m+o*o)))*b;q=d*+g[h+88>>2];g[h+8>>2]=j-k*q;g[h+12>>2]=l-m*q;g[h+16>>2]=n-o*q;d=d*+g[i+88>>2];g[i+8>>2]=+g[i+8>>2]+k*d;g[i+12>>2]=m*d+ +g[i+12>>2];g[i+16>>2]=o*d+ +g[i+16>>2]}a=a+1|0}while((a|0)!=(f|0));return}function yj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;n=e+32+44|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);k=+g[e>>2];m=+g[e+16>>2];i=+g[e+4>>2];j=+g[e+16+4>>2];f=+g[e+8>>2];h=+g[e+16+8>>2];g[d>>2]=+D(+((k-m)*(k-m)+(i-j)*(i-j)+(f-h)*(f-h)))*.5;g[b>>2]=(m+k)*.5;g[b+4>>2]=(j+i)*.5;g[b+8>>2]=(h+f)*.5;g[b+12>>2]=0.0;l=e;return}function zj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=c[d+48>>2]|0;if((c[d+60>>2]|0)==2){Ag(b+44|0,h)|0;f=c[b+48>>2]|0;if(!f){f=b+48|0;g=1}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+48|0;g=1}}else{Ag(b+4|0,h)|0;f=c[b+8>>2]|0;if(!f){f=b+8|0;g=0}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+8|0;g=0}}c[f>>2]=h;f=b+4+(g*40|0)+12|0;c[f>>2]=(c[f>>2]|0)+-1;f=c[d+52>>2]|0;c[((f|0)==0?b+84+(c[d+60>>2]<<2)|0:f+56|0)>>2]=c[d+56>>2];f=c[d+56>>2]|0;if(f|0)c[f+52>>2]=c[d+52>>2];h=c[b+96>>2]|0;Sb[c[(c[h>>2]|0)+16>>2]&127](h,d,e);c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);a[b+154>>0]=1;return}function Aj(a,d,f,h){a=a|0;d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;i=c[a+108>>2]|0;if(i|0){Vb[c[(c[i>>2]|0)+28>>2]&127](i,d,f,h);return}i=b[a+56>>1]|0;if(!(i<<16>>16))return;m=1;k=1;do{j=c[a+68>>2]|0;if(b[j+(k<<2)>>1]&1){l=c[a+60>>2]|0;k=e[j+(k<<2)+2>>1]|0;if(!(+g[d>>2]>+g[l+(k<<6)+32>>2])?!(+g[f>>2]<+g[l+(k<<6)+16>>2]):0)j=1;else j=0;if(!(!(+g[d+8>>2]>+g[l+(k<<6)+40>>2])?!(+g[f+8>>2]<+g[l+(k<<6)+24>>2]):0))j=0;if(!(+g[d+4>>2]>+g[l+(k<<6)+36>>2])?!(+g[f+4>>2]<+g[l+(k<<6)+20>>2]|j^1):0){zb[c[(c[h>>2]|0)+8>>2]&31](h,l+(k<<6)|0)|0;i=b[a+56>>1]|0}}m=m+1<<16>>16;k=m&65535}while(k>>>0<((i&65535)<<1|1)>>>0);return}function Bj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0;h=+g[b>>2];i=+g[b+16>>2];j=h>2];if((j+g[a+24>>2])return;k=h>i?b:b+16|0;if(+g[(+g[k>>2]>f?k:b+32|0)>>2]<+g[a+8>>2])return;f=+g[b+8>>2];h=+g[b+24>>2];j=f>2];if((j+g[a+32>>2])return;k=f>h?b+8|0:b+24|0;if(+g[(+g[k>>2]>i?k:b+40|0)>>2]<+g[a+16>>2])return;f=+g[b+4>>2];h=+g[b+20>>2];j=f>2];if((j+g[a+28>>2])return;k=f>h?b+4|0:b+20|0;if(+g[(+g[k>>2]>i?k:b+36|0)>>2]<+g[a+12>>2])return;k=c[a+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,b,d,e);return}function Cj(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0;if(!(a[b+738>>0]|0)){c[d>>2]=5;c[d+4>>2]=1;e=+bj(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+728>>2]=e;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(!(h>=0.0))i=13;else{e=+mh(e-+g[b+688>>2],6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(e<-h){a[b+716>>0]=1;f=1.0;e=-(e+h)}else{if(!(e>h)){i=13;break}a[b+716>>0]=1;f=-1.0;e=h-e}g[b+708>>2]=e;g[b+712>>2]=f}while(0);if((i|0)==13?(a[b+737>>0]|0)==0:0)return;c[d>>2]=6;b=d+4|0}else{c[d>>2]=0;b=d+4|0}c[b>>2]=0;return}function Dj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0;f=l;l=l+16|0;c[a+4>>2]=c[b+24>>2];e=c[b>>2]|0;c[a+8>>2]=e;if(d){c[a+56>>2]=c[b+8>>2];c[a+56+4>>2]=c[b+8+4>>2];c[a+56+8>>2]=c[b+8+8>>2];c[a+56+12>>2]=c[b+8+12>>2];i=a+72|0;d=a+24|0;e=a+40|0;h=+g[b+24>>2];hq(i,d,e,h);h=+g[b+24>>2];l=f;return +h}else{d=gJ(OI(e)|0)|0;fm(f,d,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+56>>2]=c[f>>2];c[a+56+4>>2]=c[f+4>>2];c[a+56+8>>2]=c[f+8>>2];c[a+56+12>>2]=c[f+12>>2];d=a+72|0;e=a+24|0;i=a+40|0;h=+g[b+24>>2];hq(d,e,i,h);h=+g[b+24>>2];l=f;return +h}return 0.0}function Ej(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+16|0;g[b+32>>2]=f;c[b+8>>2]=c[d>>2];c[b+8+4>>2]=c[d+4>>2];c[b+8+8>>2]=c[d+8>>2];c[b+8+12>>2]=c[d+12>>2];i=+g[b+28>>2];k=+g[e+4>>2]-i*+g[d+4>>2];j=+g[e+8>>2]-i*+g[d+8>>2];g[h>>2]=+g[e>>2]-+g[d>>2]*i;g[h+4>>2]=k;g[h+8>>2]=j;g[h+12>>2]=0.0;f=+g[b+24>>2]+i+f;g[b+32>>2]=f;if(!(f<0.0)){b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}a[b+36>>0]=1;b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}function Fj(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0;if(!(c[j+52>>2]|0))return;if((c[j+20>>2]|0)<=0)return;e=0;while(1){d=c[a+28>>2]|0;if((d|0)>0){l=0.0;b=0;do{k=c[(c[a+116>>2]|0)+(b<<2)>>2]|0;i=c[a+36>>2]|0;h=c[a+16>>2]|0;m=+qb[c[a+220>>2]&31](h+((c[i+(k*152|0)+144>>2]|0)*244|0)|0,h+((c[i+(k*152|0)+148>>2]|0)*244|0)|0,i+(k*152|0)|0);l=l+m*m;b=b+1|0}while((b|0)!=(d|0))}else l=0.0;if(l<=+g[j+92>>2]){b=8;break}k=c[j+20>>2]|0;i=e;e=e+1|0;if(!((i|0)<(k+-1|0)&(e|0)<(k|0))){b=8;break}}if((b|0)==8)return}function Gj(b,d){b=b|0;d=d|0;c[b+204>>2]=c[d+48>>2];c[b+208>>2]=c[d+52>>2];c[b+212>>2]=c[d+56>>2];c[b+216>>2]=c[d+60>>2];c[b+220>>2]=c[d+64>>2];c[b+224>>2]=c[d+68>>2];c[b+156>>2]=c[d>>2];c[b+156+4>>2]=c[d+4>>2];c[b+156+8>>2]=c[d+8>>2];c[b+156+12>>2]=c[d+12>>2];c[b+172>>2]=c[d+16>>2];c[b+172+4>>2]=c[d+16+4>>2];c[b+172+8>>2]=c[d+16+8>>2];c[b+172+12>>2]=c[d+16+12>>2];c[b+188>>2]=c[d+32>>2];c[b+188+4>>2]=c[d+32+4>>2];c[b+188+8>>2]=c[d+32+8>>2];c[b+188+12>>2]=c[d+32+12>>2];c[b+228>>2]=c[d+72>>2];g[b+232>>2]=0.0;g[b+252>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+256>>2]=0.0;g[b+244>>2]=.10000000149011612;a[b+260>>0]=a[d+80>>0]&1;c[b+248>>2]=c[d+76>>2];return}function Hj(a,b){a=a|0;b=+b;var d=0,e=0;d=c[a+84>>2]|0;if(d|0)Jb[d&31](a,b);Jb[c[(c[a>>2]|0)+140>>2]&31](a,b);g[a+28>>2]=b;c[a+32>>2]=0;c[a+48>>2]=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Jb[c[(c[a>>2]|0)+164>>2]&31](a,b);Ib[c[(c[a>>2]|0)+44>>2]&511](a);Ib[c[(c[a>>2]|0)+148>>2]&511](a);g[a+104>>2]=b;Ob[c[(c[a>>2]|0)+152>>2]&127](a,a+92|0);Jb[c[(c[a>>2]|0)+144>>2]&31](a,b);if((c[a+296>>2]|0)>0){d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0))}Jb[c[(c[a>>2]|0)+156>>2]&31](a,b);d=c[a+80>>2]|0;if(!d)return;Jb[d&31](a,b);return}function Ij(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0;f=l;l=l+16|0;c[b+4>>2]=d;c[b>>2]=4652;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=e;if((a[22480]|0)==0?Uz(22480)|0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;ef(23152,0.0,0,0,f)}c[5839]=c[5839]|1;g[5889]=0.0;h=+g[5899]*0.0;i=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=h;g[5896]=i;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;i=+g[5891]*0.0;h=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=i;g[5945]=h;g[5946]=0.0;c[b+32>>2]=23152;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;l=f;return}function Jj(a){a=a|0;var b=0;c[a>>2]=3244;b=c[a+88>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+88>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+92>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+92>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+96>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+96>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+100>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+100>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+104>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+104>>2]|0;if(!b){nf(a);return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);nf(a);return}function Kj(b,d){b=b|0;d=d|0;var e=0,f=0;a:do if((d|0)!=0&(b&3|0)!=0){e=d;while(1){if(!(a[b>>0]|0))break a;b=b+1|0;d=e+-1|0;if((d|0)!=0&(b&3|0)!=0)e=d;else{e=d;d=(d|0)!=0;f=4;break}}}else{e=d;d=(d|0)!=0;f=4}while(0);b:do if((f|0)==4)if(d){if(a[b>>0]|0){c:do if(e>>>0>3)while(1){d=c[b>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){f=10;break c}}else f=10;while(0);if((f|0)==10)if(!e){e=0;break}while(1){if(!(a[b>>0]|0))break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}else e=0;while(0);return (e|0?b:0)|0}function Lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0;m=c[b+56>>2]|0;l=c[m+32>>2]|0;b=c[l>>2]|0;m=c[m+24>>2]|0;if((m|0)<=1){m=b;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}j=+g[d>>2];k=+g[d+4>>2];i=+g[d+8>>2];d=0;h=1;e=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];while(1){b=c[l+(h<<2)>>2]|0;f=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];b=f>e;d=b?h:d;h=h+1|0;if((h|0)==(m|0))break;else e=b?f:e}m=c[l+(d<<2)>>2]|0;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}function Mj(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;n=+g[a+4>>2];h=+g[a+456>>2];m=+g[a+8>>2];e=+g[a+460>>2];l=+g[a+12>>2];c=+g[a+464>>2];k=+g[a+20>>2];j=+g[a+24>>2];i=+g[a+28>>2];f=+g[a+36>>2];d=+g[a+40>>2];b=+g[a+44>>2];g[a+324>>2]=n*h*n+m*e*m+l*c*l;g[a+328>>2]=n*h*k+m*e*j+l*c*i;g[a+332>>2]=n*h*f+m*e*d+l*c*b;g[a+336>>2]=0.0;g[a+340>>2]=h*k*n+e*j*m+c*i*l;g[a+344>>2]=h*k*k+e*j*j+c*i*i;g[a+348>>2]=h*k*f+e*j*d+c*i*b;g[a+352>>2]=0.0;g[a+356>>2]=h*f*n+e*d*m+c*b*l;g[a+360>>2]=h*f*k+e*d*j+c*b*i;g[a+364>>2]=h*f*f+e*d*d+c*b*b;g[a+368>>2]=0.0;return}function Nj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0;h=l;l=l+16|0;if((e|0)<=0){l=h;return}f=0;do{p=+g[b+(f<<4)>>2];o=+g[b+(f<<4)+4>>2];n=+g[b+(f<<4)+8>>2];m=p*+g[a+60>>2]+o*+g[a+64>>2]+n*+g[a+68>>2];k=p*+g[a+76>>2]+o*+g[a+80>>2]+n*+g[a+84>>2];n=p*+g[a+92>>2]+o*+g[a+96>>2]+n*+g[a+100>>2];g[h>>2]=m;g[h+4>>2]=k;g[h+8>>2]=n;g[h+12>>2]=0.0;j=a+60+((+g[h+((m>2]>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=f+1|0}while((f|0)!=(e|0));l=h;return}function Oj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=5944;e=c[b+8>>2]|0;d=c[b+16>>2]|0;if((e|0)>0){h=0;do{f=(c[d+(h<<2)>>2]|0)+188|0;g=c[f>>2]|0;if(g){e=c[b+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,g,c[b+24>>2]|0);e=c[b+68>>2]|0;Sb[c[(c[e>>2]|0)+12>>2]&127](e,g,c[b+24>>2]|0);c[f>>2]=0;e=c[b+8>>2]|0;d=c[b+16>>2]|0}h=h+1|0}while((h|0)<(e|0))}if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Pj(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0;c[a+264>>2]=c[b>>2];c[a+264+4>>2]=c[b+4>>2];c[a+264+8>>2]=c[b+8>>2];c[a+264+12>>2]=c[b+12>>2];d=c[a+248>>2]|0;if((d|0)<=0)return;h=0;do{f=c[(c[a+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if(!(c[f+564>>2]&1)){e=+g[f+404>>2];if(e!=0.0){j=1.0/e*+g[b+4>>2];i=1.0/e*+g[b+8>>2];g[f+424>>2]=1.0/e*+g[b>>2];g[f+428>>2]=j;g[f+432>>2]=i;g[f+436>>2]=0.0}c[f+440>>2]=c[b>>2];c[f+440+4>>2]=c[b+4>>2];c[f+440+8>>2]=c[b+8>>2];c[f+440+12>>2]=c[b+12>>2];d=c[a+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));return}function Qj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0.0,i=0.0,k=0.0;e=c[a+204>>2]|0;if(b==0.0){c[a+204>>2]=e|1;h=0.0}else{c[a+204>>2]=e&-2;h=1.0/b}g[a+404>>2]=h;k=+g[a+444>>2]*b;i=+g[a+448>>2]*b;g[a+424>>2]=+g[a+440>>2]*b;g[a+428>>2]=k;g[a+432>>2]=i;g[a+436>>2]=0.0;b=+g[d>>2];f=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+4>>2];e=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+8>>2];d=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;c[a+456>>2]=f;c[a+460>>2]=e;c[a+464>>2]=d;g[a+468>>2]=0.0;i=h*+g[a+412>>2];k=h*+g[a+416>>2];g[a+620>>2]=+g[a+408>>2]*h;g[a+624>>2]=i;g[a+628>>2]=k;g[a+632>>2]=0.0;return}function Rj(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0;f=l;l=l+256|0;e=c[b+212>>2]|0;if((e|0)>-1){a=e;l=f;return a|0}h=(c[b+252>>2]&2|0)==0;e=h?0:b;do if(!h){if(!(+g[e+404>>2]!=0.0)?(c[e+204>>2]&2|0)==0:0)break;h=c[a+8>>2]|0;Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,b,d);c[b+212>>2]=h;l=f;return h|0}while(0);e=c[a+188>>2]|0;if((e|0)>=0){h=e;l=f;return h|0}c[a+188>>2]=c[a+8>>2];Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,0,d);h=c[a+188>>2]|0;l=f;return h|0}function Sj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];i=+D(+(e*e+f*f+i*i));h=c[b+68>>2]|0;if(+g[d+(l<<2)>>2]>i*+g[b+56>>2]){g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;k=0.0;l=c[b+76>>2]|0;l=a+(l<<2)|0;g[l>>2]=k;return}i=+g[d+(h<<2)>>2];j=c[b+76>>2]|0;e=+g[d+(j<<2)>>2];f=+D(+(i*i+e*e));if(f>1.1920928955078125e-07){f=+g[b+60>>2]/f;g[a+(h<<2)>>2]=i*f;g[a+(l<<2)>>2]=-k;k=e*f;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;k=0.0;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}}function Tj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+296>>2]|0;if((e|0)==(c[b+300>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+296>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+304>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+304>>2]|0;if(f){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+296>>2]|0}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=g;c[b+300>>2]=h}c[(c[b+304>>2]|0)+(e<<2)>>2]=d;c[b+296>>2]=e+1;return}function Uj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;n=c[b+100>>2]|0;if((n|0)<=0){c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;n=a+12|0;g[n>>2]=0.0;return}o=+g[b+16>>2];p=+g[d>>2]*o;k=+g[b+20>>2];l=+g[d+4>>2]*k;m=+g[b+24>>2];j=+g[d+8>>2]*m;f=c[b+108>>2]|0;d=-1;b=0;e=-3402823466385288598117041.0e14;while(1){h=p*+g[f+(b<<4)>>2]+l*+g[f+(b<<4)+4>>2]+j*+g[f+(b<<4)+8>>2];i=h>e;d=i?b:d;b=b+1|0;if((b|0)==(n|0))break;else e=i?h:e}l=+g[f+(d<<4)+4>>2]*k;p=+g[f+(d<<4)+8>>2]*m;g[a>>2]=+g[f+(d<<4)>>2]*o;g[a+4>>2]=l;g[a+8>>2]=p;n=a+12|0;g[n>>2]=0.0;return}function Vj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(+g[e>>2]-+g[e+16>>2])*.5*2.0;f=(+g[e+4>>2]-+g[e+16+4>>2])*.5*2.0;i=(+g[e+8>>2]-+g[e+16+8>>2])*.5*2.0;g[d>>2]=b/12.0*(f*f+i*i);g[d+4>>2]=b/12.0*(h*h+i*i);g[d+8>>2]=b/12.0*(h*h+f*f);l=e;return}function Wj(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=gt()|0;Ij(e,3,b);c[e>>2]=4828;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+20>>2]+j*+g[b+24>>2]+i*+g[b+28>>2]+ +g[b+56>>2];f=k*+g[b+36>>2]+j*+g[b+40>>2]+i*+g[b+44>>2]+ +g[b+60>>2];g[e+316>>2]=k*+g[b+4>>2]+j*+g[b+8>>2]+i*+g[b+12>>2]+ +g[b+52>>2];g[e+320>>2]=h;g[e+324>>2]=f;g[e+328>>2]=0.0;c[e+332>>2]=0;a[e+344>>0]=0;g[e+348>>2]=.30000001192092896;g[e+352>>2]=1.0;g[e+356>>2]=0.0;return e|0}function Xj(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0,f=0;if(b>=c)return +a;if(a3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(c-a,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=e<+C(+d);a=f?a:a+6.2831854820251465;return +a}if(!(a>c))return +a;d=+mh(a-c,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(a-b,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=+C(+d)>2]|0)>(c[d+12>>2]|0);f=c[(e?d:b)+12>>2]|0;e=c[(e?b:d)+12>>2]|0;b=(((e<<16|f)+~((e<<16|f)<<15)|0)>>>10^(e<<16|f)+~((e<<16|f)<<15))*9|0;b=(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11))&(c[a+12>>2]|0)+-1;if((b|0)>=(c[a+32>>2]|0)){g=0;return g|0}b=c[(c[a+40>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){g=0;return g|0}d=c[a+16>>2]|0;while(1){if((c[(c[d+(b<<4)>>2]|0)+12>>2]|0)==(f|0)?(c[(c[d+(b<<4)+4>>2]|0)+12>>2]|0)==(e|0):0)break;b=c[(c[a+60>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){b=0;g=8;break}}if((g|0)==8)return b|0;g=d+(b<<4)|0;return g|0}function Zj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0)){l=e;return}i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function _j(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0.0,h=0.0;f=+g[a+692>>2];do if(f>0.0){h=+g[a+688>>2];e=+mh(b-h,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(!(e<-f)&e<=f))if(e>0.0){b=+mh(f+h,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}else{b=+mh(h-f,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}}while(0);g[a+680>>2]=(b-+bj(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0))/d;return}function $j(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:{if((c|0)<1){d=+g[a+232>>2];break a}if((c|0)<3){d=+g[a+264>>2];break a}if((c|0)==3){d=+g[a+248>>2];break a}if((c|0)<6)d=+g[a+280>>2];else d=3402823466385288598117041.0e14;break}case 3:{if((c|0)<1){d=+g[a+212>>2];break a}if((c|0)==3)d=+g[a+228>>2];else d=3402823466385288598117041.0e14;break}case 4:{if((c|0)<1){d=+g[a+244>>2];break a}if((c|0)<3){d=+g[a+276>>2];break a}if((c|0)==3){d=+g[a+260>>2];break a}if((c|0)<6)d=+g[a+292>>2];else d=3402823466385288598117041.0e14;break}default:d=3402823466385288598117041.0e14}while(0);return +d}function ak(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0)e=+g[b+36>>2];else e=+D(+(e*e+f*f+h*h));g[b+32>>2]=e;g[b+20>>2]=e;a[b+249>>0]=1;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0){i=+g[b+256>>2];f=+g[b+260>>2];e=+g[b+264>>2];d=b+268|0}else{j=1.0/+D(+(e*e+f*f+h*h));i=e*j;f=f*j;e=h*j;d=d+12|0}d=c[d>>2]|0;g[b+272>>2]=i;g[b+276>>2]=f;g[b+280>>2]=e;c[b+284>>2]=d;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function bk(b){b=b|0;var d=0;c[b>>2]=4080;if(a[b+476>>0]|0?(d=c[b+472>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+472>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+440>>2]|0;if(d|0){if(a[b+444>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+440>>2]=0}a[b+444>>0]=1;c[b+440>>2]=0;c[b+432>>2]=0;c[b+436>>2]=0;d=c[b+356>>2]|0;if(!d){a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+356>>2]=0;a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}function ck(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;d=l;l=l+64|0;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;i=+g[b>>2];f=+g[b+4>>2];m=+g[b+8>>2];j=+g[b+12>>2];h=i*(2.0/(i*i+f*f+m*m+j*j));e=f*(2.0/(i*i+f*f+m*m+j*j));k=m*(2.0/(i*i+f*f+m*m+j*j));g[d>>2]=1.0-(f*e+m*k);g[d+4>>2]=i*e-j*k;g[d+8>>2]=i*k+j*e;g[d+12>>2]=0.0;g[d+16>>2]=i*e+j*k;g[d+20>>2]=1.0-(i*h+m*k);g[d+24>>2]=f*k-j*h;g[d+28>>2]=0.0;g[d+32>>2]=i*k-j*e;g[d+36>>2]=f*k+j*h;g[d+40>>2]=1.0-(i*h+f*e);g[d+44>>2]=0.0;Ld(a,d);l=d;return}function dk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0,n=0,o=0;f=l;l=l+48|0;Sb[c[(c[a>>2]|0)+124>>2]&127](a,f+32|0,e);o=c[f+32>>2]|0;n=c[f+32+4>>2]|0;m=c[f+32+8>>2]|0;c[b>>2]=o;c[b+4>>2]=n;c[b+8>>2]=m;g[b+12>>2]=0.0;e=c[(c[a>>2]|0)+64>>2]|0;k=-(c[j>>2]=o,+g[j>>2]);i=-(c[j>>2]=n,+g[j>>2]);h=-(c[j>>2]=m,+g[j>>2]);g[f>>2]=k;g[f+4>>2]=i;g[f+8>>2]=h;g[f+12>>2]=0.0;Sb[e&127](f+16|0,a,f);c[d>>2]=c[f+16>>2];c[d+4>>2]=c[f+16+4>>2];c[d+8>>2]=c[f+16+8>>2];c[d+12>>2]=c[f+16+12>>2];l=f;return}function ek(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function fk(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;h=l;l=l+48|0;c[h+32>>2]=e;c[h+32+4>>2]=f;n=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];k=+g[a+56>>2]*n+ +g[a+60>>2]*m+ +g[a+64>>2]*i;j=n*+g[a+72>>2]+m*+g[a+76>>2]+i*+g[a+80>>2];i=n*+g[a+88>>2]+m*+g[a+92>>2]+i*+g[a+96>>2];c[h>>2]=c[a+48>>2];c[h+4>>2]=h+32;g[h+8>>2]=k;g[h+12>>2]=j;g[h+16>>2]=i;g[h+20>>2]=0.0;g[h+24>>2]=d;f=c[a+44>>2]|0;d=+qb[c[(c[f>>2]|0)+12>>2]&31](f,h,1);l=h;return +d}function gk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;c[a+4>>2]=c[b+40>>2];e=c[b>>2]|0;c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=gJ(OI(e)|0)|0;fm(f,e,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+48>>2]=c[f>>2];c[a+48+4>>2]=c[f+4>>2];c[a+48+8>>2]=c[f+8>>2];c[a+48+12>>2]=c[f+12>>2]}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];l=f;return +(+g[b+40>>2])}function hk(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if(e>>>0<3)switch(b|0){case 2:{g[a+756+(e<<2)>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>>0>=3)return;switch(b|0){case 2:{g[a+868+(e+-3<<6)+32>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>2]=3;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4828;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[f>>2];c[h+316+4>>2]=c[f+4>>2];c[h+316+8>>2]=c[f+8>>2];c[h+316+12>>2]=c[f+12>>2];c[h+332>>2]=0;a[h+344>>0]=0;g[h+348>>2]=.30000001192092896;g[h+352>>2]=1.0;g[h+356>>2]=0.0;return h|0}function jk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[b+252>>2]|0;if((b|0)==0|(d|0)!=8)if((b|0)==0|(d&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1}ki(a,b);return}function kk(b){b=b|0;var d=0;c[b>>2]=4580;d=c[b+80>>2]|0;if(d|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+72>>2]=0;c[b+76>>2]=0;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(!d){a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}function lk(b){b=b|0;var d=0;c[b>>2]=9068;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function mk(b){b=b|0;var d=0;c[b>>2]=5768;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}function nk(b){b=b|0;var d=0;c[b>>2]=9668;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ok(b){b=b|0;var d=0,e=0,f=0;e=Ds(10448)|0;c[e>>2]=5444;c[e+4>>2]=2;a[e+24>>0]=1;c[e+20>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+28>>2]=5916;g[e+60>>2]=0.0;c[e+10444>>2]=b;c[e+64>>2]=79;c[e+68>>2]=xb[c[(c[b>>2]|0)+12>>2]&127](b)|0;c[e+72>>2]=xb[c[(c[b>>2]|0)+8>>2]&127](b)|0;b=0;do{d=0;do{f=c[e+10444>>2]|0;c[e+76+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+16>>2]&63](f,b,d)|0;f=c[e+10444>>2]|0;c[e+5260+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+20>>2]&63](f,b,d)|0;d=d+1|0}while((d|0)<36);b=b+1|0}while((b|0)<36);return e|0}function pk(){var a=0,b=0,d=0,e=0;e=l;l=l+48|0;a=ts()|0;if(a|0?(d=c[a>>2]|0,d|0):0){b=c[d+48>>2]|0;a=c[d+48+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){c[e+24>>2]=21877;Ww(21827,e+24|0)}if((b|0)==1126902529&(a|0)==1129074247)a=c[d+44>>2]|0;else a=d+80|0;c[e+36>>2]=a;d=c[d>>2]|0;a=c[d+4>>2]|0;if(ql(2784,d,e+36|0)|0){d=c[e+36>>2]|0;d=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;c[e>>2]=21877;c[e+4>>2]=a;c[e+8>>2]=d;Ww(21741,e)}else{c[e+16>>2]=21877;c[e+16+4>>2]=a;Ww(21786,e+16|0)}}Ww(21865,e+32|0)}function qk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=1;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[f+8>>2];c[b+20>>2]=c[e+8>>2];gj(b+72|0);return b|0}function rk(b){b=b|0;var d=0;c[b>>2]=5400;d=c[b+344>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+344>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function sk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=0;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[e+8>>2];c[b+20>>2]=c[f+8>>2];gj(b+72|0);return b|0}function tk(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=h|0;var i=0;i=l;l=l+64|0;c[i+48>>2]=f;c[i+48+4>>2]=h;f=c[a+212>>2]|0;if(!(+g[f+4>>2]>=e)){l=i;return +e}c[i>>2]=c[a+216>>2];c[i+4>>2]=i+48;c[i+8>>2]=c[b>>2];c[i+8+4>>2]=c[b+4>>2];c[i+8+8>>2]=c[b+8>>2];c[i+8+12>>2]=c[b+12>>2];c[i+24>>2]=c[d>>2];c[i+24+4>>2]=c[d+4>>2];c[i+24+8>>2]=c[d+8>>2];c[i+24+12>>2]=c[d+12>>2];g[i+40>>2]=e;e=+qb[c[(c[f>>2]|0)+12>>2]&31](f,i,1);l=i;return +e}function uk(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Ts()|0;He(i,b,d,e,f,h);c[i>>2]=4764;c[i+4>>2]=9;a[i+1309>>0]=0;g[i+1316>>2]=0.0;g[i+1340>>2]=0.0;g[i+1364>>2]=1.0;a[i+1310>>0]=0;g[i+1320>>2]=0.0;g[i+1344>>2]=0.0;g[i+1368>>2]=1.0;a[i+1311>>0]=0;g[i+1324>>2]=0.0;g[i+1348>>2]=0.0;g[i+1372>>2]=1.0;a[i+1312>>0]=0;g[i+1328>>2]=0.0;g[i+1352>>2]=0.0;g[i+1376>>2]=1.0;a[i+1313>>0]=0;g[i+1332>>2]=0.0;g[i+1356>>2]=0.0;g[i+1380>>2]=1.0;a[i+1314>>0]=0;g[i+1336>>2]=0.0;g[i+1360>>2]=0.0;g[i+1384>>2]=1.0;return i|0}function vk(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;c=l;l=l+48|0;d=2.0/+EF(b);f=+g[(gJ(b)|0)>>2];e=+g[(OI(b)|0)>>2];i=+g[(NI(b)|0)>>2];h=+g[(MI(b)|0)>>2];g[c+32>>2]=1.0-(e*e*d+i*i*d);g[c+28>>2]=f*e*d-h*i*d;g[c+24>>2]=f*i*d+h*e*d;g[c+20>>2]=f*e*d+h*i*d;g[c+16>>2]=1.0-(f*f*d+i*i*d);g[c+12>>2]=e*i*d-h*f*d;g[c+8>>2]=f*i*d-h*e*d;g[c+4>>2]=e*i*d+h*f*d;g[c>>2]=1.0-(f*f*d+e*e*d);Ip(a,c+32|0,c+28|0,c+24|0,c+20|0,c+16|0,c+12|0,c+8|0,c+4|0,c);l=c;return}function wk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[e+16>>2]|0;if(!f){if(!(bp(e)|0)){g=c[e+16>>2]|0;h=5}}else{g=f;h=5}a:do if((h|0)==5){f=c[e+20>>2]|0;if((g-f|0)>>>0>>0){Bb[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){h=d;while(1){if(!h){g=b;break b}g=h+-1|0;if((a[b+g>>0]|0)==10)break;else h=g}if((Bb[c[e+36>>2]&63](e,b,h)|0)>>>0>>0)break a;g=b+h|0;d=d-h|0;f=c[e+20>>2]|0}else g=b;while(0);gi(f|0,g|0,d|0)|0;c[e+20>>2]=(c[e+20>>2]|0)+d}while(0);return}function xk(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function yk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function zk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=l;l=l+48|0;e=$G(b,0)|0;g[d+32>>2]=+Dp(c,e);g[d+28>>2]=+ep(c,e);g[d+24>>2]=+dp(c,e);e=$G(b,1)|0;g[d+20>>2]=+Dp(c,e);g[d+16>>2]=+ep(c,e);g[d+12>>2]=+dp(c,e);b=$G(b,2)|0;g[d+8>>2]=+Dp(c,b);g[d+4>>2]=+ep(c,b);g[d>>2]=+dp(c,b);Sq(a,d+32|0,d+28|0,d+24|0,d+20|0,d+16|0,d+12|0,d+8|0,d+4|0,d);l=d;return}function Ak(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+F(+c);h=+G(+c);c=+g[b+444>>2];if(+C(+i)>1.1920928955078125e-07){j=+g[b+448>>2];e=h*h;f=i*i;c=+D(+((h*h/(i*i)+1.0)/(1.0/(j*j)+h*h/(i*i)/(c*c))))}else{e=h*h;f=i*i}c=c*.5;j=+G(+c)/+D(+(f+0.0+e));c=+F(+c);k=c*d+i*j*0.0-h*j*-0.0;f=c*0.0-h*j*d-j*0.0*0.0;e=c*0.0+j*0.0*0.0-i*j*d;d=-(j*0.0*d)-i*j*0.0-h*j*-0.0;g[a>>2]=h*j*f+(c*k+d*-(j*0.0))-e*-(i*j);g[a+4>>2]=e*-(j*0.0)+(c*f+d*-(i*j))-h*j*k;g[a+8>>2]=k*-(i*j)+(h*j*d+c*e)-f*-(j*0.0);g[a+12>>2]=0.0;return}function Bk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+248>>0]=0;a[b+249>>0]=0;g[b+252>>2]=0.0;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;b=c[(c[b+8>>2]|0)+344>>2]|0;if((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)<=0)return;do{f=c[b>>2]|0;h=c[f+12>>2]|0;f=c[c[(xb[c[f+28>>2]&127](b)|0)+12>>2]>>2]|0;e=c[(c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+12>>2]|0)+4>>2]|0;Cb[h&31](b,f,e,c[d+24>>2]|0)|0}while((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)>0);return}function Ck(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[6131]=(c[6131]|0)+-1;Ob[c[(c[a>>2]|0)+20>>2]&127](a,b);e=c[b+800>>2]|0;d=(c[a+12>>2]|0)+-1|0;g=c[a+20>>2]|0;f=c[g+(e<<2)>>2]|0;c[g+(e<<2)>>2]=c[g+(d<<2)>>2];c[(c[a+20>>2]|0)+(d<<2)>>2]=f;c[(c[(c[a+20>>2]|0)+(e<<2)>>2]|0)+800>>2]=e;c[a+12>>2]=d;a=c[a+72>>2]|0;if(!b)return;g=c[a+16>>2]|0;if(g>>>0<=b>>>0?(g+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Dk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=c[b+8>>2]|0;if((k|0)<=0)return;j=c[b+16>>2]|0;i=0;b=0;do{h=c[j+(i<<2)>>2]|0;if(!(c[h+204>>2]&3)){g=c[a+16>>2]|0;e=g+(b<<3)|0;d=c[e>>2]|0;if((d|0)==(b|0))d=b;else{f=d;do{d=g+(f<<3)|0;c[e>>2]=c[d>>2];d=c[d>>2]|0;e=g+(d<<3)|0;f=c[e>>2]|0}while((d|0)!=(f|0))}c[h+208>>2]=d;c[g+(b<<3)+4>>2]=i;c[h+212>>2]=-1;b=b+1|0}else{c[h+208>>2]=-1;c[h+212>>2]=-2}i=i+1|0}while((i|0)!=(k|0));return}function Ek(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0;while(1){g=c[a+12>>2]|0;if(!(((e[f>>1]|0)>=(e[a>>1]|0)?(e[d>>1]|0)<=(e[a+6>>1]|0):0)&(e[d+4>>1]|0)<=(e[a+10>>1]|0)&(e[f+4>>1]|0)>=(e[a+4>>1]|0)&(e[d+2>>1]|0)<=(e[a+8>>1]|0)&(e[f+2>>1]|0)>=(e[a+2>>1]|0))){h=6;break}if((g|0)>-1)break;i=a+16|0;Ek(i,b,d,f);g=c[a+28>>2]|0;a=i+(((g|0)>-1?1:0-g|0)<<4)|0}if((h|0)==6)return;Sb[c[(c[b>>2]|0)+8>>2]&127](b,g>>>21,g&2097151);return}function Fk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=Ts()|0;Yd(f,b,d,e);c[f>>2]=4764;c[f+4>>2]=9;a[f+1309>>0]=0;g[f+1316>>2]=0.0;g[f+1340>>2]=0.0;g[f+1364>>2]=1.0;a[f+1310>>0]=0;g[f+1320>>2]=0.0;g[f+1344>>2]=0.0;g[f+1368>>2]=1.0;a[f+1311>>0]=0;g[f+1324>>2]=0.0;g[f+1348>>2]=0.0;g[f+1372>>2]=1.0;a[f+1312>>0]=0;g[f+1328>>2]=0.0;g[f+1352>>2]=0.0;g[f+1376>>2]=1.0;a[f+1313>>0]=0;g[f+1332>>2]=0.0;g[f+1356>>2]=0.0;g[f+1380>>2]=1.0;a[f+1314>>0]=0;g[f+1336>>2]=0.0;g[f+1360>>2]=0.0;g[f+1384>>2]=1.0;return f|0}function Gk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;h=+g[a+60>>2];k=+g[a+76>>2]-h;j=+g[a+64>>2];i=+g[a+80>>2]-j;l=+g[a+68>>2];m=+g[a+84>>2]-l;h=+g[a+92>>2]-h;j=+g[a+96>>2]-j;l=+g[a+100>>2]-l;g[d+12>>2]=0.0;f=1.0/+D(+((k*j-i*h)*(k*j-i*h)+((i*l-m*j)*(i*l-m*j)+(m*h-k*l)*(m*h-k*l))));g[d>>2]=(i*l-m*j)*f;g[d+4>>2]=(m*h-k*l)*f;g[d+8>>2]=(k*j-i*h)*f;c[e>>2]=c[a+60>>2];c[e+4>>2]=c[a+60+4>>2];c[e+8>>2]=c[a+60+8>>2];c[e+12>>2]=c[a+60+12>>2];return}function Hk(b){b=b|0;var d=0,e=0;c[b>>2]=6400;if(a[b+52>>0]|0?(d=c[b+56>>2]|0,d|0):0){e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d)}d=c[b+44>>2]|0;if(d|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+36>>2]=0;c[b+40>>2]=0;d=c[b+24>>2]|0;if(!d){a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+24>>2]=0;a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}function Ik(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+224|0;e=g+80|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[g+120>>2]=c[d>>2];if((Xc(0,b,g+120|0,g,g+80|0)|0)>=0){e=c[2444]|0;if((a[9850]|0)<1)c[2444]=e&-33;if(!(c[2456]|0)){d=c[2455]|0;c[2455]=g+136;c[2451]=g+136;c[2449]=g+136;c[2456]=80;c[2448]=g+136+80;Xc(9776,b,g+120|0,g,g+80|0)|0;if(d|0){Bb[c[9812>>2]&63](9776,0,0)|0;c[2455]=d;c[2456]=0;c[2448]=0;c[2451]=0;c[2449]=0}}else Xc(9776,b,g+120|0,g,g+80|0)|0;c[2444]=c[2444]|e&32}l=g;return}function Jk(b,d){b=b|0;d=d|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[7131]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[7137]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[7137]=84;b=-1;break}}else b=1;while(0);return b|0}function Kk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+g[a+60>>2];k=+g[a+76>>2]-i;j=+g[a+64>>2];f=+g[a+80>>2]-j;d=+g[a+68>>2];h=+g[a+84>>2]-d;i=+g[a+92>>2]-i;j=+g[a+96>>2]-j;d=+g[a+100>>2]-d;g[c+12>>2]=0.0;e=1.0/+D(+((k*j-f*i)*(k*j-f*i)+((f*d-h*j)*(f*d-h*j)+(h*i-k*d)*(h*i-k*d))));g[c>>2]=(f*d-h*j)*e;g[c+4>>2]=(h*i-k*d)*e;g[c+8>>2]=(k*j-f*i)*e;if(!b)return;g[c>>2]=-((f*d-h*j)*e);g[c+4>>2]=-((h*i-k*d)*e);g[c+8>>2]=-((k*j-f*i)*e);return}function Lk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c[a+780>>2]|0;g=c[a+812>>2]|0;if((g|0)<=0){h=0;return h|0}f=c[a+820>>2]|0;a=0;while(1){i=c[f+(a*44|0)+8>>2]|0;if(((i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))?(i=c[f+(a*44|0)+12>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0)?(i=c[f+(a*44|0)+16>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0){a=1;f=7;break}a=a+1|0;if((a|0)>=(g|0)){a=0;f=7;break}}if((f|0)==7)return a|0;return 0}function Mk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17763}function Nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0,j=0;i=c[a+100>>2]|0;j=c[a+108>>2]|0;f=+g[j+(((b|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];h=+g[j+(((b|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[j+(((b|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=h;g[d+12>>2]=0.0;d=c[a+108>>2]|0;h=+g[d+(((b+1|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];f=+g[d+(((b+1|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[e>>2]=+g[d+(((b+1|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Ok(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17307}function Pk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0,i=0;e=l;l=l+32|0;d=c[a+184>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}h=c[a+192>>2]|0;i=c[b+192>>2]|0;d=c[a+184>>2]|0;f=+g[a+188>>2];c[e>>2]=0;c[e+4>>2]=i;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;vc(h,a+36|0,a+100|0,e,d,f);d=1;l=e;return d|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+72>>2];c[b+56>>2]=0;return 16327}function Rk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+60>>2]+j*+g[b+64>>2]+i*+g[b+68>>2];f=k*+g[b+76>>2]+j*+g[b+80>>2]+i*+g[b+84>>2];i=k*+g[b+92>>2]+j*+g[b+96>>2]+i*+g[b+100>>2];g[e>>2]=h;g[e+4>>2]=f;g[e+8>>2]=i;g[e+12>>2]=0.0;d=b+60+((+g[e+((h>2]>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=e;return}function Sk(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];b=c[a+8>>2]|0;c[b+304>>2]=(c[b+304>>2]|0)+1;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+52>>2]=c[d>>2];c[b+52+4>>2]=c[d+4>>2];c[b+52+8>>2]=c[d+8>>2];c[b+52+12>>2]=c[d+12>>2];l=d;return}function Tk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;do switch(b|0){case 0:{b=1;f=0;break}case 1:{b=2;f=0;break}case 2:{b=3;f=1;break}case 3:{f=2;break}case 4:{f=0;break}case 5:{f=1;break}case 6:{f=2;break}case 7:{f=3;break}case 8:{b=5;f=4;break}case 9:{b=6;f=4;break}case 10:{b=7;f=5;break}case 11:{b=7;f=6;break}default:{b=0;f=0}}while(0);Sb[c[(c[a>>2]|0)+108>>2]&127](a,f,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,e);return}function Uk(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(k+ +g[a+32>>2])/+g[a+16>>2];j=(h+ +g[a+36>>2])/+g[a+20>>2];f=(d+ +g[a+40>>2])/+g[a+24>>2];l=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));e=+C(+(+g[b+8>>2]));g[a+16>>2]=l;g[a+20>>2]=i;g[a+24>>2]=e;g[a+28>>2]=0.0;g[a+32>>2]=m*l-k;g[a+36>>2]=j*i-h;g[a+40>>2]=f*e-d;g[a+44>>2]=0.0;return}function Vk(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0.0,o=0;bc[c[(c[a>>2]|0)+32>>2]&1](a,b,d,e,f,h,i,j,k);l=c[a+184>>2]|0;m=c[j+20>>2]|0;m=(l|0)>(m|0)?l:m;if((m|0)<=0)return 0.0;l=0;do{n=+wb[c[(c[a>>2]|0)+40>>2]&3](a,l,b,d,e,f,h,i,j,k);g[a+228>>2]=n;o=l;l=l+1|0}while(((o|0)<(m+-1|0)?!(n<=+g[j+92>>2]):0)&(l|0)<(m|0));return 0.0}function Wk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0;if(a[b+527>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=3;c[d+4>>2]=3;j=c[b+28>>2]|0;i=c[b+32>>2]|0;xc(b,j+4|0,i+4|0,j+324|0,i+324|0);if((a[b+526>>0]|0?(e=c[d>>2]|0,c[d>>2]=e+1,f=c[d+4>>2]|0,c[d+4>>2]=f+-1,h=+g[b+456>>2],+g[b+444>>2]>2]>2]=e+2;c[d+4>>2]=f+-2}if(!(a[b+525>>0]|0))return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Xk(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;g[b>>2]=d;c[b+4>>2]=e;c[b+72>>2]=f;c[b+76>>2]=c[h>>2];c[b+76+4>>2]=c[h+4>>2];c[b+76+8>>2]=c[h+8>>2];c[b+76+12>>2]=c[h+12>>2];g[b+92>>2]=0.0;g[b+96>>2]=0.0;g[b+100>>2]=.5;g[b+104>>2]=0.0;g[b+108>>2]=0.0;g[b+112>>2]=0.0;g[b+116>>2]=.800000011920929;g[b+120>>2]=1.0;a[b+124>>0]=0;g[b+128>>2]=.004999999888241291;g[b+132>>2]=.009999999776482582;g[b+136>>2]=.009999999776482582;g[b+140>>2]=.009999999776482582;kr(b+8|0);return}function Yk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=d|d<<8|d<<16|d<<24;while((b|0)<=((f&-4)-64|0)){c[b>>2]=g;c[b+4>>2]=g;c[b+8>>2]=g;c[b+12>>2]=g;c[b+16>>2]=g;c[b+20>>2]=g;c[b+24>>2]=g;c[b+28>>2]=g;c[b+32>>2]=g;c[b+36>>2]=g;c[b+40>>2]=g;c[b+44>>2]=g;c[b+48>>2]=g;c[b+52>>2]=g;c[b+56>>2]=g;c[b+60>>2]=g;b=b+64|0}while((b|0)<(f&-4|0)){c[b>>2]=g;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Zk(a,b,c,d,e,f,h,i,j,k){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=k|0;if(!(((h-d)*b-(i-e)*a)*f+(((i-e)*c-(j-f)*b)*d+((j-f)*a-(h-d)*c)*e)<0.0)){k=0;return k|0}do if(!((h-d)*d+(i-e)*e+(j-f)*f>0.0))if((h-d)*h+(i-e)*i+(j-f)*j<0.0){a=h*h+i*i+j*j;break}else{a=((h*h+i*i+j*j)*(d*d+e*e+f*f)-(h*d+i*e+j*f)*(h*d+i*e+j*f))/((h-d)*(h-d)+(i-e)*(i-e)+(j-f)*(j-f));a=a>0.0?a:0.0;break}else a=d*d+e*e+f*f;while(0);g[k>>2]=+D(+a);k=1;return k|0}function _k(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,h=0,i=0;b=c[b+36>>2]|0;i=c[b+8>>2]|0;h=c[b+12>>2]|0;f=c[b+16>>2]|0;e=+g[a+52>>2];d=+Gh(a+4|0,+g[a+36>>2],+g[a+40>>2],+g[a+44>>2],+g[i+8>>2],+g[i+12>>2],+g[i+16>>2],+g[h+8>>2],+g[h+12>>2],+g[h+16>>2],+g[f+8>>2],+g[f+12>>2],+g[f+16>>2],e);if(!(d>0.0&d>2]|0;h=h+1|0;c[i>>2]=h;return}g[a+52>>2]=d;c[a+56>>2]=b;i=a+60|0;h=c[i>>2]|0;h=h+1|0;c[i>>2]=h;return}function $k(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if(c>>>0>=3)if((c+-3|0)>>>0<3)switch(b|0){case 2:{d=+g[a+868+(c+-3<<6)+32>>2];break a}case 4:{d=+g[a+868+(c+-3<<6)+36>>2];break a}case 3:{d=+g[a+868+(c+-3<<6)+28>>2];break a}default:{d=0.0;break a}}else d=0.0;else switch(b|0){case 2:{d=+g[a+756+(c<<2)>>2];break a}case 4:{d=+g[a+772+(c<<2)>>2];break a}case 3:{d=+g[a+740+(c<<2)>>2];break a}default:{d=0.0;break a}}while(0);return +d}function al(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;h=+g[d>>2];f=+g[d+4>>2];e=+g[d+8>>2];j=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:h;i=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:f;e=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:e;f=1.0/+D(+(e*e+(j*j+i*i)));h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+h*f*j;g[a+4>>2]=h*f*i+ +g[a+4>>2];g[a+8>>2]=h*f*e+ +g[a+8>>2];return}function bl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(qD(b,c[d>>2]|0)|0){if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1;c[d+44>>2]=4;break}if((f|0)==1)c[d+32>>2]=1}}else qs(d,e,f);while(0);return}function cl(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0;j=l;l=l+16|0;h=+g[b>>2];i=+g[b+4>>2];e=+g[b+8>>2];if(h*h+i*i+e*e>0.0?(f=+g[a+52>>2],f>0.0):0){c=1.0/+D(+(h*h+i*i+e*e));d=e*c*-f*e*c*-f+(h*c*-f*h*c*-f+i*c*-f*i*c*-f);if(d>0.0){g[j>>2]=-(h*c*-f);g[j+4>>2]=-(i*c*-f);g[j+8>>2]=-(e*c*-f);g[j+12>>2]=0.0;ve(a,j)}g[a+52>>2]=+D(+d);l=j;return}ve(a,b);l=j;return}function dl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){h=c[b+12>>2]|0;Co(b+16|0,d,e,f);if((h|0)>1){g=b+24|0;do{Co(g,d,e,f);if(a[d+54>>0]|0)break a;g=g+8|0}while(g>>>0<(b+16+(h<<3)|0)>>>0)}}else on(d,e,f);while(0);return}function el(a,b){a=a|0;b=b|0;var d=0;b=l;l=l+16|0;d=c[a+8>>2]|0;c[a+132>>2]=c[d+52>>2];c[a+132+4>>2]=c[d+52+4>>2];c[a+132+8>>2]=c[d+52+8>>2];c[a+132+12>>2]=c[d+52+12>>2];$p(a+152|0,d+52|0,16)|0;yh(d+4|0,b);c[a+168>>2]=c[b>>2];c[a+168+4>>2]=c[b+4>>2];c[a+168+8>>2]=c[b+8>>2];c[a+168+12>>2]=c[b+12>>2];c[a+184>>2]=c[a+168>>2];c[a+184+4>>2]=c[a+168+4>>2];c[a+184+8>>2]=c[a+168+8>>2];c[a+184+12>>2]=c[a+168+12>>2];l=b;return}function fl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+228>>2]|0;a:do if((f|0)>0){e=c[a+236>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+236>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+236>>2]|0)+(f+-1<<2)>>2]=e;c[a+228>>2]=f+-1}ch(c[b+28>>2]|0,b);ch(c[b+32>>2]|0,b);return}function gl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;return 11372}function hl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+12>>2]=c[a+72>>2];c[b+16>>2]=c[a+76>>2];c[b+20>>2]=c[a+80>>2];c[b+24>>2]=c[a+84>>2];c[b+28>>2]=c[a+52>>2];c[b+32>>2]=c[a+56>>2];c[b+36>>2]=c[a+60>>2];c[b+40>>2]=c[a+64>>2];c[b+44>>2]=c[a+68>>2];c[b+48>>2]=0;return 17004}function il(b,d,e){b=b|0;d=d|0;e=e|0;b=Ds(144)|0;c[b>>2]=5112;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+92>>2]=e;g[b+96>>2]=0.0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;c[b+108>>2]=d;c[b+112>>2]=0;c[b+116>>2]=2;c[b+120>>2]=1;g[b+104>>2]=0.0;g[b+100>>2]=0.0;return b|0}function jl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,72)|0;h=c[d+4>>2]|0;i=c[b+8>>2]|0;g=c[b+12>>2]|0;e=c[b+16>>2]|0;c[f+4>>2]=c[d>>2];c[f>>2]=6400;c[f+8>>2]=i;a[f+28>>0]=1;c[f+24>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;a[f+48>>0]=1;c[f+44>>2]=0;c[f+36>>2]=0;c[f+40>>2]=0;a[f+52>>0]=0;c[f+56>>2]=h;a[f+60>>0]=0;c[f+64>>2]=g;c[f+68>>2]=e;return f|0}function kl(b,d){b=b|0;d=d|0;var e=0;e=bt()|0;c[e+8>>2]=0;c[e+12>>2]=-1;c[e+16>>2]=1065353216;c[e+20>>2]=1065353216;c[e+24>>2]=1065353216;g[e+28>>2]=0.0;g[e+48>>2]=.03999999910593033;c[e+56>>2]=0;c[e+60>>2]=1065353216;c[e+64>>2]=1065353216;c[e+68>>2]=1065353216;g[e+72>>2]=0.0;c[e+76>>2]=-1082130432;c[e+80>>2]=-1082130432;c[e+84>>2]=-1082130432;g[e+88>>2]=0.0;a[e+92>>0]=0;c[e>>2]=8036;c[e+96>>2]=b;c[e+4>>2]=3;if(!d)return e|0;uj(e);return e|0}function ll(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;if(!(+g[a+404>>2]!=0.0)){l=d;return}wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);if(!(gJ(a+604|0)|0)){l=d;return}jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);xo(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function ml(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;a[b+53>>0]=1;do if((c[b+4>>2]|0)==(e|0)){a[b+52>>0]=1;e=c[b+16>>2]|0;if(!e){c[b+16>>2]=d;c[b+24>>2]=f;c[b+36>>2]=1;if(!((f|0)==1?(c[b+48>>2]|0)==1:0))break;a[b+54>>0]=1;break}if((e|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;a[b+54>>0]=1;break}e=c[b+24>>2]|0;if((e|0)==2){c[b+24>>2]=f;e=f}if((e|0)==1?(c[b+48>>2]|0)==1:0)a[b+54>>0]=1}while(0);return}function nl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+248>>2]|0;a:do if((f|0)>0){e=c[a+256>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+256>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+256>>2]|0)+(f+-1<<2)>>2]=e;c[a+248>>2]=f+-1;ki(a,b);return}function ol(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1;ki(a,b);return}function pl(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;a[b+251>>0]=0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];f=+g[b+68>>2];h=+g[b+72>>2];i=+g[b+76>>2];j=+D(+(f*f+h*h+i*i));if(j>1.1920928955078125e-07){k=f*(1.0/j);h=h*(1.0/j);f=i*(1.0/j);d=c[b+80>>2]|0}else{k=0.0;h=0.0;f=0.0;d=0}g[b+84>>2]=k;g[b+88>>2]=h;g[b+92>>2]=f;c[b+96>>2]=d;g[b+252>>2]=+g[b+252>>2]+e;return}function ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+64|0;if(!(qD(a,b)|0))if((b|0)!=0?(f=fj(b,2792)|0,(f|0)!=0):0){b=g+4|0;e=b+52|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));c[g>>2]=f;c[g+8>>2]=a;c[g+12>>2]=-1;c[g+48>>2]=1;Vb[c[(c[f>>2]|0)+28>>2]&127](f,g,c[d>>2]|0,1);if((c[g+24>>2]|0)==1){c[d>>2]=c[g+16>>2];b=1}else b=0}else b=0;else b=1;l=g;return b|0}function rl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+36>>2];h=+g[a+32>>2];i=b+(m<<4)|0;k=+g[b+(m<<4)+4>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));if(l!=0.0){j=f*(e/l);f=+g[i>>2]<0.0?-h:h;e=k*(e/l)}else{j=0.0;f=+g[i>>2]<0.0?-h:h}g[c+(m<<4)>>2]=f;g[c+(m<<4)+4>>2]=e;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function sl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=c[b>>2]|0;if(!e)e=c[a+188>>2]|0;i=c[a+328>>2]|0;if((i|0)<=0)return;h=c[a+336>>2]|0;f=0;while(1){g=h+(f<<2)|0;if((c[g>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(i|0)){k=9;break}}if((k|0)==9)return;if((f|0)>=(i|0))return;c[g>>2]=c[h+(i+-1<<2)>>2];c[a+328>>2]=i+-1;k=c[a+344>>2]|0;Cb[c[(c[k>>2]|0)+12>>2]&31](k,e,b,d)|0;return}function tl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+32|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}f=c[b+192>>2]|0;d=c[a+216>>2]|0;c[e>>2]=0;c[e+4>>2]=f;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;ad(a+68|0,a+132|0,e,d);d=1;l=e;return d|0}function ul(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;c[b+4>>2]=c[d>>2];c[b>>2]=6512;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;a[b+68>>0]=g&1;c[b+72>>2]=c[d+4>>2];a[b+76>>0]=0;c[b+80>>2]=c[(c[(g?f:e)+4>>2]|0)+72>>2];eh(b,e,f);return}function vl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0,i=0,j=0;j=c[a+72>>2]|0;i=c[a+68>>2]|0;h=c[a+76>>2]|0;e=+g[a+64>>2]*(+g[b+(j<<2)>>2]/+g[a+16+(j<<2)>>2]);g[a+64>>2]=e;f=+g[a+60>>2]*(+g[b+(i<<2)>>2]/+g[a+16+(i<<2)>>2]+ +g[b+(h<<2)>>2]/+g[a+16+(h<<2)>>2])*.5;g[a+60>>2]=f;g[a+56>>2]=f/+D(+(e*e+f*f));f=+C(+(+g[b>>2]));e=+C(+(+g[b+4>>2]));d=+C(+(+g[b+8>>2]));g[a+16>>2]=f;g[a+20>>2]=e;g[a+24>>2]=d;g[a+28>>2]=0.0;return}function wl(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function xl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+40>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+4>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+8>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=j;g[c+(m<<4)+8>>2]=f;m=m+1|0}while((m|0)!=(d|0));return}function yl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+36>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+4>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=f;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function zl(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function Al(b){b=b|0;var d=0;d=bt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d+60>>2]=1065353216;c[d+64>>2]=1065353216;c[d+68>>2]=1065353216;g[d+72>>2]=0.0;c[d+76>>2]=-1082130432;c[d+80>>2]=-1082130432;c[d+84>>2]=-1082130432;g[d+88>>2]=0.0;a[d+92>>0]=0;c[d>>2]=8036;c[d+96>>2]=b;c[d+4>>2]=3;uj(d);return d|0}function Bl(b){b=b|0;var d=0,e=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){d=b+28|0;e=b+16|0;c[e>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[d>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;e=b+28|0;d=b+16|0;c[d>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[e>>2]=0;return}function Cl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f+32>>2]=9284;c[f+32+4>>2]=e;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[d>>2];c[f+16+4>>2]=c[d+4>>2];c[f+16+8>>2]=c[d+8>>2];c[f+16+12>>2]=c[d+12>>2];Bf(c[a+4>>2]|0,f,f+32|0);Bf(c[a+44>>2]|0,f,f+32|0);l=f;return}function Dl(b){b=b|0;var d=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}function El(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0;d=1.0/+g[(c[b+108>>2]|0)+404>>2];if((c[b+128>>2]|0)<=0)return;e=0;do{f=c[b+136>>2]|0;if(!(a[f+(e*284|0)+84>>0]|0))h=0.0;else{h=+g[f+(e*284|0)+272>>2];h=d*(+g[f+(e*284|0)+216>>2]*(+g[f+(e*284|0)+204>>2]-+g[f+(e*284|0)+32>>2])*+g[f+(e*284|0)+268>>2]-h*+g[(h<0.0?f+(e*284|0)+220|0:f+(e*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[f+(e*284|0)+276>>2]=h;e=e+1|0}while((e|0)<(c[b+128>>2]|0));return}function Fl(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+48|0;f=+XI(b);h=+XI(c);i=+XI(d);b=+WI(b);c=+WI(c);d=+WI(d);g[e+32>>2]=h*i;g[e+28>>2]=c*b*i-f*d;g[e+24>>2]=c*f*i+b*d;g[e+20>>2]=h*d;g[e+16>>2]=c*b*d+f*i;g[e+12>>2]=c*f*d-b*i;g[e+8>>2]=-c;g[e+4>>2]=h*b;g[e>>2]=h*f;Ip(a,e+32|0,e+28|0,e+24|0,e+20|0,e+16|0,e+12|0,e+8|0,e+4|0,e);l=e;return}function Gl(a,d,f,g,h,i){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0;j=c[a+108>>2]|0;if(j|0){$b[c[(c[j>>2]|0)+24>>2]&7](j,d,f,g,h,i);return}d=b[a+56>>1]|0;if(!(d<<16>>16))return;h=1;i=1;do{f=c[a+68>>2]|0;if(b[f+(i<<2)>>1]&1){zb[c[(c[g>>2]|0)+8>>2]&31](g,(c[a+60>>2]|0)+((e[f+(i<<2)+2>>1]|0)<<6)|0)|0;d=b[a+56>>1]|0}h=h+1<<16>>16;i=h&65535}while(i>>>0<((d&65535)<<1|1)>>>0);return}function Hl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;f=+g[a+32>>2]/+g[a+16>>2];e=+g[a+36>>2]/+g[a+20>>2];d=+g[a+40>>2]/+g[a+24>>2];j=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));h=+C(+(+g[b+8>>2]));g[a+16>>2]=j;g[a+20>>2]=i;g[a+24>>2]=h;g[a+28>>2]=0.0;e=e*+g[b+4>>2];d=d*+g[b+8>>2];g[a+32>>2]=f*+g[b>>2];g[a+36>>2]=e;g[a+40>>2]=d;g[a+44>>2]=0.0;c[a+48>>2]=c[a+32+((((c[a+56>>2]|0)+2|0)%3|0)<<2)>>2];return}function Il(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=f;c[b+48>>2]=e;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[f+8>>2]|0,c[e+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=1;return b|0}function Jl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;c[h>>2]=a;c[h+4>>2]=e;e=c[(c[b+4>>2]|0)+4>>2]|0;g=c[(c[d+4>>2]|0)+4>>2]|0;if((f|0)==1){f=c[a+76+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}else{f=c[a+5260+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}return 0}function Kl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0;e=+g[a+32>>2];i=+g[a+36>>2];h=+g[a+40>>2];switch(d|0){case 0:{a=0;d=0;f=1065353216;break}case 1:{a=0;d=0;f=-1082130432;break}case 2:{a=0;d=1065353216;f=0;e=i;break}case 3:{a=0;d=-1082130432;f=0;e=i;break}case 4:{a=1065353216;d=0;f=0;e=h;break}case 5:{a=-1082130432;d=0;f=0;e=h;break}default:return}c[b>>2]=f;c[b+4>>2]=d;c[b+8>>2]=a;g[b+12>>2]=-e;return}function Ll(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=e;c[b+48>>2]=f;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=0;return b|0}function Ml(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0;e=c[a+248>>2]|0;if((e|0)<=0)return;b=c[a+256>>2]|0;a=0;do{d=c[b+(a<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:if(!(c[d+204>>2]&3)){h=+g[d+428>>2]*+g[d+412>>2];f=+g[d+432>>2]*+g[d+416>>2];g[d+472>>2]=+g[d+424>>2]*+g[d+408>>2]+ +g[d+472>>2];g[d+476>>2]=h+ +g[d+476>>2];g[d+480>>2]=f+ +g[d+480>>2]}}a=a+1|0}while((a|0)!=(e|0));return}function Nl(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;c=l;l=l+16|0;m=+g[a+12>>2];i=+g[(gJ(b)|0)>>2];j=+g[a>>2];k=+g[b+12>>2];h=+g[a+4>>2];d=+g[(NI(b)|0)>>2];e=+g[a+8>>2];f=+g[(OI(b)|0)>>2];g[c+12>>2]=m*i+j*k+h*d-e*f;g[c+8>>2]=m*f+h*k+e*i-j*d;g[c+4>>2]=m*d+e*k+j*f-h*i;g[c>>2]=m*k-j*i-h*f-e*d;as(a,c+12|0,c+8|0,c+4|0,c);l=c;return a|0}function Ol(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0;e=l;l=l+16|0;j=c[a+56>>2]|0;k=c[a+32+(((j+2|0)%3|0)<<2)>>2]|0;c[e>>2]=k;c[e+4>>2]=k;c[e+8>>2]=k;g[e+12>>2]=0.0;g[e+(j<<2)>>2]=+g[a+32+(j<<2)>>2]+ +g[e+(j<<2)>>2];h=+g[e>>2]*2.0;f=+g[e+4>>2]*2.0;i=+g[e+8>>2]*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);l=e;return}function Pl(a,b){a=a|0;b=+b;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=h+ +g[a+32>>2];e=e+ +g[a+36>>2];i=i+ +g[a+40>>2];g[a+48>>2]=b;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=i-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=h-f;g[a+36>>2]=e-d;g[a+40>>2]=b;g[a+44>>2]=0.0;return}function Ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[a+8>>2]|0)<=0)return;e=0;a:while(1){while(1){f=c[a+16>>2]|0;g=f+(e<<4)|0;if(!(zb[c[(c[b>>2]|0)+8>>2]&31](b,g)|0))break;Cb[c[(c[a>>2]|0)+12>>2]&31](a,c[g>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;c[6156]=(c[6156]|0)+-1;if((e|0)>=(c[a+8>>2]|0)){e=7;break a}}e=e+1|0;if((e|0)>=(c[a+8>>2]|0)){e=7;break}}if((e|0)==7)return}function Rl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5888;a[b+8>>0]=0;c[b+12>>2]=0;if(!(Bb[c[(c[d>>2]|0)+24>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0))return b|0;d=c[b+4>>2]|0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Sl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;f=(a[b+8>>0]|0)!=0;h=c[(f?e:d)+8>>2]|0;f=f?d:e;g=c[f+8>>2]|0;d=c[h+328>>2]|0;a:do if((d|0)>0){e=c[h+336>>2]|0;b=0;while(1){if((c[e+(b<<2)>>2]|0)==(g|0))break;b=b+1|0;if((b|0)>=(d|0))break a}if((b|0)!=(d|0))return}while(0);e=c[h+344>>2]|0;Sb[c[(c[e>>2]|0)+36>>2]&127](e,h,f);return}function Tl(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;a[b+251>>0]=1;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];e=+g[b+68>>2];f=+g[b+72>>2];h=+g[b+76>>2];i=+D(+(e*e+f*f+h*h));if(i>1.1920928955078125e-07){j=e*(1.0/i);f=f*(1.0/i);e=h*(1.0/i);d=c[b+80>>2]|0}else{j=0.0;f=0.0;e=0.0;d=0}g[b+84>>2]=j;g[b+88>>2]=f;g[b+92>>2]=e;c[b+96>>2]=d;return}function Ul(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+g[b+52>>2]-h;j=+g[b+56>>2]-f;g[d>>2]=+g[b+48>>2]-i;g[d+4>>2]=k;g[d+8>>2]=j;g[d+12>>2]=0.0;h=h+ +g[b+52>>2];f=f+ +g[b+56>>2];g[e>>2]=i+ +g[b+48>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Vl(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0.0,h=0.0,i=0.0;d=nt()|0;c[d+4>>2]=35;c[d+8>>2]=0;c[d+12>>2]=-1;g[d+16>>2]=0.0;c[d>>2]=7396;i=+g[a>>2];h=+g[a+4>>2];f=+g[a+8>>2];a=c[a+12>>2]|0;e=1.0/+D(+(i*i+h*h+f*f));g[d+52>>2]=i*e;g[d+56>>2]=h*e;g[d+60>>2]=f*e;c[d+64>>2]=a;g[d+68>>2]=b;c[d+72>>2]=1065353216;c[d+76>>2]=1065353216;c[d+80>>2]=1065353216;g[d+84>>2]=0.0;c[d+4>>2]=28;return d|0}function Wl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=c[a+780>>2]|0;h=c[a+792>>2]|0;if((h|0)<=0){h=0;return h|0}e=c[a+800>>2]|0;a=0;while(1){f=c[e+(a*52|0)+24>>2]|0;if((f|0)==(g+(b*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(d*104|0)|0):0){a=1;e=8;break}if((f|0)==(g+(d*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(b*104|0)|0):0){a=1;e=8;break}a=a+1|0;if((a|0)>=(h|0)){a=0;e=8;break}}if((e|0)==8)return a|0;return 0}function Xl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Rs()|0;Ra(f|0,a|0,b|0,d|0,e|0,0);c[f>>2]=4600;g[f+968>>2]=0.0;g[f+1056>>2]=0.0;g[f+1144>>2]=0.0;g[f+972>>2]=0.0;g[f+1060>>2]=0.0;g[f+1148>>2]=0.0;c[f+680>>2]=0;c[f+680+4>>2]=0;c[f+680+8>>2]=0;c[f+680+12>>2]=0;c[f+680+16>>2]=0;c[f+680+20>>2]=0;c[f+680+24>>2]=0;c[f+680+28>>2]=0;return f|0}function Yl(a){a=a|0;var b=0,d=0,e=0.0,f=0.0;if((c[a+128>>2]|0)<=0)return;b=0;do{d=c[a+136>>2]|0;c[d+(b*284|0)+32>>2]=c[d+(b*284|0)+204>>2];g[d+(b*284|0)+272>>2]=0.0;f=-+g[d+(b*284|0)+56>>2];e=-+g[d+(b*284|0)+60>>2];g[d+(b*284|0)>>2]=-+g[d+(b*284|0)+52>>2];g[d+(b*284|0)+4>>2]=f;g[d+(b*284|0)+8>>2]=e;g[d+(b*284|0)+12>>2]=0.0;g[d+(b*284|0)+268>>2]=1.0;b=b+1|0}while((b|0)<(c[a+128>>2]|0));return}function Zl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[d>>2]|0;g=zb[c[(c[g>>2]|0)+56>>2]&31](g,20)|0;h=c[d+4>>2]|0;i=a[b+4>>0]|0;b=c[d>>2]|0;c[g+4>>2]=b;c[g>>2]=6352;a[g+8>>0]=0;c[g+12>>2]=h;a[g+16>>0]=i;if(h|0)return g|0;c[g+12>>2]=Bb[c[(c[b>>2]|0)+12>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[g+8>>0]=1;return g|0}function _l(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function $l(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function am(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f>>2]=7376;c[f+4>>2]=b;c[f+8>>2]=c[d>>2];c[f+8+4>>2]=c[d+4>>2];c[f+8+8>>2]=c[d+8>>2];c[f+8+12>>2]=c[d+12>>2];c[f+24>>2]=c[e>>2];c[f+24+4>>2]=c[e+4>>2];c[f+24+8>>2]=c[e+8>>2];c[f+24+12>>2]=c[e+12>>2];b=c[a+52>>2]|0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,f,d,e);l=f;return}function bm(a,b,d){a=a|0;b=+b;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[a+32>>2];f=+g[a+36>>2];j=+g[a+40>>2];h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=(j+ +nb[c[(c[a>>2]|0)+48>>2]&15](a))*2.0;g[d>>2]=b/12.0*((f+e)*2.0*(f+e)*2.0+j*j);g[d+4>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+j*j);g[d+8>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+(f+e)*2.0*(f+e)*2.0);g[d+12>>2]=0.0;return}function cm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;d=l;l=l+16|0;c[d>>2]=9320;c[d+4>>2]=e;i=c[a+168>>2]|0;ze(c[a+4>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);ze(c[a+44>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);l=d;return}function dm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);yq(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function em(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+64|0;c[d>>2]=1065353216;c[d+4>>2]=0;c[d+4+4>>2]=0;c[d+4+8>>2]=0;c[d+4+12>>2]=0;c[d+20>>2]=1065353216;c[d+24>>2]=0;c[d+24+4>>2]=0;c[d+24+8>>2]=0;c[d+24+12>>2]=0;c[d+40>>2]=1065353216;c[d+44>>2]=0;c[d+48>>2]=c[b>>2];c[d+48+4>>2]=c[b+4>>2];c[d+48+8>>2]=c[b+8>>2];c[d+48+12>>2]=c[b+12>>2];Ld(a,d);l=d;return}function fm(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0;f=l;l=l+16|0;h=$G(b,0)|0;g[f+8>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);h=$G(b,1)|0;g[f+4>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);b=$G(b,2)|0;g[f>>2]=+Iy(+g[b>>2],+g[b+4>>2],+g[b+8>>2],c,d,e);$s(a,f+8|0,f+4|0,f);l=f;return}function gm(){var a=0,b=0,d=0;a=it()|0;c[a>>2]=1025;b=a+120|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+312|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+504|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+696|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));c[a+772>>2]=0;c[a+776>>2]=0;c[a+780>>2]=0;c[a+800>>2]=0;return a|0}function hm(a,b,d){a=a|0;b=b|0;d=d|0;a:do switch(c[b+220>>2]|0){case 2:case 5:{switch(c[d+220>>2]|0){case 2:case 5:{a=0;break}default:break a}return a|0}default:{}}while(0);if(!((c[b+280>>2]|0)!=0?!(zb[c[(c[b>>2]|0)+12>>2]&31](b,d)|0):0)){if(!(c[d+280>>2]|0)){d=1;return d|0}if(zb[c[(c[d>>2]|0)+12>>2]&31](d,b)|0){d=1;return d|0}}d=0;return d|0}function im(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+296>>2]|0;a:do if((f|0)>0){e=c[a+304>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0))return;g=c[a+304>>2]|0;b=g+(d<<2)|0;e=c[b>>2]|0;c[b>>2]=c[g+(f+-1<<2)>>2];c[(c[a+304>>2]|0)+(f+-1<<2)>>2]=e;c[a+296>>2]=f+-1;return}function jm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;j=+g[a+32>>2];h=+g[a+36>>2];e=+g[a+40>>2];i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=e+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=+(b&1^1|0)*(j+i)-+(b&1|0)*(j+i);g[d+4>>2]=+(b>>>1&1^1|0)*(h+f)-+(b>>>1&1|0)*(h+f);g[d+8>>2]=+(b>>>2&1^1|0)*e-+(b>>>2&1|0)*e;g[d+12>>2]=0.0;return}function km(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0,i=0,j=0;f=l;l=l+16|0;j=$G(b,0)|0;i=$G(b,1)|0;h=$G(b,2)|0;an(f,c,d,e,+g[j>>2],+g[j+4>>2],+g[j+8>>2],+g[i>>2],+g[i+4>>2],+g[i+8>>2],+g[h>>2],+g[h+4>>2],+g[h+8>>2]);iq(a,+g[f>>2],+g[f+4>>2],+g[f+8>>2],+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);l=f;return}function lm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+20>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+16>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+16>>2]|0)+4>>2];l=e;return +f}function mm(b,d){b=b|0;d=d|0;if((c[b+16>>2]|0)!=(0-(c[b+56>>2]|0)|0))return;Dl(b+4|0);Dl(b+44|0);a[b+153>>0]=0;a[b+154>>0]=1;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;c[b+128>>2]=0;c[b+128+4>>2]=0;c[b+128+8>>2]=0;c[b+128+12>>2]=0;c[b+128+16>>2]=0;c[b+128+20>>2]=0;return}function nm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[b+32>>2];j=+g[b+36>>2];e=+g[b+40>>2];h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+nb[c[(c[b>>2]|0)+48>>2]&15](b);e=e+ +nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+g[d+4>>2]>=0.0?j+f:-(j+f);e=+g[d+8>>2]>=0.0?e:-e;g[a>>2]=+g[d>>2]>=0.0?i+h:-(i+h);g[a+4>>2]=f;g[a+8>>2]=e;g[a+12>>2]=0.0;return}function om(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0;if((d|0)<=0)return;e=0;do{i=+g[a+32>>2];h=+g[a+36>>2];h=+g[b+(e<<4)+4>>2]>=0.0?h:-h;f=+g[a+40>>2];f=+g[b+(e<<4)+8>>2]>=0.0?f:-f;g[c+(e<<4)>>2]=+g[b+(e<<4)>>2]>=0.0?i:-i;g[c+(e<<4)+4>>2]=h;g[c+(e<<4)+8>>2]=f;g[c+(e<<4)+12>>2]=0.0;e=e+1|0}while((e|0)!=(d|0));return}function pm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;a=c[a+32>>2]|0;c[d>>2]=c[a+(k<<5)+12>>2];c[b>>2]=c[a+(k<<5)+16>>2];c[e>>2]=c[a+(k<<5)+28>>2];c[f>>2]=c[a+(k<<5)+20>>2];c[i>>2]=c[a+(k<<5)>>2];c[g>>2]=c[a+(k<<5)+4>>2];c[h>>2]=c[a+(k<<5)+8>>2];c[j>>2]=c[a+(k<<5)+24>>2];return}function qm(b){b=b|0;var d=0,e=0;c[b>>2]=6640;d=c[b+68>>2]|0;if(d|0?(Bl(d),e=c[b+68>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}d=c[b+28>>2]|0;if(!d){a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}function rm(b){b=b|0;var d=0,e=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+56>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function sm(a,b){a=a|0;b=+b;var d=0;d=l;l=l+16|0;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=7020;c[a+4>>2]=8;g[d+8>>2]=1.0;g[d+4>>2]=1.0;g[d>>2]=1.0;$s(a+16|0,d+8|0,d+4|0,d);Fs(a+32|0);MG(a+32|0,b);g[a+48>>2]=b;g[a+52>>2]=0.0;l=d;return}function tm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6820;c[d+68>>2]=0;c[d+72>>2]=2;c[d+76>>2]=1;g[d+32>>2]=a;g[d+40>>2]=b;g[d+36>>2]=a;return d|0}function um(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6920;c[d+68>>2]=1;c[d+72>>2]=0;c[d+76>>2]=2;g[d+36>>2]=a;g[d+32>>2]=b;g[d+40>>2]=a;return d|0}function vm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d>>2]=6720;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;c[d+68>>2]=0;c[d+72>>2]=1;c[d+76>>2]=2;g[d+32>>2]=a;g[d+36>>2]=b;g[d+40>>2]=a;g[d+56>>2]=a/+D(+(a*a+b*b));return d|0}function wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;switch(b|0){case 0:{a=0;b=0;e=1065353216;break}case 1:{a=0;b=0;e=-1082130432;break}case 2:{a=0;b=1065353216;e=0;break}case 3:{a=0;b=-1082130432;e=0;break}case 4:{a=1065353216;b=0;e=0;break}case 5:{a=-1082130432;b=0;e=0;break}default:return}c[d>>2]=e;c[d+4>>2]=b;c[d+8>>2]=a;g[d+12>>2]=0.0;return}function xm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;a[b+40>>0]=1;return}function ym(a,e,f){a=a|0;e=e|0;f=f|0;var h=0.0;switch(c[a+100>>2]|0){case 0:{h=+g[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<2)>>2];return +h}case 5:{h=+(d[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e)>>0]|0)*+g[a+92>>2];return +h}case 3:{h=+(b[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<1)>>1]|0)*+g[a+92>>2];return +h}default:{h=0.0;return +h}}return 0.0}function zm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];Vm(a+28|0,b+28|0);c[a+76>>2]=c[b+76>>2];c[a+76+4>>2]=c[b+76+4>>2];c[a+76+8>>2]=c[b+76+8>>2];c[a+76+12>>2]=c[b+76+12>>2];c[a+76+16>>2]=c[b+76+16>>2];return}function Am(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(e|0){case 5:case -1:break;default:return}switch(b|0){case 2:{g[a+764>>2]=d;c[a+748>>2]=c[a+748>>2]|2;return}case 4:{g[a+760>>2]=d;c[a+748>>2]=c[a+748>>2]|1;return}case 3:{g[a+752>>2]=d;c[a+748>>2]=c[a+748>>2]|4;return}case 1:{g[a+756>>2]=d;c[a+748>>2]=c[a+748>>2]|8;return}default:return}}function Bm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))ko(a,b);while(1){if((e|0)>=(b|0))break;f=gJ((c[a+12>>2]|0)+(e*52|0)|0)|0;g=d;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Cm(a,b){a=a|0;b=b|0;var c=0.0,d=0;d=l;l=l+32|0;c=+g[b+12>>2];if(1.0-c*c<1.1920928955078125e-06){g[d+20>>2]=1.0;g[d+16>>2]=0.0;g[d+12>>2]=0.0;$s(a,d+20|0,d+16|0,d+12|0);l=d;return}else{c=1.0/+VI(1.0-c*c);g[d+8>>2]=+g[b>>2]*c;g[d+4>>2]=+g[b+4>>2]*c;g[d>>2]=+g[b+8>>2]*c;$s(a,d+8|0,d+4|0,d);l=d;return}}function Dm(b){b=b|0;var d=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(!d)return;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function Em(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Mu(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+Em(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function Fm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))jo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*104|0)|0;g=d;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Gm(b,e){b=b|0;e=e|0;var f=0,g=0;g=0;while(1){if((d[19849+g>>0]|0)==(b|0)){b=2;break}f=g+1|0;if((f|0)==87){f=19937;g=87;b=5;break}else g=f}if((b|0)==2)if(!g)f=19937;else{f=19937;b=5}if((b|0)==5)while(1){do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);g=g+-1|0;if(!g)break;else b=5}return mH(f,c[e+20>>2]|0)|0}function Hm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))lo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*44|0)|0;g=d;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Im(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[a+408>>2]=c[b>>2];c[a+408+4>>2]=c[b+4>>2];c[a+408+8>>2]=c[b+8>>2];c[a+408+12>>2]=c[b+12>>2];Qq(d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2],+g[a+404>>2]);c[a+620>>2]=c[d>>2];c[a+620+4>>2]=c[d+4>>2];c[a+620+8>>2]=c[d+8>>2];c[a+620+12>>2]=c[d+12>>2];l=d;return}function Jm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0;f=l;l=l+16|0;d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2];if(d*d+e*e+c*c>0.0){g[f>>2]=-d;g[f+4>>2]=-e;g[f+8>>2]=-c;g[f+12>>2]=0.0;ve(a,f);d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2]}g[a+52>>2]=+D(+(d*d+e*e+c*c));l=f;return}function Km(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[a+328>>2]|0;if((g|0)<=0)return;b=c[b>>2]|0;f=c[a+336>>2]|0;d=0;while(1){e=f+(d<<2)|0;if((c[e>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(g|0)){h=7;break}}if((h|0)==7)return;if((d|0)>=(g|0))return;c[e>>2]=c[f+(g+-1<<2)>>2];c[a+328>>2]=g+-1;return}function Lm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=d*h*f-i*c*b;g[e+8>>2]=i*c*f+d*h*b;g[e+4>>2]=i*h*b-d*c*f;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Mm(a){a=a|0;var b=0;b=l;l=l+32|0;g[a>>2]=1.2000000476837158;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=1.0e3;g[b+20>>2]=0.0;g[b+16>>2]=0.0;g[b+12>>2]=0.0;$s(a+16|0,b+20|0,b+16|0,b+12|0);c[a+32>>2]=0;c[a+36>>2]=0;g[b+8>>2]=0.0;g[b+4>>2]=-10.0;g[b>>2]=0.0;$s(a+40|0,b+8|0,b+4|0,b);zC(a+56|0);l=b;return}function Nm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;+vb[c[(c[a>>2]|0)+44>>2]&3](a,b,d,e,f,g,h,i,j);+vb[c[(c[a>>2]|0)+48>>2]&3](a,b,d,e,f,g,h,i,j);+sb[c[(c[a>>2]|0)+36>>2]&1](a,b,d,i);return 0.0}function Om(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){while(1){e=xs(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e&255|48;e=b;b=rB(b|0,c|0,10,0)|0;if(!(c>>>0>9|(c|0)==9&e>>>0>4294967295))break;else c=A}c=b}else c=b;if(c)while(1){d=d+-1|0;a[d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}return d|0}function Pm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=i*c*f+d*h*b;g[e+8>>2]=i*h*b-d*c*f;g[e+4>>2]=d*h*f-i*c*b;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Qm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=c[e>>2];c[a+8+4>>2]=c[e+4>>2];c[a+8+8>>2]=c[e+8>>2];c[a+8+12>>2]=c[e+12>>2];c[a+24>>2]=c[f>>2];c[a+24+4>>2]=c[f+4>>2];c[a+24+8>>2]=c[f+8>>2];c[a+24+12>>2]=c[f+12>>2];g[a+40>>2]=h;return}function Rm(){var b=0;b=l;l=l+48|0;if(a[22392]|0){l=b;return}if(!(Uz(22392)|0)){l=b;return}g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Sq(22792,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Sm(){var b=0,e=0,f=0;f=l;l=l+16|0;a[f>>0]=10;b=c[2448]|0;if(!b)if(!(bp(9776)|0)){b=c[2448]|0;e=4}else b=-1;else e=4;do if((e|0)==4){e=c[2449]|0;if(!(e>>>0>=b>>>0|(a[9851]|0)==10)){c[2449]=e+1;a[e>>0]=10;b=10;break}if((Bb[c[9812>>2]&63](9776,f,1)|0)==1)b=d[f>>0]|0;else b=-1}while(0);l=f;return b|0}function Tm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+28>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+24>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+24>>2]|0)+4>>2];l=e;return +f}function Um(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=l;l=l+16|0;e=+MA(+g[b>>2],+g[b+4>>2],+g[b+8>>2]);e=+WI(c*.5)/e;g[d+12>>2]=+g[(gJ(b)|0)>>2]*e;g[d+8>>2]=+g[(OI(b)|0)>>2]*e;g[d+4>>2]=+g[(NI(b)|0)>>2]*e;g[d>>2]=+XI(c*.5);as(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function Vm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+16+4>>2]=c[b+16+4>>2];c[a+16+8>>2]=c[b+16+8>>2];c[a+16+12>>2]=c[b+16+12>>2];c[a+32>>2]=c[b+32>>2];c[a+32+4>>2]=c[b+32+4>>2];c[a+32+8>>2]=c[b+32+8>>2];c[a+32+12>>2]=c[b+32+12>>2];return}function Wm(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+8>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[b+16>>2]|0)+(f<<2)>>2]|0;if(!(a[b+76>>0]|0))switch(c[e+220>>2]|0){case 2:case 5:break;default:g=6}else g=6;if((g|0)==6){g=0;xf(b,e);d=c[b+8>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Xm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:case 1:{if(c>>>0<3){d=+g[a+600>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+432>>2];else d=0.0;break}case 4:case 3:{if(c>>>0<3){d=+g[a+596>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+604>>2];else d=0.0;break}default:d=0.0}while(0);return +d}function Ym(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=9600;a[b+8>>0]=0;c[b+12>>2]=0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Zm(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+60>>2]|0;d=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346456916,c[a+60>>2]|0);return}function _m(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(c|0){case 5:case -1:switch(b|0){case 2:{d=+g[a+764>>2];break a}case 4:{d=+g[a+760>>2];break a}case 3:{d=+g[a+752>>2];break a}case 1:{d=+g[a+756>>2];break a}default:{d=0.0;break a}}default:d=0.0}while(0);return +d}function $m(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+56>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+12>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+56>>2]|0;d=Bb[c[(c[d>>2]|0)+16>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1213612625,c[a+56>>2]|0);return}function an(a,b,c,d,e,f,h,i,j,k,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;n=+n;o=+o;var p=0;p=l;l=l+16|0;g[p+8>>2]=+Iy(b,c,d,e,f,h);g[p+4>>2]=+Iy(b,c,d,i,j,k);g[p>>2]=+Iy(b,c,d,m,n,o);$s(a,p+8|0,p+4|0,p);l=p;return}function bn(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0,f=0.0,h=0.0;e=+g[a+32>>2];f=+g[a+36>>2];h=+g[a+40>>2];d=+g[b>>2];if(!(d<=e+c)){b=0;return b|0}if(!(d>=-e-c)){b=0;return b|0}d=+g[b+4>>2];if(!(d<=f+c)){b=0;return b|0}if(!(d>=-f-c)){b=0;return b|0}d=+g[b+8>>2];if(!(d<=h+c)){b=0;return b|0}b=d>=-h-c;return b|0}function cn(b,d){b=b|0;d=d|0;c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+24>>2]=c[d+24>>2];c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+56>>2]=c[d+56>>2];c[b+48>>2]=c[d+48>>2];a[b+44>>0]=a[d+44>>0]&1;return}function dn(a,b,d){a=a|0;b=b|0;d=d|0;rw(a);c[a>>2]=3124;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];c[a+32>>2]=c[d>>2];c[a+32+4>>2]=c[d+4>>2];c[a+32+8>>2]=c[d+8>>2];c[a+32+12>>2]=c[d+12>>2];c[a+80>>2]=0;return}function en(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;if(!(+g[b+36>>2]>f))return;a[b+40>>0]=1;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;return}function fn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+40>>2];k=+g[c>>2];e=+g[c+4>>2];j=+D(+(k*k+e*e));f=+g[c+8>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+8>>2]=e;g[a+4>>2]=h;return}function gn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+36>>2];k=+g[c>>2];e=+g[c+8>>2];j=+D(+(k*k+e*e));f=+g[c+4>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+4>>2]=e;g[a+8>>2]=h;return}function hn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;d=+g[b+36>>2];f=+g[b+32>>2];j=+g[c+4>>2];e=+g[c+8>>2];i=+D(+(j*j+e*e));if(i!=0.0){h=e*(d/i);e=+g[c>>2]<0.0?-f:f;d=j*(d/i)}else{h=0.0;e=+g[c>>2]<0.0?-f:f}g[a+4>>2]=d;g[a>>2]=e;g[a+8>>2]=h;return}function jn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+156|0);aj(a+16|0,a+88|0,a+172|0);l=c;return}function kn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+164|0);aj(a+16|0,a+88|0,a+180|0);l=c;return}function ln(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0;if((d|0)>-1|(d|0)==-1&c>>>0>4294967295){e=(+(c>>>0)+4294967296.0*+(d>>>0))*18446744073709551616.0+(+(a>>>0)+4294967296.0*+(b>>>0));return +e}else{g=sw(0,0,a|0,b|0)|0;f=A;d=Ow((a|0)==0&(b|0)==0&1|0,0,~c|0,~d|0)|0;e=-+ln(g,f,d,A);return +e}return 0.0}function mn(a){a=a|0;var b=0.0,d=0.0,e=0.0;d=+g[(c[a+28>>2]|0)+404>>2];e=+g[(c[a+32>>2]|0)+404>>2];e=e==0.0?1.0:d/(d+e);d=+g[a+1116>>2]*e+(1.0-e)*+g[a+1180>>2];b=e*+g[a+1120>>2]+(1.0-e)*+g[a+1184>>2];g[a+1284>>2]=+g[a+1112>>2]*e+ +g[a+1176>>2]*(1.0-e);g[a+1288>>2]=d;g[a+1292>>2]=b;g[a+1296>>2]=0.0;return}function nn(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0;d=+g[a+404>>2];if(d!=0.0){f=1.0/d*+g[b+4>>2];e=1.0/d*+g[b+8>>2];g[a+424>>2]=1.0/d*+g[b>>2];g[a+428>>2]=f;g[a+432>>2]=e;g[a+436>>2]=0.0}c[a+440>>2]=c[b>>2];c[a+440+4>>2]=c[b+4>>2];c[a+440+8>>2]=c[b+8>>2];c[a+440+12>>2]=c[b+12>>2];return}function on(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+16>>2]|0;do if(f){if((f|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;c[b+24>>2]=2;a[b+54>>0]=1;break}if((c[b+24>>2]|0)==2)c[b+24>>2]=e}else{c[b+16>>2]=d;c[b+24>>2]=e;c[b+36>>2]=1}while(0);return}function pn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[a+84>>2]|0;a=c[f+8>>2]|0;if((a|0)<=0)return;e=0;do{d=c[(c[f+16>>2]|0)+(e*12|0)+8>>2]|0;if(d){Ob[c[(c[d>>2]|0)+16>>2]&127](d,b);a=c[f+8>>2]|0}e=e+1|0}while((e|0)<(a|0));return}function qn(a,b,d){a=a|0;b=b|0;d=d|0;Ut(a);c[a>>2]=2952;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];c[a+40>>2]=c[d>>2];c[a+40+4>>2]=c[d+4>>2];c[a+40+8>>2]=c[d+8>>2];c[a+40+12>>2]=c[d+12>>2];return}function rn(){var b=0,d=0,e=0;do if((c[2463]|0)>=0?(kJ()|0)!=0:0){if((a[9851]|0)!=10?(b=c[2449]|0,b>>>0<(c[2448]|0)>>>0):0){c[2449]=b+1;a[b>>0]=10;break}Sm()|0}else e=3;while(0);do if((e|0)==3){if((a[9851]|0)!=10?(d=c[2449]|0,d>>>0<(c[2448]|0)>>>0):0){c[2449]=d+1;a[d>>0]=10;break}Sm()|0}while(0);return}function sn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[d>>2]|0;a=vy(c[b>>2]|0)|0;f=vy(f)|0;if(a|0)Vb[c[(c[a>>2]|0)+32>>2]&127](a,d,e,b);if(!f)return 0;Vb[c[(c[f>>2]|0)+32>>2]&127](f,b,e,d);return 0}function tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+48|0;f=c[b+192>>2]|0;Vb[c[(c[f>>2]|0)+8>>2]&127](f,b+4|0,e+32|0,e+16|0);c[e>>2]=6304;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;d=c[a+68>>2]|0;Vb[c[(c[d>>2]|0)+28>>2]&127](d,e+32|0,e+16|0,e);l=e;return}function un(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=l;l=l+256|0;if((c|0)>(d|0)&(e&73728|0)==0){Yk(f|0,b|0,((c-d|0)>>>0<256?c-d|0:256)|0)|0;if((c-d|0)>>>0>255){b=c-d|0;do{fA(a,f,256);b=b+-256|0}while(b>>>0>255);b=c-d&255}else b=c-d|0;fA(a,f,b)}l=f;return}function vn(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];return 12513}function wn(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b>>2]|0;e=c[a+84>>2]|0;if((d|0)==(e|0)){e=0;return e|0}if(!(c[a+12>>2]&c[b+4>>2])){e=0;return e|0}if(!(c[b+8>>2]&c[a+8>>2])){e=0;return e|0}b=c[a+96>>2]|0;e=Bb[c[(c[b>>2]|0)+28>>2]&63](b,e,d)|0;return e|0}function xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+112|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+104|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Fm(a,d,f);Jo(b,d,c[a+12>>2]|0);l=f;return}function yn(a){a=a|0;c[5650]=c[a>>2];c[5651]=c[a+4>>2];c[5652]=c[a+8>>2];c[5653]=c[a+12>>2];c[5654]=c[a+16>>2];c[5655]=c[a+20>>2];c[5656]=c[a+24>>2];Vm(22628,a+28|0);c[5669]=c[a+76>>2];c[5670]=c[a+76+4>>2];c[5671]=c[a+76+8>>2];c[5672]=c[a+76+12>>2];c[5673]=c[a+76+16>>2];return}function zn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+64|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+52|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Bm(a,d,f);Eo(b,d,c[a+12>>2]|0);l=f;return}function An(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+48|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Hm(a,d,f);Oo(b,d,c[a+12>>2]|0);l=f;return}function Bn(a){a=a|0;var b=0,d=0,e=0;Ib[c[(c[a>>2]|0)+8>>2]&511](a);Ib[c[(c[a>>2]|0)+12>>2]&511](a);b=c[a+24>>2]|0;if(!b)return;e=c[(c[b>>2]|0)+32>>2]|0;d=c[a+68>>2]|0;d=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;Vb[e&127](b,d,a+28|0,c[a+24>>2]|0);return}function Cn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7936;g[d+48>>2]=a;c[d+56>>2]=2;g[d+32>>2]=a;g[d+36>>2]=a;g[d+40>>2]=b*.5;g[d+44>>2]=0.0;return d|0}function Dn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7836;g[d+48>>2]=a;c[d+56>>2]=0;g[d+32>>2]=b*.5;g[d+36>>2]=a;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function En(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;e=l;l=l+32|0;d=Ss()|0;g[e+8>>2]=1.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Hg(d,a,b,c,e+16|0);l=e;return d|0}function Fn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d>>2]=7736;g[d+48>>2]=a;c[d+4>>2]=10;c[d+56>>2]=1;g[d+32>>2]=a;g[d+36>>2]=b*.5;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function Gn(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=gJ(b)|0;i=gJ(b+16|0)|0;h=gJ(b+32|0)|0;g=OI(b)|0;f=OI(b+16|0)|0;e=OI(b+32|0)|0;d=NI(b)|0;c=NI(b+16|0)|0;Sq(a,j,i,h,g,f,e,d,c,NI(b+32|0)|0);return}function Hn(a,b){a=a|0;b=b|0;var d=0;if(c[b+40>>2]|0){Hn(a,c[b+36>>2]|0);Hn(a,c[b+40>>2]|0)}if((c[a>>2]|0)==(b|0))c[a>>2]=0;d=c[a+4>>2]|0;if(!d){c[a+4>>2]=b;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);c[a+4>>2]=b;return}function In(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+32>>2]|0;c[g>>2]=(c[g>>2]|0)+1;qg(a,Qd(a,b,f)|0);qg(a,Qd(a,d,f)|0);qg(a,Qd(a,e,f)|0);return}function Jn(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);else{a=c[a+8>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e,f,g)}return}function Kn(a){a=a|0;var b=0;b=l;l=l+48|0;g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Ip(a,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Ln(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+4>>2]|0;e=gJ(d)|0;if((e|0)==(gJ(c[a+8>>2]|0)|0)){eo(a,$B(e)|0);d=c[a+4>>2]|0}zm((c[a+12>>2]|0)+(d*96|0)|0,b);c[a+4>>2]=(c[a+4>>2]|0)+1;return}function Mn(a,b){a=a|0;b=b|0;var d=0,e=0;c[a+72>>2]=(c[a+72>>2]|0)+1;d=c[a+20>>2]|0;if((d|0)>0)do{e=d;d=d+-1|0;if((c[(c[a+28>>2]|0)+(d*80|0)+64>>2]|0)==(b|0))re(a,d)}while((e|0)>1);Ib[c[(c[a>>2]|0)+68>>2]&511](a);return}function Nn(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:case 1:if(e>>>0<3){g[a+600>>2]=d;c[a+592>>2]=c[a+592>>2]|2;return}else{g[a+432>>2]=d;return}case 4:case 3:{g[(e>>>0<3?a+596|0:a+604|0)>>2]=d;c[a+592>>2]=c[a+592>>2]|(e>>>0<3?1:4);return}default:return}}function On(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;if(!b)return;d=c[a+16>>2]|0;if(d>>>0<=b>>>0?(d+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Pn(a){a=a|0;var b=0,d=0;if((c[a+248>>2]|0)<=0)return;b=0;do{d=(c[(c[a+256>>2]|0)+(b<<2)>>2]|0)+472|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;b=b+1|0}while((b|0)<(c[a+248>>2]|0));return}function Qn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))eo(a,b);while(1){if((e|0)>=(b|0))break;zm((c[a+12>>2]|0)+(e*96|0)|0,d);e=e+1|0}c[a+4>>2]=b;return}function Rn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+96|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+96|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));Qn(a,d,f);Zq(b,d,c[a+12>>2]|0);l=f;return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+52>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[a+60>>2]|0)+(f<<2)>>2]|0;if(e){Ob[c[(c[e>>2]|0)+16>>2]&127](e,b);d=c[a+52>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))$n(a,b);while(1){if((e|0)>=(b|0))break;c[(c[a+12>>2]|0)+(e<<2)>>2]=c[d>>2];e=e+1|0}c[a+4>>2]=b;return}function Un(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[a+32>>2]|0;c[f>>2]=(c[f>>2]|0)+1;qg(a,Qd(a,b,0)|0);qg(a,Qd(a,d,0)|0);qg(a,Qd(a,e,0)|0);return}function Vn(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];c[a+68>>2]=c[d>>2];c[a+68+4>>2]=c[d+4>>2];c[a+68+8>>2]=c[d+8>>2];c[a+68+12>>2]=c[d+12>>2];c[a+48>>2]=1;return}function Wn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[d>>2]|0;a=vy(c[b>>2]|0)|0;e=vy(e)|0;if(a|0)Sb[c[(c[a>>2]|0)+28>>2]&127](a,d,b);if(!e)return 0;Sb[c[(c[e>>2]|0)+28>>2]&127](e,b,d);return 0}function Xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a;e=b;f=d+104|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));Sv(a+104|0,b+104|0);Tv(a+124|0,b+124|0);Tv(a+144|0,b+144|0);return}function Yn(a,d){a=a|0;d=d|0;var e=0,f=0;if(b[a+56>>1]|0)return;b[a+64>>1]=1;d=b[a+58>>1]|0;f=c[a+60>>2]|0;if((d&65535)>1){e=1;do{d=e;e=e+1|0;b[f+(d<<6)+48>>1]=e;d=b[a+58>>1]|0}while(e>>>0<(d&65535)>>>0)}b[f+((d&65535)+-1<<6)+48>>1]=0;return}function Zn(a,b,c){a=+a;b=b|0;c=c|0;var d=0,e=0;e=l;l=l+32|0;d=Ds(144)|0;g[e+8>>2]=0.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Xk(d,a,b,c,e+16|0);l=e;return d|0}function _n(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=c[b+16>>2];c[d+4>>2]=c[b+16+4>>2];c[d+8>>2]=c[b+16+8>>2];c[d+12>>2]=c[b+16+12>>2];c[e>>2]=c[b+32>>2];c[e+4>>2]=c[b+32+4>>2];c[e+8>>2]=c[b+32+8>>2];c[e+12>>2]=c[b+32+12>>2];return}function $n(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=It(d)|0;tr(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ao(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=c[a+4>>2]|0;if(!(i&1))h=i>>8;else h=c[(c[e>>2]|0)+(i>>8)>>2]|0;a=c[a>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e+h|0,i&2|0?f:2,g);return}function bo(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;d=c[a+12>>2]|0;if(d|0){c[a+12>>2]=c[d>>2];c[a+8>>2]=(c[a+8>>2]|0)+-1;b=d;return b|0}c[6995]=(c[6995]|0)+1;a=sc(b+19|0)|0;if(!a){b=0;return b|0}c[(a+4+15&-16)+-4>>2]=a;b=a+4+15&-16;return b|0}function co(b){b=b|0;g[b+60>>2]=0.0;g[b+8>>2]=0.0;g[b+12>>2]=.10000000149011612;g[b+16>>2]=300.0;g[b>>2]=1.0;g[b+4>>2]=-1.0;g[b+28>>2]=0.0;g[b+32>>2]=.20000000298023224;g[b+36>>2]=0.0;g[b+40>>2]=0.0;g[b+20>>2]=1.0;g[b+24>>2]=.5;c[b+56>>2]=0;g[b+48>>2]=0.0;a[b+44>>0]=0;return}function eo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=$t(d)|0;Zq(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function fo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g[a+692>>2]=(c-b)*.5;b=+mh((c-b)*.5+b,6.2831854820251465);if(!(b<-3.1415927410125732)){if(b>3.1415927410125732)b=b+-6.2831854820251465}else b=b+6.2831854820251465;g[a+688>>2]=b;g[a+696>>2]=d;g[a+700>>2]=e;g[a+704>>2]=f;return}function go(a,b,d){a=a|0;b=+b;d=+d;var e=0;e=l;l=l+16|0;g[e+12>>2]=b;g[e+8>>2]=d;g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+504>>2]=c[(b<0.0?e+4|0:b>1.0?e:e+12|0)>>2];g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+508>>2]=c[(d<0.0?e+4|0:d>1.0?e:e+8|0)>>2];l=e;return}function ho(){var b=0;b=l;l=l+32|0;if(a[22384]|0){l=b;return}if(!(Uz(22384)|0)){l=b;return}Rm();g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(b+16|0,b+8|0,b+4|0,b);Xq(22728,22792,b+16|0);l=b;return}function io(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[(c[b>>2]|0)+16>>2]|0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[d&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1497645650,a);return}function jo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=du(d)|0;Jo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ko(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=eu(d)|0;Eo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function lo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=fu(d)|0;Oo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function mo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+52>>2];c[b+4>>2]=c[a+52+4>>2];c[b+8>>2]=c[a+52+8>>2];c[b+12>>2]=c[a+52+12>>2];c[d>>2]=c[a+68>>2];c[d+4>>2]=c[a+68+4>>2];c[d+8>>2]=c[a+68+8>>2];c[d+12>>2]=c[a+68+12>>2];return}function no(a){a=a|0;var b=0,d=0,e=0;b=c[a+24>>2]|0;if((b|0)<=0)return;e=0;do{d=c[(c[a+32>>2]|0)+(e<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:{Eg(d);b=c[a+24>>2]|0}}e=e+1|0}while((e|0)<(b|0));return}function oo(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1245859651,a);return}function po(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);else{a=c[a+8>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d,e)}return}function qo(a,b,c){a=a|0;b=b|0;c=+c;var d=0;d=l;l=l+16|0;g[d+12>>2]=+g[(gJ(b)|0)>>2]*c;g[d+8>>2]=+g[(OI(b)|0)>>2]*c;g[d+4>>2]=+g[(NI(b)|0)>>2]*c;g[d>>2]=+g[b+12>>2]*c;dw(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function ro(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+8>>2];c[b+4>>2]=c[a+8+4>>2];c[b+8>>2]=c[a+8+8>>2];c[b+12>>2]=c[a+8+12>>2];c[d>>2]=c[a+24>>2];c[d+4>>2]=c[a+24+4>>2];c[d+8>>2]=c[a+24+8>>2];c[d+12>>2]=c[a+24+12>>2];return}function so(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+52>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+56>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346455635,a);return}function to(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+80|0;Gn(c+32|0,b);Br(c,+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);fm(c+16|0,c+32|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2]);Xq(a,c+32|0,c+16|0);l=c;return}function uo(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=c[a+4>>2]|0;if(!(h&1))g=h>>8;else g=c[(c[d>>2]|0)+(h>>8)>>2]|0;a=c[a>>2]|0;Zb[c[(c[a>>2]|0)+24>>2]&31](a,b,d+g|0,h&2|0?e:2,f);return}function vo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;return 17123}function wo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Qq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+404>>2]);us(a+372|0,e+16|0)|0;l=e;return}function xo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;fm(e,a+324|0,b,c,d);jq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+388|0,e+16|0)|0;l=e;return}function yo(a,b,d){a=a|0;b=b|0;d=d|0;c[a+164>>2]=c[b>>2];c[a+164+4>>2]=c[b+4>>2];c[a+164+8>>2]=c[b+8>>2];c[a+164+12>>2]=c[b+12>>2];b=gJ(b)|0;if((!(+g[b>>2]!=1.0)?!(+g[b+4>>2]!=1.0):0)?!(+g[b+8>>2]!=1.0):0)d=0;c[a+180>>2]=d;return}function zo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+952>>2];c[b+4>>2]=c[a+952+4>>2];c[b+8>>2]=c[a+952+8>>2];c[b+12>>2]=c[a+952+12>>2];c[d>>2]=c[a+968>>2];c[d+4>>2]=c[a+968+4>>2];c[d+8>>2]=c[a+968+8>>2];c[d+12>>2]=c[a+968+12>>2];return}function Ao(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if((c|0)==-1)switch(b|0){case 2:case 1:{d=+g[a+336>>2];break a}case 4:case 3:{d=+g[a+340>>2];break a}default:{d=3402823466385288598117041.0e14;break a}}else d=3402823466385288598117041.0e14;while(0);return +d}function Bo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+g[b+32>>2];e=+g[b+36>>2];e=+g[c+4>>2]>=0.0?e:-e;d=+g[b+40>>2];d=+g[c+8>>2]>=0.0?d:-d;g[a>>2]=+g[c>>2]>=0.0?f:-f;g[a+4>>2]=e;g[a+8>>2]=d;g[a+12>>2]=0.0;return}function Co(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+4>>2]|0;if(!(g&1))f=g>>8;else f=c[(c[d>>2]|0)+(g>>8)>>2]|0;a=c[a>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d+f|0,g&2|0?e:2);return}function Do(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Eo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=gJ(d+(e*52|0)|0)|0;g=(c[a+12>>2]|0)+(e*52|0)|0;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Fo(a,b){a=a|0;b=b|0;var d=0,e=0;e=c[a+288>>2]|0;a:do if((e|0)>0){d=c[a+296>>2]|0;a=0;while(1){if((c[d+(a<<2)>>2]|0)==(b|0))break a;a=a+1|0;if((a|0)>=(e|0)){a=e;break}}}else a=e;while(0);return (a|0)>=(e|0)|0}function Go(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22368]|0))Uz(22368)|0;Bp(d,c[b+108>>2]|0,c[b+120>>2]|0);c[5674]=c[d>>2];c[5675]=c[d+4>>2];c[5676]=c[d+8>>2];c[5677]=c[d+12>>2];l=d;return 22696}function Ho(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,1);return a|0}function Io(a,b){a=a|0;b=b|0;var d=0;d=c[a+4>>2]|0;if((c[b>>2]|0)!=(d|0)?(c[b+4>>2]|0)!=(d|0):0)return 0;d=c[a+8>>2]|0;Sb[c[(c[d>>2]|0)+32>>2]&127](d,b,c[a+12>>2]|0);return 0}function Jo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*104|0)|0;g=(c[a+12>>2]|0)+(e*104|0)|0;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Ko(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Lo(a){a=a|0;var b=0.0,d=0.0;if(c[a+204>>2]&3|0)return;d=+g[a+428>>2]*+g[a+412>>2];b=+g[a+432>>2]*+g[a+416>>2];g[a+472>>2]=+g[a+424>>2]*+g[a+408>>2]+ +g[a+472>>2];g[a+476>>2]=d+ +g[a+476>>2];g[a+480>>2]=b+ +g[a+480>>2];return}function Mo(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,0);return a|0}function No(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Oo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*44|0)|0;g=(c[a+12>>2]|0)+(e*44|0)|0;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Po(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+12>>2]=-+g[(gJ(b)|0)>>2];g[c+8>>2]=-+g[(OI(b)|0)>>2];g[c+4>>2]=-+g[(NI(b)|0)>>2];g[c>>2]=-+g[b+12>>2];dw(a,c+12|0,c+8|0,c+4|0,c);l=c;return}function Qo(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Ro(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;e=l;l=l+16|0;d=+EF(a);d=+VI(d*+EF(b));c=+Gp(a,b);if(c<0.0){Po(e,b);c=+Gp(a,e)}d=+$A(c/d)*2.0;l=e;return +d}function So(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0;h=c[a+108>>2]|0;f=+g[h+(b<<4)+4>>2]*+g[a+20>>2];e=+g[h+(b<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[h+(b<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=e;g[d+12>>2]=0.0;return}function To(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+32|0;c[e>>2]=c[a+60>>2];c[e+4>>2]=0;c[e+8>>2]=b;c[e+12>>2]=e+20;c[e+16>>2]=d;if((SC(_a(140,e|0)|0)|0)<0){c[e+20>>2]=-1;a=-1}else a=c[e+20>>2]|0;l=e;return a|0}function Uo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,12)|0;e=a[b+4>>0]|0;c[f+4>>2]=c[d>>2];c[f>>2]=3820;a[f+8>>0]=e;return f|0}function Vo(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function Wo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]+c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]+c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]+c;g[a+12>>2]=+g[a+12>>2]+ +g[b+12>>2];return a|0}function Xo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]-c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]-c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]-c;g[a+12>>2]=+g[a+12>>2]-+g[b+12>>2];return a|0}function Yo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22352]|0))Uz(22352)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5646]=c[d>>2];c[5647]=c[d+4>>2];c[5648]=c[d+8>>2];c[5649]=c[d+12>>2];l=d;return 22584}function Zo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22416]|0))Uz(22416)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5718]=c[d>>2];c[5719]=c[d+4>>2];c[5720]=c[d+8>>2];c[5721]=c[d+12>>2];l=d;return 22872}function _o(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){X()|0;Za(12);return -1}c[i>>2]=a;if((a|0)>(W()|0)?(V()|0)==0:0){c[i>>2]=b;Za(12);return -1}return b|0}function $o(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=gJ(c[b+4>>2]|0)|0;c[d>>2]=0;Tn(a,e,d);tr(b,e,c[a+12>>2]|0);l=d;return}function ap(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+g[b+20>>2];d=e*+g[b+260>>2]+ +g[b+72>>2];c=e*+g[b+264>>2]+ +g[b+76>>2];g[a>>2]=+g[b+256>>2]*e+ +g[b+68>>2];g[a+4>>2]=d;g[a+8>>2]=c;g[a+12>>2]=0.0;return}function bp(b){b=b|0;var d=0;d=a[b+74>>0]|0;a[b+74>>0]=d+255|d;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function cp(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if((e|0)!=-1)return;switch(b|0){case 2:case 1:{g[a+336>>2]=d;c[a+332>>2]=c[a+332>>2]|1;return}case 4:case 3:{g[a+340>>2]=d;c[a+332>>2]=c[a+332>>2]|2;return}default:return}}function dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(NI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(NI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function ep(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(OI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(OI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(OI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function fp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22376]|0))Uz(22376)|0;_i(f,b,d,e);c[5678]=c[f>>2];c[5679]=c[f+4>>2];c[5680]=c[f+8>>2];c[5681]=c[f+12>>2];l=f;return 22712}function gp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22424]|0))Uz(22424)|0;_i(f,b,d,e);c[5722]=c[f>>2];c[5723]=c[f+4>>2];c[5724]=c[f+8>>2];c[5725]=c[f+12>>2];l=f;return 22888}function hp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((b|0)==(d|0))return;e=c[(c[a+4>>2]|0)+96>>2]|0;Bb[c[(c[e>>2]|0)+8>>2]&63](e,c[b+36>>2]|0,c[d+36>>2]|0)|0;d=(c[a+4>>2]|0)+120|0;c[d>>2]=(c[d>>2]|0)+1;return}function ip(a){a=a|0;var b=0,d=0.0,e=0.0,f=0.0;b=l;l=l+32|0;Sb[c[(c[a>>2]|0)+12>>2]&127](a,b+8|0,b);f=+g[b+8>>2];e=+g[b+8+4>>2];d=+g[b+8+8>>2];d=+D(+(f*f+e*e+d*d));l=b;return +(d+ +g[b>>2])}function jp(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function kp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;c[f>>2]=5516;c[f+4>>2]=d;c[f+8>>2]=a;Sb[c[(c[b>>2]|0)+48>>2]&127](b,f,e);l=f;return}function lp(a,b,d){a=a|0;b=b|0;d=d|0;a=c[b+8>>2]|0;if(!((d|0)!=0&(a|0)!=0))return;Ib[c[c[a>>2]>>2]&511](a);Ob[c[(c[d>>2]|0)+60>>2]&127](d,c[b+8>>2]|0);c[b+8>>2]=0;return}function mp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9144;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function np(b){b=b|0;var d=0;c[b>>2]=7120;if(a[b+65>>0]|0?(d=c[b+56>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function op(a,b){a=a|0;b=b|0;a=c[a+16>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function pp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Pt()|0;Su(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function qp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Ds(16)|0;dw(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function rp(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);return}function sp(a,b){a=a|0;b=+b;var d=0,e=0;if((c[a+296>>2]|0)<=0)return;d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0));return}function tp(a){a=a|0;var b=0.0,d=0,e=0,f=0.0;e=c[a+772>>2]|0;if((e|0)<=0){b=0.0;return +b}d=c[a+780>>2]|0;a=0;b=0.0;do{f=+g[d+(a*104|0)+88>>2];b=b+(f>0.0?1.0/f:0.0);a=a+1|0}while((a|0)!=(e|0));return +b}function up(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;return}function vp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22344]|0))Uz(22344)|0;BA(d,b);c[5642]=c[d>>2];c[5643]=c[d+4>>2];c[5644]=c[d+8>>2];c[5645]=c[d+12>>2];l=d;return 22568}function wp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22336]|0))Uz(22336)|0;kz(d,b);c[5638]=c[d>>2];c[5639]=c[d+4>>2];c[5640]=c[d+8>>2];c[5641]=c[d+12>>2];l=d;return 22552}function xp(b){b=b|0;var c=0.0,d=0.0,e=0.0;if(!(a[22400]|0))Uz(22400)|0;e=-+g[b+52>>2];d=+g[b+260>>2]*e;c=+g[b+264>>2]*e;g[5710]=+g[b+256>>2]*e;g[5711]=d;g[5712]=c;g[5713]=0.0;return 22840}function yp(a,b,d){a=a|0;b=+b;d=d|0;b=b*.4000000059604645*+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=b*+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b;g[d+4>>2]=b;g[d+8>>2]=b;g[d+12>>2]=0.0;return}function zp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,16)|0;c[e+4>>2]=c[b>>2];c[e>>2]=4296;return e|0}function Ap(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=c*h-d*f;g[i+4>>2]=d*e-b*h;g[i>>2]=b*f-c*e;$s(a,i+8|0,i+4|0,i);l=i;return}function Bp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;b=gJ(b+4|0)|0;e=(gJ($G(b,0)|0)|0)+(c<<2)|0;d=(gJ($G(b,1)|0)|0)+(c<<2)|0;$s(a,e,d,(gJ($G(b,2)|0)|0)+(c<<2)|0);return}function Cp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=-581039253;c[d+4>>2]=-581039253;c[d+8>>2]=-581039253;g[d+12>>2]=0.0;c[e>>2]=1566444395;c[e+4>>2]=1566444395;c[e+8>>2]=1566444395;g[e+12>>2]=0.0;return}function Dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(gJ(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(gJ(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(gJ(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function Ep(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22320]|0))Uz(22320)|0;lq(d,b);c[5630]=c[d>>2];c[5631]=c[d+4>>2];c[5632]=c[d+8>>2];c[5633]=c[d+12>>2];l=d;return 22520}function Fp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22328]|0))Uz(22328)|0;Cm(d,b);c[5634]=c[d>>2];c[5635]=c[d+4>>2];c[5636]=c[d+8>>2];c[5637]=c[d+12>>2];l=d;return 22536}function Gp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[a>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[a+4>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[a+8>>2];c=d+c*+g[(NI(b)|0)>>2];return +(c+ +g[a+12>>2]*+g[b+12>>2])}function Hp(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Ip(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;$s(a,b,c,d);$s(a+16|0,e,f,g);$s(a+32|0,h,i,j);return}function Jp(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;return}function Kp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+64|0;zk(d+16|0,b,c);km(d,b,+g[c+48>>2],+g[c+52>>2],+g[c+56>>2]);Xq(a,d+16|0,d);l=d;return}function Lp(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Mp(a){a=a|0;var b=0,d=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),d=c[a+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Np(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);return}function Op(a,b){a=a|0;b=b|0;var d=0;d=(c[a+96>>2]|0)+4|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];uj(a);return}function Pp(b,d){b=b|0;d=d|0;var e=0;if(a[b+289>>0]|0?(e=c[b+216>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}a[b+289>>0]=0;c[b+216>>2]=d;c[(c[b+212>>2]|0)+8>>2]=d;return}function Qp(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;return}function Rp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,8)|0;c[e+4>>2]=c[b>>2];c[e>>2]=9572;return e|0}function Sp(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;return}function Tp(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+12>>2]=b;g[f+8>>2]=c;g[f+4>>2]=d;g[f>>2]=e;as(a,f+12|0,f+8|0,f+4|0,f);l=f;return}function Up(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[b+8>>2]|0;e=c[f+344>>2]|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,f,c[d+8>>2]|0);return}function Vp(b){b=b|0;var d=0,e=0;c[b>>2]=6352;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Wp(b){b=b|0;var d=0,e=0;c[b>>2]=9600;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Xp(b){b=b|0;var d=0,e=0;c[b>>2]=5792;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Yp(b){b=b|0;var d=0;c[b>>2]=7120;if(!(a[b+65>>0]|0))return;d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);b=c[b+56>>2]|0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Zp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9164;c[e+4>>2]=b;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function _p(b){b=b|0;var d=0,e=0;c[b>>2]=5888;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function $p(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else gi(b,c,d)|0;return b|0}function aq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(108)|0;Xt(b);rg(a,b);l=b;return a|0}function bq(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=P(b&65535,a&65535)|0;e=(c>>>16)+(P(b&65535,a>>>16)|0)|0;d=P(b>>>16,a&65535)|0;return (A=(e>>>16)+(P(b>>>16,a>>>16)|0)+(((e&65535)+d|0)>>>16)|0,e+d<<16|c&65535|0)|0}function cq(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+C(+(+g[b>>2]));d=+C(+(+g[b+4>>2]));c=+C(+(+g[b+8>>2]));g[a+16>>2]=e;g[a+20>>2]=d;g[a+24>>2]=c;g[a+28>>2]=0.0;return}function dq(a,b){a=a|0;b=b|0;Wf(a,c[b+36>>2]|0);return}function eq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);return}function fq(a,b,c,d,e,f,g,h,i,j,k,l,m){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=k|0;l=+l;m=m|0;Xb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,+j,k|0,+l,m|0)}function gq(b){b=b|0;var d=0,e=0,f=0;e=c[b>>2]|0;f=(a[e>>0]|0)+-48|0;if(f>>>0<10){d=0;do{d=f+(d*10|0)|0;e=e+1|0;c[b>>2]=e;f=(a[e>>0]|0)+-48|0}while(f>>>0<10)}else d=0;return d|0}function hq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;g[a>>2]=(1.0-d)*+g[b>>2]+ +g[c>>2]*d;g[a+4>>2]=(1.0-d)*+g[b+4>>2]+ +g[c+4>>2]*d;g[a+8>>2]=(1.0-d)*+g[b+8>>2]+ +g[c+8>>2]*d;return}function iq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b+e;g[i+4>>2]=c+f;g[i>>2]=d+h;$s(a,i+8|0,i+4|0,i);l=i;return}function jq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b*e;g[i+4>>2]=c*f;g[i>>2]=d*h;$s(a,i+8|0,i+4|0,i);l=i;return}function kq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b-e;g[i+4>>2]=c-f;g[i>>2]=d-h;$s(a,i+8|0,i+4|0,i);l=i;return}function lq(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+8>>2]=-+g[b>>2];g[c+4>>2]=-+g[b+4>>2];g[c>>2]=-+g[b+8>>2];dw(a,c+8|0,c+4|0,c,b+12|0);l=c;return}function mq(a){a=a|0;var b=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(!b)return;Ib[c[c[b>>2]>>2]&511](b);a=c[a+56>>2]|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function nq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+188>>2]|0;a=c[d+188>>2]|0;if(!(c[a+8>>2]&c[b+4>>2])){d=0;return d|0}d=(c[b+8>>2]&c[a+4>>2]|0)!=0;return d|0}function oq(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return +(+cb(0,a|0,b|0,c|0,d|0,e|0,f|0,g|0,h|0))}function pq(a,b){a=a|0;b=b|0;if((b|0)==0?1:(c[b+252>>2]&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}}function qq(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[19831+(b&15)>>0]|0|f;b=Mu(b|0,c|0,4)|0;c=A}while(!((b|0)==0&(c|0)==0));return e|0}function rq(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);return}function sq(){var b=0;b=Ds(40)|0;g[b+12>>2]=1.0;c[b+8>>2]=0;c[b+4>>2]=5;c[b>>2]=3172;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;a[b+16>>0]=1;return b|0}function tq(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function uq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);us(a+472|0,e)|0;l=e;return}function vq(a,b,c){a=+a;b=+b;c=+c;var d=0,e=0;e=l;l=l+16|0;g[e+8>>2]=a;g[e+4>>2]=b;g[e>>2]=c;d=Pt()|0;$s(d,e+8|0,e+4|0,e);l=e;return d|0}function wq(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];uj(a);return}function xq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Gb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)|0}function yq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+488|0,e)|0;l=e;return}function zq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return +wb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Aq(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=Ss()|0;Hg(e,a,b,c,d);return e|0}function Bq(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=qt()|0;ye(h,a,b,c,d,e,f,g);return h|0}function Cq(){var a=0,b=0;a=ts()|0;if((a|0?(b=c[a>>2]|0,b|0):0)?((c[b+48>>2]&-256|0)==1126902528?(c[b+48+4>>2]|0)==1129074247:0):0)qy(c[b+12>>2]|0);qy(nF()|0)}function Dq(a,b,d){a=a|0;b=b|0;d=d|0;mA(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Eq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+388>>2]=c[b>>2];c[a+388+4>>2]=c[b+4>>2];c[a+388+8>>2]=c[b+8>>2];c[a+388+12>>2]=c[b+12>>2];return}function Fq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(88)|0;Xt(b);ce(a,b);l=b;return a|0}function Gq(a,b,d){a=a|0;b=b|0;d=d|0;c[d>>2]=c[a+60+(b<<4)>>2];c[d+4>>2]=c[a+60+(b<<4)+4>>2];c[d+8>>2]=c[a+60+(b<<4)+8>>2];c[d+12>>2]=c[a+60+(b<<4)+12>>2];return}function Hq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+372>>2]=c[b>>2];c[a+372+4>>2]=c[b+4>>2];c[a+372+8>>2]=c[b+8>>2];c[a+372+12>>2]=c[b+12>>2];return}function Iq(b,d){b=b|0;d=d|0;if(!(a[22408]|0))Uz(22408)|0;d=$G(b,d)|0;c[5714]=c[d>>2];c[5715]=c[d+4>>2];c[5716]=c[d+8>>2];c[5717]=c[d+12>>2];return 22856}function Jq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+604>>2]=c[b>>2];c[a+604+4>>2]=c[b+4>>2];c[a+604+8>>2]=c[b+8>>2];c[a+604+12>>2]=c[b+12>>2];return}function Kq(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;k=k|0;l=+l;Yb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,j|0,k|0,+l)}function Lq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+36>>2];+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Mq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+32>>2];b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Nq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;cc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Oq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=c[d>>2];a=Bb[c[(c[a>>2]|0)+16>>2]&63](a,b,e)|0;if(a)c[d>>2]=c[e>>2];l=e;return a&1|0}function Pq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+156+(b<<4)>>2]=c[d>>2];c[a+156+(b<<4)+4>>2]=c[d+4>>2];c[a+156+(b<<4)+8>>2]=c[d+8>>2];c[a+156+(b<<4)+12>>2]=c[d+12>>2];return}function Qq(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+8>>2]=b*e;g[f+4>>2]=c*e;g[f>>2]=d*e;$s(a,f+8|0,f+4|0,f);l=f;return}function Rq(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];g[a+12>>2]=+g[a+12>>2]*+g[b>>2];return a|0}function Sq(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;Ip(a,b,c,d,e,f,g,h,i,j);return}function Tq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=Us(344)|0;Vd(d,a,b,c);return d|0}function Uq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+28+(b<<4)>>2]=c[d>>2];c[a+28+(b<<4)+4>>2]=c[d+4>>2];c[a+28+(b<<4)+8>>2]=c[d+8>>2];c[a+28+(b<<4)+12>>2]=c[d+12>>2];return}function Vq(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(!d){cJ(b);return}if(!(a[b+36>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function Wq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+204>>2]|0;if(b&4|0)return 0;a=c[d+204>>2]|0;if(!(a&4))return (b&3|0)==0|(a&3|0)==0|0;else return 0;return 0}function Xq(a,b,d){a=a|0;b=b|0;d=d|0;Vm(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Yq(b){b=b|0;var d=0;c[b>>2]=6352;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function Zq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;zm(d+(e*96|0)|0,(c[a+12>>2]|0)+(e*96|0)|0);e=e+1|0}return}function _q(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(!d){cJ(b);return}if(!(a[b+24>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function $q(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+128|0;to(c,a+68|0);Kp(c+64|0,a+4|0,c);ur(b,c+64|0);l=c;return}function ar(b){b=b|0;var d=0;c[b>>2]=9600;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function br(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=qt()|0;ye(g,a,b,c,d,e,f,0);return g|0}function cr(b){b=b|0;var d=0;c[b>>2]=5792;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function dr(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;return ((c[b>>2]|0)==(a|0)?1:(c[b+4>>2]|0)==(a|0))|0}function er(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=dt()|0;He(f,a,b,c,d,e);return f|0}function fr(a,b){a=a|0;b=b|0;a=c[a+24>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function gr(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(!d){cJ(b);return}if(!(a[b+20>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function hr(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=b;g[e+4>>2]=c;g[e>>2]=d;$s(a,e+8|0,e+4|0,e);l=e;return}function ir(b){b=b|0;var d=0;c[b>>2]=5888;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function jr(a,b,d){a=a|0;b=b|0;d=d|0;TH(a);c[a>>2]=3056;ur(a+4|0,b);ur(a+68|0,d);ur(a+132|0,b);c[a+196>>2]=0;return}function kr(a){a=a|0;var b=0;b=l;l=l+16|0;Kn(a);g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a+48|0,b+8|0,b+4|0,b);l=b;return}function lr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;var f=0;f=Ds(44)|0;Qm(f,a,b,c,d,e);return f|0}function mr(a,b,c){a=a|0;b=b|0;c=+c;switch(b|0){case 3:{a=a+452|0;break}case 4:{a=a+448|0;break}case 5:{a=a+444|0;break}default:return}g[a>>2]=c;return}function nr(a,b){a=a|0;b=b|0;b=c[b+36>>2]|0;we(a,c[(c[(c[(c[a+4>>2]|0)+4>>2]|0)+28>>2]|0)+(b*80|0)+64>>2]|0,b);return}function or(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return +vb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function pr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)+4>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function qr(a,b,c,d){a=+a;b=b|0;c=c|0;d=d|0;var e=0;e=Ds(144)|0;Xk(e,a,b,c,d);return e|0}function rr(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +(+ub[c[(c[a>>2]|0)+12>>2]&1](a,b,d,e,f,g,h,i))}function sr(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Mu(b|0,c|0,3)|0;c=A}while(!((b|0)==0&(c|0)==0));return d|0}function tr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;c[d+(e<<2)>>2]=c[(c[a+12>>2]|0)+(e<<2)>>2];e=e+1|0}return}function ur(a,b){a=a|0;b=b|0;Vm(a,b);c[a+48>>2]=c[b+48>>2];c[a+48+4>>2]=c[b+48+4>>2];c[a+48+8>>2]=c[b+48+8>>2];c[a+48+12>>2]=c[b+48+12>>2];return}function vr(a,b){a=a|0;b=b|0;$s(a,b,b+16|0,b+32|0);$s(a+16|0,b+4|0,b+20|0,b+36|0);$s(a+32|0,b+8|0,b+24|0,b+40|0);return}function wr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function xr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a<<2|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function yr(a,b){a=a|0;b=b|0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);id(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function zr(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;bc[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Ar(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,(b+1|0)%3|0,e);return}function Br(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=-b;g[e+4>>2]=-c;g[e>>2]=-d;$s(a,e+8|0,e+4|0,e);l=e;return}function Cr(a,b){a=a|0;b=b|0;c[a+100>>2]=c[b>>2];c[a+100+4>>2]=c[b+4>>2];c[a+100+8>>2]=c[b+8>>2];c[a+100+12>>2]=c[b+12>>2];return}function Dr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*104|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Er(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*52|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Fr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*44|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Gr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=rt()|0;he(f,a,b,c&65535,d,e);return f|0}function Hr(a,b){a=a|0;b=b|0;c[a+696>>2]=c[b>>2];c[a+696+4>>2]=c[b+4>>2];c[a+696+8>>2]=c[b+8>>2];c[a+696+12>>2]=c[b+12>>2];return}function Ir(a,b){a=a|0;b=b|0;c[a+680>>2]=c[b>>2];c[a+680+4>>2]=c[b+4>>2];c[a+680+8>>2]=c[b+8>>2];c[a+680+12>>2]=c[b+12>>2];return}function Jr(a,b){a=a|0;b=b|0;c[a+156>>2]=c[b>>2];c[a+156+4>>2]=c[b+4>>2];c[a+156+8>>2]=c[b+8>>2];c[a+156+12>>2]=c[b+12>>2];return}function Kr(b,c,d){b=b|0;c=c|0;d=d|0;a[b+1309+c>>0]=d&1;if((c|0)<3){a[b+788+c>>0]=d&1;return}else{a[b+868+(c+-3<<6)+44>>0]=d&1;return}}function Lr(a,b){a=a|0;b=b|0;c[a+112>>2]=c[b>>2];c[a+112+4>>2]=c[b+4>>2];c[a+112+8>>2]=c[b+8>>2];c[a+112+12>>2]=c[b+12>>2];return}function Mr(a,b){a=a|0;b=b|0;c[a+56>>2]=c[b>>2];c[a+56+4>>2]=c[b+4>>2];c[a+56+8>>2]=c[b+8>>2];c[a+56+12>>2]=c[b+12>>2];return}function Nr(b){b=b|0;if(a[22448]|0)return 23016;if(!(Uz(22448)|0))return 23016;c[5754]=1065353216;c[5755]=1065353216;c[5756]=1065353216;g[5757]=0.0;return 23016}function Or(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a*96|19)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Pr(a){a=a|0;var b=0;do{c[a+4>>2]=0;g[a+8>>2]=0.0;b=c[a+24>>2]|0;if(b|0)Pr(b);a=c[a+28>>2]|0}while((a|0)!=0);return}function Qr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Ud(a,b,c,d,e,f);return}function Rr(a,b){a=a|0;b=b|0;c[a+172>>2]=c[b>>2];c[a+172+4>>2]=c[b+4>>2];c[a+172+8>>2]=c[b+8>>2];c[a+172+12>>2]=c[b+12>>2];return}function Sr(a,b){a=a|0;b=b|0;c[a+32>>2]=c[b>>2];c[a+32+4>>2]=c[b+4>>2];c[a+32+8>>2]=c[b+8>>2];c[a+32+12>>2]=c[b+12>>2];return}function Tr(a){a=a|0;g[a>>2]=5.880000114440918;g[a+4>>2]=.8299999833106995;g[a+8>>2]=.8799999952316284;g[a+12>>2]=500.0;g[a+16>>2]=10.5;g[a+20>>2]=6.0e3;return}function Ur(a,b){a=a|0;b=b|0;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];return}function Vr(a,b){a=a|0;b=b|0;c[a+316>>2]=c[b>>2];c[a+316+4>>2]=c[b+4>>2];c[a+316+8>>2]=c[b+8>>2];c[a+316+12>>2]=c[b+12>>2];return}function Wr(a,b){a=a|0;b=b|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];return}function Xr(a,b){a=a|0;b=b|0;c[a+64>>2]=c[b>>2];c[a+64+4>>2]=c[b+4>>2];c[a+64+8>>2]=c[b+8>>2];c[a+64+12>>2]=c[b+12>>2];return}function Yr(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return Fb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Zr(a,b){a=a|0;b=b|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];return}function _r(a,b){a=a|0;b=b|0;c[a+188>>2]=c[b>>2];c[a+188+4>>2]=c[b+4>>2];c[a+188+8>>2]=c[b+8>>2];c[a+188+12>>2]=c[b+12>>2];return}function $r(a,b){a=a|0;b=b|0;c[a+40>>2]=c[b>>2];c[a+40+4>>2]=c[b+4>>2];c[a+40+8>>2]=c[b+8>>2];c[a+40+12>>2]=c[b+12>>2];return}function as(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];c[a+12>>2]=c[f>>2];return}function bs(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +ub[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function cs(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];return}function ds(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+8>>2])){b=0;return b|0}b=(c[a+4>>2]&c[b+8>>2]|0)!=0;return b|0}function es(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+12>>2])){b=0;return b|0}b=(c[a+8>>2]&c[b+8>>2]|0)!=0;return b|0}function fs(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function gs(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+16>>2])){b=0;return b|0}b=(c[a+12>>2]&c[b+8>>2]|0)!=0;return b|0}function hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=rt()|0;he(e,a,b,c&65535,d,0);return e|0}function is(a,b){a=a|0;b=b|0;c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];return}function js(a,b){a=a|0;b=b|0;c[a+36>>2]=c[b>>2];c[a+36+4>>2]=c[b+4>>2];c[a+36+8>>2]=c[b+8>>2];c[a+36+12>>2]=c[b+12>>2];return}function ks(a,b){a=a|0;b=b|0;c[a>>2]=c[b+264>>2];c[a+4>>2]=c[b+264+4>>2];c[a+8>>2]=c[b+264+8>>2];c[a+12>>2]=c[b+264+12>>2];return}function ls(b,d){b=b|0;d=d|0;if(!(a[22360]|0))Uz(22360)|0;yn(aC(c[b+12>>2]|0,d)|0);return 22600}function ms(){var a=0;a=Ds(16)|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Dz(a);return a|0}function ns(a,b){a=a|0;b=+b;dg(a,b);a=c[a+472>>2]|0;Jb[c[(c[a>>2]|0)+24>>2]&31](a,b);return}function os(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=dt()|0;Yd(d,a,b,c);return d|0}function ps(){var a=0;a=jt()|0;ho();ho();jr(a,22728,22728);return a|0}function qs(a,b,d){a=a|0;b=b|0;d=d|0;if((c[a+4>>2]|0)==(b|0)?(c[a+28>>2]|0)!=1:0)c[a+28>>2]=d;return}function rs(){var a=0,b=0;b=ct(c[5628]|0,c[5629]|0,1284865837,1481765933)|0;b=Ow(b|0,A|0,1,0)|0;a=A;c[5628]=b;c[5629]=a;a=Mu(b|0,a|0,33)|0;return a|0}function ss(a,b){a=a|0;b=b|0;c[a+48>>2]=c[b>>2];c[a+48+4>>2]=c[b+4>>2];c[a+48+8>>2]=c[b+8>>2];c[a+48+12>>2]=c[b+12>>2];return}function ts(){var a=0,b=0;a=l;l=l+16|0;if(!(jb(28552,3)|0)){b=hb(c[7139]|0)|0;l=a;return b|0}else Ww(22016,a);return 0}function us(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]+ +g[b>>2];g[a+4>>2]=+g[a+4>>2]+ +g[b+4>>2];g[a+8>>2]=+g[a+8>>2]+ +g[b+8>>2];return a|0}function vs(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]-+g[b>>2];g[a+4>>2]=+g[a+4>>2]-+g[b+4>>2];g[a+8>>2]=+g[a+8>>2]-+g[b+8>>2];return a|0}function ws(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+64|0;Kp(c,b,a+68|0);ur(a+4|0,c);l=c;return}function xs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;Ye(a,b,d,e,f|0)|0;l=f;return (A=c[f+4>>2]|0,c[f>>2]|0)|0}function ys(a,b){a=a|0;b=b|0;c[a+12>>2]=c[b>>2];c[a+12+4>>2]=c[b+4>>2];c[a+12+8>>2]=c[b+8>>2];c[a+12+12>>2]=c[b+12>>2];return}function zs(a,b){a=a|0;b=b|0;c[a+88>>2]=c[b>>2];c[a+88+4>>2]=c[b+4>>2];c[a+88+8>>2]=c[b+8>>2];c[a+88+12>>2]=c[b+12>>2];return}function As(a){a=a|0;var b=0;b=Ds(108)|0;rg(b,a);return b|0}function Bs(a,b){a=a|0;b=b|0;c[a+20>>2]=c[b>>2];c[a+20+4>>2]=c[b+4>>2];c[a+20+8>>2]=c[b+8>>2];c[a+20+12>>2]=c[b+12>>2];return}function Cs(a,b){a=a|0;b=b|0;c[a+76>>2]=c[b>>2];c[a+76+4>>2]=c[b+4>>2];c[a+76+8>>2]=c[b+8>>2];c[a+76+12>>2]=c[b+12>>2];return}function Ds(a){a=a|0;var b=0;b=(a|0)==0?1:a;while(1){a=sc(b)|0;if(a|0)break;a=iF()|0;if(!a){a=0;break}Hb[a&3]()}return a|0}function Es(a,b){a=a|0;b=b|0;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2];return}function Fs(a){a=a|0;var b=0;b=l;l=l+16|0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a,b+8|0,b+4|0,b);l=b;return}function Gs(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function Hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=Us(1252)|0;Bc(e,a,b,c,d);return e|0}function Is(a,b){a=a|0;b=b|0;c[a+72>>2]=c[b>>2];c[a+72+4>>2]=c[b+4>>2];c[a+72+8>>2]=c[b+8>>2];c[a+72+12>>2]=c[b+12>>2];return}function Js(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];return a|0}function Ks(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=rt()|0;he(d,a,b,c&65535,0,0);return d|0}function Ls(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;g[a+(c[b+56>>2]<<2)>>2]=1.0;return}function Ms(a){a=a|0;var b=0;b=l;l=l+16|0;Cd(a);if(!(kb(c[7139]|0,0)|0)){l=b;return}else Ww(22115,b)}function Ns(a,b){a=a|0;b=b|0;c[a+8>>2]=c[b>>2];c[a+8+4>>2]=c[b+4>>2];c[a+8+8>>2]=c[b+8>>2];c[a+8+12>>2]=c[b+12>>2];return}function Os(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(255)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ps(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=Jt()|0;Xe(d,a,b,c);return d|0}function Qs(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ic(b,c,d,e)|0}function Rs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1479)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ss(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(311)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ts(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1407)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Us(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a+19|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Vs(a){a=a|0;if(!(+C(+(+g[a+20>>2]))<1.1920928955078125e-07)){a=0;return a|0}a=+C(+(+g[a+24>>2]))<1.1920928955078125e-07;return a|0}function Ws(a){a=a|0;var b=0;b=jt()|0;ho();jr(b,a,22728);return b|0}function Xs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(191)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ys(a,b){a=a|0;b=b|0;if(!b?c[a+204>>2]&3|0:0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function Zs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a+-4>>2]|0)+8>>2]&127](a+-4|0,b,d,e);return}function _s(a,b){a=a|0;b=b|0;var c=0.0;c=+EF(a);c=+VI(c*+EF(b));return +(+$A(+Gp(a,b)/c))}function $s(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];g[a+12>>2]=0.0;return}function at(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function bt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(119)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ct(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=bq(a,c)|0;f=A;return (A=(P(b,c)|0)+(P(d,a)|0)+f|f&0,e|0|0)|0}function dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1331)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function et(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(!d)return;if(a[b+16>>0]&1)Ey(d);c[b+12>>2]=0;return}function ft(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;ac[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function gt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(379)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ht(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(627)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function it(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(823)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(219)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function kt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+88>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function lt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function mt(a,b){a=a|0;b=b|0;var c=0;c=Ds(84)|0;dn(c,a,b);return c|0}function nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(107)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ot(a){a=+a;a=+$H(a);if(a<-3.1415927410125732){a=a+6.2831854820251465;return +a}if(!(a>3.1415927410125732))return +a;a=a+-6.2831854820251465;return +a}function pt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function qt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(787)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function rt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(135)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function st(a,b){a=a|0;b=b|0;c[a+348>>2]=c[b>>2];c[a+348+4>>2]=c[b+4>>2];c[a+348+8>>2]=c[b+8>>2];return}function tt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)<=0)return;Yk(c|0,0,d<<4|0)|0;return}function ut(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(115)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function vt(a,b){a=a|0;b=b|0;c[a+540>>2]=b;if(!b)return;Ob[c[(c[b>>2]|0)+8>>2]&127](b,a+4|0);return}function wt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;sj(a,b,c,d);return}function xt(a,b){a=a|0;b=b|0;var c=0;c=Jt()|0;Xe(c,a,b,1);return c|0}function yt(a,b){a=a|0;b=b|0;var c=0;c=rt()|0;he(c,a,b,16384,0,0);return c|0}function zt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,a+4|0,b,d);return}function At(a){a=a|0;var b=0;b=Ds(88)|0;ce(b,a);return b|0}function Bt(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=1065353216;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Ct(a,b){a=a|0;b=b|0;var d=0;d=c[a+8>>2]|0;Sb[c[d+64>>2]&127](b,d,c[a+4>>2]|0);return 0}function Dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(75)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Et(a,b){a=a|0;b=b|0;var d=0;d=a+92|0;do{c[a>>2]=c[b>>2];a=a+4|0;b=b+4|0}while((a|0)<(d|0));return}function Ft(a,b){a=a|0;b=b|0;Pa(a|0,b|0)}function Gt(a,b){a=a|0;b=b|0;Oa(a|0,b|0)}function Ht(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Og(a,b,c,d);return}function It(a){a=a|0;if(!a){a=0;return a|0}a=xr(a)|0;return a|0}function Jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(99)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Kt(a,b){a=a|0;b=b|0;return +(+Iy(+g[a>>2],+g[a+4>>2],+g[a+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]))}function Lt(a,b){a=a|0;b=b|0;var c=0;c=Ds(88)|0;qn(c,a,b);return c|0}function Mt(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function Nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(79)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ot(a){a=a|0;var b=0;b=l;l=l+16|0;c[b>>2]=gJ(c[a+60>>2]|0)|0;a=SC(ab(6,b|0)|0)|0;l=b;return a|0}function Pt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(35)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Qt(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Eb[a&3](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Rt(a){a=a|0;var b=0;b=l;l=l+16|0;Ob[c[(c[a>>2]|0)+44>>2]&127](a,b);l=b;return}function St(a){a=a|0;Tf(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Tt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,d,e);return}function Ut(a){a=a|0;c[a>>2]=2976;g[a+4>>2]=1.0;c[a+8>>2]=0;c[a+12>>2]=1;c[a+16>>2]=-1;c[a+20>>2]=0;return}function Vt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8692;c[b+56>>2]=2;return b|0}function Wt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8588;c[b+56>>2]=0;return b|0}function Xt(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=4096;c[a+12>>2]=4096;c[a+16>>2]=0;c[a+20>>2]=1;return}function Yt(a,b,d){a=a|0;b=b|0;d=d|0;xe(c[a+108>>2]|0,c[a+136>>2]|0,b,d);return}function Zt(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Rq(a,c)|0;l=c;return a|0}function _t(a,b){a=a|0;b=b|0;var c=0;c=jt()|0;jr(c,a,b);return c|0}function $t(a){a=a|0;if(!a){a=0;return a|0}a=Or(a)|0;return a|0}function au(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+64>>2]&127](a,b,d);return}function bu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0.0}function cu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+80>>2]&127](a,b,d,e);return}function du(a){a=a|0;if(!a){a=0;return a|0}a=Dr(a)|0;return a|0}function eu(a){a=a|0;if(!a){a=0;return a|0}a=Er(a)|0;return a|0}function fu(a){a=a|0;if(!a){a=0;return a|0}a=Fr(a)|0;return a|0}function gu(){var a=0;a=l;l=l+16|0;if(!(ib(28556,265)|0)){l=a;return}else Ww(22065,a)}function hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;return +rb[a&3](b|0,c|0,d|0,+e,f|0,g|0)}function iu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Js(a,c)|0;l=c;return a|0}function ju(a){a=a|0;if(c[a+204>>2]&3|0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function ku(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;zb[c[(c[a>>2]|0)+8>>2]&31](a,c[b+36>>2]|0)|0;return}function lu(a,b){a=a|0;b=b|0;vr(a,b);$s(a+48|0,b+48|0,b+52|0,b+56|0);return}function mu(a,b,d){a=a|0;b=b|0;d=d|0;Tg(c[a+108>>2]|0,b,d);return}function nu(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+192>>2]=b;c[a+200>>2]=b;return}function ou(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;$b[a&7](b|0,c|0,d|0,e|0,f|0,g|0)}function pu(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=+i;j=j|0;k=+k;l=l|0;T(36)}function qu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+24>>2]&127](a,b,d,e);return}function ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-3);return}function su(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);return}function tu(b,d){b=b|0;d=d|0;b=(a[b+344>>0]|0)==0?3:0;c[d>>2]=b;c[d+4>>2]=b;return}function uu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;a=Rq(a,c)|0;l=c;return a|0}function vu(a,b,d){a=a|0;b=+b;d=d|0;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,.01666666753590107)|0}function wu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b<>>32-c;return a<>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;return}function yu(a){a=a|0;lk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function zu(a){a=a|0;var b=0;b=c[a+68>>2]|0;Ob[c[(c[b>>2]|0)+32>>2]&127](b,c[a+24>>2]|0);return}function Au(a,b){a=a|0;b=b|0;wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Bu(a,b,d,e){a=a|0;b=+b;d=d|0;e=+e;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,e)|0}function Cu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Du(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=0;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Eu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=1065353216;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Fu(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+8>>2]&127](a,b,c[(c[a+8>>2]|0)+48>>2]|0);return}function Gu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;_b[a&0](b|0,c|0,d|0,e|0,f|0,+g)}function Hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;Ub[a&0](b|0,c|0,d|0,+e,f|0,g|0)}function Iu(a,b){a=a|0;b=b|0;xo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ju(a){a=a|0;qC(a+144|0);qC(a+124|0);qC(a+104|0);return}function Ku(b,d,e){b=b|0;d=d|0;e=+e;g[(c[b+780>>2]|0)+(d*104|0)+88>>2]=e>0.0?1.0/e:0.0;a[b+984>>0]=1;return}function Lu(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+20>>2]&7](a,b,d);return}function Mu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Nu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+124>>2]&127](a,e,b,d);return}function Ou(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+112>>2]=b;c[a+116>>2]=d;c[a+120>>2]=e;return}function Pu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Cb[c[(c[a>>2]|0)+8>>2]&31](a,b,d,e)|0;return}function Qu(a,b){a=a|0;b=b|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-1);return}function Su(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;$s(a,b,d,e);c[a+12>>2]=c[f>>2];return}function Tu(b,c,d,e){b=b|0;c=c|0;d=+d;e=+e;a[b+737>>0]=c&1;g[b+680>>2]=d;g[b+684>>2]=e;return}function Uu(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;fo(a,b,c,d,e,f);return}function Vu(a){a=a|0;bk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Wu(a){a=a|0;rk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Xu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;g=g|0;Lb[a&0](b|0,+c,+d,e|0,f|0,g|0)}function Yu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 1.0}function Zu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return}function _u(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(19);return 0}function $u(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,e);return}function av(a){a=a|0;Qg(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function bv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(9);return 0.0}function cv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Yi(a,b,c,d,e);return}function dv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;bg(a,b,c,d,e);return}function ev(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Qa(a|0,b|0,+c,d|0)}function fv(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;Qb[c[(c[a>>2]|0)+28>>2]&7](a,b,d,e);return}function gv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Db[a&1](b|0,c|0,d|0,e|0,f|0)|0}function hv(a,b){a=a|0;b=b|0;Ce(a,b);return}function iv(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=i|0;j=j|0;k=+k;T(37)}function jv(a,b){a=a|0;b=b|0;Tg(c[a+108>>2]|0,b,1);return}function kv(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;ur(a+4|0,b);return}function lv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return +tb[a&15](b|0,c|0,d|0,e|0,f|0)}function mv(a,b){a=a|0;b=b|0;var c=0;c=Xs()|0;ig(c,a,b);return c|0}function nv(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Ui(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (b|0?b:a)|0}function ov(a,b){a=a|0;b=b|0;yq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function pv(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;Js(a,c)|0;l=c;return}function qv(a,b){a=a|0;b=+b;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,1,.01666666753590107)|0}function rv(a){a=a|0;var b=0;b=Ds(8)|0;hw(b,a);return b|0}function sv(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,d);return}function tv(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function uv(b){b=b|0;if((c[b+56>>2]|0)==0?(a[b+44>>0]&1)==0:0){b=0;return b|0}b=1;return b|0}function vv(a){a=a|0;ii(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function wv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(43)}function xv(a){a=a|0;tj(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function yv(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;fo(a,b,c,d,e,1.0);return}function zv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;return +pb[a&3](b|0,c|0,+d,e|0,f|0)}function Av(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Tu(a,b,c,d);return}function Bv(a,b,c){a=a|0;b=b|0;c=c|0;return +Sa(a|0,b|0,c|0)}function Cv(a){a=a|0;c[a>>2]=8404;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Dv(a,b){a=a|0;b=b|0;return c[(bC(c[a+28>>2]|0,b)|0)+64>>2]|0}function Ev(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Zb[a&31](b|0,c|0,d|0,e|0,f|0)}function Fv(a){a=a|0;if(!(c[a+12>>2]|0)){a=0;return a|0}a=c[a+20>>2]|0;return a|0}function Gv(a){a=a|0;et(a);Dw(a);return}function Hv(a){a=a|0;qm(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Iv(a,b){a=a|0;b=b|0;var c=0;c=Ds(64)|0;Dq(c,a,b);return c|0}function Jv(){var a=0;a=Ds(24)|0;Xt(a);return a|0}function Kv(a,b,d){a=a|0;b=b|0;d=+d;Jb[c[(c[a>>2]|0)+16>>2]&31](a,d);return}function Lv(a,b,c){a=a|0;b=b|0;c=c|0;yo(a,b,c);return}function Mv(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,2,-3);return}function Nv(a,b,d){a=a|0;b=+b;d=d|0;Mb[c[(c[a>>2]|0)+32>>2]&15](a,b,d);return}function Ov(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;return}function Pv(a){a=a|0;ji(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Qv(a){a=a|0;ni(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Rv(a,b,d){a=a|0;b=b|0;d=d|0;return +(+qb[c[(c[a>>2]|0)+32>>2]&31](a,b,d))}function Sv(a,b){a=a|0;b=b|0;$o(a,b);return}function Tv(a,b){a=a|0;b=b|0;$o(a,b);return}function Uv(a,b){a=a|0;b=b|0;$o(a,b);return}function Vv(a,b){a=a|0;b=b|0;return c[(aE(c[a+336>>2]|0,b)|0)>>2]|0}function Wv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Wb[a&1](b|0,c|0,d|0,e|0,+f)}function Xv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;Rb[a&0](b|0,c|0,+d,e|0,f|0)}function Yv(a){a=a|0;c[a>>2]=4652;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Zv(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(8);return 0.0}function _v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+16>>2]&127](a,b);return}function $v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+52>>2]&127](a,b);return}function aw(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+8>>2]&7](a,b,d);return}function bw(a,b){a=a|0;b=b|0;wA(a,b);return}function cw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Qc(a,b,c,d)|0;return 1}function dw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;as(a,b,c,d,e);return}function ew(a){a=a|0;var b=0;b=Xs()|0;ig(b,a,1);return b|0}function fw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+232>>2]=b;return}function gw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+252>>2]=b;return}function hw(a,b){a=a|0;b=b|0;CH(a);c[a>>2]=5148;c[a+4>>2]=b;return}function iw(a,b){a=a|0;b=b|0;pr(a,b);return}function jw(a,b){a=a|0;b=b|0;wr(a,b);return}function kw(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,1,-1);return}function lw(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;A=c[j+4>>2]|0;return b|0}function mw(a,b,c){a=a|0;b=b|0;c=c|0;Wh(b,c);return}function nw(a,b){a=a|0;b=b|0;Rn(a,b);return}function ow(a){a=a|0;c[a>>2]=2928;c[a+4>>2]=1;c[a+8>>2]=-1;g[a+12>>2]=0.0;return}function pw(a){a=a|0;rd(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function qw(a){a=a|0;var b=0;b=((c[a+56>>2]|0)+2|0)%3|0;return +(+g[(gJ(a+32|0)|0)+(b<<2)>>2])}function rw(a){a=a|0;c[a>>2]=3148;g[a+4>>2]=1.0;c[a+8>>2]=1;c[a+12>>2]=-1;return}function sw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (A=d,a-c>>>0|0)|0}function tw(a,b){a=a|0;b=b|0;return c[(aE(c[a+12>>2]|0,b)|0)>>2]|0}function uw(a,b){a=a|0;b=b|0;if((c[a+220>>2]&-2|0)==4)return;c[a+220>>2]=b;return}function vw(a,b){a=a|0;b=b|0;Hr(a,b);return}function ww(a,b){a=a|0;b=b|0;Ir(a,b);return}function xw(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,0);return}function yw(a,b){a=a|0;b=+b;ry(a,b);return}function zw(a,b){a=a|0;b=b|0;return BB(a,b)|0}function Aw(a,b){a=a|0;b=b|0;return zb[c[(c[a>>2]|0)+40>>2]&31](a,b)|0}function Bw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+60>>2]&127](a,b);return}function Cw(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function Dw(b){b=b|0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;return}function Ew(a){a=a|0;var b=0;b=Ds(64)|0;cn(b,a);return b|0}function Fw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}function Gw(a,b){a=a|0;b=b|0;xn(a,b);return}function Hw(a,b){a=a|0;b=b|0;zn(a,b);return}function Iw(a,b){a=a|0;b=b|0;An(a,b);return}function Jw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Cb[a&31](b|0,c|0,d|0,e|0)|0}function Kw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);return}function Lw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+128>>2]&127](a,b);return}function Mw(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);return b|0}function Nw(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(42)}function Ow(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return (A=b+d+(a+c>>>0>>>0>>0|0)>>>0,a+c>>>0|0)|0}function Pw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+40>>2]&127](a,b);return}function Qw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+256>>2]=b;return}function Rw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+84>>2]&127](a,b);return}function Sw(a){a=a|0;var b=0;b=ut()|0;Rf(b,a,0);return b|0}function Tw(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Lm(a,b,c,d);return}function Uw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+28>>2]&127](a,b);return}function Vw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+124>>2]&127](a,b);return}function Ww(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;Ik(a,d);rn();bb()}function Xw(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+236>>2]=b;return}function Yw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return +sb[a&1](b|0,c|0,d|0,e|0)}function Zw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+72>>2]&127](a,b);return}function _w(){var a=0;a=rt()|0;lg(a,0,0,16);return a|0}function $w(a){a=a|0;var b=0;b=Ds(284)|0;Gj(b,a);return b|0}function ax(a,b){a=a|0;b=+b;g[a+44>>2]=b;g[a+48>>2]=+F(+b);return}function bx(a,b){a=a|0;b=+b;return +(+nb[c[(c[a>>2]|0)+16>>2]&15](a)*b)}function cx(a){a=a|0;pv(a,+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]));return}function dx(a,b){a=a|0;b=b|0;Uv(a+928|0,b);return}function ex(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function fx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+232>>2]=b;return}function gx(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(18);return 0}function hx(a,b){a=a|0;b=b|0;Oe(a,b);return}function ix(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(7);return 0.0}function jx(a,b,c){a=a|0;b=b|0;c=c|0;xi(a,b,c);return}function kx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Vb[a&127](b|0,c|0,d|0,e|0)}function lx(a,b,c){a=a|0;b=b|0;c=c|0;ll(a,b,c);return}function mx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Pm(a,b,c,d);return}function nx(a,b){a=a|0;b=b|0;xf(a,b);return}function ox(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+68>>2]&127](a,b);return}function px(a){a=a|0;if(!a)return;Ib[c[(c[a>>2]|0)+4>>2]&511](a);return}function qx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+228>>2]=b;return}function rx(){var a=0;a=Xs()|0;ig(a,1,1);return a|0}function sx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+8>>2]&127](a,b);return}function tx(a){a=a|0;return jF(c[a+204>>2]|0)|0}function ux(a,b,c){a=a|0;b=+b;c=+c;my(a,b,c);return}function vx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+20>>2]&31](a,b);return}function wx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Fl(a,b,c,d);return}function xx(a,b){a=a|0;b=b|0;nw(a+848|0,b);return}function yx(a){a=a|0;return MF(+g[a>>2],+g[a+4>>2])|0}function zx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+16>>2]&31](a,b);return}function Ax(a,b){a=a|0;b=b|0;return +(+g[(c[a+136>>2]|0)+(b*284|0)+232>>2])}function Bx(){var a=0;a=Ds(176)|0;Ne(a,0);return a|0}function Cx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+24>>2]&127](a,b);return}function Dx(a,b){a=a|0;b=b|0;c[a+68>>2]=b;return}function Ex(a,b,d){a=a|0;b=b|0;d=d|0;c[a+20>>2]=b;c[a+28>>2]=d;return}function Fx(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16>>2]=b;c[a+24>>2]=d;return}function Gx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function Hx(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=+e;return yb[a&1](b|0,+c,d|0,+e)|0}function Ix(a,b,c){a=a|0;b=b|0;c=+c;Um(a,b,c);return}function Jx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+64>>2]&127](a,b);return}function Kx(a){a=a|0;var b=0;b=((gJ(c[a+252>>2]|0)|0)&2|0)==0;return (b?0:a)|0}function Lx(a,b){a=a|0;b=b|0;return nC(c[a+12>>2]|0,b)|0}function Mx(a,b){a=a|0;b=b|0;return wC(c[a+12>>2]|0,b)|0}function Nx(a,b){a=a|0;b=b|0;return xC(c[a+12>>2]|0,b)|0}function Ox(a,b,c){a=a|0;b=b|0;c=c|0;dm(a,b,c);return}function Px(a,b,c){a=a|0;b=b|0;c=+c;g[a+1340+(b<<2)>>2]=c;return}function Qx(a,b,c){a=a|0;b=b|0;c=c|0;return jc(a,b,c)|0}function Rx(a,b,c){a=a|0;b=b|0;c=+c;mr(a,b,c);return}function Sx(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);cJ(a);return}function Tx(a,b){a=a|0;b=b|0;Ln(a,b);return}function Ux(a,b){a=a|0;b=b|0;Gw(a+768|0,b);return}function Vx(a,b){a=a|0;b=b|0;Hw(a+788|0,b);return}function Wx(a,b){a=a|0;b=b|0;Iw(a+808|0,b);return}function Xx(a){a=a|0;if(!a)return;yF(a);cJ(a);return}function Yx(a,b){a=a|0;b=+b;g[a+32>>2]=b;g[a+36>>2]=b;return}function Zx(a,b,c){a=a|0;b=b|0;c=+c;g[a+1364+(b<<2)>>2]=c;return}function _x(a,b){a=a|0;b=b|0;re(a,b);return}function $x(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;Tb[a&15](b|0,c|0,d|0,+e)}function ay(a){a=a|0;if(!a)return;qC(a);cJ(a);return}function by(a){a=+a;var b=0;b=Dt()|0;sm(b,a);return b|0}function cy(a,b){a=a|0;b=b|0;kv(a,b);return}function dy(a,b){a=a|0;b=+b;g[a+136>>2]=b;return}function ey(a,b){a=a|0;b=+b;uz(a,b);return}function fy(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;Qb[a&7](b|0,c|0,+d,e|0)}function gy(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;Nb[a&0](b|0,+c,d|0,e|0)}function hy(a,b){a=a|0;b=+b;g[a+132>>2]=b;return}function iy(a,b){a=a|0;b=b|0;Vr(a,b);return}function jy(a,b){a=a|0;b=b|0;Wr(a,b);return}function ky(a){a=a|0;var b=0;b=gJ(a+32|0)|0;return +(+g[b+(c[a+56>>2]<<2)>>2])}function ly(a,b){a=a|0;b=b|0;c[a+24>>2]=b;return}function my(a,b,c){a=a|0;b=+b;c=+c;g[a+532>>2]=b;g[a+536>>2]=c;return}function ny(){var a=0;a=ut()|0;Rf(a,1,0);return a|0}function oy(a,b){a=a|0;b=b|0;return IC(a,b)|0}function py(a,b){a=a|0;b=b|0;g[a+56>>2]=+(b|0);return}function qy(a){a=a|0;var b=0;b=l;l=l+16|0;Hb[a&3]();Ww(22168,b)}function ry(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=1;return}function sy(a,b){a=a|0;b=b|0;return c[(c[a+20>>2]|0)+(b<<2)>>2]|0}function ty(a){a=a|0;return +(+rI(+g[a+16>>2]))}function uy(a){a=a|0;return xb[c[(c[a>>2]|0)+40>>2]&127](a)|0}function vy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==4;return (b?a:0)|0}function wy(a){a=a|0;return +(+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]))}function xy(a,b){a=a|0;b=+b;dC(a,b);return}function yy(){var a=0;a=Ds(64)|0;co(a);return a|0}function zy(a,b){a=a|0;b=b|0;_B(a,b);return}function Ay(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+44>>2]&31](a,b);return}function By(a,b){a=a|0;b=b|0;Eq(a,b);return}function Cy(a,b){a=a|0;b=+b;g[a+140>>2]=b;return}function Dy(a){a=a|0;return nG(+g[a+4>>2])|0}function Ey(a){a=a|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Fy(a,b){a=a|0;b=b|0;iD(a,b);return}function Gy(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)+92|0}function Hy(a,b){a=a|0;b=b|0;return Vv(a,b)|0}function Iy(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;return +(a*d+b*e+c*f)}function Jy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==8;return (b?a:0)|0}function Ky(){var a=0;a=Ds(24)|0;Tr(a);return a|0}function Ly(a,b){a=a|0;b=b|0;Hq(a,b);return}function My(a,b){a=a|0;b=+b;UC(a,b);return}function Ny(a){a=a|0;g[a>>2]=.30000001192092896;g[a+4>>2]=1.0;g[a+8>>2]=0.0;return}function Oy(a,b){a=a|0;b=+b;yC(a,b);return}function Py(a,b){a=a|0;b=b|0;jD(a,b);return}function Qy(a,b){a=a|0;b=b|0;ur(a+4|0,b);return}function Ry(a){a=a|0;return QF(c[a+204>>2]|0)|0}function Sy(a,b){a=a|0;b=+b;WC(a,b);return}function Ty(a,b){a=a|0;b=+b;cA(a,b);return}function Uy(a,b){a=a|0;b=+b;XC(a,b);return}function Vy(a,b){a=a|0;b=+b;dA(a,b);return}function Wy(a,b){a=a|0;b=b|0;vt(a,b);return}function Xy(a,b){a=a|0;b=b|0;Jq(a,b);return}function Yy(a){a=a|0;return +(+rI(+g[a+104>>2]))}function Zy(a){a=a|0;return +(+RD(+g[a+12>>2]))}function _y(b,c){b=b|0;c=c|0;a[b+32>>0]=c&1;return}function $y(a){a=a|0;return HF(c[a+8>>2]|0)|0}function az(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Bb[a&63](b|0,c|0,d|0)|0}function bz(a,b){a=a|0;b=b|0;return +(+Ro(a,b))}function cz(a,b){a=a|0;b=b|0;xi(a,b,1);return}function dz(a,b){a=a|0;b=b|0;DC(a,b);return}function ez(a,b){a=a|0;b=b|0;c[a+8>>2]=b<<16>>16;return}function fz(a){a=a|0;if(!a)a=0;else a=(fj(a,2864)|0)!=0;return a&1|0}function gz(a){a=a|0;Jj(a);cJ(a);return}function hz(a,b){a=a|0;b=+b;bF(a,b);return}function iz(a,b){a=a|0;b=b|0;Im(a,b);return}function jz(a,b){a=a|0;b=+b;g[a+120>>2]=b;return}function kz(a,b){a=a|0;b=b|0;kB(a,b,+uE(b));return}function lz(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);return}function mz(a,b){a=a|0;b=b|0;TC(a,b);return}function nz(a,b){a=a|0;b=b|0;lu(a,b);return}function oz(){var a=0;a=Ds(100)|0;Mm(a);return a|0}function pz(a,b){a=a|0;b=+b;g[a+116>>2]=b;return}function qz(a,b){a=a|0;b=+b;g[a+128>>2]=b;return}function rz(a,b){a=a|0;b=b|0;JC(a,b);return}function sz(a,b){a=a|0;b=b|0;c[a+12>>2]=b<<16>>16;return}function tz(a,b){a=a|0;b=b|0;return c[(c[a+236>>2]|0)+(b<<2)>>2]|0}function uz(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=0;return}function vz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +qb[a&31](b|0,c|0,d|0)}function wz(a,b){a=a|0;b=b|0;KC(a,b);return}function xz(a,b){a=a|0;b=b|0;return jc(a,b,8192)|0}function yz(b,c){b=b|0;c=c|0;a[b+124>>0]=c&1;return}function zz(){var a=0;a=Ds(12)|0;Ny(a);return a|0}function Az(a,b){a=a|0;b=b|0;c[a+16>>2]=b<<16>>16;return}function Bz(a){a=a|0;if(!a)return;Ju(a);cJ(a);return}function Cz(a){a=a|0;return xb[c[(c[a>>2]|0)+48>>2]&127](a)|0}function Dz(a){a=a|0;ow(a);c[a>>2]=2904;return}function Ez(a){a=a|0;return pG(a)|0}function Fz(a,b){a=a|0;b=+b;Xw(a,b);return}function Gz(a,b){a=a|0;b=b|0;return +(+wf(a,b))}function Hz(a){a=a|0;return +(+rI(+g[a+124>>2]))}function Iz(){var a=0;a=Ds(4)|0;cC(a);return a|0}function Jz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return}function Kz(a){a=a|0;return kG(c[a+204>>2]|0)|0}function Lz(a,b){a=a|0;b=+b;SD(a,b);return}function Mz(a,b){a=a|0;b=b|0;yh(a,b);return}function Nz(a,b){a=a|0;b=+b;BD(a,b);return}function Oz(a){a=a|0;return xb[c[(c[a>>2]|0)+28>>2]&127](a)|0}function Pz(a,b){a=a|0;b=b|0;return Dv(a,b)|0}function Qz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return Ab[a&7](b|0,c|0,+d)|0}function Rz(a){a=a|0;return uv(a)|0}function Sz(a){a=a|0;return +(+g[a+136>>2])}function Tz(a){a=a|0;return qA(c[a+68>>2]|0)|0}function Uz(b){b=b|0;if((a[b>>0]|0)==1)b=0;else{a[b>>0]=1;b=1}return b|0}function Vz(b,c){b=b|0;c=c|0;a[b+80>>0]=c&1;return}function Wz(a,b){a=a|0;b=b|0;YC(a,b);return}function Xz(a){a=a|0;return +(+g[a+132>>2])}function Yz(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)|0}function Zz(a,b){a=a|0;b=b|0;bD(a,b);return}function _z(a){a=a|0;c[a+4>>2]=(c[a+4>>2]|0)+-1;return}function $z(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;T(41)}function aA(a){a=a|0;return AD(a)|0}function bA(a){a=a|0;Dw(a);return}function cA(a,b){a=a|0;b=+b;g[a+196>>2]=+ot(b);return}function dA(a,b){a=a|0;b=+b;g[a+192>>2]=+ot(b);return}function eA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Sb[a&127](b|0,c|0,d|0)}function fA(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))wk(b,d,a);return}function gA(a,b){a=a|0;b=b|0;ur(a+92|0,b);return}function hA(a,b){a=a|0;b=+b;g[a+104>>2]=b;return}function iA(a){a=a|0;cj(a);cJ(a);return}function jA(a,b){a=a|0;b=+b;g[a+268>>2]=b;return}function kA(a){a=a|0;return +(+rI(+g[a+80>>2]))}function lA(a,b){a=a|0;b=b|0;c[b+780>>2]=0;return}function mA(a,b){a=a|0;b=b|0;vk(a,b);return}function nA(){c[5957]=1065353216;c[5958]=0;c[5959]=0;g[5960]=0.0;return}function oA(a,b){a=a|0;b=+b;fx(a,b);return}function pA(a){a=a|0;return +(+nb[c[(c[a>>2]|0)+48>>2]&15](a))}function qA(a){a=a|0;return xb[c[(c[a>>2]|0)+36>>2]&127](a)|0}function rA(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function sA(a,b){a=a|0;b=b|0;Ld(a,b);return}function tA(a,b){a=a|0;b=b|0;CD(a,b);return}function uA(a){a=a|0;return +(+g[a+140>>2])}function vA(b){b=b|0;return (a[b+32>>0]&1)!=0|0}function wA(b,c){b=b|0;c=c|0;a[b+250>>0]=c&1;return}function xA(a,b){a=a|0;b=b|0;ss(a,b);return}function yA(a,b){a=a|0;b=b|0;Xn(a+348|0,b);return}function zA(a,b){a=a|0;b=b|0;return Kx(b)|0}function AA(a,b){a=a|0;b=+b;g[a+112>>2]=b;return}function BA(a,b){a=a|0;b=b|0;yh(b,a);return}function CA(b,c){b=b|0;c=c|0;a[b+44>>0]=c&1;return}function DA(a){a=a|0;return cH(a)|0}function EA(a){a=a|0;return dH(a)|0}function FA(a){a=a|0;return iH(a)|0}function GA(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(17);return 0}function HA(a){a=a|0;_z(a);return}function IA(a,b){a=a|0;b=b|0;mA(a,b);return}function JA(a,b){a=a|0;b=b|0;return Jy(b)|0}function KA(a,b){a=a|0;b=b|0;c[a+52>>2]=b&1;return}function LA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;return}function MA(a,b,c){a=+a;b=+b;c=+c;return +(+VI(+_A(a,b,c)))}function NA(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Mb[a&15](b|0,+c,d|0)}function OA(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Jk(a,b)|0;return a|0}function PA(a,b){a=a|0;b=+b;g[a+220>>2]=b;return}function QA(a,b){a=a|0;b=+b;g[a+100>>2]=b;return}function RA(b){b=b|0;return (a[b+124>>0]&1)!=0|0}function SA(b,c){b=b|0;c=c|0;a[b+24>>0]=c&1;return}function TA(a){a=a|0;return ~~+g[a+56>>2]|0}function UA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+8+(b<<2)>>2]=d;return}function VA(b,c){b=b|0;c=c|0;a[b+288>>0]=c&1;return}function WA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;Pb[a&7](b|0,c|0,+d)}function XA(a,b){a=a|0;b=+b;g[a+224>>2]=b;return}function YA(a,b){a=a|0;b=+b;qx(a,b);return}function ZA(a){a=a|0;return GC(c[a+220>>2]|0)|0}function _A(a,b,c){a=+a;b=+b;c=+c;return +(+Iy(a,b,c,a,b,c))}function $A(a){a=+a;if(!(a<-1.0)){if(a>1.0)a=1.0}else a=-1.0;return +(+I(+a))}function aB(a){a=a|0;return +(+g[a+120>>2])}function bB(b,c){b=b|0;c=c|0;a[b+16>>0]=c&1;return}function cB(a){a=a|0;return tE(a)|0}function dB(a,b){a=a|0;b=b|0;Vm(a+104|0,b);return}function eB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(4);return 0.0}function fB(a,b){a=a|0;b=+b;g[a+204>>2]=b;return}function gB(a,b){a=a|0;b=+b;g[a+208>>2]=b;return}function hB(a){a=a|0;return +(+g[a+116>>2])}function iB(a){a=a|0;return +(+g[a+128>>2])}function jB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function kB(a,b,c){a=a|0;b=b|0;c=+c;qo(a,b,1.0/c);return}function lB(a){a=a|0;nf(a);cJ(a);return}function mB(a,b){a=a|0;b=b|0;var c=0;c=KB(a|0)|0;return ((b|0)==0?a:c)|0}function nB(a,b){a=a|0;b=+b;g[a+216>>2]=b;return}function oB(b){b=b|0;return (a[b+80>>0]&1)!=0|0}function pB(a,b){a=a|0;b=b|0;c[a+36>>2]=b;return}function qB(a,b){a=a|0;b=b|0;c[a+32>>2]=b;return}function rB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ye(a,b,c,d,0)|0}function sB(a,b){a=a|0;b=+b;g[a+248>>2]=b;return}function tB(b,c){b=b|0;c=c|0;a[b+260>>0]=c&1;return}function uB(b,c){b=b|0;c=c|0;a[b+25>>0]=c&1;return}function vB(a,b,c){a=a|0;b=+b;c=c|0;return}function wB(a,b){a=a|0;b=b|0;c[a+72>>2]=b;return}function xB(a){a=a|0;uu(a,+uE(a))|0;return}function yB(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Kb[a&7](b|0,+c,+d)}function zB(a){a=a|0;return +(+GH(+g[a+12>>2]))}function AB(a,b){a=a|0;b=b|0;c[a+8>>2]=b;return}function BB(a,b){a=a|0;b=b|0;return a+868+(b<<6)|0}function CB(a){a=a|0;return zH(a)|0}function DB(a,b){a=a|0;b=b|0;return +(+_s(a,b))}function EB(a){a=a|0;return c[a+8>>2]&65535|0}function FB(a,b){a=a|0;b=b|0;c[a+220>>2]=b;return}function GB(b,c){b=b|0;c=c|0;a[b+26>>0]=c&1;return}function HB(b,c){b=b|0;c=c|0;a[b+84>>0]=c&1;return}function IB(a){a=a|0;Gi(a);cJ(a);return}function JB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(40)}function KB(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function LB(a){a=a|0;return HH(a)|0}function MB(a){a=a|0;return VE(a)|0}function NB(a){a=a|0;return (c[a+108>>2]|0)+4|0}function OB(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return}function PB(a){a=a|0;return c[a+12>>2]&65535|0}function QB(a){a=a|0;if(!a)return;Ey(a);return}function RB(a,b){a=a|0;b=b|0;Vm(a+28|0,b);return}function SB(a,b,c){a=a|0;b=b|0;c=c|0;return zb[a&31](b|0,c|0)|0}function TB(a,b){a=a|0;b=+b;g[a+244>>2]=b;return}function UB(a,b){a=a|0;b=+b;g[a+240>>2]=b;return}function VB(a){a=a|0;return +(+g[a+104>>2])}function WB(a,b){a=a|0;b=b|0;return Nl(a,b)|0}function XB(a){a=a|0;return MH(a)|0}function YB(a){a=a|0;return c[a+16>>2]&65535|0}function ZB(a){a=a|0;kk(a);cJ(a);return}function _B(b,c){b=b|0;c=c|0;a[b+524>>0]=c&1;return}function $B(a){a=a|0;return ((a|0)==0?1:a<<1)|0}function aC(a,b){a=a|0;b=b|0;return a+(b*96|0)|0}function bC(a,b){a=a|0;b=b|0;return a+(b*80|0)|0}function cC(a){a=a|0;NG(a);c[a>>2]=3e3;return}function dC(a,b){a=a|0;b=+b;g[a+272>>2]=b;return}function eC(a,b){a=a|0;b=+b;g[a+212>>2]=b;return}function fC(a,b){a=a|0;b=+b;g[a+228>>2]=b;return}function gC(a){a=a|0;return +(+g[a+268>>2])}function hC(b){b=b|0;return (a[b+44>>0]&1)!=0|0}function iC(a){a=a|0;return gJ(c[a+84>>2]|0)|0}function jC(a,b){a=a|0;b=b|0;return Xo(a,b)|0}function kC(a,b){a=a|0;b=b|0;return Wo(a,b)|0}function lC(a,b){a=a|0;b=b|0;return +(+Gp(a,b))}function mC(a){a=a|0;return +(+ky(a))}function nC(a,b){a=a|0;b=b|0;return a+(b*104|0)|0}function oC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;T(39)}function pC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(33)}function qC(a){a=a|0;Gv(a);return}function rC(a,b){a=a|0;b=+b;g[a+252>>2]=b;return}function sC(a){a=a|0;return +(+g[a+96>>2])}function tC(a){a=a|0;return YH(a)|0}function uC(a){a=a|0;return (c[a+52>>2]|0)!=0|0}function vC(a){a=a|0;Qi(a);cJ(a);return}function wC(a,b){a=a|0;b=b|0;return a+(b*52|0)|0}function xC(a,b){a=a|0;b=b|0;return a+(b*44|0)|0}function yC(a,b){a=a|0;b=+b;g[a+276>>2]=b;return}function zC(a){a=a|0;bA(a);return}function AC(a){a=a|0;return gJ(c[a+88>>2]|0)|0}function BC(a){a=a|0;return gJ(c[a+780>>2]|0)|0}function CC(b){b=b|0;return (a[b+24>>0]&1)!=0|0}function DC(b,c){b=b|0;c=c|0;a[b+552>>0]=c&1;return}function EC(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function FC(a){a=a|0;return +(+g[a+112>>2])}function GC(a){a=a|0;a=gJ(a)|0;return (a|0)!=5&(a|0)!=2|0}function HC(a){a=a|0;mk(a);cJ(a);return}function IC(a,b){a=a|0;b=b|0;return a+4+(b*192|0)|0}function JC(b,c){b=b|0;c=c|0;a[b+736>>0]=c&1;return}function KC(a,b){a=a|0;b=b|0;c[a+204>>2]=b;return}function LC(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;T(24)}function MC(a,b){a=a|0;b=+b;g[a+232>>2]=b;return}function NC(a,b){a=a|0;b=+b;g[a+280>>2]=b;return}function OC(a,b){a=a|0;b=+b;g[a+236>>2]=b;return}function PC(a){a=a|0;return +(+g[a+272>>2])}function QC(a,b){a=a|0;b=+b;return uu(a,b)|0}function RC(b){b=b|0;return (a[b+16>>0]&1)!=0|0}function SC(a){a=a|0;if(a>>>0>4294963200){c[7137]=0-a;a=-1}return a|0}function TC(b,c){b=b|0;c=c|0;a[b+21>>0]=c&1;return}function UC(a,b){a=a|0;b=+b;g[a+684>>2]=b;return}function VC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(16);return 0}function WC(a,b){a=a|0;b=+b;g[a+188>>2]=b;return}function XC(a,b){a=a|0;b=+b;g[a+184>>2]=b;return}function YC(a,b){a=a|0;b=b|0;c[a+256>>2]=b;return}function ZC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(6);return 0.0}function _C(a){a=a|0;return +(+g[a+220>>2])}function $C(a){a=a|0;return +(+g[a+100>>2])}function aD(a){a=a|0;return gJ(c[a+120>>2]|0)|0}function bD(b,c){b=b|0;c=c|0;a[b+737>>0]=c&1;return}function cD(a,b){a=a|0;b=+b;g[a+256>>2]=b;return}function dD(a){a=a|0;return +(+g[a+224>>2])}function eD(a,b){a=a|0;b=b|0;return vs(a,b)|0}function fD(a,b){a=a|0;b=b|0;return us(a,b)|0}function gD(a){a=a|0;return hh(a)|0}function hD(b,c){b=b|0;c=c|0;a[b+152>>0]=c&1;return}function iD(a,b){a=a|0;b=b|0;c[a+84>>2]=b;return}function jD(a,b){a=a|0;b=b|0;c[a+88>>2]=b;return}function kD(a,b){a=a|0;b=b|0;c[a+92>>2]=b;return}function lD(a,b){a=a|0;b=b|0;c[a+100>>2]=b;return}function mD(a,b){a=a|0;b=b|0;c[a+96>>2]=b;return}function nD(a){a=a|0;return (c[a+48>>2]|0)==1|0}function oD(a){a=a|0;nk(a);cJ(a);return}function pD(a){a=a|0;Hk(a);cJ(a);return}function qD(a,b){a=a|0;b=b|0;return (a|0)==(b|0)|0}function rD(a,b){a=a|0;b=b|0;if(!p){p=a;q=b}}function sD(b){b=b|0;return (a[b+260>>0]&1)!=0|0}function tD(a){a=a|0;return gJ(c[a+108>>2]|0)|0}function uD(a){a=a|0;return gJ(c[a+112>>2]|0)|0}function vD(a){a=a|0;return gJ(c[a+776>>2]|0)|0}function wD(a){a=a|0;return gJ(c[a+772>>2]|0)|0}function xD(b){b=b|0;return (a[b+25>>0]&1)!=0|0}function yD(a,b){a=a|0;b=b|0;return c[a+24+(b<<2)>>2]|0}function zD(a){a=a|0;return (c[a+96>>2]|0)+4|0}function AD(a){a=a|0;return gJ(c[a+328>>2]|0)|0}function BD(a,b){a=a|0;b=+b;g[a+440>>2]=b;return}function CD(a,b){a=a|0;b=b|0;c[a+264>>2]=b;return}function DD(a,b,c){a=a|0;b=b|0;c=c|0;Ob[a&127](b|0,c|0)}function ED(a,b,c){a=a|0;b=b|0;c=+c;return +ob[a&1](b|0,+c)}function FD(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(2);return 0.0}function GD(a){a=a|0;return +(+g[a+276>>2])}function HD(a){a=a|0;return +(+g[a+208>>2])}function ID(a){a=a|0;return gJ(c[a+192>>2]|0)|0}function JD(a){a=a|0;return gJ(c[a+204>>2]|0)|0}function KD(a){a=a|0;return gJ(c[a+24>>2]|0)|0}function LD(a){a=a|0;return gJ(c[a+68>>2]|0)|0}function MD(a){a=a|0;return +(+qw(a))}function ND(a,b){a=a|0;b=b|0;c[a+16>>2]=b;return}function OD(a,b){a=a|0;b=b|0;return c[a+8+(b<<2)>>2]|0}function PD(a,b){a=a|0;b=+b;g[a+72>>2]=b;return}function QD(a){a=+a;return (g[j>>2]=a,c[j>>2]|0)|0}function RD(a){a=+a;return +(+$A(!(a>=0.0)?-a:a)*2.0)}function SD(a,b){a=a|0;b=+b;g[a+96>>2]=b;return}function TD(a){a=a|0;if(!a)return;cJ(a);return}function UD(a){a=a|0;return +(+g[a+216>>2])}function VD(a){a=a|0;return gJ(c[a+540>>2]|0)|0}function WD(a){a=a|0;return gJ(c[a+116>>2]|0)|0}function XD(a,b){a=a|0;b=+b;RF(a,b);return}function YD(b){b=b|0;return (a[b+26>>0]&1)!=0|0}function ZD(b){b=b|0;return (a[b+84>>0]&1)!=0|0}function _D(a,b){a=a|0;b=+b;g[a+80>>2]=b;return}function $D(a){a=a|0;return +(+g[a+32>>2]*+g[a+16>>2])}function aE(a,b){a=a|0;b=b|0;return a+(b<<2)|0}function bE(a){a=a|0;return +(+g[a+248>>2])}function cE(a){a=a|0;return gJ(c[a+256>>2]|0)|0}function dE(a){a=a|0;return _H(a)|0}function eE(a,b){a=a|0;b=+b;g[a+52>>2]=b;return}function fE(a,b){a=a|0;b=+b;g[a+56>>2]=b;return}function gE(a,b){a=a|0;b=b|0;c[a+20>>2]=b;return}function hE(a,b,c){a=a|0;b=b|0;c=+c;return 0}function iE(a){a=a|0;return +(+g[a+204>>2])}function jE(a){a=a|0;kr(a);return}function kE(a,b){a=a|0;b=+b;lG(a,b);return}function lE(a,b){a=a|0;b=+b;mG(a,b);return}function mE(a,b){a=a|0;b=+b;MG(a,b);return}function nE(a){a=a|0;return gJ(c[a+264>>2]|0)|0}function oE(a){a=a|0;return c[a+36>>2]|0}function pE(a){a=a|0;return c[a+32>>2]|0}function qE(a){a=a|0;return gJ(c[a+56>>2]|0)|0}function rE(a,b){a=a|0;b=+b;g[a+68>>2]=b;return}function sE(a){a=a|0;return (c[a+52>>2]|0)+4|0}function tE(a){a=a|0;return gJ(c[a+20>>2]|0)|0}function uE(a){a=a|0;return +(+VI(+EF(a)))}function vE(a,b){a=a|0;b=b|0;return a+156+(b<<4)|0}function wE(a,b,c){a=a|0;b=b|0;c=+c;Jb[a&31](b|0,+c)}function xE(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(38)}function yE(a){a=a|0;return +(+g[(NI(a)|0)>>2])}function zE(a){a=a|0;return +(+g[(OI(a)|0)>>2])}function AE(a){a=a|0;return +(+g[(MI(a)|0)>>2])}function BE(a){a=a|0;return gI(a)|0}function CE(a){a=a|0;xB(a);return}function DE(a){a=a|0;return c[a+8>>2]|0}function EE(a,b){a=a|0;b=+b;g[a+64>>2]=b;return}function FE(a,b){a=a|0;b=+b;g[a+60>>2]=b;return}function GE(a,b){a=a|0;b=+b;g[a+44>>2]=b;return}function HE(a,b){a=a|0;b=+b;g[a+40>>2]=b;return}function IE(a,b){a=a|0;b=+b;g[a+36>>2]=b;return}function JE(a,b){a=a|0;b=+b;g[a+92>>2]=b;return}function KE(a){a=a|0;return c[a+216>>2]|0}function LE(a){a=a|0;return +(+g[a+244>>2])}function ME(a){a=a|0;return +(+g[a+240>>2])}function NE(a){a=a|0;return +(+EF(a))}function OE(a,b){a=a|0;b=b|0;return a+28+(b<<4)|0}function PE(a,b){a=a|0;b=+b;g[a+24>>2]=b;return}function QE(a,b){a=a|0;b=+b;g[a+20>>2]=b;return}function RE(a,b){a=a|0;b=+b;g[a+32>>2]=b;return}function SE(a,b){a=a|0;b=+b;g[a+28>>2]=b;return}function TE(a,b){a=a|0;b=b|0;c[a>>2]=b;return}function UE(a){a=a|0;return c[a+228>>2]|0}function VE(a){a=a|0;return gJ(c[a+128>>2]|0)|0}function WE(a){a=a|0;c[a+232>>2]=0;return}function XE(a,b,c){a=a|0;b=b|0;c=c|0;return}function YE(a,b){a=a|0;b=+b;g[a+76>>2]=b;return}function ZE(a){a=a|0;return +(+g[a+212>>2])}function _E(a){a=a|0;return +(+g[a+228>>2])}function $E(a){a=a|0;return a+56|0}function aF(a){a=a|0;return c[a+24>>2]|0}function bF(a,b){a=a|0;b=+b;g[a+16>>2]=b;return}function cF(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;T(35)}function dF(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(30)}function eF(a){a=a|0;return +(+g[a+252>>2])}function fF(a){a=a|0;return OI(a)|0}function gF(a){a=a|0;return +(+uE(a))}function hF(a){a=a|0;return c[a+4>>2]|0}function iF(){var a=0;a=c[7140]|0;c[7140]=a+0;return a|0}function jF(a){a=a|0;return (a&3|0)!=0|0}function kF(a,b){a=a|0;b=+b;g[a+48>>2]=b;return}function lF(a){a=a|0;return a+156|0}function mF(b){b=b|0;return (a[b+152>>0]&1)!=0|0}function nF(){var a=0;a=c[2475]|0;c[2475]=a+0;return a|0}function oF(a){a=a|0;return 644}function pF(a){a=a|0;pi(a);cJ(a);return}function qF(a){a=a|0;Ki(a);cJ(a);return}function rF(a){a=a|0;Oj(a);cJ(a);return}function sF(a){a=a|0;return +(+g[a+232>>2])}function tF(a){a=a|0;return +(+g[a+280>>2])}function uF(a){a=a|0;return +(+g[a+236>>2])}function vF(a){a=a|0;return a+100|0}function wF(a){a=a|0;return 348}function xF(a){a=a|0;return c[a+12>>2]|0}function yF(a){a=a|0;BF(a+56|0);return}function zF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(15);return 0}function AF(a){a=a|0;cx(a);return}function BF(a){a=a|0;qC(a);return}function CF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(5);return 0.0}function DF(a){a=a|0;return gJ(c[a+4>>2]|0)|0}function EF(a){a=a|0;return +(+Gp(a,a))}function FF(a){a=a|0;return +(+g[a+256>>2])}function GF(a){a=a|0;return +(+g[a>>2])}function HF(a){a=a|0;return (a|0)!=0|0}function IF(a,b){a=a|0;b=b|0;return xb[a&127](b|0)|0}function JF(a){a=a|0;return a+24|0}function KF(a){a=a|0;Ua(a|0)|0;Cq()}function LF(a){a=a|0;return c[a+1304>>2]|0}function MF(a,b){a=+a;b=+b;return !(a>b)|0}function NF(a){a=a|0;return a+64|0}function OF(a){a=a|0;return +(+g[a+72>>2])}function PF(a){a=a|0;return c[a+332>>2]|0}function QF(a){a=a|0;return (a&2|0)!=0|0}function RF(a,b){a=a|0;b=+b;g[a+12>>2]=b;return}function SF(a){a=a|0;return a+172|0}function TF(a){a=a|0;return c[a+84>>2]|0}function UF(a){a=a|0;return c[a+88>>2]|0}function VF(a){a=a|0;return c[a+92>>2]|0}function WF(a){a=a|0;return c[a+96>>2]|0}function XF(a){a=a|0;return 252}function YF(a,b,c,d){a=a|0;b=+b;c=c|0;d=+d;T(11);return 0}function ZF(a){a=a|0;return +(+g[(gJ(a)|0)>>2])}function _F(a){a=a|0;return a+52|0}function $F(a){a=a|0;return +(+g[a+80>>2])}function aG(a){a=a|0;return 28}function bG(a){a=a|0;return c[a+100>>2]|0}function cG(a){a=a|0;return c[a+72>>2]|0}function dG(a,b){a=a|0;b=b|0;return +nb[a&15](b|0)}function eG(a){a=a|0;return a+40|0}function fG(a){a=a|0;return c[a+16>>2]|0}function gG(a){a=a|0;return +(+g[a+52>>2])}function hG(a){a=a|0;return +(+g[a+56>>2])}function iG(a){a=a|0;return a+112|0}function jG(a){a=a|0;return 212}function kG(a){a=a|0;return (a&1|0)!=0|0}function lG(a,b){a=a|0;b=+b;g[a+8>>2]=b;return}function mG(a,b){a=a|0;b=+b;g[a+4>>2]=b;return}function nG(a){a=+a;return a<1.0|0}function oG(a,b){a=a|0;b=b|0;return 1}function pG(a){a=a|0;return a+344|0}function qG(a){a=a|0;NH(a);return}function rG(a){a=a|0;return +(+g[a+68>>2])}function sG(a){a=a|0;return c[a+300>>2]|0}function tG(a,b){a=a|0;b=b|0;l=a;m=b}function uG(a){a=a|0;return a+188|0}function vG(a){a=a|0;return c[a+20>>2]|0}function wG(a){a=a|0;return 204}function xG(a){a=a|0;return c[a+748>>2]|0}function yG(a,b){a=a|0;b=b|0;return}function zG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(34)}function AG(a){a=a|0;return a+68|0}function BG(a){a=a|0;return a+36|0}function CG(a){a=a|0;return +(+g[a+64>>2])}function DG(a){a=a|0;return +(+g[a+60>>2])}function EG(a){a=a|0;return +(+g[a+44>>2])}function FG(a){a=a|0;return +(+g[a+40>>2])}function GG(a){a=a|0;return +(+g[a+36>>2])}function HG(a){a=a|0;return +(+g[a+48>>2])}function IG(a){a=a|0;return +(+g[a+92>>2])}function JG(a){a=a|0;return 220}function KG(a){a=a|0;return 264}function LG(a){a=a|0;return +(+g[a+76>>2])}function MG(a,b){a=a|0;b=+b;g[a>>2]=b;return}function NG(a){a=a|0;c[a>>2]=3028;return}function OG(a){a=a|0;c[a>>2]=8404;return}function PG(a){a=a|0;qG(a);return}function QG(a){a=a|0;return +(+g[a+24>>2])}function RG(a){a=a|0;return +(+g[a+4>>2])}function SG(a){a=a|0;return +(+g[a+20>>2])}function TG(a){a=a|0;return +(+g[a+32>>2])}function UG(a){a=a|0;return +(+g[a+16>>2])}function VG(a){a=a|0;return +(+g[a+12>>2])}function WG(a){a=a|0;return +(+g[a+28>>2])}function XG(a){a=a|0;return a+16|0}function YG(a){a=a|0;return 52}function ZG(a){a=a|0;return 68}function _G(a){a=a|0;return 84}function $G(a,b){a=a|0;b=b|0;return a+(b<<4)|0}function aH(a){a=a|0;return a+928|0}function bH(a){a=a|0;return +(+g[a+8>>2])}function cH(a){a=a|0;return a+316|0}function dH(a){a=a|0;return a+300|0}function eH(a,b){a=a|0;b=b|0;Ib[a&511](b|0)}function fH(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;T(32)}function gH(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;T(29)}function hH(a,b,c,d){a=a|0;b=+b;c=c|0;d=d|0;T(26)}function iH(a){a=a|0;return a+32|0}function jH(a){a=a|0;return 24}function kH(a){a=a|0;return a+848|0}function lH(a){a=a|0;return c[a>>2]|0}function mH(a,b){a=a|0;b=b|0;return nv(a,b)|0}function nH(a){a=a|0;Ey(a);return}function oH(a){a=a|0;cJ(a+-4|0);return}function pH(a){a=a|0;ni(a);return}function qH(a){a=a|0;return gJ(a)|0}function rH(a){a=a|0;return a+768|0}function sH(a){a=a|0;return a+788|0}function tH(a){a=a|0;return a+808|0}function uH(a){a=a|0;return a+104|0}function vH(a){a=a|0;return 496}function wH(a,b,c){a=a|0;b=b|0;c=c|0;T(14);return 0}function xH(a){a=a|0;return 32}function yH(a){a=a|0;return a+80|0}function zH(a){a=a|0;return a+388|0}function AH(a){a=a|0;return 60}function BH(a){a=a|0;return 436}function CH(a){a=a|0;c[a>>2]=3104;return}function DH(a,b,c){a=a|0;b=b|0;c=c|0;T(3);return 0.0}function EH(a){a=a|0;return a+348|0}function FH(){return Ds(1)|0}function GH(a){a=+a;return +(+$A(a)*2.0)}function HH(a){a=a|0;return a+372|0}function IH(a){a=a|0;c[a>>2]=4652;return}function JH(a){a=a|0;return (a&255)<<8|a>>8&255|0}function KH(a,b,c){a=a|0;b=b|0;c=+c;T(13);return 0}function LH(a){a=a|0;return 11398}function MH(a){a=a|0;return a+92|0}function NH(a){a=a|0;c[a>>2]=0;return}function OH(a){a=a|0;return a+88|0}function PH(a){a=a|0;return 4}function QH(a){a=a|0;return a+20|0}function RH(a){a=a|0;return 17723}function SH(a){a=a|0;return 17439}function TH(a){a=a|0;c[a>>2]=3080;return}function UH(){return Pt()|0}function VH(a){a=a|0;return 11336}function WH(a,b){a=a|0;b=+b;return}function XH(a){a=a|0;return a+76|0}function YH(a){a=a|0;return a+28|0}function ZH(a){a=a|0;return 16585}function _H(a){a=a|0;return a+440|0}function $H(a){a=+a;return +(+mh(a,6.2831854820251465))}function aI(a){a=a|0;return a+72|0}function bI(a,b,c){a=a|0;b=b|0;c=c|0;T(31)}function cI(a){a=a|0;return 16969}function dI(a,b){a=+a;b=b|0;return +(+Em(a,b))}function eI(){return Ds(64)|0}function fI(a){a=a|0;return 17027}function gI(a){a=a|0;return a+48|0}function hI(){c[176]=o}function iI(a){a=a|0;return 17225}function jI(a){a=a|0;return 1}function kI(a,b,c){a=a|0;b=b|0;c=+c;T(28)}function lI(a,b,c){a=a|0;b=+b;c=c|0;T(25)}function mI(a){a=a|0;return 17840}function nI(a){a=a|0;return 17811}function oI(a){a=a|0;return 3}function pI(a){a=a|0;return Gm(a,28524)|0}function qI(a){a=a|0;return 11665}function rI(a){a=+a;return +a}function sI(a){a=a|0;return 17783}function tI(a){a=a|0;return 16300}function uI(a){a=a|0;return 17383}function vI(a){a=a|0;return 17356}function wI(a){a=a|0;return 17326}function xI(a){a=a|0;return 8}function yI(a,b,c){a=a|0;b=+b;c=+c;T(23)}function zI(a){a=a|0;return 16404}function AI(a,b){a=a|0;b=b|0;T(12);return 0}function BI(a){a=a|0;return 16362}function CI(a){a=a|0;return 16383}function DI(a){a=a|0;return 6}function EI(a){a=a|0;return 12}function FI(){return 4}function GI(a){a=a|0;return 16343}function HI(a){a=a|0;return 0}function II(a){a=a|0;return 2}function JI(a){a=a|0;return 17498}function KI(a,b){a=a|0;b=+b;T(1);return 0.0}function LI(){c[5628]=1805;c[5629]=0;return}function MI(a){a=a|0;return a+12|0}function NI(a){a=a|0;return a+8|0}function OI(a){a=a|0;return a+4|0}function PI(a){a=a|0;Hb[a&3]()}function QI(){return 2}function RI(){return 1}function SI(){return 5}function TI(){return 3}function UI(){Wa()}function VI(a){a=+a;return +(+D(+a))}function WI(a){a=+a;return +(+G(+a))}function XI(a){a=+a;return +(+F(+a))}function YI(a,b){a=a|0;b=b|0;T(27)}function ZI(a){a=a|0;return}function _I(a,b){a=a|0;b=+b;T(22)}function $I(a){a=a|0;return Ds(a)|0}function aJ(a){a=a|0;cJ(a);return}function bJ(a){a=a|0;l=a}function cJ(a){a=a|0;Cd(a);return}function dJ(a){a=a|0;A=a}function eJ(a){a=a|0;T(10);return 0}function fJ(a){a=a|0;T(0);return 0.0}function gJ(a){a=a|0;return a|0}function hJ(){return A|0}function iJ(){return l|0}function jJ(a){a=a|0;T(21)}function kJ(){return 0}function lJ(){T(20)} +function dc(d,f){d=d|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0,la=0;ha=l;l=l+192|0;i=c[d+56>>2]|0;if(i|0?(Ib[c[c[i>>2]>>2]&511](i),h=c[d+56>>2]|0,h|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(151)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=9696;a[h+20>>0]=1;c[h+16>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[d+56>>2]=h;n=0;o=0;ga=0;K=0;h=0;while(1){if((n|0)>=(xb[c[(c[d>>2]|0)+96>>2]&127](d)|0))break;do if((K|0)==(o|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,p=sc((i<<4|3)+16|0)|0,(p|0)!=0):0){c[(p+4+15&-16)+-4>>2]=p;k=p+4+15&-16}else k=0;if((o|0)<=0){if(!ga){m=k;h=k;k=o;break}}else{h=0;do{fa=k+(h<<4)|0;ea=ga+(h<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);m=k;h=k;k=o}else{i=o;m=ga;k=o}}else{i=o;m=ga;k=K}while(0);o=m+(K<<4)|0;c[o>>2]=c[ha+136>>2];c[o+4>>2]=c[ha+136+4>>2];c[o+8>>2]=c[ha+136+8>>2];c[o+12>>2]=c[ha+136+12>>2];Sb[c[(c[d>>2]|0)+108>>2]&127](d,n,o);n=n+1|0;o=i;ga=m;K=k+1|0}a[ha+76+16>>0]=1;fa=ha+76+12|0;c[fa>>2]=0;c[ha+76+4>>2]=0;c[ha+76+8>>2]=0;a[ha+76+36>>0]=1;ea=ha+76+32|0;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;a[ha+76+56>>0]=1;da=ha+76+52|0;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;if(f){if((K|0)>0){J=0;i=0;k=0;m=0;while(1){h=J;J=J+1|0;if((J|0)<(K|0)){G=ga+(h<<4)|0;I=ga+(h<<4)+4|0;A=ga+(h<<4)+8|0;z=J;h=m;do{m=z;z=z+1|0;if((z|0)<(K|0)){x=ga+(m<<4)|0;y=ga+(m<<4)+4|0;w=ga+(m<<4)+8|0;f=z;do{F=+g[G>>2];v=+g[x>>2]-F;H=+g[I>>2];B=+g[y>>2]-H;L=+g[A>>2];E=+g[w>>2]-L;F=+g[ga+(f<<4)>>2]-F;H=+g[ga+(f<<4)+4>>2]-H;L=+g[ga+(f<<4)+8>>2]-L;q=1.0;p=0;while(1){t=(B*L-E*H)*q;u=(E*F-v*L)*q;r=(v*H-B*F)*q;a:do if(r*r+(t*t+u*u)>9.999999747378752e-05){s=1.0/+D(+(r*r+(t*t+u*u)));if((h|0)>0){m=0;do{if(t*s*+g[k+(m<<4)>>2]+u*s*+g[k+(m<<4)+4>>2]+r*s*+g[k+(m<<4)+8>>2]>.9990000128746033)break a;m=m+1|0}while((m|0)<(h|0))}q=t*s*+g[G>>2]+u*s*+g[I>>2]+r*s*+g[A>>2];m=0;do{if(t*s*+g[ga+(m<<4)>>2]+u*s*+g[ga+(m<<4)+4>>2]+r*s*+g[ga+(m<<4)+8>>2]-q+-.009999999776482582>0.0)break a;m=m+1|0}while((m|0)<(K|0));do if((h|0)==(i|0)){o=i|0?i<<1:1;if((i|0)<(o|0)){do if(!o)n=0;else{c[6995]=(c[6995]|0)+1;m=sc((o<<4|3)+16|0)|0;if(!m){n=0;break}c[(m+4+15&-16)+-4>>2]=m;n=m+4+15&-16}while(0);if((i|0)<=0){if(!k){m=o;k=n;break}}else{m=0;do{aa=n+(m<<4)|0;$=k+(m<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];m=m+1|0}while((m|0)!=(i|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);m=o;k=n}else m=i}else{m=i;i=h}while(0);g[k+(i<<4)>>2]=t*s;g[k+(i<<4)+4>>2]=u*s;g[k+(i<<4)+8>>2]=r*s;g[k+(i<<4)+12>>2]=-q;i=m;h=h+1|0}while(0);p=p+1|0;if((p|0)==2)break;else q=-1.0}f=f+1|0}while((f|0)!=(K|0))}}while((z|0)!=(K|0))}else h=m;if((J|0)==(K|0)){f=h;break}else m=h}if((f|0)>0){h=0;o=0;p=0;while(1){aa=k+(p<<4)|0;c[ha+136>>2]=c[aa>>2];c[ha+136+4>>2]=c[aa+4>>2];c[ha+136+8>>2]=c[aa+8>>2];q=+g[k+(p<<4)+12>>2];q=q-+nb[c[(c[d>>2]|0)+48>>2]&15](d);do if((p|0)==(h|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if((n|0)!=0?(c[6995]=(c[6995]|0)+1,M=sc((n<<4|3)+16|0)|0,(M|0)!=0):0){c[(M+4+15&-16)+-4>>2]=M;m=M+4+15&-16}else m=0;if((h|0)<=0){if(!o)break}else{i=0;do{aa=m+(i<<4)|0;$=o+(i<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];i=i+1|0}while((i|0)!=(h|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}else{n=h;m=o}}else{n=h;m=o;h=p}while(0);aa=m+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];g[m+(h<<4)+12>>2]=q;p=p+1|0;if((p|0)<(f|0)){h=n;o=m}else break}if((p|0)>0){G=0;o=0;n=0;i=0;h=0;do{z=G;G=G+1|0;if((G|0)<(p|0)){A=G;do{y=A;A=A+1|0;if((A|0)<(p|0)){x=A;do{t=+g[m+(y<<4)+4>>2];q=+g[m+(x<<4)+8>>2];r=+g[m+(y<<4)+8>>2];u=+g[m+(x<<4)+4>>2];v=+g[m+(x<<4)>>2];B=+g[m+(y<<4)>>2];s=+g[m+(z<<4)+8>>2];E=+g[m+(z<<4)+4>>2];F=+g[m+(z<<4)>>2];b:do if((((u*B-t*v)*(u*B-t*v)+((t*q-r*u)*(t*q-r*u)+(r*v-q*B)*(r*v-q*B))>9.999999747378752e-05?(v*E-u*F)*(v*E-u*F)+((u*s-q*E)*(u*s-q*E)+(q*F-v*s)*(q*F-v*s))>9.999999747378752e-05:0)?(t*F-B*E)*(t*F-B*E)+((r*E-t*s)*(r*E-t*s)+(B*s-r*F)*(B*s-r*F))>9.999999747378752e-05:0)?(O=s*(u*B-t*v)+(E*(r*v-q*B)+(t*q-r*u)*F),+C(+O)>9.999999974752427e-07):0){ia=+g[m+(z<<4)+12>>2];L=+g[m+(y<<4)+12>>2];ja=+g[m+(x<<4)+12>>2];H=-1.0/O*((r*E-t*s)*ja+((t*q-r*u)*ia+(u*s-q*E)*L));r=-1.0/O*((B*s-r*F)*ja+((r*v-q*B)*ia+(q*F-v*s)*L));q=-1.0/O*((t*F-B*E)*ja+((u*B-t*v)*ia+(v*E-u*F)*L));f=0;do{if(+g[m+(f<<4)+12>>2]+(H*+g[m+(f<<4)>>2]+r*+g[m+(f<<4)+4>>2]+q*+g[m+(f<<4)+8>>2])+-.009999999776482582>0.0)break b;f=f+1|0}while((f|0)<(p|0));do if((i|0)==(o|0)){w=o|0?o<<1:1;if((o|0)>=(w|0)){w=o;break}do if(!w)f=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<4|3)+16|0)|0;if(!h){f=0;break}c[(h+4+15&-16)+-4>>2]=h;f=h+4+15&-16}while(0);if((o|0)<=0){if(!n){n=f;h=f;break}}else{h=0;do{aa=f+(h<<4)|0;$=n+(h<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);n=f;h=f}else{w=o;o=i}while(0);g[n+(o<<4)>>2]=H;g[n+(o<<4)+4>>2]=r;g[n+(o<<4)+8>>2]=q;g[n+(o<<4)+12>>2]=0.0;o=w;i=i+1|0}while(0);x=x+1|0}while((x|0)!=(p|0))}}while((A|0)!=(p|0))}}while((G|0)!=(p|0))}else{n=0;i=0;h=0}}else{n=0;m=0;i=0;h=0}}else{n=0;m=0;k=0;i=0;h=0}uc(ha+76|0,h,i);if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(m|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}if(k|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}}else uc(ha+76|0,h,K);I=c[ha+76+44>>2]|0;if((I|0)>0){c[6995]=(c[6995]|0)+1;h=sc((I<<4|3)+16|0)|0;if(!h)i=0;else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}h=0;do{aa=i+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];c[aa+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(I|0));aa=i;_=i}else{aa=0;_=0}a[ha+56+16>>0]=1;$=ha+56+12|0;c[$>>2]=0;Z=ha+56+4|0;c[Z>>2]=0;c[ha+56+8>>2]=0;k=ha+136|0;n=k+19|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(n|0));if((I|0)<0)gb();if(I|0){Of(ha+56|0,I);i=c[$>>2]|0;h=0;do{a[i+(h*36|0)+16>>0]=1;k=i+(h*36|0)+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;k=i+(h*36|0)+20|0;m=ha+136+3|0;n=k+16|0;do{a[k>>0]=a[m>>0]|0;k=k+1|0;m=m+1|0}while((k|0)<(n|0));h=h+1|0}while((h|0)!=(I|0))}c[Z>>2]=I;o=c[ha+76+4>>2]|0;n=c[d+56>>2]|0;m=c[n+8>>2]|0;if((m|0)<(o|0)){if((c[n+12>>2]|0)<(o|0)){if(!o){h=0;k=m}else{c[6995]=(c[6995]|0)+1;h=sc((o<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[n+8>>2]|0}if((k|0)>0){i=0;do{Y=h+(i<<4)|0;X=(c[n+16>>2]|0)+(i<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[n+16>>2]|0;if(i|0){if(a[n+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+16>>2]=0}a[n+20>>0]=1;c[n+16>>2]=h;c[n+12>>2]=o;i=n+16|0}else i=n+16|0;h=m;do{Y=(c[i>>2]|0)+(h<<4)|0;c[Y>>2]=c[ha+136>>2];c[Y+4>>2]=c[ha+136+4>>2];c[Y+8>>2]=c[ha+136+8>>2];c[Y+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[n+8>>2]=o;if((o|0)>0){h=0;do{X=(c[fa>>2]|0)+(h<<4)|0;Y=(c[(c[d+56>>2]|0)+16>>2]|0)+(h<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];h=h+1|0}while((h|0)!=(o|0))}if((I|0)>0){G=0;do{z=(c[ea>>2]|0)+((c[(c[da>>2]|0)+(G<<2)>>2]|0)*12|0)|0;y=z;h=0;do{A=y+4|0;x=c[y+((c[A>>2]|0)*12|0)+8>>2]|0;f=c[$>>2]|0;w=f+(G*36|0)+4|0;i=c[w>>2]|0;p=f+(G*36|0)+8|0;if((i|0)==(c[p>>2]|0)?(N=i|0?i<<1:1,(i|0)<(N|0)):0){if(!N)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((N<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[w>>2]|0}n=f+(G*36|0)+12|0;m=c[n>>2]|0;if((i|0)<=0)if(!m)k=f+(G*36|0)+16|0;else ba=132;else{k=0;do{c[o+(k<<2)>>2]=c[m+(k<<2)>>2];k=k+1|0}while((k|0)!=(i|0));ba=132}if((ba|0)==132){ba=0;i=f+(G*36|0)+16|0;if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[n>>2]=0;k=i;i=c[w>>2]|0}a[k>>0]=1;c[n>>2]=o;c[p>>2]=N}c[(c[f+(G*36|0)+12>>2]|0)+(i<<2)>>2]=x;c[w>>2]=(c[w>>2]|0)+1;X=c[y+8>>2]|0;Y=c[fa>>2]|0;s=+g[Y+(X<<4)>>2]-+g[Y+(x<<4)>>2];t=+g[Y+(X<<4)+4>>2]-+g[Y+(x<<4)+4>>2];q=+g[Y+(X<<4)+8>>2]-+g[Y+(x<<4)+8>>2];r=1.0/+D(+(s*s+t*t+q*q));if((h|0)<2){g[ha+136+(h<<4)>>2]=s*r;g[ha+136+(h<<4)+4>>2]=t*r;g[ha+136+(h<<4)+8>>2]=q*r;g[ha+136+(h<<4)+12>>2]=0.0;h=h+1|0}Y=y+((c[A>>2]|0)*12|0)|0;y=Y+((c[Y>>2]|0)*12|0)|0}while((y|0)!=(z|0));if((h|0)==2){H=+g[ha+136+4>>2];L=+g[ha+136+24>>2];O=+g[ha+136+8>>2];ia=+g[ha+136+20>>2];F=+g[ha+136+16>>2];E=+g[ha+136>>2];X=aa+(G<<4)+4|0;Y=aa+(G<<4)+8|0;g[aa+(G<<4)+12>>2]=0.0;ja=1.0/+D(+((H*L-O*ia)*(H*L-O*ia)+(O*F-L*E)*(O*F-L*E)+(ia*E-H*F)*(ia*E-H*F)));g[aa+(G<<4)>>2]=(H*L-O*ia)*ja;g[X>>2]=(O*F-L*E)*ja;g[Y>>2]=(ia*E-H*F)*ja;n=c[$>>2]|0;g[n+(G*36|0)+20>>2]=(H*L-O*ia)*ja;c[n+(G*36|0)+24>>2]=c[X>>2];c[n+(G*36|0)+28>>2]=c[Y>>2];g[n+(G*36|0)+32>>2]=1000000015047466219876688.0e6}else{n=aa+(G<<4)|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;n=c[$>>2]|0}k=c[n+(G*36|0)+4>>2]|0;if((k|0)>0){m=c[(c[d+56>>2]|0)+16>>2]|0;r=+g[aa+(G<<4)>>2];s=+g[aa+(G<<4)+4>>2];t=+g[aa+(G<<4)+8>>2];i=c[n+(G*36|0)+12>>2]|0;h=0;q=1000000015047466219876688.0e6;do{Y=c[i+(h<<2)>>2]|0;ja=+g[m+(Y<<4)>>2]*r+ +g[m+(Y<<4)+4>>2]*s+ +g[m+(Y<<4)+8>>2]*t;q=q>ja?ja:q;h=h+1|0}while((h|0)!=(k|0))}else q=1000000015047466219876688.0e6;g[n+(G*36|0)+32>>2]=-q;G=G+1|0}while((G|0)!=(I|0))}if((c[Z>>2]|0)>0){i=0;m=0;k=0;n=0;o=0;while(1){do if((o|0)==(i|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,P=sc((i<<2|3)+16|0)|0,(P|0)!=0):0){c[(P+4+15&-16)+-4>>2]=P;k=P+4+15&-16}else k=0;if((o|0)>0){h=0;do{c[k+(h<<2)>>2]=c[m+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));if(!n){m=k;Y=k;h=k;break}}else if((m|0)==0|(n|0)==0){m=k;Y=k;h=k;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);m=k;Y=k;h=k}else{i=o;Y=k;h=n}}else{Y=k;h=n}while(0);c[m+(o<<2)>>2]=o;o=o+1|0;if((o|0)>=(c[Z>>2]|0))break;else{k=Y;n=h}}M=ha+36+12|0;N=ha+36+4|0;P=ha+136+12|0;k=o;do{w=k+-1|0;i=c[m+(w<<2)>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(23)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=i;X=c[$>>2]|0;r=+g[X+(i*36|0)+20>>2];s=+g[X+(i*36|0)+24>>2];q=+g[X+(i*36|0)+28>>2];c:do if((k|0)>1){o=w;i=h;f=h;n=1;p=h;h=1;y=w;while(1){z=h;while(1){h=c[$>>2]|0;x=o;do{X=x;x=x+-1|0;if((X|0)<=0){K=i;J=p;I=z;k=y;break c}w=c[m+(x<<2)>>2]|0}while(!(r*+g[h+(w*36|0)+20>>2]+s*+g[h+(w*36|0)+24>>2]+q*+g[h+(w*36|0)+28>>2]>.9990000128746033));do if((z|0)==(n|0)){k=z|0?z<<1:1;if((z|0)<(k|0)){do if(!k)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((z|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(z|0));if(!f){n=k;p=o;i=o;f=o;break}}else if((p|0)==0|(f|0)==0){n=k;p=o;i=o;f=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);n=k;p=o;i=o;f=o}else n=z}while(0);c[p+(z<<2)>>2]=w;z=z+1|0;h=0;while(1){if((c[m+(h<<2)>>2]|0)==(w|0))break;h=h+1|0;if((h|0)>=(y|0)){h=y;break}}if((y|0)>(h|0))break;else o=x}V=m+(h<<2)|0;W=c[V>>2]|0;k=y+-1|0;X=m+(k<<2)|0;c[V>>2]=c[X>>2];c[X>>2]=W;if((y|0)>1){o=x;h=z;y=k}else{o=x;h=z;ba=162;break}}}else{o=w;i=h;f=h;n=1;p=h;h=1;k=w;ba=162}while(0);d:do if((ba|0)==162){ba=0;y=h;while(1){h=c[$>>2]|0;w=o;do{X=w;w=w+-1|0;if((X|0)<=0){K=i;J=p;I=y;break d}x=c[m+(w<<2)>>2]|0}while(!(r*+g[h+(x*36|0)+20>>2]+s*+g[h+(x*36|0)+24>>2]+q*+g[h+(x*36|0)+28>>2]>.9990000128746033));do if((y|0)==(n|0)){n=y|0?y<<1:1;if((y|0)<(n|0)){do if(!n)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((y|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(y|0));if(!f){p=o;i=o;h=o;break}}else if((p|0)==0|(f|0)==0){p=o;i=o;h=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);p=o;i=o;h=o}else{n=y;h=f}}else h=f;while(0);c[p+(y<<2)>>2]=x;o=w;f=h;y=y+1|0}}while(0);if((I|0)>1){a[ha+36+16>>0]=1;c[M>>2]=0;c[N>>2]=0;c[ha+36+8>>2]=0;z=0;q=0.0;r=0.0;s=0.0;n=0;do{i=c[J+(z<<2)>>2]|0;q=+g[h+(i*36|0)+20>>2]+q;r=+g[h+(i*36|0)+24>>2]+r;s=+g[h+(i*36|0)+28>>2]+s;y=h+(i*36|0)+4|0;if((c[y>>2]|0)>0){x=h+(i*36|0)+12|0;w=0;h=n;while(1){f=c[(c[x>>2]|0)+(w<<2)>>2]|0;X=(c[(c[d+56>>2]|0)+16>>2]|0)+(f<<4)|0;c[ha+136>>2]=c[X>>2];c[ha+136+4>>2]=c[X+4>>2];c[ha+136+8>>2]=c[X+8>>2];c[ha+136+12>>2]=c[X+12>>2];e:do if((h|0)>0){n=c[M>>2]|0;i=0;while(1){if((c[n+(i*24|0)+20>>2]|0)==(f|0))break e;i=i+1|0;if((i|0)>=(h|0)){ba=261;break}}}else ba=261;while(0);if((ba|0)==261){ba=0;c[ha>>2]=c[ha+136>>2];c[ha+4>>2]=c[ha+136+4>>2];c[ha+8>>2]=c[ha+136+8>>2];c[ha+12>>2]=c[ha+136+12>>2];do if((h|0)==(c[ha+36+8>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[N>>2]|0}n=c[M>>2]|0;if((h|0)<=0){if(n)ba=270}else{i=0;do{ba=o+(i*24|0)|0;X=n+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(h|0));ba=270}if((ba|0)==270){ba=0;if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);h=c[N>>2]|0}c[M>>2]=0}a[ha+36+16>>0]=1;c[M>>2]=o;c[ha+36+8>>2]=p}while(0);X=c[M>>2]|0;W=X+(h*24|0)|0;c[W>>2]=c[ha>>2];c[W+4>>2]=c[ha+4>>2];c[W+8>>2]=c[ha+8>>2];c[W+12>>2]=c[ha+12>>2];c[W+16>>2]=c[ha+16>>2];c[X+(h*24|0)+20>>2]=f;h=(c[N>>2]|0)+1|0;c[N>>2]=h}w=w+1|0;if((w|0)>=(c[y>>2]|0)){n=h;break}}}z=z+1|0;h=c[$>>2]|0}while((z|0)!=(I|0));a[ha+16>>0]=1;c[ha+12>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;X=c[J>>2]|0;c[ha+20>>2]=c[h+(X*36|0)+20>>2];c[ha+24>>2]=c[h+(X*36|0)+24>>2];c[ha+28>>2]=c[h+(X*36|0)+28>>2];c[ha+32>>2]=c[h+(X*36|0)+32>>2];H=1.0/+D(+(q*q+r*r+s*s));O=q*H;L=r*H;H=s*H;if(+C(+H)>.7071067690849304){F=1.0/+D(+(H*H+L*L));t=O*-(H*F);u=(H*H+L*L)*F;v=0.0;B=L*F;E=-(O*L*F);F=-(H*F)}else{F=1.0/+D(+(O*O+L*L));t=(O*O+L*L)*F;u=-(H*O*F);v=-(L*F);B=0.0;E=H*-(L*F);F=O*F}if((n|0)<2)if((n|0)==1){n=0;o=0;f=0;i=1;while(1){w=c[M>>2]|0;do if((n|0)==(o|0)){p=o|0?o<<1:1;if((o|0)>=(p|0)){p=o;h=f;break}do if(!p)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h){h=0;o=n;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16;o=n}while(0);if((o|0)<=0){if(f|0)ba=212}else{i=0;do{ba=h+(i*24|0)|0;X=f+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(o|0));ba=212}if((ba|0)==212){ba=0;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}o=n;i=c[N>>2]|0}else{p=o;h=f;o=n}while(0);X=h+(o*24|0)|0;c[X>>2]=c[w>>2];c[X+4>>2]=c[w+4>>2];c[X+8>>2]=c[w+8>>2];c[X+12>>2]=c[w+12>>2];c[X+16>>2]=c[w+16>>2];c[X+20>>2]=c[w+20>>2];n=n+1|0;if((n|0)<(i|0)){o=p;f=h}else{ba=276;break}}}else{h=0;ba=315}else{o=c[M>>2]|0;i=0;h=n;do{if(v*+g[o+(i*24|0)>>2]+F*+g[o+(i*24|0)+4>>2]+B*+g[o+(i*24|0)+8>>2]>2]+F*+g[o+4>>2]+B*+g[o+8>>2]){c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];c[ha+136+16>>2]=c[o+16>>2];c[ha+136+20>>2]=c[o+20>>2];h=o+(i*24|0)|0;c[o>>2]=c[h>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];c[o+16>>2]=c[h+16>>2];c[o+20>>2]=c[h+20>>2];h=o+(i*24|0)|0;c[h>>2]=c[ha+136>>2];c[h+4>>2]=c[ha+136+4>>2];c[h+8>>2]=c[ha+136+8>>2];c[h+12>>2]=c[ha+136+12>>2];c[h+16>>2]=c[ha+136+16>>2];c[h+20>>2]=c[ha+136+20>>2];h=n}i=i+1|0}while((i|0)<(h|0));g[o+16>>2]=-1000000015047466219876688.0e6;if((h|0)>1){s=+g[o+4>>2];i=1;do{ia=+g[o+(i*24|0)>>2]-+g[o>>2];ja=+g[o+(i*24|0)+4>>2]-s;r=+g[o+(i*24|0)+8>>2]-+g[o+8>>2];q=u*ia+E*ja+t*r;r=v*ia+F*ja+B*r;if(q*q+r*r<1.1920928955078125e-07)q=0.0;else{ja=+C(+q);ja=(!(r>=0.0)?2.356194496154785:.7853981852531433)-(!(r>=0.0)?r+ja:r-ja)/(!(r>=0.0)?ja-r:r+ja)*.7853981852531433;q=q<0.0?-ja:ja}g[o+(i*24|0)+16>>2]=q;i=i+1|0}while((i|0)!=(h|0))}c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];rf(ha+36|0,ha+136|0,1,h+-1|0);i=c[M>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(43)|0;if(!h)n=0;else{c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}o=c[M>>2]|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];c[n+16>>2]=c[i+16>>2];c[n+20>>2]=c[i+20>>2];c[6995]=(c[6995]|0)+1;h=sc(67)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=c[n>>2];c[h+4>>2]=c[n+4>>2];c[h+8>>2]=c[n+8>>2];c[h+12>>2]=c[n+12>>2];c[h+16>>2]=c[n+16>>2];c[h+20>>2]=c[n+20>>2];if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}ba=h+24|0;c[ba>>2]=c[o+24>>2];c[ba+4>>2]=c[o+24+4>>2];c[ba+8>>2]=c[o+24+8>>2];c[ba+12>>2]=c[o+24+12>>2];c[ba+16>>2]=c[o+24+16>>2];c[ba+20>>2]=c[o+24+20>>2];if((c[N>>2]|0)==2){i=2;n=2}else{i=2;n=2;f=2;o=2;do{f:do if((o|0)>1){w=c[M>>2]|0;x=w+(i*24|0)|0;q=+g[x>>2];r=+g[w+(i*24|0)+4>>2];s=+g[w+(i*24|0)+8>>2];while(1){ba=o+-2|0;p=o+-1|0;F=+g[h+(ba*24|0)>>2];ia=F-+g[h+(p*24|0)>>2];B=+g[h+(ba*24|0)+4>>2];v=B-+g[h+(p*24|0)+4>>2];ja=+g[h+(ba*24|0)+8>>2];E=ja-+g[h+(p*24|0)+8>>2];if((ia*(B-r)-v*(F-q))*H+(O*(v*(ja-s)-E*(B-r))+L*(E*(F-q)-ia*(ja-s)))>0.0)break;if((p|0)>1){n=p;o=p}else{n=p;o=w;ba=240;break f}}do if((o|0)==(f|0)){w=f<<1;if((f|0)>=(w|0)){w=f;o=f;break}c[6995]=(c[6995]|0)+1;o=sc((f*48|3)+16|0)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)>0){o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=p;o=n}else w=f;while(0);o=h+(o*24|0)|0;c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2];c[o+12>>2]=c[x+12>>2];c[o+16>>2]=c[x+16>>2];c[o+20>>2]=c[x+20>>2];o=n+1|0;n=o;f=w;ba=238}else ba=238;while(0);do if((ba|0)==238){ba=0;if((o|0)!=1)break;o=c[M>>2]|0;ba=240}while(0);if((ba|0)==240){w=o+(i*24|0)|0;do if((f|0)==1){c[6995]=(c[6995]|0)+1;o=sc(67)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)<=0){if(!h){f=2;h=p;o=n;break}}else{o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=2;h=p;o=n}else o=1;while(0);o=h+(o*24|0)|0;c[o>>2]=c[w>>2];c[o+4>>2]=c[w+4>>2];c[o+8>>2]=c[w+8>>2];c[o+12>>2]=c[w+12>>2];c[o+16>>2]=c[w+16>>2];c[o+20>>2]=c[w+20>>2];o=n+1|0;n=o}i=i+1|0}while((i|0)!=(c[N>>2]|0))}ba=276}g:do if((ba|0)==276){ba=0;if((n|0)>0){G=0;o=c[ha+4>>2]|0;i=c[ha+8>>2]|0;w=a[ha+16>>0]|0;while(1){A=h+(G*24|0)+20|0;do if((o|0)==(i|0)){y=i|0?i<<1:1;if((i|0)>=(y|0)){z=w;o=i;y=i;break}do if(!y)f=0;else{c[6995]=(c[6995]|0)+1;o=sc((y<<2|3)+16|0)|0;if(!o){f=0;break}c[(o+4+15&-16)+-4>>2]=o;f=o+4+15&-16}while(0);p=c[ha+12>>2]|0;if((i|0)<=0){if(p)ba=305}else{o=0;do{c[f+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(i|0));ba=305}if((ba|0)==305){ba=0;if(w<<24>>24){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[ha+12>>2]=0;i=c[ha+4>>2]|0}c[ha+12>>2]=f;c[ha+8>>2]=y;z=1;o=i}else{z=w;y=i}while(0);c[(c[ha+12>>2]|0)+(o<<2)>>2]=c[A>>2];o=o+1|0;c[ha+4>>2]=o;i=c[N>>2]|0;h:do if((i|0)>0){x=c[M>>2]|0;f=c[A>>2]|0;p=0;while(1){w=x+(p*24|0)+20|0;p=p+1|0;if((c[w>>2]|0)==(f|0))break;if((p|0)>=(i|0))break h}c[w>>2]=-1}while(0);G=G+1|0;if((G|0)>=(n|0))break;else{i=y;w=z}}a[ha+16>>0]=z}if((i|0)<=0){ba=315;break}x=c[M>>2]|0;y=c[Z>>2]|0;z=c[$>>2]|0;A=(I|0)>0;if((y|0)>0)w=0;else{ba=315;break}while(1){G=c[x+(w*24|0)+20>>2]|0;i:do if((G|0)!=-1){if(A)f=0;else{o=0;while(1){p=c[z+(o*36|0)+4>>2]|0;if((p|0)>0){f=c[z+(o*36|0)+12>>2]|0;n=0;do{if((c[f+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(p|0))}o=o+1|0;if((o|0)>=(y|0))break i}}do{n=0;while(1){if((c[J+(n<<2)>>2]|0)==(f|0))break;n=n+1|0;if((n|0)>=(I|0)){ba=291;break}}do if((ba|0)==291){ba=0;o=c[z+(f*36|0)+4>>2]|0;if((o|0)<=0)break;p=c[z+(f*36|0)+12>>2]|0;n=0;do{if((c[p+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(o|0))}while(0);f=f+1|0}while((f|0)<(y|0))}while(0);w=w+1|0;if((w|0)>=(i|0)){ba=315;break}}}while(0);if((ba|0)==315){ba=0;ih((c[d+56>>2]|0)+24|0,ha);i=0}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}h=c[ha+12>>2]|0;if(h|0){if(a[ha+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ha+12>>2]=0}h=c[M>>2]|0;if(h|0){if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[M>>2]=0}if(i&(I|0)>0){p=0;ba=327}}else if((I|0)==1){p=0;ba=327}if((ba|0)==327)while(1){ba=0;f=c[J+(p<<2)>>2]|0;w=c[$>>2]|0;a[ha+136+16>>0]=1;c[P>>2]=0;c[ha+136+4>>2]=0;c[ha+136+8>>2]=0;o=c[w+(f*36|0)+4>>2]|0;if((o|0)>0){c[6995]=(c[6995]|0)+1;i=sc((o<<2|3)+16|0)|0;do if(!i){h=0;n=0}else{c[(i+4+15&-16)+-4>>2]=i;h=c[P>>2]|0;if((h|0)==0|(a[ha+136+16>>0]|0)==0){h=i+4+15&-16;n=i+4+15&-16;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16;n=i+4+15&-16}while(0);a[ha+136+16>>0]=1;c[P>>2]=h;c[ha+136+8>>2]=o;Yk(h|0,0,o<<2|0)|0;c[ha+136+4>>2]=o;i=c[w+(f*36|0)+12>>2]|0;h=0;do{c[n+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));h=c[P>>2]|0}else{c[ha+136+4>>2]=o;h=0}c[ha+136+20>>2]=c[w+(f*36|0)+20>>2];c[ha+136+20+4>>2]=c[w+(f*36|0)+20+4>>2];c[ha+136+20+8>>2]=c[w+(f*36|0)+20+8>>2];c[ha+136+20+12>>2]=c[w+(f*36|0)+20+12>>2];ih((c[d+56>>2]|0)+24|0,ha+136|0);if(h|0){if(a[ha+136+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[P>>2]=0}p=p+1|0;if((p|0)>=(I|0))break;else ba=327}if(!((J|0)==0|(K|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[K+-4>>2]|0)}}while((k|0)!=0)}else{Y=0;m=0}X=c[d+56>>2]|0;c[X+64>>2]=0;c[X+64+4>>2]=0;c[X+64+8>>2]=0;c[X+64+12>>2]=0;h=c[X+28>>2]|0;if((h|0)>0){W=0;i=0;k=0;I=0;K=0;f=0;n=0;J=0;w=0;o=0;G=0;z=0;x=0;y=0;p=0;while(1){A=c[X+36>>2]|0;V=c[A+(W*36|0)+4>>2]|0;if((V|0)>0){U=W&65535;T=W|-65536;N=0;S=J;P=w;h=A;M=p;while(1){R=N+1|0;d=c[h+(W*36|0)+12>>2]|0;w=c[d+(N<<2)>>2]&65535;N=c[d+(((R|0)==(V|0)?0:R)<<2)>>2]&65535;d=N<<16>>16>w<<16>>16?w:N;Q=N<<16>>16>w<<16>>16?N:w;p=N<<16>>16>w<<16>>16?w:N;w=N<<16>>16>w<<16>>16?N:w;N=P+-1|0;j:do if((((p&65535)<<16)+(w<<16>>16)&N)>>>0>>0?(ca=c[k+((((p&65535)<<16)+(w<<16>>16)&N)<<2)>>2]|0,(ca|0)!=-1):0){h=ca;while(1){if(w<<16>>16==(b[i+(h<<2)>>1]|0)?p<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1){J=0;break j}}J=o+(h<<2)|0}else J=0;while(0);h=c[X+16>>2]|0;u=+g[h+(p<<16>>16<<4)>>2]-+g[h+(w<<16>>16<<4)>>2];v=+g[h+(p<<16>>16<<4)+4>>2]-+g[h+(w<<16>>16<<4)+4>>2];s=+g[h+(p<<16>>16<<4)+8>>2]-+g[h+(w<<16>>16<<4)+8>>2];t=1.0/+D(+(u*u+v*v+s*s));h=c[X+48>>2]|0;k:do if((h|0)>0){w=c[X+56>>2]|0;p=0;while(1){q=+g[w+(p<<4)>>2];r=+g[w+(p<<4)+8>>2];do if(!(+C(+(q-u*t))>1.0e-06)){if(+C(+(+g[w+(p<<4)+4>>2]-v*t))>1.0e-06)break;if(!(+C(+(r-s*t))>1.0e-06))break k}while(0);do if(!(+C(+(u*t+q))>1.0e-06)){if(+C(+(v*t+ +g[w+(p<<4)+4>>2]))>1.0e-06)break;if(!(+C(+(s*t+r))>1.0e-06))break k}while(0);p=p+1|0;if((p|0)>=(h|0)){ba=367;break}}}else ba=367;while(0);if((ba|0)==367){ba=0;do if((h|0)==(c[X+52>>2]|0)){A=h|0?h<<1:1;if((h|0)>=(A|0))break;if(!A)w=0;else{c[6995]=(c[6995]|0)+1;h=sc((A<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}w=h;h=c[X+48>>2]|0}if((h|0)>0){p=0;do{ka=w+(p<<4)|0;la=(c[X+56>>2]|0)+(p<<4)|0;c[ka>>2]=c[la>>2];c[ka+4>>2]=c[la+4>>2];c[ka+8>>2]=c[la+8>>2];c[ka+12>>2]=c[la+12>>2];p=p+1|0}while((p|0)!=(h|0))}h=c[X+56>>2]|0;if(h|0){if(a[X+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[X+56>>2]=0}a[X+60>>0]=1;c[X+56>>2]=w;c[X+52>>2]=A;h=c[X+48>>2]|0}while(0);la=c[X+56>>2]|0;g[la+(h<<4)>>2]=u*t;g[la+(h<<4)+4>>2]=v*t;g[la+(h<<4)+8>>2]=s*t;g[la+(h<<4)+12>>2]=0.0;c[X+48>>2]=(c[X+48>>2]|0)+1}l:do if(!J){J=((d&65535)<<16)+(Q<<16>>16)&N;m:do if(J>>>0>>0){h=c[k+(J<<2)>>2]|0;if((h|0)==-1)break;while(1){if(Q<<16>>16==(b[i+(h<<2)>>1]|0)?d<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1)break m}A=o+(h<<2)|0;b[A>>1]=T;b[A+2>>1]=T>>>16;A=K;J=S;w=P;h=z;p=M;break l}while(0);do if((S|0)==(P|0)){w=S|0?S<<1:1;if((S|0)>=(w|0)){w=S;break}do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((S|0)<=0){if(!o){o=p;break}}else{h=0;do{la=p+(h<<2)|0;ka=o+(h<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;h=h+1|0}while((h|0)!=(S|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);o=p}else w=P;while(0);N=o+(S<<2)|0;b[N>>1]=T;b[N+2>>1]=T>>>16;N=S+1|0;do if((G|0)==(x|0)){x=G|0?G<<1:1;if((G|0)>=(x|0)){x=G;break}do if(!x)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((x<<2|3)+16|0)|0;if(!h){h=0;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}while(0);if((G|0)<=0){if(!i){i=h;break}}else{p=0;do{la=h+(p<<2)|0;ka=i+(p<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;p=p+1|0}while((p|0)!=(G|0))}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);i=h}while(0);la=i+(G<<2)|0;b[la>>1]=(d&65535)<<16|Q&65535;b[la+2>>1]=((d&65535)<<16|Q&65535)>>>16;G=G+1|0;if((P|0)<(w|0)){do if((I|0)<(w|0)){do if((z|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((I|0)<=0){if(!k){k=p;J=w;M=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[k+(h<<2)>>2];h=h+1|0}while((h|0)!=(I|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);k=p;J=w;M=p}else J=z;while(0);z=w<<2;Yk(k+(I<<2)|0,0,z-(I<<2)|0)|0;if((K|0)<(w|0)){do if((f|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((z|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((K|0)<=0){if(!n){f=w;n=p;h=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[n+(h<<2)>>2];h=h+1|0}while((h|0)!=(K|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);f=w;n=p;h=p}else h=y;while(0);Yk(n+(K<<2)|0,0,z-(K<<2)|0)|0;y=h}if((w|0)>0){Yk(M|0,-1,z|0)|0;Yk(y|0,-1,z|0)|0}if((I|0)<=0){I=w;A=w;h=J;p=M;break}p=w+-1|0;h=0;do{la=k+(((e[i+(h<<2)+2>>1]<<16)+(b[i+(h<<2)>>1]|0)&p)<<2)|0;c[n+(h<<2)>>2]=c[la>>2];c[la>>2]=h;h=h+1|0}while((h|0)!=(I|0));I=w;A=w;h=J;p=M}else{A=K;h=z;p=M}while(0);J=((d&65535)<<16)+(Q<<16>>16)&w+-1}else{A=K;h=z;p=M}J=k+(J<<2)|0;c[n+(S<<2)>>2]=c[J>>2];c[J>>2]=S;J=N}else{b[J+2>>1]=U;A=K;J=S;w=P;h=z;p=M}while(0);if((R|0)>=(V|0))break;N=R;K=A;S=J;P=w;z=h;h=c[X+36>>2]|0;M=p}z=h;h=c[X+28>>2]|0}else A=K;W=W+1|0;if((W|0)>=(h|0))break;else K=A}if((h|0)>0){z=c[X+36>>2]|0;A=c[X+16>>2]|0;y=0;q=0.0;do{f=c[z+(y*36|0)+4>>2]|0;w=c[z+(y*36|0)+12>>2]|0;x=c[w>>2]|0;if((f+-2|0)>=1){p=1;r=+g[X+64>>2];s=+g[X+68>>2];t=+g[X+72>>2];do{ka=c[w+(p<<2)>>2]|0;p=p+1|0;la=c[w+(((p|0)%(f|0)|0)<<2)>>2]|0;u=+g[A+(x<<4)>>2];v=+g[A+(ka<<4)>>2];E=+g[A+(x<<4)+4>>2];F=+g[A+(ka<<4)+4>>2];L=+g[A+(x<<4)+8>>2];O=+g[A+(ka<<4)+8>>2];B=+g[A+(la<<4)>>2];H=+g[A+(la<<4)+4>>2];ia=+g[A+(la<<4)+8>>2];ja=+D(+(((u-v)*(E-H)-(E-F)*(u-B))*((u-v)*(E-H)-(E-F)*(u-B))+(((E-F)*(L-ia)-(L-O)*(E-H))*((E-F)*(L-ia)-(L-O)*(E-H))+((L-O)*(u-B)-(u-v)*(L-ia))*((L-O)*(u-B)-(u-v)*(L-ia)))))*.5;r=r+(u+v+B)*.3333333432674408*ja;g[X+64>>2]=r;s=(E+F+H)*.3333333432674408*ja+s;g[X+68>>2]=s;t=ja*(L+O+ia)*.3333333432674408+t;g[X+72>>2]=t;q=q+ja}while((p|0)!=(f+-1|0))}y=y+1|0}while((y|0)!=(h|0));p=X+64|0;w=i;f=k;i=1}else ba=346}else{i=0;k=0;n=0;o=0;ba=346}if((ba|0)==346){q=0.0;p=X+64|0;w=i;f=k;i=0}t=1.0/q;u=t*+g[p>>2];g[p>>2]=u;s=t*+g[X+68>>2];g[X+68>>2]=s;t=t*+g[X+72>>2];g[X+72>>2]=t;g[X+96>>2]=3402823466385288598117041.0e14;if(i){k=c[X+36>>2]|0;i=0;r=3402823466385288598117041.0e14;while(1){q=+C(+(+g[k+(i*36|0)+32>>2]+(+g[k+(i*36|0)+20>>2]*u+ +g[k+(i*36|0)+24>>2]*s+ +g[k+(i*36|0)+28>>2]*t)));if(q>2]=q;else q=r;i=i+1|0;if((i|0)>=(h|0)){B=q;break}else r=q}}else B=3402823466385288598117041.0e14;i=c[X+8>>2]|0;if((i|0)>0){k=c[X+16>>2]|0;h=0;u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14;do{ja=+g[k+(h<<4)>>2];q=jat?ja:t;ja=+g[k+(h<<4)+4>>2];r=jav?ja:v;ja=+g[k+(h<<4)+8>>2];s=jau?ja:u;h=h+1|0}while((h|0)!=(i|0))}else{u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14}g[X+100>>2]=q+t;g[X+104>>2]=r+v;g[X+108>>2]=s+u;g[X+112>>2]=0.0;ja=t-q;q=v-r;r=u-s;g[X+116>>2]=ja;g[X+120>>2]=q;g[X+124>>2]=r;g[X+128>>2]=0.0;s=B/1.7320507764816284;p=+g[X+116+((ja>2]>2]*.5-s)*.0009765625;g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s;r=+g[X+116+(p<<2)>>2]*.5;g[X+80+(p<<2)>>2]=r;h=0;while(1){if(dh(X)|0){ba=452;break}r=r-q;g[X+80+(p<<2)>>2]=r;h=h+1|0;if((h|0)>=1024){ba=451;break}}n:do if((ba|0)==451){g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s}else if((ba|0)==452){q=(+g[X+96>>2]-s)*.0009765625;h=0;k=c[X+80+((1<<(1<>2]|0;while(1){i=c[X+80+((1<>2]|0;g[X+80+((1<>2]=q+(c[j>>2]=i,+g[j>>2]);r=q+ +g[X+80+((1<<(1<>2];g[X+80+((1<<(1<>2]=r;h=h+1|0;if(!(dh(X)|0))break;if((h|0)>=1024)break n;else k=(g[j>>2]=r,c[j>>2]|0)}c[X+80+((1<>2]=i;c[X+80+((1<<(1<>2]=k}while(0);if(w|0){c[6996]=(c[6996]|0)+1;Cd(c[w+-4>>2]|0)}if(o|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}if(!((m|0)==0|(Y|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[Y+-4>>2]|0)}o=c[Z>>2]|0;p=c[$>>2]|0;if((o|0)<=0){if(p|0)ba=473}else{h=0;do{k=p+(h*36|0)+4|0;m=p+(h*36|0)+12|0;n=c[m>>2]|0;i=p+(h*36|0)+16|0;if(n|0){if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[m>>2]=0}a[i>>0]=1;c[m>>2]=0;c[k>>2]=0;c[p+(h*36|0)+8>>2]=0;h=h+1|0}while((h|0)!=(o|0));ba=473}if((ba|0)==473){if(a[ha+56+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[$>>2]=0}if(!((aa|0)==0|(_|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[_+-4>>2]|0)}h=c[da>>2]|0;if(h|0){if(a[ha+76+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[da>>2]=0}a[ha+76+56>>0]=1;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;h=c[ea>>2]|0;if(h|0){if(a[ha+76+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ea>>2]=0}a[ha+76+36>>0]=1;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;h=c[fa>>2]|0;if(h|0){if(a[ha+76+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[fa>>2]=0}if(!ga){l=ha;return 1}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);l=ha;return 1}function ec(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0.0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0,ja=0,ka=0.0,la=0.0,ma=0.0,na=0,oa=0.0,pa=0,qa=0,ra=0,sa=0,ta=0;ta=l;l=l+1072|0;j=c[b+56>>2]|0;if(!j){j=c[b+4>>2]|0;j=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[d+8>>2]|0,c[e+8>>2]|0)|0;c[b+56>>2]=j;a[b+52>>0]=1}c[h+4>>2]=j;ra=c[d+4>>2]|0;pa=c[e+4>>2]|0;a:do switch(c[ra+4>>2]|0){case 10:switch(c[pa+4>>2]|0){case 10:{oa=+g[j+784>>2];sa=c[ra+56>>2]|0;b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(sa<<2)>>2],+g[ra+32+(((sa+2|0)%3|0)<<2)>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],sa,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}case 8:{oa=+g[j+784>>2];b=c[ra+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(b<<2)>>2],+g[ra+32+(((b+2|0)%3|0)<<2)>>2],0.0,+g[pa+32>>2]*+g[pa+16>>2],b,1,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}default:{m=pa+4|0;break a}}case 8:{if((c[pa+4>>2]|0)==10){oa=+g[j+784>>2];b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,0.0,+g[ra+32>>2]*+g[ra+16>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],1,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}else m=pa+4|0;break}default:m=pa+4|0}while(0);g[ta+488+128>>2]=999999984306749440.0;g[ta+128+308>>2]=9.999999747378752e-05;a[ta+128+332>>0]=0;j=c[b+8>>2]|0;c[ta+48>>2]=9552;c[ta+48+4>>2]=0;c[ta+48+8>>2]=1065353216;c[ta+48+12>>2]=0;g[ta+48+16>>2]=0.0;c[ta+48+20>>2]=j;c[ta+48+24>>2]=ta+128;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;c[ta+48+36>>2]=c[ra+4>>2];c[ta+48+40>>2]=c[m>>2];g[ta+48+44>>2]=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);g[ta+48+48>>2]=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);a[ta+48+52>>0]=0;c[ta+48+60>>2]=-1;c[ta+48+72>>2]=1;c[ta+48+76>>2]=1;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;ma=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);oa=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);oa=ma+oa+ +g[(c[b+56>>2]|0)+784>>2]+ +g[h+32>>2];g[ta+488+128>>2]=oa*oa;j=c[d+12>>2]|0;c[ta+488>>2]=c[j>>2];c[ta+488+4>>2]=c[j+4>>2];c[ta+488+8>>2]=c[j+8>>2];c[ta+488+12>>2]=c[j+12>>2];n=ta+488+16|0;c[n>>2]=c[j+16>>2];c[n+4>>2]=c[j+16+4>>2];c[n+8>>2]=c[j+16+8>>2];c[n+12>>2]=c[j+16+12>>2];s=ta+488+32|0;c[s>>2]=c[j+32>>2];c[s+4>>2]=c[j+32+4>>2];c[s+8>>2]=c[j+32+8>>2];c[s+12>>2]=c[j+32+12>>2];t=ta+488+48|0;c[t>>2]=c[j+48>>2];c[t+4>>2]=c[j+48+4>>2];c[t+8>>2]=c[j+48+8>>2];c[t+12>>2]=c[j+48+12>>2];j=c[e+12>>2]|0;u=ta+488+64|0;c[u>>2]=c[j>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];L=ta+488+80|0;c[L>>2]=c[j+16>>2];c[L+4>>2]=c[j+16+4>>2];c[L+8>>2]=c[j+16+8>>2];c[L+12>>2]=c[j+16+12>>2];M=ta+488+96|0;c[M>>2]=c[j+32>>2];c[M+4>>2]=c[j+32+4>>2];c[M+8>>2]=c[j+32+8>>2];c[M+12>>2]=c[j+32+12>>2];N=ta+488+112|0;c[N>>2]=c[j+48>>2];c[N+4>>2]=c[j+48+4>>2];c[N+8>>2]=c[j+48+8>>2];c[N+12>>2]=c[j+48+12>>2];j=c[ra+4>>2]|0;if((j|0)<7?(k=c[m>>2]|0,(k|0)<7):0){c[ta+40>>2]=6428;if(!j){j=k;o=0.0}else{o=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);j=c[m>>2]|0}if(!j)i=0.0;else i=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);c[ta>>2]=6456;c[ta+4>>2]=h;g[ta+24>>2]=o;g[ta+28>>2]=i;a[ta+36>>0]=0;ia=c[ra+56>>2]|0;b:do if(ia|0){ja=c[pa+56>>2]|0;do if(!ja){if((c[m>>2]|0)!=1)break b;t=ta+1e3+16|0;a[t>>0]=1;u=ta+1e3+12|0;c[u>>2]=0;s=ta+1e3+4|0;c[s>>2]=0;n=ta+1e3+8|0;c[n>>2]=0;j=c[e+12>>2]|0;ma=+g[pa+60>>2];oa=+g[pa+60+4>>2];p=+g[pa+60+8>>2];i=ma*+g[j>>2]+oa*+g[j+4>>2]+p*+g[j+8>>2]+ +g[j+48>>2];o=ma*+g[j+16>>2]+oa*+g[j+20>>2]+p*+g[j+24>>2]+ +g[j+52>>2];p=ma*+g[j+32>>2]+oa*+g[j+36>>2]+p*+g[j+40>>2]+ +g[j+56>>2];c[6995]=(c[6995]|0)+1;j=sc(35)|0;if(!j)k=0;else{c[(j+4+15&-16)+-4>>2]=j;k=j+4+15&-16}j=c[u>>2]|0;if(!j)j=0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);j=c[s>>2]|0;c[u>>2]=0}a[t>>0]=1;c[u>>2]=k;c[n>>2]=1;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;sa=c[e+12>>2]|0;ma=+g[pa+60+16>>2];oa=+g[pa+60+20>>2];p=+g[pa+60+24>>2];i=ma*+g[sa>>2]+oa*+g[sa+4>>2]+p*+g[sa+8>>2]+ +g[sa+48>>2];o=ma*+g[sa+16>>2]+oa*+g[sa+20>>2]+p*+g[sa+24>>2]+ +g[sa+52>>2];p=ma*+g[sa+32>>2]+oa*+g[sa+36>>2]+p*+g[sa+40>>2]+ +g[sa+56>>2];if((j|0)==(c[n>>2]|0)?(O=j|0?j<<1:1,(j|0)<(O|0)):0){if(!O)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((O<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{sa=m+(k<<4)|0;qa=(c[u>>2]|0)+(k<<4)|0;c[sa>>2]=c[qa>>2];c[sa+4>>2]=c[qa+4>>2];c[sa+8>>2]=c[qa+8>>2];c[sa+12>>2]=c[qa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=O;j=c[s>>2]|0}sa=c[u>>2]|0;g[sa+(j<<4)>>2]=i;g[sa+(j<<4)+4>>2]=o;g[sa+(j<<4)+8>>2]=p;g[sa+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;e=c[e+12>>2]|0;ma=+g[pa+60+32>>2];oa=+g[pa+60+36>>2];p=+g[pa+60+40>>2];i=ma*+g[e>>2]+oa*+g[e+4>>2]+p*+g[e+8>>2]+ +g[e+48>>2];o=ma*+g[e+16>>2]+oa*+g[e+20>>2]+p*+g[e+24>>2]+ +g[e+52>>2];p=ma*+g[e+32>>2]+oa*+g[e+36>>2]+p*+g[e+40>>2]+ +g[e+56>>2];if((j|0)==(c[n>>2]|0)?(S=j|0?j<<1:1,(j|0)<(S|0)):0){if(!S)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((S<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{e=m+(k<<4)|0;sa=(c[u>>2]|0)+(k<<4)|0;c[e>>2]=c[sa>>2];c[e+4>>2]=c[sa+4>>2];c[e+8>>2]=c[sa+8>>2];c[e+12>>2]=c[sa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=S;j=c[s>>2]|0}e=c[u>>2]|0;g[e+(j<<4)>>2]=i;g[e+(j<<4)+4>>2]=o;g[e+(j<<4)+8>>2]=p;g[e+(j<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;q=+g[(c[b+56>>2]|0)+784>>2];Dc(ta+48|0,ta+488|0,ta+40|0,c[f+20>>2]|0,0);i=+g[ta+48+4>>2];o=+g[ta+48+8>>2];p=+g[ta+48+12>>2];if(i*i+o*o+p*p>1.1920928955078125e-07){oa=1.0/(i*i+o*o+p*p);g[ta+760>>2]=i*oa;g[ta+760+4>>2]=o*oa;g[ta+760+8>>2]=p*oa;g[ta+760+12>>2]=0.0;oa=+g[ta+48+56>>2];i=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);i=oa-i-+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);j=c[b+36>>2]|0;if((j|0)<0){if((c[b+40>>2]|0)<0){k=c[b+44>>2]|0;if(k|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+40>>2]=0}do{e=(c[b+44>>2]|0)+(j<<4)|0;c[e>>2]=c[ta+744>>2];c[e+4>>2]=c[ta+744+4>>2];c[e+8>>2]=c[ta+744+8>>2];c[e+12>>2]=c[ta+744+12>>2];j=j+1|0}while((j|0)!=0)}c[b+36>>2]=0;Mc(ta+760|0,c[ra+56>>2]|0,c[d+12>>2]|0,ta+1e3|0,b+32|0,i-q,q,h)}do if(a[b+52>>0]|0?(W=c[h+4>>2]|0,c[W+780>>2]|0):0){k=c[W+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(W,k+4|0,j+4|0);break}else{af(W,j+4|0,m+4|0);break}}while(0);j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}}else{oa=+g[(c[b+56>>2]|0)+784>>2];c:do if(!(a[f+24>>0]|0)){Dc(ta+48|0,ta+488|0,ta,c[f+20>>2]|0,0);i=+g[ta+32>>2];if(i<0.0&(a[ta+36>>0]|0)!=0){o=+g[ta+8>>2];p=+g[ta+12>>2];q=+g[ta+16>>2];m=c[ta+20>>2]|0;na=107}}else{u=c[d+12>>2]|0;L=c[e+12>>2]|0;c[6411]=(c[6411]|0)+1;da=+g[ia+64>>2];ea=+g[ia+68>>2];r=+g[u+4>>2];fa=+g[ia+72>>2];v=+g[u+8>>2];x=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2];ga=+g[ja+64>>2];ha=+g[ja+68>>2];ma=+g[ja+72>>2];ka=da*+g[u>>2]+ea*r+fa*v+ +g[u+48>>2]-(ga*+g[L>>2]+ha*+g[L+4>>2]+ma*+g[L+8>>2]+ +g[L+48>>2]);la=da*x+ea*z+fa*B+ +g[u+52>>2]-(ga*+g[L+16>>2]+ha*+g[L+20>>2]+ma*+g[L+24>>2]+ +g[L+52>>2]);ma=da*E+ea*A+fa*y+ +g[u+56>>2]-(ga*+g[L+32>>2]+ha*+g[L+36>>2]+ma*+g[L+40>>2]+ +g[L+56>>2]);m=c[ia+28>>2]|0;d:do if((m|0)>0){i=3402823466385288598117041.0e14;j=0;w=0.0;o=0.0;p=0.0;q=0.0;H=x;while(1){f=c[ia+36>>2]|0;fa=+g[f+(j*36|0)+20>>2];ga=+g[f+(j*36|0)+24>>2];ha=+g[f+(j*36|0)+28>>2];x=fa*+g[u>>2]+ga*r+ha*v;v=fa*H+ga*z+ha*B;r=fa*E+ga*A+ha*y;g[ta+656>>2]=x;g[ta+656+4>>2]=v;g[ta+656+8>>2]=r;g[ta+656+12>>2]=0.0;if(ka*x+la*v+ma*r<0.0){g[ta+656>>2]=-x;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-r;B=-x;v=-v;r=-r}else B=x;c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,B,v,r,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);x=+g[ta+760>>2];y=+g[ta+744>>2];do if(x>2];A=+g[ta+1e3>>2];if(z=(m|0))break d;r=+g[u+4>>2];v=+g[u+8>>2];H=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2]}break c}else{i=3402823466385288598117041.0e14;o=0.0;p=0.0;q=0.0}while(0);m=c[ja+28>>2]|0;e:do if((m|0)>0){k=0;x=0.0;while(1){f=c[ja+36>>2]|0;ga=+g[f+(k*36|0)+20>>2];ha=+g[f+(k*36|0)+24>>2];w=+g[f+(k*36|0)+28>>2];r=ga*+g[L>>2]+ha*+g[L+4>>2]+w*+g[L+8>>2];v=ga*+g[L+16>>2]+ha*+g[L+20>>2]+w*+g[L+24>>2];w=ga*+g[L+32>>2]+ha*+g[L+36>>2]+w*+g[L+40>>2];g[ta+656>>2]=r;g[ta+656+4>>2]=v;g[ta+656+8>>2]=w;g[ta+656+12>>2]=0.0;if(ka*r+la*v+ma*w<0.0){g[ta+656>>2]=-r;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-w;r=-r;v=-v;w=-w}c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,r,v,w,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);y=+g[ta+760>>2];z=+g[ta+744>>2];do if(y>2];B=+g[ta+1e3>>2];if(A=(m|0))break e}break c}while(0);j=c[ia+48>>2]|0;f:do if((j|0)>0){t=0;k=-1;n=-1;w=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0;x=0.0;A=0.0;B=0.0;v=0.0;r=0.0;E=0.0;V=0.0;U=0.0;T=0.0;R=0.0;Q=0.0;P=0.0;m=c[ja+48>>2]|0;g:while(1){f=c[ia+56>>2]|0;da=+g[f+(t<<4)>>2];ea=+g[f+(t<<4)+4>>2];ha=+g[f+(t<<4)+8>>2];fa=da*+g[u>>2]+ea*+g[u+4>>2]+ha*+g[u+8>>2];ga=da*+g[u+16>>2]+ea*+g[u+20>>2]+ha*+g[u+24>>2];ha=da*+g[u+32>>2]+ea*+g[u+36>>2]+ha*+g[u+40>>2];if((m|0)>0){s=0;ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E;while(1){f=c[ja+56>>2]|0;A=+g[f+(s<<4)>>2];B=+g[f+(s<<4)+4>>2];Y=+g[f+(s<<4)+8>>2];E=A*+g[L>>2]+B*+g[L+4>>2]+Y*+g[L+8>>2];X=A*+g[L+16>>2]+B*+g[L+20>>2]+Y*+g[L+24>>2];Y=A*+g[L+32>>2]+B*+g[L+36>>2]+Y*+g[L+40>>2];g[ta+656>>2]=ga*Y-ha*X;g[ta+656+4>>2]=ha*E-fa*Y;g[ta+656+8>>2]=fa*X-ga*E;g[ta+656+12>>2]=0.0;do if(!(+C(+(ga*Y-ha*X))>1.0e-06)){if(+C(+(ha*E-fa*Y))>1.0e-06){na=71;break}if(!(+C(+(fa*X-ga*E))>1.0e-06)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa}else na=71}else na=71;while(0);do if((na|0)==71){na=0;q=1.0/+D(+((ga*Y-ha*X)*(ga*Y-ha*X)+(ha*E-fa*Y)*(ha*E-fa*Y)+(fa*X-ga*E)*(fa*X-ga*E)));o=(ga*Y-ha*X)*q;g[ta+656>>2]=o;p=(ha*E-fa*Y)*q;g[ta+656+4>>2]=p;q=(fa*X-ga*E)*q;g[ta+656+8>>2]=q;if(o*ka+p*la+ma*q<0.0){g[ta+656>>2]=-o;g[ta+656+4>>2]=-p;g[ta+656+8>>2]=-q;o=-o;p=-p;q=-q}c[6409]=(c[6409]|0)+1;if(!(Ii(u,L,ka,la,ma,o,p,q,ia,ja,i)|0)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa;break}c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);w=+g[ta+760>>2];x=+g[ta+744>>2];do if(!(w>2];B=+g[ta+1e3>>2];if(A>2];U=+g[ta+688+4>>2];V=+g[ta+688+8>>2];B=+g[ta+704>>2];A=+g[ta+704+4>>2];x=+g[ta+704+8>>2];break}else{j=1;w=A-B;T=+g[ta+672>>2];U=+g[ta+672+4>>2];V=+g[ta+672+8>>2];B=+g[ta+720>>2];A=+g[ta+720+4>>2];x=+g[ta+720+8>>2];break}}else{j=0;w=ba;B=_;A=$;x=aa}while(0);if(!j)break g;if(!(w>2]|0;if((s|0)>=(m|0))break;else{ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E}}j=c[ia+48>>2]|0}t=t+1|0;if((t|0)>=(j|0)){j=n;i=E;break f}}break c}else{k=-1;j=-1;v=0.0;r=0.0;i=0.0;R=0.0;Q=0.0;P=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0}while(0);if((k|j|0)>-1){A=P-i;B=Q-r;E=R-v;w=z*K+y*J+H*I;x=A*K+B*J+E*I;r=A*z+B*y+E*H;if(!(1.0-w*w==0.0))if(!((x-r*w)/(1.0-w*w)<-1000000015047466219876688.0e6))if((x-r*w)/(1.0-w*w)>1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;na=90}else v=(x-r*w)/(1.0-w*w);else{i=-1000000015047466219876688.0e6;na=90}else{i=0.0;na=90}if((na|0)==90)v=i;i=w*v-r;do if(i<-1000000015047466219876688.0e6){if(x-w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=-1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x-w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=-1000000015047466219876688.0e6;r=x-w*1000000015047466219876688.0e6;break}i=-1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}else{if(!(i>1000000015047466219876688.0e6)){r=v;break}if(x+w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x+w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=1000000015047466219876688.0e6;r=x+w*1000000015047466219876688.0e6;break}i=1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}while(0);z=z*i;y=y*i;x=H*i;w=z+(A-K*r);v=y+(B-J*r);i=x+(E-I*r);g[ta+1e3>>2]=w;g[ta+1e3+4>>2]=v;g[ta+1e3+8>>2]=i;g[ta+1e3+12>>2]=0.0;if(w*w+v*v+i*i>1.1920928955078125e-07){r=+D(+(w*w+v*v+i*i));g[ta+1e3>>2]=w*(1.0/r);g[ta+1e3+4>>2]=1.0/r*v;g[ta+1e3+8>>2]=1.0/r*i;if(w*(1.0/r)*ka+1.0/r*v*la+1.0/r*i*ma<0.0){g[ta+1e3>>2]=-(w*(1.0/r));g[ta+1e3+4>>2]=-(1.0/r*v);g[ta+1e3+8>>2]=-(1.0/r*i)}g[ta+760>>2]=P+z;g[ta+760+4>>2]=Q+y;g[ta+760+8>>2]=R+x;g[ta+760+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,ta+1e3|0,ta+760|0,-r)}}if(ka*o+la*p+ma*q<0.0){i=-1000000015047466219876688.0e6;o=-o;p=-p;q=-q;m=0;na=107}else{i=-1000000015047466219876688.0e6;m=0;na=107}}while(0);if((na|0)==107){j=c[b+16>>2]|0;if((j|0)<0){if((c[b+20>>2]|0)<0){k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=0;c[b+20>>2]=0}do{na=(c[b+24>>2]|0)+(j<<4)|0;c[na>>2]=c[ta+1e3>>2];c[na+4>>2]=c[ta+1e3+4>>2];c[na+8>>2]=c[ta+1e3+8>>2];c[na+12>>2]=c[ta+1e3+12>>2];j=j+1|0}while((j|0)!=0)}c[b+16>>2]=0;O=c[ra+56>>2]|0;N=c[pa+56>>2]|0;M=c[d+12>>2]|0;L=c[e+12>>2]|0;K=i-oa;H=1.0/+D(+(o*o+p*p+q*q));J=o*H;I=p*H;H=q*H;g[ta+1e3>>2]=J;g[ta+1e3+4>>2]=I;g[ta+1e3+8>>2]=H;c[ta+1e3+12>>2]=m;k=c[N+28>>2]|0;if((k|0)>0){m=c[N+36>>2]|0;o=+g[L>>2];p=+g[L+4>>2];q=+g[L+8>>2];r=+g[L+16>>2];v=+g[L+20>>2];w=+g[L+24>>2];x=+g[L+32>>2];y=+g[L+36>>2];z=+g[L+40>>2];i=-3402823466385288598117041.0e14;j=0;t=-1;while(1){A=+g[m+(j*36|0)+20>>2];B=+g[m+(j*36|0)+24>>2];E=+g[m+(j*36|0)+28>>2];n=(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H>i;t=n?j:t;j=j+1|0;if((j|0)==(k|0))break;else i=n?(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H:i}}else t=-1;j=c[N+36>>2]|0;c[b+16>>2]=0;u=c[j+(t*36|0)+4>>2]|0;if((u|0)>0){s=j+(t*36|0)+12|0;n=0;k=0;do{d=c[(c[s>>2]|0)+(n<<2)>>2]|0;e=c[N+16>>2]|0;la=+g[e+(d<<4)>>2];ma=+g[e+(d<<4)+4>>2];p=+g[e+(d<<4)+8>>2];i=la*+g[L>>2]+ma*+g[L+4>>2]+p*+g[L+8>>2]+ +g[L+48>>2];o=la*+g[L+16>>2]+ma*+g[L+20>>2]+p*+g[L+24>>2]+ +g[L+52>>2];p=la*+g[L+32>>2]+ma*+g[L+36>>2]+p*+g[L+40>>2]+ +g[L+56>>2];if((k|0)==(c[b+20>>2]|0)?(qa=k|0?k<<1:1,(k|0)<(qa|0)):0){if(!qa)j=0;else{c[6995]=(c[6995]|0)+1;j=sc((qa<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=c[b+16>>2]|0}if((k|0)>0){m=0;do{d=j+(m<<4)|0;e=(c[b+24>>2]|0)+(m<<4)|0;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];m=m+1|0}while((m|0)!=(k|0))}k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=j;c[b+20>>2]=qa;j=c[b+16>>2]|0}else j=k;k=c[b+24>>2]|0;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;k=(c[b+16>>2]|0)+1|0;c[b+16>>2]=k;n=n+1|0}while((n|0)!=(u|0))}if((t|0)>-1)Mc(ta+1e3|0,O,M,b+12|0,b+32|0,K,oa,h)}if(a[b+52>>0]|0?(sa=c[h+4>>2]|0,c[sa+780>>2]|0):0){k=c[sa+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(sa,k+4|0,j+4|0);break}else{af(sa,j+4|0,m+4|0);break}}}while(0);l=ta;return}while(0)}Dc(ta+48|0,ta+488|0,h,c[f+20>>2]|0,0);if((c[b+64>>2]|0?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+68>>2]|0):0)?(K=+g[ta+48+4>>2],P=+g[ta+48+8>>2],Q=+g[ta+48+12>>2],K*K+P*P+Q*Q>1.1920928955078125e-07):0){J=1.0/(K*K+P*P+Q*Q);if(+C(+(Q*J))>.7071067690849304){I=1.0/+D(+(Q*J*Q*J+P*J*P*J));E=0.0;H=P*J*I;I=-(Q*J*I)}else{I=1.0/+D(+(K*J*K*J+P*J*P*J));E=-(P*J*I);H=0.0;I=K*J*I}B=+nb[c[(c[ra>>2]|0)+16>>2]&15](ra);z=+nb[c[(c[pa>>2]|0)+16>>2]&15](pa);i=.019999999552965164/(B>2]=c[ta+488>>2];c[ta+1e3+4>>2]=c[ta+488+4>>2];c[ta+1e3+8>>2]=c[ta+488+8>>2];c[ta+1e3+12>>2]=c[ta+488+12>>2];c[ta+1e3+16>>2]=c[n>>2];c[ta+1e3+16+4>>2]=c[n+4>>2];c[ta+1e3+16+8>>2]=c[n+8>>2];c[ta+1e3+16+12>>2]=c[n+12>>2];c[ta+1e3+32>>2]=c[s>>2];c[ta+1e3+32+4>>2]=c[s+4>>2];c[ta+1e3+32+8>>2]=c[s+8>>2];c[ta+1e3+32+12>>2]=c[s+12>>2];c[ta+1e3+48>>2]=c[t>>2];c[ta+1e3+48+4>>2]=c[t+4>>2];c[ta+1e3+48+8>>2]=c[t+8>>2];c[ta+1e3+48+12>>2]=c[t+12>>2]}else{c[ta+1e3>>2]=c[u>>2];c[ta+1e3+4>>2]=c[u+4>>2];c[ta+1e3+8>>2]=c[u+8>>2];c[ta+1e3+12>>2]=c[u+12>>2];c[ta+1e3+16>>2]=c[L>>2];c[ta+1e3+16+4>>2]=c[L+4>>2];c[ta+1e3+16+8>>2]=c[L+8>>2];c[ta+1e3+16+12>>2]=c[L+12>>2];c[ta+1e3+32>>2]=c[M>>2];c[ta+1e3+32+4>>2]=c[M+4>>2];c[ta+1e3+32+8>>2]=c[M+8>>2];c[ta+1e3+32+12>>2]=c[M+12>>2];c[ta+1e3+48>>2]=c[N>>2];c[ta+1e3+48+4>>2]=c[N+4>>2];c[ta+1e3+48+8>>2]=c[N+8>>2];c[ta+1e3+48+12>>2]=c[N+12>>2]}j=c[b+64>>2]|0;if((j|0)>0){A=E*E+I*I+H*H;y=(i>.39269909262657166?.39269909262657166:i)*.5;k=0;do{if(A>1.1920928955078125e-07){w=+G(+y)/+D(+A);r=E*w;v=I*w;w=H*w;x=+F(+y);q=+(k|0)*(6.2831854820251465/+(j|0))*.5;p=+G(+q)/+D(+(Q*J*Q*J+(K*J*K*J+P*J*P*J)));i=K*J*p;o=P*J*p;p=Q*J*p;q=+F(+q);if(B>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+4>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+8>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+12>>2]=0.0;g[ta+488+16>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+20>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+24>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+28>>2]=0.0;g[ta+488+32>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+36>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+40>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+44>>2]=0.0;sa=c[e+12>>2]|0;c[u>>2]=c[sa>>2];c[u+4>>2]=c[sa+4>>2];c[u+8>>2]=c[sa+8>>2];c[u+12>>2]=c[sa+12>>2];c[L>>2]=c[sa+16>>2];c[L+4>>2]=c[sa+16+4>>2];c[L+8>>2]=c[sa+16+8>>2];c[L+12>>2]=c[sa+16+12>>2];c[M>>2]=c[sa+32>>2];c[M+4>>2]=c[sa+32+4>>2];c[M+8>>2]=c[sa+32+8>>2];c[M+12>>2]=c[sa+32+12>>2];c[N>>2]=c[sa+48>>2];c[N+4>>2]=c[sa+48+4>>2];c[N+8>>2]=c[sa+48+8>>2];c[N+12>>2]=c[sa+48+12>>2]}else{sa=c[d+12>>2]|0;c[ta+488>>2]=c[sa>>2];c[ta+488+4>>2]=c[sa+4>>2];c[ta+488+8>>2]=c[sa+8>>2];c[ta+488+12>>2]=c[sa+12>>2];c[n>>2]=c[sa+16>>2];c[n+4>>2]=c[sa+16+4>>2];c[n+8>>2]=c[sa+16+8>>2];c[n+12>>2]=c[sa+16+12>>2];c[s>>2]=c[sa+32>>2];c[s+4>>2]=c[sa+32+4>>2];c[s+8>>2]=c[sa+32+8>>2];c[s+12>>2]=c[sa+32+12>>2];c[t>>2]=c[sa+48>>2];c[t+4>>2]=c[sa+48+4>>2];c[t+8>>2]=c[sa+48+8>>2];c[t+12>>2]=c[sa+48+12>>2];ha=p*(r*-p+(v*q+x*-o)-w*-i)+(i*(x*q-r*-i-v*-o-w*-p)+q*(w*-o+(r*q+x*-i)-v*-p))-o*(v*-i+(w*q+x*-p)-r*-o);la=i*(v*-i+(w*q+x*-p)-r*-o)+(q*(r*-p+(v*q+x*-o)-w*-i)+o*(x*q-r*-i-v*-o-w*-p))-p*(w*-o+(r*q+x*-i)-v*-p);Y=o*(w*-o+(r*q+x*-i)-v*-p)+(p*(x*q-r*-i-v*-o-w*-p)+q*(v*-i+(w*q+x*-p)-r*-o))-i*(r*-p+(v*q+x*-o)-w*-i);fa=q*(x*q-r*-i-v*-o-w*-p)-i*(w*-o+(r*q+x*-i)-v*-p)-o*(r*-p+(v*q+x*-o)-w*-i)-p*(v*-i+(w*q+x*-p)-r*-o);ka=ha*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ma=la*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ea=Y*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));sa=c[e+12>>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488+64>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+68>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+72>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+76>>2]=0.0;g[ta+488+80>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+84>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+88>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+92>>2]=0.0;g[ta+488+96>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+100>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+104>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+108>>2]=0.0}j=c[f+20>>2]|0;g[ta+760+32>>2]=0.0;c[ta+760>>2]=6484;c[ta+760+36>>2]=h;c[ta+760+40>>2]=c[ta+488>>2];c[ta+760+40+4>>2]=c[ta+488+4>>2];c[ta+760+40+8>>2]=c[ta+488+8>>2];c[ta+760+40+12>>2]=c[ta+488+12>>2];c[ta+760+56>>2]=c[n>>2];c[ta+760+56+4>>2]=c[n+4>>2];c[ta+760+56+8>>2]=c[n+8>>2];c[ta+760+56+12>>2]=c[n+12>>2];c[ta+760+72>>2]=c[s>>2];c[ta+760+72+4>>2]=c[s+4>>2];c[ta+760+72+8>>2]=c[s+8>>2];c[ta+760+72+12>>2]=c[s+12>>2];c[ta+760+88>>2]=c[t>>2];c[ta+760+88+4>>2]=c[t+4>>2];c[ta+760+88+8>>2]=c[t+8>>2];c[ta+760+88+12>>2]=c[t+12>>2];c[ta+760+104>>2]=c[u>>2];c[ta+760+104+4>>2]=c[u+4>>2];c[ta+760+104+8>>2]=c[u+8>>2];c[ta+760+104+12>>2]=c[u+12>>2];c[ta+760+120>>2]=c[L>>2];c[ta+760+120+4>>2]=c[L+4>>2];c[ta+760+120+8>>2]=c[L+8>>2];c[ta+760+120+12>>2]=c[L+12>>2];c[ta+760+136>>2]=c[M>>2];c[ta+760+136+4>>2]=c[M+4>>2];c[ta+760+136+8>>2]=c[M+8>>2];c[ta+760+136+12>>2]=c[M+12>>2];c[ta+760+152>>2]=c[N>>2];c[ta+760+152+4>>2]=c[N+4>>2];c[ta+760+152+8>>2]=c[N+8>>2];c[ta+760+152+12>>2]=c[N+12>>2];c[ta+760+168>>2]=c[ta+1e3>>2];c[ta+760+168+4>>2]=c[ta+1e3+4>>2];c[ta+760+168+8>>2]=c[ta+1e3+8>>2];c[ta+760+168+12>>2]=c[ta+1e3+12>>2];c[ta+760+184>>2]=c[ta+1e3+16>>2];c[ta+760+184+4>>2]=c[ta+1e3+16+4>>2];c[ta+760+184+8>>2]=c[ta+1e3+16+8>>2];c[ta+760+184+12>>2]=c[ta+1e3+16+12>>2];c[ta+760+200>>2]=c[ta+1e3+32>>2];c[ta+760+200+4>>2]=c[ta+1e3+32+4>>2];c[ta+760+200+8>>2]=c[ta+1e3+32+8>>2];c[ta+760+200+12>>2]=c[ta+1e3+32+12>>2];c[ta+760+216>>2]=c[ta+1e3+48>>2];c[ta+760+216+4>>2]=c[ta+1e3+48+4>>2];c[ta+760+216+8>>2]=c[ta+1e3+48+8>>2];c[ta+760+216+12>>2]=c[ta+1e3+48+12>>2];a[ta+760+232>>0]=B>2]=j;Dc(ta+48|0,ta+488|0,ta+760|0,j,0);j=c[b+64>>2]|0}k=k+1|0}while((k|0)<(j|0))}}if(!(a[b+52>>0]|0)){l=ta;return}k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}function fc(b){b=b|0;var d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0;W=l;l=l+176|0;ci(b);if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=W;return}if((c[b+348>>2]|0)<=0){l=W;return}Q=W+96+32|0;R=W+96+52|0;N=0;do{S=c[(c[b+356>>2]|0)+(N<<2)>>2]|0;if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&1|0):0){e=c[b+72>>2]|0;if(!(a[S+533>>0]|0))M=e;else{c[W+80>>2]=c[S+580>>2];c[W+80+4>>2]=c[S+580+4>>2];c[W+80+8>>2]=c[S+580+8>>2];c[W+80+12>>2]=c[S+580+12>>2];i=+g[S+644>>2];k=+g[S+596>>2];m=+g[S+660>>2];s=+g[S+600>>2];t=+g[S+676>>2];u=+g[S+604>>2];v=+g[S+648>>2];w=+g[S+664>>2];x=+g[S+680>>2];y=+g[S+652>>2];z=+g[S+668>>2];A=+g[S+684>>2];B=+g[S+612>>2];C=+g[S+616>>2];E=+g[S+620>>2];F=+g[S+628>>2];G=+g[S+632>>2];H=+g[S+636>>2];ga=i*k+m*s+t*u+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A)*0.0;ea=(y*B+z*C+A*E)*0.0+(i*B+m*C+t*E+(v*B+w*C+x*E)*0.0);da=(y*F+z*G+A*H)*0.0+(i*F+m*G+t*H+(v*F+w*G+x*H)*0.0);fa=1.0/+D(+(ga*ga+ea*ea+da*da));ca=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)+(k*y+s*z+u*A)*0.0;aa=(y*B+z*C+A*E)*0.0+(v*B+w*C+x*E+(i*B+m*C+t*E)*0.0);$=(y*F+z*G+A*H)*0.0+(v*F+w*G+x*H+(i*F+m*G+t*H)*0.0);ba=1.0/+D(+(ca*ca+aa*aa+$*$));_=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A);Y=y*B+z*C+A*E+((i*B+m*C+t*E)*0.0+(v*B+w*C+x*E)*0.0);X=y*F+z*G+A*H+((i*F+m*G+t*H)*0.0+(v*F+w*G+x*H)*0.0);Z=1.0/+D(+(_*_+Y*Y+X*X));M=c[(c[e>>2]|0)+16>>2]|0;ea=ea*fa*10.0+ +g[W+80+4>>2];da=fa*da*10.0+ +g[W+80+8>>2];g[W+160>>2]=ga*fa*10.0+ +g[W+80>>2];g[W+160+4>>2]=ea;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;aa=aa*ba*10.0+ +g[W+80+4>>2];$=ba*$*10.0+ +g[W+80+8>>2];g[W+160>>2]=ca*ba*10.0+ +g[W+80>>2];g[W+160+4>>2]=aa;g[W+160+8>>2]=$;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;Y=Y*Z*10.0+ +g[W+80+4>>2];X=Z*X*10.0+ +g[W+80+8>>2];g[W+160>>2]=_*Z*10.0+ +g[W+80>>2];g[W+160+4>>2]=Y;g[W+160+8>>2]=X;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);if((c[S+544>>2]|0)>0){d=0;do{M=c[S+552>>2]|0;ca=+g[M+(d<<4)>>2];da=+g[M+(d<<4)+4>>2];ga=+g[M+(d<<4)+8>>2];ea=+g[W+80>>2]+((i*k+m*s+t*u)*ca+(k*v+s*w+u*x)*da+(k*y+s*z+u*A)*ga);fa=+g[W+80+4>>2]+((i*B+m*C+t*E)*ca+(v*B+w*C+x*E)*da+(y*B+z*C+A*E)*ga);ga=(i*F+m*G+t*H)*ca+(v*F+w*G+x*H)*da+(y*F+z*G+A*H)*ga+ +g[W+80+8>>2];c[W+64>>2]=1065353216;c[W+64+4>>2]=0;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea+-.10000000149011612;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+.10000000149011612;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa+-.10000000149011612;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+.10000000149011612;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga+-.10000000149011612;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+.10000000149011612;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);d=d+1|0}while((d|0)<(c[S+544>>2]|0))}M=c[b+72>>2]|0}L=c[b+364>>2]|0;c[W+80>>2]=0;c[W+80+4>>2]=0;c[W+80+8>>2]=0;c[W+80+12>>2]=0;c[W+64>>2]=1065353216;c[W+64+4>>2]=1065353216;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;c[W+48>>2]=1065353216;c[W+48+4>>2]=0;c[W+48+8>>2]=0;g[W+48+12>>2]=0.0;if(!(L&256)){if(L&1|0?(T=c[S+772>>2]|0,(T|0)>0):0){f=0;d=T;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[(c[M>>2]|0)+16>>2]|0;K=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;q=c[I>>2]|0;J=e+(f*104|0)+16|0;r=c[J>>2]|0;g[W+160>>2]=+g[K>>2]+-.10000000149011612;c[W+160+4>>2]=q;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+.10000000149011612;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]+-.10000000149011612;r=c[J>>2]|0;c[W+160>>2]=c[K>>2];g[W+160+4>>2]=ga;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;ga=+g[I>>2]+.10000000149011612;fa=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=ga;g[W+96+8>>2]=fa;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;r=c[I>>2]|0;fa=+g[J>>2]+-.10000000149011612;c[W+160>>2]=c[K>>2];c[W+160+4>>2]=r;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+.10000000149011612;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=0;c[W+32+8>>2]=1065353216;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&2|0?(U=c[S+792>>2]|0,(U|0)>0):0){f=0;d=U;do{e=c[S+800>>2]|0;if(c[(c[e+(f*52|0)+4>>2]|0)+16>>2]&1){Vb[c[(c[M>>2]|0)+16>>2]&127](M,(c[e+(f*52|0)+24>>2]|0)+8|0,(c[e+(f*52|0)+28>>2]|0)+8|0,W+80|0);d=c[S+792>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&16|0?(V=c[S+772>>2]|0,(V|0)>0):0){f=0;d=V;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){ea=+g[e+(f*104|0)+72>>2]*.5;ga=+g[e+(f*104|0)+76>>2]*.5;fa=+g[e+(f*104|0)+80>>2]*.5;K=c[(c[M>>2]|0)+16>>2]|0;d=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;ca=ga+ +g[I>>2];J=e+(f*104|0)+16|0;da=fa+ +g[J>>2];g[W+160>>2]=ea+ +g[d>>2];g[W+160+4>>2]=ca;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+64|0);K=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]-ga;fa=+g[J>>2]-fa;g[W+160>>2]=+g[d>>2]-ea;g[W+160+4>>2]=ga;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[W+64+4>>2]*.5;ga=+g[W+64+8>>2]*.5;g[W+96>>2]=+g[W+64>>2]*.5;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+96|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&32|0){if((a[22472]|0)==0?Uz(22472)|0:0){c[5774]=1065353216;c[5775]=0;c[5776]=0;c[5777]=0;c[5778]=0;c[5779]=1065353216;c[5780]=0;c[5781]=0;c[5782]=0;c[5783]=0;c[5784]=1065353216;g[5785]=0.0}if((c[S+872>>2]|0)>0){d=0;do{K=c[S+880>>2]|0;I=c[K+(d*104|0)+24>>2]|0;B=+g[I+8>>2];J=K+(d*104|0)+4|0;C=+g[J>>2];G=+g[I+12>>2];r=K+(d*104|0)+8|0;H=+g[r>>2];fa=+g[I+16>>2];I=K+(d*104|0)+12|0;da=+g[I>>2];ba=+g[K+(d*104|0)+20>>2]+(B*C+G*H+fa*da);g[W+160>>2]=B-C*ba;g[W+160+4>>2]=G-H*ba;g[W+160+8>>2]=fa-da*ba;g[W+160+12>>2]=0.0;X=+g[J>>2];Z=+g[r>>2];E=+g[I>>2];K=+g[K+(d*104|0)+4+((!(X>2]>2];Y=+g[23096+(K<<4)+4>>2];_=+g[23096+(K<<4)>>2];$=1.0/+D(+((X*Y-Z*_)*(X*Y-Z*_)+((Z*F-E*Y)*(Z*F-E*Y)+(E*_-X*F)*(E*_-X*F))));aa=E*(E*_-X*F)*$-Z*(X*Y-Z*_)*$;ca=X*(X*Y-Z*_)*$-E*(Z*F-E*Y)*$;ga=Z*(Z*F-E*Y)*$-X*(E*_-X*F)*$;ea=1.0/+D(+(ga*ga+(aa*aa+ca*ca)));K=c[(c[M>>2]|0)+16>>2]|0;g[W+96>>2]=B-C*ba-(Z*F-E*Y)*$*.5;g[W+96+4>>2]=G-H*ba-(E*_-X*F)*$*.5;g[W+96+8>>2]=fa-da*ba-(X*Y-Z*_)*$*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=(Z*F-E*Y)*$*.5+(B-C*ba);g[W+32+4>>2]=(E*_-X*F)*$*.5+(G-H*ba);g[W+32+8>>2]=(X*Y-Z*_)*$*.5+(fa-da*ba);g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;ba=+g[W+160>>2];da=+g[W+160+4>>2];fa=+g[W+160+8>>2];g[W+96>>2]=ba-ea*aa*.5;g[W+96+4>>2]=da-ea*ca*.5;g[W+96+8>>2]=fa-ea*ga*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=ea*aa*.5+ba;g[W+32+4>>2]=ea*ca*.5+da;g[W+32+8>>2]=ea*ga*.5+fa;g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;fa=+g[r>>2]*.5*3.0+ +g[W+160+4>>2];ga=+g[I>>2]*.5*3.0+ +g[W+160+8>>2];g[W+96>>2]=+g[J>>2]*.5*3.0+ +g[W+160>>2];g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[K&127](M,W+160|0,W+96|0,W+32|0);d=d+1|0}while((d|0)<(c[S+872>>2]|0))}}if(L&4|0?(c[W+160>>2]=0,c[W+160+4>>2]=1060320051,c[W+160+8>>2]=0,g[W+160+12>>2]=0.0,O=c[S+812>>2]|0,(O|0)>0):0){f=0;d=O;do{e=c[S+820>>2]|0;if(c[(c[e+(f*44|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*44|0)+8>>2]|0;_=+g[d+8>>2];ba=+g[d+12>>2];ea=+g[d+16>>2];d=c[e+(f*44|0)+12>>2]|0;$=+g[d+8>>2];ca=+g[d+12>>2];fa=+g[d+16>>2];d=c[e+(f*44|0)+16>>2]|0;aa=+g[d+8>>2];da=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=(_+$+aa)*.3333333432674408+(_-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+96+4>>2]=(ba+ca+da)*.3333333432674408+(ba-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+96+8>>2]=(ea+fa+ga)*.3333333432674408+(ea-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+96+12>>2]=0.0;g[W+32>>2]=(_+$+aa)*.3333333432674408+($-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+32+4>>2]=(ba+ca+da)*.3333333432674408+(ca-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+32+8>>2]=(ea+fa+ga)*.3333333432674408+(fa-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+32+12>>2]=0.0;g[W+16>>2]=(_+$+aa)*.3333333432674408+(aa-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+16+4>>2]=(ba+ca+da)*.3333333432674408+(da-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+16+8>>2]=(ea+fa+ga)*.3333333432674408+(ga-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+812>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&8|0?(c[W+160>>2]=1050253722,c[W+160+4>>2]=1050253722,c[W+160+8>>2]=1060320051,g[W+160+12>>2]=0.0,P=c[S+832>>2]|0,(P|0)>0):0){f=0;d=P;do{e=c[S+840>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*104|0)+8>>2]|0;y=+g[d+8>>2];B=+g[d+12>>2];F=+g[d+16>>2];d=c[e+(f*104|0)+12>>2]|0;z=+g[d+8>>2];C=+g[d+12>>2];G=+g[d+16>>2];d=c[e+(f*104|0)+16>>2]|0;A=+g[d+8>>2];E=+g[d+12>>2];H=+g[d+16>>2];d=c[e+(f*104|0)+20>>2]|0;ea=+g[d+8>>2];fa=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;ba=(y+z+A+ea)*.25+(y-(y+z+A+ea)*.25)*.800000011920929;ca=(B+C+E+fa)*.25+(B-(B+C+E+fa)*.25)*.800000011920929;da=(F+G+H+ga)*.25+(F-(F+G+H+ga)*.25)*.800000011920929;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;X=(y+z+A+ea)*.25+(z-(y+z+A+ea)*.25)*.800000011920929;Y=(B+C+E+fa)*.25+(C-(B+C+E+fa)*.25)*.800000011920929;Z=(F+G+H+ga)*.25+(G-(F+G+H+ga)*.25)*.800000011920929;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;_=(y+z+A+ea)*.25+(A-(y+z+A+ea)*.25)*.800000011920929;$=(B+C+E+fa)*.25+(E-(B+C+E+fa)*.25)*.800000011920929;aa=(F+G+H+ga)*.25+(H-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=_;g[W+16+4>>2]=$;g[W+16+8>>2]=aa;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;ea=(y+z+A+ea)*.25+(ea-(y+z+A+ea)*.25)*.800000011920929;fa=(B+C+E+fa)*.25+(fa-(B+C+E+fa)*.25)*.800000011920929;ga=(F+G+H+ga)*.25+(ga-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=X;g[W+96+4>>2]=Y;g[W+96+8>>2]=Z;g[W+96+12>>2]=0.0;g[W+32>>2]=_;g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=_;g[W+96+4>>2]=$;g[W+96+8>>2]=aa;g[W+96+12>>2]=0.0;g[W+32>>2]=ba;g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+832>>2]|0}f=f+1|0}while((f|0)<(d|0))}}else{LI();d=c[S+1112>>2]|0;if((d|0)>0){K=0;do{if(a[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+377>>0]|0){da=+(rs()|0)*4.656612873077393e-10;ea=+(rs()|0)*4.656612873077393e-10;fa=+(rs()|0)*4.656612873077393e-10;ga=1.0/+D(+(fa*fa+(da*da+ea*ea)));g[W+160>>2]=da*ga*.75;g[W+160+4>>2]=ea*ga*.75;g[W+160+8>>2]=fa*ga*.75;g[W+160+12>>2]=0.0;f=c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+24>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<4|3)+16|0)|0;if(!d)e=0;else{c[(d+4+15&-16)+-4>>2]=d;e=d+4+15&-16}d=0;do{J=e+(d<<4)|0;c[J>>2]=c[W+96>>2];c[J+4>>2]=c[W+96+4>>2];c[J+8>>2]=c[W+96+8>>2];c[J+12>>2]=c[W+96+12>>2];d=d+1|0}while((d|0)!=(f|0));d=0;do{I=(c[(c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+32>>2]|0)+(d<<2)>>2]|0)+8|0;J=e+(d<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2];d=d+1|0}while((d|0)!=(f|0));J=e;I=e}else{J=0;I=0}a[W+96+16>>0]=1;c[W+96+12>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=0;a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;uc(W+96|0,I,f);q=c[W+96+44>>2]|0;if((q|0)>0){o=c[Q>>2]|0;n=0;do{r=c[(c[R>>2]|0)+(n<<2)>>2]|0;e=c[o+(r*12|0)+4>>2]|0;d=o+(r*12|0)+(e*12|0)+((c[o+(r*12|0)+(e*12|0)>>2]|0)*12|0)|0;if((d|0)!=(o+(r*12|0)|0)){p=c[W+96+12>>2]|0;e=c[o+(r*12|0)+(e*12|0)+8>>2]|0;f=c[o+(r*12|0)+8>>2]|0;while(1){h=c[d+8>>2]|0;_b[c[(c[M>>2]|0)+36>>2]&0](M,p+(e<<4)|0,p+(f<<4)|0,p+(h<<4)|0,W+160|0,1.0);e=d+((c[d+4>>2]|0)*12|0)|0;d=e+((c[e>>2]|0)*12|0)|0;if((d|0)==(o+(r*12|0)|0))break;else{e=f;f=h}}}n=n+1|0}while((n|0)<(q|0))}d=c[R>>2]|0;if(d|0){if(a[W+96+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[R>>2]=0}a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;d=c[Q>>2]|0;if(d|0){if(a[W+96+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Q>>2]=0}a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;d=c[W+96+12>>2]|0;if(d|0){if(a[W+96+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[W+96+12>>2]=0}if(!((J|0)==0|(I|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[I+-4>>2]|0)}d=c[S+1112>>2]|0}K=K+1|0}while((K|0)<(d|0))}}if(L&64|0){if((c[S+852>>2]|0)>0){d=0;do{K=c[S+860>>2]|0;q=c[K+(d*96|0)+20>>2]|0;ca=+g[K+(d*96|0)+4>>2];da=+g[K+(d*96|0)+8>>2];ea=+g[K+(d*96|0)+12>>2];fa=ca*+g[q+20>>2]+da*+g[q+24>>2]+ea*+g[q+28>>2]+ +g[q+56>>2];ga=ca*+g[q+36>>2]+da*+g[q+40>>2]+ea*+g[q+44>>2]+ +g[q+60>>2];g[W+32>>2]=ca*+g[q+4>>2]+da*+g[q+8>>2]+ea*+g[q+12>>2]+ +g[q+52>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;K=K+(d*96|0)|0;q=c[K>>2]|0;c[W+16>>2]=1065353216;c[W+16+4>>2]=0;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[q+8>>2];I=c[q+12>>2]|0;r=c[q+16>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=I;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[q+8>>2]|0;ea=+g[q+12>>2];I=c[q+16>>2]|0;c[W+160>>2]=r;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ga=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[q+8>>2]|0;r=c[q+12>>2]|0;ga=+g[q+16>>2];c[W+160>>2]=I;c[W+160+4>>2]=r;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];r=c[W+32+4>>2]|0;I=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[W+32>>2]|0;ea=+g[W+32+4>>2];r=c[W+32+8>>2]|0;c[W+160>>2]=I;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[W+32>>2]|0;I=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=r;c[W+160+4>>2]=I;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;K=(c[K>>2]|0)+8|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[J&127](M,K,W+32|0,W+160|0);d=d+1|0}while((d|0)<(c[S+852>>2]|0))}d=c[S+772>>2]|0;if((d|0)>0){f=0;do{e=c[S+780>>2]|0;if((c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1|0)!=0?+g[e+(f*104|0)+88>>2]<=0.0:0){J=e+(f*104|0)+8|0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[J>>2];K=e+(f*104|0)+12|0;r=c[K>>2]|0;I=e+(f*104|0)+16|0;q=c[I>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=q;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=q,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;q=c[J>>2]|0;ea=+g[K>>2];r=c[I>>2]|0;c[W+160>>2]=q;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=q,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;J=c[J>>2]|0;K=c[K>>2]|0;ga=+g[I>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}}if(L&128|0?(c[S+752>>2]|0)>0:0){e=0;do{f=c[S+760>>2]|0;h=f+(e*60|0)+8|0;c[W+160>>2]=c[h>>2];c[W+160+4>>2]=c[h+4>>2];c[W+160+8>>2]=c[h+8>>2];c[W+160+12>>2]=c[h+12>>2];h=c[f+(e*60|0)+24>>2]|0;if((h|0)>0){d=0;i=+g[W+160>>2];k=+g[W+160+4>>2];m=+g[W+160+8>>2];do{K=c[f+(e*60|0)+28+(d<<2)>>2]|0;ga=+g[f+(e*60|0)+44+(d<<2)>>2];i=+g[K+8>>2]*ga+i;k=ga*+g[K+12>>2]+k;m=ga*+g[K+16>>2]+m;g[W+160+8>>2]=m;d=d+1|0}while((d|0)!=(h|0));g[W+160>>2]=i;g[W+160+4>>2]=k}Sb[c[(c[M>>2]|0)+48>>2]&127](M,W+160|0,c[f+(e*60|0)+4>>2]|0);e=e+1|0}while((e|0)<(c[S+752>>2]|0))}if(L&512|0){K=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&1024|0){K=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&2048|0){K=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}a:do if(L&4096|0?(c[S+912>>2]|0)>0:0){d=0;while(1){e=c[(c[S+920>>2]|0)+(d<<2)>>2]|0;switch(xb[c[(c[e>>2]|0)+20>>2]&127](e)|0){case 0:{L=ui(e+4|0)|0;ga=+g[e+28>>2];fa=+g[e+32>>2];ea=+g[e+36>>2];da=ga*+g[L+16>>2]+fa*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ca=ga*+g[L+32>>2]+fa*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+32>>2]=ga*+g[L>>2]+fa*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+32+4>>2]=da;g[W+32+8>>2]=ca;g[W+32+12>>2]=0.0;L=ui(e+16|0)|0;ca=+g[e+44>>2];da=+g[e+48>>2];ea=+g[e+52>>2];fa=ca*+g[L+16>>2]+da*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ga=ca*+g[L+32>>2]+da*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+16>>2]=ca*+g[L>>2]+da*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;K=(ui(e+4|0)|0)+48|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;Vb[L&127](M,K,W+32|0,W+160|0);K=c[(c[M>>2]|0)+16>>2]|0;L=(ui(e+16|0)|0)+48|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[K&127](M,L,W+16|0,W+160|0);c[W>>2]=1065353216;c[W+4>>2]=1065353216;c[W+8>>2]=0;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];K=c[W+32+4>>2]|0;J=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=K;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+32>>2]|0;ea=+g[W+32+4>>2];K=c[W+32+8>>2]|0;c[W+160>>2]=J;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ga=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+32>>2]|0;J=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=K;c[W+160+4>>2]=J;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);c[W>>2]=0;c[W+4>>2]=1065353216;c[W+8>>2]=1065353216;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+16>>2];J=c[W+16+4>>2]|0;K=c[W+16+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=J;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+16>>2]|0;ea=+g[W+16+4>>2];J=c[W+16+8>>2]|0;c[W+160>>2]=K;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ga=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+16>>2]|0;K=c[W+16+4>>2]|0;ga=+g[W+16+8>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);break}case 1:{L=(ui(e+4|0)|0)+48|0;c[W+160>>2]=c[L>>2];c[W+160+4>>2]=c[L+4>>2];c[W+160+8>>2]=c[L+8>>2];c[W+160+12>>2]=c[L+12>>2];L=(ui(e+16|0)|0)+48|0;c[W+96>>2]=c[L>>2];c[W+96+4>>2]=c[L+4>>2];c[W+96+8>>2]=c[L+8>>2];c[W+96+12>>2]=c[L+12>>2];L=ui(e+4|0)|0;aa=+g[e+28>>2];$=+g[e+32>>2];da=+g[e+36>>2];ba=+g[L>>2]*aa+ +g[L+4>>2]*$+ +g[L+8>>2]*da;ca=aa*+g[L+16>>2]+$*+g[L+20>>2]+da*+g[L+24>>2];da=aa*+g[L+32>>2]+$*+g[L+36>>2]+da*+g[L+40>>2];L=ui(e+16|0)|0;$=+g[e+44>>2];aa=+g[e+48>>2];ga=+g[e+52>>2];ea=+g[L>>2]*$+ +g[L+4>>2]*aa+ +g[L+8>>2]*ga;fa=$*+g[L+16>>2]+aa*+g[L+20>>2]+ga*+g[L+24>>2];ga=$*+g[L+32>>2]+aa*+g[L+36>>2]+ga*+g[L+40>>2];L=c[(c[M>>2]|0)+16>>2]|0;aa=ca*10.0+ +g[W+160+4>>2];$=da*10.0+ +g[W+160+8>>2];g[W+32>>2]=ba*10.0+ +g[W+160>>2];g[W+32+4>>2]=aa;g[W+32+8>>2]=$;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;$=fa*10.0+ +g[W+160+4>>2];aa=ga*10.0+ +g[W+160+8>>2];g[W+32>>2]=ea*10.0+ +g[W+160>>2];g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;ca=ca*10.0+ +g[W+96+4>>2];da=da*10.0+ +g[W+96+8>>2];g[W+32>>2]=ba*10.0+ +g[W+96>>2];g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;fa=fa*10.0+ +g[W+96+4>>2];ga=ga*10.0+ +g[W+96+8>>2];g[W+32>>2]=ea*10.0+ +g[W+96>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);break}default:{}}d=d+1|0;if((d|0)>=(c[S+912>>2]|0))break a}}while(0)}d=c[b+72>>2]|0;if(d|0?(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&2|0:0){if(a[b+368>>0]|0){L=c[b+72>>2]|0;M=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+369>>0]|0){L=c[b+72>>2]|0;M=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+370>>0]|0){M=c[b+72>>2]|0;S=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,S,0,W+160|0,W+96|0)}}N=N+1|0}while((N|0)<(c[b+348>>2]|0));l=W;return}function gc(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0.0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0.0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0.0,ua=0,va=0,wa=0.0,xa=0,ya=0,za=0.0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0.0,Ka=0.0,La=0.0,Ma=0.0,Na=0.0,Oa=0.0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0.0,hb=0.0,ib=0.0,jb=0.0,kb=0.0,lb=0.0;ua=l;l=l+208|0;ta=+g[b+512>>2];ha=c[b+192>>2]|0;ga=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);a[ua+48+16>>0]=1;ha=ua+48+12|0;c[ha>>2]=0;c[ua+48+4>>2]=0;c[ua+48+8>>2]=0;a[ua+48+36>>0]=1;ia=ua+48+32|0;c[ia>>2]=0;c[ua+48+24>>2]=0;c[ua+48+28>>2]=0;a[ua+48+56>>0]=1;c[ua+48+52>>2]=0;c[ua+48+44>>2]=0;c[ua+48+48>>2]=0;ja=ua+48+76|0;a[ja>>0]=1;ka=ua+48+72|0;c[ka>>2]=0;la=ua+48+64|0;c[la>>2]=0;ma=ua+48+68|0;c[ma>>2]=0;na=ua+48+96|0;a[na>>0]=1;oa=ua+48+92|0;c[oa>>2]=0;pa=ua+48+84|0;c[pa>>2]=0;qa=ua+48+88|0;c[qa>>2]=0;a[ua+48+116>>0]=1;ra=ua+48+112|0;c[ra>>2]=0;c[ua+48+104>>2]=0;c[ua+48+108>>2]=0;sa=c[b+872>>2]|0;if((sa|0)<=0){Ph(ua+48|0);l=ua;return}fa=0;f=0;do{ea=c[b+880>>2]|0;da=ea+(fa*104|0)|0;ca=c[da>>2]|0;if(!(c[ca+204>>2]&4)){switch(c[ca+252>>2]|0){case 2:{Q=+g[ca+392>>2];n=+g[ea+(fa*104|0)+84>>2];H=+g[ca+396>>2];N=+g[ea+(fa*104|0)+80>>2];e=+g[ea+(fa*104|0)+76>>2];O=+g[ca+388>>2];j=0;k=ca;h=ta*(Q*n-H*N+ +g[ca+372>>2]);n=ta*(+g[ca+376>>2]+(H*e-n*O));e=ta*(N*O-Q*e+ +g[ca+380>>2]);break}case 64:{ba=c[(c[ca+324>>2]|0)+468>>2]|0;m=c[ua+48+4>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+8>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+4>>2]|0}k=c[ha>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+16>>0]|0)ya=18}else if(!((k|0)==0|(a[ua+48+16>>0]|0)==0))ya=18;if((ya|0)==18){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+16>>0]=1;c[ha>>2]=f;c[ua+48+8>>2]=ba+6}else f=c[ha>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+4>>2]=ba+6;m=c[ua+48+24>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+28>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+24>>2]|0}k=c[ia>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+36>>0]|0)ya=32}else if(!((k|0)==0|(a[ua+48+36>>0]|0)==0))ya=32;if((ya|0)==32){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+36>>0]=1;c[ia>>2]=f;c[ua+48+28>>2]=ba+6}else f=c[ia>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+24>>2]=ba+6;$=c[ha>>2]|0;I=c[ca+324>>2]|0;J=c[ca+328>>2]|0;u=c[ea+(fa*104|0)+24>>2]|0;aa=ea+(fa*104|0)+4|0;K=c[I+132>>2]|0;v=c[I+468>>2]|0;f=c[pa>>2]|0;if((f|0)<((K*3|0)+3|0)){if((c[qa>>2]|0)<((K*3|0)+3|0)){if(!((K*3|0)+3|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K*3|0)+3<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[pa>>2]|0}if((k|0)>0){j=0;do{_=i+(j<<4)|0;Z=(c[oa>>2]|0)+(j<<4)|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[oa>>2]|0;if(j|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=i;c[qa>>2]=(K*3|0)+3}do{_=(c[oa>>2]|0)+(f<<4)|0;c[_>>2]=c[ua>>2];c[_+4>>2]=c[ua+4>>2];c[_+8>>2]=c[ua+8>>2];c[_+12>>2]=c[ua+12>>2];f=f+1|0}while((f|0)!=((K*3|0)+3|0))}c[pa>>2]=(K*3|0)+3;f=c[ua+48+104>>2]|0;if((f|0)<=(K+1|0)&(f|0)<=(K|0)){if((c[ua+48+108>>2]|0)<=(K|0)){if(!(K+1|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K+1|0)*48|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[ua+48+104>>2]|0}if((k|0)>0){j=0;do{Y=i+(j*48|0)|0;Z=c[ra>>2]|0;_=Z+(j*48|0)|0;c[Y>>2]=c[_>>2];c[Y+4>>2]=c[_+4>>2];c[Y+8>>2]=c[_+8>>2];c[Y+12>>2]=c[_+12>>2];Y=Z+(j*48|0)+16|0;_=i+(j*48|0)+16|0;c[_>>2]=c[Y>>2];c[_+4>>2]=c[Y+4>>2];c[_+8>>2]=c[Y+8>>2];c[_+12>>2]=c[Y+12>>2];Z=Z+(j*48|0)+32|0;_=i+(j*48|0)+32|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[ra>>2]|0;if(j|0){if(a[ua+48+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[ra>>2]=0}a[ua+48+116>>0]=1;c[ra>>2]=i;c[ua+48+108>>2]=K+1}do{_=c[ra>>2]|0;Z=_+(f*48|0)|0;c[Z>>2]=c[ua>>2];c[Z+4>>2]=c[ua+4>>2];c[Z+8>>2]=c[ua+8>>2];c[Z+12>>2]=c[ua+12>>2];Z=_+(f*48|0)+16|0;c[Z>>2]=c[ua+16>>2];c[Z+4>>2]=c[ua+16+4>>2];c[Z+8>>2]=c[ua+16+8>>2];c[Z+12>>2]=c[ua+16+12>>2];_=_+(f*48|0)+32|0;c[_>>2]=c[ua+32>>2];c[_+4>>2]=c[ua+32+4>>2];c[_+8>>2]=c[ua+32+8>>2];c[_+12>>2]=c[ua+32+12>>2];f=f+1|0}while((f|0)!=(K+1|0))}c[ua+48+104>>2]=K+1;z=c[oa>>2]|0;A=z+(K+1<<4)+(K+1<<4)|0;m=c[la>>2]|0;if((v|0)>(m|0)){if((c[ma>>2]|0)<(v|0)){if(!v){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((v<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[la>>2]|0}k=c[ka>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ja>>0]|0)ya=74}else if(!((k|0)==0|(a[ja>>0]|0)==0))ya=74;if((ya|0)==74){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=f;c[ma>>2]=v}else f=c[ka>>2]|0;Yk(f+(m<<2)|0,0,v-m<<2|0)|0}c[la>>2]=v;y=(v|0)>0?c[ka>>2]|0:0;x=c[ra>>2]|0;O=+g[u+8>>2]-+g[I+12>>2];Q=+g[u+12>>2]-+g[I+16>>2];N=+g[u+16>>2]-+g[I+20>>2];E=+g[I+28>>2];G=+g[I+32>>2];t=+g[I+36>>2];C=+g[I+40>>2];H=E*(2.0/(E*E+G*G+t*t+C*C));F=G*(2.0/(E*E+G*G+t*t+C*C));B=t*(2.0/(E*E+G*G+t*t+C*C));g[x>>2]=1.0-(G*F+t*B);g[x+4>>2]=E*F-C*B;g[x+8>>2]=E*B+C*F;g[x+12>>2]=0.0;g[x+16>>2]=E*F+C*B;g[x+20>>2]=1.0-(E*H+t*B);g[x+24>>2]=G*B-C*H;g[x+28>>2]=0.0;g[x+32>>2]=E*B-C*F;g[x+36>>2]=G*B+C*H;g[x+40>>2]=1.0-(E*H+G*F);g[x+44>>2]=0.0;_=ea+(fa*104|0)+12|0;F=+g[_>>2];Z=ea+(fa*104|0)+8|0;G=+g[Z>>2];H=+g[aa>>2];g[$>>2]=Q*F-N*G+0.0;g[$+4>>2]=N*H-O*F+0.0;g[$+8>>2]=O*G-Q*H+0.0;c[$+12>>2]=c[aa>>2];c[$+16>>2]=c[Z>>2];c[$+20>>2]=c[_>>2];H=O*+g[x+16>>2]+Q*+g[x+20>>2]+N*+g[x+24>>2];G=O*+g[x+32>>2]+Q*+g[x+36>>2]+N*+g[x+40>>2];g[z>>2]=O*+g[x>>2]+Q*+g[x+4>>2]+N*+g[x+8>>2];g[z+4>>2]=H;g[z+8>>2]=G;g[z+12>>2]=0.0;G=+g[aa>>2];H=+g[Z>>2];N=+g[_>>2];Q=G*+g[x+16>>2]+H*+g[x+20>>2]+N*+g[x+24>>2];O=G*+g[x+32>>2]+H*+g[x+36>>2]+N*+g[x+40>>2];g[z+(K+1<<4)>>2]=+g[x>>2]*G+ +g[x+4>>2]*H+ +g[x+8>>2]*N;g[z+(K+1<<4)+4>>2]=Q;g[z+(K+1<<4)+8>>2]=O;g[z+(K+1<<4)+12>>2]=0.0;O=+g[x+16>>2]*0.0+ +g[x+20>>2]*0.0+ +g[x+24>>2]*0.0;Q=+g[x+32>>2]*0.0+ +g[x+36>>2]*0.0+ +g[x+40>>2]*0.0;g[A>>2]=+g[x>>2]*0.0+ +g[x+4>>2]*0.0+ +g[x+8>>2]*0.0;g[A+4>>2]=O;g[A+8>>2]=Q;g[A+12>>2]=0.0;if((v|0)>0)Yk($+24|0,0,(((v+5|0)>6?v+5|0:6)<<2)+-20|0)|0;if((J|0)>-1&(K|0)>0){w=0;f=c[I+140>>2]|0;while(1){q=+g[f+(w*608|0)+336>>2];o=+g[f+(w*608|0)+340>>2];F=+g[f+(w*608|0)+344>>2];N=+g[f+(w*608|0)+348>>2];p=q*(2.0/(q*q+o*o+F*F+N*N));Q=o*(2.0/(q*q+o*o+F*F+N*N));r=F*(2.0/(q*q+o*o+F*F+N*N));B=1.0-(o*Q+F*r);C=q*Q-N*r;e=q*r+N*Q;E=q*Q+N*r;F=1.0-(q*p+F*r);h=o*r-N*p;G=q*r-N*Q;N=o*r+N*p;Q=1.0-(q*p+o*Q);i=(c[f+(w*608|0)+20>>2]|0)+1|0;o=+g[x+(i*48|0)>>2];p=+g[x+(i*48|0)+16>>2];q=+g[x+(i*48|0)+32>>2];r=+g[x+(i*48|0)+4>>2];s=+g[x+(i*48|0)+20>>2];t=+g[x+(i*48|0)+36>>2];n=+g[x+(i*48|0)+8>>2];O=+g[x+(i*48|0)+24>>2];H=+g[x+(i*48|0)+40>>2];f=w;w=w+1|0;g[x+(w*48|0)>>2]=q*e+(p*C+o*B);g[x+(w*48|0)+4>>2]=e*t+(s*C+r*B);g[x+(w*48|0)+8>>2]=B*n+C*O+e*H;g[x+(w*48|0)+12>>2]=0.0;g[x+(w*48|0)+16>>2]=q*h+(o*E+p*F);g[x+(w*48|0)+20>>2]=t*h+(r*E+s*F);g[x+(w*48|0)+24>>2]=E*n+F*O+h*H;g[x+(w*48|0)+28>>2]=0.0;g[x+(w*48|0)+32>>2]=o*G+p*N+q*Q;g[x+(w*48|0)+36>>2]=r*G+s*N+t*Q;g[x+(w*48|0)+40>>2]=G*n+N*O+Q*H;g[x+(w*48|0)+44>>2]=0.0;u=z+(K+1<<4)+(i<<4)|0;H=+g[u>>2];O=+g[u+4>>2];n=+g[u+8>>2];u=z+(K+1<<4)+(w<<4)|0;g[u>>2]=B*H+C*O+e*n;g[u+4>>2]=E*H+F*O+h*n;g[u+8>>2]=G*H+N*O+Q*n;g[u+12>>2]=0.0;n=+g[A+(i<<4)>>2];O=+g[A+(i<<4)+4>>2];H=+g[A+(i<<4)+8>>2];v=A+(w<<4)|0;g[v>>2]=B*n+C*O+e*H;g[v+4>>2]=E*n+F*O+h*H;g[v+8>>2]=G*n+N*O+Q*H;g[v+12>>2]=0.0;H=+g[z+(i<<4)>>2];O=+g[z+(i<<4)+4>>2];n=+g[z+(i<<4)+8>>2];i=c[I+140>>2]|0;e=B*H+C*O+e*n-+g[i+(f*608|0)+352>>2];h=E*H+F*O+h*n-+g[i+(f*608|0)+356>>2];n=G*H+N*O+Q*n-+g[i+(f*608|0)+360>>2];i=z+(w<<4)|0;g[i>>2]=e;j=z+(w<<4)+4|0;g[j>>2]=h;k=z+(w<<4)+8|0;g[k>>2]=n;g[z+(w<<4)+12>>2]=0.0;m=c[I+140>>2]|0;switch(c[m+(f*608|0)+500>>2]|0){case 0:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Q=(Q*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*O+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*O-Q*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];Y=y+(c[m+(f*608|0)+328>>2]<<2)|0;g[Y>>2]=Q;g[Y>>2]=Q+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);break}case 1:{g[y+(c[m+(f*608|0)+328>>2]<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+152>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+156>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+160>>2];break}case 2:{G=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];Q=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(G*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*Q+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*Q-G*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];G=+g[m+(f*608|0)+172>>2];Q=+g[k>>2];N=+g[m+(f*608|0)+176>>2];H=+g[j>>2];O=+g[i>>2];F=+g[m+(f*608|0)+168>>2];g[y+(Y+1<<2)>>2]=(G*Q-N*H+ +g[m+(f*608|0)+184>>2])*+g[u>>2]+(N*O-Q*F+ +g[m+(f*608|0)+188>>2])*+g[u+4>>2]+(H*F-G*O+ +g[m+(f*608|0)+192>>2])*+g[u+8>>2];O=+g[m+(f*608|0)+204>>2];G=+g[k>>2];F=+g[m+(f*608|0)+208>>2];H=+g[j>>2];Q=+g[i>>2];N=+g[m+(f*608|0)+200>>2];g[y+(Y+2<<2)>>2]=(O*G-F*H+ +g[m+(f*608|0)+216>>2])*+g[u>>2]+(F*Q-G*N+ +g[m+(f*608|0)+220>>2])*+g[u+4>>2]+(H*N-O*Q+ +g[m+(f*608|0)+224>>2])*+g[u+8>>2];m=c[I+140>>2]|0;Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=+g[y+(Y<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);g[y+(Y+1<<2)>>2]=+g[y+(Y+1<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+168>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+172>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+176>>2]);g[y+(Y+2<<2)>>2]=+g[y+(Y+2<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+200>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+204>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+208>>2]);break}case 3:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(Q*n-N*h)*+g[u>>2]+ +g[u+4>>2]*(N*e-n*O)+(h*O-Q*e)*+g[u+8>>2];g[y+(Y+1<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+184>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+188>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+192>>2];g[y+(Y+2<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+216>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+220>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+224>>2];break}default:{}}if((w|0)==(K|0))break;else f=m}if((J|0)!=-1){f=J;do{k=c[m+(f*608|0)+492>>2]|0;if((k|0)>0){j=c[m+(f*608|0)+328>>2]|0;i=0;do{c[$+(i+6+j<<2)>>2]=c[y+(j+i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}f=c[m+(f*608|0)+20>>2]|0}while((f|0)!=-1)}}f=c[ia>>2]|0;X=c[ca+324>>2]|0;I=c[ha>>2]|0;Y=c[X+132>>2]|0;u=c[X+468>>2]|0;v=c[la>>2]|0;if((u|0)>(v|0)){if((c[ma>>2]|0)<(u|0)){if(!u){i=0;k=v}else{c[6995]=(c[6995]|0)+1;i=sc((u<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[la>>2]|0}m=c[ka>>2]|0;if((k|0)>0){j=0;do{c[i+(j<<2)>>2]=c[m+(j<<2)>>2];j=j+1|0}while((j|0)!=(k|0));if(a[ja>>0]|0)ya=103}else if(!((m|0)==0|(a[ja>>0]|0)==0))ya=103;if((ya|0)==103){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=i;c[ma>>2]=u}else i=c[ka>>2]|0;Yk(i+(v<<2)|0,0,u-v<<2|0)|0}c[la>>2]=u;i=c[pa>>2]|0;if((i|0)<((Y<<2)+4|0)){if((c[qa>>2]|0)<((Y<<2)+4|0)){if(!((Y<<2)+4|0)){j=0;m=i}else{c[6995]=(c[6995]|0)+1;j=sc((Y<<2)+4<<4|19)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=c[pa>>2]|0}if((m|0)>0){k=0;do{W=j+(k<<4)|0;V=(c[oa>>2]|0)+(k<<4)|0;c[W>>2]=c[V>>2];c[W+4>>2]=c[V+4>>2];c[W+8>>2]=c[V+8>>2];c[W+12>>2]=c[V+12>>2];k=k+1|0}while((k|0)!=(m|0))}k=c[oa>>2]|0;if(k|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=j;c[qa>>2]=(Y<<2)+4}do{W=(c[oa>>2]|0)+(i<<4)|0;c[W>>2]=c[ua>>2];c[W+4>>2]=c[ua+4>>2];c[W+8>>2]=c[ua+8>>2];c[W+12>>2]=c[ua+12>>2];i=i+1|0}while((i|0)!=((Y<<2)+4|0))}c[pa>>2]=(Y<<2)+4;i=c[X+468>>2]|0;T=(i|0)==0?0:c[ka>>2]|0;U=c[oa>>2]|0;V=U+((Y<<1)+2<<4)|0;W=c[X+220>>2]|0;if((i|0)>0){R=(c[X+180>>2]|0)+(i+6<<2)|0;S=c[X+200>>2]|0}else{R=0;S=0}if(!(a[X+421>>0]|0)){r=+g[W>>2];s=+g[W+4>>2];t=+g[W+8>>2];B=+g[W+16>>2];C=+g[W+20>>2];E=+g[W+24>>2];F=+g[W+32>>2];H=+g[W+36>>2];O=+g[W+40>>2];G=-+g[I>>2];N=-+g[I+4>>2];Q=-+g[I+8>>2];o=-+g[I+12>>2];p=-+g[I+16>>2];q=-+g[I+20>>2];g[U>>2]=r*o+s*p+t*q;g[U+4>>2]=B*o+C*p+E*q;g[U+8>>2]=F*o+H*p+O*q;g[U+12>>2]=0.0;g[U+16>>2]=r*G+s*N+t*Q;g[U+20>>2]=B*G+C*N+E*Q;g[U+24>>2]=F*G+H*N+O*Q;g[U+28>>2]=0.0}else{c[U>>2]=0;c[U+4>>2]=0;c[U+8>>2]=0;c[U+12>>2]=0;c[U+16>>2]=0;c[U+20>>2]=0;c[U+24>>2]=0;c[U+28>>2]=0}if((Y|0)>0){Yk(U+32|0,0,Y<<5|0)|0;z=c[X+140>>2]|0;x=Y;do{y=x;x=x+-1|0;A=c[z+(x*608|0)+20>>2]|0;r=+g[W+(y*48|0)>>2];s=+g[W+(y*48|0)+4>>2];t=+g[W+(y*48|0)+8>>2];B=+g[W+(y*48|0)+16>>2];C=+g[W+(y*48|0)+20>>2];E=+g[W+(y*48|0)+24>>2];F=+g[W+(y*48|0)+32>>2];G=+g[W+(y*48|0)+36>>2];H=+g[W+(y*48|0)+40>>2];N=+g[z+(x*608|0)+352>>2];O=+g[z+(x*608|0)+356>>2];Q=+g[z+(x*608|0)+360>>2];v=c[z+(x*608|0)+492>>2]|0;w=c[z+(x*608|0)+328>>2]|0;if((v|0)>0){i=0;do{g[T+(w+i<<2)>>2]=+g[I+(i+6+w<<2)>>2]-(+g[z+(x*608|0)+136+(i<<5)+16>>2]*+g[U+(y<<5)>>2]+ +g[z+(x*608|0)+136+(i<<5)+20>>2]*+g[U+(y<<5)+4>>2]+ +g[z+(x*608|0)+136+(i<<5)+24>>2]*+g[U+(y<<5)+8>>2]+(+g[z+(x*608|0)+136+(i<<5)>>2]*+g[U+(y<<5)+16>>2]+ +g[z+(x*608|0)+136+(i<<5)+4>>2]*+g[U+(y<<5)+20>>2]+ +g[z+(x*608|0)+136+(i<<5)+8>>2]*+g[U+(y<<5)+24>>2]));i=i+1|0}while((i|0)!=(v|0));k=R+((P(w,w)|0)<<2)|0;j=0;do{m=ua+(j<<2)|0;g[m>>2]=0.0;u=P(v,j)|0;i=0;e=0.0;do{e=e+ +g[k+(u+i<<2)>>2]*+g[T+(w+i<<2)>>2];i=i+1|0}while((i|0)!=(v|0));g[m>>2]=e;j=j+1|0}while((j|0)!=(v|0));i=0;q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2];do{M=w+i|0;za=+g[ua+(i<<2)>>2];q=za*+g[S+(M<<5)>>2]+q;p=za*+g[S+(M<<5)+4>>2]+p;o=za*+g[S+(M<<5)+8>>2]+o;n=+g[S+(M<<5)+16>>2]*za+n;h=za*+g[S+(M<<5)+20>>2]+h;e=za*+g[S+(M<<5)+24>>2]+e;i=i+1|0}while((i|0)!=(v|0))}else{q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2]}n=O*o-Q*p+n;Q=h+(Q*q-N*o);za=N*p-O*q+e;g[U+(A+1<<5)>>2]=r*q+B*p+F*o+ +g[U+(A+1<<5)>>2];g[U+(A+1<<5)+4>>2]=s*q+C*p+G*o+ +g[U+(A+1<<5)+4>>2];g[U+(A+1<<5)+8>>2]=t*q+E*p+H*o+ +g[U+(A+1<<5)+8>>2];g[U+(A+1<<5)+16>>2]=r*n+B*Q+F*za+ +g[U+(A+1<<5)+16>>2];g[U+(A+1<<5)+20>>2]=s*n+C*Q+G*za+ +g[U+(A+1<<5)+20>>2];g[U+(A+1<<5)+24>>2]=t*n+E*Q+H*za+ +g[U+(A+1<<5)+24>>2]}while((y|0)>1)}if(!(a[X+421>>0]|0)){do if(!(c[X+132>>2]|0)){p=1.0/+g[X+44>>2];e=+g[U+16>>2]/+g[X+48>>2];h=+g[U+24>>2]/+g[X+56>>2];n=+g[U>>2]*p;o=p*+g[U+4>>2];p=p*+g[U+8>>2];q=+g[U+20>>2]/+g[X+52>>2]}else{if(!(a[X+420>>0]|0)){e=0.0;h=0.0;n=0.0;o=0.0;p=0.0;q=0.0;break}Va=+g[X+296>>2];cb=+g[X+316>>2];db=+g[X+300>>2];Ja=+g[X+312>>2];La=+g[X+308>>2];Ua=+g[X+292>>2];Ia=+g[X+276>>2];Ka=+g[X+280>>2];o=+g[X+284>>2];p=1.0/((Va*cb-db*Ja)*Ia+Ka*(db*La-cb*Ua)+(Ja*Ua-Va*La)*o);N=-((Va*cb-db*Ja)*p);Q=-((db*La-cb*Ua)*p);G=-((Ja*Ua-Va*La)*p);Pa=+g[X+372>>2];q=+g[X+376>>2];Na=+g[X+380>>2];Ga=Na*-((La*Ka-Ja*Ia)*p)+(Pa*-((Ja*o-cb*Ka)*p)+q*-((cb*Ia-La*o)*p));r=Na*-((Va*Ia-Ua*Ka)*p)+(Pa*-((db*Ka-Va*o)*p)+q*-((Ua*o-db*Ia)*p));hb=+g[X+388>>2];gb=+g[X+392>>2];ib=+g[X+396>>2];s=hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p)+ib*-((La*Ka-Ja*Ia)*p);Fa=hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p)+ib*-((Va*Ia-Ua*Ka)*p);bb=+g[X+404>>2];C=+g[X+408>>2];ab=+g[X+412>>2];t=bb*-((Ja*o-cb*Ka)*p)+C*-((cb*Ia-La*o)*p)+ab*-((La*Ka-Ja*Ia)*p);Aa=bb*-((db*Ka-Va*o)*p)+C*-((Ua*o-db*Ia)*p)+ab*-((Va*Ia-Ua*Ka)*p);Sa=+g[X+228>>2];Oa=+g[X+244>>2];Xa=+g[X+260>>2];Ra=+g[X+232>>2];Ma=+g[X+248>>2];Wa=+g[X+264>>2];Ta=+g[X+236>>2];Qa=+g[X+252>>2];Ya=+g[X+268>>2];Ba=(Na*G+(Pa*N+q*Q))*Sa+Ga*Oa+r*Xa+ +g[X+324>>2];jb=(Na*G+(Pa*N+q*Q))*Ra+Ga*Ma+r*Wa+ +g[X+328>>2];r=(Na*G+(Pa*N+q*Q))*Ta+Ga*Qa+r*Ya+ +g[X+332>>2];Ga=(hb*N+gb*Q+ib*G)*Sa+s*Oa+Fa*Xa+ +g[X+340>>2];lb=(hb*N+gb*Q+ib*G)*Ra+s*Ma+Fa*Wa+ +g[X+344>>2];Fa=(hb*N+gb*Q+ib*G)*Ta+s*Qa+Fa*Ya+ +g[X+348>>2];s=Sa*(bb*N+C*Q+ab*G)+Oa*t+Aa*Xa+ +g[X+356>>2];h=(bb*N+C*Q+ab*G)*Ra+t*Ma+Aa*Wa+ +g[X+360>>2];Aa=(bb*N+C*Q+ab*G)*Ta+t*Qa+Aa*Ya+ +g[X+364>>2];t=1.0/(r*(Ga*h-lb*s)+(Ba*(lb*Aa-Fa*h)+jb*(Fa*s-Ga*Aa)));e=(lb*Aa-Fa*h)*t;Da=(Fa*s-Ga*Aa)*t;kb=(Ga*h-lb*s)*t;eb=bb*(jb*Fa-r*lb)*t+(Pa*e+hb*(r*h-jb*Aa)*t);n=C*(jb*Fa-r*lb)*t+(q*e+gb*(r*h-jb*Aa)*t);fb=ab*(jb*Fa-r*lb)*t+(Na*e+ib*(r*h-jb*Aa)*t);H=bb*(r*Ga-Ba*Fa)*t+(Pa*Da+hb*(Ba*Aa-r*s)*t);O=C*(r*Ga-Ba*Fa)*t+(q*Da+gb*(Ba*Aa-r*s)*t);F=ab*(r*Ga-Ba*Fa)*t+(Na*Da+ib*(Ba*Aa-r*s)*t);hb=bb*(Ba*lb-jb*Ga)*t+(Pa*kb+hb*(jb*s-Ba*h)*t);gb=C*(Ba*lb-jb*Ga)*t+(q*kb+gb*(jb*s-Ba*h)*t);ib=ab*(Ba*lb-jb*Ga)*t+(Na*kb+ib*(jb*s-Ba*h)*t);Na=fb*-((La*Ka-Ja*Ia)*p)+(eb*-((Ja*o-cb*Ka)*p)+n*-((cb*Ia-La*o)*p));ab=fb*-((Va*Ia-Ua*Ka)*p)+(eb*-((db*Ka-Va*o)*p)+n*-((Ua*o-db*Ia)*p));q=F*-((La*Ka-Ja*Ia)*p)+(H*-((Ja*o-cb*Ka)*p)+O*-((cb*Ia-La*o)*p));C=F*-((Va*Ia-Ua*Ka)*p)+(H*-((db*Ka-Va*o)*p)+O*-((Ua*o-db*Ia)*p));Pa=ib*-((La*Ka-Ja*Ia)*p)+(hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p));bb=ib*-((Va*Ia-Ua*Ka)*p)+(hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p));_a=Qa*(ib*G+(hb*N+gb*Q))+(Oa*(fb*G+(eb*N+n*Q))+Ma*(F*G+(H*N+O*Q)));$a=Ya*(ib*G+(hb*N+gb*Q))+(Xa*(fb*G+(eb*N+n*Q))+Wa*(F*G+(H*N+O*Q)));Za=Ta*(ib*G+(hb*N+gb*Q))+(Sa*(fb*G+(eb*N+n*Q))+Ra*(F*G+(H*N+O*Q)))+-1.0;E=+g[U>>2];za=+g[U+4>>2];B=+g[U+8>>2];Ea=+g[U+16>>2];Ca=+g[U+20>>2];Ha=+g[U+24>>2];e=Ha*(jb*Fa-r*lb)*t+(Ea*e+Ca*(r*h-jb*Aa)*t)+(B*ab+(E*(fb*G+(eb*N+n*Q))+za*Na));h=Ha*(Ba*lb-jb*Ga)*t+(Ea*kb+Ca*(jb*s-Ba*h)*t)+(B*bb+(E*(ib*G+(hb*N+gb*Q))+za*Pa));n=Ha*(ib*G+(hb*N+gb*Q))+(Ea*(fb*G+(eb*N+n*Q))+Ca*(F*G+(H*N+O*Q)))+(B*((Ta*bb+(Sa*ab+Ra*C))*N+(Qa*bb+(Oa*ab+Ma*C))*-((Ja*o-cb*Ka)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((db*Ka-Va*o)*p))+(E*($a*-((db*Ka-Va*o)*p)+(_a*-((Ja*o-cb*Ka)*p)+Za*N))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((db*Ka-Va*o)*p)+((Ta*Pa+(Sa*Na+Ra*q))*N+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((Ja*o-cb*Ka)*p)))));o=Ha*Pa+(Ea*Na+Ca*q)+(B*((Ta*bb+(Sa*ab+Ra*C))*Q+(Qa*bb+(Oa*ab+Ma*C))*-((cb*Ia-La*o)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Ua*o-db*Ia)*p))+(E*($a*-((Ua*o-db*Ia)*p)+(_a*-((cb*Ia-La*o)*p)+Za*Q))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Ua*o-db*Ia)*p)+((Ta*Pa+(Sa*Na+Ra*q))*Q+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((cb*Ia-La*o)*p)))));p=Ha*bb+(Ea*ab+Ca*C)+(B*((Ta*bb+(Sa*ab+Ra*C))*G+(Qa*bb+(Oa*ab+Ma*C))*-((La*Ka-Ja*Ia)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Va*Ia-Ua*Ka)*p))+(E*($a*-((Va*Ia-Ua*Ka)*p)+(_a*-((La*Ka-Ja*Ia)*p)+Za*G))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Va*Ia-Ua*Ka)*p)+((Ta*Pa+(Sa*Na+Ra*q))*G+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((La*Ka-Ja*Ia)*p)))));q=Ha*(r*Ga-Ba*Fa)*t+(Ea*Da+Ca*(Ba*Aa-r*s)*t)+(B*C+(E*(F*G+(H*N+O*Q))+za*q))}while(0);e=-e;g[V>>2]=e;g[U+((Y<<1)+2<<4)+4>>2]=-q;g[U+((Y<<1)+2<<4)+8>>2]=-h;g[U+((Y<<1)+2<<4)+12>>2]=0.0;g[V+16>>2]=-n;g[V+20>>2]=-o;g[V+24>>2]=-p;g[V+28>>2]=0.0}else{c[V>>2]=0;c[V+4>>2]=0;c[V+8>>2]=0;c[V+12>>2]=0;c[V+16>>2]=0;c[V+20>>2]=0;c[V+24>>2]=0;c[V+28>>2]=0;e=0.0}if((Y|0)>0){v=0;K=c[X+140>>2]|0;do{w=v;v=v+1|0;e=+g[W+(v*48|0)>>2];h=+g[W+(v*48|0)+4>>2];n=+g[W+(v*48|0)+8>>2];o=+g[W+(v*48|0)+16>>2];p=+g[W+(v*48|0)+20>>2];q=+g[W+(v*48|0)+24>>2];r=+g[W+(v*48|0)+32>>2];s=+g[W+(v*48|0)+36>>2];t=+g[W+(v*48|0)+40>>2];lb=+g[K+(w*608|0)+352>>2];H=+g[K+(w*608|0)+356>>2];G=+g[K+(w*608|0)+360>>2];x=(c[K+(w*608|0)+20>>2]|0)+1|0;B=+g[V+(x<<5)>>2];C=+g[V+(x<<5)+4>>2];E=+g[V+(x<<5)+8>>2];y=V+(v<<5)|0;g[y>>2]=e*B+h*C+n*E;A=V+(v<<5)+4|0;g[A>>2]=o*B+p*C+q*E;J=V+(v<<5)+8|0;g[J>>2]=r*B+s*C+t*E;g[V+(v<<5)+12>>2]=0.0;ib=+g[V+(x<<5)+16>>2];jb=+g[V+(x<<5)+20>>2];kb=+g[V+(x<<5)+24>>2];F=e*ib+h*jb+n*kb-(H*(r*B+s*C+t*E)-G*(o*B+p*C+q*E));G=o*ib+p*jb+q*kb-(G*(e*B+h*C+n*E)-lb*(r*B+s*C+t*E));H=r*ib+s*jb+t*kb-(lb*(o*B+p*C+q*E)-H*(e*B+h*C+n*E));x=V+(v<<5)+16|0;g[x>>2]=F;z=V+(v<<5)+20|0;g[z>>2]=G;I=V+(v<<5)+24|0;g[I>>2]=H;g[V+(v<<5)+28>>2]=0.0;K=c[X+140>>2]|0;L=c[K+(w*608|0)+492>>2]|0;M=c[K+(w*608|0)+328>>2]|0;if((L|0)>0){i=0;do{u=M+i|0;g[ua+176+(i<<2)>>2]=+g[T+(u<<2)>>2]-(F*+g[S+(u<<5)>>2]+G*+g[S+(u<<5)+4>>2]+H*+g[S+(u<<5)+8>>2]+((e*B+h*C+n*E)*+g[S+(u<<5)+16>>2]+(o*B+p*C+q*E)*+g[S+(u<<5)+20>>2]+(r*B+s*C+t*E)*+g[S+(u<<5)+24>>2]));i=i+1|0}while((i|0)!=(L|0));k=R+((P(M,M)|0)<<2)|0;i=0;do{m=P(i,L)|0;u=f+24+(M<<2)+(i<<2)|0;g[u>>2]=0.0;j=0;e=0.0;do{e=e+ +g[k+(j+m<<2)>>2]*+g[ua+176+(j<<2)>>2];g[u>>2]=e;j=j+1|0}while((j|0)!=(L|0));i=i+1|0}while((i|0)!=(L|0));i=0;e=+g[y>>2];h=+g[A>>2];n=+g[J>>2];o=+g[x>>2];p=+g[z>>2];q=+g[I>>2];do{gb=+g[f+24+(M+i<<2)>>2];hb=gb*+g[K+(w*608|0)+136+(i<<5)+4>>2];ib=gb*+g[K+(w*608|0)+136+(i<<5)+8>>2];jb=gb*+g[K+(w*608|0)+136+(i<<5)+16>>2];kb=gb*+g[K+(w*608|0)+136+(i<<5)+20>>2];lb=gb*+g[K+(w*608|0)+136+(i<<5)+24>>2];e=+g[K+(w*608|0)+136+(i<<5)>>2]*gb+e;g[y>>2]=e;h=hb+h;g[A>>2]=h;n=ib+n;g[J>>2]=n;o=jb+o;g[x>>2]=o;p=kb+p;g[z>>2]=p;q=lb+q;g[I>>2]=q;i=i+1|0}while((i|0)!=(L|0))}}while((v|0)!=(Y|0));e=+g[V>>2]}kb=+g[U+((Y<<1)+2<<4)+4>>2];jb=+g[U+((Y<<1)+2<<4)+8>>2];ib=+g[W+4>>2]*e+ +g[W+20>>2]*kb+ +g[W+36>>2]*jb;hb=+g[W+8>>2]*e+ +g[W+24>>2]*kb+ +g[W+40>>2]*jb;g[f>>2]=+g[W>>2]*e+ +g[W+16>>2]*kb+ +g[W+32>>2]*jb;g[f+4>>2]=ib;g[f+8>>2]=hb;hb=+g[V+16>>2];ib=+g[V+20>>2];jb=+g[V+24>>2];kb=+g[W+4>>2]*hb+ +g[W+20>>2]*ib+ +g[W+36>>2]*jb;lb=+g[W+8>>2]*hb+ +g[W+24>>2]*ib+ +g[W+40>>2]*jb;g[f+12>>2]=+g[W>>2]*hb+ +g[W+16>>2]*ib+ +g[W+32>>2]*jb;g[f+16>>2]=kb;g[f+20>>2]=lb;if((ba|0)>-6){j=c[(c[ca+324>>2]|0)+180>>2]|0;i=0;e=0.0;do{e=e+ +g[j+(i<<2)>>2]*+g[$+(i<<2)>>2];i=i+1|0}while((i|0)<(ba+6|0))}else e=0.0;j=ca;k=0;h=ta*e*+g[aa>>2];n=ta*e*+g[Z>>2];e=ta*e*+g[_>>2];break}default:{j=0;k=0;h=0.0;n=0.0;e=0.0}}i=c[ea+(fa*104|0)+24>>2]|0;r=+g[i+8>>2];s=+g[i+12>>2];t=+g[i+16>>2];q=r-+g[i+24>>2]-h;p=s-+g[i+28>>2]-n;e=t-+g[i+32>>2]-e;h=+g[ea+(fa*104|0)+4>>2];n=+g[ea+(fa*104|0)+8>>2];o=+g[ea+(fa*104|0)+12>>2];if(q*h+p*n+e*o<=1.1920928955078125e-07){jb=r*h+s*n+t*o+ +g[ea+(fa*104|0)+20>>2];ib=+g[ea+(fa*104|0)+96>>2];jb=(jb>2];kb=(q-(q-h*(q*h+p*n+e*o))*ib+h*jb)*d;lb=(p-(p-n*(q*h+p*n+e*o))*ib+jb*n)*d;n=(e-(e-o*(q*h+p*n+e*o))*ib+jb*o)*d;e=+g[ea+(fa*104|0)+28>>2]*kb+ +g[ea+(fa*104|0)+32>>2]*lb+ +g[ea+(fa*104|0)+36>>2]*n;h=kb*+g[ea+(fa*104|0)+44>>2]+lb*+g[ea+(fa*104|0)+48>>2]+n*+g[ea+(fa*104|0)+52>>2];n=kb*+g[ea+(fa*104|0)+60>>2]+lb*+g[ea+(fa*104|0)+64>>2]+n*+g[ea+(fa*104|0)+68>>2];g[ua>>2]=e;g[ua+4>>2]=h;g[ua+8>>2]=n;g[ua+12>>2]=0.0;lb=+g[ea+(fa*104|0)+92>>2];g[i+8>>2]=r-e*lb;g[i+12>>2]=s-lb*h;g[i+16>>2]=t-lb*n;i=c[(c[da>>2]|0)+252>>2]|0;if((i|0)==2){if(k|0)ll(k,ua,ea+(fa*104|0)+76|0)}else if((j|0)!=0&(i|0)==64?(va=c[j+324>>2]|0,wa=+D(+(e*e+h*h+n*n))*-.5,xa=c[va+468>>2]|0,(xa|0)>-6):0){j=c[va+180>>2]|0;i=0;while(1){k=j+(i<<2)|0;h=wa*+g[f+(i<<2)>>2]+ +g[k>>2];g[k>>2]=h;e=+g[va+460>>2];if(!(h<-e)){if(e>2]=e}if((i|0)<(xa+5|0))i=i+1|0;else break}}}}fa=fa+1|0}while((fa|0)!=(sa|0));Ph(ua+48|0);l=ua;return}function hc(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0;O=l;l=l+176|0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=((xb[c[(c[B>>2]|0)+56>>2]&127](B)|0)&2048|0)!=0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=((xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&4096|0)!=0;N=+g[d+40>>2];if(N<=0.0){l=O;return}switch(c[d+4>>2]|0){case 3:{c[O+112>>2]=1065353216;c[O+112+4>>2]=0;c[O+112+4+4>>2]=0;c[O+112+4+8>>2]=0;c[O+112+4+12>>2]=0;c[O+112+20>>2]=1065353216;c[O+112+24>>2]=0;c[O+112+24+4>>2]=0;c[O+112+24+8>>2]=0;c[O+112+24+12>>2]=0;c[O+112+40>>2]=1065353216;M=O+112+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;D=+g[d+300>>2];C=+g[d+304>>2];A=+g[d+308>>2];M=c[d+28>>2]|0;z=D*+g[M+20>>2]+C*+g[M+24>>2]+A*+g[M+28>>2]+ +g[M+56>>2];y=D*+g[M+36>>2]+C*+g[M+40>>2]+A*+g[M+44>>2]+ +g[M+60>>2];g[O+112+48>>2]=D*+g[M+4>>2]+C*+g[M+8>>2]+A*+g[M+12>>2]+ +g[M+52>>2];g[O+112+52>>2]=z;g[O+112+56>>2]=y;g[O+112+60>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[M>>2]|0)+64>>2]&7](M,O+112|0,N);y=+g[d+316>>2];z=+g[d+320>>2];A=+g[d+324>>2];d=c[d+32>>2]|0;C=y*+g[d+20>>2]+z*+g[d+24>>2]+A*+g[d+28>>2]+ +g[d+56>>2];D=y*+g[d+36>>2]+z*+g[d+40>>2]+A*+g[d+44>>2]+ +g[d+60>>2];g[O+112+48>>2]=y*+g[d+4>>2]+z*+g[d+8>>2]+A*+g[d+12>>2]+ +g[d+52>>2];g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[b>>2]|0)+64>>2]&7](b,O+112|0,N)}l=O;return}case 4:{L=c[d+28>>2]|0;e=+g[d+552>>2];U=+g[L+4>>2];f=+g[d+552+16>>2];T=+g[L+8>>2];m=+g[d+552+32>>2];S=+g[L+12>>2];n=+g[d+552+4>>2];s=+g[d+552+20>>2];t=+g[d+552+36>>2];u=+g[d+552+8>>2];w=+g[d+552+24>>2];y=+g[d+552+40>>2];R=+g[L+20>>2];Q=+g[L+24>>2];P=+g[L+28>>2];v=+g[L+36>>2];x=+g[L+40>>2];z=+g[L+44>>2];W=+g[d+552+48>>2];V=+g[d+552+52>>2];D=+g[d+552+56>>2];A=+g[L+52>>2]+(U*W+T*V+S*D);C=R*W+Q*V+P*D+ +g[L+56>>2];D=v*W+x*V+z*D+ +g[L+60>>2];g[O+112>>2]=e*U+f*T+m*S;g[O+112+4>>2]=U*n+T*s+S*t;g[O+112+8>>2]=U*u+T*w+S*y;g[O+112+12>>2]=0.0;g[O+112+16>>2]=e*R+f*Q+m*P;g[O+112+20>>2]=n*R+s*Q+t*P;g[O+112+24>>2]=u*R+w*Q+y*P;g[O+112+28>>2]=0.0;g[O+112+32>>2]=e*v+f*x+m*z;g[O+112+36>>2]=n*v+s*x+t*z;g[O+112+40>>2]=u*v+w*x+y*z;g[O+112+44>>2]=0.0;g[O+112+48>>2]=A;g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0;L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0}m=+g[d+688>>2];n=+g[d+688+4>>2];e=+mh(m-n,6.2831854820251465);if(!(e<-3.1415927410125732))if(e>3.1415927410125732)f=e+-6.2831854820251465;else f=e;else f=e+6.2831854820251465;e=+mh(m+n,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(f==e)?M:0){c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Yb[d&0](b,O+112+48|0,O+96|0,O+80|0,N,N,n>0.0?f:0.0,n>0.0?e:6.2831854820251465,O+64|0,n>0.0,10.0)}l=O;return}case 5:{H=c[d+28>>2]|0;w=+g[d+300>>2];m=+g[H+4>>2];x=+g[d+300+16>>2];n=+g[H+8>>2];y=+g[d+300+32>>2];s=+g[H+12>>2];z=+g[d+300+4>>2];A=+g[d+300+20>>2];C=+g[d+300+36>>2];D=+g[d+300+8>>2];Q=+g[d+300+24>>2];S=+g[d+300+40>>2];t=+g[H+20>>2];u=+g[H+24>>2];v=+g[H+28>>2];P=+g[H+36>>2];R=+g[H+40>>2];T=+g[H+44>>2];e=+g[d+300+48>>2];f=+g[d+300+52>>2];W=+g[d+300+56>>2];U=+g[H+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[H+56>>2];W=P*e+R*f+T*W+ +g[H+60>>2];g[O+112>>2]=w*m+x*n+y*s;H=O+112+4|0;g[H>>2]=m*z+n*A+s*C;J=O+112+8|0;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;K=O+112+16|0;g[K>>2]=w*t+x*u+y*v;L=O+112+20|0;g[L>>2]=z*t+A*u+C*v;o=O+112+24|0;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;p=O+112+32|0;g[p>>2]=w*P+x*R+y*T;q=O+112+36|0;g[q>>2]=z*P+A*R+C*T;r=O+112+40|0;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;k=O+112+48|0;g[k>>2]=U;E=O+112+52|0;g[E>>2]=V;I=O+112+56|0;g[I>>2]=W;g[O+112+60>>2]=0.0;if(B){B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N);B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N)}else{B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0}if(M){Ak(O+96|0,d,6.0868353843688965,N);S=+g[O+96>>2];T=+g[O+96+4>>2];U=+g[O+96+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+96>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+96+4>>2]=V;g[O+96+8>>2]=W;g[O+96+12>>2]=0.0;i=O+112+48|0;h=0;do{Ak(O+80|0,d,+(h|0)*6.283185005187988*.03125,N);S=+g[O+80>>2];T=+g[O+80+4>>2];U=+g[O+80+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+80>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+80+4>>2]=V;g[O+80+8>>2]=W;g[O+80+12>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,O+96|0,O+80|0,O+64|0);if(!(h&3)){M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,i,O+80|0,O+64|0)}c[O+96>>2]=c[O+80>>2];c[O+96+4>>2]=c[O+80+4>>2];c[O+96+8>>2]=c[O+80+8>>2];c[O+96+12>>2]=c[O+80+12>>2];h=h+1|0}while((h|0)!=32);C=+g[d+452>>2];D=+g[d+512>>2];h=c[d+32>>2]|0;if(+g[h+404>>2]>0.0){P=+g[d+364>>2];R=+g[h+4>>2];Q=+g[d+364+16>>2];S=+g[h+8>>2];z=+g[d+364+32>>2];A=+g[h+12>>2];Y=+g[d+364+4>>2];X=+g[d+364+20>>2];y=+g[d+364+36>>2];_=+g[d+364+8>>2];Z=+g[d+364+24>>2];x=+g[d+364+40>>2];aa=+g[h+20>>2];$=+g[h+24>>2];w=+g[h+28>>2];T=+g[h+36>>2];V=+g[h+40>>2];W=+g[h+44>>2];U=+g[d+364+48>>2];e=+g[d+364+52>>2];f=+g[d+364+56>>2];m=aa*U+$*e+w*f;n=_*T+Z*V+x*W;s=Y*T+X*V+y*W;t=P*T+Q*V+z*W;u=_*aa+Z*$+x*w;v=Y*aa+X*$+y*w;w=P*aa+Q*$+z*w;x=R*_+S*Z+A*x;y=R*Y+S*X+A*y;z=P*R+Q*S+z*A;A=R*U+S*e+A*f;h=h+4|0;e=T*U+V*e;f=W*f}else{h=c[d+28>>2]|0;V=+g[d+300>>2];X=+g[h+4>>2];W=+g[d+300+16>>2];Y=+g[h+8>>2];z=+g[d+300+32>>2];A=+g[h+12>>2];T=+g[d+300+4>>2];U=+g[d+300+20>>2];y=+g[d+300+36>>2];R=+g[d+300+8>>2];S=+g[d+300+24>>2];x=+g[d+300+40>>2];P=+g[h+20>>2];Q=+g[h+24>>2];w=+g[h+28>>2];Z=+g[h+36>>2];$=+g[h+40>>2];aa=+g[h+44>>2];_=+g[d+300+48>>2];e=+g[d+300+52>>2];f=+g[d+300+56>>2];m=P*_+Q*e+w*f;n=R*Z+S*$+x*aa;s=T*Z+U*$+y*aa;t=V*Z+W*$+z*aa;u=R*P+S*Q+x*w;v=T*P+U*Q+y*w;w=V*P+W*Q+z*w;x=X*R+Y*S+A*x;y=X*T+Y*U+A*y;z=V*X+W*Y+z*A;A=X*_+Y*e+A*f;h=h+4|0;e=Z*_+$*e;f=aa*f}_=A+ +g[h+48>>2];$=m+ +g[h+52>>2];aa=f+e+ +g[h+56>>2];g[O+112>>2]=z;g[H>>2]=y;g[J>>2]=x;g[O+112+12>>2]=0.0;g[K>>2]=w;g[L>>2]=v;g[o>>2]=u;g[O+112+28>>2]=0.0;g[p>>2]=t;g[q>>2]=s;g[r>>2]=n;g[O+112+44>>2]=0.0;g[k>>2]=_;g[E>>2]=$;g[I>>2]=aa;g[O+112+60>>2]=0.0;c[O+80>>2]=c[i>>2];c[O+80+4>>2]=c[i+4>>2];c[O+80+8>>2]=c[i+8>>2];c[O+80+12>>2]=c[i+12>>2];g[O+64>>2]=z;g[O+64+4>>2]=w;g[O+64+8>>2]=t;g[O+64+12>>2]=0.0;g[O+48>>2]=y;g[O+48+4>>2]=v;g[O+48+8>>2]=s;g[O+48+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[d&0](b,O+80|0,O+64|0,O+48|0,N,N,-D-C,C-D,O+32|0,1,10.0)}l=O;return}case 6:case 9:{c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];i=d+1064+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1064+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1064+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2]}if(M){c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1128+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+932>>2];e=+g[d+932+4>>2];$=+g[d+996>>2];_=+g[d+996+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1196>>2];$=+g[d+1200>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+868>>2];f=+g[d+868+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 12:{c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];i=d+1236+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1236+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1236+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2]}if(M){c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1300+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+1056>>2];e=+g[d+1060>>2];$=+g[d+1144>>2];_=+g[d+1144+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1368>>2];$=+g[d+1372>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+968>>2];f=+g[d+968+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 7:{c[O+112>>2]=c[d+824>>2];c[O+112+4>>2]=c[d+824+4>>2];c[O+112+8>>2]=c[d+824+8>>2];c[O+112+12>>2]=c[d+824+12>>2];h=O+112+16|0;c[h>>2]=c[d+824+16>>2];c[h+4>>2]=c[d+824+16+4>>2];c[h+8>>2]=c[d+824+16+8>>2];c[h+12>>2]=c[d+824+16+12>>2];i=O+112+32|0;c[i>>2]=c[d+824+32>>2];c[i+4>>2]=c[d+824+32+4>>2];c[i+8>>2]=c[d+824+32+8>>2];c[i+12>>2]=c[d+824+32+12>>2];k=O+112+48|0;c[k>>2]=c[d+824+48>>2];c[k+4>>2]=c[d+824+48+4>>2];c[k+8>>2]=c[d+824+48+8>>2];c[k+12>>2]=c[d+824+48+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2]}if(M){E=a[d+180>>0]|0?d+824|0:d+888|0;H=c[E>>2]|0;K=c[E+4>>2]|0;I=c[E+16>>2]|0;L=c[E+20>>2]|0;J=c[E+32>>2]|0;M=c[E+36>>2]|0;Q=+g[E+48>>2];U=+g[E+52>>2];Y=+g[E+56>>2];$=+g[d+184>>2];T=(c[j>>2]=H,+g[j>>2]);S=(c[j>>2]=K,+g[j>>2])*0.0;R=+g[E+8>>2]*0.0;X=(c[j>>2]=I,+g[j>>2]);W=(c[j>>2]=L,+g[j>>2])*0.0;V=+g[E+24>>2]*0.0;aa=(c[j>>2]=J,+g[j>>2]);_=(c[j>>2]=M,+g[j>>2])*0.0;Z=+g[E+40>>2]*0.0;g[O+96>>2]=Q+(R+(S+T*$));g[O+96+4>>2]=U+(V+(W+X*$));g[O+96+8>>2]=Y+(Z+(_+aa*$));g[O+96+12>>2]=0.0;$=+g[d+188>>2];g[O+80>>2]=Q+(R+(S+T*$));g[O+80+4>>2]=U+(V+(W+X*$));g[O+80+8>>2]=Y+(Z+(_+aa*$));g[O+80+12>>2]=0.0;E=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[E>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](E,O+96|0,O+80|0,O+64|0);c[O+64>>2]=H;c[O+64+4>>2]=I;c[O+64+8>>2]=J;g[O+64+12>>2]=0.0;c[O+48>>2]=K;c[O+48+4>>2]=L;c[O+48+8>>2]=M;g[O+48+12>>2]=0.0;$=+g[d+192>>2];aa=+g[d+196>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[M&0](b,d+888+48|0,O+64|0,O+48|0,N,N,$,aa,O+32|0,1,10.0)}l=O;return}default:{l=O;return}}}function ic(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,Q=0,R=0,S=0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0;Z=l;l=l+112|0;c[Z+40>>2]=0;a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+4>>2]=0;c[Z+8>>2]=0;a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;i=e>>>0>8?e:8;if((i|0)>0){c[6995]=(c[6995]|0)+1;h=sc((i<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}h=0;do{Y=j+(h<<4)|0;c[Y>>2]=c[Z+48>>2];c[Y+4>>2]=c[Z+48+4>>2];c[Y+8>>2]=c[Z+48+8>>2];c[Y+12>>2]=c[Z+48+12>>2];h=h+1|0}while((h|0)!=(i|0));Y=j;X=j}else{Y=0;X=0}do if(!e){w=0;h=0;q=0;u=0;v=0}else{i=c[Z+24>>2]|0;if((i|0)<0){h=c[Z+32>>2]|0;if((c[Z+28>>2]|0)<0){if(!((h|0)==0|(a[Z+36>>0]|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+28>>2]=0;h=0}Yk(h+(i<<2)|0,0,P(i,-4)|0)|0}c[Z+24>>2]=0;h=d;i=0;x=3402823466385288598117041.0e14;p=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;z=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;while(1){T=+g[h>>2];x=Tp?T:p;T=+g[h+4>>2];y=Tr?T:r;T=+g[h+8>>2];z=Tt?T:t;i=i+1|0;if((i|0)==(e|0))break;else h=h+16|0}s=p-x;T=r-y;p=t-z;K=x+s*.5;J=y+T*.5;E=z+p*.5;do if(e>>>0<3|(s<9.999999974752427e-07|T<9.999999974752427e-07|p<9.999999974752427e-07)){t=s>9.999999974752427e-07&s<3402823466385288598117041.0e14?s:3402823466385288598117041.0e14;t=T>9.999999974752427e-07&T9.999999974752427e-07&p>2];z=1.0/T*+g[n+4>>2];A=1.0/p*+g[n+8>>2];n=n+16|0;a:do if(h){j=0;while(1){d=Y+(j<<4)|0;r=+g[d>>2];k=Y+(j<<4)+4|0;t=+g[k>>2];m=Y+(j<<4)+8|0;x=+g[m>>2];if(+C(+(r-y))<1.0000000474974513e-03&+C(+(t-z))<1.0000000474974513e-03&+C(+(x-A))<1.0000000474974513e-03)break;j=j+1|0;if(j>>>0>=h>>>0){m=j;break a}}if((y-1.0/s*K)*(y-1.0/s*K)+(z-1.0/T*J)*(z-1.0/T*J)+(A-1.0/p*E)*(A-1.0/p*E)>(r-1.0/s*K)*(r-1.0/s*K)+(t-1.0/T*J)*(t-1.0/T*J)+(x-1.0/p*E)*(x-1.0/p*E)){g[d>>2]=y;g[k>>2]=z;g[m>>2]=A;m=j}else m=j}else m=0;while(0);if((m|0)==(h|0)){g[Y+(h<<4)>>2]=y;g[Y+(h<<4)+4>>2]=z;g[Y+(h<<4)+8>>2]=A;h=h+1|0}if((i|0)==(c[Z+28>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if((q|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((q<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;k=u+4+15&-16}else k=0;d=c[Z+32>>2]|0;if((i|0)<=0){if(d)W=37}else{j=0;do{c[k+(j<<2)>>2]=c[d+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));W=37}if((W|0)==37){W=0;if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Z+32>>2]=0;i=c[Z+24>>2]|0}a[Z+36>>0]=1;c[Z+32>>2]=k;c[Z+28>>2]=q}c[(c[Z+32>>2]|0)+(i<<2)>>2]=m;i=(c[Z+24>>2]|0)+1|0;c[Z+24>>2]=i;o=o+1|0}while((o|0)!=(e|0));if(!h){i=1;x=-3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14}else{i=0;B=3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;H=-3402823466385288598117041.0e14;x=-3402823466385288598117041.0e14;J=3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;K=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;M=3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;N=-3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;while(1){z=+g[Y+(i<<4)>>2];j=zH;x=d?z:x;I=+g[Y+(i<<4)+4>>2];k=IK;t=m?I:t;L=+g[Y+(i<<4)+8>>2];n=LN;r=o?L:r;i=i+1|0;if((i|0)==(h|0))break;else{B=j?z:B;H=d?z:H;J=k?I:J;K=m?I:K;M=n?L:M;N=o?L:N}}i=h>>>0<3}x=x-E;z=t-A;B=r-y;if(!(i|(x<9.999999974752427e-07|z<9.999999974752427e-07|B<9.999999974752427e-07))){if(h|0){r=T;U=h;W=52;break}break}E=E+x*.5;A=A+z*.5;y=y+B*.5;t=x>=9.999999974752427e-07&x<3402823466385288598117041.0e14?x:3402823466385288598117041.0e14;t=z>=9.999999974752427e-07&z=9.999999974752427e-07&B>2]=t;g[Y+4>>2]=y;g[Y+8>>2]=z;g[Y+16>>2]=I;g[Y+20>>2]=y;g[Y+24>>2]=z;g[Y+32>>2]=I;g[Y+36>>2]=H;g[Y+40>>2]=z;g[Y+48>>2]=t;g[Y+52>>2]=H;g[Y+56>>2]=z;g[Y+64>>2]=t;g[Y+68>>2]=y;g[Y+72>>2]=B;g[Y+80>>2]=I;g[Y+84>>2]=y;g[Y+88>>2]=B;g[Y+96>>2]=I;g[Y+100>>2]=H;g[Y+104>>2]=B;g[Y+112>>2]=t;g[Y+116>>2]=H;g[Y+120>>2]=B;U=8;W=52}if((W|0)==52){h=0;do{V=Y+(h<<4)|0;g[V>>2]=s*+g[V>>2];V=Y+(h<<4)+4|0;g[V>>2]=r*+g[V>>2];V=Y+(h<<4)+8|0;g[V>>2]=p*+g[V>>2];h=h+1|0}while(h>>>0>>0);if((U|0)>=4){p=+g[Y>>2];s=+g[Y+4>>2];r=+g[Y+8>>2];V=U<<2;c[6995]=(c[6995]|0)+1;h=sc((V|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[Z+48>>2]=0;c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(i){c[(i+4+15&-16)+-4>>2]=i;h=c[Z+48>>2]|0;if(!h)h=i+4+15&-16;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16}}else h=0;c[Z+48>>2]=h;z=p;x=p;y=r;n=U;q=j;u=0;t=s;p=s;h=U;o=j;d=j;while(1){if((u|0)==(h|0)?(v=u|0?u<<1:1,(u|0)<(v|0)):0){if((v|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((v<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;j=c[Z+48>>2]|0;if((u|0)<=0){if(j|0)W=68}else{h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(u|0));W=68}if((W|0)==68){W=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[Z+48>>2]=0}c[Z+48>>2]=i;m=v}else m=h;c[(c[Z+48>>2]|0)+(u<<2)>>2]=1;k=u;u=u+1|0;do if((k|0)==(n|0)){i=k|0?k<<1:1;if((k|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,F=sc((i<<2|3)+16|0)|0,(F|0)!=0):0){c[(F+4+15&-16)+-4>>2]=F;j=F+4+15&-16}else j=0;if((k|0)>0){h=0;do{c[j+(h<<2)>>2]=c[q+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));if(!d){q=j;d=j;o=j;break}}else if((q|0)==0|(d|0)==0){q=j;d=j;o=j;break}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);q=j;d=j;o=j}else i=k}else i=n;while(0);c[q+(k<<2)>>2]=0;M=+g[Y+(k<<4)>>2];x=M>2];p=N>2];r=T=(U|0))break;else{n=i;h=m}}z=z-x;x=t-p;I=y-r;I=+D(+(z*z+x*x+I*I))*1.0000000474974513e-03;O=Se(Y,U,.009999999776482582,.019999999552965164,1.0,c[Z+48>>2]|0)|0;m=c[Z+48>>2]|0;Q=Se(Y,U,-.009999999776482582,-.019999999552965164,-1.0,m)|0;n=Y+(O<<4)|0;u=Y+(Q<<4)|0;x=+g[n>>2]-+g[u>>2];v=Y+(O<<4)+4|0;w=Y+(Q<<4)+4|0;y=+g[v>>2]-+g[w>>2];F=Y+(O<<4)+8|0;G=Y+(Q<<4)+8|0;z=+g[F>>2]-+g[G>>2];b:do if((O|0)!=(Q|0)?!(z==0.0&y==0.0&x==0.0):0){p=+D(+((z*.019999999552965164-y*0.0)*(z*.019999999552965164-y*0.0)+(x*0.0-z)*(x*0.0-z)+(y-x*.019999999552965164)*(y-x*.019999999552965164)));r=+D(+((z-y*0.0)*(z-y*0.0)+(z*.019999999552965164+x*0.0)*(z*.019999999552965164+x*0.0)+(y*-.019999999552965164-x)*(y*-.019999999552965164-x)));if(p>r){s=(y-x*.019999999552965164)*(1.0/p);t=(z*.019999999552965164-y*0.0)*(1.0/p);p=(x*0.0-z)*(1.0/p)}else{s=(y*-.019999999552965164-x)*(1.0/r);t=(z-y*0.0)*(1.0/r);p=(z*.019999999552965164+x*0.0)*(1.0/r)}h=Se(Y,U,t,p,s,m)|0;if((h|0)==(O|0)|(h|0)==(Q|0))i=Se(Y,U,-t,-p,-s,m)|0;else i=h;if(!((i|0)==(O|0)|(i|0)==(Q|0))){j=Y+(i<<4)|0;p=+g[j>>2]-+g[n>>2];d=Y+(i<<4)+4|0;r=+g[d>>2]-+g[v>>2];k=Y+(i<<4)+8|0;s=+g[k>>2]-+g[F>>2];t=1.0/+D(+((y*p-r*x)*(y*p-r*x)+((r*z-s*y)*(r*z-s*y)+(s*x-z*p)*(s*x-z*p))));h=Se(Y,U,(r*z-s*y)*t,(s*x-z*p)*t,(y*p-r*x)*t,m)|0;if((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))h=Se(Y,U,-((r*z-s*y)*t),-((s*x-z*p)*t),-((y*p-r*x)*t),m)|0;if(!((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))?(E=+g[n>>2],K=+g[v>>2],B=+g[F>>2],N=+g[u>>2]-E,H=+g[w>>2]-K,L=+g[G>>2]-B,M=+g[j>>2]-E,J=+g[d>>2]-K,T=+g[k>>2]-B,R=(+g[Y+(h<<4)+8>>2]-B)*(N*J-H*M)+((+g[Y+(h<<4)>>2]-E)*(H*T-L*J)+(+g[Y+(h<<4)+4>>2]-K)*(L*M-N*T))<0.0,S=R?i:h,R=R?h:i,(O|0)!=-1):0){B=(+g[Y+(O<<4)>>2]+ +g[Y+(Q<<4)>>2]+ +g[Y+(R<<4)>>2]+ +g[Y+(S<<4)>>2])*.25;E=(+g[Y+(O<<4)+4>>2]+ +g[Y+(Q<<4)+4>>2]+ +g[Y+(R<<4)+4>>2]+ +g[Y+(S<<4)+4>>2])*.25;H=(+g[Y+(O<<4)+8>>2]+ +g[Y+(Q<<4)+8>>2]+ +g[Y+(R<<4)+8>>2]+ +g[Y+(S<<4)+8>>2])*.25;h=Lh(Z,R,S,Q)|0;c[h+12>>2]=2;c[h+16>>2]=3;c[h+20>>2]=1;h=Lh(Z,S,R,O)|0;c[h+12>>2]=3;c[h+16>>2]=2;c[h+20>>2]=0;h=Lh(Z,O,Q,S)|0;c[h+12>>2]=0;c[h+16>>2]=1;c[h+20>>2]=3;h=Lh(Z,Q,O,R)|0;c[h+12>>2]=1;c[h+16>>2]=0;c[h+20>>2]=2;c[q+(S<<2)>>2]=1;c[q+(R<<2)>>2]=1;c[q+(Q<<2)>>2]=1;c[q+(O<<2)>>2]=1;h=c[Z+4>>2]|0;if((h|0)>0){j=c[Z+12>>2]|0;i=0;do{h=c[j+(i<<2)>>2]|0;R=c[h>>2]|0;Q=c[h+4>>2]|0;S=c[h+8>>2]|0;x=+g[Y+(Q<<4)>>2];s=x-+g[Y+(R<<4)>>2];y=+g[Y+(Q<<4)+4>>2];t=y-+g[Y+(R<<4)+4>>2];r=+g[Y+(Q<<4)+8>>2];p=r-+g[Y+(R<<4)+8>>2];x=+g[Y+(S<<4)>>2]-x;y=+g[Y+(S<<4)+4>>2]-y;r=+g[Y+(S<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}R=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[h+28>>2]=R;S=c[h>>2]|0;g[h+32>>2]=(+g[Y+(R<<4)>>2]-+g[Y+(S<<4)>>2])*A+(+g[Y+(R<<4)+4>>2]-+g[Y+(S<<4)+4>>2])*r+(+g[Y+(R<<4)+8>>2]-+g[Y+(S<<4)+8>>2])*p;i=i+1|0;h=c[Z+4>>2]|0}while((i|0)<(h|0))}if((e+-4|0)>0){u=e+-4|0;while(1){m=c[Z+12>>2]|0;d=0;i=0;do{j=c[m+(d<<2)>>2]|0;do if(i){if(!j)break;if(+g[i+32>>2]<+g[j+32>>2])W=104}else W=104;while(0);if((W|0)==104){W=0;i=j}d=d+1|0}while((d|0)<(h|0));if((i|0)==0?1:!(+g[i+32>>2]>I)){h=1;break b}n=c[i+28>>2]|0;c[q+(n<<2)>>2]=1;h=c[Z+4>>2]|0;c:do if(h|0){j=Y+(n<<4)|0;d=Y+(n<<4)+4|0;k=Y+(n<<4)+8|0;i=m;while(1){h=h+-1|0;i=c[i+(h<<2)>>2]|0;do if(i|0){S=c[i>>2]|0;R=c[i+4>>2]|0;e=c[i+8>>2]|0;M=+g[Y+(R<<4)>>2];N=+g[Y+(S<<4)>>2];x=+g[Y+(R<<4)+4>>2];z=+g[Y+(S<<4)+4>>2];J=+g[Y+(R<<4)+8>>2];K=+g[Y+(S<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!((A==0.0?0.0:1.0/A*((M-N)*y-(x-z)*L))*(+g[k>>2]-K)+((+g[j>>2]-N)*(A==0.0?1.0:1.0/A*((x-z)*T-(J-K)*y))+(+g[d>>2]-z)*(A==0.0?0.0:1.0/A*((J-K)*L-(M-N)*T)))>I*.009999999776482582))break;me(Z,i,n)}while(0);if(!h)break;i=c[Z+12>>2]|0}h=c[Z+4>>2]|0;if(!h)break;else i=h;d:do{i=i+-1|0;d=c[Z+12>>2]|0;k=c[d+(i<<2)>>2]|0;do if(k){m=c[k>>2]|0;do if((m|0)!=(n|0)){j=c[k+4>>2]|0;if((j|0)==(n|0)){j=n;break}if((c[k+8>>2]|0)!=(n|0))break d}else j=c[k+4>>2]|0;while(0);e=c[k+8>>2]|0;M=+g[Y+(j<<4)>>2];N=+g[Y+(m<<4)>>2];x=+g[Y+(j<<4)+4>>2];z=+g[Y+(m<<4)+4>>2];J=+g[Y+(j<<4)+8>>2];K=+g[Y+(m<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!(AI*.009999999776482582))break;me(Z,c[d+(c[k+12>>2]<<2)>>2]|0,n);h=c[Z+4>>2]|0;i=h}while(0)}while((i|0)!=0);if(!h)break;d=c[Z+12>>2]|0;do{h=h+-1|0;j=c[d+(h<<2)>>2]|0;do if(j|0){if((c[j+28>>2]|0)>-1)break c;S=c[j>>2]|0;R=c[j+4>>2]|0;e=c[j+8>>2]|0;x=+g[Y+(R<<4)>>2];s=x-+g[Y+(S<<4)>>2];y=+g[Y+(R<<4)+4>>2];t=y-+g[Y+(S<<4)+4>>2];r=+g[Y+(R<<4)+8>>2];p=r-+g[Y+(S<<4)+8>>2];x=+g[Y+(e<<4)>>2]-x;y=+g[Y+(e<<4)+4>>2]-y;r=+g[Y+(e<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}i=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[j+28>>2]=i;if(!(c[q+(i<<2)>>2]|0)){e=c[j>>2]|0;g[j+32>>2]=(+g[Y+(i<<4)>>2]-+g[Y+(e<<4)>>2])*A+(+g[Y+(i<<4)+4>>2]-+g[Y+(e<<4)+4>>2])*r+(+g[Y+(i<<4)+8>>2]-+g[Y+(e<<4)+8>>2])*p;break}else{c[j+28>>2]=-1;break}}while(0)}while((h|0)!=0)}while(0);if((u|0)<=1){h=1;break b}u=u+-1|0;h=c[Z+4>>2]|0}}else h=1}else h=0}else h=0}else h=0;while(0);i=c[Z+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);c[Z+48>>2]=0}if(!((q|0)==0|(o|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(h){h=c[Z+4>>2]|0;if((h|0)>0){v=0;m=0;j=0;k=0;i=0;d=c[Z+12>>2]|0;n=0;do{o=c[d+(v<<2)>>2]|0;if(o){do if((k|0)==(m|0)){d=m|0?m<<1:1;if((m|0)>=(d|0)){d=m;break}do if(!d)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((m|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(!n){j=i;n=i;break}}else if((j|0)==0|(n|0)==0){j=i;n=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);j=i;n=i}else d=m;while(0);c[j+(k<<2)>>2]=c[o>>2];o=k+1|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+4|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){u=n;break}do if(!m)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!n){d=m;j=i;u=i;break}}else if((j|0)==0|(n|0)==0){d=m;j=i;u=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);d=m;j=i;u=i}else u=n;while(0);c[j+(o<<2)>>2]=c[q>>2];o=k+2|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+8|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){m=d;n=u;break}do if(!m)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){n=0;break}c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[n+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!u){j=n;i=n;break}}else if((j|0)==0|(u|0)==0){j=n;i=n;break}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);j=n;i=n}else{m=d;n=u}while(0);c[j+(o<<2)>>2]=c[q>>2];d=c[Z+12>>2]|0;h=c[d+(v<<2)>>2]|0;c[d+(c[h+24>>2]<<2)>>2]=0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}k=k+3|0;h=c[Z+4>>2]|0}v=v+1|0}while((v|0)<(h|0));c[Z+44>>2]=(k|0)/3|0;if((k|0)>0){c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h)d=0;else{c[(h+4+15&-16)+-4>>2]=h;d=h+4+15&-16}Yk(d|0,0,k<<2|0)|0;h=0;do{c[d+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));n=i;m=j;h=d;S=d}else{n=i;m=j;h=0;S=0}}else{c[Z+44>>2]=0;n=0;m=0;h=0;k=0;S=0}i=c[Z+4>>2]|0;if((i|0)<0){if((c[Z+8>>2]|0)<0){j=c[Z+12>>2]|0;if(j|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+12>>2]=0}a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+8>>2]=0}do{c[(c[Z+12>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[Z+4>>2]=0;if(!((m|0)==0|(n|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}R=c[Z+44>>2]|0;m=(U|0)>0;if(m){c[6995]=(c[6995]|0)+1;i=sc((U<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{e=j+(i<<4)|0;c[e>>2]=c[Z+48>>2];c[e+4>>2]=c[Z+48+4>>2];c[e+8>>2]=c[Z+48+8>>2];c[e+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(U|0));Q=j;O=j}else{Q=0;O=0}j=c[Z+24>>2]|0;do if((j|0)>0){c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)d=0;else{c[(i+4+15&-16)+-4>>2]=i;d=i+4+15&-16}Yk(d|0,0,j<<2|0)|0;if((c[Z+24>>2]|0)<=0){G=d;F=d;break}j=c[Z+32>>2]|0;i=0;do{c[d+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)<(c[Z+24>>2]|0));G=d;F=d}else{G=0;F=0}while(0);if(m){c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}Yk(i|0,0,V|0)|0;u=i;v=i}else{u=0;v=0}Yk(v|0,0,V|0)|0;if((R|0)<=0)if(!u)w=0;else{i=0;W=221}else{q=c[Z+32>>2]|0;o=0;i=0;do{j=h+(o<<2)|0;m=c[j>>2]|0;n=u+(m<<2)|0;d=c[n>>2]|0;if(!d){c[j>>2]=i;c[Q+(i<<4)>>2]=c[X+(m<<4)>>2];c[Q+(i<<4)+4>>2]=c[X+(m<<4)+4>>2];c[Q+(i<<4)+8>>2]=c[X+(m<<4)+8>>2];d=c[Z+24>>2]|0;if((d|0)>0){j=0;do{if((c[G+(j<<2)>>2]|0)==(m|0))c[q+(j<<2)>>2]=i;j=j+1|0}while((j|0)!=(d|0))}i=i+1|0;c[n>>2]=i}else c[j>>2]=d+-1;o=o+1|0}while((o|0)!=(R*3|0));W=221}do if((W|0)==221){if(!v){w=i;break}c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0);w=i}while(0);if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}if((w|0)>0){c[6995]=(c[6995]|0)+1;i=sc((w<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{W=j+(i<<4)|0;c[W>>2]=c[Z+48>>2];c[W+4>>2]=c[Z+48+4>>2];c[W+8>>2]=c[Z+48+8>>2];c[W+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(w|0));m=j;d=j}else{m=0;d=0}if((R|0)>0){c[6995]=(c[6995]|0)+1;i=sc((R*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[Z+40>>2]|0;if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+40>>2]=i;Yk(i|0,0,R*12|0)|0}gi(d|0,O|0,w<<4|0)|0;gi(c[Z+40>>2]|0,S|0,R*12|0)|0;do if(k){if(!h){h=0;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=0}while(0);if((Q|0)==0|(O|0)==0){q=m;u=R;v=R*3|0;break}c[6996]=(c[6996]|0)+1;Cd(c[O+-4>>2]|0);q=m;u=R;v=R*3|0;break}}}w=0;h=0;q=0;u=0;v=0}while(0);if(!((Y|0)==0|(X|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[X+-4>>2]|0)}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(1271)|0;if(!h)F=0;else{c[(h+4+15&-16)+-4>>2]=h;F=h+4+15&-16}Bc(F,b,w,q,0);if((u|0)>0){i=F+780|0;j=F+792|0;d=F+800|0;k=F+984|0;h=0;do{o=h*3|0;b=c[Z+40>>2]|0;m=c[b+(o<<2)>>2]|0;n=c[b+(o+1<<2)>>2]|0;o=c[b+(o+2<<2)>>2]|0;if((m|0)<(n|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(m*104|0);c[Y+(b*52|0)+28>>2]=X+(n*104|0);M=+g[X+(m*104|0)+8>>2]-+g[X+(n*104|0)+8>>2];N=+g[X+(m*104|0)+12>>2]-+g[X+(n*104|0)+12>>2];T=+g[X+(m*104|0)+16>>2]-+g[X+(n*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((n|0)<(o|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(n*104|0);c[Y+(b*52|0)+28>>2]=X+(o*104|0);M=+g[X+(n*104|0)+8>>2]-+g[X+(o*104|0)+8>>2];N=+g[X+(n*104|0)+12>>2]-+g[X+(o*104|0)+12>>2];T=+g[X+(n*104|0)+16>>2]-+g[X+(o*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((o|0)<(m|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(o*104|0);c[Y+(b*52|0)+28>>2]=X+(m*104|0);M=+g[X+(o*104|0)+8>>2]-+g[X+(m*104|0)+8>>2];N=+g[X+(o*104|0)+12>>2]-+g[X+(m*104|0)+12>>2];T=+g[X+(o*104|0)+16>>2]-+g[X+(m*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}bg(F,m,n,o,0);h=h+1|0}while((h|0)!=(u|0))}if(w)if(!q)u=0;else{c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0);u=0}else u=q;if(v|0){h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0}if(f){j=c[F+792>>2]|0;if((j|0)>0){d=F+800|0;h=243703;i=0;do{k=c[d>>2]|0;m=k+(i*52|0)|0;h=(P(h,1664525)|0)+1013904223|0;n=Z+48|0;o=m;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=m;o=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;o=Z+48|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(j|0))}else h=243703;k=c[F+812>>2]|0;if((k|0)>0){m=F+820|0;i=0;do{d=c[m>>2]|0;j=d+(i*44|0)|0;h=(P(h,1664525)|0)+1013904223|0;d=d+(((h>>>0)%(k>>>0)|0)*44|0)|0;n=Z+48|0;o=j;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=j;o=d;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=d;o=Z+48|0;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(k|0))}}h=c[Z+32>>2]|0;if(h|0){if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+32>>2]=0}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;h=c[Z+12>>2]|0;if(h|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+12>>2]=0}h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0;if(!u){l=Z;return F|0}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);l=Z;return F|0}function jc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0;K=l;l=l+16|0;f=c[b+1112>>2]|0;if((f|0)>0)while(1){j=c[c[b+1120>>2]>>2]|0;f=c[j+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[j+52>>2]|0;if(f|0){if(a[j+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+52>>2]=0}a[j+56>>0]=1;c[j+52>>2]=0;c[j+44>>2]=0;c[j+48>>2]=0;f=c[j+32>>2]|0;if(f|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;f=c[j+12>>2]|0;if(f|0){if(a[j+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+12>>2]=0}a[j+16>>0]=1;c[j+12>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);f=c[b+1112>>2]|0;a:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(j|0))break a;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)>(h|0)){E=c[b+1120>>2]|0;F=E+(h<<2)|0;G=c[F>>2]|0;c[F>>2]=c[E+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=G;c[b+1112>>2]=f+-1;f=f+-1|0}if((f|0)<=0){h=f;break}}else h=f;f=c[b+772>>2]|0;f=(f|0)>(d|0)?d:f;if((h|0)<(f|0)){if((c[b+1116>>2]|0)<(f|0)){if(f){c[6995]=(c[6995]|0)+1;i=sc((f<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+1112>>2]|0;if((d|0)>0){j=0;do{c[i+(j<<2)>>2]=c[(c[b+1120>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(d|0));j=i;i=b+1120|0}else{j=i;i=b+1120|0}}else{j=0;i=b+1120|0}d=c[i>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[i>>2]=0}a[b+1124>>0]=1;c[i>>2]=j;c[b+1116>>2]=f}else i=b+1120|0;do{c[(c[i>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=(f|0))}c[b+1112>>2]=f;if((f|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;j=f+348|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;j=c[b+1120>>2]|0;a[(c[j+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0;f=c[b+1112>>2]|0}while((h|0)<(f|0));if((f|0)>0){h=c[b+772>>2]|0;if((h|0)>0){i=0;k=0.0;m=0.0;n=0.0;d=f;while(1){p=c[b+780>>2]|0;v=k+ +g[p+(i*104|0)+8>>2];m=m+ +g[p+(i*104|0)+12>>2];w=n+ +g[p+(i*104|0)+16>>2];o=c[j+(((i*29873|0)%(d|0)|0)<<2)>>2]|0;p=p+(i*104|0)|0;j=c[o+24>>2]|0;if((j|0)==(c[o+28>>2]|0)?(q=j|0?j<<1:1,(j|0)<(q|0)):0){if(!q)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((q<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+24>>2]|0}if((j|0)>0){d=0;do{c[h+(d<<2)>>2]=c[(c[o+32>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(j|0))}d=c[o+32>>2]|0;if(d){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);j=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=h;c[o+28>>2]=q;h=c[b+772>>2]|0}c[(c[o+32>>2]|0)+(j<<2)>>2]=p;c[o+24>>2]=j+1;i=i+1|0;if((i|0)>=(h|0))break;k=v;n=w;d=c[b+1112>>2]|0;j=c[b+1120>>2]|0}k=1.0/+(h|0);if((f|0)>=0)if(!f){i=0;n=v*k;m=m*k;k=w*k;J=70}else{n=v*k;m=m*k;k=w*k;J=68}else{E=b+780|0;G=0;F=0}}else{n=1.0/+(h|0)*0.0;m=1.0/+(h|0)*0.0;k=1.0/+(h|0)*0.0;J=68}if((J|0)==68){c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h){i=0;J=70}else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16;J=70}}if((J|0)==70){h=0;do{g[i+(h<<4)>>2]=n;g[i+(h<<4)+4>>2]=m;g[i+(h<<4)+8>>2]=k;g[i+(h<<4)+12>>2]=0.0;h=h+1|0}while((h|0)!=(f|0));E=b+780|0;G=i;F=i}t=G+4|0;u=G+8|0;s=0;do{z=+(s|0)*.0625;z=2.0-(z>1.0?1.0:z);d=0;o=0;while(1){h=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=c[h+24>>2]|0;if((j|0)>0){i=c[h+32>>2]|0;h=0;k=0.0;m=0.0;n=0.0;do{r=c[i+(h<<2)>>2]|0;k=k+ +g[r+8>>2];m=m+ +g[r+12>>2];n=n+ +g[r+16>>2];h=h+1|0}while((h|0)!=(j|0))}else{n=0.0;m=0.0;k=0.0}if(!j)r=d;else{q=G+(o<<4)|0;w=+g[q>>2];r=G+(o<<4)+4|0;x=+g[r>>2];h=G+(o<<4)+8|0;y=+g[h>>2];v=w+z*(k*(1.0/+(j|0))-w);m=x+z*(m*(1.0/+(j|0))-x);k=y+z*(n*(1.0/+(j|0))-y);g[q>>2]=v;g[r>>2]=m;g[h>>2]=k;g[G+(o<<4)+12>>2]=0.0;j=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;h=c[j+24>>2]|0;if((h|0)<0){if((c[j+28>>2]|0)<0){i=c[j+32>>2]|0;if(i|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+28>>2]=0}do{c[(c[j+32>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=0)}c[j+24>>2]=0;r=d|(v-w)*(v-w)+(m-x)*(m-x)+(k-y)*(k-y)>1.1920928955078125e-07}o=o+1|0;if((o|0)>=(f|0))break;else d=r}s=s+1|0;h=c[b+772>>2]|0;b:do if((h|0)>0){if((f|0)>1)q=0;else{p=0;while(1){d=c[c[b+1120>>2]>>2]|0;o=(c[E>>2]|0)+(p*104|0)|0;i=c[d+24>>2]|0;if((i|0)==(c[d+28>>2]|0)?(D=i|0?i<<1:1,(i|0)<(D|0)):0){if(!D)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((D<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[d+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[d+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[d+32>>2]|0;if(j){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[d+24>>2]|0}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=h;c[d+28>>2]=D;h=c[b+772>>2]|0}c[(c[d+32>>2]|0)+(i<<2)>>2]=o;c[d+24>>2]=i+1;p=p+1|0;if((p|0)>=(h|0))break b}}do{o=c[E>>2]|0;m=+g[o+(q*104|0)+8>>2];n=+g[o+(q*104|0)+12>>2];v=+g[o+(q*104|0)+16>>2];i=1;k=+C(+(+g[G>>2]-m))+ +C(+(+g[t>>2]-n))+ +C(+(+g[u>>2]-v));j=0;while(1){w=+C(+(+g[G+(i<<4)>>2]-m))+ +C(+(+g[G+(i<<4)+4>>2]-n))+ +C(+(+g[G+(i<<4)+8>>2]-v));d=w>2]|0)+(j<<2)>>2]|0;d=o+(q*104|0)|0;i=c[p+24>>2]|0;if((i|0)==(c[p+28>>2]|0)?(B=i|0?i<<1:1,(i|0)<(B|0)):0){if(!B)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((B<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[p+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[p+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[p+32>>2]|0;if(j){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=h;c[p+28>>2]=B;h=c[b+772>>2]|0}c[(c[p+32>>2]|0)+(i<<2)>>2]=d;c[p+24>>2]=i+1;q=q+1|0}while((q|0)<(h|0))}while(0)}while((s|0)<(e|0)&r);if((h|0)>0){h=h<<2;c[6995]=(c[6995]|0)+1;f=sc((h|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}Yk(f|0,-1,h|0)|0;e=f;u=f}else{e=0;u=0}f=c[b+1112>>2]|0;if((f|0)>0){o=c[b+1120>>2]|0;d=0;do{j=c[o+(d<<2)>>2]|0;if((c[j+24>>2]|0)>0){i=c[E>>2]|0;h=c[j+32>>2]|0;f=0;do{c[e+((((c[h+(f<<2)>>2]|0)-i|0)/104|0)<<2)>>2]=d;f=f+1|0}while((f|0)<(c[j+24>>2]|0));f=c[b+1112>>2]|0}d=d+1|0}while((d|0)<(f|0))}if((c[b+812>>2]|0)>0){r=0;do{D=c[b+820>>2]|0;q=c[E>>2]|0;f=((c[D+(r*44|0)+8>>2]|0)-q|0)/104|0;c[K>>2]=f;c[K+4>>2]=((c[D+(r*44|0)+12>>2]|0)-q|0)/104|0;c[K+8>>2]=((c[D+(r*44|0)+16>>2]|0)-q|0)/104|0;q=0;while(1){o=c[e+(f<<2)>>2]|0;d=1;do{f=c[K+(((d+q|0)%3|0)<<2)>>2]|0;c:do if((c[e+(f<<2)>>2]|0)!=(o|0)){p=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=(c[E>>2]|0)+(f*104|0)|0;h=c[p+24>>2]|0;d:do if((h|0)>0){i=c[p+32>>2]|0;f=0;while(1){if((c[i+(f<<2)>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(h|0))break d}if((f|0)!=(h|0))break c}while(0);if((h|0)==(c[p+28>>2]|0)?(H=h|0?h<<1:1,(h|0)<(H|0)):0){if(!H)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((H<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[p+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[p+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[p+32>>2]|0;if(i){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=f;c[p+28>>2]=H;f=h}else f=h;c[(c[p+32>>2]|0)+(f<<2)>>2]=j;c[p+24>>2]=f+1}while(0);d=d+1|0}while((d|0)!=3);f=q+1|0;if((f|0)>=3)break;q=f;f=c[K+(f<<2)>>2]|0}r=r+1|0}while((r|0)<(c[b+812>>2]|0));f=c[b+1112>>2]|0}if((f|0)>1){c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;p=f+36|0;a[p>>0]=1;q=f+32|0;c[q>>2]=0;r=f+24|0;c[r>>2]=0;s=f+28|0;c[s>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;t=f+348|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;t=f;a[f+377>>0]=0;j=c[b+772>>2]|0;if((j|0)>0){c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[r>>2]|0;if((h|0)>0){f=0;do{c[i+(f<<2)>>2]=c[(c[q>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[q>>2]|0;if(f|0){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[q>>2]=0}a[p>>0]=1;c[q>>2]=i;c[s>>2]=j;f=c[b+772>>2]|0;if((f|0)>0){o=0;i=c[r>>2]|0;h=j;while(1){d=(c[E>>2]|0)+(o*104|0)|0;do if((i|0)==(h|0)){j=h|0?h<<1:1;if((h|0)>=(j|0)){j=h;break}if(!j)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[r>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[q>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[q>>2]|0;if(i){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[r>>2]|0}c[q>>2]=0}a[p>>0]=1;c[q>>2]=f;c[s>>2]=j;f=c[b+772>>2]|0}else{j=h;h=i}while(0);c[(c[q>>2]|0)+(h<<2)>>2]=d;i=h+1|0;c[r>>2]=i;o=o+1|0;if((o|0)>=(f|0))break;else h=j}}}f=c[b+1112>>2]|0;if((f|0)==(c[b+1116>>2]|0)?(I=f|0?f<<1:1,(f|0)<(I|0)):0){if(!I)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((I<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+1112>>2]|0}if((f|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+1120>>2]|0;if(h){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+1112>>2]|0}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=i;c[b+1116>>2]=I}c[(c[b+1120>>2]|0)+(f<<2)>>2]=t;I=f+1|0;c[b+1112>>2]=I;E=c[b+1120>>2]|0;f=E+(f<<2)|0;H=c[E>>2]|0;c[E>>2]=c[f>>2];c[f>>2]=H;f=I}if((f|0)>0){h=0;do{d=c[(c[b+1120>>2]|0)+(h<<2)>>2]|0;do if(!(c[d+24>>2]|0)){j=h+-1|0;f=c[d+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[d+52>>2]|0;if(f|0){if(a[d+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+52>>2]=0}a[d+56>>0]=1;c[d+52>>2]=0;c[d+44>>2]=0;c[d+48>>2]=0;f=c[d+32>>2]|0;if(f|0){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;f=c[d+12>>2]|0;if(f|0){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+1112>>2]|0;e:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(d|0))break e;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)<=(h|0)){h=j;break}H=c[b+1120>>2]|0;I=H+(h<<2)|0;h=c[I>>2]|0;c[I>>2]=c[H+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=h;c[b+1112>>2]=f+-1;h=j;f=f+-1|0}while(0);h=h+1|0}while((h|0)<(f|0))}if(!((e|0)==0|(u|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0)}if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}}else J=234}else J=234;f:do if((J|0)==234){d=c[b+832>>2]|0;if(d|0){if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+1112>>2]|0;if((i|0)>0){h=0;do{c[j+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+1120>>2]|0;if(h|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=j;c[b+1116>>2]=d;h=b+1120|0}else h=b+1120|0;do{c[(c[h>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+832>>2]|0)<=0)break;d=0;while(1){j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+840>>2]|0)+(d*104|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(r=h|0?h<<1:1,(h|0)<(r|0)):0){if(!r)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=r;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=4);d=d+1|0;if((d|0)>=(c[b+832>>2]|0))break f}}d=c[b+812>>2]|0;if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){if(d){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+1112>>2]|0;if((j|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[b+1120>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));j=b+1120|0}else j=b+1120|0}else{h=0;j=b+1120|0}i=c[j>>2]|0;if(i|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+1124>>0]=1;c[j>>2]=h;c[b+1116>>2]=d}do{c[(c[b+1120>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+812>>2]|0)>0){d=0;do{j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+820>>2]|0)+(d*44|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if(!s)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=s;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=3);d=d+1|0}while((d|0)<(c[b+812>>2]|0))}}while(0);f=c[b+1112>>2]|0;if(!f){b=0;l=K;return b|0}if((f|0)>0){p=0;do{q=c[(c[b+1120>>2]|0)+(p<<2)>>2]|0;g[q+128>>2]=0.0;o=c[q+24>>2]|0;d=c[q+4>>2]|0;if((o|0)>(d|0)){if((c[q+8>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc((o<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+4>>2]|0}j=c[q+12>>2]|0;if((i|0)<=0)if(!j)h=q+16|0;else J=324;else{h=0;do{c[f+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));J=324}if((J|0)==324){J=0;if(!(a[q+16>>0]|0))h=q+16|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=q+16|0}}a[h>>0]=1;c[q+12>>2]=f;c[q+8>>2]=o}else f=c[q+12>>2]|0;Yk(f+(d<<2)|0,0,o-d<<2|0)|0;d=c[q+24>>2]|0}else d=o;c[q+4>>2]=o;j=(d|0)>0;if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;do{k=+g[(c[h+(f<<2)>>2]|0)+88>>2];if(k==0.0){a[q+376>>0]=1;k=999999984306749440.0}else k=1.0/k;g[i+(f<<2)>>2]=k;m=k+ +g[q+128>>2];g[q+128>>2]=m;f=f+1|0}while((f|0)!=(d|0));g[q+128>>2]=1.0/m;f=0;k=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;A=+g[i+(f<<2)>>2];k=k+ +g[I+8>>2]*A;n=n+A*+g[I+12>>2];v=v+A*+g[I+16>>2];f=f+1|0}while((f|0)!=(d|0));m=1.0/m}else{m=1.0/+g[q+128>>2];g[q+128>>2]=m;v=0.0;n=0.0;k=0.0}A=k*m;z=n*m;y=v*m;g[q+228>>2]=A;g[q+232>>2]=z;g[q+236>>2]=y;g[q+240>>2]=0.0;f=q+316|0;h=f+36|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=q+132|0;h=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;k=0.0;x=0.0;w=0.0;m=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;O=+g[I+8>>2]-A;M=+g[I+12>>2]-z;N=+g[I+16>>2]-y;L=+g[i+(f<<2)>>2];k=k+L*(M*M+N*N);g[q+132>>2]=k;x=L*(O*O+N*N)+x;g[q+152>>2]=x;w=(O*O+M*M)*L+w;g[q+172>>2]=w;m=m-M*O*L;g[q+136>>2]=m;n=n-N*O*L;g[q+140>>2]=n;v=v-N*M*L;g[q+156>>2]=v;f=f+1|0}while((f|0)!=(d|0));f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0}else{f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0;x=0.0;w=0.0;v=0.0;n=0.0;m=0.0;k=0.0}L=x*w-v*v;M=v*n-w*m;N=v*m-x*n;O=1.0/(L*k+m*M+N*n);g[q+132>>2]=L*O;g[f>>2]=(v*n-w*m)*O;g[h>>2]=(v*m-x*n)*O;g[q+144>>2]=0.0;g[q+148>>2]=M*O;g[j>>2]=(w*k-n*n)*O;g[i>>2]=(m*n-v*k)*O;g[q+160>>2]=0.0;g[q+164>>2]=N*O;g[q+168>>2]=(n*m-v*k)*O;g[q+172>>2]=(x*k-m*m)*O;g[q+176>>2]=0.0;c[q+60>>2]=1065353216;c[q+64>>2]=0;c[q+64+4>>2]=0;c[q+64+8>>2]=0;c[q+64+12>>2]=0;c[q+80>>2]=1065353216;c[q+84>>2]=0;c[q+84+4>>2]=0;c[q+84+8>>2]=0;c[q+84+12>>2]=0;c[q+100>>2]=1065353216;c[q+104>>2]=0;c[q+108>>2]=c[q+228>>2];c[q+108+4>>2]=c[q+228+4>>2];c[q+108+8>>2]=c[q+228+8>>2];c[q+108+12>>2]=c[q+228+12>>2];d=c[q+24>>2]|0;j=c[q+44>>2]|0;if((j|0)<(d|0)){if((c[q+48>>2]|0)<(d|0)){if(!d){f=0;i=j}else{c[6995]=(c[6995]|0)+1;f=sc((d<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+44>>2]|0}if((i|0)>0){h=0;do{I=f+(h<<4)|0;H=(c[q+52>>2]|0)+(h<<4)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[q+52>>2]|0;if(h|0){if(a[q+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[q+52>>2]=0}a[q+56>>0]=1;c[q+52>>2]=f;c[q+48>>2]=d;h=q+52|0}else h=q+52|0;f=j;do{I=(c[h>>2]|0)+(f<<4)|0;c[I>>2]=c[K>>2];c[I+4>>2]=c[K+4>>2];c[I+8>>2]=c[K+8>>2];c[I+12>>2]=c[K+12>>2];f=f+1|0}while((f|0)!=(d|0))}c[q+44>>2]=d;if((d|0)>0){f=0;do{H=c[(c[q+32>>2]|0)+(f<<2)>>2]|0;N=+g[H+12>>2]-+g[q+232>>2];O=+g[H+16>>2]-+g[q+236>>2];I=c[q+52>>2]|0;g[I+(f<<4)>>2]=+g[H+8>>2]-+g[q+228>>2];g[I+(f<<4)+4>>2]=N;g[I+(f<<4)+8>>2]=O;g[I+(f<<4)+12>>2]=0.0;f=f+1|0}while((f|0)<(c[q+44>>2]|0))}p=p+1|0}while((p|0)<(c[b+1112>>2]|0))}Tc(b);f=c[b+1112>>2]|0;o=P(f,f)|0;d=c[b+1132>>2]|0;if((o|0)>(d|0)){if((c[b+1136>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc(o+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+1132>>2]|0}j=c[b+1140>>2]|0;if((i|0)<=0)if(!j)h=b+1144|0;else J=372;else{h=0;do{a[f+h>>0]=a[j+h>>0]|0;h=h+1|0}while((h|0)!=(i|0));J=372}if((J|0)==372)if(!(a[b+1144>>0]|0))h=b+1144|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+1144|0}a[h>>0]=1;c[b+1140>>2]=f;c[b+1136>>2]=o}else f=c[b+1140>>2]|0;Yk(f+d|0,0,o-d|0)|0;f=c[b+1112>>2]|0}c[b+1132>>2]=o;if((f|0)<=0){b=f;l=K;return b|0}e=c[b+1120>>2]|0;s=c[b+1140>>2]|0;r=0;do{t=c[e+(r<<2)>>2]|0;c[t+380>>2]=r;u=c[t+24>>2]|0;q=0;do{j=c[e+(q<<2)>>2]|0;g:do if((u|0)>0){d=c[j+24>>2]|0;h=0;while(1){if((d|0)>0){p=c[(c[t+32>>2]|0)+(h<<2)>>2]|0;o=c[j+32>>2]|0;i=0;do{if((p|0)==(c[o+(i<<2)>>2]|0)){h=1;break g}i=i+1|0}while((i|0)<(d|0))}h=h+1|0;if((h|0)>=(u|0)){h=0;break}}}else h=0;while(0);a[s+((P(f,q)|0)+r)>>0]=h;q=q+1|0}while((q|0)!=(f|0));r=r+1|0}while((r|0)!=(f|0));l=K;return f|0}function kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;ja=l;l=l+64|0;if((e|0)<=0){l=ja;return}$=ja+16+4|0;aa=ja+16+8|0;Y=0;do{ba=c[d+(Y<<2)>>2]|0;ca=c[ba+772>>2]|0;da=c[ba+776>>2]|0;ea=Rj(b,ca,+g[f+12>>2])|0;fa=Rj(b,da,+g[f+12>>2])|0;ga=c[b+16>>2]|0;O=+g[ga+(ea*244|0)+128>>2];P=+g[ga+(ea*244|0)+132>>2];U=+g[ga+(ea*244|0)+136>>2];if(!(O*O+P*P+U*U<1.4210854715202004e-14?(O=+g[ga+(fa*244|0)+128>>2],P=+g[ga+(fa*244|0)+132>>2],U=+g[ga+(fa*244|0)+136>>2],O*O+P*P+U*U<1.4210854715202004e-14):0))ia=5;if((ia|0)==5?(ia=0,ha=c[ba+780>>2]|0,(ha|0)>0):0){Z=0;h=ha;do{W=ba+4+(Z*192|0)|0;o=ba+4+(Z*192|0)+80|0;if(+g[o>>2]<=+g[ba+788>>2]){X=c[b+28>>2]|0;if((X|0)==(c[b+32>>2]|0)?(_=X|0?X<<1:1,(X|0)<(_|0)):0){if(!_){h=0;m=X}else{c[6995]=(c[6995]|0)+1;h=sc((_*152|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}m=c[b+28>>2]|0}if((m|0)>0){i=0;do{gi(h+(i*152|0)|0,(c[b+36>>2]|0)+(i*152|0)|0,152)|0;i=i+1|0}while((i|0)!=(m|0))}i=c[b+36>>2]|0;if(i|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=h;c[b+32>>2]=_;h=c[b+28>>2]|0}else h=X;c[b+28>>2]=h+1;V=c[b+36>>2]|0;c[V+(X*152|0)+144>>2]=ea;c[V+(X*152|0)+148>>2]=fa;c[V+(X*152|0)+132>>2]=W;y=+g[ba+4+(Z*192|0)+48>>2]-+g[ca+52>>2];z=+g[ba+4+(Z*192|0)+52>>2]-+g[ca+56>>2];x=+g[ba+4+(Z*192|0)+56>>2]-+g[ca+60>>2];g[ja+48>>2]=y;g[ja+48+4>>2]=z;g[ja+48+8>>2]=x;g[ja+48+12>>2]=0.0;F=+g[ba+4+(Z*192|0)+32>>2]-+g[da+52>>2];G=+g[ba+4+(Z*192|0)+36>>2]-+g[da+56>>2];B=+g[ba+4+(Z*192|0)+40>>2]-+g[da+60>>2];g[ja+32>>2]=F;g[ja+32+4>>2]=G;g[ja+32+8>>2]=B;g[ja+32+12>>2]=0.0;if(!(c[ga+(ea*244|0)+240>>2]|0)){j=0.0;n=0.0;s=0.0}else{U=+g[ga+(ea*244|0)+192>>2]+ +g[ga+(ea*244|0)+224>>2];s=+g[ga+(ea*244|0)+196>>2]+ +g[ga+(ea*244|0)+228>>2];n=+g[ga+(ea*244|0)+200>>2]+ +g[ga+(ea*244|0)+232>>2];j=+g[ga+(ea*244|0)+176>>2]+ +g[ga+(ea*244|0)+208>>2]+(s*x-n*z);n=+g[ga+(ea*244|0)+180>>2]+ +g[ga+(ea*244|0)+212>>2]+(n*y-U*x);s=+g[ga+(ea*244|0)+184>>2]+ +g[ga+(ea*244|0)+216>>2]+(U*z-s*y)}if(!(c[ga+(fa*244|0)+240>>2]|0)){k=0.0;r=0.0;t=0.0}else{U=+g[ga+(fa*244|0)+192>>2]+ +g[ga+(fa*244|0)+224>>2];t=+g[ga+(fa*244|0)+196>>2]+ +g[ga+(fa*244|0)+228>>2];r=+g[ga+(fa*244|0)+200>>2]+ +g[ga+(fa*244|0)+232>>2];k=+g[ga+(fa*244|0)+176>>2]+ +g[ga+(fa*244|0)+208>>2]+(t*B-r*G);r=+g[ga+(fa*244|0)+180>>2]+ +g[ga+(fa*244|0)+212>>2]+(r*F-U*B);t=+g[ga+(fa*244|0)+184>>2]+ +g[ga+(fa*244|0)+216>>2]+(U*G-t*F)}P=j-k;O=n-r;K=s-t;Q=ba+4+(Z*192|0)+64|0;L=+g[Q>>2];R=ba+4+(Z*192|0)+68|0;M=+g[R>>2];S=ba+4+(Z*192|0)+72|0;N=+g[S>>2];p=c[b+16>>2]|0;i=c[p+(ea*244|0)+240>>2]|0;m=c[p+(fa*244|0)+240>>2]|0;U=+g[f+28>>2];J=+g[f+12>>2];j=+g[f+40>>2];k=+g[f+36>>2];T=ba+4+(Z*192|0)+120|0;h=c[T>>2]|0;if(!(h&6))if(!(h&8))I=k;else{I=J*+g[ba+4+(Z*192|0)+144>>2];j=I+ +g[ba+4+(Z*192|0)+148>>2];j=j<1.1920928955078125e-07?1.1920928955078125e-07:j;I=I/j;j=1.0/j}else{j=(h&2|0)==0?j:+g[ba+4+(Z*192|0)+144>>2];if(!(h&4))I=k;else I=+g[ba+4+(Z*192|0)+148>>2]}H=1.0/J*j;if(i|0){j=((z*N-x*M)*+g[i+324>>2]+(x*L-N*y)*+g[i+328>>2]+(M*y-z*L)*+g[i+332>>2])*+g[i+604>>2];k=((z*N-x*M)*+g[i+340>>2]+(x*L-N*y)*+g[i+344>>2]+(M*y-z*L)*+g[i+348>>2])*+g[i+608>>2];n=((z*N-x*M)*+g[i+356>>2]+(x*L-N*y)*+g[i+360>>2]+(M*y-z*L)*+g[i+364>>2])*+g[i+612>>2]}else{j=0.0;k=0.0;n=0.0}g[V+(X*152|0)+64>>2]=j;g[V+(X*152|0)+68>>2]=k;g[V+(X*152|0)+72>>2]=n;g[V+(X*152|0)+76>>2]=0.0;u=+g[S>>2];v=+g[R>>2];w=+g[Q>>2];if(m|0){r=(+g[m+324>>2]*-(G*u-B*v)+ +g[m+328>>2]*-(B*w-u*F)+ +g[m+332>>2]*-(v*F-G*w))*+g[m+604>>2];s=(+g[m+340>>2]*-(G*u-B*v)+ +g[m+344>>2]*-(B*w-u*F)+ +g[m+348>>2]*-(v*F-G*w))*+g[m+608>>2];t=(+g[m+356>>2]*-(G*u-B*v)+ +g[m+360>>2]*-(B*w-u*F)+ +g[m+364>>2]*-(v*F-G*w))*+g[m+612>>2]}else{r=0.0;s=0.0;t=0.0}g[V+(X*152|0)+80>>2]=r;g[V+(X*152|0)+84>>2]=s;g[V+(X*152|0)+88>>2]=t;g[V+(X*152|0)+92>>2]=0.0;if(i|0)k=+g[i+404>>2]+((k*x-n*z)*+g[Q>>2]+(n*y-x*j)*+g[R>>2]+(z*j-k*y)*+g[S>>2]);else k=0.0;if(m|0){E=-r;j=-s;t=-t;j=+g[m+404>>2]+((B*j-G*t)*+g[Q>>2]+(F*t-B*E)*+g[R>>2]+(G*E-F*j)*+g[S>>2])}else j=0.0;g[V+(X*152|0)+108>>2]=U/(H+(k+j));if(i|0){c[V+(X*152|0)+16>>2]=c[Q>>2];c[V+(X*152|0)+16+4>>2]=c[Q+4>>2];c[V+(X*152|0)+16+8>>2]=c[Q+8>>2];c[V+(X*152|0)+16+12>>2]=c[Q+12>>2];g[V+(X*152|0)>>2]=z*N-x*M;g[V+(X*152|0)+4>>2]=x*L-N*y;g[V+(X*152|0)+8>>2]=M*y-z*L;g[V+(X*152|0)+12>>2]=0.0}else{c[V+(X*152|0)>>2]=0;c[V+(X*152|0)+4>>2]=0;c[V+(X*152|0)+8>>2]=0;c[V+(X*152|0)+12>>2]=0;c[V+(X*152|0)+16>>2]=0;c[V+(X*152|0)+20>>2]=0;c[V+(X*152|0)+24>>2]=0;c[V+(X*152|0)+28>>2]=0}if(m|0){t=-+g[R>>2];E=-+g[S>>2];g[V+(X*152|0)+48>>2]=-+g[Q>>2];g[V+(X*152|0)+52>>2]=t;g[V+(X*152|0)+56>>2]=E;g[V+(X*152|0)+60>>2]=0.0;g[V+(X*152|0)+32>>2]=-(G*u-B*v);g[V+(X*152|0)+36>>2]=-(B*w-u*F);g[V+(X*152|0)+40>>2]=-(v*F-G*w);g[V+(X*152|0)+44>>2]=0.0}else{c[V+(X*152|0)+32>>2]=0;c[V+(X*152|0)+32+4>>2]=0;c[V+(X*152|0)+32+8>>2]=0;c[V+(X*152|0)+32+12>>2]=0;c[V+(X*152|0)+32+16>>2]=0;c[V+(X*152|0)+32+20>>2]=0;c[V+(X*152|0)+32+24>>2]=0;c[V+(X*152|0)+32+28>>2]=0}E=+g[o>>2]+ +g[f+64>>2];if(i|0){r=+g[i+392>>2];s=+g[i+396>>2];w=+g[i+388>>2];t=r*x-s*z+ +g[i+372>>2];s=+g[i+376>>2]+(s*y-x*w);r=z*w-r*y+ +g[i+380>>2]}else{t=0.0;s=0.0;r=0.0}if(m|0){j=+g[m+392>>2];k=+g[m+396>>2];z=+g[m+388>>2];n=j*B-k*G+ +g[m+372>>2];k=+g[m+376>>2]+(k*F-B*z);j=G*z-j*F+ +g[m+380>>2]}else{n=0.0;k=0.0;j=0.0}B=(t-n)*+g[Q>>2]+(s-k)*+g[R>>2]+(r-j)*+g[S>>2];c[V+(X*152|0)+104>>2]=c[ba+4+(Z*192|0)+84>>2];h=+C(+B)<+g[f+96>>2];B=h?0.0:-(B*+g[ba+4+(Z*192|0)+96>>2]);B=B<=0.0?0.0:B;h=c[f+72>>2]|0;do if(!(h&4))g[V+(X*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+124>>2]*+g[f+68>>2];g[V+(X*152|0)+100>>2]=j;do if(i|0){if(!(c[p+(ea*244|0)+240>>2]|0))break;G=j*+g[V+(X*152|0)+20>>2]*+g[p+(ea*244|0)+132>>2]*+g[i+412>>2]*+g[p+(ea*244|0)+116>>2];F=j*+g[V+(X*152|0)+24>>2]*+g[p+(ea*244|0)+136>>2]*+g[i+416>>2]*+g[p+(ea*244|0)+120>>2];g[p+(ea*244|0)+64>>2]=+g[p+(ea*244|0)+112>>2]*j*+g[V+(X*152|0)+16>>2]*+g[p+(ea*244|0)+128>>2]*+g[i+408>>2]+ +g[p+(ea*244|0)+64>>2];g[p+(ea*244|0)+68>>2]=G+ +g[p+(ea*244|0)+68>>2];g[p+(ea*244|0)+72>>2]=F+ +g[p+(ea*244|0)+72>>2];F=j*+g[p+(ea*244|0)+100>>2]*+g[V+(X*152|0)+68>>2];G=j*+g[p+(ea*244|0)+104>>2]*+g[V+(X*152|0)+72>>2];g[p+(ea*244|0)+80>>2]=j*+g[p+(ea*244|0)+96>>2]*+g[V+(X*152|0)+64>>2]+ +g[p+(ea*244|0)+80>>2];g[p+(ea*244|0)+84>>2]=F+ +g[p+(ea*244|0)+84>>2];g[p+(ea*244|0)+88>>2]=G+ +g[p+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[V+(X*152|0)+100>>2];if(!(c[p+(fa*244|0)+240>>2]|0))break;G=+g[V+(X*152|0)+88>>2];F=+g[V+(X*152|0)+84>>2];z=+g[V+(X*152|0)+80>>2];x=j*+g[V+(X*152|0)+52>>2]*+g[p+(fa*244|0)+132>>2]*+g[m+412>>2]*+g[p+(fa*244|0)+116>>2];y=j*+g[V+(X*152|0)+56>>2]*+g[p+(fa*244|0)+136>>2]*+g[m+416>>2]*+g[p+(fa*244|0)+120>>2];g[p+(fa*244|0)+64>>2]=+g[p+(fa*244|0)+112>>2]*j*+g[V+(X*152|0)+48>>2]*+g[p+(fa*244|0)+128>>2]*+g[m+408>>2]+ +g[p+(fa*244|0)+64>>2];g[p+(fa*244|0)+68>>2]=x+ +g[p+(fa*244|0)+68>>2];g[p+(fa*244|0)+72>>2]=y+ +g[p+(fa*244|0)+72>>2];F=F*+g[p+(fa*244|0)+100>>2]*-j;G=G*+g[p+(fa*244|0)+104>>2]*-j;g[p+(fa*244|0)+80>>2]=+g[p+(fa*244|0)+80>>2]-z*+g[p+(fa*244|0)+96>>2]*-j;g[p+(fa*244|0)+84>>2]=+g[p+(fa*244|0)+84>>2]-F;g[p+(fa*244|0)+88>>2]=+g[p+(fa*244|0)+88>>2]-G}while(0);g[V+(X*152|0)+96>>2]=0.0;if(!(c[p+(ea*244|0)+240>>2]|0)){j=0.0;k=0.0;n=0.0;r=0.0;s=0.0;t=0.0}else{j=+g[p+(ea*244|0)+208>>2];k=+g[p+(ea*244|0)+212>>2];n=+g[p+(ea*244|0)+216>>2];r=+g[p+(ea*244|0)+224>>2];s=+g[p+(ea*244|0)+228>>2];t=+g[p+(ea*244|0)+232>>2]}if(!(c[p+(fa*244|0)+240>>2]|0)){u=0.0;v=0.0;w=0.0;x=0.0;y=0.0;z=0.0}else{u=+g[p+(fa*244|0)+208>>2];v=+g[p+(fa*244|0)+212>>2];w=+g[p+(fa*244|0)+216>>2];x=+g[p+(fa*244|0)+224>>2];y=+g[p+(fa*244|0)+228>>2];z=+g[p+(fa*244|0)+232>>2]}j=B-((j+ +g[p+(ea*244|0)+176>>2])*+g[V+(X*152|0)+16>>2]+(k+ +g[p+(ea*244|0)+180>>2])*+g[V+(X*152|0)+20>>2]+(n+ +g[p+(ea*244|0)+184>>2])*+g[V+(X*152|0)+24>>2]+((r+ +g[p+(ea*244|0)+192>>2])*+g[V+(X*152|0)>>2]+(s+ +g[p+(ea*244|0)+196>>2])*+g[V+(X*152|0)+4>>2]+(t+ +g[p+(ea*244|0)+200>>2])*+g[V+(X*152|0)+8>>2])+((u+ +g[p+(fa*244|0)+176>>2])*+g[V+(X*152|0)+48>>2]+(v+ +g[p+(fa*244|0)+180>>2])*+g[V+(X*152|0)+52>>2]+(w+ +g[p+(fa*244|0)+184>>2])*+g[V+(X*152|0)+56>>2]+((x+ +g[p+(fa*244|0)+192>>2])*+g[V+(X*152|0)+32>>2]+(y+ +g[p+(fa*244|0)+196>>2])*+g[V+(X*152|0)+36>>2]+(z+ +g[p+(fa*244|0)+200>>2])*+g[V+(X*152|0)+40>>2])));if(E>0.0){k=j-1.0/J*E;j=0.0}else{k=j;j=-(1.0/J*I*E)}J=+g[V+(X*152|0)+108>>2];I=j*J;G=k*J;m=(c[f+52>>2]|0)==0?1:E>+g[f+56>>2];g[V+(X*152|0)+112>>2]=m?I+G:G;g[V+(X*152|0)+128>>2]=m?0.0:I;g[V+(X*152|0)+116>>2]=H*J;g[V+(X*152|0)+120>>2]=0.0;g[V+(X*152|0)+124>>2]=1.0e10;c[V+(X*152|0)+140>>2]=c[b+68>>2];m=ba+4+(Z*192|0)+88|0;if(+g[m>>2]>0.0){Md(b,Q,ea,fa,X,+g[ba+4+(Z*192|0)+92>>2]);j=+g[S>>2];if(+C(+j)>.7071067690849304){I=+g[R>>2];H=1.0/+D(+(j*j+I*I));g[ja+16>>2]=0.0;g[$>>2]=-(H*j);g[aa>>2]=H*I;g[ja>>2]=(j*j+I*I)*H;J=+g[Q>>2];g[ja+4>>2]=-(H*I*J);u=J*-(H*j);k=0.0;n=-(H*j);r=H*I;s=(j*j+I*I)*H;j=-(H*I*J)}else{s=+g[Q>>2];I=+g[R>>2];J=1.0/+D(+(s*s+I*I));g[ja+16>>2]=-(I*J);g[$>>2]=J*s;g[aa>>2]=0.0;g[ja>>2]=-(J*s*j);g[ja+4>>2]=j*-(I*J);u=(s*s+I*I)*J;k=-(I*J);n=J*s;r=0.0;s=-(J*s*j);j=j*-(I*J)}t=1.0/+D(+(k*k+n*n+r*r));v=k*t;g[ja+16>>2]=v;w=n*t;g[$>>2]=w;t=r*t;g[aa>>2]=t;J=1.0/+D(+(s*s+j*j+u*u));n=s*J;g[ja>>2]=n;k=j*J;g[ja+4>>2]=k;j=u*J;g[ja+8>>2]=j;h=(c[ca+180>>2]&2|0)==0;if(h){r=v;s=w}else{y=+g[ca+4>>2];B=+g[ca+20>>2];F=+g[ca+36>>2];z=+g[ca+8>>2];E=+g[ca+24>>2];H=+g[ca+40>>2];r=+g[ca+12>>2];s=+g[ca+28>>2];J=+g[ca+44>>2];G=(y*v+B*w+F*t)*+g[ca+164>>2];I=(v*z+w*E+t*H)*+g[ca+168>>2];t=(v*r+w*s+t*J)*+g[ca+172>>2];g[ja+16>>2]=y*G+z*I+r*t;g[$>>2]=B*G+E*I+s*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=y*G+z*I+r*t;s=B*G+E*I+s*t;t=F*G+H*I+J*t}i=(c[da+180>>2]&2|0)==0;if(!i){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*r+z*s+F*t)*+g[da+164>>2];I=(r*x+s*B+t*H)*+g[da+168>>2];t=(r*y+s*E+t*J)*+g[da+172>>2];g[ja+16>>2]=w*G+x*I+y*t;g[$>>2]=z*G+B*I+E*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=w*G+x*I+y*t;s=z*G+B*I+E*t;t=F*G+H*I+J*t}if(!((ca|0)==0|h)){w=+g[ca+4>>2];z=+g[ca+20>>2];F=+g[ca+36>>2];x=+g[ca+8>>2];B=+g[ca+24>>2];H=+g[ca+40>>2];y=+g[ca+12>>2];E=+g[ca+28>>2];J=+g[ca+44>>2];G=(w*n+z*k+F*j)*+g[ca+164>>2];I=(n*x+k*B+j*H)*+g[ca+168>>2];j=(n*y+k*E+j*J)*+g[ca+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(!((da|0)==0|i)){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*n+z*k+F*j)*+g[da+164>>2];I=(n*x+k*B+j*H)*+g[da+168>>2];j=(n*y+k*E+j*J)*+g[da+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(+D(+(r*r+s*s+t*t))>.001)Md(b,ja+16|0,ea,fa,X,+g[m>>2]);if(+D(+(n*n+k*k+j*j))>.001)Md(b,ja,ea,fa,X,+g[m>>2]);h=c[f+72>>2]|0}do if(!(h&32))ia=82;else{if(!(c[T>>2]&1)){ia=82;break}h=ba+4+(Z*192|0)+152|0;ed(b,ba+4+(Z*192|0)+160|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+136>>2],+g[h>>2]);if(!(c[f+72>>2]&16))break;ed(b,ba+4+(Z*192|0)+176|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+140>>2],+g[h>>2])}while(0);do if((ia|0)==82){ia=0;j=+g[Q>>2];v=+g[R>>2];u=+g[S>>2];k=P-(P*L+O*M+K*N)*j;s=O-(P*L+O*M+K*N)*v;r=K-(P*L+O*M+K*N)*u;A=ba+4+(Z*192|0)+160|0;g[ba+4+(Z*192|0)+160>>2]=k;h=ba+4+(Z*192|0)+164|0;g[h>>2]=s;p=ba+4+(Z*192|0)+168|0;g[p>>2]=r;q=ba+4+(Z*192|0)+172|0;g[q>>2]=0.0;if((c[f+72>>2]&64|0)==0?k*k+s*s+r*r>1.1920928955078125e-07:0){j=1.0/+D(+(k*k+s*s+r*r));g[A>>2]=k*j;g[h>>2]=j*s;g[p>>2]=j*r;do if(!ca){n=k*j;k=j*s;j=j*r}else{if(!(c[ca+180>>2]&1)){n=k*j;k=j*s;j=j*r;break}G=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];H=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];n=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(G*k*j+I*j*s+j*r*L)*+g[ca+164>>2];O=(k*j*H+j*s*J+j*r*N)*+g[ca+168>>2];j=(k*j*n+j*s*K+j*r*P)*+g[ca+172>>2];g[A>>2]=G*M+H*O+n*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=G*M+H*O+n*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);if(!(c[f+72>>2]&16))break;O=+g[h>>2];n=+g[S>>2];L=+g[p>>2];M=+g[R>>2];P=+g[Q>>2];N=+g[A>>2];o=ba+4+(Z*192|0)+176|0;g[ba+4+(Z*192|0)+176>>2]=O*n-L*M;h=ba+4+(Z*192|0)+180|0;i=ba+4+(Z*192|0)+184|0;m=ba+4+(Z*192|0)+188|0;g[m>>2]=0.0;k=1.0/+D(+((O*n-L*M)*(O*n-L*M)+(L*P-n*N)*(L*P-n*N)+(M*N-O*P)*(M*N-O*P)));j=(O*n-L*M)*k;g[o>>2]=j;n=(L*P-n*N)*k;g[h>>2]=n;k=(M*N-O*P)*k;g[i>>2]=k;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*j+I*n+k*L)*+g[ca+164>>2];O=(j*G+n*J+k*N)*+g[ca+168>>2];k=(j*H+n*K+k*P)*+g[ca+172>>2];g[o>>2]=F*M+G*O+H*k;g[h>>2]=I*M+J*O+K*k;g[i>>2]=L*M+N*O+P*k;g[m>>2]=0.0;j=F*M+G*O+H*k;n=I*M+J*O+K*k;k=L*M+N*O+P*k}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*j+H*n+K*k)*+g[da+164>>2];N=(j*F+n*I+k*M)*+g[da+168>>2];P=(j*G+n*J+k*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[m>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);break}o=ba+4+(Z*192|0)+176|0;if(+C(+u)>.7071067690849304){P=1.0/+D(+(u*u+v*v));g[A>>2]=0.0;g[h>>2]=-(P*u);g[p>>2]=P*v;s=-(P*v*j);t=j*-(P*u);r=(u*u+v*v)*P;n=0.0;k=-(P*u);j=P*v}else{k=1.0/+D(+(j*j+v*v));g[A>>2]=-(v*k);g[h>>2]=k*j;g[p>>2]=0.0;s=u*-(v*k);t=(j*j+v*v)*k;r=-(k*j*u);n=-(v*k);k=k*j;j=0.0}g[o>>2]=r;m=ba+4+(Z*192|0)+180|0;g[m>>2]=s;i=ba+4+(Z*192|0)+184|0;g[i>>2]=t;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*n+I*k+L*j)*+g[ca+164>>2];O=(n*G+k*J+j*N)*+g[ca+168>>2];j=(n*H+k*K+j*P)*+g[ca+172>>2];g[A>>2]=F*M+G*O+H*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=F*M+G*O+H*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0;if(h&16){do if(ca|0){if(!(c[ca+180>>2]&1))break;E=+g[ca+4>>2];z=+g[o>>2];H=+g[ca+20>>2];B=+g[m>>2];K=+g[ca+36>>2];P=+g[i>>2];F=+g[ca+8>>2];I=+g[ca+24>>2];M=+g[ca+40>>2];G=+g[ca+12>>2];J=+g[ca+28>>2];O=+g[ca+44>>2];L=(E*z+H*B+K*P)*+g[ca+164>>2];N=(z*F+B*I+P*M)*+g[ca+168>>2];P=(z*G+B*J+P*O)*+g[ca+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];z=+g[o>>2];H=+g[da+20>>2];B=+g[m>>2];K=+g[da+36>>2];P=+g[i>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*z+H*B+K*P)*+g[da+164>>2];N=(z*F+B*I+P*M)*+g[da+168>>2];P=(z*G+B*J+P*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0}if((h&80|0)!=80)break;c[T>>2]=c[T>>2]|1}while(0);q=c[b+16>>2]|0;i=c[q+(ea*244|0)+240>>2]|0;m=c[q+(fa*244|0)+240>>2]|0;o=c[V+(X*152|0)+140>>2]|0;p=c[b+76>>2]|0;h=c[f+72>>2]|0;do if(!(h&4))g[p+(o*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+128>>2]*+g[f+68>>2];g[p+(o*152|0)+100>>2]=j;if(i|0){O=+g[i+404>>2];U=j*O*+g[p+(o*152|0)+20>>2]*+g[i+412>>2]*+g[q+(ea*244|0)+116>>2];P=j*O*+g[p+(o*152|0)+24>>2]*+g[i+416>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*j*O*+g[p+(o*152|0)+16>>2]*+g[i+408>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=j*+g[q+(ea*244|0)+100>>2]*+g[p+(o*152|0)+68>>2];U=j*+g[q+(ea*244|0)+104>>2]*+g[p+(o*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=j*+g[q+(ea*244|0)+96>>2]*+g[p+(o*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}if(!m)break;j=+g[m+404>>2];k=+g[p+(o*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+(o*152|0)+88>>2];P=+g[p+(o*152|0)+84>>2];O=+g[p+(o*152|0)+80>>2];M=k*j*+g[p+(o*152|0)+52>>2]*+g[m+412>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+(o*152|0)+56>>2]*+g[m+416>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+(o*152|0)+48>>2]*+g[m+408>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);do if(h&16|0){if(!(h&4)){g[p+((o+1|0)*152|0)+100>>2]=0.0;break}k=+g[ba+4+(Z*192|0)+132>>2]*+g[f+68>>2];g[p+((o+1|0)*152|0)+100>>2]=k;do if(i|0){j=+g[i+404>>2];if(!(c[q+(ea*244|0)+240>>2]|0))break;U=k*j*+g[p+((o+1|0)*152|0)+20>>2]*+g[q+(ea*244|0)+116>>2];P=k*j*+g[p+((o+1|0)*152|0)+24>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+16>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=k*+g[q+(ea*244|0)+100>>2]*+g[p+((o+1|0)*152|0)+68>>2];U=k*+g[q+(ea*244|0)+104>>2]*+g[p+((o+1|0)*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=k*+g[q+(ea*244|0)+96>>2]*+g[p+((o+1|0)*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[m+404>>2];k=+g[p+((o+1|0)*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+((o+1|0)*152|0)+88>>2];P=+g[p+((o+1|0)*152|0)+84>>2];O=+g[p+((o+1|0)*152|0)+80>>2];M=k*j*+g[p+((o+1|0)*152|0)+52>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+((o+1|0)*152|0)+56>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+48>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);h=c[ba+780>>2]|0}Z=Z+1|0}while((Z|0)<(h|0))}Y=Y+1|0}while((Y|0)!=(e|0));l=ja;return}function lc(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=l;l=l+80|0;bf(b,e,f)|0;a[A+16>>0]=1;c[A+12>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;a[A+36>>0]=1;c[A+32>>2]=0;c[A+24>>2]=0;c[A+28>>2]=0;a[A+56>>0]=1;c[A+52>>2]=0;c[A+44>>2]=0;c[A+48>>2]=0;a[A+76>>0]=1;c[A+72>>2]=0;c[A+64>>2]=0;c[A+68>>2]=0;y=c[b+932>>2]|0;c[e+300>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+928|0)|0;c[e+268>>2]=y;if(y|0){i=c[e+300>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;if((i|0)>0){g=c[m+8>>2]|0;h=0;while(1){j=c[(c[b+940>>2]|0)+(h<<2)>>2]|0;if(!j)k=0;else k=zb[c[(c[f>>2]|0)+28>>2]&31](f,j)|0;c[g>>2]=k;if(!(zb[c[(c[f>>2]|0)+24>>2]&31](f,j)|0)){y=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,1)|0;t=c[y+8>>2]|0;c[t+12>>2]=c[j+16>>2];c[t+4>>2]=c[j+8>>2];c[t>>2]=c[j+4>>2];c[t+8>>2]=c[j+12>>2];Zb[c[(c[f>>2]|0)+20>>2]&31](f,y,11010,1414349395,j)}h=h+1|0;if((h|0)>=(i|0)){g=f;break}else g=g+4|0}}else g=f;Zb[c[(c[g>>2]|0)+20>>2]&31](f,m,11010,1497453121,b+928|0)}}else c[e+268>>2]=0;y=c[b+772>>2]|0;c[e+304>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+768|0)|0;c[e+272>>2]=y;if(y|0){s=c[e+304>>2]|0;t=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,s)|0;if((s|0)>0){q=0;r=c[t+8>>2]|0;while(1){h=c[b+780>>2]|0;c[r+52>>2]=c[h+(q*104|0)+56>>2];c[r+56>>2]=c[h+(q*104|0)+60>>2];c[r+60>>2]=c[h+(q*104|0)+64>>2];c[r+64>>2]=c[h+(q*104|0)+68>>2];c[r+88>>2]=c[h+(q*104|0)+92>>2];c[r+92>>2]=(a[h+(q*104|0)+100>>0]<<7&255)<<24>>24>>7<<24>>24;c[r+84>>2]=c[h+(q*104|0)+88>>2];g=c[h+(q*104|0)+4>>2]|0;if(!g){i=0;g=h}else{i=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;g=c[b+780>>2]|0}c[r>>2]=i;c[r+68>>2]=c[g+(q*104|0)+72>>2];c[r+72>>2]=c[g+(q*104|0)+76>>2];c[r+76>>2]=c[g+(q*104|0)+80>>2];c[r+80>>2]=c[g+(q*104|0)+84>>2];c[r+4>>2]=c[g+(q*104|0)+8>>2];c[r+8>>2]=c[g+(q*104|0)+12>>2];c[r+12>>2]=c[g+(q*104|0)+16>>2];c[r+16>>2]=c[g+(q*104|0)+20>>2];c[r+20>>2]=c[g+(q*104|0)+24>>2];c[r+24>>2]=c[g+(q*104|0)+28>>2];c[r+28>>2]=c[g+(q*104|0)+32>>2];c[r+32>>2]=c[g+(q*104|0)+36>>2];c[r+36>>2]=c[g+(q*104|0)+40>>2];c[r+40>>2]=c[g+(q*104|0)+44>>2];c[r+44>>2]=c[g+(q*104|0)+48>>2];c[r+48>>2]=c[g+(q*104|0)+52>>2];m=(c[b+780>>2]|0)+(q*104|0)|0;p=((m+~(m<<15)|0)>>>10^m+~(m<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);n=c[A+48>>2]|0;a:do if((p&n+-1)>>>0<(c[A+4>>2]|0)>>>0?(u=c[(c[A+12>>2]|0)+((p&n+-1)<<2)>>2]|0,(u|0)!=-1):0){h=c[A+72>>2]|0;i=c[A+32>>2]|0;g=u;while(1){if((m|0)==(c[h+(g<<3)>>2]|0))break;g=c[i+(g<<2)>>2]|0;if((g|0)==-1){z=27;break a}}h=q;i=c[A+52>>2]|0}else z=27;while(0);if((z|0)==27){z=0;h=c[A+44>>2]|0;if((h|0)==(n|0)){g=n|0?n<<1:1;if((n|0)<(g|0)){if((g|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((g<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;k=v+4+15&-16}else k=0;j=c[A+52>>2]|0;if((n|0)<=0)if(!j)i=n;else z=35;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(n|0));z=35}if((z|0)==35){z=0;if(a[A+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[A+52>>2]=0;i=c[A+44>>2]|0}a[A+56>>0]=1;c[A+52>>2]=k;c[A+48>>2]=g}else{g=n;i=n}}else{g=n;i=h}c[(c[A+52>>2]|0)+(i<<2)>>2]=q;c[A+44>>2]=i+1;i=c[A+64>>2]|0;if((i|0)==(c[A+68>>2]|0)?(w=i|0?i<<1:1,(i|0)<(w|0)):0){if((w|0)!=0?(c[6995]=(c[6995]|0)+1,x=sc((w<<3|3)+16|0)|0,(x|0)!=0):0){c[(x+4+15&-16)+-4>>2]=x;j=x+4+15&-16}else j=0;if((i|0)>0){g=0;do{k=(c[A+72>>2]|0)+(g<<3)|0;o=c[k+4>>2]|0;y=j+(g<<3)|0;c[y>>2]=c[k>>2];c[y+4>>2]=o;g=g+1|0}while((g|0)!=(i|0))}g=c[A+72>>2]|0;if(g|0){if(a[A+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[A+72>>2]=0}a[A+76>>0]=1;c[A+72>>2]=j;c[A+68>>2]=w;i=c[A+64>>2]|0;g=c[A+48>>2]|0}c[(c[A+72>>2]|0)+(i<<3)>>2]=m;c[A+64>>2]=i+1;if((n|0)<(g|0)){o=c[A+4>>2]|0;do if((o|0)<(g|0)){if((c[A+8>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((g<<2|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+12>>2]|0;if((o|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(o|0));if(a[A+16>>0]|0)z=62}else if(!((k|0)==0|(a[A+16>>0]|0)==0))z=62;if((z|0)==62){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+16>>0]=1;c[A+12>>2]=i;c[A+8>>2]=g}else i=c[A+12>>2]|0;n=g<<2;Yk(i+(o<<2)|0,0,n-(o<<2)|0)|0;c[A+4>>2]=g;m=c[A+24>>2]|0;if((m|0)<(g|0)){if((c[A+28>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((n|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+32>>2]|0;if((m|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(m|0));if(a[A+36>>0]|0)z=74}else if(!((k|0)==0|(a[A+36>>0]|0)==0))z=74;if((z|0)==74){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+36>>0]=1;c[A+32>>2]=i;c[A+28>>2]=g}else i=c[A+32>>2]|0;Yk(i+(m<<2)|0,0,n-(m<<2)|0)|0}c[A+24>>2]=g;if((g|0)>0){Yk(c[A+12>>2]|0,-1,n|0)|0;Yk(c[A+32>>2]|0,-1,n|0)|0}if((o|0)<=0){g=c[A+48>>2]|0;break}j=c[A+72>>2]|0;k=c[A+12>>2]|0;m=c[A+32>>2]|0;g=c[A+48>>2]|0;i=0;do{y=c[j+(i<<3)>>2]|0;y=((y+~(y<<15)|0)>>>10^y+~(y<<15))*9|0;y=k+(((((y>>>6^y)+~((y>>>6^y)<<11)|0)>>>16^(y>>>6^y)+~((y>>>6^y)<<11))&g+-1)<<2)|0;c[m+(i<<2)>>2]=c[y>>2];c[y>>2]=i;i=i+1|0}while((i|0)!=(o|0))}while(0);g=p&g+-1}else g=p&n+-1;i=c[A+12>>2]|0;c[(c[A+32>>2]|0)+(h<<2)>>2]=c[i+(g<<2)>>2]}c[i+(g<<2)>>2]=h;q=q+1|0;if((q|0)>=(s|0))break;else r=r+100|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,t,11031,1145979475,b+768|0)}}else c[e+272>>2]=0;y=c[b+792>>2]|0;c[e+308>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+800>>2]|0)|0;c[e+276>>2]=y;if(y|0){m=c[e+308>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,m)|0;if((m|0)>0){i=c[b+800>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j+16>>2]=(a[i+(k*52|0)+36>>0]<<7&255)<<24>>24>>7<<24>>24;h=c[i+(k*52|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+800>>2]|0;g=i}c[j>>2]=h;h=c[i+(k*52|0)+24>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+4>>2]=h;h=c[i+(k*52|0)+28>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+8>>2]=h;c[j+12>>2]=c[i+(k*52|0)+32>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+20|0}}else g=c[b+800>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11048,1497453121,g)}}else c[e+276>>2]=0;y=c[b+812>>2]|0;c[e+312>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+820>>2]|0)|0;c[e+280>>2]=y;if(y|0){m=c[e+312>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,36,m)|0;if((m|0)>0){i=c[b+820>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){h=c[i+(k*44|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+820>>2]|0;g=i}c[j+16>>2]=h;c[j>>2]=c[i+(k*44|0)+20>>2];c[j+4>>2]=c[i+(k*44|0)+24>>2];c[j+8>>2]=c[i+(k*44|0)+28>>2];c[j+12>>2]=c[i+(k*44|0)+32>>2];h=c[i+(k*44|0)+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+20>>2]=h;h=c[i+(k*44|0)+12>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+24>>2]=h;h=c[i+(k*44|0)+16>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+28>>2]=h;c[j+32>>2]=c[i+(k*44|0)+36>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+36|0}}else g=c[b+820>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11065,1497453121,g)}}else c[e+280>>2]=0;y=c[b+832>>2]|0;c[e+316>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+840>>2]|0)|0;c[e+284>>2]=y;if(y|0){m=c[e+316>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,m)|0;if((m|0)>0){i=c[b+840>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j>>2]=c[i+(k*104|0)+32>>2];c[j+4>>2]=c[i+(k*104|0)+36>>2];c[j+8>>2]=c[i+(k*104|0)+40>>2];c[j+12>>2]=c[i+(k*104|0)+44>>2];h=c[i+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+68>>2]=h;c[j+16>>2]=c[i+(k*104|0)+48>>2];c[j+20>>2]=c[i+(k*104|0)+52>>2];c[j+24>>2]=c[i+(k*104|0)+56>>2];c[j+28>>2]=c[i+(k*104|0)+60>>2];h=c[i+116>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+72>>2]=h;c[j+32>>2]=c[i+(k*104|0)+64>>2];c[j+36>>2]=c[i+(k*104|0)+68>>2];c[j+40>>2]=c[i+(k*104|0)+72>>2];c[j+44>>2]=c[i+(k*104|0)+76>>2];h=c[i+224>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+76>>2]=h;c[j+48>>2]=c[i+(k*104|0)+80>>2];c[j+52>>2]=c[i+(k*104|0)+84>>2];c[j+56>>2]=c[i+(k*104|0)+88>>2];c[j+60>>2]=c[i+(k*104|0)+92>>2];h=c[i+332>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+80>>2]=h;c[j+88>>2]=c[i+(k*104|0)+96>>2];c[j+92>>2]=c[i+(k*104|0)+100>>2];h=c[i+(k*104|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+840>>2]|0;g=i}c[j+64>>2]=h;c[j+84>>2]=c[i+(k*104|0)+24>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+100|0}}else g=c[b+840>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11082,1497453121,g)}}else c[e+284>>2]=0;y=c[b+852>>2]|0;c[e+320>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+860>>2]|0)|0;c[e+288>>2]=y;if(!y)y=f;else{k=c[e+320>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,92,k)|0;if((k|0)>0){i=c[m+8>>2]|0;j=0;while(1){h=c[b+860>>2]|0;c[i>>2]=c[h+(j*96|0)+28>>2];c[i+4>>2]=c[h+(j*96|0)+32>>2];c[i+8>>2]=c[h+(j*96|0)+36>>2];c[i+12>>2]=c[h+(j*96|0)+40>>2];c[i+16>>2]=c[h+(j*96|0)+44>>2];c[i+20>>2]=c[h+(j*96|0)+48>>2];c[i+24>>2]=c[h+(j*96|0)+52>>2];c[i+28>>2]=c[h+(j*96|0)+56>>2];c[i+32>>2]=c[h+(j*96|0)+60>>2];c[i+36>>2]=c[h+(j*96|0)+64>>2];c[i+40>>2]=c[h+(j*96|0)+68>>2];c[i+44>>2]=c[h+(j*96|0)+72>>2];c[i+48>>2]=c[h+(j*96|0)+76>>2];c[i+52>>2]=c[h+(j*96|0)+80>>2];c[i+56>>2]=c[h+(j*96|0)+84>>2];c[i+60>>2]=c[h+(j*96|0)+88>>2];c[i+88>>2]=c[h+(j*96|0)+92>>2];h=c[b+860>>2]|0;c[i+64>>2]=c[h+(j*96|0)+4>>2];c[i+68>>2]=c[h+(j*96|0)+8>>2];c[i+72>>2]=c[h+(j*96|0)+12>>2];c[i+76>>2]=c[h+(j*96|0)+16>>2];g=c[h+(j*96|0)>>2]|0;if(!g)g=-1;else g=(g-(c[b+780>>2]|0)|0)/104|0;c[i+84>>2]=g;g=c[h+(j*96|0)+20>>2]|0;if(!g)g=0;else g=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;c[i+80>>2]=g;j=j+1|0;if((j|0)>=(k|0))break;else i=i+92|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,m,11100,1497453121,c[b+860>>2]|0);y=f}}else{c[e+288>>2]=0;y=f}c[e+360>>2]=c[b+376>>2];c[e+336>>2]=c[b+352>>2];c[e+352>>2]=c[b+368>>2];c[e+332>>2]=c[b+348>>2];c[e+348>>2]=c[b+364>>2];c[e+344>>2]=c[b+360>>2];c[e+420>>2]=c[b+436>>2];c[e+424>>2]=c[b+440>>2];c[e+428>>2]=c[b+444>>2];c[e+416>>2]=c[b+432>>2];n=c[b+424>>2]|0;c[e+340>>2]=c[b+356>>2];c[e+364>>2]=c[b+380>>2];c[e+432>>2]=c[b+448>>2];c[e+356>>2]=c[b+372>>2];c[e+368>>2]=c[b+384>>2];c[e+372>>2]=c[b+388>>2];c[e+376>>2]=c[b+392>>2];c[e+380>>2]=c[b+396>>2];c[e+412>>2]=c[b+428>>2];c[e+408>>2]=n;c[e+384>>2]=c[b+400>>2];c[e+388>>2]=c[b+404>>2];c[e+392>>2]=c[b+408>>2];c[e+396>>2]=c[b+412>>2];c[e+400>>2]=c[b+416>>2];c[e+404>>2]=c[b+420>>2];c[e+264>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,b+532|0)|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,192,1)|0;m=c[n+8>>2]|0;c[m+96>>2]=c[b+692>>2];c[m+100>>2]=c[b+696>>2];c[m+104>>2]=c[b+700>>2];c[m+108>>2]=c[b+704>>2];c[m+112>>2]=c[b+708>>2];c[m+116>>2]=c[b+712>>2];c[m+120>>2]=c[b+716>>2];c[m+124>>2]=c[b+720>>2];c[m+128>>2]=c[b+724>>2];c[m+132>>2]=c[b+728>>2];c[m+136>>2]=c[b+732>>2];c[m+140>>2]=c[b+736>>2];c[m+180>>2]=d[b+533>>0];c[m+176>>2]=d[b+532>>0];c[m+144>>2]=c[b+580>>2];c[m+148>>2]=c[b+584>>2];c[m+152>>2]=c[b+588>>2];c[m+156>>2]=c[b+592>>2];x=c[b+544>>2]|0;c[m+168>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+552>>2]|0)|0;j=c[m+168>>2]|0;c[m+160>>2]=x;if(j|0){k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[b+552>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h>>2]=c[g+(i<<4)>>2];c[h+4>>2]=c[g+(i<<4)+4>>2];c[h+8>>2]=c[g+(i<<4)+8>>2];c[h+12>>2]=c[g+(i<<4)+12>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[b+552>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,19202,1497453121,g)}}else c[m+160>>2]=0;c[m+184>>2]=c[b+536>>2];c[m>>2]=c[b+596>>2];c[m+4>>2]=c[b+600>>2];c[m+8>>2]=c[b+604>>2];c[m+12>>2]=c[b+608>>2];c[m+16>>2]=c[b+612>>2];c[m+20>>2]=c[b+616>>2];c[m+24>>2]=c[b+620>>2];c[m+28>>2]=c[b+624>>2];c[m+32>>2]=c[b+628>>2];c[m+36>>2]=c[b+632>>2];c[m+40>>2]=c[b+636>>2];c[m+44>>2]=c[b+640>>2];c[m+48>>2]=c[b+644>>2];c[m+52>>2]=c[b+648>>2];c[m+56>>2]=c[b+652>>2];c[m+60>>2]=c[b+656>>2];c[m+64>>2]=c[b+660>>2];c[m+68>>2]=c[b+664>>2];c[m+72>>2]=c[b+668>>2];c[m+76>>2]=c[b+672>>2];c[m+80>>2]=c[b+676>>2];c[m+84>>2]=c[b+680>>2];c[m+88>>2]=c[b+684>>2];c[m+92>>2]=c[b+688>>2];x=c[b+564>>2]|0;c[m+172>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+572>>2]|0)|0;j=c[m+172>>2]|0;c[m+164>>2]=x;if(!j)z=147;else{k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[b+572>>2]|0;h=0;i=c[k+8>>2]|0;while(1){c[i>>2]=c[g+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[b+572>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,11120,1497453121,g);x=f}}else{c[m+164>>2]=0;z=147}if((z|0)==147)x=f;Zb[c[(c[x>>2]|0)+20>>2]&31](f,n,11126,1497453121,b+532|0);z=c[b+1112>>2]|0;c[e+324>>2]=z;if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[c[b+1120>>2]>>2]|0)|0;v=c[e+324>>2]|0;c[e+292>>2]=z;if(v|0){w=Bb[c[(c[f>>2]|0)+16>>2]&63](f,348,v)|0;if((v|0)>0){t=0;u=c[w+8>>2]|0;while(1){h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;z=u+320|0;c[z>>2]=c[h+360>>2];c[u+256>>2]=c[h+332>>2];c[u+260>>2]=c[h+336>>2];c[u+264>>2]=c[h+340>>2];c[u+268>>2]=c[h+344>>2];c[u+344>>2]=c[h+380>>2];c[u+340>>2]=d[h+377>>0];c[u+160>>2]=c[h+228>>2];c[u+164>>2]=c[h+232>>2];c[u+168>>2]=c[h+236>>2];c[u+172>>2]=c[h+240>>2];c[u+336>>2]=d[h+376>>0];c[u+208>>2]=c[h+276>>2];c[u+212>>2]=c[h+280>>2];c[u+216>>2]=c[h+284>>2];c[u+220>>2]=c[h+288>>2];c[u+224>>2]=c[h+292>>2];c[u+228>>2]=c[h+296>>2];c[u+232>>2]=c[h+300>>2];c[u+236>>2]=c[h+304>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u>>2]=c[h+60>>2];c[u+4>>2]=c[h+64>>2];c[u+8>>2]=c[h+68>>2];c[u+12>>2]=c[h+72>>2];c[u+16>>2]=c[h+76>>2];c[u+20>>2]=c[h+80>>2];c[u+24>>2]=c[h+84>>2];c[u+28>>2]=c[h+88>>2];c[u+32>>2]=c[h+92>>2];c[u+36>>2]=c[h+96>>2];c[u+40>>2]=c[h+100>>2];c[u+44>>2]=c[h+104>>2];c[u+48>>2]=c[h+108>>2];c[u+52>>2]=c[h+112>>2];c[u+56>>2]=c[h+116>>2];c[u+60>>2]=c[h+120>>2];c[u+296>>2]=c[h+124>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+300>>2]=c[h+128>>2];c[u+112>>2]=c[h+180>>2];c[u+116>>2]=c[h+184>>2];c[u+120>>2]=c[h+188>>2];c[u+124>>2]=c[h+192>>2];c[u+128>>2]=c[h+196>>2];c[u+132>>2]=c[h+200>>2];c[u+136>>2]=c[h+204>>2];c[u+140>>2]=c[h+208>>2];c[u+144>>2]=c[h+212>>2];c[u+148>>2]=c[h+216>>2];c[u+152>>2]=c[h+220>>2];c[u+156>>2]=c[h+224>>2];g=u+316|0;c[g>>2]=c[h+356>>2];c[u+64>>2]=c[h+132>>2];c[u+68>>2]=c[h+136>>2];c[u+72>>2]=c[h+140>>2];c[u+76>>2]=c[h+144>>2];c[u+80>>2]=c[h+148>>2];c[u+84>>2]=c[h+152>>2];c[u+88>>2]=c[h+156>>2];c[u+92>>2]=c[h+160>>2];c[u+96>>2]=c[h+164>>2];c[u+100>>2]=c[h+168>>2];c[u+104>>2]=c[h+172>>2];c[u+108>>2]=c[h+176>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+240>>2]=c[h+316>>2];c[u+244>>2]=c[h+320>>2];c[u+248>>2]=c[h+324>>2];c[u+252>>2]=c[h+328>>2];c[u+324>>2]=c[h+364>>2];c[u+328>>2]=c[h+368>>2];c[u+312>>2]=c[h+352>>2];c[g>>2]=c[h+356>>2];c[z>>2]=c[h+360>>2];c[u+332>>2]=c[h+372>>2];z=c[h+44>>2]|0;g=u+284|0;c[g>>2]=z;n=u+292|0;c[n>>2]=c[h+4>>2];o=u+288|0;c[o>>2]=c[h+24>>2];c[u+304>>2]=c[h+308>>2];c[u+176>>2]=c[h+244>>2];c[u+180>>2]=c[h+248>>2];c[u+184>>2]=c[h+252>>2];c[u+188>>2]=c[h+256>>2];c[u+192>>2]=c[h+260>>2];c[u+196>>2]=c[h+264>>2];c[u+200>>2]=c[h+268>>2];c[u+204>>2]=c[h+272>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+308>>2]=c[h+312>>2];if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[h+52>>2]|0)|0;c[u+272>>2]=z;if(z|0){j=c[g>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+52>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<4)>>2];c[i+4>>2]=c[k+(h<<4)+4>>2];c[i+8>>2]=c[k+(h<<4)+8>>2];c[i+12>>2]=c[k+(h<<4)+12>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+16|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,19202,1497453121,c[g+52>>2]|0)}}else c[u+272>>2]=0;if(c[n>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+12>>2]|0)|0;c[u+280>>2]=z;if(z|0){j=c[n>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+12>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11120,1497453121,c[g+12>>2]|0)}}else c[u+280>>2]=0;if(c[o>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+20|0)|0;c[u+276>>2]=z;if(z|0){m=c[n>>2]|0;s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,m)|0;if((m|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;n=c[g+32>>2]|0;o=c[A+12>>2]|0;p=c[A+72>>2]|0;q=c[A+52>>2]|0;r=c[A+32>>2]|0;j=0;k=c[s+8>>2]|0;while(1){i=c[n+(j<<2)>>2]|0;h=((i+~(i<<15)|0)>>>10^i+~(i<<15))*9|0;h=c[o+(((((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11))&(c[A+48>>2]|0)+-1)<<2)>>2]|0;if((i|0)!=(c[p+(h<<3)>>2]|0))do h=c[r+(h<<2)>>2]|0;while((i|0)!=(c[p+(h<<3)>>2]|0));c[k>>2]=c[q+(h<<2)>>2];j=j+1|0;if((j|0)==(m|0))break;else k=k+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,s,11163,1497453121,g+20|0)}}else c[u+276>>2]=0;t=t+1|0;if((t|0)>=(v|0))break;else u=u+348|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,w,11143,1497453121,c[c[b+1120>>2]>>2]|0)}}else c[e+292>>2]=0;z=c[b+912>>2]|0;c[e+328>>2]=z;if(!z){c[e+296>>2]=0;kj(A);l=A;return 11187}z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+920>>2]|0)|0;c[e+296>>2]=z;if(!z){kj(A);l=A;return 11187}k=c[b+912>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,104,k)|0;if((k|0)>0){i=0;j=c[m+8>>2]|0;while(1){g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;c[j+96>>2]=xb[c[(c[g>>2]|0)+20>>2]&127](g)|0;g=(c[b+920>>2]|0)+(i<<2)|0;h=c[g>>2]|0;c[j+8>>2]=c[h+28>>2];c[j+12>>2]=c[h+32>>2];c[j+16>>2]=c[h+36>>2];c[j+20>>2]=c[h+40>>2];c[j+24>>2]=c[h+44>>2];c[j+28>>2]=c[h+48>>2];c[j+32>>2]=c[h+52>>2];c[j+36>>2]=c[h+56>>2];c[j+40>>2]=c[h+60>>2];c[j+44>>2]=c[h+64>>2];c[j+48>>2]=c[h+68>>2];c[j+52>>2]=d[h+152>>0];h=j+56|0;c[j>>2]=0;n=j+4|0;c[n>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;c[h+28>>2]=0;g=c[g>>2]|0;h=c[g+4>>2]|0;if(h){c[j+88>>2]=1;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}if(c[g+12>>2]|0){c[j+88>>2]=3;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+920>>2]|0)+(i<<2)>>2]|0)+12>>2]|0)|0}g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;h=c[g+8>>2]|0;if(h){c[j+88>>2]=2;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+16>>2]|0;if(h){c[j+92>>2]=1;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+24>>2]|0;if(h){c[j+92>>2]=3;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}g=c[g+20>>2]|0;if(g|0){c[j+92>>2]=2;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,g)|0}i=i+1|0;if((i|0)>=(k|0))break;else j=j+104|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11167,1497453121,c[b+920>>2]|0);kj(A);l=A;return 11187}function mc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;K=l;l=l+144|0;switch(d-b|0){case 0:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;l=K;return}case 2:{m=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;b=c[m+88>>2]|0;d=c[m+200>>2]|0;g=c[m+92>>2]|0;f=c[m+204>>2]|0;if((b|0)==(d|0)&(g|0)==(f|0))if((c[m+96>>2]|0)==(c[m+208>>2]|0)){c[m+8>>2]=0;c[m>>2]=m;c[m+4>>2]=m;c[e>>2]=m;c[e+4>>2]=m;c[e+8>>2]=m;c[e+12>>2]=m;l=K;return}else f=g;f=g-f|0;if(!(f|b-d)){h=(c[m+96>>2]|0)>(c[m+208>>2]|0);f=h?m+112|0:m;c[f>>2]=f;c[f+4>>2]=f;g=f;h=h?m:m+112|0;i=f;j=f;k=f}else{c[m>>2]=m+112;c[m+4>>2]=m+112;c[m+112>>2]=m;c[m+116>>2]=m;j=(b-d|0)<0|(b-d|0)==0&(f|0)<0;g=m;h=m+112|0;i=j?m+112|0:m;j=j?m:m+112|0;k=(f|0)<0|(b-d|0)<0&(f|0)==0?m:m+112|0;f=(f|0)<0|(b-d|0)<0&(f|0)==0?m+112|0:m}c[e>>2]=j;c[e+4>>2]=i;c[e+8>>2]=k;c[e+12>>2]=f;a=hg(a,g,h)|0;c[a>>2]=a;c[a+4>>2]=a;c[g+8>>2]=a;a=c[a+8>>2]|0;c[a>>2]=a;c[a+4>>2]=a;c[h+8>>2]=a;l=K;return}case 1:{a=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;c[a+8>>2]=0;c[a>>2]=a;c[a+4>>2]=a;c[e>>2]=a;c[e+4>>2]=a;c[e+8>>2]=a;c[e+12>>2]=a;l=K;return}default:{n=((d-b|0)/2|0)+b|0;m=c[a+92>>2]|0;k=c[m+(n+-1<<2)>>2]|0;i=c[k+88>>2]|0;j=c[k+92>>2]|0;k=c[k+96>>2]|0;a:do if((n|0)<(d|0)){f=n;do{g=c[m+(f<<2)>>2]|0;if((c[g+88>>2]|0)!=(i|0))break a;if((c[g+92>>2]|0)!=(j|0))break a;if((c[g+96>>2]|0)!=(k|0))break a;f=f+1|0}while((f|0)<(d|0))}else f=n;while(0);mc(a,b,n,e);c[K+96>>2]=0;c[K+96+4>>2]=0;c[K+96+8>>2]=0;c[K+96+12>>2]=0;mc(a,f,d,K+96|0);k=c[K+96+4>>2]|0;b:do if(k|0){B=c[e+4>>2]|0;if(!B){c[e>>2]=c[K+96>>2];c[e+4>>2]=c[K+96+4>>2];c[e+8>>2]=c[K+96+8>>2];c[e+12>>2]=c[K+96+12>>2];break}c[a+100>>2]=(c[a+100>>2]|0)+-1;i=c[e+12>>2]|0;j=c[K+96+8>>2]|0;g=c[i+88>>2]|0;do if((g|0)==(c[j+88>>2]|0)?(h=c[i+92>>2]|0,(h|0)==(c[j+92>>2]|0)):0){f=c[j+4>>2]|0;if((f|0)==(j|0)){f=c[j+8>>2]|0;if(!f)f=g;else{h=c[f+12>>2]|0;j=h;f=c[h+88>>2]|0;h=c[h+92>>2]|0}b=j;n=f+1|0;g=i;o=c[j+96>>2]|0;break}i=c[j>>2]|0;c[f>>2]=i;c[i+4>>2]=f;if((j|0)==(c[K+96>>2]|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)<(h|0))g=i;else{if((g|0)==(h|0)?(c[i+92>>2]|0)<(c[f+92>>2]|0):0){g=i;break}g=f}while(0);c[K+96>>2]=g}if((j|0)==(k|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)>(h|0))f=i;else if((g|0)==(h|0)?(c[i+92>>2]|0)>(c[f+92>>2]|0):0){f=i;break}while(0);c[K+96+4>>2]=f;H=36}else{f=k;H=36}}else{f=k;H=36}while(0);if((H|0)==36){y=c[e>>2]|0;z=c[K+96>>2]|0;d=B;h=0;j=0;w=1;x=0;o=f;while(1){m=c[o+88>>2]|0;n=c[d+88>>2]|0;i=P(m-n|0,w)|0;c:do if((i|0)<=0){if((i|0)<0){v=(x|0)!=0;k=d;g=o;b=c[d+92>>2]|0;u=c[o+92>>2]|0;while(1){r=c[(v?g+4|0:g)>>2]|0;s=(r|0)==(g|0);t=g+88|0;while(1){d=k+88|0;p=u-b|0;if(!s?(C=c[r+88>>2]|0,D=P(C-m|0,w)|0,E=c[r+92>>2]|0,F=E-u|0,(F|0)>-1):0){if(!D)break;if((D|0)<0?(P(F,i)|0)<=(P(D,p)|0):0)break}q=c[(v?k+4|0:k)>>2]|0;if((q|0)==(k|0))break c;G=c[q+88>>2]|0;n=P(G-(c[d>>2]|0)|0,w)|0;o=c[q+92>>2]|0;d=o-b|0;m=c[t>>2]|0;b=i;i=P(m-G|0,w)|0;if(!((d|0)>0&(i|0)<0))break c;if(!n){k=q;b=o;continue}if((n|0)>=0)break c;if((P(d,b)|0)>=(P(n,p)|0))break c;else{k=q;b=o}}g=r;i=P(C-(c[d>>2]|0)|0,w)|0;u=E;m=C}}g=c[d+92>>2]|0;b=(x|0)!=0;d:do if(b){k=d;while(1){i=c[k>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}else{k=d;while(1){i=c[k+4>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}while(0);i=c[o+92>>2]|0;if(b){g=o;while(1){k=c[g+4>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}else{g=o;while(1){k=c[g>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}}else{u=(x|0)!=0;k=d;g=o;t=n;s=c[o+92>>2]|0;while(1){r=g+88|0;b=c[k+92>>2]|0;d=s-b|0;m=c[(u?k:k+4|0)>>2]|0;e:do if((m|0)!=(k|0))if(u){p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else{p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q+4>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else p=i;while(0);n=c[(u?g:g+4|0)>>2]|0;if((n|0)==(g|0))break c;i=c[n+88>>2]|0;m=P(i-(c[r>>2]|0)|0,w)|0;b=s;s=c[n+92>>2]|0;b=s-b|0;t=c[k+88>>2]|0;i=P(i-t|0,w)|0;if(!((b|0)<0&(i|0)>0))break c;if(!m){g=n;continue}if((m|0)>=0)break c;if((P(b,p)|0)>=(P(m,d)|0))break;else g=n}}while(0);i=(x|0)==0;j=i?g:j;h=i?k:h;o=i?z:g;d=i?y:k;x=x+1|0;if((x|0)==2)break;else w=i?-1:w}c[d+4>>2]=o;c[o>>2]=d;c[h>>2]=j;c[j+4>>2]=h;if((c[z+88>>2]|0)<(c[y+88>>2]|0))c[e>>2]=z;if((c[f+88>>2]|0)>=(c[B+88>>2]|0))c[e+4>>2]=f;c[e+12>>2]=c[K+96+12>>2];g=h;F=j;s=c[j+88>>2]|0;n=c[h+88>>2]|0;t=c[j+92>>2]|0;u=c[h+92>>2]|0;v=c[j+96>>2]|0;o=c[h+96>>2]|0;w=((t-u|0)<0)<<31>>31;x=0-(s-n)|0;y=sw(0,0,x|0,((x|0)<0)<<31>>31|0)|0;y=ct(v-o|0,((v-o|0)<0)<<31>>31|0,y|0,A|0)|0;z=A;B=ct(v-o|0,((v-o|0)<0)<<31>>31|0,t-u|0,w|0)|0;C=A;p=ct(s-n|0,((s-n|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;E=A;D=ct(t-u|0,w|0,t-u|0,w|0)|0;D=sw(p|0,E|0,D|0,A|0)|0;E=A;p=c[h+8>>2]|0;c[K+120>>2]=0;if(!p)p=0;else{q=sw(0,0,t-u|0,w|0)|0;r=A;d=p;f=0;do{m=c[d+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;b=ct(k-u|0,((k-u|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=A;e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,q|0,r|0)|0;f:do if((b|0)==(e|0)&(G|0)==(A|0)?(e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,y|0,z|0)|0,b=A,G=ct(k-u|0,((k-u|0)<0)<<31>>31|0,B|0,C|0)|0,b=Ow(G|0,A|0,e|0,b|0)|0,e=A,G=ct(m-o|0,((m-o|0)<0)<<31>>31|0,D|0,E|0)|0,G=Ow(b|0,e|0,G|0,A|0)|0,e=A,(e|0)>0|(e|0)==0&G>>>0>0):0){do if(f|0){b=(c[f+4>>2]|0)==(d|0);if((c[f>>2]|0)!=(d|0))if(b)break;else break f;if(!b)break f;e=c[f+12>>2]|0;L=c[(c[d+8>>2]|0)+12>>2]|0;G=c[L+88>>2]|0;b=c[L+92>>2]|0;L=c[L+96>>2]|0;M=(c[e+96>>2]|0)-L|0;b=(P(m-L|0,(c[e+92>>2]|0)-b|0)|0)-(P(M,k-b|0)|0)|0;G=(P(M,i-G|0)|0)-(P(m-L|0,(c[e+88>>2]|0)-G|0)|0)|0;b=ct(b|0,((b|0)<0)<<31>>31|0,t-u|0,w|0)|0;e=A;G=ct(G|0,((G|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=Ow(b|0,e|0,G|0,A|0)|0;e=A;if((e|0)>0|(e|0)==0&G>>>0>0)break f}while(0);f=d}while(0);d=c[d>>2]|0}while((d|0)!=(p|0));c[K+120>>2]=f;p=f}d=c[j+8>>2]|0;c[K+72>>2]=0;if(!d)f=0;else{n=sw(0,0,t-u|0,w|0)|0;o=A;b=d;f=0;do{m=c[b+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;G=ct(k-t|0,((k-t|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;M=A;L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,n|0,o|0)|0;do if((G|0)==(L|0)&(M|0)==(A|0)?(L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,y|0,z|0)|0,G=A,M=ct(k-t|0,((k-t|0)<0)<<31>>31|0,B|0,C|0)|0,G=Ow(M|0,A|0,L|0,G|0)|0,L=A,M=ct(m-v|0,((m-v|0)<0)<<31>>31|0,D|0,E|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,(L|0)>0|(L|0)==0&M>>>0>0):0){if(f|0){if((c[f>>2]|0)!=(b|0))break;if((c[f+4>>2]|0)==(b|0)?(L=c[f+12>>2]|0,e=c[(c[b+8>>2]|0)+12>>2]|0,M=c[e+88>>2]|0,G=c[e+92>>2]|0,e=c[e+96>>2]|0,r=(c[L+96>>2]|0)-e|0,G=(P(m-e|0,(c[L+92>>2]|0)-G|0)|0)-(P(r,k-G|0)|0)|0,M=(P(r,i-M|0)|0)-(P(m-e|0,(c[L+88>>2]|0)-M|0)|0)|0,G=ct(G|0,((G|0)<0)<<31>>31|0,t-u|0,w|0)|0,L=A,M=ct(M|0,((M|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,!((L|0)>0|(L|0)==0&M>>>0>0)):0)break}f=b}while(0);b=c[b>>2]|0}while((b|0)!=(d|0));c[K+72>>2]=f}if((p|0)!=0|(f|0)!=0){rc(a,h,j,K+120|0,K+72|0);f=c[K+120>>2]|0;if(f){h=c[f+12>>2]|0;g=h}f=c[K+72>>2]|0;if(!f){f=F;i=h}else{j=c[f+12>>2]|0;f=j;i=h}}else{f=F;i=h}b=f;n=c[j+88>>2]|0;o=(c[j+96>>2]|0)+1|0;h=c[j+92>>2]|0}f=0;e=0;k=0;z=0;G=1;D=0;m=0;d=0;B=0;F=b;C=o;x=j;w=i;while(1){y=c[w+88>>2]|0;u=(c[x+88>>2]|0)-y|0;M=c[w+92>>2]|0;E=(c[x+92>>2]|0)-M|0;t=c[w+96>>2]|0;r=(c[x+96>>2]|0)-t|0;c[K+120>>2]=u;c[K+120+4>>2]=E;c[K+120+8>>2]=r;c[K+120+12>>2]=-1;y=n-y|0;M=h-M|0;t=C-t|0;s=(P(r,M)|0)-(P(E,t)|0)|0;t=(P(u,t)|0)-(P(r,y)|0)|0;M=(P(E,y)|0)-(P(u,M)|0)|0;c[K+72>>2]=s;c[K+72+4>>2]=((s|0)<0)<<31>>31;c[K+72+8>>2]=t;c[K+72+8+4>>2]=((t|0)<0)<<31>>31;c[K+72+16>>2]=M;c[K+72+16+4>>2]=((M|0)<0)<<31>>31;y=ct(E|0,((E|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;L=A;v=ct(r|0,((r|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;v=sw(y|0,L|0,v|0,A|0)|0;L=A;r=ct(s|0,((s|0)<0)<<31>>31|0,r|0,((r|0)<0)<<31>>31|0)|0;y=A;M=ct(u|0,((u|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;M=sw(r|0,y|0,M|0,A|0)|0;y=A;t=ct(u|0,((u|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;u=A;E=ct(s|0,((s|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;E=sw(t|0,u|0,E|0,A|0)|0;c[K+48>>2]=v;c[K+48+4>>2]=L;c[K+48+8>>2]=M;c[K+48+8+4>>2]=y;c[K+48+16>>2]=E;c[K+48+16+4>>2]=A;c[K+24>>2]=0;c[K+24+4>>2]=0;c[K+24+8>>2]=0;c[K+24+12>>2]=0;c[K+24+16>>2]=0;E=Fd(a,0,w,K+120|0,K+72|0,K+48|0,K+24|0)|0;c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;c[K+16>>2]=0;y=Fd(a,1,x,K+120|0,K+72|0,K+48|0,K)|0;do if((E|0)!=0|(y|0)!=0){b=E|0?-1:1;do if((E|0)!=0&(y|0)!=0){v=c[K+24+16>>2]|0;b=c[K+16>>2]|0;if((v|0)!=(b|0)){u=v-b|0;break}if(!v)u=0;else{M=c[K+24>>2]|0;t=c[K+24+4>>2]|0;p=c[K+8>>2]|0;N=c[K+8+4>>2]|0;o=ct(p|0,0,M|0,0)|0;b=A;M=ct(N|0,0,M|0,0)|0;L=A;p=ct(p|0,0,t|0,0)|0;q=A;t=ct(N|0,0,t|0,0)|0;N=A;p=Ow(M|0,0,p|0,0)|0;M=A;N=Ow(L|0,0,t|0,N|0)|0;q=Ow(N|0,A|0,q|0,0)|0;M=Ow(q|0,A|0,M|0,0)|0;q=A;b=Ow(0,p|0,o|0,b|0)|0;o=A;p=Ow(M|0,q|0,(o>>>0

>>0|(o|0)==(p|0)&b>>>0<0)&1|0,0)|0;q=A;M=c[K+24+8>>2]|0;N=c[K+24+8+4>>2]|0;t=c[K>>2]|0;L=c[K+4>>2]|0;s=ct(t|0,0,M|0,0)|0;r=A;M=ct(L|0,0,M|0,0)|0;O=A;t=ct(t|0,0,N|0,0)|0;u=A;N=ct(L|0,0,N|0,0)|0;L=A;t=Ow(M|0,0,t|0,0)|0;M=A;L=Ow(O|0,0,N|0,L|0)|0;u=Ow(L|0,A|0,u|0,0)|0;M=Ow(u|0,A|0,M|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(M|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0)b=-1;else b=q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0?1:o>>>0>>0|(o|0)==(s|0)&b>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&b>>>0>r>>>0)&1;u=P(b,v)|0}}else u=b;while(0);do if(!G)if((u|0)>-1)if((c[K+16>>2]|0)<0&((c[K+8>>2]|0)==0?(c[K+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else if((c[K+24+16>>2]|0)<0&((c[K+24+8>>2]|0)==0?(c[K+24+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else H=133;while(0);if((H|0)==133){H=0;o=hg(a,w,x)|0;if(!z)k=o;else c[z+4>>2]=o;c[o>>2]=z;b=c[o+8>>2]|0;if(!B)d=b;else c[B>>2]=b;c[b+4>>2]=B;s=b}c[K+116>>2]=E;c[K+112>>2]=y;if(!u){rc(a,g,F,K+116|0,K+112|0);b=c[K+112>>2]|0}else b=y;if((u|0)>-1&(b|0)!=0){q=(D|0)!=0;if(q?(I=c[D>>2]|0,(I|0)!=(y|0)):0){n=I;do{p=n;n=c[n>>2]|0;r=c[p+8>>2]|0;if((n|0)==(p|0))h=0;else{c[n+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=n;h=n}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[p+12>>2]|0)+8>>2]=h;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((n|0)!=(y|0))}if(!s){m=q?m:y;h=d}else{if(q)h=D;else{m=d;h=c[y+4>>2]|0}c[h>>2]=d;c[d+4>>2]=h;c[s>>2]=y;c[y+4>>2]=s;h=0;b=c[K+112>>2]|0}O=F;t=c[b+8>>2]|0;s=0;B=h;z=c[b+12>>2]|0;n=c[O+88>>2]|0;d=c[O+96>>2]|0;h=c[O+92>>2]|0}else{t=D;B=d;z=F;d=C}b=c[K+116>>2]|0;if((u|0)<1&(b|0)!=0){p=(f|0)!=0;if(p?(J=c[f+4>>2]|0,(J|0)!=(E|0)):0){d=J;do{q=d+4|0;n=d;d=c[q>>2]|0;h=c[n>>2]|0;r=c[n+8>>2]|0;if((h|0)==(n|0))h=0;else{c[h+4>>2]=d;c[c[q>>2]>>2]=h}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[n+12>>2]|0)+8>>2]=h;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((d|0)!=(E|0))}if(!o)h=p?e:E;else{if(p)h=e;else{h=k;f=c[E>>2]|0}c[k>>2]=f;c[f+4>>2]=k;c[E>>2]=o;c[o+4>>2]=E;k=0;b=c[K+116>>2]|0}O=g;f=c[b+8>>2]|0;r=h;w=0;y=c[O+88>>2]|0;g=c[b+12>>2]|0;x=c[O+96>>2]|0;h=c[O+92>>2]|0}else{r=e;w=o;y=n;x=d}if((g|0)==(i|0)&(z|0)==(j|0)){if(f){q=f+4|0;b=c[q>>2]|0;if((b|0)!=(r|0))do{o=b+4|0;n=b;b=c[o>>2]|0;d=c[n>>2]|0;p=c[n+8>>2]|0;if((d|0)==(n|0))d=0;else{c[d+4>>2]=b;c[c[o>>2]>>2]=d}c[(c[p+12>>2]|0)+8>>2]=d;d=c[p>>2]|0;if((d|0)==(p|0))d=0;else{c[d+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(r|0));if(w|0){c[k>>2]=f;c[q>>2]=k;c[r>>2]=w;c[w+4>>2]=r}}else{c[k>>2]=w;c[w+4>>2]=k;c[g+8>>2]=w}if(!t){c[s>>2]=B;c[B+4>>2]=s;c[j+8>>2]=s;v=0;u=G;t=0;q=w;d=B;p=z;n=y;o=g;b=x;break}b=c[t>>2]|0;if((b|0)!=(m|0))do{n=b;b=c[b>>2]|0;o=c[n+8>>2]|0;if((b|0)==(n|0))d=0;else{c[b+4>>2]=c[n+4>>2];c[c[n+4>>2]>>2]=b;d=b}c[(c[o+12>>2]|0)+8>>2]=d;d=c[o>>2]|0;if((d|0)==(o|0))d=0;else{c[d+4>>2]=c[o+4>>2];c[c[o+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[n+4>>2]=0;c[n+4+4>>2]=0;c[n+4+8>>2]=0;c[n+4+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[o+4>>2]=0;c[o+4+4>>2]=0;c[o+4+8>>2]=0;c[o+4+12>>2]=0;c[o>>2]=c[a+56>>2];c[a+56>>2]=o;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(m|0));if(!s){v=0;u=G;q=w;s=0;d=B;p=z;n=y;o=g;b=x}else{c[t>>2]=B;c[B+4>>2]=t;c[s>>2]=m;c[m+4>>2]=s;v=0;u=G;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=1;u=0;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=hg(a,w,x)|0;c[v>>2]=v;c[v+4>>2]=v;c[w+8>>2]=v;v=c[v+8>>2]|0;c[v>>2]=v;c[v+4>>2]=v;c[x+8>>2]=v;v=0;u=G;t=D;r=e;q=z;s=B;p=F;o=g;b=C}while(0);if(!v)break b;e=r;z=q;G=u;D=t;B=s;F=p;g=o;C=b;x=p;w=o}}while(0);l=K;return}}} + +// EMSCRIPTEN_END_FUNCS +var nb=[fJ,ip,UG,HG,HG,LG,$D,Mq,Lq,Mq,fJ,fJ,fJ,fJ,fJ,fJ];var ob=[KI,bx];var pb=[FD,fk,fk,FD];var qb=[DH,Dj,gk,vi,Bv,$k,Ao,$j,Xm,_m,Qh,Tm,lm,ym,Ig,Ng,Gg,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH];var rb=[eB,tk,tk,eB];var sb=[CF,Vc];var tb=[ZC,Yu,ie,Yu,Yu,je,Yu,Yu,yf,uf,bu,Yu,Yu,ZC,ZC,ZC];var ub=[ix,oq];var vb=[Zv,qc,Vk,Zv];var wb=[bv,Nm,qd,bv];var xb=[eJ,HI,jI,hF,DE,DE,fG,BH,II,HI,Nr,VH,EI,XG,LH,YG,HI,xH,qI,II,oI,oI,jI,cG,KE,UE,PH,vH,II,oF,YG,XF,LF,wF,_G,PF,wG,sG,jG,JG,xG,jI,Cz,Vs,vF,KG,xF,Fv,cG,cG,yH,tI,jH,GI,AH,BI,CI,zI,sE,ZH,AH,cI,aI,fI,YG,iI,ZG,bG,bG,HI,wI,AH,vI,uI,zD,SH,HI,HI,HI,JI,DI,xI,EI,DI,_G,iG,RH,sI,AH,nI,mI,aF,nD,aG,VF,VF,fG,fG,OI,HI,jI,fG,fG,OI,DE,HI,WF,WF,fG,Ot,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ];var yb=[YF,Di];var zb=[AI,ds,gs,es,Fo,oG,oG,dc,tz,tz,Pd,wn,sy,bo,Ct,tl,fr,op,Pk,yi,Io,dr,AI,AI,AI,AI,AI,AI,AI,AI,AI,AI];var Ab=[KH,Kh,hE,hE,bn,KH,KH,KH];var Bb=[wH,Wn,Fi,xk,lc,vo,gl,sg,yd,fi,fh,Cf,vn,Sh,Jh,Hf,nq,bf,tg,hm,Wq,ek,Mf,Qk,xg,hl,Oh,Ok,Ie,Mk,Ed,EC,EC,pf,Yj,Sg,Jg,ti,To,ql,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH];var Cb=[zF,sn,zp,Uo,sk,qk,Vh,Ll,Il,Mo,wg,Ho,Rp,Ym,Zl,Rl,Si,jl,Qc,cw,Gx,Ef,zF,zF,zF,zF,zF,zF,zF,zF,zF,zF];var Db=[VC,Jl];var Eb=[GA,fd,Ad,Wd];var Fb=[gx,ld,Yf,gx];var Gb=[_u,Rc,oh,_u];var Hb=[lJ,UI,pk,gu];var Ib=[jJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,nH,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,Lp,Vq,no,Jj,gz,ZI,aJ,aJ,aJ,aJ,rd,pw,ZI,aJ,ZI,aJ,aJ,ZI,Ey,aJ,aJ,ZI,Ey,aJ,aJ,ZI,aJ,lz,Sx,ZI,aJ,ZI,aJ,mq,Mp,Qi,vC,bk,Vu,Wm,zu,fc,Bn,qh,Pn,Df,Ml,ZI,aJ,ZI,aJ,zl,$l,Qg,av,ci,aJ,kk,ZB,IH,Yv,ZI,IH,Yv,ZI,Yv,Td,mn,Yv,Yv,Le,Yv,Yv,qe,Yv,Oc,Tf,St,WE,pi,pF,aJ,up,Do,aJ,ZI,aJ,Jp,No,wl,_l,rk,Wu,Qp,_q,ZI,aJ,nf,lB,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,mk,HC,cr,Xp,Np,Qo,aJ,rq,jp,ir,_p,ZI,aJ,Oj,rF,Dd,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,oH,aJ,aJ,aJ,aJ,aJ,aJ,aJ,Yq,Vp,ZI,aJ,Hk,pD,aJ,aJ,aJ,Gi,IB,aJ,cj,iA,aJ,qm,Hv,ej,Ey,Ey,Ey,Ey,Yp,np,ZI,aJ,aJ,aJ,ZI,Ey,aJ,ZI,aJ,ZI,Ey,Mp,Dm,rm,Ey,Ey,Ey,Mp,aJ,Mp,pH,Qv,aJ,aJ,OG,Cv,Ey,Ey,Ey,ji,Pv,tj,xv,ZI,xv,Sp,gr,lk,yu,aJ,aJ,Ki,qF,ZI,aJ,aJ,aJ,ni,Qv,aJ,ZI,aJ,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,aJ,ar,Wp,aJ,aJ,nk,oD,ii,vv,Hp,Ko,ZI,aJ,ZI,ZI,aJ,aJ,Ms,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ];var Jb=[_I,nc,Uc,kn,jn,bF,kF,WH,kF,ns,wd,jh,Te,kd,yg,sp,dg,Hj,De,Gc,YE,kF,WH,Pl,Pl,lj,_I,_I,_I,_I,_I,_I];var Kb=[yI,be,jf,Bg,xj,gc,Jf,yI];var Lb=[LC];var Mb=[lI,Zg,Kd,vB,vB,xu,Vj,Xi,yp,xu,xu,jj,Ol,bm,xu,Pi];var Nb=[hH];var Ob=[YI,$q,ws,yG,OB,AB,yG,oo,_k,yG,Bt,so,Fc,le,cq,yG,yG,yG,yG,wB,jk,vg,fl,Tj,im,Pj,ks,rh,nl,Pp,Jx,ox,Jx,ox,Nc,hc,yG,mj,nu,io,pq,Th,Gt,Ft,Mg,gg,Ah,tu,sf,Dh,Ac,Wk,nd,Cj,zc,Vi,yG,Tl,Bk,Sk,el,ak,VA,Cr,mi,ap,Ck,lA,On,Dk,mj,wj,mj,ki,yr,dq,si,mj,nj,Sn,nr,pn,fe,Mn,vl,Eu,Cu,Du,zh,$m,Zm,Yg,Is,wq,Hl,Ls,Op,Uk,vd,ud,Lr,Uk,Ls,yG,yG,Hh,Ih,se,Yn,yG,yG,yG,ly,Dx,tf,md,mm,Fu,ku,ku,yG,mj,yG,yG,YI,YI,YI,YI];var Pb=[kI,Cw,Kv,fs,pl,tc,kI,kI];var Qb=[gH,ev,hk,cp,Wi,Nn,Am,gH];var Rb=[dF];var Sb=[bI,XE,Ei,Ge,mw,hi,zo,XE,yj,Lj,au,XE,Rd,td,XE,al,Rk,Kk,Gq,$i,of,bi,XE,XE,Mi,ei,mf,Fx,Ex,XE,XE,XE,XE,xd,ai,Sj,yk,Mt,Bh,su,gf,Me,Me,ph,al,Uj,So,li,al,Zh,XE,nm,Bo,wm,jm,Kl,Zj,gn,hn,fn,Vn,mo,qf,ro,XE,XE,XE,XE,Zp,lp,mp,Ql,zj,$h,hp,XE,XE,XE,XE,zi,Nd,Yh,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI];var Tb=[fH,Jz,oc,ae,$e,Jz,Ej,Be,xm,en,fH,fH,fH,fH,fH,fH];var Ub=[pC];var Vb=[zG,_e,jB,jB,jB,Xf,Ff,cu,Nj,Ar,Nu,Gk,Kc,Ec,Lf,Ht,th,Pf,kc,Ou,Km,sl,kp,Ff,We,Og,_f,Fe,Tt,Zs,Cg,wh,cu,oi,Ul,tt,vh,$d,am,qj,Bj,Cp,pg,Vg,Mh,Hi,Nk,jB,ri,Eh,wi,jB,jB,oj,rj,om,Tk,dk,ke,Ae,qi,Lc,rj,yl,rl,xl,cd,_n,Aj,_n,Cl,eq,po,dl,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG];var Wb=[cF,Ov];var Xb=[pu];var Yb=[iv];var Zb=[xE,Sl,og,Up,Pc,Ze,$f,Uf,ec,Ic,yc,Bd,de,Dc,Zu,_h,pc,Xd,bl,Oi,hf,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE];var _b=[oC];var $b=[JB,_d,Gl,cm,rp,Jn,Ti,JB];var ac=[$z,mg,Xg,$z];var bc=[Nw,Fj];var cc=[wv,pm,pm,wv];return{__GLOBAL__sub_I_btConeTwistConstraint_cpp:nA,__GLOBAL__sub_I_btQuickprof_cpp:Sc,___cxa_can_catch:Oq,___cxa_is_pointer_type:fz,___muldi3:ct,___udivdi3:rB,___uremdi3:xs,_bitshift64Lshr:Mu,_bitshift64Shl:wu,_emscripten_bind_Anchor___destroy___0:TD,_emscripten_bind_Anchor_get_m_body_0:vG,_emscripten_bind_Anchor_get_m_c0_0:YH,_emscripten_bind_Anchor_get_m_c1_0:XH,_emscripten_bind_Anchor_get_m_c2_0:IG,_emscripten_bind_Anchor_get_m_influence_0:QG,_emscripten_bind_Anchor_get_m_local_0:OI,_emscripten_bind_Anchor_get_m_node_0:lH,_emscripten_bind_Anchor_set_m_body_1:gE,_emscripten_bind_Anchor_set_m_c0_1:RB,_emscripten_bind_Anchor_set_m_c1_1:Cs,_emscripten_bind_Anchor_set_m_c2_1:JE,_emscripten_bind_Anchor_set_m_influence_1:PE,_emscripten_bind_Anchor_set_m_local_1:Es,_emscripten_bind_Anchor_set_m_node_1:TE,_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2:mt,_emscripten_bind_ClosestConvexResultCallback___destroy___0:px,_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0:XG,_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0:iH,_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0:gI,_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0:NF,_emscripten_bind_ClosestConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1:cs,_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1:Sr,_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1:ss,_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1:Xr,_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2:Lt,_emscripten_bind_ClosestRayResultCallback___destroy___0:px,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0:$E,_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0:aI,_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0:JF,_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0:eG,_emscripten_bind_ClosestRayResultCallback_hasHit_0:$y,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1:Mr,_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1:Is,_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1:Ur,_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1:$r,_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0:ms,_emscripten_bind_ConcreteContactResultCallback___destroy___0:px,_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7:rr,_emscripten_bind_Config___destroy___0:Bz,_emscripten_bind_Config_get_citerations_0:WF,_emscripten_bind_Config_get_collisions_0:bG,_emscripten_bind_Config_get_diterations_0:VF,_emscripten_bind_Config_get_kAHR_0:HG,_emscripten_bind_Config_get_kCHR_0:GG,_emscripten_bind_Config_get_kDF_0:WG,_emscripten_bind_Config_get_kDG_0:VG,_emscripten_bind_Config_get_kDP_0:bH,_emscripten_bind_Config_get_kKHR_0:FG,_emscripten_bind_Config_get_kLF_0:UG,_emscripten_bind_Config_get_kMT_0:TG,_emscripten_bind_Config_get_kPR_0:SG,_emscripten_bind_Config_get_kSHR_0:EG,_emscripten_bind_Config_get_kSKHR_CL_0:hG,_emscripten_bind_Config_get_kSK_SPLT_CL_0:rG,_emscripten_bind_Config_get_kSRHR_CL_0:gG,_emscripten_bind_Config_get_kSR_SPLT_CL_0:CG,_emscripten_bind_Config_get_kSSHR_CL_0:DG,_emscripten_bind_Config_get_kSS_SPLT_CL_0:OF,_emscripten_bind_Config_get_kVCF_0:RG,_emscripten_bind_Config_get_kVC_0:QG,_emscripten_bind_Config_get_maxvolume_0:LG,_emscripten_bind_Config_get_piterations_0:UF,_emscripten_bind_Config_get_timescale_0:$F,_emscripten_bind_Config_get_viterations_0:TF,_emscripten_bind_Config_set_citerations_1:mD,_emscripten_bind_Config_set_collisions_1:lD,_emscripten_bind_Config_set_diterations_1:kD,_emscripten_bind_Config_set_kAHR_1:kF,_emscripten_bind_Config_set_kCHR_1:IE,_emscripten_bind_Config_set_kDF_1:SE,_emscripten_bind_Config_set_kDG_1:RF,_emscripten_bind_Config_set_kDP_1:lG,_emscripten_bind_Config_set_kKHR_1:HE,_emscripten_bind_Config_set_kLF_1:bF,_emscripten_bind_Config_set_kMT_1:RE,_emscripten_bind_Config_set_kPR_1:QE,_emscripten_bind_Config_set_kSHR_1:GE,_emscripten_bind_Config_set_kSKHR_CL_1:fE,_emscripten_bind_Config_set_kSK_SPLT_CL_1:rE,_emscripten_bind_Config_set_kSRHR_CL_1:eE,_emscripten_bind_Config_set_kSR_SPLT_CL_1:EE,_emscripten_bind_Config_set_kSSHR_CL_1:FE,_emscripten_bind_Config_set_kSS_SPLT_CL_1:PD,_emscripten_bind_Config_set_kVCF_1:mG,_emscripten_bind_Config_set_kVC_1:PE,_emscripten_bind_Config_set_maxvolume_1:YE,_emscripten_bind_Config_set_piterations_1:jD,_emscripten_bind_Config_set_timescale_1:_D,_emscripten_bind_Config_set_viterations_1:iD,_emscripten_bind_ContactResultCallback___destroy___0:px,_emscripten_bind_ContactResultCallback_addSingleResult_7:rr,_emscripten_bind_ConvexResultCallback___destroy___0:px,_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_Face___destroy___0:TD,_emscripten_bind_Face_get_m_n_1:OD,_emscripten_bind_Face_get_m_normal_0:QH,_emscripten_bind_Face_set_m_n_2:UA,_emscripten_bind_Face_set_m_normal_1:Bs,_emscripten_bind_Joint___destroy___0:px,_emscripten_bind_Joint_get_m_cfm_0:DG,_emscripten_bind_Joint_get_m_delete_0:mF,_emscripten_bind_Joint_get_m_drift_0:aI,_emscripten_bind_Joint_get_m_erp_0:CG,_emscripten_bind_Joint_get_m_massmatrix_0:uH,_emscripten_bind_Joint_get_m_refs_1:OE,_emscripten_bind_Joint_get_m_sdrift_0:OH,_emscripten_bind_Joint_get_m_split_0:rG,_emscripten_bind_Joint_set_m_cfm_1:FE,_emscripten_bind_Joint_set_m_delete_1:hD,_emscripten_bind_Joint_set_m_drift_1:Is,_emscripten_bind_Joint_set_m_erp_1:EE,_emscripten_bind_Joint_set_m_massmatrix_1:dB,_emscripten_bind_Joint_set_m_refs_2:Uq,_emscripten_bind_Joint_set_m_sdrift_1:zs,_emscripten_bind_Joint_set_m_split_1:rE,_emscripten_bind_LJoint___destroy___0:px,_emscripten_bind_LJoint_get_m_rpos_1:vE,_emscripten_bind_LJoint_set_m_rpos_2:Pq,_emscripten_bind_Link___destroy___0:QB,_emscripten_bind_Link_get_m_n_1:yD,_emscripten_bind_Link_set_m_n_2:LA,_emscripten_bind_LocalConvexResult_LocalConvexResult_5:lr,_emscripten_bind_LocalConvexResult___destroy___0:TD,_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0:lH,_emscripten_bind_LocalConvexResult_get_m_hitFraction_0:FG,_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0:NI,_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0:JF,_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0:hF,_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1:TE,_emscripten_bind_LocalConvexResult_set_m_hitFraction_1:HE,_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1:Ns,_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1:Ur,_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1:OB,_emscripten_bind_LocalShapeInfo___destroy___0:TD,_emscripten_bind_LocalShapeInfo_get_m_shapePart_0:lH,_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0:hF,_emscripten_bind_LocalShapeInfo_set_m_shapePart_1:TE,_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1:OB,_emscripten_bind_Material___destroy___0:TD,_emscripten_bind_Material_get_m_flags_0:fG,_emscripten_bind_Material_get_m_kAST_0:bH,_emscripten_bind_Material_get_m_kLST_0:RG,_emscripten_bind_Material_get_m_kVST_0:VG,_emscripten_bind_Material_set_m_flags_1:ND,_emscripten_bind_Material_set_m_kAST_1:lG,_emscripten_bind_Material_set_m_kLST_1:mG,_emscripten_bind_Material_set_m_kVST_1:RF,_emscripten_bind_Node___destroy___0:TD,_emscripten_bind_Node_get_m_n_0:aI,_emscripten_bind_Node_get_m_x_0:NI,_emscripten_bind_Node_set_m_n_1:Is,_emscripten_bind_Node_set_m_x_1:Ns,_emscripten_bind_RayResultCallback___destroy___0:px,_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_RayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_RayResultCallback_hasHit_0:$y,_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_RayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_RaycastInfo___destroy___0:TD,_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0:gJ,_emscripten_bind_RaycastInfo_get_m_contactPointWS_0:XG,_emscripten_bind_RaycastInfo_get_m_groundObject_0:UF,_emscripten_bind_RaycastInfo_get_m_hardPointWS_0:BG,_emscripten_bind_RaycastInfo_get_m_isInContact_0:ZD,_emscripten_bind_RaycastInfo_get_m_suspensionLength_0:TG,_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0:AG,_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0:_F,_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1:Gs,_emscripten_bind_RaycastInfo_set_m_contactPointWS_1:cs,_emscripten_bind_RaycastInfo_set_m_groundObject_1:jD,_emscripten_bind_RaycastInfo_set_m_hardPointWS_1:js,_emscripten_bind_RaycastInfo_set_m_isInContact_1:HB,_emscripten_bind_RaycastInfo_set_m_suspensionLength_1:RE,_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1:is,_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1:Zr,_emscripten_bind_Specs___destroy___0:TD,_emscripten_bind_Specs_get_position_0:MI,_emscripten_bind_Specs_set_position_1:ys,_emscripten_bind_VoidPtr___destroy___0:TD,_emscripten_bind_btActionInterface___destroy___0:px,_emscripten_bind_btActionInterface_updateAction_2:aw,_emscripten_bind_btAxisSweep3___destroy___0:px,_emscripten_bind_btAxisSweep3_btAxisSweep3_2:yt,_emscripten_bind_btAxisSweep3_btAxisSweep3_3:Ks,_emscripten_bind_btAxisSweep3_btAxisSweep3_4:hs,_emscripten_bind_btAxisSweep3_btAxisSweep3_5:Gr,_emscripten_bind_btBoxShape___destroy___0:px,_emscripten_bind_btBoxShape_btBoxShape_1:Ci,_emscripten_bind_btBoxShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBoxShape_getLocalScaling_0:Oz,_emscripten_bind_btBoxShape_getMargin_0:pA,_emscripten_bind_btBoxShape_setLocalScaling_1:Cx,_emscripten_bind_btBoxShape_setMargin_1:Ay,_emscripten_bind_btBroadphaseInterface___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2:xt,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3:Ps,_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX___destroy___0:px,_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2:Dn,_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeX_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeX_getMargin_0:pA,_emscripten_bind_btCapsuleShapeX_getRadius_0:MD,_emscripten_bind_btCapsuleShapeX_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX_setMargin_1:Ay,_emscripten_bind_btCapsuleShapeZ___destroy___0:px,_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2:Cn,_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeZ_getMargin_0:pA,_emscripten_bind_btCapsuleShapeZ_getRadius_0:MD,_emscripten_bind_btCapsuleShapeZ_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeZ_setMargin_1:Ay,_emscripten_bind_btCapsuleShape___destroy___0:px,_emscripten_bind_btCapsuleShape_btCapsuleShape_2:Fn,_emscripten_bind_btCapsuleShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShape_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShape_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShape_getMargin_0:pA,_emscripten_bind_btCapsuleShape_getRadius_0:MD,_emscripten_bind_btCapsuleShape_getUpAxis_0:qE,_emscripten_bind_btCapsuleShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShape_setMargin_1:Ay,_emscripten_bind_btCollisionConfiguration___destroy___0:px,_emscripten_bind_btCollisionDispatcher___destroy___0:px,_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1:ok,_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btCollisionDispatcher_getNumManifolds_0:qA,_emscripten_bind_btCollisionObject___destroy___0:px,_emscripten_bind_btCollisionObject_activate_0:ju,_emscripten_bind_btCollisionObject_activate_1:Ys,_emscripten_bind_btCollisionObject_forceActivationState_1:FB,_emscripten_bind_btCollisionObject_getCollisionFlags_0:JD,_emscripten_bind_btCollisionObject_getCollisionShape_0:ID,_emscripten_bind_btCollisionObject_getUserIndex_0:nE,_emscripten_bind_btCollisionObject_getUserPointer_0:cE,_emscripten_bind_btCollisionObject_getWorldTransform_0:fF,_emscripten_bind_btCollisionObject_isActive_0:ZA,_emscripten_bind_btCollisionObject_isKinematicObject_0:Ry,_emscripten_bind_btCollisionObject_isStaticObject_0:Kz,_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btCollisionObject_setActivationState_1:uw,_emscripten_bind_btCollisionObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btCollisionObject_setCollisionFlags_1:wz,_emscripten_bind_btCollisionObject_setCollisionShape_1:sx,_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btCollisionObject_setFriction_1:YA,_emscripten_bind_btCollisionObject_setRestitution_1:oA,_emscripten_bind_btCollisionObject_setRollingFriction_1:Fz,_emscripten_bind_btCollisionObject_setUserIndex_1:tA,_emscripten_bind_btCollisionObject_setUserPointer_1:Wz,_emscripten_bind_btCollisionObject_setWorldTransform_1:cy,_emscripten_bind_btCollisionShape___destroy___0:px,_emscripten_bind_btCollisionShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCollisionShape_getLocalScaling_0:Oz,_emscripten_bind_btCollisionShape_getMargin_0:pA,_emscripten_bind_btCollisionShape_setLocalScaling_1:Cx,_emscripten_bind_btCollisionShape_setMargin_1:Ay,_emscripten_bind_btCollisionWorld___destroy___0:px,_emscripten_bind_btCollisionWorld_addCollisionObject_1:kw,_emscripten_bind_btCollisionWorld_addCollisionObject_2:Ru,_emscripten_bind_btCollisionWorld_addCollisionObject_3:pt,_emscripten_bind_btCollisionWorld_contactPairTest_3:wt,_emscripten_bind_btCollisionWorld_contactTest_2:tn,_emscripten_bind_btCollisionWorld_convexSweepTest_5:Qr,_emscripten_bind_btCollisionWorld_getBroadphase_0:LD,_emscripten_bind_btCollisionWorld_getDispatchInfo_0:tC,_emscripten_bind_btCollisionWorld_getDispatcher_0:KD,_emscripten_bind_btCollisionWorld_getPairCache_0:Tz,_emscripten_bind_btCollisionWorld_rayTest_3:$u,_emscripten_bind_btCollisionWorld_removeCollisionObject_1:Pw,_emscripten_bind_btCollisionWorld_updateSingleAabb_1:nx,_emscripten_bind_btCompoundShape___destroy___0:px,_emscripten_bind_btCompoundShape_addChildShape_2:Sd,_emscripten_bind_btCompoundShape_btCompoundShape_0:ny,_emscripten_bind_btCompoundShape_btCompoundShape_1:Sw,_emscripten_bind_btCompoundShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCompoundShape_getChildShape_1:Pz,_emscripten_bind_btCompoundShape_getLocalScaling_0:Oz,_emscripten_bind_btCompoundShape_getMargin_0:pA,_emscripten_bind_btCompoundShape_getNumChildShapes_0:cB,_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1:_x,_emscripten_bind_btCompoundShape_setLocalScaling_1:Cx,_emscripten_bind_btCompoundShape_setMargin_1:Ay,_emscripten_bind_btConcaveShape___destroy___0:px,_emscripten_bind_btConcaveShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConcaveShape_getLocalScaling_0:Oz,_emscripten_bind_btConcaveShape_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeX___destroy___0:px,_emscripten_bind_btConeShapeX_btConeShapeX_2:um,_emscripten_bind_btConeShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeX_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeX_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeZ___destroy___0:px,_emscripten_bind_btConeShapeZ_btConeShapeZ_2:tm,_emscripten_bind_btConeShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btConeShape___destroy___0:px,_emscripten_bind_btConeShape_btConeShape_2:vm,_emscripten_bind_btConeShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShape_getLocalScaling_0:Oz,_emscripten_bind_btConeShape_setLocalScaling_1:Cx,_emscripten_bind_btConeTwistConstraint___destroy___0:px,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2:Wg,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4:Fg,_emscripten_bind_btConeTwistConstraint_enableFeedback_1:mz,_emscripten_bind_btConeTwistConstraint_enableMotor_1:dz,_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btConeTwistConstraint_getParam_2:Rv,_emscripten_bind_btConeTwistConstraint_setAngularOnly_1:zy,_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btConeTwistConstraint_setDamping_1:Nz,_emscripten_bind_btConeTwistConstraint_setLimit_2:Rx,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1:yw,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1:ey,_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1:hv,_emscripten_bind_btConeTwistConstraint_setMotorTarget_1:di,_emscripten_bind_btConeTwistConstraint_setParam_3:fv,_emscripten_bind_btConstraintSetting___destroy___0:TD,_emscripten_bind_btConstraintSetting_btConstraintSetting_0:zz,_emscripten_bind_btConstraintSetting_get_m_damping_0:RG,_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0:bH,_emscripten_bind_btConstraintSetting_get_m_tau_0:GF,_emscripten_bind_btConstraintSetting_set_m_damping_1:mG,_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1:lG,_emscripten_bind_btConstraintSetting_set_m_tau_1:MG,_emscripten_bind_btConstraintSolver___destroy___0:px,_emscripten_bind_btContactSolverInfo___destroy___0:TD,_emscripten_bind_btContactSolverInfo_get_m_numIterations_0:vG,_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0:TA,_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0:uC,_emscripten_bind_btContactSolverInfo_set_m_numIterations_1:gE,_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1:py,_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1:KA,_emscripten_bind_btConvexHullShape___destroy___0:px,_emscripten_bind_btConvexHullShape_addPoint_1:cz,_emscripten_bind_btConvexHullShape_addPoint_2:jx,_emscripten_bind_btConvexHullShape_btConvexHullShape_0:_w,_emscripten_bind_btConvexHullShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexHullShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexHullShape_getMargin_0:pA,_emscripten_bind_btConvexHullShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexHullShape_setMargin_1:Ay,_emscripten_bind_btConvexShape___destroy___0:px,_emscripten_bind_btConvexShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexShape_getMargin_0:pA,_emscripten_bind_btConvexShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexShape_setMargin_1:Ay,_emscripten_bind_btConvexTriangleMeshShape___destroy___0:px,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1:Al,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2:kl,_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexTriangleMeshShape_getMargin_0:pA,_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexTriangleMeshShape_setMargin_1:Ay,_emscripten_bind_btCylinderShapeX___destroy___0:px,_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1:Wt,_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeX_getMargin_0:pA,_emscripten_bind_btCylinderShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeX_setMargin_1:Ay,_emscripten_bind_btCylinderShapeZ___destroy___0:px,_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1:Vt,_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeZ_getMargin_0:pA,_emscripten_bind_btCylinderShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeZ_setMargin_1:Ay,_emscripten_bind_btCylinderShape___destroy___0:px,_emscripten_bind_btCylinderShape_btCylinderShape_1:Mw,_emscripten_bind_btCylinderShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShape_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShape_getMargin_0:pA,_emscripten_bind_btCylinderShape_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShape_setMargin_1:Ay,_emscripten_bind_btDbvtBroadphase___destroy___0:px,_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0:Bx,_emscripten_bind_btDefaultCollisionConfiguration___destroy___0:px,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0:Fq,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1:At,_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0:TD,_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0:Jv,_emscripten_bind_btDefaultMotionState___destroy___0:px,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0:ps,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1:Ws,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2:_t,_emscripten_bind_btDefaultMotionState_getWorldTransform_1:sx,_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0:OI,_emscripten_bind_btDefaultMotionState_setWorldTransform_1:ex,_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1:Qy,_emscripten_bind_btDefaultSoftBodySolver___destroy___0:px,_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0:sq,_emscripten_bind_btDefaultVehicleRaycaster___destroy___0:px,_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1:rv,_emscripten_bind_btDefaultVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btDiscreteDynamicsWorld___destroy___0:px,_emscripten_bind_btDiscreteDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4:Tq,_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0:Zo,_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btDispatcherInfo___destroy___0:TD,_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0:WG,_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0:GG,_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0:DE,_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0:xD,_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0:CC,_emscripten_bind_btDispatcherInfo_get_m_stepCount_0:hF,_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0:VG,_emscripten_bind_btDispatcherInfo_get_m_timeStep_0:GF,_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0:RC,_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0:vA,_emscripten_bind_btDispatcherInfo_get_m_useEpa_0:YD,_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1:SE,_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1:IE,_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1:AB,_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1:uB,_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1:SA,_emscripten_bind_btDispatcherInfo_set_m_stepCount_1:OB,_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1:RF,_emscripten_bind_btDispatcherInfo_set_m_timeStep_1:MG,_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1:bB,_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1:_y,_emscripten_bind_btDispatcherInfo_set_m_useEpa_1:GB,_emscripten_bind_btDispatcher___destroy___0:px,_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btDispatcher_getNumManifolds_0:qA,_emscripten_bind_btDynamicsWorld___destroy___0:px,_emscripten_bind_btDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDynamicsWorld_addCollisionObject_1:kw,_emscripten_bind_btDynamicsWorld_addCollisionObject_2:Ru,_emscripten_bind_btDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btFixedConstraint___destroy___0:px,_emscripten_bind_btFixedConstraint_btFixedConstraint_4:Xl,_emscripten_bind_btFixedConstraint_enableFeedback_1:mz,_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btFixedConstraint_getParam_2:Rv,_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btFixedConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3:os,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5:er,_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3:Fk,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5:uk,_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2:Kr,_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2:Zx,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2:Px,_emscripten_bind_btGhostObject___destroy___0:px,_emscripten_bind_btGhostObject_activate_0:ju,_emscripten_bind_btGhostObject_activate_1:Ys,_emscripten_bind_btGhostObject_btGhostObject_0:Pg,_emscripten_bind_btGhostObject_forceActivationState_1:FB,_emscripten_bind_btGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btGhostObject_getCollisionShape_0:ID,_emscripten_bind_btGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btGhostObject_getUserIndex_0:nE,_emscripten_bind_btGhostObject_getUserPointer_0:cE,_emscripten_bind_btGhostObject_getWorldTransform_0:fF,_emscripten_bind_btGhostObject_isActive_0:ZA,_emscripten_bind_btGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btGhostObject_isStaticObject_0:Kz,_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btGhostObject_setActivationState_1:uw,_emscripten_bind_btGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btGhostObject_setCollisionShape_1:sx,_emscripten_bind_btGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btGhostObject_setFriction_1:YA,_emscripten_bind_btGhostObject_setRestitution_1:oA,_emscripten_bind_btGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btGhostObject_setUserIndex_1:tA,_emscripten_bind_btGhostObject_setUserPointer_1:Wz,_emscripten_bind_btGhostObject_setWorldTransform_1:cy,_emscripten_bind_btGhostPairCallback___destroy___0:px,_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0:Iz,_emscripten_bind_btHeightfieldTerrainShape___destroy___0:px,_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9:ug,_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2:Nv,_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0:Oz,_emscripten_bind_btHeightfieldTerrainShape_getMargin_0:pA,_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1:Cx,_emscripten_bind_btHeightfieldTerrainShape_setMargin_1:Ay,_emscripten_bind_btHingeConstraint___destroy___0:px,_emscripten_bind_btHingeConstraint_btHingeConstraint_2:eg,_emscripten_bind_btHingeConstraint_btHingeConstraint_3:ag,_emscripten_bind_btHingeConstraint_btHingeConstraint_4:Dg,_emscripten_bind_btHingeConstraint_btHingeConstraint_5:zg,_emscripten_bind_btHingeConstraint_btHingeConstraint_6:br,_emscripten_bind_btHingeConstraint_btHingeConstraint_7:Bq,_emscripten_bind_btHingeConstraint_enableAngularMotor_3:Av,_emscripten_bind_btHingeConstraint_enableFeedback_1:mz,_emscripten_bind_btHingeConstraint_enableMotor_1:Zz,_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btHingeConstraint_getParam_2:Rv,_emscripten_bind_btHingeConstraint_setAngularOnly_1:rz,_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btHingeConstraint_setLimit_4:yv,_emscripten_bind_btHingeConstraint_setLimit_5:Uu,_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1:My,_emscripten_bind_btHingeConstraint_setMotorTarget_2:_j,_emscripten_bind_btHingeConstraint_setParam_3:fv,_emscripten_bind_btKinematicCharacterController___destroy___0:px,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3:En,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4:Aq,_emscripten_bind_btKinematicCharacterController_canJump_0:uy,_emscripten_bind_btKinematicCharacterController_getGhostObject_0:DE,_emscripten_bind_btKinematicCharacterController_getGravity_0:xp,_emscripten_bind_btKinematicCharacterController_getMaxSlope_0:EG,_emscripten_bind_btKinematicCharacterController_jump_0:Rt,_emscripten_bind_btKinematicCharacterController_onGround_0:Cz,_emscripten_bind_btKinematicCharacterController_playerStep_2:tv,_emscripten_bind_btKinematicCharacterController_preStep_1:Kw,_emscripten_bind_btKinematicCharacterController_setFallSpeed_1:SE,_emscripten_bind_btKinematicCharacterController_setGravity_1:Jm,_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1:Yx,_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1:HE,_emscripten_bind_btKinematicCharacterController_setMaxSlope_1:ax,_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1:$v,_emscripten_bind_btKinematicCharacterController_setUp_1:cl,_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1:bw,_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2:Lu,_emscripten_bind_btKinematicCharacterController_setWalkDirection_1:_v,_emscripten_bind_btKinematicCharacterController_updateAction_2:aw,_emscripten_bind_btKinematicCharacterController_warp_1:Uw,_emscripten_bind_btManifoldPoint___destroy___0:TD,_emscripten_bind_btManifoldPoint_getAppliedImpulse_0:Hz,_emscripten_bind_btManifoldPoint_getDistance_0:kA,_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0:BE,_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0:FA,_emscripten_bind_btManifoldPoint_get_m_localPointA_0:gJ,_emscripten_bind_btManifoldPoint_get_m_localPointB_0:XG,_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0:NF,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0:gI,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0:iH,_emscripten_bind_btManifoldPoint_set_m_localPointA_1:Gs,_emscripten_bind_btManifoldPoint_set_m_localPointB_1:cs,_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1:Xr,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1:ss,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1:Sr,_emscripten_bind_btMatrix3x3___destroy___0:TD,_emscripten_bind_btMatrix3x3_getRotation_1:Mz,_emscripten_bind_btMatrix3x3_getRow_1:Iq,_emscripten_bind_btMatrix3x3_setEulerZYX_3:wx,_emscripten_bind_btMotionState___destroy___0:px,_emscripten_bind_btMotionState_getWorldTransform_1:sx,_emscripten_bind_btMotionState_setWorldTransform_1:ex,_emscripten_bind_btOverlappingPairCache___destroy___0:px,_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1:Bw,_emscripten_bind_btOverlappingPairCallback___destroy___0:px,_emscripten_bind_btPairCachingGhostObject___destroy___0:px,_emscripten_bind_btPairCachingGhostObject_activate_0:ju,_emscripten_bind_btPairCachingGhostObject_activate_1:Ys,_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0:kg,_emscripten_bind_btPairCachingGhostObject_forceActivationState_1:FB,_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0:ID,_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btPairCachingGhostObject_getUserIndex_0:nE,_emscripten_bind_btPairCachingGhostObject_getUserPointer_0:cE,_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0:fF,_emscripten_bind_btPairCachingGhostObject_isActive_0:ZA,_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btPairCachingGhostObject_isStaticObject_0:Kz,_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btPairCachingGhostObject_setActivationState_1:uw,_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1:sx,_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btPairCachingGhostObject_setFriction_1:YA,_emscripten_bind_btPairCachingGhostObject_setRestitution_1:oA,_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btPairCachingGhostObject_setUserIndex_1:tA,_emscripten_bind_btPairCachingGhostObject_setUserPointer_1:Wz,_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1:cy,_emscripten_bind_btPersistentManifold___destroy___0:QB,_emscripten_bind_btPersistentManifold_btPersistentManifold_0:gm,_emscripten_bind_btPersistentManifold_getBody0_0:wD,_emscripten_bind_btPersistentManifold_getBody1_0:vD,_emscripten_bind_btPersistentManifold_getContactPoint_1:oy,_emscripten_bind_btPersistentManifold_getNumContacts_0:BC,_emscripten_bind_btPoint2PointConstraint___destroy___0:px,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2:Wj,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4:ik,_emscripten_bind_btPoint2PointConstraint_enableFeedback_1:mz,_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btPoint2PointConstraint_getParam_2:Rv,_emscripten_bind_btPoint2PointConstraint_getPivotInA_0:EA,_emscripten_bind_btPoint2PointConstraint_getPivotInB_0:DA,_emscripten_bind_btPoint2PointConstraint_get_m_setting_0:EH,_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btPoint2PointConstraint_setParam_3:fv,_emscripten_bind_btPoint2PointConstraint_setPivotA_1:jy,_emscripten_bind_btPoint2PointConstraint_setPivotB_1:iy,_emscripten_bind_btPoint2PointConstraint_set_m_setting_1:st,_emscripten_bind_btQuadWord___destroy___0:TD,_emscripten_bind_btQuadWord_setW_1:XD,_emscripten_bind_btQuadWord_setX_1:mE,_emscripten_bind_btQuadWord_setY_1:lE,_emscripten_bind_btQuadWord_setZ_1:kE,_emscripten_bind_btQuadWord_w_0:AE,_emscripten_bind_btQuadWord_x_0:ZF,_emscripten_bind_btQuadWord_y_0:zE,_emscripten_bind_btQuadWord_z_0:yE,_emscripten_bind_btQuaternion___destroy___0:TD,_emscripten_bind_btQuaternion_angleShortestPath_1:bz,_emscripten_bind_btQuaternion_angle_1:DB,_emscripten_bind_btQuaternion_btQuaternion_4:qp,_emscripten_bind_btQuaternion_dot_1:lC,_emscripten_bind_btQuaternion_getAngleShortestPath_0:Zy,_emscripten_bind_btQuaternion_getAngle_0:zB,_emscripten_bind_btQuaternion_getAxis_0:Fp,_emscripten_bind_btQuaternion_inverse_0:Ep,_emscripten_bind_btQuaternion_length2_0:NE,_emscripten_bind_btQuaternion_length_0:gF,_emscripten_bind_btQuaternion_normalize_0:CE,_emscripten_bind_btQuaternion_normalized_0:wp,_emscripten_bind_btQuaternion_op_add_1:kC,_emscripten_bind_btQuaternion_op_div_1:QC,_emscripten_bind_btQuaternion_op_mul_1:Zt,_emscripten_bind_btQuaternion_op_mulq_1:WB,_emscripten_bind_btQuaternion_op_sub_1:jC,_emscripten_bind_btQuaternion_setEulerZYX_3:Tw,_emscripten_bind_btQuaternion_setEuler_3:mx,_emscripten_bind_btQuaternion_setRotation_2:Ix,_emscripten_bind_btQuaternion_setValue_4:Tp,_emscripten_bind_btQuaternion_setW_1:XD,_emscripten_bind_btQuaternion_setX_1:mE,_emscripten_bind_btQuaternion_setY_1:lE,_emscripten_bind_btQuaternion_setZ_1:kE,_emscripten_bind_btQuaternion_w_0:AE,_emscripten_bind_btQuaternion_x_0:ZF,_emscripten_bind_btQuaternion_y_0:zE,_emscripten_bind_btQuaternion_z_0:yE,_emscripten_bind_btRaycastVehicle___destroy___0:px,_emscripten_bind_btRaycastVehicle_addWheel_7:Zd,_emscripten_bind_btRaycastVehicle_applyEngineForce_2:gw,_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3:il,_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0:NB,_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0:Yy,_emscripten_bind_btRaycastVehicle_getForwardAxis_0:aD,_emscripten_bind_btRaycastVehicle_getForwardVector_0:Go,_emscripten_bind_btRaycastVehicle_getNumWheels_0:MB,_emscripten_bind_btRaycastVehicle_getRightAxis_0:uD,_emscripten_bind_btRaycastVehicle_getRigidBody_0:tD,_emscripten_bind_btRaycastVehicle_getSteeringValue_1:Ax,_emscripten_bind_btRaycastVehicle_getUpAxis_0:WD,_emscripten_bind_btRaycastVehicle_getUserConstraintId_0:AC,_emscripten_bind_btRaycastVehicle_getUserConstraintType_0:iC,_emscripten_bind_btRaycastVehicle_getWheelInfo_1:Yz,_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1:Gy,_emscripten_bind_btRaycastVehicle_rayCast_1:Gz,_emscripten_bind_btRaycastVehicle_resetSuspension_0:Yl,_emscripten_bind_btRaycastVehicle_setBrake_2:Qw,_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3:qu,_emscripten_bind_btRaycastVehicle_setPitchControl_1:Lz,_emscripten_bind_btRaycastVehicle_setSteeringValue_2:fw,_emscripten_bind_btRaycastVehicle_setUserConstraintId_1:Py,_emscripten_bind_btRaycastVehicle_setUserConstraintType_1:Fy,_emscripten_bind_btRaycastVehicle_updateAction_2:aw,_emscripten_bind_btRaycastVehicle_updateFriction_1:vx,_emscripten_bind_btRaycastVehicle_updateSuspension_1:El,_emscripten_bind_btRaycastVehicle_updateVehicle_1:zx,_emscripten_bind_btRaycastVehicle_updateWheelTransform_2:Yt,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1:jv,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2:mu,_emscripten_bind_btRigidBodyConstructionInfo___destroy___0:TD,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3:Zn,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4:qr,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0:uA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0:Sz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0:iB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0:RA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0:Xz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0:sC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0:aB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0:$C,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0:IG,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0:hB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0:FC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0:VB,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1:Cy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1:dy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1:qz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1:yz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1:hy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1:SD,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1:jz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1:QA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1:JE,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1:pz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1:AA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1:hA,_emscripten_bind_btRigidBody___destroy___0:px,_emscripten_bind_btRigidBody_activate_0:ju,_emscripten_bind_btRigidBody_activate_1:Ys,_emscripten_bind_btRigidBody_applyCentralForce_1:Qu,_emscripten_bind_btRigidBody_applyCentralImpulse_1:Au,_emscripten_bind_btRigidBody_applyForce_2:Ox,_emscripten_bind_btRigidBody_applyGravity_0:Lo,_emscripten_bind_btRigidBody_applyImpulse_2:lx,_emscripten_bind_btRigidBody_applyTorqueImpulse_1:Iu,_emscripten_bind_btRigidBody_applyTorque_1:ov,_emscripten_bind_btRigidBody_btRigidBody_1:Kg,_emscripten_bind_btRigidBody_forceActivationState_1:FB,_emscripten_bind_btRigidBody_getAabb_2:zt,_emscripten_bind_btRigidBody_getAngularVelocity_0:CB,_emscripten_bind_btRigidBody_getCenterOfMassTransform_0:fF,_emscripten_bind_btRigidBody_getCollisionFlags_0:JD,_emscripten_bind_btRigidBody_getCollisionShape_0:ID,_emscripten_bind_btRigidBody_getGravity_0:dE,_emscripten_bind_btRigidBody_getLinearVelocity_0:LB,_emscripten_bind_btRigidBody_getMotionState_0:VD,_emscripten_bind_btRigidBody_getUserIndex_0:nE,_emscripten_bind_btRigidBody_getUserPointer_0:cE,_emscripten_bind_btRigidBody_getWorldTransform_0:fF,_emscripten_bind_btRigidBody_isActive_0:ZA,_emscripten_bind_btRigidBody_isKinematicObject_0:Ry,_emscripten_bind_btRigidBody_isStaticObject_0:Kz,_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btRigidBody_setActivationState_1:uw,_emscripten_bind_btRigidBody_setAngularFactor_1:Xy,_emscripten_bind_btRigidBody_setAngularVelocity_1:By,_emscripten_bind_btRigidBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btRigidBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btRigidBody_setCenterOfMassTransform_1:hx,_emscripten_bind_btRigidBody_setCollisionFlags_1:wz,_emscripten_bind_btRigidBody_setCollisionShape_1:sx,_emscripten_bind_btRigidBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btRigidBody_setDamping_2:go,_emscripten_bind_btRigidBody_setFriction_1:YA,_emscripten_bind_btRigidBody_setGravity_1:nn,_emscripten_bind_btRigidBody_setLinearFactor_1:iz,_emscripten_bind_btRigidBody_setLinearVelocity_1:Ly,_emscripten_bind_btRigidBody_setMassProps_2:Qj,_emscripten_bind_btRigidBody_setMotionState_1:Wy,_emscripten_bind_btRigidBody_setRestitution_1:oA,_emscripten_bind_btRigidBody_setRollingFriction_1:Fz,_emscripten_bind_btRigidBody_setSleepingThresholds_2:ux,_emscripten_bind_btRigidBody_setUserIndex_1:tA,_emscripten_bind_btRigidBody_setUserPointer_1:Wz,_emscripten_bind_btRigidBody_setWorldTransform_1:cy,_emscripten_bind_btRigidBody_upcast_1:zA,_emscripten_bind_btRigidBody_updateInertiaTensor_0:Mj,_emscripten_bind_btRotationalLimitMotor___destroy___0:TD,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0:yy,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1:Ew,_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0:hC,_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0:RG,_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0:GF,_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0:VG,_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0:bH,_emscripten_bind_btRotationalLimitMotor_isLimited_0:yx,_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0:Rz,_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1:CA,_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1:mG,_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1:MG,_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1:RF,_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1:lG,_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0:px,_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0:hj,_emscripten_bind_btSliderConstraint___destroy___0:px,_emscripten_bind_btSliderConstraint_btSliderConstraint_3:oe,_emscripten_bind_btSliderConstraint_btSliderConstraint_5:vf,_emscripten_bind_btSliderConstraint_enableFeedback_1:mz,_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btSliderConstraint_getParam_2:Rv,_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btSliderConstraint_setLowerAngLimit_1:Vy,_emscripten_bind_btSliderConstraint_setLowerLinLimit_1:Uy,_emscripten_bind_btSliderConstraint_setParam_3:fv,_emscripten_bind_btSliderConstraint_setUpperAngLimit_1:Ty,_emscripten_bind_btSliderConstraint_setUpperLinLimit_1:Sy,_emscripten_bind_btSoftBodyArray___destroy___0:ay,_emscripten_bind_btSoftBodyArray_at_1:tw,_emscripten_bind_btSoftBodyArray_size_0:DF,_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4:_g,_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4:Qs,_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5:Od,_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10:gd,_emscripten_bind_btSoftBodyHelpers_CreatePatch_9:od,_emscripten_bind_btSoftBodyHelpers_CreateRope_5:Lg,_emscripten_bind_btSoftBodyHelpers___destroy___0:TD,_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0:FH,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0:px,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0:aq,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1:As,_emscripten_bind_btSoftBodySolver___destroy___0:px,_emscripten_bind_btSoftBodyWorldInfo___destroy___0:Xx,_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0:oz,_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0:GF,_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0:pE,_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0:oE,_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0:eG,_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0:VG,_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0:RG,_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0:XG,_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0:bH,_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1:MG,_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1:qB,_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1:pB,_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1:$r,_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1:RF,_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1:mG,_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1:cs,_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1:lG,_emscripten_bind_btSoftBody___destroy___0:px,_emscripten_bind_btSoftBody_activate_0:ju,_emscripten_bind_btSoftBody_activate_1:Ys,_emscripten_bind_btSoftBody_appendAnchor_4:Zf,_emscripten_bind_btSoftBody_appendFace_4:dv,_emscripten_bind_btSoftBody_appendLinearJoint_2:df,_emscripten_bind_btSoftBody_appendLink_4:cv,_emscripten_bind_btSoftBody_appendMaterial_0:gD,_emscripten_bind_btSoftBody_appendNode_2:$c,_emscripten_bind_btSoftBody_appendTetra_5:Sf,_emscripten_bind_btSoftBody_btSoftBody_4:Hs,_emscripten_bind_btSoftBody_checkFace_3:Lk,_emscripten_bind_btSoftBody_checkLink_2:Wl,_emscripten_bind_btSoftBody_forceActivationState_1:FB,_emscripten_bind_btSoftBody_generateBendingConstraints_2:_c,_emscripten_bind_btSoftBody_generateClusters_1:xz,_emscripten_bind_btSoftBody_generateClusters_2:Qx,_emscripten_bind_btSoftBody_getCollisionFlags_0:JD,_emscripten_bind_btSoftBody_getCollisionShape_0:ID,_emscripten_bind_btSoftBody_getTotalMass_0:tp,_emscripten_bind_btSoftBody_getUserIndex_0:nE,_emscripten_bind_btSoftBody_getUserPointer_0:cE,_emscripten_bind_btSoftBody_getWorldTransform_0:fF,_emscripten_bind_btSoftBody_get_m_anchors_0:kH,_emscripten_bind_btSoftBody_get_m_cfg_0:EH,_emscripten_bind_btSoftBody_get_m_faces_0:tH,_emscripten_bind_btSoftBody_get_m_links_0:sH,_emscripten_bind_btSoftBody_get_m_materials_0:aH,_emscripten_bind_btSoftBody_get_m_nodes_0:rH,_emscripten_bind_btSoftBody_isActive_0:ZA,_emscripten_bind_btSoftBody_isKinematicObject_0:Ry,_emscripten_bind_btSoftBody_isStaticObject_0:Kz,_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btSoftBody_rotate_1:ck,_emscripten_bind_btSoftBody_scale_1:Ve,_emscripten_bind_btSoftBody_setActivationState_1:uw,_emscripten_bind_btSoftBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btSoftBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btSoftBody_setCollisionFlags_1:wz,_emscripten_bind_btSoftBody_setCollisionShape_1:sx,_emscripten_bind_btSoftBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btSoftBody_setFriction_1:YA,_emscripten_bind_btSoftBody_setMass_2:Ku,_emscripten_bind_btSoftBody_setRestitution_1:oA,_emscripten_bind_btSoftBody_setRollingFriction_1:Fz,_emscripten_bind_btSoftBody_setTotalMass_2:lh,_emscripten_bind_btSoftBody_setUserIndex_1:tA,_emscripten_bind_btSoftBody_setUserPointer_1:Wz,_emscripten_bind_btSoftBody_setWorldTransform_1:cy,_emscripten_bind_btSoftBody_set_m_anchors_1:xx,_emscripten_bind_btSoftBody_set_m_cfg_1:yA,_emscripten_bind_btSoftBody_set_m_faces_1:Wx,_emscripten_bind_btSoftBody_set_m_links_1:Vx,_emscripten_bind_btSoftBody_set_m_materials_1:dx,_emscripten_bind_btSoftBody_set_m_nodes_1:Ux,_emscripten_bind_btSoftBody_transform_1:sA,_emscripten_bind_btSoftBody_translate_1:em,_emscripten_bind_btSoftBody_upcast_1:JA,_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0:px,_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1:Jx,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3:ij,_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5:zf,_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2:tn,_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0:Yo,_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0:Ez,_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0:LB,_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3:$u,_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1:ox,_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1:ol,_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btSphereShape___destroy___0:px,_emscripten_bind_btSphereShape_btSphereShape_1:by,_emscripten_bind_btSphereShape_calculateLocalInertia_2:Nv,_emscripten_bind_btSphereShape_getLocalScaling_0:Oz,_emscripten_bind_btSphereShape_getMargin_0:pA,_emscripten_bind_btSphereShape_setLocalScaling_1:Cx,_emscripten_bind_btSphereShape_setMargin_1:Ay,_emscripten_bind_btStaticPlaneShape___destroy___0:px,_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2:Vl,_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2:Nv,_emscripten_bind_btStaticPlaneShape_getLocalScaling_0:Oz,_emscripten_bind_btStaticPlaneShape_setLocalScaling_1:Cx,_emscripten_bind_btStridingMeshInterface___destroy___0:px,_emscripten_bind_btTransform___destroy___0:TD,_emscripten_bind_btTransform_btTransform_0:eI,_emscripten_bind_btTransform_btTransform_2:Iv,_emscripten_bind_btTransform_getBasis_0:qH,_emscripten_bind_btTransform_getOrigin_0:BE,_emscripten_bind_btTransform_getRotation_0:vp,_emscripten_bind_btTransform_setFromOpenGLMatrix_1:nz,_emscripten_bind_btTransform_setIdentity_0:jE,_emscripten_bind_btTransform_setOrigin_1:xA,_emscripten_bind_btTransform_setRotation_1:IA,_emscripten_bind_btTriangleMeshShape___destroy___0:px,_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btTriangleMesh___destroy___0:px,_emscripten_bind_btTriangleMesh_addTriangle_3:Un,_emscripten_bind_btTriangleMesh_addTriangle_4:In,_emscripten_bind_btTriangleMesh_btTriangleMesh_0:rx,_emscripten_bind_btTriangleMesh_btTriangleMesh_1:ew,_emscripten_bind_btTriangleMesh_btTriangleMesh_2:mv,_emscripten_bind_btTypedConstraint___destroy___0:px,_emscripten_bind_btTypedConstraint_enableFeedback_1:mz,_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btTypedConstraint_getParam_2:Rv,_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btTypedConstraint_setParam_3:fv,_emscripten_bind_btVector3___destroy___0:QB,_emscripten_bind_btVector3_btVector3_0:UH,_emscripten_bind_btVector3_btVector3_3:vq,_emscripten_bind_btVector3_dot_1:Kt,_emscripten_bind_btVector3_length_0:wy,_emscripten_bind_btVector3_normalize_0:AF,_emscripten_bind_btVector3_op_add_1:fD,_emscripten_bind_btVector3_op_mul_1:iu,_emscripten_bind_btVector3_op_sub_1:eD,_emscripten_bind_btVector3_rotate_2:gp,_emscripten_bind_btVector3_setValue_3:hr,_emscripten_bind_btVector3_setX_1:mE,_emscripten_bind_btVector3_setY_1:lE,_emscripten_bind_btVector3_setZ_1:kE,_emscripten_bind_btVector3_x_0:ZF,_emscripten_bind_btVector3_y_0:zE,_emscripten_bind_btVector3_z_0:yE,_emscripten_bind_btVector4___destroy___0:QB,_emscripten_bind_btVector4_btVector4_0:UH,_emscripten_bind_btVector4_btVector4_4:pp,_emscripten_bind_btVector4_dot_1:Kt,_emscripten_bind_btVector4_length_0:wy,_emscripten_bind_btVector4_normalize_0:AF,_emscripten_bind_btVector4_op_add_1:fD,_emscripten_bind_btVector4_op_mul_1:iu,_emscripten_bind_btVector4_op_sub_1:eD,_emscripten_bind_btVector4_rotate_2:fp,_emscripten_bind_btVector4_setValue_4:Tp,_emscripten_bind_btVector4_setX_1:mE,_emscripten_bind_btVector4_setY_1:lE,_emscripten_bind_btVector4_setZ_1:kE,_emscripten_bind_btVector4_w_0:AE,_emscripten_bind_btVector4_x_0:ZF,_emscripten_bind_btVector4_y_0:zE,_emscripten_bind_btVector4_z_0:yE,_emscripten_bind_btVehicleRaycasterResult___destroy___0:TD,_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0:TG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0:XG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0:gJ,_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1:RE,_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1:cs,_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1:Gs,_emscripten_bind_btVehicleRaycaster___destroy___0:px,_emscripten_bind_btVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btVehicleTuning_btVehicleTuning_0:Ky,_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0:UG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0:SG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0:VG,_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0:RG,_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0:bH,_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0:GF,_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1:bF,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1:QE,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1:RF,_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1:mG,_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1:lG,_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1:MG,_emscripten_bind_btWheelInfoConstructionInfo___destroy___0:TD,_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0:oB,_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0:gJ,_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0:OF,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0:LG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0:gG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0:HG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0:DG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0:iH,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0:XG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0:hG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0:CG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0:rG,_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1:Vz,_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1:Gs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1:PD,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1:YE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1:eE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1:kF,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1:FE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1:Sr,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1:cs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1:fE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1:EE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1:rE,_emscripten_bind_btWheelInfo___destroy___0:TD,_emscripten_bind_btWheelInfo_btWheelInfo_1:$w,_emscripten_bind_btWheelInfo_getSuspensionRestLength_0:iE,_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0:sD,_emscripten_bind_btWheelInfo_get_m_brake_0:FF,_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0:lF,_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0:gC,_emscripten_bind_btWheelInfo_get_m_deltaRotation_0:ME,_emscripten_bind_btWheelInfo_get_m_engineForce_0:eF,_emscripten_bind_btWheelInfo_get_m_frictionSlip_0:_E,_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0:bE,_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0:HD,_emscripten_bind_btWheelInfo_get_m_raycastInfo_0:gJ,_emscripten_bind_btWheelInfo_get_m_rollInfluence_0:LE,_emscripten_bind_btWheelInfo_get_m_rotation_0:uF,_emscripten_bind_btWheelInfo_get_m_skidInfo_0:tF,_emscripten_bind_btWheelInfo_get_m_steering_0:sF,_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0:PC,_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0:iE,_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0:UD,_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0:uG,_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0:SF,_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0:_C,_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0:dD,_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0:ZE,_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0:GD,_emscripten_bind_btWheelInfo_get_m_worldTransform_0:MH,_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1:tB,_emscripten_bind_btWheelInfo_set_m_brake_1:cD,_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1:Jr,_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1:jA,_emscripten_bind_btWheelInfo_set_m_deltaRotation_1:UB,_emscripten_bind_btWheelInfo_set_m_engineForce_1:rC,_emscripten_bind_btWheelInfo_set_m_frictionSlip_1:fC,_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1:sB,_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1:gB,_emscripten_bind_btWheelInfo_set_m_raycastInfo_1:Et,_emscripten_bind_btWheelInfo_set_m_rollInfluence_1:TB,_emscripten_bind_btWheelInfo_set_m_rotation_1:OC,_emscripten_bind_btWheelInfo_set_m_skidInfo_1:NC,_emscripten_bind_btWheelInfo_set_m_steering_1:MC,_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1:dC,_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1:fB,_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1:nB,_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1:_r,_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1:Rr,_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1:PA,_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1:XA,_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1:eC,_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1:yC,_emscripten_bind_btWheelInfo_set_m_worldTransform_1:gA,_emscripten_bind_btWheelInfo_updateWheel_2:Zi,_emscripten_bind_tAnchorArray___destroy___0:ay,_emscripten_bind_tAnchorArray_at_1:ls,_emscripten_bind_tAnchorArray_clear_0:qC,_emscripten_bind_tAnchorArray_pop_back_0:HA,_emscripten_bind_tAnchorArray_push_back_1:Tx,_emscripten_bind_tAnchorArray_size_0:DF,_emscripten_bind_tFaceArray___destroy___0:ay,_emscripten_bind_tFaceArray_at_1:Nx,_emscripten_bind_tFaceArray_size_0:DF,_emscripten_bind_tLinkArray___destroy___0:ay,_emscripten_bind_tLinkArray_at_1:Mx,_emscripten_bind_tLinkArray_size_0:DF,_emscripten_bind_tMaterialArray___destroy___0:ay,_emscripten_bind_tMaterialArray_at_1:tw,_emscripten_bind_tMaterialArray_size_0:DF,_emscripten_bind_tNodeArray___destroy___0:ay,_emscripten_bind_tNodeArray_at_1:Lx,_emscripten_bind_tNodeArray_size_0:DF,_emscripten_enum_PHY_ScalarType_PHY_DOUBLE:RI,_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88:FI,_emscripten_enum_PHY_ScalarType_PHY_FLOAT:kJ,_emscripten_enum_PHY_ScalarType_PHY_INTEGER:QI,_emscripten_enum_PHY_ScalarType_PHY_SHORT:TI,_emscripten_enum_PHY_ScalarType_PHY_UCHAR:SI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM:TI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP:RI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM:FI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP:QI,_free:Cd,_i64Add:Ow,_i64Subtract:sw,_llvm_bswap_i16:JH,_llvm_bswap_i32:KB,_malloc:sc,_memcpy:gi,_memmove:$p,_memset:Yk,_sbrk:_o,dynCall_di:dG,dynCall_did:ED,dynCall_diidii:zv,dynCall_diii:vz,dynCall_diiidii:hu,dynCall_diiii:Yw,dynCall_diiiii:lv,dynCall_diiiiiiii:bs,dynCall_diiiiiiiii:or,dynCall_diiiiiiiiii:zq,dynCall_ii:IF,dynCall_iidid:Hx,dynCall_iii:SB,dynCall_iiid:Qz,dynCall_iiii:az,dynCall_iiiii:Jw,dynCall_iiiiii:gv,dynCall_iiiiiii:Qt,dynCall_iiiiiiiii:Yr,dynCall_iiiiiiiiiii:xq,dynCall_v:PI,dynCall_vi:eH,dynCall_vid:wE,dynCall_vidd:yB,dynCall_viddiii:Xu,dynCall_vidi:NA,dynCall_vidii:gy,dynCall_vii:DD,dynCall_viid:WA,dynCall_viidi:fy,dynCall_viidii:Xv,dynCall_viii:eA,dynCall_viiid:$x,dynCall_viiidii:Hu,dynCall_viiii:kx,dynCall_viiiid:Wv,dynCall_viiiidddddidi:fq,dynCall_viiiiddddiid:Kq,dynCall_viiiii:Ev,dynCall_viiiiid:Gu,dynCall_viiiiii:ou,dynCall_viiiiiii:ft,dynCall_viiiiiiiii:zr,dynCall_viiiiiiiiii:Nq,establishStackSpace:tG,getTempRet0:hJ,runPostSets:hI,setTempRet0:dJ,setThrew:rD,stackAlloc:rA,stackRestore:bJ,stackSave:iJ}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var __GLOBAL__sub_I_btConeTwistConstraint_cpp=Module["__GLOBAL__sub_I_btConeTwistConstraint_cpp"]=asm["__GLOBAL__sub_I_btConeTwistConstraint_cpp"];var __GLOBAL__sub_I_btQuickprof_cpp=Module["__GLOBAL__sub_I_btQuickprof_cpp"]=asm["__GLOBAL__sub_I_btQuickprof_cpp"];var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _emscripten_bind_Anchor___destroy___0=Module["_emscripten_bind_Anchor___destroy___0"]=asm["_emscripten_bind_Anchor___destroy___0"];var _emscripten_bind_Anchor_get_m_body_0=Module["_emscripten_bind_Anchor_get_m_body_0"]=asm["_emscripten_bind_Anchor_get_m_body_0"];var _emscripten_bind_Anchor_get_m_c0_0=Module["_emscripten_bind_Anchor_get_m_c0_0"]=asm["_emscripten_bind_Anchor_get_m_c0_0"];var _emscripten_bind_Anchor_get_m_c1_0=Module["_emscripten_bind_Anchor_get_m_c1_0"]=asm["_emscripten_bind_Anchor_get_m_c1_0"];var _emscripten_bind_Anchor_get_m_c2_0=Module["_emscripten_bind_Anchor_get_m_c2_0"]=asm["_emscripten_bind_Anchor_get_m_c2_0"];var _emscripten_bind_Anchor_get_m_influence_0=Module["_emscripten_bind_Anchor_get_m_influence_0"]=asm["_emscripten_bind_Anchor_get_m_influence_0"];var _emscripten_bind_Anchor_get_m_local_0=Module["_emscripten_bind_Anchor_get_m_local_0"]=asm["_emscripten_bind_Anchor_get_m_local_0"];var _emscripten_bind_Anchor_get_m_node_0=Module["_emscripten_bind_Anchor_get_m_node_0"]=asm["_emscripten_bind_Anchor_get_m_node_0"];var _emscripten_bind_Anchor_set_m_body_1=Module["_emscripten_bind_Anchor_set_m_body_1"]=asm["_emscripten_bind_Anchor_set_m_body_1"];var _emscripten_bind_Anchor_set_m_c0_1=Module["_emscripten_bind_Anchor_set_m_c0_1"]=asm["_emscripten_bind_Anchor_set_m_c0_1"];var _emscripten_bind_Anchor_set_m_c1_1=Module["_emscripten_bind_Anchor_set_m_c1_1"]=asm["_emscripten_bind_Anchor_set_m_c1_1"];var _emscripten_bind_Anchor_set_m_c2_1=Module["_emscripten_bind_Anchor_set_m_c2_1"]=asm["_emscripten_bind_Anchor_set_m_c2_1"];var _emscripten_bind_Anchor_set_m_influence_1=Module["_emscripten_bind_Anchor_set_m_influence_1"]=asm["_emscripten_bind_Anchor_set_m_influence_1"];var _emscripten_bind_Anchor_set_m_local_1=Module["_emscripten_bind_Anchor_set_m_local_1"]=asm["_emscripten_bind_Anchor_set_m_local_1"];var _emscripten_bind_Anchor_set_m_node_1=Module["_emscripten_bind_Anchor_set_m_node_1"]=asm["_emscripten_bind_Anchor_set_m_node_1"];var _emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=Module["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"]=asm["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"];var _emscripten_bind_ClosestConvexResultCallback___destroy___0=Module["_emscripten_bind_ClosestConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestConvexResultCallback___destroy___0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_hasHit_0=Module["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"];var _emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=Module["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"]=asm["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"];var _emscripten_bind_ClosestRayResultCallback___destroy___0=Module["_emscripten_bind_ClosestRayResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestRayResultCallback___destroy___0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"];var _emscripten_bind_ClosestRayResultCallback_hasHit_0=Module["_emscripten_bind_ClosestRayResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestRayResultCallback_hasHit_0"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"];var _emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=Module["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"]=asm["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"];var _emscripten_bind_ConcreteContactResultCallback___destroy___0=Module["_emscripten_bind_ConcreteContactResultCallback___destroy___0"]=asm["_emscripten_bind_ConcreteContactResultCallback___destroy___0"];var _emscripten_bind_ConcreteContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"];var _emscripten_bind_Config___destroy___0=Module["_emscripten_bind_Config___destroy___0"]=asm["_emscripten_bind_Config___destroy___0"];var _emscripten_bind_Config_get_citerations_0=Module["_emscripten_bind_Config_get_citerations_0"]=asm["_emscripten_bind_Config_get_citerations_0"];var _emscripten_bind_Config_get_collisions_0=Module["_emscripten_bind_Config_get_collisions_0"]=asm["_emscripten_bind_Config_get_collisions_0"];var _emscripten_bind_Config_get_diterations_0=Module["_emscripten_bind_Config_get_diterations_0"]=asm["_emscripten_bind_Config_get_diterations_0"];var _emscripten_bind_Config_get_kAHR_0=Module["_emscripten_bind_Config_get_kAHR_0"]=asm["_emscripten_bind_Config_get_kAHR_0"];var _emscripten_bind_Config_get_kCHR_0=Module["_emscripten_bind_Config_get_kCHR_0"]=asm["_emscripten_bind_Config_get_kCHR_0"];var _emscripten_bind_Config_get_kDF_0=Module["_emscripten_bind_Config_get_kDF_0"]=asm["_emscripten_bind_Config_get_kDF_0"];var _emscripten_bind_Config_get_kDG_0=Module["_emscripten_bind_Config_get_kDG_0"]=asm["_emscripten_bind_Config_get_kDG_0"];var _emscripten_bind_Config_get_kDP_0=Module["_emscripten_bind_Config_get_kDP_0"]=asm["_emscripten_bind_Config_get_kDP_0"];var _emscripten_bind_Config_get_kKHR_0=Module["_emscripten_bind_Config_get_kKHR_0"]=asm["_emscripten_bind_Config_get_kKHR_0"];var _emscripten_bind_Config_get_kLF_0=Module["_emscripten_bind_Config_get_kLF_0"]=asm["_emscripten_bind_Config_get_kLF_0"];var _emscripten_bind_Config_get_kMT_0=Module["_emscripten_bind_Config_get_kMT_0"]=asm["_emscripten_bind_Config_get_kMT_0"];var _emscripten_bind_Config_get_kPR_0=Module["_emscripten_bind_Config_get_kPR_0"]=asm["_emscripten_bind_Config_get_kPR_0"];var _emscripten_bind_Config_get_kSHR_0=Module["_emscripten_bind_Config_get_kSHR_0"]=asm["_emscripten_bind_Config_get_kSHR_0"];var _emscripten_bind_Config_get_kSKHR_CL_0=Module["_emscripten_bind_Config_get_kSKHR_CL_0"]=asm["_emscripten_bind_Config_get_kSKHR_CL_0"];var _emscripten_bind_Config_get_kSK_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSK_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSK_SPLT_CL_0"];var _emscripten_bind_Config_get_kSRHR_CL_0=Module["_emscripten_bind_Config_get_kSRHR_CL_0"]=asm["_emscripten_bind_Config_get_kSRHR_CL_0"];var _emscripten_bind_Config_get_kSR_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSR_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSR_SPLT_CL_0"];var _emscripten_bind_Config_get_kSSHR_CL_0=Module["_emscripten_bind_Config_get_kSSHR_CL_0"]=asm["_emscripten_bind_Config_get_kSSHR_CL_0"];var _emscripten_bind_Config_get_kSS_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSS_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSS_SPLT_CL_0"];var _emscripten_bind_Config_get_kVCF_0=Module["_emscripten_bind_Config_get_kVCF_0"]=asm["_emscripten_bind_Config_get_kVCF_0"];var _emscripten_bind_Config_get_kVC_0=Module["_emscripten_bind_Config_get_kVC_0"]=asm["_emscripten_bind_Config_get_kVC_0"];var _emscripten_bind_Config_get_maxvolume_0=Module["_emscripten_bind_Config_get_maxvolume_0"]=asm["_emscripten_bind_Config_get_maxvolume_0"];var _emscripten_bind_Config_get_piterations_0=Module["_emscripten_bind_Config_get_piterations_0"]=asm["_emscripten_bind_Config_get_piterations_0"];var _emscripten_bind_Config_get_timescale_0=Module["_emscripten_bind_Config_get_timescale_0"]=asm["_emscripten_bind_Config_get_timescale_0"];var _emscripten_bind_Config_get_viterations_0=Module["_emscripten_bind_Config_get_viterations_0"]=asm["_emscripten_bind_Config_get_viterations_0"];var _emscripten_bind_Config_set_citerations_1=Module["_emscripten_bind_Config_set_citerations_1"]=asm["_emscripten_bind_Config_set_citerations_1"];var _emscripten_bind_Config_set_collisions_1=Module["_emscripten_bind_Config_set_collisions_1"]=asm["_emscripten_bind_Config_set_collisions_1"];var _emscripten_bind_Config_set_diterations_1=Module["_emscripten_bind_Config_set_diterations_1"]=asm["_emscripten_bind_Config_set_diterations_1"];var _emscripten_bind_Config_set_kAHR_1=Module["_emscripten_bind_Config_set_kAHR_1"]=asm["_emscripten_bind_Config_set_kAHR_1"];var _emscripten_bind_Config_set_kCHR_1=Module["_emscripten_bind_Config_set_kCHR_1"]=asm["_emscripten_bind_Config_set_kCHR_1"];var _emscripten_bind_Config_set_kDF_1=Module["_emscripten_bind_Config_set_kDF_1"]=asm["_emscripten_bind_Config_set_kDF_1"];var _emscripten_bind_Config_set_kDG_1=Module["_emscripten_bind_Config_set_kDG_1"]=asm["_emscripten_bind_Config_set_kDG_1"];var _emscripten_bind_Config_set_kDP_1=Module["_emscripten_bind_Config_set_kDP_1"]=asm["_emscripten_bind_Config_set_kDP_1"];var _emscripten_bind_Config_set_kKHR_1=Module["_emscripten_bind_Config_set_kKHR_1"]=asm["_emscripten_bind_Config_set_kKHR_1"];var _emscripten_bind_Config_set_kLF_1=Module["_emscripten_bind_Config_set_kLF_1"]=asm["_emscripten_bind_Config_set_kLF_1"];var _emscripten_bind_Config_set_kMT_1=Module["_emscripten_bind_Config_set_kMT_1"]=asm["_emscripten_bind_Config_set_kMT_1"];var _emscripten_bind_Config_set_kPR_1=Module["_emscripten_bind_Config_set_kPR_1"]=asm["_emscripten_bind_Config_set_kPR_1"];var _emscripten_bind_Config_set_kSHR_1=Module["_emscripten_bind_Config_set_kSHR_1"]=asm["_emscripten_bind_Config_set_kSHR_1"];var _emscripten_bind_Config_set_kSKHR_CL_1=Module["_emscripten_bind_Config_set_kSKHR_CL_1"]=asm["_emscripten_bind_Config_set_kSKHR_CL_1"];var _emscripten_bind_Config_set_kSK_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSK_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSK_SPLT_CL_1"];var _emscripten_bind_Config_set_kSRHR_CL_1=Module["_emscripten_bind_Config_set_kSRHR_CL_1"]=asm["_emscripten_bind_Config_set_kSRHR_CL_1"];var _emscripten_bind_Config_set_kSR_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSR_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSR_SPLT_CL_1"];var _emscripten_bind_Config_set_kSSHR_CL_1=Module["_emscripten_bind_Config_set_kSSHR_CL_1"]=asm["_emscripten_bind_Config_set_kSSHR_CL_1"];var _emscripten_bind_Config_set_kSS_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSS_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSS_SPLT_CL_1"];var _emscripten_bind_Config_set_kVCF_1=Module["_emscripten_bind_Config_set_kVCF_1"]=asm["_emscripten_bind_Config_set_kVCF_1"];var _emscripten_bind_Config_set_kVC_1=Module["_emscripten_bind_Config_set_kVC_1"]=asm["_emscripten_bind_Config_set_kVC_1"];var _emscripten_bind_Config_set_maxvolume_1=Module["_emscripten_bind_Config_set_maxvolume_1"]=asm["_emscripten_bind_Config_set_maxvolume_1"];var _emscripten_bind_Config_set_piterations_1=Module["_emscripten_bind_Config_set_piterations_1"]=asm["_emscripten_bind_Config_set_piterations_1"];var _emscripten_bind_Config_set_timescale_1=Module["_emscripten_bind_Config_set_timescale_1"]=asm["_emscripten_bind_Config_set_timescale_1"];var _emscripten_bind_Config_set_viterations_1=Module["_emscripten_bind_Config_set_viterations_1"]=asm["_emscripten_bind_Config_set_viterations_1"];var _emscripten_bind_ContactResultCallback___destroy___0=Module["_emscripten_bind_ContactResultCallback___destroy___0"]=asm["_emscripten_bind_ContactResultCallback___destroy___0"];var _emscripten_bind_ContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ContactResultCallback_addSingleResult_7"];var _emscripten_bind_ConvexResultCallback___destroy___0=Module["_emscripten_bind_ConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ConvexResultCallback___destroy___0"];var _emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ConvexResultCallback_hasHit_0=Module["_emscripten_bind_ConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ConvexResultCallback_hasHit_0"];var _emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_Face___destroy___0=Module["_emscripten_bind_Face___destroy___0"]=asm["_emscripten_bind_Face___destroy___0"];var _emscripten_bind_Face_get_m_n_1=Module["_emscripten_bind_Face_get_m_n_1"]=asm["_emscripten_bind_Face_get_m_n_1"];var _emscripten_bind_Face_get_m_normal_0=Module["_emscripten_bind_Face_get_m_normal_0"]=asm["_emscripten_bind_Face_get_m_normal_0"];var _emscripten_bind_Face_set_m_n_2=Module["_emscripten_bind_Face_set_m_n_2"]=asm["_emscripten_bind_Face_set_m_n_2"];var _emscripten_bind_Face_set_m_normal_1=Module["_emscripten_bind_Face_set_m_normal_1"]=asm["_emscripten_bind_Face_set_m_normal_1"];var _emscripten_bind_Joint___destroy___0=Module["_emscripten_bind_Joint___destroy___0"]=asm["_emscripten_bind_Joint___destroy___0"];var _emscripten_bind_Joint_get_m_cfm_0=Module["_emscripten_bind_Joint_get_m_cfm_0"]=asm["_emscripten_bind_Joint_get_m_cfm_0"];var _emscripten_bind_Joint_get_m_delete_0=Module["_emscripten_bind_Joint_get_m_delete_0"]=asm["_emscripten_bind_Joint_get_m_delete_0"];var _emscripten_bind_Joint_get_m_drift_0=Module["_emscripten_bind_Joint_get_m_drift_0"]=asm["_emscripten_bind_Joint_get_m_drift_0"];var _emscripten_bind_Joint_get_m_erp_0=Module["_emscripten_bind_Joint_get_m_erp_0"]=asm["_emscripten_bind_Joint_get_m_erp_0"];var _emscripten_bind_Joint_get_m_massmatrix_0=Module["_emscripten_bind_Joint_get_m_massmatrix_0"]=asm["_emscripten_bind_Joint_get_m_massmatrix_0"];var _emscripten_bind_Joint_get_m_refs_1=Module["_emscripten_bind_Joint_get_m_refs_1"]=asm["_emscripten_bind_Joint_get_m_refs_1"];var _emscripten_bind_Joint_get_m_sdrift_0=Module["_emscripten_bind_Joint_get_m_sdrift_0"]=asm["_emscripten_bind_Joint_get_m_sdrift_0"];var _emscripten_bind_Joint_get_m_split_0=Module["_emscripten_bind_Joint_get_m_split_0"]=asm["_emscripten_bind_Joint_get_m_split_0"];var _emscripten_bind_Joint_set_m_cfm_1=Module["_emscripten_bind_Joint_set_m_cfm_1"]=asm["_emscripten_bind_Joint_set_m_cfm_1"];var _emscripten_bind_Joint_set_m_delete_1=Module["_emscripten_bind_Joint_set_m_delete_1"]=asm["_emscripten_bind_Joint_set_m_delete_1"];var _emscripten_bind_Joint_set_m_drift_1=Module["_emscripten_bind_Joint_set_m_drift_1"]=asm["_emscripten_bind_Joint_set_m_drift_1"];var _emscripten_bind_Joint_set_m_erp_1=Module["_emscripten_bind_Joint_set_m_erp_1"]=asm["_emscripten_bind_Joint_set_m_erp_1"];var _emscripten_bind_Joint_set_m_massmatrix_1=Module["_emscripten_bind_Joint_set_m_massmatrix_1"]=asm["_emscripten_bind_Joint_set_m_massmatrix_1"];var _emscripten_bind_Joint_set_m_refs_2=Module["_emscripten_bind_Joint_set_m_refs_2"]=asm["_emscripten_bind_Joint_set_m_refs_2"];var _emscripten_bind_Joint_set_m_sdrift_1=Module["_emscripten_bind_Joint_set_m_sdrift_1"]=asm["_emscripten_bind_Joint_set_m_sdrift_1"];var _emscripten_bind_Joint_set_m_split_1=Module["_emscripten_bind_Joint_set_m_split_1"]=asm["_emscripten_bind_Joint_set_m_split_1"];var _emscripten_bind_LJoint___destroy___0=Module["_emscripten_bind_LJoint___destroy___0"]=asm["_emscripten_bind_LJoint___destroy___0"];var _emscripten_bind_LJoint_get_m_rpos_1=Module["_emscripten_bind_LJoint_get_m_rpos_1"]=asm["_emscripten_bind_LJoint_get_m_rpos_1"];var _emscripten_bind_LJoint_set_m_rpos_2=Module["_emscripten_bind_LJoint_set_m_rpos_2"]=asm["_emscripten_bind_LJoint_set_m_rpos_2"];var _emscripten_bind_Link___destroy___0=Module["_emscripten_bind_Link___destroy___0"]=asm["_emscripten_bind_Link___destroy___0"];var _emscripten_bind_Link_get_m_n_1=Module["_emscripten_bind_Link_get_m_n_1"]=asm["_emscripten_bind_Link_get_m_n_1"];var _emscripten_bind_Link_set_m_n_2=Module["_emscripten_bind_Link_set_m_n_2"]=asm["_emscripten_bind_Link_set_m_n_2"];var _emscripten_bind_LocalConvexResult_LocalConvexResult_5=Module["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"]=asm["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"];var _emscripten_bind_LocalConvexResult___destroy___0=Module["_emscripten_bind_LocalConvexResult___destroy___0"]=asm["_emscripten_bind_LocalConvexResult___destroy___0"];var _emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"];var _emscripten_bind_LocalConvexResult_get_m_hitFraction_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"];var _emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=Module["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"];var _emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"];var _emscripten_bind_LocalConvexResult_set_m_hitFraction_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"];var _emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=Module["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"];var _emscripten_bind_LocalShapeInfo___destroy___0=Module["_emscripten_bind_LocalShapeInfo___destroy___0"]=asm["_emscripten_bind_LocalShapeInfo___destroy___0"];var _emscripten_bind_LocalShapeInfo_get_m_shapePart_0=Module["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"];var _emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=Module["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"];var _emscripten_bind_LocalShapeInfo_set_m_shapePart_1=Module["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"];var _emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=Module["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"];var _emscripten_bind_Material___destroy___0=Module["_emscripten_bind_Material___destroy___0"]=asm["_emscripten_bind_Material___destroy___0"];var _emscripten_bind_Material_get_m_flags_0=Module["_emscripten_bind_Material_get_m_flags_0"]=asm["_emscripten_bind_Material_get_m_flags_0"];var _emscripten_bind_Material_get_m_kAST_0=Module["_emscripten_bind_Material_get_m_kAST_0"]=asm["_emscripten_bind_Material_get_m_kAST_0"];var _emscripten_bind_Material_get_m_kLST_0=Module["_emscripten_bind_Material_get_m_kLST_0"]=asm["_emscripten_bind_Material_get_m_kLST_0"];var _emscripten_bind_Material_get_m_kVST_0=Module["_emscripten_bind_Material_get_m_kVST_0"]=asm["_emscripten_bind_Material_get_m_kVST_0"];var _emscripten_bind_Material_set_m_flags_1=Module["_emscripten_bind_Material_set_m_flags_1"]=asm["_emscripten_bind_Material_set_m_flags_1"];var _emscripten_bind_Material_set_m_kAST_1=Module["_emscripten_bind_Material_set_m_kAST_1"]=asm["_emscripten_bind_Material_set_m_kAST_1"];var _emscripten_bind_Material_set_m_kLST_1=Module["_emscripten_bind_Material_set_m_kLST_1"]=asm["_emscripten_bind_Material_set_m_kLST_1"];var _emscripten_bind_Material_set_m_kVST_1=Module["_emscripten_bind_Material_set_m_kVST_1"]=asm["_emscripten_bind_Material_set_m_kVST_1"];var _emscripten_bind_Node___destroy___0=Module["_emscripten_bind_Node___destroy___0"]=asm["_emscripten_bind_Node___destroy___0"];var _emscripten_bind_Node_get_m_n_0=Module["_emscripten_bind_Node_get_m_n_0"]=asm["_emscripten_bind_Node_get_m_n_0"];var _emscripten_bind_Node_get_m_x_0=Module["_emscripten_bind_Node_get_m_x_0"]=asm["_emscripten_bind_Node_get_m_x_0"];var _emscripten_bind_Node_set_m_n_1=Module["_emscripten_bind_Node_set_m_n_1"]=asm["_emscripten_bind_Node_set_m_n_1"];var _emscripten_bind_Node_set_m_x_1=Module["_emscripten_bind_Node_set_m_x_1"]=asm["_emscripten_bind_Node_set_m_x_1"];var _emscripten_bind_RayResultCallback___destroy___0=Module["_emscripten_bind_RayResultCallback___destroy___0"]=asm["_emscripten_bind_RayResultCallback___destroy___0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_RayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_RayResultCallback_hasHit_0=Module["_emscripten_bind_RayResultCallback_hasHit_0"]=asm["_emscripten_bind_RayResultCallback_hasHit_0"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_RayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_RaycastInfo___destroy___0=Module["_emscripten_bind_RaycastInfo___destroy___0"]=asm["_emscripten_bind_RaycastInfo___destroy___0"];var _emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"];var _emscripten_bind_RaycastInfo_get_m_contactPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_groundObject_0=Module["_emscripten_bind_RaycastInfo_get_m_groundObject_0"]=asm["_emscripten_bind_RaycastInfo_get_m_groundObject_0"];var _emscripten_bind_RaycastInfo_get_m_hardPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_isInContact_0=Module["_emscripten_bind_RaycastInfo_get_m_isInContact_0"]=asm["_emscripten_bind_RaycastInfo_get_m_isInContact_0"];var _emscripten_bind_RaycastInfo_get_m_suspensionLength_0=Module["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"]=asm["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"];var _emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"];var _emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"];var _emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"];var _emscripten_bind_RaycastInfo_set_m_contactPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_groundObject_1=Module["_emscripten_bind_RaycastInfo_set_m_groundObject_1"]=asm["_emscripten_bind_RaycastInfo_set_m_groundObject_1"];var _emscripten_bind_RaycastInfo_set_m_hardPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_isInContact_1=Module["_emscripten_bind_RaycastInfo_set_m_isInContact_1"]=asm["_emscripten_bind_RaycastInfo_set_m_isInContact_1"];var _emscripten_bind_RaycastInfo_set_m_suspensionLength_1=Module["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"]=asm["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"];var _emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"];var _emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"];var _emscripten_bind_Specs___destroy___0=Module["_emscripten_bind_Specs___destroy___0"]=asm["_emscripten_bind_Specs___destroy___0"];var _emscripten_bind_Specs_get_position_0=Module["_emscripten_bind_Specs_get_position_0"]=asm["_emscripten_bind_Specs_get_position_0"];var _emscripten_bind_Specs_set_position_1=Module["_emscripten_bind_Specs_set_position_1"]=asm["_emscripten_bind_Specs_set_position_1"];var _emscripten_bind_VoidPtr___destroy___0=Module["_emscripten_bind_VoidPtr___destroy___0"]=asm["_emscripten_bind_VoidPtr___destroy___0"];var _emscripten_bind_btActionInterface___destroy___0=Module["_emscripten_bind_btActionInterface___destroy___0"]=asm["_emscripten_bind_btActionInterface___destroy___0"];var _emscripten_bind_btActionInterface_updateAction_2=Module["_emscripten_bind_btActionInterface_updateAction_2"]=asm["_emscripten_bind_btActionInterface_updateAction_2"];var _emscripten_bind_btAxisSweep3___destroy___0=Module["_emscripten_bind_btAxisSweep3___destroy___0"]=asm["_emscripten_bind_btAxisSweep3___destroy___0"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_2=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_3=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_4=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_5=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"];var _emscripten_bind_btBoxShape___destroy___0=Module["_emscripten_bind_btBoxShape___destroy___0"]=asm["_emscripten_bind_btBoxShape___destroy___0"];var _emscripten_bind_btBoxShape_btBoxShape_1=Module["_emscripten_bind_btBoxShape_btBoxShape_1"]=asm["_emscripten_bind_btBoxShape_btBoxShape_1"];var _emscripten_bind_btBoxShape_calculateLocalInertia_2=Module["_emscripten_bind_btBoxShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBoxShape_calculateLocalInertia_2"];var _emscripten_bind_btBoxShape_getLocalScaling_0=Module["_emscripten_bind_btBoxShape_getLocalScaling_0"]=asm["_emscripten_bind_btBoxShape_getLocalScaling_0"];var _emscripten_bind_btBoxShape_getMargin_0=Module["_emscripten_bind_btBoxShape_getMargin_0"]=asm["_emscripten_bind_btBoxShape_getMargin_0"];var _emscripten_bind_btBoxShape_setLocalScaling_1=Module["_emscripten_bind_btBoxShape_setLocalScaling_1"]=asm["_emscripten_bind_btBoxShape_setLocalScaling_1"];var _emscripten_bind_btBoxShape_setMargin_1=Module["_emscripten_bind_btBoxShape_setMargin_1"]=asm["_emscripten_bind_btBoxShape_setMargin_1"];var _emscripten_bind_btBroadphaseInterface___destroy___0=Module["_emscripten_bind_btBroadphaseInterface___destroy___0"]=asm["_emscripten_bind_btBroadphaseInterface___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape___destroy___0=Module["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"];var _emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX___destroy___0=Module["_emscripten_bind_btCapsuleShapeX___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeX___destroy___0"];var _emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2=Module["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"]=asm["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"];var _emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeX_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeX_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeX_getMargin_0=Module["_emscripten_bind_btCapsuleShapeX_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeX_getMargin_0"];var _emscripten_bind_btCapsuleShapeX_getRadius_0=Module["_emscripten_bind_btCapsuleShapeX_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeX_getRadius_0"];var _emscripten_bind_btCapsuleShapeX_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeX_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX_setMargin_1=Module["_emscripten_bind_btCapsuleShapeX_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeX_setMargin_1"];var _emscripten_bind_btCapsuleShapeZ___destroy___0=Module["_emscripten_bind_btCapsuleShapeZ___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeZ___destroy___0"];var _emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=Module["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"]=asm["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"];var _emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeZ_getMargin_0=Module["_emscripten_bind_btCapsuleShapeZ_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getMargin_0"];var _emscripten_bind_btCapsuleShapeZ_getRadius_0=Module["_emscripten_bind_btCapsuleShapeZ_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getRadius_0"];var _emscripten_bind_btCapsuleShapeZ_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeZ_setMargin_1=Module["_emscripten_bind_btCapsuleShapeZ_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setMargin_1"];var _emscripten_bind_btCapsuleShape___destroy___0=Module["_emscripten_bind_btCapsuleShape___destroy___0"]=asm["_emscripten_bind_btCapsuleShape___destroy___0"];var _emscripten_bind_btCapsuleShape_btCapsuleShape_2=Module["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"]=asm["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"];var _emscripten_bind_btCapsuleShape_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShape_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShape_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShape_getHalfHeight_0"];var _emscripten_bind_btCapsuleShape_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShape_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShape_getLocalScaling_0"];var _emscripten_bind_btCapsuleShape_getMargin_0=Module["_emscripten_bind_btCapsuleShape_getMargin_0"]=asm["_emscripten_bind_btCapsuleShape_getMargin_0"];var _emscripten_bind_btCapsuleShape_getRadius_0=Module["_emscripten_bind_btCapsuleShape_getRadius_0"]=asm["_emscripten_bind_btCapsuleShape_getRadius_0"];var _emscripten_bind_btCapsuleShape_getUpAxis_0=Module["_emscripten_bind_btCapsuleShape_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShape_getUpAxis_0"];var _emscripten_bind_btCapsuleShape_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShape_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShape_setMargin_1=Module["_emscripten_bind_btCapsuleShape_setMargin_1"]=asm["_emscripten_bind_btCapsuleShape_setMargin_1"];var _emscripten_bind_btCollisionConfiguration___destroy___0=Module["_emscripten_bind_btCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btCollisionConfiguration___destroy___0"];var _emscripten_bind_btCollisionDispatcher___destroy___0=Module["_emscripten_bind_btCollisionDispatcher___destroy___0"]=asm["_emscripten_bind_btCollisionDispatcher___destroy___0"];var _emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=Module["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"]=asm["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"];var _emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btCollisionDispatcher_getNumManifolds_0=Module["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"];var _emscripten_bind_btCollisionObject___destroy___0=Module["_emscripten_bind_btCollisionObject___destroy___0"]=asm["_emscripten_bind_btCollisionObject___destroy___0"];var _emscripten_bind_btCollisionObject_activate_0=Module["_emscripten_bind_btCollisionObject_activate_0"]=asm["_emscripten_bind_btCollisionObject_activate_0"];var _emscripten_bind_btCollisionObject_activate_1=Module["_emscripten_bind_btCollisionObject_activate_1"]=asm["_emscripten_bind_btCollisionObject_activate_1"];var _emscripten_bind_btCollisionObject_forceActivationState_1=Module["_emscripten_bind_btCollisionObject_forceActivationState_1"]=asm["_emscripten_bind_btCollisionObject_forceActivationState_1"];var _emscripten_bind_btCollisionObject_getCollisionFlags_0=Module["_emscripten_bind_btCollisionObject_getCollisionFlags_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionFlags_0"];var _emscripten_bind_btCollisionObject_getCollisionShape_0=Module["_emscripten_bind_btCollisionObject_getCollisionShape_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionShape_0"];var _emscripten_bind_btCollisionObject_getUserIndex_0=Module["_emscripten_bind_btCollisionObject_getUserIndex_0"]=asm["_emscripten_bind_btCollisionObject_getUserIndex_0"];var _emscripten_bind_btCollisionObject_getUserPointer_0=Module["_emscripten_bind_btCollisionObject_getUserPointer_0"]=asm["_emscripten_bind_btCollisionObject_getUserPointer_0"];var _emscripten_bind_btCollisionObject_getWorldTransform_0=Module["_emscripten_bind_btCollisionObject_getWorldTransform_0"]=asm["_emscripten_bind_btCollisionObject_getWorldTransform_0"];var _emscripten_bind_btCollisionObject_isActive_0=Module["_emscripten_bind_btCollisionObject_isActive_0"]=asm["_emscripten_bind_btCollisionObject_isActive_0"];var _emscripten_bind_btCollisionObject_isKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isKinematicObject_0"];var _emscripten_bind_btCollisionObject_isStaticObject_0=Module["_emscripten_bind_btCollisionObject_isStaticObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticObject_0"];var _emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btCollisionObject_setActivationState_1=Module["_emscripten_bind_btCollisionObject_setActivationState_1"]=asm["_emscripten_bind_btCollisionObject_setActivationState_1"];var _emscripten_bind_btCollisionObject_setAnisotropicFriction_2=Module["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"];var _emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"];var _emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btCollisionObject_setCollisionFlags_1=Module["_emscripten_bind_btCollisionObject_setCollisionFlags_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionFlags_1"];var _emscripten_bind_btCollisionObject_setCollisionShape_1=Module["_emscripten_bind_btCollisionObject_setCollisionShape_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionShape_1"];var _emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"];var _emscripten_bind_btCollisionObject_setFriction_1=Module["_emscripten_bind_btCollisionObject_setFriction_1"]=asm["_emscripten_bind_btCollisionObject_setFriction_1"];var _emscripten_bind_btCollisionObject_setRestitution_1=Module["_emscripten_bind_btCollisionObject_setRestitution_1"]=asm["_emscripten_bind_btCollisionObject_setRestitution_1"];var _emscripten_bind_btCollisionObject_setRollingFriction_1=Module["_emscripten_bind_btCollisionObject_setRollingFriction_1"]=asm["_emscripten_bind_btCollisionObject_setRollingFriction_1"];var _emscripten_bind_btCollisionObject_setUserIndex_1=Module["_emscripten_bind_btCollisionObject_setUserIndex_1"]=asm["_emscripten_bind_btCollisionObject_setUserIndex_1"];var _emscripten_bind_btCollisionObject_setUserPointer_1=Module["_emscripten_bind_btCollisionObject_setUserPointer_1"]=asm["_emscripten_bind_btCollisionObject_setUserPointer_1"];var _emscripten_bind_btCollisionObject_setWorldTransform_1=Module["_emscripten_bind_btCollisionObject_setWorldTransform_1"]=asm["_emscripten_bind_btCollisionObject_setWorldTransform_1"];var _emscripten_bind_btCollisionShape___destroy___0=Module["_emscripten_bind_btCollisionShape___destroy___0"]=asm["_emscripten_bind_btCollisionShape___destroy___0"];var _emscripten_bind_btCollisionShape_calculateLocalInertia_2=Module["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"];var _emscripten_bind_btCollisionShape_getLocalScaling_0=Module["_emscripten_bind_btCollisionShape_getLocalScaling_0"]=asm["_emscripten_bind_btCollisionShape_getLocalScaling_0"];var _emscripten_bind_btCollisionShape_getMargin_0=Module["_emscripten_bind_btCollisionShape_getMargin_0"]=asm["_emscripten_bind_btCollisionShape_getMargin_0"];var _emscripten_bind_btCollisionShape_setLocalScaling_1=Module["_emscripten_bind_btCollisionShape_setLocalScaling_1"]=asm["_emscripten_bind_btCollisionShape_setLocalScaling_1"];var _emscripten_bind_btCollisionShape_setMargin_1=Module["_emscripten_bind_btCollisionShape_setMargin_1"]=asm["_emscripten_bind_btCollisionShape_setMargin_1"];var _emscripten_bind_btCollisionWorld___destroy___0=Module["_emscripten_bind_btCollisionWorld___destroy___0"]=asm["_emscripten_bind_btCollisionWorld___destroy___0"];var _emscripten_bind_btCollisionWorld_addCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_1"];var _emscripten_bind_btCollisionWorld_addCollisionObject_2=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_2"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_2"];var _emscripten_bind_btCollisionWorld_addCollisionObject_3=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_3"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_3"];var _emscripten_bind_btCollisionWorld_contactPairTest_3=Module["_emscripten_bind_btCollisionWorld_contactPairTest_3"]=asm["_emscripten_bind_btCollisionWorld_contactPairTest_3"];var _emscripten_bind_btCollisionWorld_contactTest_2=Module["_emscripten_bind_btCollisionWorld_contactTest_2"]=asm["_emscripten_bind_btCollisionWorld_contactTest_2"];var _emscripten_bind_btCollisionWorld_convexSweepTest_5=Module["_emscripten_bind_btCollisionWorld_convexSweepTest_5"]=asm["_emscripten_bind_btCollisionWorld_convexSweepTest_5"];var _emscripten_bind_btCollisionWorld_getBroadphase_0=Module["_emscripten_bind_btCollisionWorld_getBroadphase_0"]=asm["_emscripten_bind_btCollisionWorld_getBroadphase_0"];var _emscripten_bind_btCollisionWorld_getDispatchInfo_0=Module["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"];var _emscripten_bind_btCollisionWorld_getDispatcher_0=Module["_emscripten_bind_btCollisionWorld_getDispatcher_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatcher_0"];var _emscripten_bind_btCollisionWorld_getPairCache_0=Module["_emscripten_bind_btCollisionWorld_getPairCache_0"]=asm["_emscripten_bind_btCollisionWorld_getPairCache_0"];var _emscripten_bind_btCollisionWorld_rayTest_3=Module["_emscripten_bind_btCollisionWorld_rayTest_3"]=asm["_emscripten_bind_btCollisionWorld_rayTest_3"];var _emscripten_bind_btCollisionWorld_removeCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"];var _emscripten_bind_btCollisionWorld_updateSingleAabb_1=Module["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"];var _emscripten_bind_btCompoundShape___destroy___0=Module["_emscripten_bind_btCompoundShape___destroy___0"]=asm["_emscripten_bind_btCompoundShape___destroy___0"];var _emscripten_bind_btCompoundShape_addChildShape_2=Module["_emscripten_bind_btCompoundShape_addChildShape_2"]=asm["_emscripten_bind_btCompoundShape_addChildShape_2"];var _emscripten_bind_btCompoundShape_btCompoundShape_0=Module["_emscripten_bind_btCompoundShape_btCompoundShape_0"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_0"];var _emscripten_bind_btCompoundShape_btCompoundShape_1=Module["_emscripten_bind_btCompoundShape_btCompoundShape_1"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_1"];var _emscripten_bind_btCompoundShape_calculateLocalInertia_2=Module["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"];var _emscripten_bind_btCompoundShape_getChildShape_1=Module["_emscripten_bind_btCompoundShape_getChildShape_1"]=asm["_emscripten_bind_btCompoundShape_getChildShape_1"];var _emscripten_bind_btCompoundShape_getLocalScaling_0=Module["_emscripten_bind_btCompoundShape_getLocalScaling_0"]=asm["_emscripten_bind_btCompoundShape_getLocalScaling_0"];var _emscripten_bind_btCompoundShape_getMargin_0=Module["_emscripten_bind_btCompoundShape_getMargin_0"]=asm["_emscripten_bind_btCompoundShape_getMargin_0"];var _emscripten_bind_btCompoundShape_getNumChildShapes_0=Module["_emscripten_bind_btCompoundShape_getNumChildShapes_0"]=asm["_emscripten_bind_btCompoundShape_getNumChildShapes_0"];var _emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=Module["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"]=asm["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"];var _emscripten_bind_btCompoundShape_setLocalScaling_1=Module["_emscripten_bind_btCompoundShape_setLocalScaling_1"]=asm["_emscripten_bind_btCompoundShape_setLocalScaling_1"];var _emscripten_bind_btCompoundShape_setMargin_1=Module["_emscripten_bind_btCompoundShape_setMargin_1"]=asm["_emscripten_bind_btCompoundShape_setMargin_1"];var _emscripten_bind_btConcaveShape___destroy___0=Module["_emscripten_bind_btConcaveShape___destroy___0"]=asm["_emscripten_bind_btConcaveShape___destroy___0"];var _emscripten_bind_btConcaveShape_calculateLocalInertia_2=Module["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"];var _emscripten_bind_btConcaveShape_getLocalScaling_0=Module["_emscripten_bind_btConcaveShape_getLocalScaling_0"]=asm["_emscripten_bind_btConcaveShape_getLocalScaling_0"];var _emscripten_bind_btConcaveShape_setLocalScaling_1=Module["_emscripten_bind_btConcaveShape_setLocalScaling_1"]=asm["_emscripten_bind_btConcaveShape_setLocalScaling_1"];var _emscripten_bind_btConeShapeX___destroy___0=Module["_emscripten_bind_btConeShapeX___destroy___0"]=asm["_emscripten_bind_btConeShapeX___destroy___0"];var _emscripten_bind_btConeShapeX_btConeShapeX_2=Module["_emscripten_bind_btConeShapeX_btConeShapeX_2"]=asm["_emscripten_bind_btConeShapeX_btConeShapeX_2"];var _emscripten_bind_btConeShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeX_getLocalScaling_0=Module["_emscripten_bind_btConeShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeX_getLocalScaling_0"];var _emscripten_bind_btConeShapeX_setLocalScaling_1=Module["_emscripten_bind_btConeShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeX_setLocalScaling_1"];var _emscripten_bind_btConeShapeZ___destroy___0=Module["_emscripten_bind_btConeShapeZ___destroy___0"]=asm["_emscripten_bind_btConeShapeZ___destroy___0"];var _emscripten_bind_btConeShapeZ_btConeShapeZ_2=Module["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"]=asm["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"];var _emscripten_bind_btConeShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeZ_getLocalScaling_0=Module["_emscripten_bind_btConeShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeZ_getLocalScaling_0"];var _emscripten_bind_btConeShapeZ_setLocalScaling_1=Module["_emscripten_bind_btConeShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeZ_setLocalScaling_1"];var _emscripten_bind_btConeShape___destroy___0=Module["_emscripten_bind_btConeShape___destroy___0"]=asm["_emscripten_bind_btConeShape___destroy___0"];var _emscripten_bind_btConeShape_btConeShape_2=Module["_emscripten_bind_btConeShape_btConeShape_2"]=asm["_emscripten_bind_btConeShape_btConeShape_2"];var _emscripten_bind_btConeShape_calculateLocalInertia_2=Module["_emscripten_bind_btConeShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShape_calculateLocalInertia_2"];var _emscripten_bind_btConeShape_getLocalScaling_0=Module["_emscripten_bind_btConeShape_getLocalScaling_0"]=asm["_emscripten_bind_btConeShape_getLocalScaling_0"];var _emscripten_bind_btConeShape_setLocalScaling_1=Module["_emscripten_bind_btConeShape_setLocalScaling_1"]=asm["_emscripten_bind_btConeShape_setLocalScaling_1"];var _emscripten_bind_btConeTwistConstraint___destroy___0=Module["_emscripten_bind_btConeTwistConstraint___destroy___0"]=asm["_emscripten_bind_btConeTwistConstraint___destroy___0"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"];var _emscripten_bind_btConeTwistConstraint_enableFeedback_1=Module["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"];var _emscripten_bind_btConeTwistConstraint_enableMotor_1=Module["_emscripten_bind_btConeTwistConstraint_enableMotor_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableMotor_1"];var _emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btConeTwistConstraint_getParam_2=Module["_emscripten_bind_btConeTwistConstraint_getParam_2"]=asm["_emscripten_bind_btConeTwistConstraint_getParam_2"];var _emscripten_bind_btConeTwistConstraint_setAngularOnly_1=Module["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"];var _emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btConeTwistConstraint_setDamping_1=Module["_emscripten_bind_btConeTwistConstraint_setDamping_1"]=asm["_emscripten_bind_btConeTwistConstraint_setDamping_1"];var _emscripten_bind_btConeTwistConstraint_setLimit_2=Module["_emscripten_bind_btConeTwistConstraint_setLimit_2"]=asm["_emscripten_bind_btConeTwistConstraint_setLimit_2"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTarget_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"];var _emscripten_bind_btConeTwistConstraint_setParam_3=Module["_emscripten_bind_btConeTwistConstraint_setParam_3"]=asm["_emscripten_bind_btConeTwistConstraint_setParam_3"];var _emscripten_bind_btConstraintSetting___destroy___0=Module["_emscripten_bind_btConstraintSetting___destroy___0"]=asm["_emscripten_bind_btConstraintSetting___destroy___0"];var _emscripten_bind_btConstraintSetting_btConstraintSetting_0=Module["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"]=asm["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"];var _emscripten_bind_btConstraintSetting_get_m_damping_0=Module["_emscripten_bind_btConstraintSetting_get_m_damping_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_damping_0"];var _emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=Module["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"];var _emscripten_bind_btConstraintSetting_get_m_tau_0=Module["_emscripten_bind_btConstraintSetting_get_m_tau_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_tau_0"];var _emscripten_bind_btConstraintSetting_set_m_damping_1=Module["_emscripten_bind_btConstraintSetting_set_m_damping_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_damping_1"];var _emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=Module["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"];var _emscripten_bind_btConstraintSetting_set_m_tau_1=Module["_emscripten_bind_btConstraintSetting_set_m_tau_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_tau_1"];var _emscripten_bind_btConstraintSolver___destroy___0=Module["_emscripten_bind_btConstraintSolver___destroy___0"]=asm["_emscripten_bind_btConstraintSolver___destroy___0"];var _emscripten_bind_btContactSolverInfo___destroy___0=Module["_emscripten_bind_btContactSolverInfo___destroy___0"]=asm["_emscripten_bind_btContactSolverInfo___destroy___0"];var _emscripten_bind_btContactSolverInfo_get_m_numIterations_0=Module["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"];var _emscripten_bind_btContactSolverInfo_set_m_numIterations_1=Module["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"];var _emscripten_bind_btConvexHullShape___destroy___0=Module["_emscripten_bind_btConvexHullShape___destroy___0"]=asm["_emscripten_bind_btConvexHullShape___destroy___0"];var _emscripten_bind_btConvexHullShape_addPoint_1=Module["_emscripten_bind_btConvexHullShape_addPoint_1"]=asm["_emscripten_bind_btConvexHullShape_addPoint_1"];var _emscripten_bind_btConvexHullShape_addPoint_2=Module["_emscripten_bind_btConvexHullShape_addPoint_2"]=asm["_emscripten_bind_btConvexHullShape_addPoint_2"];var _emscripten_bind_btConvexHullShape_btConvexHullShape_0=Module["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"]=asm["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"];var _emscripten_bind_btConvexHullShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexHullShape_getLocalScaling_0=Module["_emscripten_bind_btConvexHullShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexHullShape_getLocalScaling_0"];var _emscripten_bind_btConvexHullShape_getMargin_0=Module["_emscripten_bind_btConvexHullShape_getMargin_0"]=asm["_emscripten_bind_btConvexHullShape_getMargin_0"];var _emscripten_bind_btConvexHullShape_setLocalScaling_1=Module["_emscripten_bind_btConvexHullShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexHullShape_setLocalScaling_1"];var _emscripten_bind_btConvexHullShape_setMargin_1=Module["_emscripten_bind_btConvexHullShape_setMargin_1"]=asm["_emscripten_bind_btConvexHullShape_setMargin_1"];var _emscripten_bind_btConvexShape___destroy___0=Module["_emscripten_bind_btConvexShape___destroy___0"]=asm["_emscripten_bind_btConvexShape___destroy___0"];var _emscripten_bind_btConvexShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexShape_getLocalScaling_0=Module["_emscripten_bind_btConvexShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexShape_getLocalScaling_0"];var _emscripten_bind_btConvexShape_getMargin_0=Module["_emscripten_bind_btConvexShape_getMargin_0"]=asm["_emscripten_bind_btConvexShape_getMargin_0"];var _emscripten_bind_btConvexShape_setLocalScaling_1=Module["_emscripten_bind_btConvexShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexShape_setLocalScaling_1"];var _emscripten_bind_btConvexShape_setMargin_1=Module["_emscripten_bind_btConvexShape_setMargin_1"]=asm["_emscripten_bind_btConvexShape_setMargin_1"];var _emscripten_bind_btConvexTriangleMeshShape___destroy___0=Module["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"];var _emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btConvexTriangleMeshShape_getMargin_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"];var _emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btConvexTriangleMeshShape_setMargin_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"];var _emscripten_bind_btCylinderShapeX___destroy___0=Module["_emscripten_bind_btCylinderShapeX___destroy___0"]=asm["_emscripten_bind_btCylinderShapeX___destroy___0"];var _emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=Module["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"]=asm["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"];var _emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeX_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeX_getMargin_0=Module["_emscripten_bind_btCylinderShapeX_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeX_getMargin_0"];var _emscripten_bind_btCylinderShapeX_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeX_setMargin_1=Module["_emscripten_bind_btCylinderShapeX_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeX_setMargin_1"];var _emscripten_bind_btCylinderShapeZ___destroy___0=Module["_emscripten_bind_btCylinderShapeZ___destroy___0"]=asm["_emscripten_bind_btCylinderShapeZ___destroy___0"];var _emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=Module["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"]=asm["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"];var _emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeZ_getMargin_0=Module["_emscripten_bind_btCylinderShapeZ_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeZ_getMargin_0"];var _emscripten_bind_btCylinderShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeZ_setMargin_1=Module["_emscripten_bind_btCylinderShapeZ_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeZ_setMargin_1"];var _emscripten_bind_btCylinderShape___destroy___0=Module["_emscripten_bind_btCylinderShape___destroy___0"]=asm["_emscripten_bind_btCylinderShape___destroy___0"];var _emscripten_bind_btCylinderShape_btCylinderShape_1=Module["_emscripten_bind_btCylinderShape_btCylinderShape_1"]=asm["_emscripten_bind_btCylinderShape_btCylinderShape_1"];var _emscripten_bind_btCylinderShape_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShape_getLocalScaling_0=Module["_emscripten_bind_btCylinderShape_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShape_getLocalScaling_0"];var _emscripten_bind_btCylinderShape_getMargin_0=Module["_emscripten_bind_btCylinderShape_getMargin_0"]=asm["_emscripten_bind_btCylinderShape_getMargin_0"];var _emscripten_bind_btCylinderShape_setLocalScaling_1=Module["_emscripten_bind_btCylinderShape_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShape_setLocalScaling_1"];var _emscripten_bind_btCylinderShape_setMargin_1=Module["_emscripten_bind_btCylinderShape_setMargin_1"]=asm["_emscripten_bind_btCylinderShape_setMargin_1"];var _emscripten_bind_btDbvtBroadphase___destroy___0=Module["_emscripten_bind_btDbvtBroadphase___destroy___0"]=asm["_emscripten_bind_btDbvtBroadphase___destroy___0"];var _emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=Module["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"]=asm["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"];var _emscripten_bind_btDefaultCollisionConfiguration___destroy___0=Module["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"];var _emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"];var _emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"];var _emscripten_bind_btDefaultMotionState___destroy___0=Module["_emscripten_bind_btDefaultMotionState___destroy___0"]=asm["_emscripten_bind_btDefaultMotionState___destroy___0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_2=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"];var _emscripten_bind_btDefaultMotionState_getWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0=Module["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"]=asm["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"];var _emscripten_bind_btDefaultMotionState_setWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=Module["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"]=asm["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"];var _emscripten_bind_btDefaultSoftBodySolver___destroy___0=Module["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"];var _emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=Module["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"]=asm["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"];var _emscripten_bind_btDefaultVehicleRaycaster___destroy___0=Module["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"];var _emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=Module["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"];var _emscripten_bind_btDefaultVehicleRaycaster_castRay_3=Module["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"];var _emscripten_bind_btDiscreteDynamicsWorld___destroy___0=Module["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"];var _emscripten_bind_btDiscreteDynamicsWorld_addAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=Module["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"];var _emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"];var _emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_setGravity_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btDispatcherInfo___destroy___0=Module["_emscripten_bind_btDispatcherInfo___destroy___0"]=asm["_emscripten_bind_btDispatcherInfo___destroy___0"];var _emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=Module["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"];var _emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0=Module["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"];var _emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=Module["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSPU_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"];var _emscripten_bind_btDispatcherInfo_get_m_stepCount_0=Module["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeStep_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"];var _emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"];var _emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"];var _emscripten_bind_btDispatcherInfo_get_m_useEpa_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"];var _emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=Module["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"];var _emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=Module["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"];var _emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=Module["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"];var _emscripten_bind_btDispatcherInfo_set_m_stepCount_1=Module["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeStep_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"];var _emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"];var _emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"];var _emscripten_bind_btDispatcherInfo_set_m_useEpa_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"];var _emscripten_bind_btDispatcher___destroy___0=Module["_emscripten_bind_btDispatcher___destroy___0"]=asm["_emscripten_bind_btDispatcher___destroy___0"];var _emscripten_bind_btDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btDispatcher_getNumManifolds_0=Module["_emscripten_bind_btDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btDispatcher_getNumManifolds_0"];var _emscripten_bind_btDynamicsWorld___destroy___0=Module["_emscripten_bind_btDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDynamicsWorld___destroy___0"];var _emscripten_bind_btDynamicsWorld_addAction_1=Module["_emscripten_bind_btDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDynamicsWorld_addAction_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDynamicsWorld_contactTest_2"];var _emscripten_bind_btDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDynamicsWorld_rayTest_3"];var _emscripten_bind_btDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDynamicsWorld_removeAction_1"];var _emscripten_bind_btDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btFixedConstraint___destroy___0=Module["_emscripten_bind_btFixedConstraint___destroy___0"]=asm["_emscripten_bind_btFixedConstraint___destroy___0"];var _emscripten_bind_btFixedConstraint_btFixedConstraint_4=Module["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"]=asm["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"];var _emscripten_bind_btFixedConstraint_enableFeedback_1=Module["_emscripten_bind_btFixedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btFixedConstraint_enableFeedback_1"];var _emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btFixedConstraint_getParam_2=Module["_emscripten_bind_btFixedConstraint_getParam_2"]=asm["_emscripten_bind_btFixedConstraint_getParam_2"];var _emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btFixedConstraint_setParam_3=Module["_emscripten_bind_btFixedConstraint_setParam_3"]=asm["_emscripten_bind_btFixedConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"];var _emscripten_bind_btGeneric6DofConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"];var _emscripten_bind_btGhostObject___destroy___0=Module["_emscripten_bind_btGhostObject___destroy___0"]=asm["_emscripten_bind_btGhostObject___destroy___0"];var _emscripten_bind_btGhostObject_activate_0=Module["_emscripten_bind_btGhostObject_activate_0"]=asm["_emscripten_bind_btGhostObject_activate_0"];var _emscripten_bind_btGhostObject_activate_1=Module["_emscripten_bind_btGhostObject_activate_1"]=asm["_emscripten_bind_btGhostObject_activate_1"];var _emscripten_bind_btGhostObject_btGhostObject_0=Module["_emscripten_bind_btGhostObject_btGhostObject_0"]=asm["_emscripten_bind_btGhostObject_btGhostObject_0"];var _emscripten_bind_btGhostObject_forceActivationState_1=Module["_emscripten_bind_btGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btGhostObject_forceActivationState_1"];var _emscripten_bind_btGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btGhostObject_getCollisionFlags_0"];var _emscripten_bind_btGhostObject_getCollisionShape_0=Module["_emscripten_bind_btGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btGhostObject_getCollisionShape_0"];var _emscripten_bind_btGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btGhostObject_getOverlappingObject_1"];var _emscripten_bind_btGhostObject_getUserIndex_0=Module["_emscripten_bind_btGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btGhostObject_getUserIndex_0"];var _emscripten_bind_btGhostObject_getUserPointer_0=Module["_emscripten_bind_btGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btGhostObject_getUserPointer_0"];var _emscripten_bind_btGhostObject_getWorldTransform_0=Module["_emscripten_bind_btGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btGhostObject_getWorldTransform_0"];var _emscripten_bind_btGhostObject_isActive_0=Module["_emscripten_bind_btGhostObject_isActive_0"]=asm["_emscripten_bind_btGhostObject_isActive_0"];var _emscripten_bind_btGhostObject_isKinematicObject_0=Module["_emscripten_bind_btGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isKinematicObject_0"];var _emscripten_bind_btGhostObject_isStaticObject_0=Module["_emscripten_bind_btGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticObject_0"];var _emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btGhostObject_setActivationState_1=Module["_emscripten_bind_btGhostObject_setActivationState_1"]=asm["_emscripten_bind_btGhostObject_setActivationState_1"];var _emscripten_bind_btGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btGhostObject_setCollisionFlags_1"];var _emscripten_bind_btGhostObject_setCollisionShape_1=Module["_emscripten_bind_btGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btGhostObject_setCollisionShape_1"];var _emscripten_bind_btGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btGhostObject_setFriction_1=Module["_emscripten_bind_btGhostObject_setFriction_1"]=asm["_emscripten_bind_btGhostObject_setFriction_1"];var _emscripten_bind_btGhostObject_setRestitution_1=Module["_emscripten_bind_btGhostObject_setRestitution_1"]=asm["_emscripten_bind_btGhostObject_setRestitution_1"];var _emscripten_bind_btGhostObject_setRollingFriction_1=Module["_emscripten_bind_btGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btGhostObject_setRollingFriction_1"];var _emscripten_bind_btGhostObject_setUserIndex_1=Module["_emscripten_bind_btGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btGhostObject_setUserIndex_1"];var _emscripten_bind_btGhostObject_setUserPointer_1=Module["_emscripten_bind_btGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btGhostObject_setUserPointer_1"];var _emscripten_bind_btGhostObject_setWorldTransform_1=Module["_emscripten_bind_btGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btGhostObject_setWorldTransform_1"];var _emscripten_bind_btGhostPairCallback___destroy___0=Module["_emscripten_bind_btGhostPairCallback___destroy___0"]=asm["_emscripten_bind_btGhostPairCallback___destroy___0"];var _emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=Module["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"]=asm["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"];var _emscripten_bind_btHeightfieldTerrainShape___destroy___0=Module["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"]=asm["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"];var _emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=Module["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"]=asm["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"];var _emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2=Module["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"];var _emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"];var _emscripten_bind_btHeightfieldTerrainShape_getMargin_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"];var _emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"];var _emscripten_bind_btHeightfieldTerrainShape_setMargin_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"];var _emscripten_bind_btHingeConstraint___destroy___0=Module["_emscripten_bind_btHingeConstraint___destroy___0"]=asm["_emscripten_bind_btHingeConstraint___destroy___0"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_2=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_3=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_4=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_5=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_6=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_7=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"];var _emscripten_bind_btHingeConstraint_enableAngularMotor_3=Module["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"]=asm["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"];var _emscripten_bind_btHingeConstraint_enableFeedback_1=Module["_emscripten_bind_btHingeConstraint_enableFeedback_1"]=asm["_emscripten_bind_btHingeConstraint_enableFeedback_1"];var _emscripten_bind_btHingeConstraint_enableMotor_1=Module["_emscripten_bind_btHingeConstraint_enableMotor_1"]=asm["_emscripten_bind_btHingeConstraint_enableMotor_1"];var _emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btHingeConstraint_getParam_2=Module["_emscripten_bind_btHingeConstraint_getParam_2"]=asm["_emscripten_bind_btHingeConstraint_getParam_2"];var _emscripten_bind_btHingeConstraint_setAngularOnly_1=Module["_emscripten_bind_btHingeConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btHingeConstraint_setAngularOnly_1"];var _emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btHingeConstraint_setLimit_4=Module["_emscripten_bind_btHingeConstraint_setLimit_4"]=asm["_emscripten_bind_btHingeConstraint_setLimit_4"];var _emscripten_bind_btHingeConstraint_setLimit_5=Module["_emscripten_bind_btHingeConstraint_setLimit_5"]=asm["_emscripten_bind_btHingeConstraint_setLimit_5"];var _emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btHingeConstraint_setMotorTarget_2=Module["_emscripten_bind_btHingeConstraint_setMotorTarget_2"]=asm["_emscripten_bind_btHingeConstraint_setMotorTarget_2"];var _emscripten_bind_btHingeConstraint_setParam_3=Module["_emscripten_bind_btHingeConstraint_setParam_3"]=asm["_emscripten_bind_btHingeConstraint_setParam_3"];var _emscripten_bind_btKinematicCharacterController___destroy___0=Module["_emscripten_bind_btKinematicCharacterController___destroy___0"]=asm["_emscripten_bind_btKinematicCharacterController___destroy___0"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"];var _emscripten_bind_btKinematicCharacterController_canJump_0=Module["_emscripten_bind_btKinematicCharacterController_canJump_0"]=asm["_emscripten_bind_btKinematicCharacterController_canJump_0"];var _emscripten_bind_btKinematicCharacterController_getGhostObject_0=Module["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"];var _emscripten_bind_btKinematicCharacterController_getGravity_0=Module["_emscripten_bind_btKinematicCharacterController_getGravity_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGravity_0"];var _emscripten_bind_btKinematicCharacterController_getMaxSlope_0=Module["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"]=asm["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"];var _emscripten_bind_btKinematicCharacterController_jump_0=Module["_emscripten_bind_btKinematicCharacterController_jump_0"]=asm["_emscripten_bind_btKinematicCharacterController_jump_0"];var _emscripten_bind_btKinematicCharacterController_onGround_0=Module["_emscripten_bind_btKinematicCharacterController_onGround_0"]=asm["_emscripten_bind_btKinematicCharacterController_onGround_0"];var _emscripten_bind_btKinematicCharacterController_playerStep_2=Module["_emscripten_bind_btKinematicCharacterController_playerStep_2"]=asm["_emscripten_bind_btKinematicCharacterController_playerStep_2"];var _emscripten_bind_btKinematicCharacterController_preStep_1=Module["_emscripten_bind_btKinematicCharacterController_preStep_1"]=asm["_emscripten_bind_btKinematicCharacterController_preStep_1"];var _emscripten_bind_btKinematicCharacterController_setFallSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setGravity_1=Module["_emscripten_bind_btKinematicCharacterController_setGravity_1"]=asm["_emscripten_bind_btKinematicCharacterController_setGravity_1"];var _emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"];var _emscripten_bind_btKinematicCharacterController_setMaxSlope_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"];var _emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=Module["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"];var _emscripten_bind_btKinematicCharacterController_setUp_1=Module["_emscripten_bind_btKinematicCharacterController_setUp_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUp_1"];var _emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=Module["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"];var _emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=Module["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"]=asm["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"];var _emscripten_bind_btKinematicCharacterController_setWalkDirection_1=Module["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"]=asm["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"];var _emscripten_bind_btKinematicCharacterController_updateAction_2=Module["_emscripten_bind_btKinematicCharacterController_updateAction_2"]=asm["_emscripten_bind_btKinematicCharacterController_updateAction_2"];var _emscripten_bind_btKinematicCharacterController_warp_1=Module["_emscripten_bind_btKinematicCharacterController_warp_1"]=asm["_emscripten_bind_btKinematicCharacterController_warp_1"];var _emscripten_bind_btManifoldPoint___destroy___0=Module["_emscripten_bind_btManifoldPoint___destroy___0"]=asm["_emscripten_bind_btManifoldPoint___destroy___0"];var _emscripten_bind_btManifoldPoint_getAppliedImpulse_0=Module["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"]=asm["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"];var _emscripten_bind_btManifoldPoint_getDistance_0=Module["_emscripten_bind_btManifoldPoint_getDistance_0"]=asm["_emscripten_bind_btManifoldPoint_getDistance_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointA_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointB_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"];var _emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_set_m_localPointA_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"];var _emscripten_bind_btManifoldPoint_set_m_localPointB_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"];var _emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"];var _emscripten_bind_btMatrix3x3___destroy___0=Module["_emscripten_bind_btMatrix3x3___destroy___0"]=asm["_emscripten_bind_btMatrix3x3___destroy___0"];var _emscripten_bind_btMatrix3x3_getRotation_1=Module["_emscripten_bind_btMatrix3x3_getRotation_1"]=asm["_emscripten_bind_btMatrix3x3_getRotation_1"];var _emscripten_bind_btMatrix3x3_getRow_1=Module["_emscripten_bind_btMatrix3x3_getRow_1"]=asm["_emscripten_bind_btMatrix3x3_getRow_1"];var _emscripten_bind_btMatrix3x3_setEulerZYX_3=Module["_emscripten_bind_btMatrix3x3_setEulerZYX_3"]=asm["_emscripten_bind_btMatrix3x3_setEulerZYX_3"];var _emscripten_bind_btMotionState___destroy___0=Module["_emscripten_bind_btMotionState___destroy___0"]=asm["_emscripten_bind_btMotionState___destroy___0"];var _emscripten_bind_btMotionState_getWorldTransform_1=Module["_emscripten_bind_btMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btMotionState_getWorldTransform_1"];var _emscripten_bind_btMotionState_setWorldTransform_1=Module["_emscripten_bind_btMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btMotionState_setWorldTransform_1"];var _emscripten_bind_btOverlappingPairCache___destroy___0=Module["_emscripten_bind_btOverlappingPairCache___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCache___destroy___0"];var _emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1=Module["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"]=asm["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"];var _emscripten_bind_btOverlappingPairCallback___destroy___0=Module["_emscripten_bind_btOverlappingPairCallback___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCallback___destroy___0"];var _emscripten_bind_btPairCachingGhostObject___destroy___0=Module["_emscripten_bind_btPairCachingGhostObject___destroy___0"]=asm["_emscripten_bind_btPairCachingGhostObject___destroy___0"];var _emscripten_bind_btPairCachingGhostObject_activate_0=Module["_emscripten_bind_btPairCachingGhostObject_activate_0"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_0"];var _emscripten_bind_btPairCachingGhostObject_activate_1=Module["_emscripten_bind_btPairCachingGhostObject_activate_1"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_1"];var _emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=Module["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"];var _emscripten_bind_btPairCachingGhostObject_forceActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"];var _emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"];var _emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"];var _emscripten_bind_btPairCachingGhostObject_getUserIndex_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"];var _emscripten_bind_btPairCachingGhostObject_getUserPointer_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"];var _emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=Module["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"];var _emscripten_bind_btPairCachingGhostObject_isActive_0=Module["_emscripten_bind_btPairCachingGhostObject_isActive_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isActive_0"];var _emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_setActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionShape_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"];var _emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setRestitution_1=Module["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"];var _emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setUserIndex_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"];var _emscripten_bind_btPairCachingGhostObject_setUserPointer_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"];var _emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=Module["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"];var _emscripten_bind_btPersistentManifold___destroy___0=Module["_emscripten_bind_btPersistentManifold___destroy___0"]=asm["_emscripten_bind_btPersistentManifold___destroy___0"];var _emscripten_bind_btPersistentManifold_btPersistentManifold_0=Module["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"]=asm["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"];var _emscripten_bind_btPersistentManifold_getBody0_0=Module["_emscripten_bind_btPersistentManifold_getBody0_0"]=asm["_emscripten_bind_btPersistentManifold_getBody0_0"];var _emscripten_bind_btPersistentManifold_getBody1_0=Module["_emscripten_bind_btPersistentManifold_getBody1_0"]=asm["_emscripten_bind_btPersistentManifold_getBody1_0"];var _emscripten_bind_btPersistentManifold_getContactPoint_1=Module["_emscripten_bind_btPersistentManifold_getContactPoint_1"]=asm["_emscripten_bind_btPersistentManifold_getContactPoint_1"];var _emscripten_bind_btPersistentManifold_getNumContacts_0=Module["_emscripten_bind_btPersistentManifold_getNumContacts_0"]=asm["_emscripten_bind_btPersistentManifold_getNumContacts_0"];var _emscripten_bind_btPoint2PointConstraint___destroy___0=Module["_emscripten_bind_btPoint2PointConstraint___destroy___0"]=asm["_emscripten_bind_btPoint2PointConstraint___destroy___0"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"];var _emscripten_bind_btPoint2PointConstraint_enableFeedback_1=Module["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"]=asm["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"];var _emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btPoint2PointConstraint_getParam_2=Module["_emscripten_bind_btPoint2PointConstraint_getParam_2"]=asm["_emscripten_bind_btPoint2PointConstraint_getParam_2"];var _emscripten_bind_btPoint2PointConstraint_getPivotInA_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"];var _emscripten_bind_btPoint2PointConstraint_getPivotInB_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"];var _emscripten_bind_btPoint2PointConstraint_get_m_setting_0=Module["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"]=asm["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"];var _emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btPoint2PointConstraint_setParam_3=Module["_emscripten_bind_btPoint2PointConstraint_setParam_3"]=asm["_emscripten_bind_btPoint2PointConstraint_setParam_3"];var _emscripten_bind_btPoint2PointConstraint_setPivotA_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"];var _emscripten_bind_btPoint2PointConstraint_setPivotB_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"];var _emscripten_bind_btPoint2PointConstraint_set_m_setting_1=Module["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"]=asm["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"];var _emscripten_bind_btQuadWord___destroy___0=Module["_emscripten_bind_btQuadWord___destroy___0"]=asm["_emscripten_bind_btQuadWord___destroy___0"];var _emscripten_bind_btQuadWord_setW_1=Module["_emscripten_bind_btQuadWord_setW_1"]=asm["_emscripten_bind_btQuadWord_setW_1"];var _emscripten_bind_btQuadWord_setX_1=Module["_emscripten_bind_btQuadWord_setX_1"]=asm["_emscripten_bind_btQuadWord_setX_1"];var _emscripten_bind_btQuadWord_setY_1=Module["_emscripten_bind_btQuadWord_setY_1"]=asm["_emscripten_bind_btQuadWord_setY_1"];var _emscripten_bind_btQuadWord_setZ_1=Module["_emscripten_bind_btQuadWord_setZ_1"]=asm["_emscripten_bind_btQuadWord_setZ_1"];var _emscripten_bind_btQuadWord_w_0=Module["_emscripten_bind_btQuadWord_w_0"]=asm["_emscripten_bind_btQuadWord_w_0"];var _emscripten_bind_btQuadWord_x_0=Module["_emscripten_bind_btQuadWord_x_0"]=asm["_emscripten_bind_btQuadWord_x_0"];var _emscripten_bind_btQuadWord_y_0=Module["_emscripten_bind_btQuadWord_y_0"]=asm["_emscripten_bind_btQuadWord_y_0"];var _emscripten_bind_btQuadWord_z_0=Module["_emscripten_bind_btQuadWord_z_0"]=asm["_emscripten_bind_btQuadWord_z_0"];var _emscripten_bind_btQuaternion___destroy___0=Module["_emscripten_bind_btQuaternion___destroy___0"]=asm["_emscripten_bind_btQuaternion___destroy___0"];var _emscripten_bind_btQuaternion_angleShortestPath_1=Module["_emscripten_bind_btQuaternion_angleShortestPath_1"]=asm["_emscripten_bind_btQuaternion_angleShortestPath_1"];var _emscripten_bind_btQuaternion_angle_1=Module["_emscripten_bind_btQuaternion_angle_1"]=asm["_emscripten_bind_btQuaternion_angle_1"];var _emscripten_bind_btQuaternion_btQuaternion_4=Module["_emscripten_bind_btQuaternion_btQuaternion_4"]=asm["_emscripten_bind_btQuaternion_btQuaternion_4"];var _emscripten_bind_btQuaternion_dot_1=Module["_emscripten_bind_btQuaternion_dot_1"]=asm["_emscripten_bind_btQuaternion_dot_1"];var _emscripten_bind_btQuaternion_getAngleShortestPath_0=Module["_emscripten_bind_btQuaternion_getAngleShortestPath_0"]=asm["_emscripten_bind_btQuaternion_getAngleShortestPath_0"];var _emscripten_bind_btQuaternion_getAngle_0=Module["_emscripten_bind_btQuaternion_getAngle_0"]=asm["_emscripten_bind_btQuaternion_getAngle_0"];var _emscripten_bind_btQuaternion_getAxis_0=Module["_emscripten_bind_btQuaternion_getAxis_0"]=asm["_emscripten_bind_btQuaternion_getAxis_0"];var _emscripten_bind_btQuaternion_inverse_0=Module["_emscripten_bind_btQuaternion_inverse_0"]=asm["_emscripten_bind_btQuaternion_inverse_0"];var _emscripten_bind_btQuaternion_length2_0=Module["_emscripten_bind_btQuaternion_length2_0"]=asm["_emscripten_bind_btQuaternion_length2_0"];var _emscripten_bind_btQuaternion_length_0=Module["_emscripten_bind_btQuaternion_length_0"]=asm["_emscripten_bind_btQuaternion_length_0"];var _emscripten_bind_btQuaternion_normalize_0=Module["_emscripten_bind_btQuaternion_normalize_0"]=asm["_emscripten_bind_btQuaternion_normalize_0"];var _emscripten_bind_btQuaternion_normalized_0=Module["_emscripten_bind_btQuaternion_normalized_0"]=asm["_emscripten_bind_btQuaternion_normalized_0"];var _emscripten_bind_btQuaternion_op_add_1=Module["_emscripten_bind_btQuaternion_op_add_1"]=asm["_emscripten_bind_btQuaternion_op_add_1"];var _emscripten_bind_btQuaternion_op_div_1=Module["_emscripten_bind_btQuaternion_op_div_1"]=asm["_emscripten_bind_btQuaternion_op_div_1"];var _emscripten_bind_btQuaternion_op_mul_1=Module["_emscripten_bind_btQuaternion_op_mul_1"]=asm["_emscripten_bind_btQuaternion_op_mul_1"];var _emscripten_bind_btQuaternion_op_mulq_1=Module["_emscripten_bind_btQuaternion_op_mulq_1"]=asm["_emscripten_bind_btQuaternion_op_mulq_1"];var _emscripten_bind_btQuaternion_op_sub_1=Module["_emscripten_bind_btQuaternion_op_sub_1"]=asm["_emscripten_bind_btQuaternion_op_sub_1"];var _emscripten_bind_btQuaternion_setEulerZYX_3=Module["_emscripten_bind_btQuaternion_setEulerZYX_3"]=asm["_emscripten_bind_btQuaternion_setEulerZYX_3"];var _emscripten_bind_btQuaternion_setEuler_3=Module["_emscripten_bind_btQuaternion_setEuler_3"]=asm["_emscripten_bind_btQuaternion_setEuler_3"];var _emscripten_bind_btQuaternion_setRotation_2=Module["_emscripten_bind_btQuaternion_setRotation_2"]=asm["_emscripten_bind_btQuaternion_setRotation_2"];var _emscripten_bind_btQuaternion_setValue_4=Module["_emscripten_bind_btQuaternion_setValue_4"]=asm["_emscripten_bind_btQuaternion_setValue_4"];var _emscripten_bind_btQuaternion_setW_1=Module["_emscripten_bind_btQuaternion_setW_1"]=asm["_emscripten_bind_btQuaternion_setW_1"];var _emscripten_bind_btQuaternion_setX_1=Module["_emscripten_bind_btQuaternion_setX_1"]=asm["_emscripten_bind_btQuaternion_setX_1"];var _emscripten_bind_btQuaternion_setY_1=Module["_emscripten_bind_btQuaternion_setY_1"]=asm["_emscripten_bind_btQuaternion_setY_1"];var _emscripten_bind_btQuaternion_setZ_1=Module["_emscripten_bind_btQuaternion_setZ_1"]=asm["_emscripten_bind_btQuaternion_setZ_1"];var _emscripten_bind_btQuaternion_w_0=Module["_emscripten_bind_btQuaternion_w_0"]=asm["_emscripten_bind_btQuaternion_w_0"];var _emscripten_bind_btQuaternion_x_0=Module["_emscripten_bind_btQuaternion_x_0"]=asm["_emscripten_bind_btQuaternion_x_0"];var _emscripten_bind_btQuaternion_y_0=Module["_emscripten_bind_btQuaternion_y_0"]=asm["_emscripten_bind_btQuaternion_y_0"];var _emscripten_bind_btQuaternion_z_0=Module["_emscripten_bind_btQuaternion_z_0"]=asm["_emscripten_bind_btQuaternion_z_0"];var _emscripten_bind_btRaycastVehicle___destroy___0=Module["_emscripten_bind_btRaycastVehicle___destroy___0"]=asm["_emscripten_bind_btRaycastVehicle___destroy___0"];var _emscripten_bind_btRaycastVehicle_addWheel_7=Module["_emscripten_bind_btRaycastVehicle_addWheel_7"]=asm["_emscripten_bind_btRaycastVehicle_addWheel_7"];var _emscripten_bind_btRaycastVehicle_applyEngineForce_2=Module["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"]=asm["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"];var _emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=Module["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"]=asm["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"];var _emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=Module["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"]=asm["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"];var _emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=Module["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"]=asm["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"];var _emscripten_bind_btRaycastVehicle_getForwardAxis_0=Module["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"];var _emscripten_bind_btRaycastVehicle_getForwardVector_0=Module["_emscripten_bind_btRaycastVehicle_getForwardVector_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardVector_0"];var _emscripten_bind_btRaycastVehicle_getNumWheels_0=Module["_emscripten_bind_btRaycastVehicle_getNumWheels_0"]=asm["_emscripten_bind_btRaycastVehicle_getNumWheels_0"];var _emscripten_bind_btRaycastVehicle_getRightAxis_0=Module["_emscripten_bind_btRaycastVehicle_getRightAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getRightAxis_0"];var _emscripten_bind_btRaycastVehicle_getRigidBody_0=Module["_emscripten_bind_btRaycastVehicle_getRigidBody_0"]=asm["_emscripten_bind_btRaycastVehicle_getRigidBody_0"];var _emscripten_bind_btRaycastVehicle_getSteeringValue_1=Module["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"]=asm["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"];var _emscripten_bind_btRaycastVehicle_getUpAxis_0=Module["_emscripten_bind_btRaycastVehicle_getUpAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getUpAxis_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintId_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintType_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"];var _emscripten_bind_btRaycastVehicle_getWheelInfo_1=Module["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"];var _emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=Module["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"];var _emscripten_bind_btRaycastVehicle_rayCast_1=Module["_emscripten_bind_btRaycastVehicle_rayCast_1"]=asm["_emscripten_bind_btRaycastVehicle_rayCast_1"];var _emscripten_bind_btRaycastVehicle_resetSuspension_0=Module["_emscripten_bind_btRaycastVehicle_resetSuspension_0"]=asm["_emscripten_bind_btRaycastVehicle_resetSuspension_0"];var _emscripten_bind_btRaycastVehicle_setBrake_2=Module["_emscripten_bind_btRaycastVehicle_setBrake_2"]=asm["_emscripten_bind_btRaycastVehicle_setBrake_2"];var _emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=Module["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"]=asm["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"];var _emscripten_bind_btRaycastVehicle_setPitchControl_1=Module["_emscripten_bind_btRaycastVehicle_setPitchControl_1"]=asm["_emscripten_bind_btRaycastVehicle_setPitchControl_1"];var _emscripten_bind_btRaycastVehicle_setSteeringValue_2=Module["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"]=asm["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"];var _emscripten_bind_btRaycastVehicle_setUserConstraintId_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"];var _emscripten_bind_btRaycastVehicle_setUserConstraintType_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"];var _emscripten_bind_btRaycastVehicle_updateAction_2=Module["_emscripten_bind_btRaycastVehicle_updateAction_2"]=asm["_emscripten_bind_btRaycastVehicle_updateAction_2"];var _emscripten_bind_btRaycastVehicle_updateFriction_1=Module["_emscripten_bind_btRaycastVehicle_updateFriction_1"]=asm["_emscripten_bind_btRaycastVehicle_updateFriction_1"];var _emscripten_bind_btRaycastVehicle_updateSuspension_1=Module["_emscripten_bind_btRaycastVehicle_updateSuspension_1"]=asm["_emscripten_bind_btRaycastVehicle_updateSuspension_1"];var _emscripten_bind_btRaycastVehicle_updateVehicle_1=Module["_emscripten_bind_btRaycastVehicle_updateVehicle_1"]=asm["_emscripten_bind_btRaycastVehicle_updateVehicle_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransform_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"];var _emscripten_bind_btRigidBodyConstructionInfo___destroy___0=Module["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"];var _emscripten_bind_btRigidBody___destroy___0=Module["_emscripten_bind_btRigidBody___destroy___0"]=asm["_emscripten_bind_btRigidBody___destroy___0"];var _emscripten_bind_btRigidBody_activate_0=Module["_emscripten_bind_btRigidBody_activate_0"]=asm["_emscripten_bind_btRigidBody_activate_0"];var _emscripten_bind_btRigidBody_activate_1=Module["_emscripten_bind_btRigidBody_activate_1"]=asm["_emscripten_bind_btRigidBody_activate_1"];var _emscripten_bind_btRigidBody_applyCentralForce_1=Module["_emscripten_bind_btRigidBody_applyCentralForce_1"]=asm["_emscripten_bind_btRigidBody_applyCentralForce_1"];var _emscripten_bind_btRigidBody_applyCentralImpulse_1=Module["_emscripten_bind_btRigidBody_applyCentralImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyCentralImpulse_1"];var _emscripten_bind_btRigidBody_applyForce_2=Module["_emscripten_bind_btRigidBody_applyForce_2"]=asm["_emscripten_bind_btRigidBody_applyForce_2"];var _emscripten_bind_btRigidBody_applyGravity_0=Module["_emscripten_bind_btRigidBody_applyGravity_0"]=asm["_emscripten_bind_btRigidBody_applyGravity_0"];var _emscripten_bind_btRigidBody_applyImpulse_2=Module["_emscripten_bind_btRigidBody_applyImpulse_2"]=asm["_emscripten_bind_btRigidBody_applyImpulse_2"];var _emscripten_bind_btRigidBody_applyTorqueImpulse_1=Module["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"];var _emscripten_bind_btRigidBody_applyTorque_1=Module["_emscripten_bind_btRigidBody_applyTorque_1"]=asm["_emscripten_bind_btRigidBody_applyTorque_1"];var _emscripten_bind_btRigidBody_btRigidBody_1=Module["_emscripten_bind_btRigidBody_btRigidBody_1"]=asm["_emscripten_bind_btRigidBody_btRigidBody_1"];var _emscripten_bind_btRigidBody_forceActivationState_1=Module["_emscripten_bind_btRigidBody_forceActivationState_1"]=asm["_emscripten_bind_btRigidBody_forceActivationState_1"];var _emscripten_bind_btRigidBody_getAabb_2=Module["_emscripten_bind_btRigidBody_getAabb_2"]=asm["_emscripten_bind_btRigidBody_getAabb_2"];var _emscripten_bind_btRigidBody_getAngularVelocity_0=Module["_emscripten_bind_btRigidBody_getAngularVelocity_0"]=asm["_emscripten_bind_btRigidBody_getAngularVelocity_0"];var _emscripten_bind_btRigidBody_getCenterOfMassTransform_0=Module["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"]=asm["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"];var _emscripten_bind_btRigidBody_getCollisionFlags_0=Module["_emscripten_bind_btRigidBody_getCollisionFlags_0"]=asm["_emscripten_bind_btRigidBody_getCollisionFlags_0"];var _emscripten_bind_btRigidBody_getCollisionShape_0=Module["_emscripten_bind_btRigidBody_getCollisionShape_0"]=asm["_emscripten_bind_btRigidBody_getCollisionShape_0"];var _emscripten_bind_btRigidBody_getGravity_0=Module["_emscripten_bind_btRigidBody_getGravity_0"]=asm["_emscripten_bind_btRigidBody_getGravity_0"];var _emscripten_bind_btRigidBody_getLinearVelocity_0=Module["_emscripten_bind_btRigidBody_getLinearVelocity_0"]=asm["_emscripten_bind_btRigidBody_getLinearVelocity_0"];var _emscripten_bind_btRigidBody_getMotionState_0=Module["_emscripten_bind_btRigidBody_getMotionState_0"]=asm["_emscripten_bind_btRigidBody_getMotionState_0"];var _emscripten_bind_btRigidBody_getUserIndex_0=Module["_emscripten_bind_btRigidBody_getUserIndex_0"]=asm["_emscripten_bind_btRigidBody_getUserIndex_0"];var _emscripten_bind_btRigidBody_getUserPointer_0=Module["_emscripten_bind_btRigidBody_getUserPointer_0"]=asm["_emscripten_bind_btRigidBody_getUserPointer_0"];var _emscripten_bind_btRigidBody_getWorldTransform_0=Module["_emscripten_bind_btRigidBody_getWorldTransform_0"]=asm["_emscripten_bind_btRigidBody_getWorldTransform_0"];var _emscripten_bind_btRigidBody_isActive_0=Module["_emscripten_bind_btRigidBody_isActive_0"]=asm["_emscripten_bind_btRigidBody_isActive_0"];var _emscripten_bind_btRigidBody_isKinematicObject_0=Module["_emscripten_bind_btRigidBody_isKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isKinematicObject_0"];var _emscripten_bind_btRigidBody_isStaticObject_0=Module["_emscripten_bind_btRigidBody_isStaticObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticObject_0"];var _emscripten_bind_btRigidBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btRigidBody_setActivationState_1=Module["_emscripten_bind_btRigidBody_setActivationState_1"]=asm["_emscripten_bind_btRigidBody_setActivationState_1"];var _emscripten_bind_btRigidBody_setAngularFactor_1=Module["_emscripten_bind_btRigidBody_setAngularFactor_1"]=asm["_emscripten_bind_btRigidBody_setAngularFactor_1"];var _emscripten_bind_btRigidBody_setAngularVelocity_1=Module["_emscripten_bind_btRigidBody_setAngularVelocity_1"]=asm["_emscripten_bind_btRigidBody_setAngularVelocity_1"];var _emscripten_bind_btRigidBody_setAnisotropicFriction_2=Module["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"];var _emscripten_bind_btRigidBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"];var _emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btRigidBody_setCenterOfMassTransform_1=Module["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"]=asm["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"];var _emscripten_bind_btRigidBody_setCollisionFlags_1=Module["_emscripten_bind_btRigidBody_setCollisionFlags_1"]=asm["_emscripten_bind_btRigidBody_setCollisionFlags_1"];var _emscripten_bind_btRigidBody_setCollisionShape_1=Module["_emscripten_bind_btRigidBody_setCollisionShape_1"]=asm["_emscripten_bind_btRigidBody_setCollisionShape_1"];var _emscripten_bind_btRigidBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"];var _emscripten_bind_btRigidBody_setDamping_2=Module["_emscripten_bind_btRigidBody_setDamping_2"]=asm["_emscripten_bind_btRigidBody_setDamping_2"];var _emscripten_bind_btRigidBody_setFriction_1=Module["_emscripten_bind_btRigidBody_setFriction_1"]=asm["_emscripten_bind_btRigidBody_setFriction_1"];var _emscripten_bind_btRigidBody_setGravity_1=Module["_emscripten_bind_btRigidBody_setGravity_1"]=asm["_emscripten_bind_btRigidBody_setGravity_1"];var _emscripten_bind_btRigidBody_setLinearFactor_1=Module["_emscripten_bind_btRigidBody_setLinearFactor_1"]=asm["_emscripten_bind_btRigidBody_setLinearFactor_1"];var _emscripten_bind_btRigidBody_setLinearVelocity_1=Module["_emscripten_bind_btRigidBody_setLinearVelocity_1"]=asm["_emscripten_bind_btRigidBody_setLinearVelocity_1"];var _emscripten_bind_btRigidBody_setMassProps_2=Module["_emscripten_bind_btRigidBody_setMassProps_2"]=asm["_emscripten_bind_btRigidBody_setMassProps_2"];var _emscripten_bind_btRigidBody_setMotionState_1=Module["_emscripten_bind_btRigidBody_setMotionState_1"]=asm["_emscripten_bind_btRigidBody_setMotionState_1"];var _emscripten_bind_btRigidBody_setRestitution_1=Module["_emscripten_bind_btRigidBody_setRestitution_1"]=asm["_emscripten_bind_btRigidBody_setRestitution_1"];var _emscripten_bind_btRigidBody_setRollingFriction_1=Module["_emscripten_bind_btRigidBody_setRollingFriction_1"]=asm["_emscripten_bind_btRigidBody_setRollingFriction_1"];var _emscripten_bind_btRigidBody_setSleepingThresholds_2=Module["_emscripten_bind_btRigidBody_setSleepingThresholds_2"]=asm["_emscripten_bind_btRigidBody_setSleepingThresholds_2"];var _emscripten_bind_btRigidBody_setUserIndex_1=Module["_emscripten_bind_btRigidBody_setUserIndex_1"]=asm["_emscripten_bind_btRigidBody_setUserIndex_1"];var _emscripten_bind_btRigidBody_setUserPointer_1=Module["_emscripten_bind_btRigidBody_setUserPointer_1"]=asm["_emscripten_bind_btRigidBody_setUserPointer_1"];var _emscripten_bind_btRigidBody_setWorldTransform_1=Module["_emscripten_bind_btRigidBody_setWorldTransform_1"]=asm["_emscripten_bind_btRigidBody_setWorldTransform_1"];var _emscripten_bind_btRigidBody_upcast_1=Module["_emscripten_bind_btRigidBody_upcast_1"]=asm["_emscripten_bind_btRigidBody_upcast_1"];var _emscripten_bind_btRigidBody_updateInertiaTensor_0=Module["_emscripten_bind_btRigidBody_updateInertiaTensor_0"]=asm["_emscripten_bind_btRigidBody_updateInertiaTensor_0"];var _emscripten_bind_btRotationalLimitMotor___destroy___0=Module["_emscripten_bind_btRotationalLimitMotor___destroy___0"]=asm["_emscripten_bind_btRotationalLimitMotor___destroy___0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"];var _emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"];var _emscripten_bind_btRotationalLimitMotor_isLimited_0=Module["_emscripten_bind_btRotationalLimitMotor_isLimited_0"]=asm["_emscripten_bind_btRotationalLimitMotor_isLimited_0"];var _emscripten_bind_btRotationalLimitMotor_needApplyTorques_0=Module["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"]=asm["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"];var _emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"];var _emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"];var _emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"];var _emscripten_bind_btSliderConstraint___destroy___0=Module["_emscripten_bind_btSliderConstraint___destroy___0"]=asm["_emscripten_bind_btSliderConstraint___destroy___0"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_3=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_5=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"];var _emscripten_bind_btSliderConstraint_enableFeedback_1=Module["_emscripten_bind_btSliderConstraint_enableFeedback_1"]=asm["_emscripten_bind_btSliderConstraint_enableFeedback_1"];var _emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btSliderConstraint_getParam_2=Module["_emscripten_bind_btSliderConstraint_getParam_2"]=asm["_emscripten_bind_btSliderConstraint_getParam_2"];var _emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btSliderConstraint_setLowerAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"];var _emscripten_bind_btSliderConstraint_setLowerLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"];var _emscripten_bind_btSliderConstraint_setParam_3=Module["_emscripten_bind_btSliderConstraint_setParam_3"]=asm["_emscripten_bind_btSliderConstraint_setParam_3"];var _emscripten_bind_btSliderConstraint_setUpperAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"];var _emscripten_bind_btSliderConstraint_setUpperLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"];var _emscripten_bind_btSoftBodyArray___destroy___0=Module["_emscripten_bind_btSoftBodyArray___destroy___0"]=asm["_emscripten_bind_btSoftBodyArray___destroy___0"];var _emscripten_bind_btSoftBodyArray_at_1=Module["_emscripten_bind_btSoftBodyArray_at_1"]=asm["_emscripten_bind_btSoftBodyArray_at_1"];var _emscripten_bind_btSoftBodyArray_size_0=Module["_emscripten_bind_btSoftBodyArray_size_0"]=asm["_emscripten_bind_btSoftBodyArray_size_0"];var _emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"];var _emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"];var _emscripten_bind_btSoftBodyHelpers_CreatePatch_9=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"];var _emscripten_bind_btSoftBodyHelpers_CreateRope_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"];var _emscripten_bind_btSoftBodyHelpers___destroy___0=Module["_emscripten_bind_btSoftBodyHelpers___destroy___0"]=asm["_emscripten_bind_btSoftBodyHelpers___destroy___0"];var _emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=Module["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"]=asm["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"];var _emscripten_bind_btSoftBodySolver___destroy___0=Module["_emscripten_bind_btSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btSoftBodySolver___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo___destroy___0=Module["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"]=asm["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=Module["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"];var _emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"];var _emscripten_bind_btSoftBody___destroy___0=Module["_emscripten_bind_btSoftBody___destroy___0"]=asm["_emscripten_bind_btSoftBody___destroy___0"];var _emscripten_bind_btSoftBody_activate_0=Module["_emscripten_bind_btSoftBody_activate_0"]=asm["_emscripten_bind_btSoftBody_activate_0"];var _emscripten_bind_btSoftBody_activate_1=Module["_emscripten_bind_btSoftBody_activate_1"]=asm["_emscripten_bind_btSoftBody_activate_1"];var _emscripten_bind_btSoftBody_appendAnchor_4=Module["_emscripten_bind_btSoftBody_appendAnchor_4"]=asm["_emscripten_bind_btSoftBody_appendAnchor_4"];var _emscripten_bind_btSoftBody_appendFace_4=Module["_emscripten_bind_btSoftBody_appendFace_4"]=asm["_emscripten_bind_btSoftBody_appendFace_4"];var _emscripten_bind_btSoftBody_appendLinearJoint_2=Module["_emscripten_bind_btSoftBody_appendLinearJoint_2"]=asm["_emscripten_bind_btSoftBody_appendLinearJoint_2"];var _emscripten_bind_btSoftBody_appendLink_4=Module["_emscripten_bind_btSoftBody_appendLink_4"]=asm["_emscripten_bind_btSoftBody_appendLink_4"];var _emscripten_bind_btSoftBody_appendMaterial_0=Module["_emscripten_bind_btSoftBody_appendMaterial_0"]=asm["_emscripten_bind_btSoftBody_appendMaterial_0"];var _emscripten_bind_btSoftBody_appendNode_2=Module["_emscripten_bind_btSoftBody_appendNode_2"]=asm["_emscripten_bind_btSoftBody_appendNode_2"];var _emscripten_bind_btSoftBody_appendTetra_5=Module["_emscripten_bind_btSoftBody_appendTetra_5"]=asm["_emscripten_bind_btSoftBody_appendTetra_5"];var _emscripten_bind_btSoftBody_btSoftBody_4=Module["_emscripten_bind_btSoftBody_btSoftBody_4"]=asm["_emscripten_bind_btSoftBody_btSoftBody_4"];var _emscripten_bind_btSoftBody_checkFace_3=Module["_emscripten_bind_btSoftBody_checkFace_3"]=asm["_emscripten_bind_btSoftBody_checkFace_3"];var _emscripten_bind_btSoftBody_checkLink_2=Module["_emscripten_bind_btSoftBody_checkLink_2"]=asm["_emscripten_bind_btSoftBody_checkLink_2"];var _emscripten_bind_btSoftBody_forceActivationState_1=Module["_emscripten_bind_btSoftBody_forceActivationState_1"]=asm["_emscripten_bind_btSoftBody_forceActivationState_1"];var _emscripten_bind_btSoftBody_generateBendingConstraints_2=Module["_emscripten_bind_btSoftBody_generateBendingConstraints_2"]=asm["_emscripten_bind_btSoftBody_generateBendingConstraints_2"];var _emscripten_bind_btSoftBody_generateClusters_1=Module["_emscripten_bind_btSoftBody_generateClusters_1"]=asm["_emscripten_bind_btSoftBody_generateClusters_1"];var _emscripten_bind_btSoftBody_generateClusters_2=Module["_emscripten_bind_btSoftBody_generateClusters_2"]=asm["_emscripten_bind_btSoftBody_generateClusters_2"];var _emscripten_bind_btSoftBody_getCollisionFlags_0=Module["_emscripten_bind_btSoftBody_getCollisionFlags_0"]=asm["_emscripten_bind_btSoftBody_getCollisionFlags_0"];var _emscripten_bind_btSoftBody_getCollisionShape_0=Module["_emscripten_bind_btSoftBody_getCollisionShape_0"]=asm["_emscripten_bind_btSoftBody_getCollisionShape_0"];var _emscripten_bind_btSoftBody_getTotalMass_0=Module["_emscripten_bind_btSoftBody_getTotalMass_0"]=asm["_emscripten_bind_btSoftBody_getTotalMass_0"];var _emscripten_bind_btSoftBody_getUserIndex_0=Module["_emscripten_bind_btSoftBody_getUserIndex_0"]=asm["_emscripten_bind_btSoftBody_getUserIndex_0"];var _emscripten_bind_btSoftBody_getUserPointer_0=Module["_emscripten_bind_btSoftBody_getUserPointer_0"]=asm["_emscripten_bind_btSoftBody_getUserPointer_0"];var _emscripten_bind_btSoftBody_getWorldTransform_0=Module["_emscripten_bind_btSoftBody_getWorldTransform_0"]=asm["_emscripten_bind_btSoftBody_getWorldTransform_0"];var _emscripten_bind_btSoftBody_get_m_anchors_0=Module["_emscripten_bind_btSoftBody_get_m_anchors_0"]=asm["_emscripten_bind_btSoftBody_get_m_anchors_0"];var _emscripten_bind_btSoftBody_get_m_cfg_0=Module["_emscripten_bind_btSoftBody_get_m_cfg_0"]=asm["_emscripten_bind_btSoftBody_get_m_cfg_0"];var _emscripten_bind_btSoftBody_get_m_faces_0=Module["_emscripten_bind_btSoftBody_get_m_faces_0"]=asm["_emscripten_bind_btSoftBody_get_m_faces_0"];var _emscripten_bind_btSoftBody_get_m_links_0=Module["_emscripten_bind_btSoftBody_get_m_links_0"]=asm["_emscripten_bind_btSoftBody_get_m_links_0"];var _emscripten_bind_btSoftBody_get_m_materials_0=Module["_emscripten_bind_btSoftBody_get_m_materials_0"]=asm["_emscripten_bind_btSoftBody_get_m_materials_0"];var _emscripten_bind_btSoftBody_get_m_nodes_0=Module["_emscripten_bind_btSoftBody_get_m_nodes_0"]=asm["_emscripten_bind_btSoftBody_get_m_nodes_0"];var _emscripten_bind_btSoftBody_isActive_0=Module["_emscripten_bind_btSoftBody_isActive_0"]=asm["_emscripten_bind_btSoftBody_isActive_0"];var _emscripten_bind_btSoftBody_isKinematicObject_0=Module["_emscripten_bind_btSoftBody_isKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isKinematicObject_0"];var _emscripten_bind_btSoftBody_isStaticObject_0=Module["_emscripten_bind_btSoftBody_isStaticObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticObject_0"];var _emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btSoftBody_rotate_1=Module["_emscripten_bind_btSoftBody_rotate_1"]=asm["_emscripten_bind_btSoftBody_rotate_1"];var _emscripten_bind_btSoftBody_scale_1=Module["_emscripten_bind_btSoftBody_scale_1"]=asm["_emscripten_bind_btSoftBody_scale_1"];var _emscripten_bind_btSoftBody_setActivationState_1=Module["_emscripten_bind_btSoftBody_setActivationState_1"]=asm["_emscripten_bind_btSoftBody_setActivationState_1"];var _emscripten_bind_btSoftBody_setAnisotropicFriction_2=Module["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"];var _emscripten_bind_btSoftBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"];var _emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btSoftBody_setCollisionFlags_1=Module["_emscripten_bind_btSoftBody_setCollisionFlags_1"]=asm["_emscripten_bind_btSoftBody_setCollisionFlags_1"];var _emscripten_bind_btSoftBody_setCollisionShape_1=Module["_emscripten_bind_btSoftBody_setCollisionShape_1"]=asm["_emscripten_bind_btSoftBody_setCollisionShape_1"];var _emscripten_bind_btSoftBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"];var _emscripten_bind_btSoftBody_setFriction_1=Module["_emscripten_bind_btSoftBody_setFriction_1"]=asm["_emscripten_bind_btSoftBody_setFriction_1"];var _emscripten_bind_btSoftBody_setMass_2=Module["_emscripten_bind_btSoftBody_setMass_2"]=asm["_emscripten_bind_btSoftBody_setMass_2"];var _emscripten_bind_btSoftBody_setRestitution_1=Module["_emscripten_bind_btSoftBody_setRestitution_1"]=asm["_emscripten_bind_btSoftBody_setRestitution_1"];var _emscripten_bind_btSoftBody_setRollingFriction_1=Module["_emscripten_bind_btSoftBody_setRollingFriction_1"]=asm["_emscripten_bind_btSoftBody_setRollingFriction_1"];var _emscripten_bind_btSoftBody_setTotalMass_2=Module["_emscripten_bind_btSoftBody_setTotalMass_2"]=asm["_emscripten_bind_btSoftBody_setTotalMass_2"];var _emscripten_bind_btSoftBody_setUserIndex_1=Module["_emscripten_bind_btSoftBody_setUserIndex_1"]=asm["_emscripten_bind_btSoftBody_setUserIndex_1"];var _emscripten_bind_btSoftBody_setUserPointer_1=Module["_emscripten_bind_btSoftBody_setUserPointer_1"]=asm["_emscripten_bind_btSoftBody_setUserPointer_1"];var _emscripten_bind_btSoftBody_setWorldTransform_1=Module["_emscripten_bind_btSoftBody_setWorldTransform_1"]=asm["_emscripten_bind_btSoftBody_setWorldTransform_1"];var _emscripten_bind_btSoftBody_set_m_anchors_1=Module["_emscripten_bind_btSoftBody_set_m_anchors_1"]=asm["_emscripten_bind_btSoftBody_set_m_anchors_1"];var _emscripten_bind_btSoftBody_set_m_cfg_1=Module["_emscripten_bind_btSoftBody_set_m_cfg_1"]=asm["_emscripten_bind_btSoftBody_set_m_cfg_1"];var _emscripten_bind_btSoftBody_set_m_faces_1=Module["_emscripten_bind_btSoftBody_set_m_faces_1"]=asm["_emscripten_bind_btSoftBody_set_m_faces_1"];var _emscripten_bind_btSoftBody_set_m_links_1=Module["_emscripten_bind_btSoftBody_set_m_links_1"]=asm["_emscripten_bind_btSoftBody_set_m_links_1"];var _emscripten_bind_btSoftBody_set_m_materials_1=Module["_emscripten_bind_btSoftBody_set_m_materials_1"]=asm["_emscripten_bind_btSoftBody_set_m_materials_1"];var _emscripten_bind_btSoftBody_set_m_nodes_1=Module["_emscripten_bind_btSoftBody_set_m_nodes_1"]=asm["_emscripten_bind_btSoftBody_set_m_nodes_1"];var _emscripten_bind_btSoftBody_transform_1=Module["_emscripten_bind_btSoftBody_transform_1"]=asm["_emscripten_bind_btSoftBody_transform_1"];var _emscripten_bind_btSoftBody_translate_1=Module["_emscripten_bind_btSoftBody_translate_1"]=asm["_emscripten_bind_btSoftBody_translate_1"];var _emscripten_bind_btSoftBody_upcast_1=Module["_emscripten_bind_btSoftBody_upcast_1"]=asm["_emscripten_bind_btSoftBody_upcast_1"];var _emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=Module["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"];var _emscripten_bind_btSoftRigidDynamicsWorld_addAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btSphereShape___destroy___0=Module["_emscripten_bind_btSphereShape___destroy___0"]=asm["_emscripten_bind_btSphereShape___destroy___0"];var _emscripten_bind_btSphereShape_btSphereShape_1=Module["_emscripten_bind_btSphereShape_btSphereShape_1"]=asm["_emscripten_bind_btSphereShape_btSphereShape_1"];var _emscripten_bind_btSphereShape_calculateLocalInertia_2=Module["_emscripten_bind_btSphereShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btSphereShape_calculateLocalInertia_2"];var _emscripten_bind_btSphereShape_getLocalScaling_0=Module["_emscripten_bind_btSphereShape_getLocalScaling_0"]=asm["_emscripten_bind_btSphereShape_getLocalScaling_0"];var _emscripten_bind_btSphereShape_getMargin_0=Module["_emscripten_bind_btSphereShape_getMargin_0"]=asm["_emscripten_bind_btSphereShape_getMargin_0"];var _emscripten_bind_btSphereShape_setLocalScaling_1=Module["_emscripten_bind_btSphereShape_setLocalScaling_1"]=asm["_emscripten_bind_btSphereShape_setLocalScaling_1"];var _emscripten_bind_btSphereShape_setMargin_1=Module["_emscripten_bind_btSphereShape_setMargin_1"]=asm["_emscripten_bind_btSphereShape_setMargin_1"];var _emscripten_bind_btStaticPlaneShape___destroy___0=Module["_emscripten_bind_btStaticPlaneShape___destroy___0"]=asm["_emscripten_bind_btStaticPlaneShape___destroy___0"];var _emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=Module["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"]=asm["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"];var _emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=Module["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"];var _emscripten_bind_btStaticPlaneShape_getLocalScaling_0=Module["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"]=asm["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"];var _emscripten_bind_btStaticPlaneShape_setLocalScaling_1=Module["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"]=asm["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"];var _emscripten_bind_btStridingMeshInterface___destroy___0=Module["_emscripten_bind_btStridingMeshInterface___destroy___0"]=asm["_emscripten_bind_btStridingMeshInterface___destroy___0"];var _emscripten_bind_btTransform___destroy___0=Module["_emscripten_bind_btTransform___destroy___0"]=asm["_emscripten_bind_btTransform___destroy___0"];var _emscripten_bind_btTransform_btTransform_0=Module["_emscripten_bind_btTransform_btTransform_0"]=asm["_emscripten_bind_btTransform_btTransform_0"];var _emscripten_bind_btTransform_btTransform_2=Module["_emscripten_bind_btTransform_btTransform_2"]=asm["_emscripten_bind_btTransform_btTransform_2"];var _emscripten_bind_btTransform_getBasis_0=Module["_emscripten_bind_btTransform_getBasis_0"]=asm["_emscripten_bind_btTransform_getBasis_0"];var _emscripten_bind_btTransform_getOrigin_0=Module["_emscripten_bind_btTransform_getOrigin_0"]=asm["_emscripten_bind_btTransform_getOrigin_0"];var _emscripten_bind_btTransform_getRotation_0=Module["_emscripten_bind_btTransform_getRotation_0"]=asm["_emscripten_bind_btTransform_getRotation_0"];var _emscripten_bind_btTransform_setFromOpenGLMatrix_1=Module["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"]=asm["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"];var _emscripten_bind_btTransform_setIdentity_0=Module["_emscripten_bind_btTransform_setIdentity_0"]=asm["_emscripten_bind_btTransform_setIdentity_0"];var _emscripten_bind_btTransform_setOrigin_1=Module["_emscripten_bind_btTransform_setOrigin_1"]=asm["_emscripten_bind_btTransform_setOrigin_1"];var _emscripten_bind_btTransform_setRotation_1=Module["_emscripten_bind_btTransform_setRotation_1"]=asm["_emscripten_bind_btTransform_setRotation_1"];var _emscripten_bind_btTriangleMeshShape___destroy___0=Module["_emscripten_bind_btTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btTriangleMeshShape___destroy___0"];var _emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btTriangleMesh___destroy___0=Module["_emscripten_bind_btTriangleMesh___destroy___0"]=asm["_emscripten_bind_btTriangleMesh___destroy___0"];var _emscripten_bind_btTriangleMesh_addTriangle_3=Module["_emscripten_bind_btTriangleMesh_addTriangle_3"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_3"];var _emscripten_bind_btTriangleMesh_addTriangle_4=Module["_emscripten_bind_btTriangleMesh_addTriangle_4"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_4"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_0=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_1=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_2=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"];var _emscripten_bind_btTypedConstraint___destroy___0=Module["_emscripten_bind_btTypedConstraint___destroy___0"]=asm["_emscripten_bind_btTypedConstraint___destroy___0"];var _emscripten_bind_btTypedConstraint_enableFeedback_1=Module["_emscripten_bind_btTypedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btTypedConstraint_enableFeedback_1"];var _emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btTypedConstraint_getParam_2=Module["_emscripten_bind_btTypedConstraint_getParam_2"]=asm["_emscripten_bind_btTypedConstraint_getParam_2"];var _emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btTypedConstraint_setParam_3=Module["_emscripten_bind_btTypedConstraint_setParam_3"]=asm["_emscripten_bind_btTypedConstraint_setParam_3"];var _emscripten_bind_btVector3___destroy___0=Module["_emscripten_bind_btVector3___destroy___0"]=asm["_emscripten_bind_btVector3___destroy___0"];var _emscripten_bind_btVector3_btVector3_0=Module["_emscripten_bind_btVector3_btVector3_0"]=asm["_emscripten_bind_btVector3_btVector3_0"];var _emscripten_bind_btVector3_btVector3_3=Module["_emscripten_bind_btVector3_btVector3_3"]=asm["_emscripten_bind_btVector3_btVector3_3"];var _emscripten_bind_btVector3_dot_1=Module["_emscripten_bind_btVector3_dot_1"]=asm["_emscripten_bind_btVector3_dot_1"];var _emscripten_bind_btVector3_length_0=Module["_emscripten_bind_btVector3_length_0"]=asm["_emscripten_bind_btVector3_length_0"];var _emscripten_bind_btVector3_normalize_0=Module["_emscripten_bind_btVector3_normalize_0"]=asm["_emscripten_bind_btVector3_normalize_0"];var _emscripten_bind_btVector3_op_add_1=Module["_emscripten_bind_btVector3_op_add_1"]=asm["_emscripten_bind_btVector3_op_add_1"];var _emscripten_bind_btVector3_op_mul_1=Module["_emscripten_bind_btVector3_op_mul_1"]=asm["_emscripten_bind_btVector3_op_mul_1"];var _emscripten_bind_btVector3_op_sub_1=Module["_emscripten_bind_btVector3_op_sub_1"]=asm["_emscripten_bind_btVector3_op_sub_1"];var _emscripten_bind_btVector3_rotate_2=Module["_emscripten_bind_btVector3_rotate_2"]=asm["_emscripten_bind_btVector3_rotate_2"];var _emscripten_bind_btVector3_setValue_3=Module["_emscripten_bind_btVector3_setValue_3"]=asm["_emscripten_bind_btVector3_setValue_3"];var _emscripten_bind_btVector3_setX_1=Module["_emscripten_bind_btVector3_setX_1"]=asm["_emscripten_bind_btVector3_setX_1"];var _emscripten_bind_btVector3_setY_1=Module["_emscripten_bind_btVector3_setY_1"]=asm["_emscripten_bind_btVector3_setY_1"];var _emscripten_bind_btVector3_setZ_1=Module["_emscripten_bind_btVector3_setZ_1"]=asm["_emscripten_bind_btVector3_setZ_1"];var _emscripten_bind_btVector3_x_0=Module["_emscripten_bind_btVector3_x_0"]=asm["_emscripten_bind_btVector3_x_0"];var _emscripten_bind_btVector3_y_0=Module["_emscripten_bind_btVector3_y_0"]=asm["_emscripten_bind_btVector3_y_0"];var _emscripten_bind_btVector3_z_0=Module["_emscripten_bind_btVector3_z_0"]=asm["_emscripten_bind_btVector3_z_0"];var _emscripten_bind_btVector4___destroy___0=Module["_emscripten_bind_btVector4___destroy___0"]=asm["_emscripten_bind_btVector4___destroy___0"];var _emscripten_bind_btVector4_btVector4_0=Module["_emscripten_bind_btVector4_btVector4_0"]=asm["_emscripten_bind_btVector4_btVector4_0"];var _emscripten_bind_btVector4_btVector4_4=Module["_emscripten_bind_btVector4_btVector4_4"]=asm["_emscripten_bind_btVector4_btVector4_4"];var _emscripten_bind_btVector4_dot_1=Module["_emscripten_bind_btVector4_dot_1"]=asm["_emscripten_bind_btVector4_dot_1"];var _emscripten_bind_btVector4_length_0=Module["_emscripten_bind_btVector4_length_0"]=asm["_emscripten_bind_btVector4_length_0"];var _emscripten_bind_btVector4_normalize_0=Module["_emscripten_bind_btVector4_normalize_0"]=asm["_emscripten_bind_btVector4_normalize_0"];var _emscripten_bind_btVector4_op_add_1=Module["_emscripten_bind_btVector4_op_add_1"]=asm["_emscripten_bind_btVector4_op_add_1"];var _emscripten_bind_btVector4_op_mul_1=Module["_emscripten_bind_btVector4_op_mul_1"]=asm["_emscripten_bind_btVector4_op_mul_1"];var _emscripten_bind_btVector4_op_sub_1=Module["_emscripten_bind_btVector4_op_sub_1"]=asm["_emscripten_bind_btVector4_op_sub_1"];var _emscripten_bind_btVector4_rotate_2=Module["_emscripten_bind_btVector4_rotate_2"]=asm["_emscripten_bind_btVector4_rotate_2"];var _emscripten_bind_btVector4_setValue_4=Module["_emscripten_bind_btVector4_setValue_4"]=asm["_emscripten_bind_btVector4_setValue_4"];var _emscripten_bind_btVector4_setX_1=Module["_emscripten_bind_btVector4_setX_1"]=asm["_emscripten_bind_btVector4_setX_1"];var _emscripten_bind_btVector4_setY_1=Module["_emscripten_bind_btVector4_setY_1"]=asm["_emscripten_bind_btVector4_setY_1"];var _emscripten_bind_btVector4_setZ_1=Module["_emscripten_bind_btVector4_setZ_1"]=asm["_emscripten_bind_btVector4_setZ_1"];var _emscripten_bind_btVector4_w_0=Module["_emscripten_bind_btVector4_w_0"]=asm["_emscripten_bind_btVector4_w_0"];var _emscripten_bind_btVector4_x_0=Module["_emscripten_bind_btVector4_x_0"]=asm["_emscripten_bind_btVector4_x_0"];var _emscripten_bind_btVector4_y_0=Module["_emscripten_bind_btVector4_y_0"]=asm["_emscripten_bind_btVector4_y_0"];var _emscripten_bind_btVector4_z_0=Module["_emscripten_bind_btVector4_z_0"]=asm["_emscripten_bind_btVector4_z_0"];var _emscripten_bind_btVehicleRaycasterResult___destroy___0=Module["_emscripten_bind_btVehicleRaycasterResult___destroy___0"]=asm["_emscripten_bind_btVehicleRaycasterResult___destroy___0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"];var _emscripten_bind_btVehicleRaycaster___destroy___0=Module["_emscripten_bind_btVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btVehicleRaycaster___destroy___0"];var _emscripten_bind_btVehicleRaycaster_castRay_3=Module["_emscripten_bind_btVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btVehicleRaycaster_castRay_3"];var _emscripten_bind_btVehicleTuning_btVehicleTuning_0=Module["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"]=asm["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"];var _emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=Module["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"];var _emscripten_bind_btVehicleTuning_set_m_frictionSlip_1=Module["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo___destroy___0=Module["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo___destroy___0=Module["_emscripten_bind_btWheelInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfo___destroy___0"];var _emscripten_bind_btWheelInfo_btWheelInfo_1=Module["_emscripten_bind_btWheelInfo_btWheelInfo_1"]=asm["_emscripten_bind_btWheelInfo_btWheelInfo_1"];var _emscripten_bind_btWheelInfo_getSuspensionRestLength_0=Module["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"];var _emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfo_get_m_brake_0=Module["_emscripten_bind_btWheelInfo_get_m_brake_0"]=asm["_emscripten_bind_btWheelInfo_get_m_brake_0"];var _emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=Module["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"];var _emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=Module["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"]=asm["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"];var _emscripten_bind_btWheelInfo_get_m_deltaRotation_0=Module["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"];var _emscripten_bind_btWheelInfo_get_m_engineForce_0=Module["_emscripten_bind_btWheelInfo_get_m_engineForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_engineForce_0"];var _emscripten_bind_btWheelInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfo_get_m_raycastInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"];var _emscripten_bind_btWheelInfo_get_m_rollInfluence_0=Module["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"];var _emscripten_bind_btWheelInfo_get_m_rotation_0=Module["_emscripten_bind_btWheelInfo_get_m_rotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rotation_0"];var _emscripten_bind_btWheelInfo_get_m_skidInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"];var _emscripten_bind_btWheelInfo_get_m_steering_0=Module["_emscripten_bind_btWheelInfo_get_m_steering_0"]=asm["_emscripten_bind_btWheelInfo_get_m_steering_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsRadius_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_worldTransform_0=Module["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"]=asm["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"];var _emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfo_set_m_brake_1=Module["_emscripten_bind_btWheelInfo_set_m_brake_1"]=asm["_emscripten_bind_btWheelInfo_set_m_brake_1"];var _emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=Module["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"];var _emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1=Module["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"]=asm["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"];var _emscripten_bind_btWheelInfo_set_m_deltaRotation_1=Module["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"];var _emscripten_bind_btWheelInfo_set_m_engineForce_1=Module["_emscripten_bind_btWheelInfo_set_m_engineForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_engineForce_1"];var _emscripten_bind_btWheelInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfo_set_m_raycastInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"];var _emscripten_bind_btWheelInfo_set_m_rollInfluence_1=Module["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"];var _emscripten_bind_btWheelInfo_set_m_rotation_1=Module["_emscripten_bind_btWheelInfo_set_m_rotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rotation_1"];var _emscripten_bind_btWheelInfo_set_m_skidInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"];var _emscripten_bind_btWheelInfo_set_m_steering_1=Module["_emscripten_bind_btWheelInfo_set_m_steering_1"]=asm["_emscripten_bind_btWheelInfo_set_m_steering_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_worldTransform_1=Module["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"]=asm["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"];var _emscripten_bind_btWheelInfo_updateWheel_2=Module["_emscripten_bind_btWheelInfo_updateWheel_2"]=asm["_emscripten_bind_btWheelInfo_updateWheel_2"];var _emscripten_bind_tAnchorArray___destroy___0=Module["_emscripten_bind_tAnchorArray___destroy___0"]=asm["_emscripten_bind_tAnchorArray___destroy___0"];var _emscripten_bind_tAnchorArray_at_1=Module["_emscripten_bind_tAnchorArray_at_1"]=asm["_emscripten_bind_tAnchorArray_at_1"];var _emscripten_bind_tAnchorArray_clear_0=Module["_emscripten_bind_tAnchorArray_clear_0"]=asm["_emscripten_bind_tAnchorArray_clear_0"];var _emscripten_bind_tAnchorArray_pop_back_0=Module["_emscripten_bind_tAnchorArray_pop_back_0"]=asm["_emscripten_bind_tAnchorArray_pop_back_0"];var _emscripten_bind_tAnchorArray_push_back_1=Module["_emscripten_bind_tAnchorArray_push_back_1"]=asm["_emscripten_bind_tAnchorArray_push_back_1"];var _emscripten_bind_tAnchorArray_size_0=Module["_emscripten_bind_tAnchorArray_size_0"]=asm["_emscripten_bind_tAnchorArray_size_0"];var _emscripten_bind_tFaceArray___destroy___0=Module["_emscripten_bind_tFaceArray___destroy___0"]=asm["_emscripten_bind_tFaceArray___destroy___0"];var _emscripten_bind_tFaceArray_at_1=Module["_emscripten_bind_tFaceArray_at_1"]=asm["_emscripten_bind_tFaceArray_at_1"];var _emscripten_bind_tFaceArray_size_0=Module["_emscripten_bind_tFaceArray_size_0"]=asm["_emscripten_bind_tFaceArray_size_0"];var _emscripten_bind_tLinkArray___destroy___0=Module["_emscripten_bind_tLinkArray___destroy___0"]=asm["_emscripten_bind_tLinkArray___destroy___0"];var _emscripten_bind_tLinkArray_at_1=Module["_emscripten_bind_tLinkArray_at_1"]=asm["_emscripten_bind_tLinkArray_at_1"];var _emscripten_bind_tLinkArray_size_0=Module["_emscripten_bind_tLinkArray_size_0"]=asm["_emscripten_bind_tLinkArray_size_0"];var _emscripten_bind_tMaterialArray___destroy___0=Module["_emscripten_bind_tMaterialArray___destroy___0"]=asm["_emscripten_bind_tMaterialArray___destroy___0"];var _emscripten_bind_tMaterialArray_at_1=Module["_emscripten_bind_tMaterialArray_at_1"]=asm["_emscripten_bind_tMaterialArray_at_1"];var _emscripten_bind_tMaterialArray_size_0=Module["_emscripten_bind_tMaterialArray_size_0"]=asm["_emscripten_bind_tMaterialArray_size_0"];var _emscripten_bind_tNodeArray___destroy___0=Module["_emscripten_bind_tNodeArray___destroy___0"]=asm["_emscripten_bind_tNodeArray___destroy___0"];var _emscripten_bind_tNodeArray_at_1=Module["_emscripten_bind_tNodeArray_at_1"]=asm["_emscripten_bind_tNodeArray_at_1"];var _emscripten_bind_tNodeArray_size_0=Module["_emscripten_bind_tNodeArray_size_0"]=asm["_emscripten_bind_tNodeArray_size_0"];var _emscripten_enum_PHY_ScalarType_PHY_DOUBLE=Module["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"]=asm["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"];var _emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=Module["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"];var _emscripten_enum_PHY_ScalarType_PHY_FLOAT=Module["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"];var _emscripten_enum_PHY_ScalarType_PHY_INTEGER=Module["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"]=asm["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"];var _emscripten_enum_PHY_ScalarType_PHY_SHORT=Module["_emscripten_enum_PHY_ScalarType_PHY_SHORT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_SHORT"];var _emscripten_enum_PHY_ScalarType_PHY_UCHAR=Module["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"]=asm["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"];var _free=Module["_free"]=asm["_free"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i16=Module["_llvm_bswap_i16"]=asm["_llvm_bswap_i16"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_did=Module["dynCall_did"]=asm["dynCall_did"];var dynCall_diidii=Module["dynCall_diidii"]=asm["dynCall_diidii"];var dynCall_diii=Module["dynCall_diii"]=asm["dynCall_diii"];var dynCall_diiidii=Module["dynCall_diiidii"]=asm["dynCall_diiidii"];var dynCall_diiii=Module["dynCall_diiii"]=asm["dynCall_diiii"];var dynCall_diiiii=Module["dynCall_diiiii"]=asm["dynCall_diiiii"];var dynCall_diiiiiiii=Module["dynCall_diiiiiiii"]=asm["dynCall_diiiiiiii"];var dynCall_diiiiiiiii=Module["dynCall_diiiiiiiii"]=asm["dynCall_diiiiiiiii"];var dynCall_diiiiiiiiii=Module["dynCall_diiiiiiiiii"]=asm["dynCall_diiiiiiiiii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iidid=Module["dynCall_iidid"]=asm["dynCall_iidid"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiid=Module["dynCall_iiid"]=asm["dynCall_iiid"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=asm["dynCall_iiiiiiiiiii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_vidd=Module["dynCall_vidd"]=asm["dynCall_vidd"];var dynCall_viddiii=Module["dynCall_viddiii"]=asm["dynCall_viddiii"];var dynCall_vidi=Module["dynCall_vidi"]=asm["dynCall_vidi"];var dynCall_vidii=Module["dynCall_vidii"]=asm["dynCall_vidii"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_viidi=Module["dynCall_viidi"]=asm["dynCall_viidi"];var dynCall_viidii=Module["dynCall_viidii"]=asm["dynCall_viidii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiid=Module["dynCall_viiid"]=asm["dynCall_viiid"];var dynCall_viiidii=Module["dynCall_viiidii"]=asm["dynCall_viiidii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiid=Module["dynCall_viiiid"]=asm["dynCall_viiiid"];var dynCall_viiiidddddidi=Module["dynCall_viiiidddddidi"]=asm["dynCall_viiiidddddidi"];var dynCall_viiiiddddiid=Module["dynCall_viiiiddddiid"]=asm["dynCall_viiiiddddiid"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiid=Module["dynCall_viiiiid"]=asm["dynCall_viiiiid"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=asm["dynCall_viiiiiii"];var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=asm["dynCall_viiiiiiiii"];var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=asm["dynCall_viiiiiiiiii"];Module["asm"]=asm;if(memoryInitializer){if(!isDataURI(memoryInitializer)){if(typeof Module["locateFile"]==="function"){memoryInitializer=Module["locateFile"](memoryInitializer)}else if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=exit;var abortDecorators=[];function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module["WrapperObject"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module["getCache"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module["wrapPointer"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module["castObject"]=castObject;Module["NULL"]=wrapPointer(0);function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy object. (Did you create it yourself?)";obj["__destroy__"]();delete getCache(obj.__class__)[obj.ptr]}Module["destroy"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module["compare"]=compare;function getPointer(obj){return obj.ptr}Module["getPointer"]=getPointer;function getClass(obj){return obj.__class__}Module["getClass"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:(function(){if(ensureCache.needed){for(var i=0;i=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module["_malloc"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret}),copy:(function(array,view,offset){var offsetShifted=offset;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offsetShifted>>=1;break;case 4:offsetShifted>>=2;break;case 8:offsetShifted>>=3;break}for(var i=0;i zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + +} + +Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function () { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function () { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function () { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function () { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function () { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function ( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function ( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function ( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function () { + + return this._effectiveWeight; + + }, + + fadeIn: function ( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function ( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function ( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function ( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function () { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function ( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function () { + + return this._effectiveTimeScale; + + }, + + setDuration: function ( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function ( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function ( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function ( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function () { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function () { + + return this._mixer; + + }, + + getClip: function () { + + return this._clip; + + }, + + getRoot: function () { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function ( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function ( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function ( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function ( deltaTime ) { + + var time = this.time + deltaTime; + var duration = this._clip.duration; + var loop = this.loop; + var loopCount = this._loopCount; + + var pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === - 1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function ( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function ( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + +} ); + + +export { AnimationAction }; diff --git a/lib/animation/AnimationClip.js b/lib/animation/AnimationClip.js new file mode 100644 index 0000000..810bc4b --- /dev/null +++ b/lib/animation/AnimationClip.js @@ -0,0 +1,453 @@ +import { AnimationUtils } from './AnimationUtils.js'; +import { KeyframeTrack } from './KeyframeTrack.js'; +import { BooleanKeyframeTrack } from './tracks/BooleanKeyframeTrack.js'; +import { ColorKeyframeTrack } from './tracks/ColorKeyframeTrack.js'; +import { NumberKeyframeTrack } from './tracks/NumberKeyframeTrack.js'; +import { QuaternionKeyframeTrack } from './tracks/QuaternionKeyframeTrack.js'; +import { StringKeyframeTrack } from './tracks/StringKeyframeTrack.js'; +import { VectorKeyframeTrack } from './tracks/VectorKeyframeTrack.js'; +import { _Math } from '../math/Math.js'; + +/** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + +} + +function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + +} + +function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + var trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + +} + +Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + +} ); + +Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + validate: function () { + + var valid = true; + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + +} ); + + +export { AnimationClip }; diff --git a/lib/animation/AnimationMixer.js b/lib/animation/AnimationMixer.js new file mode 100644 index 0000000..76d03ac --- /dev/null +++ b/lib/animation/AnimationMixer.js @@ -0,0 +1,761 @@ +import { AnimationAction } from './AnimationAction.js'; +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { LinearInterpolant } from '../math/interpolants/LinearInterpolant.js'; +import { PropertyBinding } from './PropertyBinding.js'; +import { PropertyMixer } from './PropertyMixer.js'; +import { AnimationClip } from './AnimationClip.js'; + +/** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + +} + +AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: AnimationMixer, + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + +} ); + + +export { AnimationMixer }; diff --git a/lib/animation/AnimationObjectGroup.js b/lib/animation/AnimationObjectGroup.js new file mode 100644 index 0000000..5ede859 --- /dev/null +++ b/lib/animation/AnimationObjectGroup.js @@ -0,0 +1,381 @@ +import { PropertyBinding } from './PropertyBinding.js'; +import { _Math } from '../math/Math.js'; + +/** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + +function AnimationObjectGroup() { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + +} + +Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length, + knownObject = undefined; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function () { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + +} ); + + +export { AnimationObjectGroup }; diff --git a/lib/animation/AnimationUtils.js b/lib/animation/AnimationUtils.js new file mode 100644 index 0000000..07b6892 --- /dev/null +++ b/lib/animation/AnimationUtils.js @@ -0,0 +1,166 @@ +/** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + +}; + + +export { AnimationUtils }; diff --git a/lib/animation/KeyframeTrack.js b/lib/animation/KeyframeTrack.js new file mode 100644 index 0000000..06b4bde --- /dev/null +++ b/lib/animation/KeyframeTrack.js @@ -0,0 +1,454 @@ +import { + InterpolateLinear, + InterpolateSmooth, + InterpolateDiscrete +} from '../constants.js'; +import { CubicInterpolant } from '../math/interpolants/CubicInterpolant.js'; +import { LinearInterpolant } from '../math/interpolants/LinearInterpolant.js'; +import { DiscreteInterpolant } from '../math/interpolants/DiscreteInterpolant.js'; +import { AnimationUtils } from './AnimationUtils.js'; + +/** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function KeyframeTrack( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + +} + +// Static methods + +Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + toJSON: function ( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + +} ); + +Object.assign( KeyframeTrack.prototype, { + + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + +} ); + +export { KeyframeTrack }; diff --git a/lib/animation/PropertyBinding.js b/lib/animation/PropertyBinding.js new file mode 100644 index 0000000..d9fe744 --- /dev/null +++ b/lib/animation/PropertyBinding.js @@ -0,0 +1,726 @@ +/** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +// Characters [].:/ are reserved for track binding syntax. +var RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; + +function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + +} + +Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + +} ); + + +function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + +} + +Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: ( function () { + + var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' ); + + return function sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( reservedRe, '' ); + + }; + + }() ), + + parseTrackName: function () { + + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + var wordChar = '[^' + RESERVED_CHARS_RE + ']'; + var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar ); + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot ); + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar ); + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar ); + + var trackRe = new RegExp( '' + + '^' + + directoryRe + + nodeRe + + objectRe + + propertyRe + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function parseTrackName( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + +} ); + +Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) { + + if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + + } else { + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + +} ); + +//!\ DECLARE ALIAS AFTER assign prototype ! +Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + +} ); + +export { PropertyBinding }; diff --git a/lib/animation/PropertyMixer.js b/lib/animation/PropertyMixer.js new file mode 100644 index 0000000..a4c0bbf --- /dev/null +++ b/lib/animation/PropertyMixer.js @@ -0,0 +1,209 @@ +import { Quaternion } from '../math/Quaternion.js'; + +/** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + +} + +Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + +} ); + + +export { PropertyMixer }; diff --git a/lib/animation/tracks/BooleanKeyframeTrack.js b/lib/animation/tracks/BooleanKeyframeTrack.js new file mode 100644 index 0000000..bec2d2d --- /dev/null +++ b/lib/animation/tracks/BooleanKeyframeTrack.js @@ -0,0 +1,38 @@ +import { InterpolateDiscrete } from '../../constants.js'; +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrack.call( this, name, times, values ); + +} + +BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + +} ); + +export { BooleanKeyframeTrack }; diff --git a/lib/animation/tracks/ColorKeyframeTrack.js b/lib/animation/tracks/ColorKeyframeTrack.js new file mode 100644 index 0000000..c409645 --- /dev/null +++ b/lib/animation/tracks/ColorKeyframeTrack.js @@ -0,0 +1,34 @@ +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + +} ); + +export { ColorKeyframeTrack }; diff --git a/lib/animation/tracks/NumberKeyframeTrack.js b/lib/animation/tracks/NumberKeyframeTrack.js new file mode 100644 index 0000000..f717221 --- /dev/null +++ b/lib/animation/tracks/NumberKeyframeTrack.js @@ -0,0 +1,30 @@ +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + +} ); + +export { NumberKeyframeTrack }; diff --git a/lib/animation/tracks/QuaternionKeyframeTrack.js b/lib/animation/tracks/QuaternionKeyframeTrack.js new file mode 100644 index 0000000..9594959 --- /dev/null +++ b/lib/animation/tracks/QuaternionKeyframeTrack.js @@ -0,0 +1,40 @@ +import { InterpolateLinear } from '../../constants.js'; +import { KeyframeTrack } from '../KeyframeTrack.js'; +import { QuaternionLinearInterpolant } from '../../math/interpolants/QuaternionLinearInterpolant.js'; + +/** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + +} ); + +export { QuaternionKeyframeTrack }; diff --git a/lib/animation/tracks/StringKeyframeTrack.js b/lib/animation/tracks/StringKeyframeTrack.js new file mode 100644 index 0000000..5d021d2 --- /dev/null +++ b/lib/animation/tracks/StringKeyframeTrack.js @@ -0,0 +1,35 @@ +import { InterpolateDiscrete } from '../../constants.js'; +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + +} ); + +export { StringKeyframeTrack }; diff --git a/lib/animation/tracks/VectorKeyframeTrack.js b/lib/animation/tracks/VectorKeyframeTrack.js new file mode 100644 index 0000000..cff8c9f --- /dev/null +++ b/lib/animation/tracks/VectorKeyframeTrack.js @@ -0,0 +1,31 @@ +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + +} ); + +export { VectorKeyframeTrack }; diff --git a/lib/audio/Audio.js b/lib/audio/Audio.js new file mode 100644 index 0000000..9932428 --- /dev/null +++ b/lib/audio/Audio.js @@ -0,0 +1,319 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + +import { Object3D } from '../core/Object3D.js'; + +function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.offset = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + +} + +Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setMediaElementSource: function ( mediaElement ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaNode'; + this.source = this.context.createMediaElementSource( mediaElement ); + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + this.startTime = this.context.currentTime; + source.start( this.startTime, this.offset ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + this.source.stop(); + this.source.onended = null; + this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate; + this.isPlaying = false; + + } + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.source.onended = null; + this.offset = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + +} ); + +export { Audio }; diff --git a/lib/audio/AudioAnalyser.js b/lib/audio/AudioAnalyser.js new file mode 100644 index 0000000..ce21a4a --- /dev/null +++ b/lib/audio/AudioAnalyser.js @@ -0,0 +1,42 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + +} + +Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + +} ); + +export { AudioAnalyser }; diff --git a/lib/audio/AudioContext.js b/lib/audio/AudioContext.js new file mode 100644 index 0000000..29def01 --- /dev/null +++ b/lib/audio/AudioContext.js @@ -0,0 +1,29 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var context; + +var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + +}; + +export { AudioContext }; diff --git a/lib/audio/AudioListener.js b/lib/audio/AudioListener.js new file mode 100644 index 0000000..78173ee --- /dev/null +++ b/lib/audio/AudioListener.js @@ -0,0 +1,135 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Quaternion } from '../math/Quaternion.js'; +import { Object3D } from '../core/Object3D.js'; +import { AudioContext } from './AudioContext.js'; + +function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + +} + +AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + return this; + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + return this; + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + +} ); + +export { AudioListener }; diff --git a/lib/audio/PositionalAudio.js b/lib/audio/PositionalAudio.js new file mode 100644 index 0000000..c37c75f --- /dev/null +++ b/lib/audio/PositionalAudio.js @@ -0,0 +1,122 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Quaternion } from '../math/Quaternion.js'; +import { Audio } from './Audio.js'; +import { Object3D } from '../core/Object3D.js'; + +function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + +} + +PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + return this; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + return this; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + return this; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + return this; + + }, + + setDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) { + + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var panner = this.panner; + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + panner.setPosition( position.x, position.y, position.z ); + panner.setOrientation( orientation.x, orientation.y, orientation.z ); + + }; + + } )() + + +} ); + +export { PositionalAudio }; diff --git a/lib/cameras/ArrayCamera.js b/lib/cameras/ArrayCamera.js new file mode 100644 index 0000000..fc98224 --- /dev/null +++ b/lib/cameras/ArrayCamera.js @@ -0,0 +1,24 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { PerspectiveCamera } from './PerspectiveCamera.js'; + +function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.cameras = array || []; + +} + +ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + +} ); + + +export { ArrayCamera }; diff --git a/lib/cameras/Camera.js b/lib/cameras/Camera.js new file mode 100644 index 0000000..cb992a6 --- /dev/null +++ b/lib/cameras/Camera.js @@ -0,0 +1,76 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley +*/ + +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Vector3 } from '../math/Vector3.js'; + +function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + +} + +Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); + + return this; + + }, + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize(); + + }, + + updateMatrixWorld: function ( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + this.matrixWorldInverse.getInverse( this.matrixWorld ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +} ); + +export { Camera }; diff --git a/lib/cameras/CubeCamera.js b/lib/cameras/CubeCamera.js new file mode 100644 index 0000000..c475380 --- /dev/null +++ b/lib/cameras/CubeCamera.js @@ -0,0 +1,113 @@ +import { Object3D } from '../core/Object3D.js'; +import { WebGLRenderTargetCube } from '../renderers/WebGLRenderTargetCube.js'; +import { LinearFilter, RGBFormat } from '../constants.js'; +import { Vector3 } from '../math/Vector3.js'; +import { PerspectiveCamera } from './PerspectiveCamera.js'; + +/** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + +function CubeCamera( near, far, cubeResolution, options ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + options = options || { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.update = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + this.clear = function ( renderer, color, depth, stencil ) { + + var renderTarget = this.renderTarget; + + for ( var i = 0; i < 6; i ++ ) { + + renderTarget.activeCubeFace = i; + renderer.setRenderTarget( renderTarget ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( null ); + + }; + +} + +CubeCamera.prototype = Object.create( Object3D.prototype ); +CubeCamera.prototype.constructor = CubeCamera; + + +export { CubeCamera }; diff --git a/lib/cameras/OrthographicCamera.js b/lib/cameras/OrthographicCamera.js new file mode 100755 index 0000000..532da01 --- /dev/null +++ b/lib/cameras/OrthographicCamera.js @@ -0,0 +1,147 @@ +import { Camera } from './Camera.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + +function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = ( left !== undefined ) ? left : - 1; + this.right = ( right !== undefined ) ? right : 1; + this.top = ( top !== undefined ) ? top : 1; + this.bottom = ( bottom !== undefined ) ? bottom : - 1; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + +} + +OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + +} ); + + +export { OrthographicCamera }; diff --git a/lib/cameras/PerspectiveCamera.js b/lib/cameras/PerspectiveCamera.js new file mode 100755 index 0000000..b9e9e23 --- /dev/null +++ b/lib/cameras/PerspectiveCamera.js @@ -0,0 +1,244 @@ +import { Camera } from './Camera.js'; +import { Object3D } from '../core/Object3D.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + +function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + +} + +PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + +} ); + + +export { PerspectiveCamera }; diff --git a/lib/cameras/StereoCamera.js b/lib/cameras/StereoCamera.js new file mode 100644 index 0000000..14aebe6 --- /dev/null +++ b/lib/cameras/StereoCamera.js @@ -0,0 +1,98 @@ +import { Matrix4 } from '../math/Matrix4.js'; +import { _Math } from '../math/Math.js'; +import { PerspectiveCamera } from './PerspectiveCamera.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + +} + +Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + +} ); + + +export { StereoCamera }; diff --git a/lib/constants.js b/lib/constants.js new file mode 100644 index 0000000..8a3b744 --- /dev/null +++ b/lib/constants.js @@ -0,0 +1,142 @@ +export var REVISION = '98dev'; +export var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; +export var CullFaceNone = 0; +export var CullFaceBack = 1; +export var CullFaceFront = 2; +export var CullFaceFrontBack = 3; +export var FrontFaceDirectionCW = 0; +export var FrontFaceDirectionCCW = 1; +export var BasicShadowMap = 0; +export var PCFShadowMap = 1; +export var PCFSoftShadowMap = 2; +export var FrontSide = 0; +export var BackSide = 1; +export var DoubleSide = 2; +export var FlatShading = 1; +export var SmoothShading = 2; +export var NoColors = 0; +export var FaceColors = 1; +export var VertexColors = 2; +export var NoBlending = 0; +export var NormalBlending = 1; +export var AdditiveBlending = 2; +export var SubtractiveBlending = 3; +export var MultiplyBlending = 4; +export var CustomBlending = 5; +export var AddEquation = 100; +export var SubtractEquation = 101; +export var ReverseSubtractEquation = 102; +export var MinEquation = 103; +export var MaxEquation = 104; +export var ZeroFactor = 200; +export var OneFactor = 201; +export var SrcColorFactor = 202; +export var OneMinusSrcColorFactor = 203; +export var SrcAlphaFactor = 204; +export var OneMinusSrcAlphaFactor = 205; +export var DstAlphaFactor = 206; +export var OneMinusDstAlphaFactor = 207; +export var DstColorFactor = 208; +export var OneMinusDstColorFactor = 209; +export var SrcAlphaSaturateFactor = 210; +export var NeverDepth = 0; +export var AlwaysDepth = 1; +export var LessDepth = 2; +export var LessEqualDepth = 3; +export var EqualDepth = 4; +export var GreaterEqualDepth = 5; +export var GreaterDepth = 6; +export var NotEqualDepth = 7; +export var MultiplyOperation = 0; +export var MixOperation = 1; +export var AddOperation = 2; +export var NoToneMapping = 0; +export var LinearToneMapping = 1; +export var ReinhardToneMapping = 2; +export var Uncharted2ToneMapping = 3; +export var CineonToneMapping = 4; +export var UVMapping = 300; +export var CubeReflectionMapping = 301; +export var CubeRefractionMapping = 302; +export var EquirectangularReflectionMapping = 303; +export var EquirectangularRefractionMapping = 304; +export var SphericalReflectionMapping = 305; +export var CubeUVReflectionMapping = 306; +export var CubeUVRefractionMapping = 307; +export var RepeatWrapping = 1000; +export var ClampToEdgeWrapping = 1001; +export var MirroredRepeatWrapping = 1002; +export var NearestFilter = 1003; +export var NearestMipMapNearestFilter = 1004; +export var NearestMipMapLinearFilter = 1005; +export var LinearFilter = 1006; +export var LinearMipMapNearestFilter = 1007; +export var LinearMipMapLinearFilter = 1008; +export var UnsignedByteType = 1009; +export var ByteType = 1010; +export var ShortType = 1011; +export var UnsignedShortType = 1012; +export var IntType = 1013; +export var UnsignedIntType = 1014; +export var FloatType = 1015; +export var HalfFloatType = 1016; +export var UnsignedShort4444Type = 1017; +export var UnsignedShort5551Type = 1018; +export var UnsignedShort565Type = 1019; +export var UnsignedInt248Type = 1020; +export var AlphaFormat = 1021; +export var RGBFormat = 1022; +export var RGBAFormat = 1023; +export var LuminanceFormat = 1024; +export var LuminanceAlphaFormat = 1025; +export var RGBEFormat = RGBAFormat; +export var DepthFormat = 1026; +export var DepthStencilFormat = 1027; +export var RedFormat = 1028; +export var RGB_S3TC_DXT1_Format = 33776; +export var RGBA_S3TC_DXT1_Format = 33777; +export var RGBA_S3TC_DXT3_Format = 33778; +export var RGBA_S3TC_DXT5_Format = 33779; +export var RGB_PVRTC_4BPPV1_Format = 35840; +export var RGB_PVRTC_2BPPV1_Format = 35841; +export var RGBA_PVRTC_4BPPV1_Format = 35842; +export var RGBA_PVRTC_2BPPV1_Format = 35843; +export var RGB_ETC1_Format = 36196; +export var RGBA_ASTC_4x4_Format = 37808; +export var RGBA_ASTC_5x4_Format = 37809; +export var RGBA_ASTC_5x5_Format = 37810; +export var RGBA_ASTC_6x5_Format = 37811; +export var RGBA_ASTC_6x6_Format = 37812; +export var RGBA_ASTC_8x5_Format = 37813; +export var RGBA_ASTC_8x6_Format = 37814; +export var RGBA_ASTC_8x8_Format = 37815; +export var RGBA_ASTC_10x5_Format = 37816; +export var RGBA_ASTC_10x6_Format = 37817; +export var RGBA_ASTC_10x8_Format = 37818; +export var RGBA_ASTC_10x10_Format = 37819; +export var RGBA_ASTC_12x10_Format = 37820; +export var RGBA_ASTC_12x12_Format = 37821; +export var LoopOnce = 2200; +export var LoopRepeat = 2201; +export var LoopPingPong = 2202; +export var InterpolateDiscrete = 2300; +export var InterpolateLinear = 2301; +export var InterpolateSmooth = 2302; +export var ZeroCurvatureEnding = 2400; +export var ZeroSlopeEnding = 2401; +export var WrapAroundEnding = 2402; +export var TrianglesDrawMode = 0; +export var TriangleStripDrawMode = 1; +export var TriangleFanDrawMode = 2; +export var LinearEncoding = 3000; +export var sRGBEncoding = 3001; +export var GammaEncoding = 3007; +export var RGBEEncoding = 3002; +export var LogLuvEncoding = 3003; +export var RGBM7Encoding = 3004; +export var RGBM16Encoding = 3005; +export var RGBDEncoding = 3006; +export var BasicDepthPacking = 3200; +export var RGBADepthPacking = 3201; +export var TangentSpaceNormalMap = 0; +export var ObjectSpaceNormalMap = 1; diff --git a/lib/core/BufferAttribute.js b/lib/core/BufferAttribute.js new file mode 100644 index 0000000..ec5b754 --- /dev/null +++ b/lib/core/BufferAttribute.js @@ -0,0 +1,430 @@ +import { Vector4 } from '../math/Vector4.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +} + +Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + +} ); + +Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + +} ); + +// + +function Int8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized ); + +} + +Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + +function Uint8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized ); + +} + +Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + +function Uint8ClampedBufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized ); + +} + +Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + +function Int16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized ); + +} + +Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + +function Uint16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); + +} + +Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + +function Int32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized ); + +} + +Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + +function Uint32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized ); + +} + +Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + +function Float32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized ); + +} + +Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + +function Float64BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized ); + +} + +Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + +// + +export { + Float64BufferAttribute, + Float32BufferAttribute, + Uint32BufferAttribute, + Int32BufferAttribute, + Uint16BufferAttribute, + Int16BufferAttribute, + Uint8ClampedBufferAttribute, + Uint8BufferAttribute, + Int8BufferAttribute, + BufferAttribute +}; diff --git a/lib/core/BufferGeometry.js b/lib/core/BufferGeometry.js new file mode 100644 index 0000000..a200245 --- /dev/null +++ b/lib/core/BufferGeometry.js @@ -0,0 +1,1129 @@ +import { Vector3 } from '../math/Vector3.js'; +import { Box3 } from '../math/Box3.js'; +import { EventDispatcher } from './EventDispatcher.js'; +import { BufferAttribute, Float32BufferAttribute, Uint16BufferAttribute, Uint32BufferAttribute } from './BufferAttribute.js'; +import { Sphere } from '../math/Sphere.js'; +import { DirectGeometry } from './DirectGeometry.js'; +import { Object3D } from './Object3D.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { _Math } from '../math/Math.js'; +import { arrayMax } from '../utils.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id + +function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + this.userData = {}; + +} + +BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + return this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return this; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + setFromPoints: function ( points ) { + + var position = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 ); + attribute.name = morphTarget.name; + + array.push( attribute.copyVector3sArray( morphTarget.data ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + for ( var i = 0, il = index.count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var vector = new Vector3(); + + return function normalizeNormals() { + + var normals = this.attributes.normal; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + vector.x = normals.getX( i ); + vector.y = normals.getY( i ); + vector.z = normals.getZ( i ); + + vector.normalize(); + + normals.setXYZ( i, vector.x, vector.y, vector.z ); + + } + + }; + + }(), + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + var groups = this.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { BufferGeometry }; diff --git a/lib/core/Clock.js b/lib/core/Clock.js new file mode 100644 index 0000000..a0bc86f --- /dev/null +++ b/lib/core/Clock.js @@ -0,0 +1,73 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + +} + +Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + +} ); + + +export { Clock }; diff --git a/lib/core/DirectGeometry.js b/lib/core/DirectGeometry.js new file mode 100644 index 0000000..006a37b --- /dev/null +++ b/lib/core/DirectGeometry.js @@ -0,0 +1,274 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector2 } from '../math/Vector2.js'; + +function DirectGeometry() { + + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + +} + +Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = { + name: morphTargets[ i ].name, + data: [] + }; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = { + name: morphNormals[ i ].name, + data: [] + }; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + if ( vertices.length > 0 && faces.length === 0 ) { + + console.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' ); + + } + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + +} ); + + +export { DirectGeometry }; diff --git a/lib/core/EventDispatcher.js b/lib/core/EventDispatcher.js new file mode 100644 index 0000000..de5ca8e --- /dev/null +++ b/lib/core/EventDispatcher.js @@ -0,0 +1,86 @@ +/** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + +function EventDispatcher() {} + +Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = listenerArray.slice( 0 ); + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + +} ); + + +export { EventDispatcher }; diff --git a/lib/core/Face3.js b/lib/core/Face3.js new file mode 100644 index 0000000..b2d76f6 --- /dev/null +++ b/lib/core/Face3.js @@ -0,0 +1,63 @@ +import { Color } from '../math/Color.js'; +import { Vector3 } from '../math/Vector3.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + +} + +Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + +} ); + + +export { Face3 }; diff --git a/lib/core/Geometry.js b/lib/core/Geometry.js new file mode 100644 index 0000000..c9a3d74 --- /dev/null +++ b/lib/core/Geometry.js @@ -0,0 +1,1435 @@ +import { EventDispatcher } from './EventDispatcher.js'; +import { Face3 } from './Face3.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { Sphere } from '../math/Sphere.js'; +import { Box3 } from '../math/Box3.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from './Object3D.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + +var geometryId = 0; // Geometry uses even numbers as Id + +function Geometry() { + + Object.defineProperty( this, 'id', { value: geometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + +} + +Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3().fromArray( positions, i ) ); + + if ( colors !== undefined ) { + + scope.colors.push( new Color().fromArray( colors, i ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexColors = ( colors === undefined ) ? [] : [ + scope.colors[ a ].clone(), + scope.colors[ b ].clone(), + scope.colors[ c ].clone() ]; + + var vertexNormals = ( normals === undefined ) ? [] : [ + new Vector3().fromArray( normals, a * 3 ), + new Vector3().fromArray( normals, b * 3 ), + new Vector3().fromArray( normals, c * 3 ) + ]; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ + new Vector2().fromArray( uvs, a * 2 ), + new Vector2().fromArray( uvs, b * 2 ), + new Vector2().fromArray( uvs, c * 2 ) + ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ + new Vector2().fromArray( uvs2, a * 2 ), + new Vector2().fromArray( uvs2, b * 2 ), + new Vector2().fromArray( uvs2, c * 2 ) + ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + if ( mesh.matrixAutoUpdate ) mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + setFromPoints: function ( points ) { + + this.vertices = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return this; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { Geometry }; diff --git a/lib/core/InstancedBufferAttribute.js b/lib/core/InstancedBufferAttribute.js new file mode 100644 index 0000000..75144f2 --- /dev/null +++ b/lib/core/InstancedBufferAttribute.js @@ -0,0 +1,45 @@ +import { BufferAttribute } from './BufferAttribute.js'; + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) { + + if ( typeof ( normalized ) === 'number' ) { + + meshPerAttribute = normalized; + + normalized = false; + + console.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' ); + + } + + BufferAttribute.call( this, array, itemSize, normalized ); + + this.meshPerAttribute = meshPerAttribute || 1; + +} + +InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + +} ); + + + +export { InstancedBufferAttribute }; diff --git a/lib/core/InstancedBufferGeometry.js b/lib/core/InstancedBufferGeometry.js new file mode 100644 index 0000000..a021bbf --- /dev/null +++ b/lib/core/InstancedBufferGeometry.js @@ -0,0 +1,40 @@ +import { BufferGeometry } from './BufferGeometry.js'; + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + +} + +InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function ( source ) { + + BufferGeometry.prototype.copy.call( this, source ); + + this.maxInstancedCount = source.maxInstancedCount; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +} ); + +export { InstancedBufferGeometry }; diff --git a/lib/core/InstancedInterleavedBuffer.js b/lib/core/InstancedInterleavedBuffer.js new file mode 100644 index 0000000..12bc90b --- /dev/null +++ b/lib/core/InstancedInterleavedBuffer.js @@ -0,0 +1,33 @@ +import { InterleavedBuffer } from './InterleavedBuffer.js'; + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + +} + +InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + +} ); + +export { InstancedInterleavedBuffer }; diff --git a/lib/core/InterleavedBuffer.js b/lib/core/InterleavedBuffer.js new file mode 100644 index 0000000..dd63120 --- /dev/null +++ b/lib/core/InterleavedBuffer.js @@ -0,0 +1,111 @@ + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InterleavedBuffer( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +} + +Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + +} ); + +Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + +} ); + + +export { InterleavedBuffer }; diff --git a/lib/core/InterleavedBufferAttribute.js b/lib/core/InterleavedBufferAttribute.js new file mode 100644 index 0000000..3cfefca --- /dev/null +++ b/lib/core/InterleavedBufferAttribute.js @@ -0,0 +1,139 @@ + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + +} + +Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + +} ); + +Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + +} ); + + +export { InterleavedBufferAttribute }; diff --git a/lib/core/Layers.js b/lib/core/Layers.js new file mode 100644 index 0000000..345b9cb --- /dev/null +++ b/lib/core/Layers.js @@ -0,0 +1,46 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Layers() { + + this.mask = 1 | 0; + +} + +Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + +} ); + + +export { Layers }; diff --git a/lib/core/Object3D.js b/lib/core/Object3D.js new file mode 100644 index 0000000..f7a47a2 --- /dev/null +++ b/lib/core/Object3D.js @@ -0,0 +1,893 @@ +import { Quaternion } from '../math/Quaternion.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { EventDispatcher } from './EventDispatcher.js'; +import { Euler } from '../math/Euler.js'; +import { Layers } from './Layers.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + +var object3DId = 0; + +function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + +} + +Object3D.DefaultUp = new Vector3( 0, 1, 0 ); +Object3D.DefaultMatrixAutoUpdate = true; + +Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Object3D, + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + applyQuaternion: function ( q ) { + + this.quaternion.premultiply( q ); + + return this; + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateOnWorldAxis: function () { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + var q1 = new Quaternion(); + + return function rotateOnWorldAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This method does not support objects having non-uniformly-scaled parent(s) + + var q1 = new Quaternion(); + var m1 = new Matrix4(); + var target = new Vector3(); + var position = new Vector3(); + + return function lookAt( x, y, z ) { + + if ( x.isVector3 ) { + + target.copy( x ); + + } else { + + target.set( x, y, z ); + + } + + var parent = this.parent; + + this.updateWorldMatrix( true, false ); + + position.setFromMatrixPosition( this.matrixWorld ); + + if ( this.isCamera ) { + + m1.lookAt( position, target, this.up ); + + } else { + + m1.lookAt( target, position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + if ( parent ) { + + m1.extractRotation( parent.matrixWorld ); + q1.setFromRotationMatrix( m1 ); + this.quaternion.premultiply( q1.inverse() ); + + } + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + return this; + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ); + target = new Quaternion(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, target, scale ); + + return target; + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, target ); + + return target; + + }; + + }(), + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); + + }, + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + updateWorldMatrix: function ( updateParents, updateChildren ) { + + var parent = this.parent; + + if ( updateParents === true && parent !== null ) { + + parent.updateWorldMatrix( true, false ); + + } + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + // update children + + if ( updateChildren === true ) { + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateWorldMatrix( false, true ); + + } + + } + + }, + + toJSON: function ( meta ) { + + // meta is a string when called from JSON.stringify + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.isMesh || this.isLine || this.isPoints ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + var parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + var shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + var shapes = extractFromCache( meta.shapes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + +} ); + + +export { Object3D }; diff --git a/lib/core/Raycaster.js b/lib/core/Raycaster.js new file mode 100644 index 0000000..30ca4d9 --- /dev/null +++ b/lib/core/Raycaster.js @@ -0,0 +1,134 @@ +import { Ray } from '../math/Ray.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + +function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + + } + } + } ); + +} + +function ascSort( a, b ) { + + return a.distance - b.distance; + +} + +function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + +} + +Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + +} ); + + +export { Raycaster }; diff --git a/lib/core/Uniform.js b/lib/core/Uniform.js new file mode 100644 index 0000000..8c53319 --- /dev/null +++ b/lib/core/Uniform.js @@ -0,0 +1,24 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + +} + +Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + +}; + +export { Uniform }; diff --git a/lib/extras/Earcut.js b/lib/extras/Earcut.js new file mode 100644 index 0000000..7f7a412 --- /dev/null +++ b/lib/extras/Earcut.js @@ -0,0 +1,810 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + * Port from https://github.com/mapbox/earcut (v2.1.2) + */ + +var Earcut = { + + triangulate: function ( data, holeIndices, dim ) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length, + outerNode = linkedList( data, 0, outerLen, dim, true ), + triangles = []; + + if ( ! outerNode ) return triangles; + + var minX, minY, maxX, maxY, x, y, invSize; + + if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim ); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + + if ( data.length > 80 * dim ) { + + minX = maxX = data[ 0 ]; + minY = maxY = data[ 1 ]; + + for ( var i = dim; i < outerLen; i += dim ) { + + x = data[ i ]; + y = data[ i + 1 ]; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + + invSize = Math.max( maxX - minX, maxY - minY ); + invSize = invSize !== 0 ? 1 / invSize : 0; + + } + + earcutLinked( outerNode, triangles, dim, minX, minY, invSize ); + + return triangles; + + } + +}; + +// create a circular doubly linked list from polygon points in the specified winding order + +function linkedList( data, start, end, dim, clockwise ) { + + var i, last; + + if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) { + + for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } else { + + for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } + + if ( last && equals( last, last.next ) ) { + + removeNode( last ); + last = last.next; + + } + + return last; + +} + +// eliminate colinear or duplicate points + +function filterPoints( start, end ) { + + if ( ! start ) return start; + if ( ! end ) end = start; + + var p = start, again; + + do { + + again = false; + + if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) { + + removeNode( p ); + p = end = p.prev; + if ( p === p.next ) break; + again = true; + + } else { + + p = p.next; + + } + + } while ( again || p !== end ); + + return end; + +} + +// main ear slicing loop which triangulates a polygon (given as a linked list) + +function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) { + + if ( ! ear ) return; + + // interlink polygon nodes in z-order + + if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize ); + + var stop = ear, prev, next; + + // iterate through ears, slicing them one by one + + while ( ear.prev !== ear.next ) { + + prev = ear.prev; + next = ear.next; + + if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) { + + // cut off the triangle + triangles.push( prev.i / dim ); + triangles.push( ear.i / dim ); + triangles.push( next.i / dim ); + + removeNode( ear ); + + // skipping the next vertice leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + + if ( ear === stop ) { + + // try filtering points and slicing again + + if ( ! pass ) { + + earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 ); + + // if this didn't work, try curing all small self-intersections locally + + } else if ( pass === 1 ) { + + ear = cureLocalIntersections( ear, triangles, dim ); + earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 ); + + // as a last resort, try splitting the remaining polygon into two + + } else if ( pass === 2 ) { + + splitEarcut( ear, triangles, dim, minX, minY, invSize ); + + } + + break; + + } + + } + +} + +// check whether a polygon node forms a valid ear with adjacent nodes + +function isEar( ear ) { + + var a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + var p = ear.next.next; + + while ( p !== ear.prev ) { + + if ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) { + + return false; + + } + + p = p.next; + + } + + return true; + +} + +function isEarHashed( ear, minX, minY, invSize ) { + + var a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + + var minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ), + minTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ), + maxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ), + maxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y ); + + // z-order range for the current triangle bbox; + + var minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + // first look for points inside the triangle in increasing z-order + + var p = ear.nextZ; + + while ( p && p.z <= maxZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.nextZ; + + } + + // then look for points in decreasing z-order + + p = ear.prevZ; + + while ( p && p.z >= minZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + + p = p.prevZ; + + } + + return true; + +} + +// go through all polygon nodes and cure small local self-intersections + +function cureLocalIntersections( start, triangles, dim ) { + + var p = start; + + do { + + var a = p.prev, b = p.next.next; + + if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) { + + triangles.push( a.i / dim ); + triangles.push( p.i / dim ); + triangles.push( b.i / dim ); + + // remove two nodes involved + + removeNode( p ); + removeNode( p.next ); + + p = start = b; + + } + + p = p.next; + + } while ( p !== start ); + + return p; + +} + +// try splitting polygon into two and triangulate them independently + +function splitEarcut( start, triangles, dim, minX, minY, invSize ) { + + // look for a valid diagonal that divides the polygon into two + + var a = start; + + do { + + var b = a.next.next; + + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + + var c = splitPolygon( a, b ); + + // filter colinear points around the cuts + + a = filterPoints( a, a.next ); + c = filterPoints( c, c.next ); + + // run earcut on each half + + earcutLinked( a, triangles, dim, minX, minY, invSize ); + earcutLinked( c, triangles, dim, minX, minY, invSize ); + return; + + } + + b = b.next; + + } + + a = a.next; + + } while ( a !== start ); + +} + +// link every hole into the outer loop, producing a single-ring polygon without holes + +function eliminateHoles( data, holeIndices, outerNode, dim ) { + + var queue = [], i, len, start, end, list; + + for ( i = 0, len = holeIndices.length; i < len; i ++ ) { + + start = holeIndices[ i ] * dim; + end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length; + list = linkedList( data, start, end, dim, false ); + if ( list === list.next ) list.steiner = true; + queue.push( getLeftmost( list ) ); + + } + + queue.sort( compareX ); + + // process holes from left to right + + for ( i = 0; i < queue.length; i ++ ) { + + eliminateHole( queue[ i ], outerNode ); + outerNode = filterPoints( outerNode, outerNode.next ); + + } + + return outerNode; + +} + +function compareX( a, b ) { + + return a.x - b.x; + +} + +// find a bridge between vertices that connects hole with an outer ring and and link it + +function eliminateHole( hole, outerNode ) { + + outerNode = findHoleBridge( hole, outerNode ); + + if ( outerNode ) { + + var b = splitPolygon( outerNode, hole ); + + filterPoints( b, b.next ); + + } + +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon + +function findHoleBridge( hole, outerNode ) { + + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = - Infinity, + m; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + + do { + + if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) { + + var x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y ); + + if ( x <= hx && x > qx ) { + + qx = x; + + if ( x === hx ) { + + if ( hy === p.y ) return p; + if ( hy === p.next.y ) return p.next; + + } + + m = p.x < p.next.x ? p : p.next; + + } + + } + + p = p.next; + + } while ( p !== outerNode ); + + if ( ! m ) return null; + + if ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m.next; + + while ( p !== stop ) { + + if ( hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) { + + tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential + + if ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } + + return m; + +} + +// interlink polygon nodes in z-order + +function indexCurve( start, minX, minY, invSize ) { + + var p = start; + + do { + + if ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize ); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + + } while ( p !== start ); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked( p ); + +} + +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html + +function sortLinked( list ) { + + var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; + + do { + + p = list; + list = null; + tail = null; + numMerges = 0; + + while ( p ) { + + numMerges ++; + q = p; + pSize = 0; + + for ( i = 0; i < inSize; i ++ ) { + + pSize ++; + q = q.nextZ; + if ( ! q ) break; + + } + + qSize = inSize; + + while ( pSize > 0 || ( qSize > 0 && q ) ) { + + if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) { + + e = p; + p = p.nextZ; + pSize --; + + } else { + + e = q; + q = q.nextZ; + qSize --; + + } + + if ( tail ) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + + } + + p = q; + + } + + tail.nextZ = null; + inSize *= 2; + + } while ( numMerges > 1 ); + + return list; + +} + +// z-order of a point given coords and inverse of the longer side of data bbox + +function zOrder( x, y, minX, minY, invSize ) { + + // coords are transformed into non-negative 15-bit integer range + + x = 32767 * ( x - minX ) * invSize; + y = 32767 * ( y - minY ) * invSize; + + x = ( x | ( x << 8 ) ) & 0x00FF00FF; + x = ( x | ( x << 4 ) ) & 0x0F0F0F0F; + x = ( x | ( x << 2 ) ) & 0x33333333; + x = ( x | ( x << 1 ) ) & 0x55555555; + + y = ( y | ( y << 8 ) ) & 0x00FF00FF; + y = ( y | ( y << 4 ) ) & 0x0F0F0F0F; + y = ( y | ( y << 2 ) ) & 0x33333333; + y = ( y | ( y << 1 ) ) & 0x55555555; + + return x | ( y << 1 ); + +} + +// find the leftmost node of a polygon ring + +function getLeftmost( start ) { + + var p = start, leftmost = start; + + do { + + if ( p.x < leftmost.x ) leftmost = p; + p = p.next; + + } while ( p !== start ); + + return leftmost; + +} + +// check if a point lies within a convex triangle + +function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) { + + return ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 && + ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 && + ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0; + +} + +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) + +function isValidDiagonal( a, b ) { + + return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && + locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ); + +} + +// signed area of a triangle + +function area( p, q, r ) { + + return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y ); + +} + +// check if two points are equal + +function equals( p1, p2 ) { + + return p1.x === p2.x && p1.y === p2.y; + +} + +// check if two segments intersect + +function intersects( p1, q1, p2, q2 ) { + + if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) || + ( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true; + + return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 && + area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0; + +} + +// check if a polygon diagonal intersects any polygon segments + +function intersectsPolygon( a, b ) { + + var p = a; + + do { + + if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects( p, p.next, a, b ) ) { + + return true; + + } + + p = p.next; + + } while ( p !== a ); + + return false; + +} + +// check if a polygon diagonal is locally inside the polygon + +function locallyInside( a, b ) { + + return area( a.prev, a, a.next ) < 0 ? + area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 : + area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0; + +} + +// check if the middle point of a polygon diagonal is inside the polygon + +function middleInside( a, b ) { + + var p = a, + inside = false, + px = ( a.x + b.x ) / 2, + py = ( a.y + b.y ) / 2; + + do { + + if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y && + ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) { + + inside = ! inside; + + } + + p = p.next; + + } while ( p !== a ); + + return inside; + +} + +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring + +function splitPolygon( a, b ) { + + var a2 = new Node( a.i, a.x, a.y ), + b2 = new Node( b.i, b.x, b.y ), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + +} + +// create a node and optionally link it with previous one (in a circular doubly linked list) + +function insertNode( i, x, y, last ) { + + var p = new Node( i, x, y ); + + if ( ! last ) { + + p.prev = p; + p.next = p; + + } else { + + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + + } + + return p; + +} + +function removeNode( p ) { + + p.next.prev = p.prev; + p.prev.next = p.next; + + if ( p.prevZ ) p.prevZ.nextZ = p.nextZ; + if ( p.nextZ ) p.nextZ.prevZ = p.prevZ; + +} + +function Node( i, x, y ) { + + // vertice index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertice nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = null; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + +} + +function signedArea( data, start, end, dim ) { + + var sum = 0; + + for ( var i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + +} + +export { Earcut }; diff --git a/lib/extras/ImageUtils.js b/lib/extras/ImageUtils.js new file mode 100644 index 0000000..e575c0d --- /dev/null +++ b/lib/extras/ImageUtils.js @@ -0,0 +1,55 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +var ImageUtils = { + + getDataURL: function ( image ) { + + var canvas; + + if ( typeof HTMLCanvasElement == 'undefined' ) { + + return image.src; + + } else if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + var context = canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + +}; + +export { ImageUtils }; diff --git a/lib/extras/ShapeUtils.js b/lib/extras/ShapeUtils.js new file mode 100644 index 0000000..ec050af --- /dev/null +++ b/lib/extras/ShapeUtils.js @@ -0,0 +1,96 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +import { Earcut } from './Earcut.js'; + +var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + triangulateShape: function ( contour, holes ) { + + var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + var holeIndices = []; // array of hole indices + var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + var holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( var i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + var triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( var i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + +}; + +function removeDupEndPts( points ) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + +} + +function addContour( vertices, contour ) { + + for ( var i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + +} + +export { ShapeUtils }; diff --git a/lib/extras/core/Curve.js b/lib/extras/core/Curve.js new file mode 100644 index 0000000..4aac16a --- /dev/null +++ b/lib/extras/core/Curve.js @@ -0,0 +1,425 @@ +import { _Math } from '../../math/Math.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { Matrix4 } from '../../math/Matrix4.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + +/************************************************************** + * Abstract Curve base class + **************************************************************/ + +function Curve() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + +} + +Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u, optionalTarget ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = 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 + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + }, + + fromJSON: function ( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + +} ); + + +export { Curve }; diff --git a/lib/extras/core/CurvePath.js b/lib/extras/core/CurvePath.js new file mode 100644 index 0000000..c739130 --- /dev/null +++ b/lib/extras/core/CurvePath.js @@ -0,0 +1,261 @@ +import { Curve } from './Curve.js'; +import * as Curves from '../curves/Curves.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + +/************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + +function CurvePath() { + + Curve.call( this ); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + +} + +CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new Curves[ 'LineCurve' ]( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + copy: function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.curves = []; + + for ( var i = 0, l = source.curves.length; i < l; i ++ ) { + + var curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + }, + + toJSON: function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + var curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( var i = 0, l = json.curves.length; i < l; i ++ ) { + + var curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + +} ); + + +export { CurvePath }; diff --git a/lib/extras/core/Font.js b/lib/extras/core/Font.js new file mode 100644 index 0000000..e75573b --- /dev/null +++ b/lib/extras/core/Font.js @@ -0,0 +1,145 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + +import { ShapePath } from './ShapePath.js'; + + +function Font( data ) { + + this.type = 'Font'; + + this.data = data; + +} + +Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size ) { + + if ( size === undefined ) size = 100; + + var shapes = []; + var paths = createPaths( text, size, this.data ); + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + +} ); + +function createPaths( text, size, data ) { + + var chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // see #13988 + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var paths = []; + + var offsetX = 0, offsetY = 0; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY, data ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + +} + +function createPath( char, scale, offsetX, offsetY, data ) { + + var glyph = data.glyphs[ char ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + +} + +export { Font }; diff --git a/lib/extras/core/Interpolations.js b/lib/extras/core/Interpolations.js new file mode 100644 index 0000000..0fb812c --- /dev/null +++ b/lib/extras/core/Interpolations.js @@ -0,0 +1,81 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + +function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + +} + +// + +function QuadraticBezierP0( t, p ) { + + var k = 1 - t; + return k * k * p; + +} + +function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + +} + +function QuadraticBezierP2( t, p ) { + + return t * t * p; + +} + +function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + +} + +// + +function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + +} + +function CubicBezierP1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + +} + +function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + +} + +function CubicBezierP3( t, p ) { + + return t * t * t * p; + +} + +function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + +} + +export { CatmullRom, QuadraticBezier, CubicBezier }; diff --git a/lib/extras/core/Path.js b/lib/extras/core/Path.js new file mode 100644 index 0000000..d2b978c --- /dev/null +++ b/lib/extras/core/Path.js @@ -0,0 +1,183 @@ +import { Vector2 } from '../../math/Vector2.js'; +import { CurvePath } from './CurvePath.js'; +import { EllipseCurve } from '../curves/EllipseCurve.js'; +import { SplineCurve } from '../curves/SplineCurve.js'; +import { CubicBezierCurve } from '../curves/CubicBezierCurve.js'; +import { QuadraticBezierCurve } from '../curves/QuadraticBezierCurve.js'; +import { LineCurve } from '../curves/LineCurve.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + +function Path( points ) { + + CurvePath.call( this ); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + +} + +Path.prototype = Object.assign( Object.create( CurvePath.prototype ), { + + constructor: Path, + + setFromPoints: function ( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( var i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + }, + + copy: function ( source ) { + + CurvePath.prototype.copy.call( this, source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + }, + + toJSON: function () { + + var data = CurvePath.prototype.toJSON.call( this ); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + }, + + fromJSON: function ( json ) { + + CurvePath.prototype.fromJSON.call( this, json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + +} ); + + +export { Path }; diff --git a/lib/extras/core/Shape.js b/lib/extras/core/Shape.js new file mode 100644 index 0000000..539415c --- /dev/null +++ b/lib/extras/core/Shape.js @@ -0,0 +1,115 @@ +import { Path } from './Path.js'; +import { _Math } from '../../math/Math.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + +// STEP 1 Create a path. +// STEP 2 Turn path into shape. +// STEP 3 ExtrudeGeometry takes in Shape/Shapes +// STEP 3a - Extract points from each shape, turn to vertices +// STEP 3b - Triangulate each shape, add faces. + +function Shape( points ) { + + Path.call( this, points ); + + this.uuid = _Math.generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + +} + +Shape.prototype = Object.assign( Object.create( Path.prototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + copy: function ( source ) { + + Path.prototype.copy.call( this, source ); + + this.holes = []; + + for ( var i = 0, l = source.holes.length; i < l; i ++ ) { + + var hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + }, + + toJSON: function () { + + var data = Path.prototype.toJSON.call( this ); + + data.uuid = this.uuid; + data.holes = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + var hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Path.prototype.fromJSON.call( this, json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( var i = 0, l = json.holes.length; i < l; i ++ ) { + + var hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + +} ); + + +export { Shape }; diff --git a/lib/extras/core/ShapePath.js b/lib/extras/core/ShapePath.js new file mode 100644 index 0000000..a5f7344 --- /dev/null +++ b/lib/extras/core/ShapePath.js @@ -0,0 +1,286 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + +import { Color } from '../../math/Color.js'; +import { Path } from './Path.js'; +import { Shape } from './Shape.js'; +import { ShapeUtils } from '../ShapeUtils.js'; + +function ShapePath() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + +} + +Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + +} ); + + +export { ShapePath }; diff --git a/lib/extras/curves/ArcCurve.js b/lib/extras/curves/ArcCurve.js new file mode 100644 index 0000000..54b8848 --- /dev/null +++ b/lib/extras/curves/ArcCurve.js @@ -0,0 +1,18 @@ +import { EllipseCurve } from './EllipseCurve.js'; + + +function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + +} + +ArcCurve.prototype = Object.create( EllipseCurve.prototype ); +ArcCurve.prototype.constructor = ArcCurve; + +ArcCurve.prototype.isArcCurve = true; + + +export { ArcCurve }; diff --git a/lib/extras/curves/CatmullRomCurve3.js b/lib/extras/curves/CatmullRomCurve3.js new file mode 100644 index 0000000..5f53a36 --- /dev/null +++ b/lib/extras/curves/CatmullRomCurve3.js @@ -0,0 +1,255 @@ +import { Vector3 } from '../../math/Vector3.js'; +import { Curve } from '../core/Curve.js'; + +/** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + +/* +Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + +This CubicPoly class could be used for reusing some variables and calculations, +but for three.js curve use, it could be possible inlined and flatten into a single function call +which can be placed in CurveUtils. +*/ + +function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + +} + +// + +var tmp = new Vector3(); +var px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly(); + +function CatmullRomCurve3( points, closed, curveType, tension ) { + + Curve.call( this ); + + this.type = 'CatmullRomCurve3'; + + this.points = points || []; + this.closed = closed || false; + this.curveType = curveType || 'centripetal'; + this.tension = tension || 0.5; + +} + +CatmullRomCurve3.prototype = Object.create( Curve.prototype ); +CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + +CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + +CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var points = this.points; + var l = points.length; + + var p = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.curveType === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + +}; + +CatmullRomCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + +}; + +CatmullRomCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + +}; + +CatmullRomCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + +}; + + +export { CatmullRomCurve3 }; diff --git a/lib/extras/curves/CubicBezierCurve.js b/lib/extras/curves/CubicBezierCurve.js new file mode 100644 index 0000000..719bc2f --- /dev/null +++ b/lib/extras/curves/CubicBezierCurve.js @@ -0,0 +1,79 @@ +import { Curve } from '../core/Curve.js'; +import { CubicBezier } from '../core/Interpolations.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + this.v3 = v3 || new Vector2(); + +} + +CubicBezierCurve.prototype = Object.create( Curve.prototype ); +CubicBezierCurve.prototype.constructor = CubicBezierCurve; + +CubicBezierCurve.prototype.isCubicBezierCurve = true; + +CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + +}; + +CubicBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + +}; + +CubicBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + +}; + +CubicBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + +}; + + +export { CubicBezierCurve }; diff --git a/lib/extras/curves/CubicBezierCurve3.js b/lib/extras/curves/CubicBezierCurve3.js new file mode 100644 index 0000000..3864f01 --- /dev/null +++ b/lib/extras/curves/CubicBezierCurve3.js @@ -0,0 +1,80 @@ +import { Curve } from '../core/Curve.js'; +import { CubicBezier } from '../core/Interpolations.js'; +import { Vector3 } from '../../math/Vector3.js'; + + +function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + this.v3 = v3 || new Vector3(); + +} + +CubicBezierCurve3.prototype = Object.create( Curve.prototype ); +CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + +CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + +CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + +}; + +CubicBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + +}; + +CubicBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + +}; + +CubicBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + +}; + + +export { CubicBezierCurve3 }; diff --git a/lib/extras/curves/Curves.js b/lib/extras/curves/Curves.js new file mode 100644 index 0000000..c984a85 --- /dev/null +++ b/lib/extras/curves/Curves.js @@ -0,0 +1,10 @@ +export { ArcCurve } from './ArcCurve.js'; +export { CatmullRomCurve3 } from './CatmullRomCurve3.js'; +export { CubicBezierCurve } from './CubicBezierCurve.js'; +export { CubicBezierCurve3 } from './CubicBezierCurve3.js'; +export { EllipseCurve } from './EllipseCurve.js'; +export { LineCurve } from './LineCurve.js'; +export { LineCurve3 } from './LineCurve3.js'; +export { QuadraticBezierCurve } from './QuadraticBezierCurve.js'; +export { QuadraticBezierCurve3 } from './QuadraticBezierCurve3.js'; +export { SplineCurve } from './SplineCurve.js'; diff --git a/lib/extras/curves/EllipseCurve.js b/lib/extras/curves/EllipseCurve.js new file mode 100644 index 0000000..ea536e6 --- /dev/null +++ b/lib/extras/curves/EllipseCurve.js @@ -0,0 +1,158 @@ +import { Curve } from '../core/Curve.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.type = 'EllipseCurve'; + + this.aX = aX || 0; + this.aY = aY || 0; + + this.xRadius = xRadius || 1; + this.yRadius = yRadius || 1; + + this.aStartAngle = aStartAngle || 0; + this.aEndAngle = aEndAngle || 2 * Math.PI; + + this.aClockwise = aClockwise || false; + + this.aRotation = aRotation || 0; + +} + +EllipseCurve.prototype = Object.create( Curve.prototype ); +EllipseCurve.prototype.constructor = EllipseCurve; + +EllipseCurve.prototype.isEllipseCurve = true; + +EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + +}; + +EllipseCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + +}; + + +EllipseCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + +}; + +EllipseCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + +}; + + +export { EllipseCurve }; diff --git a/lib/extras/curves/LineCurve.js b/lib/extras/curves/LineCurve.js new file mode 100644 index 0000000..6185f35 --- /dev/null +++ b/lib/extras/curves/LineCurve.js @@ -0,0 +1,90 @@ +import { Vector2 } from '../../math/Vector2.js'; +import { Curve } from '../core/Curve.js'; + + +function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve'; + + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + +} + +LineCurve.prototype = Object.create( Curve.prototype ); +LineCurve.prototype.constructor = LineCurve; + +LineCurve.prototype.isLineCurve = true; + +LineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + +}; + +// Line curve is linear, so we can overwrite default getPointAt + +LineCurve.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + +}; + +LineCurve.prototype.getTangent = function ( /* t */ ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + +}; + +LineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +LineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +LineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { LineCurve }; diff --git a/lib/extras/curves/LineCurve3.js b/lib/extras/curves/LineCurve3.js new file mode 100644 index 0000000..5ee830a --- /dev/null +++ b/lib/extras/curves/LineCurve3.js @@ -0,0 +1,82 @@ +import { Vector3 } from '../../math/Vector3.js'; +import { Curve } from '../core/Curve.js'; + + +function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve3'; + + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + +} + +LineCurve3.prototype = Object.create( Curve.prototype ); +LineCurve3.prototype.constructor = LineCurve3; + +LineCurve3.prototype.isLineCurve3 = true; + +LineCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + +}; + +// Line curve is linear, so we can overwrite default getPointAt + +LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + +}; + +LineCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +LineCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +LineCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { LineCurve3 }; diff --git a/lib/extras/curves/QuadraticBezierCurve.js b/lib/extras/curves/QuadraticBezierCurve.js new file mode 100644 index 0000000..71db153 --- /dev/null +++ b/lib/extras/curves/QuadraticBezierCurve.js @@ -0,0 +1,75 @@ +import { Curve } from '../core/Curve.js'; +import { QuadraticBezier } from '../core/Interpolations.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + +} + +QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); +QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + +QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + +QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + +}; + +QuadraticBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +QuadraticBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +QuadraticBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { QuadraticBezierCurve }; diff --git a/lib/extras/curves/QuadraticBezierCurve3.js b/lib/extras/curves/QuadraticBezierCurve3.js new file mode 100644 index 0000000..ab2042d --- /dev/null +++ b/lib/extras/curves/QuadraticBezierCurve3.js @@ -0,0 +1,76 @@ +import { Curve } from '../core/Curve.js'; +import { QuadraticBezier } from '../core/Interpolations.js'; +import { Vector3 } from '../../math/Vector3.js'; + + +function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + +} + +QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); +QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + +QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + +QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + +}; + +QuadraticBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +QuadraticBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +QuadraticBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { QuadraticBezierCurve3 }; diff --git a/lib/extras/curves/SplineCurve.js b/lib/extras/curves/SplineCurve.js new file mode 100644 index 0000000..e844b00 --- /dev/null +++ b/lib/extras/curves/SplineCurve.js @@ -0,0 +1,98 @@ +import { Curve } from '../core/Curve.js'; +import { CatmullRom } from '../core/Interpolations.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.type = 'SplineCurve'; + + this.points = points || []; + +} + +SplineCurve.prototype = Object.create( Curve.prototype ); +SplineCurve.prototype.constructor = SplineCurve; + +SplineCurve.prototype.isSplineCurve = true; + +SplineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var points = this.points; + var p = ( points.length - 1 ) * t; + + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var p1 = points[ intPoint ]; + var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + +}; + +SplineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + +}; + +SplineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + +}; + +SplineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + +}; + + +export { SplineCurve }; diff --git a/lib/extras/objects/ImmediateRenderObject.js b/lib/extras/objects/ImmediateRenderObject.js new file mode 100644 index 0000000..f10becf --- /dev/null +++ b/lib/extras/objects/ImmediateRenderObject.js @@ -0,0 +1,22 @@ +import { Object3D } from '../../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( /* renderCallback */ ) {}; + +} + +ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); +ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + +ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + +export { ImmediateRenderObject }; diff --git a/lib/geometries/BoxGeometry.js b/lib/geometries/BoxGeometry.js new file mode 100644 index 0000000..b4dc014 --- /dev/null +++ b/lib/geometries/BoxGeometry.js @@ -0,0 +1,203 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// BoxGeometry + +function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + +} + +BoxGeometry.prototype = Object.create( Geometry.prototype ); +BoxGeometry.prototype.constructor = BoxGeometry; + +// BoxBufferGeometry + +function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + width = width || 1; + height = height || 1; + depth = depth || 1; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + +} + +BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + +export { BoxGeometry, BoxBufferGeometry }; diff --git a/lib/geometries/CircleGeometry.js b/lib/geometries/CircleGeometry.js new file mode 100644 index 0000000..20904b9 --- /dev/null +++ b/lib/geometries/CircleGeometry.js @@ -0,0 +1,121 @@ +/** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; + +// CircleGeometry + +function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +CircleGeometry.prototype = Object.create( Geometry.prototype ); +CircleGeometry.prototype.constructor = CircleGeometry; + +// CircleBufferGeometry + +function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + +export { CircleGeometry, CircleBufferGeometry }; diff --git a/lib/geometries/ConeGeometry.js b/lib/geometries/ConeGeometry.js new file mode 100644 index 0000000..21df9ac --- /dev/null +++ b/lib/geometries/ConeGeometry.js @@ -0,0 +1,55 @@ +/** + * @author abelnation / http://github.com/abelnation + */ + +import { CylinderGeometry } from './CylinderGeometry.js'; +import { CylinderBufferGeometry } from './CylinderGeometry.js'; + +// ConeGeometry + +function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + +} + +ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); +ConeGeometry.prototype.constructor = ConeGeometry; + +// ConeBufferGeometry + +function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + +} + +ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); +ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + +export { ConeGeometry, ConeBufferGeometry }; diff --git a/lib/geometries/CylinderGeometry.js b/lib/geometries/CylinderGeometry.js new file mode 100644 index 0000000..e345a03 --- /dev/null +++ b/lib/geometries/CylinderGeometry.js @@ -0,0 +1,316 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; + +// CylinderGeometry + +function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +CylinderGeometry.prototype = Object.create( Geometry.prototype ); +CylinderGeometry.prototype.constructor = CylinderGeometry; + +// CylinderBufferGeometry + +function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 1; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 1; + height = height || 1; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + +} + +CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + +export { CylinderGeometry, CylinderBufferGeometry }; diff --git a/lib/geometries/DodecahedronGeometry.js b/lib/geometries/DodecahedronGeometry.js new file mode 100644 index 0000000..384ee81 --- /dev/null +++ b/lib/geometries/DodecahedronGeometry.js @@ -0,0 +1,88 @@ +/** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// DodecahedronGeometry + +function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); +DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + +// DodecahedronBufferGeometry + +function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±1, ±1, ±1) + - 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, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + +export { DodecahedronGeometry, DodecahedronBufferGeometry }; diff --git a/lib/geometries/EdgesGeometry.js b/lib/geometries/EdgesGeometry.js new file mode 100644 index 0000000..aef6085 --- /dev/null +++ b/lib/geometries/EdgesGeometry.js @@ -0,0 +1,113 @@ +/** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Geometry } from '../core/Geometry.js'; +import { _Math } from '../math/Math.js'; + +function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + edges[ key ].face2 = i; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var e = edges[ key ]; + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + +} + +EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); +EdgesGeometry.prototype.constructor = EdgesGeometry; + + +export { EdgesGeometry }; diff --git a/lib/geometries/ExtrudeGeometry.js b/lib/geometries/ExtrudeGeometry.js new file mode 100644 index 0000000..513f18f --- /dev/null +++ b/lib/geometries/ExtrudeGeometry.js @@ -0,0 +1,832 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; +import { ShapeUtils } from '../extras/ShapeUtils.js'; + +// ExtrudeGeometry + +function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + +} + +ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); +ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + +ExtrudeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + +}; + +// ExtrudeBufferGeometry + +function ExtrudeBufferGeometry( shapes, options ) { + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + var scope = this; + + var verticesArray = []; + var uvArray = []; + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + addShape( shape ); + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + var placeholder = []; + + // options + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + var steps = options.steps !== undefined ? options.steps : 1; + var depth = options.depth !== undefined ? options.depth : 100; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var extrudePath = options.extrudePath; + + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // deprecated options + + if ( options.amount !== undefined ) { + + console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' ); + depth = options.amount; + + } + + // + + var extrudePts, extrudeByPath = false; + var splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, depth + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length / 3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + +} + +ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + +ExtrudeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + +}; + +// + +var WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } +}; + +function toJSON( shapes, options, data ) { + + // + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + // + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + +} + + +export { ExtrudeGeometry, ExtrudeBufferGeometry }; diff --git a/lib/geometries/Geometries.js b/lib/geometries/Geometries.js new file mode 100644 index 0000000..c374cb5 --- /dev/null +++ b/lib/geometries/Geometries.js @@ -0,0 +1,22 @@ +export { WireframeGeometry } from './WireframeGeometry.js'; +export { ParametricGeometry, ParametricBufferGeometry } from './ParametricGeometry.js'; +export { TetrahedronGeometry, TetrahedronBufferGeometry } from './TetrahedronGeometry.js'; +export { OctahedronGeometry, OctahedronBufferGeometry } from './OctahedronGeometry.js'; +export { IcosahedronGeometry, IcosahedronBufferGeometry } from './IcosahedronGeometry.js'; +export { DodecahedronGeometry, DodecahedronBufferGeometry } from './DodecahedronGeometry.js'; +export { PolyhedronGeometry, PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; +export { TubeGeometry, TubeBufferGeometry } from './TubeGeometry.js'; +export { TorusKnotGeometry, TorusKnotBufferGeometry } from './TorusKnotGeometry.js'; +export { TorusGeometry, TorusBufferGeometry } from './TorusGeometry.js'; +export { TextGeometry, TextBufferGeometry } from './TextGeometry.js'; +export { SphereGeometry, SphereBufferGeometry } from './SphereGeometry.js'; +export { RingGeometry, RingBufferGeometry } from './RingGeometry.js'; +export { PlaneGeometry, PlaneBufferGeometry } from './PlaneGeometry.js'; +export { LatheGeometry, LatheBufferGeometry } from './LatheGeometry.js'; +export { ShapeGeometry, ShapeBufferGeometry } from './ShapeGeometry.js'; +export { ExtrudeGeometry, ExtrudeBufferGeometry } from './ExtrudeGeometry.js'; +export { EdgesGeometry } from './EdgesGeometry.js'; +export { ConeGeometry, ConeBufferGeometry } from './ConeGeometry.js'; +export { CylinderGeometry, CylinderBufferGeometry } from './CylinderGeometry.js'; +export { CircleGeometry, CircleBufferGeometry } from './CircleGeometry.js'; +export { BoxGeometry, BoxBufferGeometry } from './BoxGeometry.js'; diff --git a/lib/geometries/IcosahedronGeometry.js b/lib/geometries/IcosahedronGeometry.js new file mode 100644 index 0000000..00f5249 --- /dev/null +++ b/lib/geometries/IcosahedronGeometry.js @@ -0,0 +1,64 @@ +/** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// IcosahedronGeometry + +function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); +IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + +// IcosahedronBufferGeometry + +function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + +export { IcosahedronGeometry, IcosahedronBufferGeometry }; diff --git a/lib/geometries/LatheGeometry.js b/lib/geometries/LatheGeometry.js new file mode 100644 index 0000000..907de87 --- /dev/null +++ b/lib/geometries/LatheGeometry.js @@ -0,0 +1,186 @@ +/** + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; +import { _Math } from '../math/Math.js'; + +// LatheGeometry + +function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + +} + +LatheGeometry.prototype = Object.create( Geometry.prototype ); +LatheGeometry.prototype.constructor = LatheGeometry; + +// LatheBufferGeometry + +function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + +} + +LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + +export { LatheGeometry, LatheBufferGeometry }; diff --git a/lib/geometries/OctahedronGeometry.js b/lib/geometries/OctahedronGeometry.js new file mode 100644 index 0000000..4513a7d --- /dev/null +++ b/lib/geometries/OctahedronGeometry.js @@ -0,0 +1,60 @@ +/** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// OctahedronGeometry + +function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +OctahedronGeometry.prototype = Object.create( Geometry.prototype ); +OctahedronGeometry.prototype.constructor = OctahedronGeometry; + +// OctahedronBufferGeometry + +function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, + 0, 5, 2, 1, 2, 5, 1, 5, 3, + 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + +export { OctahedronGeometry, OctahedronBufferGeometry }; diff --git a/lib/geometries/ParametricGeometry.js b/lib/geometries/ParametricGeometry.js new file mode 100644 index 0000000..329230c --- /dev/null +++ b/lib/geometries/ParametricGeometry.js @@ -0,0 +1,163 @@ +/** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// ParametricGeometry + +function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + +} + +ParametricGeometry.prototype = Object.create( Geometry.prototype ); +ParametricGeometry.prototype.constructor = ParametricGeometry; + +// ParametricBufferGeometry + +function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + if ( func.length < 3 ) { + + console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' ); + + } + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + +export { ParametricGeometry, ParametricBufferGeometry }; diff --git a/lib/geometries/PlaneGeometry.js b/lib/geometries/PlaneGeometry.js new file mode 100644 index 0000000..6b4fb3f --- /dev/null +++ b/lib/geometries/PlaneGeometry.js @@ -0,0 +1,126 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +// PlaneGeometry + +function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + +} + +PlaneGeometry.prototype = Object.create( Geometry.prototype ); +PlaneGeometry.prototype.constructor = PlaneGeometry; + +// PlaneBufferGeometry + +function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + width = width || 1; + height = height || 1; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + +export { PlaneGeometry, PlaneBufferGeometry }; diff --git a/lib/geometries/PolyhedronGeometry.js b/lib/geometries/PolyhedronGeometry.js new file mode 100644 index 0000000..b06d0c4 --- /dev/null +++ b/lib/geometries/PolyhedronGeometry.js @@ -0,0 +1,341 @@ +/** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; + +// PolyhedronGeometry + +function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + +} + +PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); +PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + +// PolyhedronBufferGeometry + +function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + +} + +PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + +export { PolyhedronGeometry, PolyhedronBufferGeometry }; diff --git a/lib/geometries/RingGeometry.js b/lib/geometries/RingGeometry.js new file mode 100644 index 0000000..8acbda1 --- /dev/null +++ b/lib/geometries/RingGeometry.js @@ -0,0 +1,152 @@ +/** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; + +// RingGeometry + +function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +RingGeometry.prototype = Object.create( Geometry.prototype ); +RingGeometry.prototype.constructor = RingGeometry; + +// RingBufferGeometry + +function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0.5; + outerRadius = outerRadius || 1; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + +export { RingGeometry, RingBufferGeometry }; diff --git a/lib/geometries/ShapeGeometry.js b/lib/geometries/ShapeGeometry.js new file mode 100644 index 0000000..4f59dfa --- /dev/null +++ b/lib/geometries/ShapeGeometry.js @@ -0,0 +1,222 @@ +/** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { ShapeUtils } from '../extras/ShapeUtils.js'; + +// ShapeGeometry + +function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + +} + +ShapeGeometry.prototype = Object.create( Geometry.prototype ); +ShapeGeometry.prototype.constructor = ShapeGeometry; + +ShapeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + +}; + +// ShapeBufferGeometry + +function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + +} + +ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + +ShapeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + +}; + +// + +function toJSON( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + +} + + +export { ShapeGeometry, ShapeBufferGeometry }; diff --git a/lib/geometries/SphereGeometry.js b/lib/geometries/SphereGeometry.js new file mode 100644 index 0000000..287d12f --- /dev/null +++ b/lib/geometries/SphereGeometry.js @@ -0,0 +1,152 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// SphereGeometry + +function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +SphereGeometry.prototype = Object.create( Geometry.prototype ); +SphereGeometry.prototype.constructor = SphereGeometry; + +// SphereBufferGeometry + +function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + +export { SphereGeometry, SphereBufferGeometry }; diff --git a/lib/geometries/TetrahedronGeometry.js b/lib/geometries/TetrahedronGeometry.js new file mode 100644 index 0000000..7f4a7cd --- /dev/null +++ b/lib/geometries/TetrahedronGeometry.js @@ -0,0 +1,57 @@ +/** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// TetrahedronGeometry + +function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); +TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + +// TetrahedronBufferGeometry + +function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + +export { TetrahedronGeometry, TetrahedronBufferGeometry }; diff --git a/lib/geometries/TextGeometry.js b/lib/geometries/TextGeometry.js new file mode 100644 index 0000000..bd8ba8a --- /dev/null +++ b/lib/geometries/TextGeometry.js @@ -0,0 +1,81 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + +import { Geometry } from '../core/Geometry.js'; +import { ExtrudeBufferGeometry } from './ExtrudeGeometry.js'; + +// TextGeometry + +function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + +} + +TextGeometry.prototype = Object.create( Geometry.prototype ); +TextGeometry.prototype.constructor = TextGeometry; + +// TextBufferGeometry + +function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size ); + + // translate parameters to ExtrudeGeometry API + + parameters.depth = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + +} + +TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); +TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + +export { TextGeometry, TextBufferGeometry }; diff --git a/lib/geometries/TorusGeometry.js b/lib/geometries/TorusGeometry.js new file mode 100644 index 0000000..401d34b --- /dev/null +++ b/lib/geometries/TorusGeometry.js @@ -0,0 +1,142 @@ +/** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// TorusGeometry + +function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + +} + +TorusGeometry.prototype = Object.create( Geometry.prototype ); +TorusGeometry.prototype.constructor = TorusGeometry; + +// TorusBufferGeometry + +function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 1; + tube = tube || 0.4; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + +export { TorusGeometry, TorusBufferGeometry }; diff --git a/lib/geometries/TorusKnotGeometry.js b/lib/geometries/TorusKnotGeometry.js new file mode 100644 index 0000000..6041d99 --- /dev/null +++ b/lib/geometries/TorusKnotGeometry.js @@ -0,0 +1,194 @@ +/** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// TorusKnotGeometry + +function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + +} + +TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); +TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + +// TorusKnotBufferGeometry + +function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 1; + tube = tube || 0.4; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + +} + +TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + +export { TorusKnotGeometry, TorusKnotBufferGeometry }; diff --git a/lib/geometries/TubeGeometry.js b/lib/geometries/TubeGeometry.js new file mode 100644 index 0000000..2a8080c --- /dev/null +++ b/lib/geometries/TubeGeometry.js @@ -0,0 +1,223 @@ +/** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; + +// TubeGeometry + +function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + +} + +TubeGeometry.prototype = Object.create( Geometry.prototype ); +TubeGeometry.prototype.constructor = TubeGeometry; + +// TubeBufferGeometry + +function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + var P = new Vector3(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + +} + +TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + +export { TubeGeometry, TubeBufferGeometry }; diff --git a/lib/geometries/WireframeGeometry.js b/lib/geometries/WireframeGeometry.js new file mode 100644 index 0000000..521b4c6 --- /dev/null +++ b/lib/geometries/WireframeGeometry.js @@ -0,0 +1,179 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + +} + +WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); +WireframeGeometry.prototype.constructor = WireframeGeometry; + + +export { WireframeGeometry }; diff --git a/lib/helpers/ArrowHelper.js b/lib/helpers/ArrowHelper.js new file mode 100644 index 0000000..36c3160 --- /dev/null +++ b/lib/helpers/ArrowHelper.js @@ -0,0 +1,139 @@ +/** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Object3D } from '../core/Object3D.js'; +import { CylinderBufferGeometry } from '../geometries/CylinderGeometry.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Mesh } from '../objects/Mesh.js'; +import { Line } from '../objects/Line.js'; +import { Vector3 } from '../math/Vector3.js'; + +var lineGeometry, coneGeometry; + +function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( dir === undefined ) dir = new THREE.Vector3( 0, 0, 1 ); + if ( origin === undefined ) origin = new THREE.Vector3( 0, 0, 0 ); + if ( length === undefined ) length = 1; + if ( color === undefined ) color = 0xffff00; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + +} + +ArrowHelper.prototype = Object.create( Object3D.prototype ); +ArrowHelper.prototype.constructor = ArrowHelper; + +ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + +}() ); + +ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + +}; + +ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + +}; + +ArrowHelper.prototype.copy = function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + this.line.copy( source.line ); + this.cone.copy( source.cone ); + + return this; + +}; + +ArrowHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + +}; + +export { ArrowHelper }; diff --git a/lib/helpers/AxesHelper.js b/lib/helpers/AxesHelper.js new file mode 100644 index 0000000..34a7f42 --- /dev/null +++ b/lib/helpers/AxesHelper.js @@ -0,0 +1,42 @@ +/** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function AxesHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + +} + +AxesHelper.prototype = Object.create( LineSegments.prototype ); +AxesHelper.prototype.constructor = AxesHelper; + + +export { AxesHelper }; diff --git a/lib/helpers/Box3Helper.js b/lib/helpers/Box3Helper.js new file mode 100644 index 0000000..44288b5 --- /dev/null +++ b/lib/helpers/Box3Helper.js @@ -0,0 +1,55 @@ +/** + * @author WestLangley / http://github.com/WestLangley + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Object3D } from '../core/Object3D.js'; + +function Box3Helper( box, hex ) { + + this.type = 'Box3Helper'; + + this.box = box; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ] ); + + var 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 ]; + + var geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.geometry.computeBoundingSphere(); + +} + +Box3Helper.prototype = Object.create( LineSegments.prototype ); +Box3Helper.prototype.constructor = Box3Helper; + +Box3Helper.prototype.updateMatrixWorld = function ( force ) { + + var box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + +}; + +export { Box3Helper }; diff --git a/lib/helpers/BoxHelper.js b/lib/helpers/BoxHelper.js new file mode 100644 index 0000000..6486e7d --- /dev/null +++ b/lib/helpers/BoxHelper.js @@ -0,0 +1,120 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + +import { Box3 } from '../math/Box3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + +} + +BoxHelper.prototype = Object.create( LineSegments.prototype ); +BoxHelper.prototype.constructor = BoxHelper; + +BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + +} )(); + +BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + +}; + +BoxHelper.prototype.copy = function ( source ) { + + LineSegments.prototype.copy.call( this, source ); + + this.object = source.object; + + return this; + +}; + +BoxHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + +}; + +export { BoxHelper }; diff --git a/lib/helpers/CameraHelper.js b/lib/helpers/CameraHelper.js new file mode 100644 index 0000000..dc06797 --- /dev/null +++ b/lib/helpers/CameraHelper.js @@ -0,0 +1,210 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + +import { Camera } from '../cameras/Camera.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { Color } from '../math/Color.js'; +import { FaceColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 0x333333 ); + + // near + + addLine( 'n1', 'n2', colorFrustum ); + addLine( 'n2', 'n4', colorFrustum ); + addLine( 'n4', 'n3', colorFrustum ); + addLine( 'n3', 'n1', colorFrustum ); + + // far + + addLine( 'f1', 'f2', colorFrustum ); + addLine( 'f2', 'f4', colorFrustum ); + addLine( 'f4', 'f3', colorFrustum ); + addLine( 'f3', 'f1', colorFrustum ); + + // sides + + addLine( 'n1', 'f1', colorFrustum ); + addLine( 'n2', 'f2', colorFrustum ); + addLine( 'n3', 'f3', colorFrustum ); + addLine( 'n4', 'f4', colorFrustum ); + + // cone + + addLine( 'p', 'n1', colorCone ); + addLine( 'p', 'n2', colorCone ); + addLine( 'p', 'n3', colorCone ); + addLine( 'p', 'n4', colorCone ); + + // up + + addLine( 'u1', 'u2', colorUp ); + addLine( 'u2', 'u3', colorUp ); + addLine( 'u3', 'u1', colorUp ); + + // target + + addLine( 'c', 't', colorTarget ); + addLine( 'p', 'c', colorCross ); + + // cross + + addLine( 'cn1', 'cn2', colorCross ); + addLine( 'cn3', 'cn4', colorCross ); + + addLine( 'cf1', 'cf2', colorCross ); + addLine( 'cf3', 'cf4', colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + +} + +CameraHelper.prototype = Object.create( LineSegments.prototype ); +CameraHelper.prototype.constructor = CameraHelper; + +CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( 'c', 0, 0, - 1 ); + setPoint( 't', 0, 0, 1 ); + + // near + + setPoint( 'n1', - w, - h, - 1 ); + setPoint( 'n2', w, - h, - 1 ); + setPoint( 'n3', - w, h, - 1 ); + setPoint( 'n4', w, h, - 1 ); + + // far + + setPoint( 'f1', - w, - h, 1 ); + setPoint( 'f2', w, - h, 1 ); + setPoint( 'f3', - w, h, 1 ); + setPoint( 'f4', w, h, 1 ); + + // up + + setPoint( 'u1', w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', - w, 0, 1 ); + setPoint( 'cf2', w, 0, 1 ); + setPoint( 'cf3', 0, - h, 1 ); + setPoint( 'cf4', 0, h, 1 ); + + setPoint( 'cn1', - w, 0, - 1 ); + setPoint( 'cn2', w, 0, - 1 ); + setPoint( 'cn3', 0, - h, - 1 ); + setPoint( 'cn4', 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + +}(); + + +export { CameraHelper }; diff --git a/lib/helpers/DirectionalLightHelper.js b/lib/helpers/DirectionalLightHelper.js new file mode 100644 index 0000000..e920d53 --- /dev/null +++ b/lib/helpers/DirectionalLightHelper.js @@ -0,0 +1,98 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Object3D } from '../core/Object3D.js'; +import { Line } from '../objects/Line.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; + +function DirectionalLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + +} + +DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); +DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + +DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + +}; + +DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( v3 ); + this.targetLine.scale.z = v3.length(); + + }; + +}(); + + +export { DirectionalLightHelper }; diff --git a/lib/helpers/FaceNormalsHelper.js b/lib/helpers/FaceNormalsHelper.js new file mode 100644 index 0000000..ae78a78 --- /dev/null +++ b/lib/helpers/FaceNormalsHelper.js @@ -0,0 +1,118 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Matrix3 } from '../math/Matrix3.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + +} + +FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); +FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + +FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + +}() ); + + +export { FaceNormalsHelper }; diff --git a/lib/helpers/GridHelper.js b/lib/helpers/GridHelper.js new file mode 100644 index 0000000..2b38bab --- /dev/null +++ b/lib/helpers/GridHelper.js @@ -0,0 +1,52 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Color } from '../math/Color.js'; + +function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + +} + +GridHelper.prototype = Object.create( LineSegments.prototype ); +GridHelper.prototype.constructor = GridHelper; + +export { GridHelper }; diff --git a/lib/helpers/HemisphereLightHelper.js b/lib/helpers/HemisphereLightHelper.js new file mode 100644 index 0000000..32da691 --- /dev/null +++ b/lib/helpers/HemisphereLightHelper.js @@ -0,0 +1,96 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from '../core/Object3D.js'; +import { Mesh } from '../objects/Mesh.js'; +import { VertexColors } from '../constants.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { OctahedronBufferGeometry } from '../geometries/OctahedronGeometry.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; + +function HemisphereLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + if ( this.color === undefined ) this.material.vertexColors = VertexColors; + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + +} + +HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); +HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + +HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + +}; + +HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + }; + +}(); + + +export { HemisphereLightHelper }; diff --git a/lib/helpers/PlaneHelper.js b/lib/helpers/PlaneHelper.js new file mode 100644 index 0000000..edb9433 --- /dev/null +++ b/lib/helpers/PlaneHelper.js @@ -0,0 +1,63 @@ +/** + * @author WestLangley / http://github.com/WestLangley + */ + +import { Line } from '../objects/Line.js'; +import { Mesh } from '../objects/Mesh.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Object3D } from '../core/Object3D.js'; +import { FrontSide, BackSide } from '../constants.js'; + +function PlaneHelper( plane, size, hex ) { + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = ( size === undefined ) ? 1 : size; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + Line.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + // + + var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + var geometry2 = new BufferGeometry(); + geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) ); + +} + +PlaneHelper.prototype = Object.create( Line.prototype ); +PlaneHelper.prototype.constructor = PlaneHelper; + +PlaneHelper.prototype.updateMatrixWorld = function ( force ) { + + var scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here + + this.lookAt( this.plane.normal ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + +}; + +export { PlaneHelper }; diff --git a/lib/helpers/PointLightHelper.js b/lib/helpers/PointLightHelper.js new file mode 100644 index 0000000..c5290e4 --- /dev/null +++ b/lib/helpers/PointLightHelper.js @@ -0,0 +1,92 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { Mesh } from '../objects/Mesh.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { SphereBufferGeometry } from '../geometries/SphereGeometry.js'; + +function PointLightHelper( light, sphereSize, color ) { + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + +} + +PointLightHelper.prototype = Object.create( Mesh.prototype ); +PointLightHelper.prototype.constructor = PointLightHelper; + +PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + +}; + +PointLightHelper.prototype.update = function () { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + +}; + + +export { PointLightHelper }; diff --git a/lib/helpers/PolarGridHelper.js b/lib/helpers/PolarGridHelper.js new file mode 100644 index 0000000..bfbb0f0 --- /dev/null +++ b/lib/helpers/PolarGridHelper.js @@ -0,0 +1,95 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Color } from '../math/Color.js'; + +function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + +} + +PolarGridHelper.prototype = Object.create( LineSegments.prototype ); +PolarGridHelper.prototype.constructor = PolarGridHelper; + +export { PolarGridHelper }; diff --git a/lib/helpers/RectAreaLightHelper.js b/lib/helpers/RectAreaLightHelper.js new file mode 100644 index 0000000..dfeca0e --- /dev/null +++ b/lib/helpers/RectAreaLightHelper.js @@ -0,0 +1,81 @@ +/** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + +import { Object3D } from '../core/Object3D.js'; +import { Line } from '../objects/Line.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; + +function RectAreaLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var material = new LineBasicMaterial( { fog: false } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.line = new Line( geometry, material ); + this.add( this.line ); + + + this.update(); + +} + +RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); +RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + +RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + +}; + +RectAreaLightHelper.prototype.update = function () { + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = this.line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + if ( this.color !== undefined ) { + + this.line.material.color.set( this.color ); + + } else { + + this.line.material.color.copy( this.light.color ); + + } + +}; + +export { RectAreaLightHelper }; diff --git a/lib/helpers/SkeletonHelper.js b/lib/helpers/SkeletonHelper.js new file mode 100644 index 0000000..0756de3 --- /dev/null +++ b/lib/helpers/SkeletonHelper.js @@ -0,0 +1,128 @@ +/** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Color } from '../math/Color.js'; +import { Vector3 } from '../math/Vector3.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Object3D } from '../core/Object3D.js'; + +function getBoneList( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + +} + +function SkeletonHelper( object ) { + + var bones = getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + +} + +SkeletonHelper.prototype = Object.create( LineSegments.prototype ); +SkeletonHelper.prototype.constructor = SkeletonHelper; + +SkeletonHelper.prototype.updateMatrixWorld = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function updateMatrixWorld( force ) { + + var bones = this.bones; + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + +}(); + +export { SkeletonHelper }; diff --git a/lib/helpers/SpotLightHelper.js b/lib/helpers/SpotLightHelper.js new file mode 100644 index 0000000..4d006d8 --- /dev/null +++ b/lib/helpers/SpotLightHelper.js @@ -0,0 +1,103 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Object3D } from '../core/Object3D.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function SpotLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + +} + +SpotLightHelper.prototype = Object.create( Object3D.prototype ); +SpotLightHelper.prototype.constructor = SpotLightHelper; + +SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + +}; + +SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + this.light.updateMatrixWorld(); + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + }; + +}(); + + +export { SpotLightHelper }; diff --git a/lib/helpers/VertexNormalsHelper.js b/lib/helpers/VertexNormalsHelper.js new file mode 100644 index 0000000..fb16909 --- /dev/null +++ b/lib/helpers/VertexNormalsHelper.js @@ -0,0 +1,153 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Matrix3 } from '../math/Matrix3.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + +} + +VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); +VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + +VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + +}() ); + + +export { VertexNormalsHelper }; diff --git a/lib/lights/AmbientLight.js b/lib/lights/AmbientLight.js new file mode 100644 index 0000000..1c52837 --- /dev/null +++ b/lib/lights/AmbientLight.js @@ -0,0 +1,26 @@ +import { Light } from './Light.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + +} + +AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + +} ); + + +export { AmbientLight }; diff --git a/lib/lights/DirectionalLight.js b/lib/lights/DirectionalLight.js new file mode 100644 index 0000000..396a2a2 --- /dev/null +++ b/lib/lights/DirectionalLight.js @@ -0,0 +1,46 @@ +import { Light } from './Light.js'; +import { DirectionalLightShadow } from './DirectionalLightShadow.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + +} + +DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + +} ); + + +export { DirectionalLight }; diff --git a/lib/lights/DirectionalLightShadow.js b/lib/lights/DirectionalLightShadow.js new file mode 100644 index 0000000..7c2a5fc --- /dev/null +++ b/lib/lights/DirectionalLightShadow.js @@ -0,0 +1,21 @@ +import { LightShadow } from './LightShadow.js'; +import { OrthographicCamera } from '../cameras/OrthographicCamera.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + +} + +DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + +} ); + + +export { DirectionalLightShadow }; diff --git a/lib/lights/HemisphereLight.js b/lib/lights/HemisphereLight.js new file mode 100644 index 0000000..84ccacb --- /dev/null +++ b/lib/lights/HemisphereLight.js @@ -0,0 +1,43 @@ +import { Light } from './Light.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + +} + +HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + +} ); + + +export { HemisphereLight }; diff --git a/lib/lights/Light.js b/lib/lights/Light.js new file mode 100644 index 0000000..e4db9c0 --- /dev/null +++ b/lib/lights/Light.js @@ -0,0 +1,62 @@ +import { Object3D } from '../core/Object3D.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + +} + +Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + +} ); + + +export { Light }; diff --git a/lib/lights/LightShadow.js b/lib/lights/LightShadow.js new file mode 100644 index 0000000..294781c --- /dev/null +++ b/lib/lights/LightShadow.js @@ -0,0 +1,61 @@ +import { Matrix4 } from '../math/Matrix4.js'; +import { Vector2 } from '../math/Vector2.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + +} + +Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + +} ); + + +export { LightShadow }; diff --git a/lib/lights/PointLight.js b/lib/lights/PointLight.js new file mode 100644 index 0000000..1620787 --- /dev/null +++ b/lib/lights/PointLight.js @@ -0,0 +1,62 @@ +import { Light } from './Light.js'; +import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js'; +import { LightShadow } from './LightShadow.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + + +function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / ( 4 * Math.PI ); + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + +} + +PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + +} ); + + +export { PointLight }; diff --git a/lib/lights/RectAreaLight.js b/lib/lights/RectAreaLight.js new file mode 100644 index 0000000..d65f35b --- /dev/null +++ b/lib/lights/RectAreaLight.js @@ -0,0 +1,48 @@ +import { Light } from './Light.js'; + +/** + * @author abelnation / http://github.com/abelnation + */ + +function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + +} + +RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + +} ); + +export { RectAreaLight }; diff --git a/lib/lights/SpotLight.js b/lib/lights/SpotLight.js new file mode 100644 index 0000000..90d891a --- /dev/null +++ b/lib/lights/SpotLight.js @@ -0,0 +1,72 @@ +import { Light } from './Light.js'; +import { SpotLightShadow } from './SpotLightShadow.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI; + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + +} + +SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + +} ); + + +export { SpotLight }; diff --git a/lib/lights/SpotLightShadow.js b/lib/lights/SpotLightShadow.js new file mode 100644 index 0000000..0a80e7b --- /dev/null +++ b/lib/lights/SpotLightShadow.js @@ -0,0 +1,43 @@ +import { LightShadow } from './LightShadow.js'; +import { _Math } from '../math/Math.js'; +import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + +} + +SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + +} ); + + +export { SpotLightShadow }; diff --git a/lib/loaders/AnimationLoader.js b/lib/loaders/AnimationLoader.js new file mode 100644 index 0000000..161ebf9 --- /dev/null +++ b/lib/loaders/AnimationLoader.js @@ -0,0 +1,57 @@ +import { AnimationClip } from '../animation/AnimationClip.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author bhouston / http://clara.io/ + */ + +function AnimationLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( AnimationLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json, onLoad ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + onLoad( animations ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { AnimationLoader }; diff --git a/lib/loaders/AudioLoader.js b/lib/loaders/AudioLoader.js new file mode 100644 index 0000000..b9a5d61 --- /dev/null +++ b/lib/loaders/AudioLoader.js @@ -0,0 +1,49 @@ +import { AudioContext } from '../audio/AudioContext.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + +function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + // Create a copy of the buffer. The `decodeAudioData` method + // detaches the buffer when complete, preventing reuse. + var bufferCopy = buffer.slice( 0 ); + + var context = AudioContext.getContext(); + context.decodeAudioData( bufferCopy, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { AudioLoader }; diff --git a/lib/loaders/BufferGeometryLoader.js b/lib/loaders/BufferGeometryLoader.js new file mode 100644 index 0000000..381c224 --- /dev/null +++ b/lib/loaders/BufferGeometryLoader.js @@ -0,0 +1,114 @@ +import { Sphere } from '../math/Sphere.js'; +import { Vector3 } from '../math/Vector3.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + +var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array +}; + +export { BufferGeometryLoader }; diff --git a/lib/loaders/Cache.js b/lib/loaders/Cache.js new file mode 100644 index 0000000..9f63c8d --- /dev/null +++ b/lib/loaders/Cache.js @@ -0,0 +1,46 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + +}; + + +export { Cache }; diff --git a/lib/loaders/CompressedTextureLoader.js b/lib/loaders/CompressedTextureLoader.js new file mode 100644 index 0000000..6f298d7 --- /dev/null +++ b/lib/loaders/CompressedTextureLoader.js @@ -0,0 +1,141 @@ +import { LinearFilter } from '../constants.js'; +import { FileLoader } from './FileLoader.js'; +import { CompressedTexture } from '../textures/CompressedTexture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + +function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +} + +Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { CompressedTextureLoader }; diff --git a/lib/loaders/CubeTextureLoader.js b/lib/loaders/CubeTextureLoader.js new file mode 100644 index 0000000..187d55d --- /dev/null +++ b/lib/loaders/CubeTextureLoader.js @@ -0,0 +1,77 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { ImageLoader } from './ImageLoader.js'; +import { CubeTexture } from '../textures/CubeTexture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( CubeTextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { CubeTextureLoader }; diff --git a/lib/loaders/DataTextureLoader.js b/lib/loaders/DataTextureLoader.js new file mode 100644 index 0000000..49f4d90 --- /dev/null +++ b/lib/loaders/DataTextureLoader.js @@ -0,0 +1,102 @@ +import { LinearFilter, LinearMipMapLinearFilter, ClampToEdgeWrapping } from '../constants.js'; +import { FileLoader } from './FileLoader.js'; +import { DataTexture } from '../textures/DataTexture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + +function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +} + +Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { DataTextureLoader }; diff --git a/lib/loaders/FileLoader.js b/lib/loaders/FileLoader.js new file mode 100644 index 0000000..d41fe75 --- /dev/null +++ b/lib/loaders/FileLoader.js @@ -0,0 +1,319 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Cache } from './Cache.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +var loading = {}; + +function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = decodeURIComponent( data ); + + if ( isBase64 ) data = atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + var view = new Uint8Array( data.length ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ view.buffer ], { type: mimeType } ); + + } else { + + response = view.buffer; + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + // Initialise array for duplicate requests + + loading[ url ] = []; + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = this.response; + + Cache.add( url, response ); + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + if ( this.status === 200 || this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + request.addEventListener( 'progress', function ( event ) { + + var callbacks = loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + request.addEventListener( 'abort', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + +} ); + + +export { FileLoader }; diff --git a/lib/loaders/FontLoader.js b/lib/loaders/FontLoader.js new file mode 100644 index 0000000..6cb6a0d --- /dev/null +++ b/lib/loaders/FontLoader.js @@ -0,0 +1,62 @@ +import { Font } from '../extras/core/Font.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { FontLoader }; diff --git a/lib/loaders/ImageBitmapLoader.js b/lib/loaders/ImageBitmapLoader.js new file mode 100644 index 0000000..8256a30 --- /dev/null +++ b/lib/loaders/ImageBitmapLoader.js @@ -0,0 +1,110 @@ +/** + * @author thespite / http://clicktorelease.com/ + */ + +import { Cache } from './Cache.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function ImageBitmapLoader( manager ) { + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + this.manager = manager !== undefined ? manager : DefaultLoadingManager; + this.options = undefined; + +} + +ImageBitmapLoader.prototype = { + + constructor: ImageBitmapLoader, + + setOptions: function setOptions( options ) { + + this.options = options; + + return this; + + }, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + fetch( url ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, scope.options ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + }, + + setCrossOrigin: function ( /* value */ ) { + + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +}; + +export { ImageBitmapLoader }; diff --git a/lib/loaders/ImageLoader.js b/lib/loaders/ImageLoader.js new file mode 100644 index 0000000..be6321d --- /dev/null +++ b/lib/loaders/ImageLoader.js @@ -0,0 +1,108 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Cache } from './Cache.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( ImageLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + function onImageLoad() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { ImageLoader }; diff --git a/lib/loaders/JSONLoader.js b/lib/loaders/JSONLoader.js new file mode 100644 index 0000000..800b5af --- /dev/null +++ b/lib/loaders/JSONLoader.js @@ -0,0 +1,587 @@ +import { Loader } from './Loader.js'; +import { LoaderUtils } from './LoaderUtils.js'; +import { AnimationClip } from '../animation/AnimationClip.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector4 } from '../math/Vector4.js'; +import { Color } from '../math/Color.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Face3 } from '../core/Face3.js'; +import { Geometry } from '../core/Geometry.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + +} + +Object.assign( JSONLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, path ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function parse( json, path ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, this.resourcePath || path, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + +} ); + + +export { JSONLoader }; diff --git a/lib/loaders/Loader.js b/lib/loaders/Loader.js new file mode 100644 index 0000000..d1c9726 --- /dev/null +++ b/lib/loaders/Loader.js @@ -0,0 +1,342 @@ +import { + NoBlending, + NormalBlending, + AdditiveBlending, + SubtractiveBlending, + MultiplyBlending, + CustomBlending, + + FaceColors, + VertexColors, + + DoubleSide, + BackSide, + + MirroredRepeatWrapping, + RepeatWrapping +} from '../constants.js'; +import { _Math } from '../math/Math.js'; +import { MaterialLoader } from './MaterialLoader.js'; +import { TextureLoader } from './TextureLoader.js'; +import { Color } from '../math/Color.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function Loader() {} + +Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + +}; + +Object.assign( Loader.prototype, { + + crossOrigin: 'anonymous', + + onLoadStart: function () {}, + + onLoadProgress: function () {}, + + onLoadComplete: function () {}, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = value; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + +} ); + +export { Loader }; diff --git a/lib/loaders/LoaderUtils.js b/lib/loaders/LoaderUtils.js new file mode 100644 index 0000000..ba13d4b --- /dev/null +++ b/lib/loaders/LoaderUtils.js @@ -0,0 +1,44 @@ +/** + * @author Don McCurdy / https://www.donmccurdy.com + */ + +var LoaderUtils = { + + decodeText: function ( array ) { + + if ( typeof TextDecoder !== 'undefined' ) { + + return new TextDecoder().decode( array ); + + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + var s = ''; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + // Merges multi-byte utf-8 characters. + return decodeURIComponent( escape( s ) ); + + }, + + extractUrlBase: function ( url ) { + + var index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + +}; + +export { LoaderUtils }; diff --git a/lib/loaders/LoadingManager.js b/lib/loaders/LoadingManager.js new file mode 100644 index 0000000..07a0cd6 --- /dev/null +++ b/lib/loaders/LoadingManager.js @@ -0,0 +1,98 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false; + var itemsLoaded = 0; + var itemsTotal = 0; + var urlModifier = undefined; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + return this; + + }; + +} + +var DefaultLoadingManager = new LoadingManager(); + + +export { DefaultLoadingManager, LoadingManager }; diff --git a/lib/loaders/MaterialLoader.js b/lib/loaders/MaterialLoader.js new file mode 100644 index 0000000..fbd7540 --- /dev/null +++ b/lib/loaders/MaterialLoader.js @@ -0,0 +1,236 @@ +import { Color } from '../math/Color.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector4 } from '../math/Vector4.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; +import * as Materials from '../materials/Materials.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + +} + +Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.combine !== undefined ) material.combine = json.combine; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.visible !== undefined ) material.visible = json.visible; + if ( json.userData !== undefined ) material.userData = json.userData; + + // Shader Material + + if ( json.uniforms !== undefined ) { + + for ( var name in json.uniforms ) { + + var uniform = json.uniforms[ name ]; + + material.uniforms[ name ] = {}; + + switch ( uniform.type ) { + + case 't': + material.uniforms[ name ].value = getTexture( uniform.value ); + break; + + case 'c': + material.uniforms[ name ].value = new Color().setHex( uniform.value ); + break; + + case 'v2': + material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); + break; + + case 'v3': + material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); + break; + + case 'v4': + material.uniforms[ name ].value = new Vector4().fromArray( uniform.value ); + break; + + case 'm4': + material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); + break; + + default: + material.uniforms[ name ].value = uniform.value; + + } + + } + + } + + if ( json.defines !== undefined ) material.defines = json.defines; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setTextures: function ( value ) { + + this.textures = value; + return this; + + } + +} ); + + +export { MaterialLoader }; diff --git a/lib/loaders/ObjectLoader.js b/lib/loaders/ObjectLoader.js new file mode 100644 index 0000000..b951a64 --- /dev/null +++ b/lib/loaders/ObjectLoader.js @@ -0,0 +1,978 @@ +import { + UVMapping, + CubeReflectionMapping, + CubeRefractionMapping, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + SphericalReflectionMapping, + CubeUVReflectionMapping, + CubeUVRefractionMapping, + + RepeatWrapping, + ClampToEdgeWrapping, + MirroredRepeatWrapping, + + NearestFilter, + NearestMipMapNearestFilter, + NearestMipMapLinearFilter, + LinearFilter, + LinearMipMapNearestFilter, + LinearMipMapLinearFilter +} from '../constants.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from '../core/Object3D.js'; +import { Group } from '../objects/Group.js'; +import { Sprite } from '../objects/Sprite.js'; +import { Points } from '../objects/Points.js'; +import { Line } from '../objects/Line.js'; +import { LineLoop } from '../objects/LineLoop.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LOD } from '../objects/LOD.js'; +import { Mesh } from '../objects/Mesh.js'; +import { SkinnedMesh } from '../objects/SkinnedMesh.js'; +import { Shape } from '../extras/core/Shape.js'; +import { Fog } from '../scenes/Fog.js'; +import { FogExp2 } from '../scenes/FogExp2.js'; +import { HemisphereLight } from '../lights/HemisphereLight.js'; +import { SpotLight } from '../lights/SpotLight.js'; +import { PointLight } from '../lights/PointLight.js'; +import { DirectionalLight } from '../lights/DirectionalLight.js'; +import { AmbientLight } from '../lights/AmbientLight.js'; +import { RectAreaLight } from '../lights/RectAreaLight.js'; +import { OrthographicCamera } from '../cameras/OrthographicCamera.js'; +import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js'; +import { Scene } from '../scenes/Scene.js'; +import { CubeTexture } from '../textures/CubeTexture.js'; +import { Texture } from '../textures/Texture.js'; +import { ImageLoader } from './ImageLoader.js'; +import { LoadingManager, DefaultLoadingManager } from './LoadingManager.js'; +import { AnimationClip } from '../animation/AnimationClip.js'; +import { MaterialLoader } from './MaterialLoader.js'; +import { LoaderUtils } from './LoaderUtils.js'; +import { BufferGeometryLoader } from './BufferGeometryLoader.js'; +import { JSONLoader } from './JSONLoader.js'; +import { FileLoader } from './FileLoader.js'; +import * as Geometries from '../geometries/Geometries.js'; +import * as Curves from '../extras/curves/Curves.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.resourcePath = ''; + +} + +Object.assign( ObjectLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + var loader = new FileLoader( scope.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: function ( json, onLoad ) { + + var shapes = this.parseShape( json.shapes ); + var geometries = this.parseGeometries( json.geometries, shapes ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseShape: function ( json ) { + + var shapes = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + }, + + parseGeometries: function ( json, shapes ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + + case 'ExtrudeGeometry': + case 'ExtrudeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + var extrudePath = data.options.extrudePath; + + if ( extrudePath !== undefined ) { + + data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.options + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.resourcePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var data = json[ i ]; + + var clip = AnimationClip.parse( data ); + + if ( data.uuid !== undefined ) clip.uuid = data.uuid; + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, il = json.length; i < il; i ++ ) { + + var image = json[ i ]; + var url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + images[ image.uuid ] = []; + + for ( var j = 0, jl = url.length; j < jl; j ++ ) { + + var currentUrl = url[ j ]; + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( currentUrl ) ? currentUrl : scope.resourcePath + currentUrl; + + images[ image.uuid ].push( loadImage( path ) ); + + } + + } else { + + // load single image + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.resourcePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture; + + if ( Array.isArray( images[ data.image ] ) ) { + + texture = new CubeTexture( images[ data.image ] ); + + } else { + + texture = new Texture( images[ data.image ] ); + + } + + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + if ( data.layers !== undefined ) object.layers.mask = data.layers; + + if ( data.children !== undefined ) { + + var children = data.children; + + for ( var i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + +} ); + +var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping +}; + +var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping +}; + +var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter +}; + + +export { ObjectLoader }; diff --git a/lib/loaders/TextureLoader.js b/lib/loaders/TextureLoader.js new file mode 100644 index 0000000..385d541 --- /dev/null +++ b/lib/loaders/TextureLoader.js @@ -0,0 +1,68 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { RGBAFormat, RGBFormat } from '../constants.js'; +import { ImageLoader } from './ImageLoader.js'; +import { Texture } from '../textures/Texture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( TextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.jpe?g$/i ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { TextureLoader }; diff --git a/lib/materials/LineBasicMaterial.js b/lib/materials/LineBasicMaterial.js new file mode 100644 index 0000000..56463ac --- /dev/null +++ b/lib/materials/LineBasicMaterial.js @@ -0,0 +1,56 @@ +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + +function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + +} + +LineBasicMaterial.prototype = Object.create( Material.prototype ); +LineBasicMaterial.prototype.constructor = LineBasicMaterial; + +LineBasicMaterial.prototype.isLineBasicMaterial = true; + +LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + +}; + + +export { LineBasicMaterial }; diff --git a/lib/materials/LineDashedMaterial.js b/lib/materials/LineDashedMaterial.js new file mode 100644 index 0000000..9fc30d4 --- /dev/null +++ b/lib/materials/LineDashedMaterial.js @@ -0,0 +1,50 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + +import { LineBasicMaterial } from './LineBasicMaterial.js'; + +function LineDashedMaterial( parameters ) { + + LineBasicMaterial.call( this ); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + +} + +LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype ); +LineDashedMaterial.prototype.constructor = LineDashedMaterial; + +LineDashedMaterial.prototype.isLineDashedMaterial = true; + +LineDashedMaterial.prototype.copy = function ( source ) { + + LineBasicMaterial.prototype.copy.call( this, source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + +}; + + +export { LineDashedMaterial }; diff --git a/lib/materials/Material.js b/lib/materials/Material.js new file mode 100644 index 0000000..b099f37 --- /dev/null +++ b/lib/materials/Material.js @@ -0,0 +1,381 @@ +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { NoColors, FrontSide, FlatShading, NormalBlending, LessEqualDepth, AddEquation, OneMinusSrcAlphaFactor, SrcAlphaFactor } from '../constants.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +var materialId = 0; + +function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.flatShading = false; + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.visible = true; + + this.userData = {}; + + this.needsUpdate = true; + +} + +Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Material, + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = ( meta === undefined || typeof meta === 'string' ); + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + + if ( this.aoMap && this.aoMap.isTexture ) { + + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; + + } + + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + + } + + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + if ( this.combine !== undefined ) data.combine = this.combine; + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.flatShading === true ) data.flatShading = this.flatShading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; + + if ( this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.morphTargets === true ) data.morphTargets = true; + if ( this.skinning === true ) data.skinning = true; + + if ( this.visible === false ) data.visible = false; + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.flatShading = source.flatShading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.premultipliedAlpha = source.premultipliedAlpha; + + this.visible = source.visible; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + this.shadowSide = source.shadowSide; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { Material }; diff --git a/lib/materials/Materials.js b/lib/materials/Materials.js new file mode 100644 index 0000000..28844e9 --- /dev/null +++ b/lib/materials/Materials.js @@ -0,0 +1,18 @@ +export { ShadowMaterial } from './ShadowMaterial.js'; +export { SpriteMaterial } from './SpriteMaterial.js'; +export { RawShaderMaterial } from './RawShaderMaterial.js'; +export { ShaderMaterial } from './ShaderMaterial.js'; +export { PointsMaterial } from './PointsMaterial.js'; +export { MeshPhysicalMaterial } from './MeshPhysicalMaterial.js'; +export { MeshStandardMaterial } from './MeshStandardMaterial.js'; +export { MeshPhongMaterial } from './MeshPhongMaterial.js'; +export { MeshToonMaterial } from './MeshToonMaterial.js'; +export { MeshNormalMaterial } from './MeshNormalMaterial.js'; +export { MeshLambertMaterial } from './MeshLambertMaterial.js'; +export { MeshDepthMaterial } from './MeshDepthMaterial.js'; +export { MeshDistanceMaterial } from './MeshDistanceMaterial.js'; +export { MeshBasicMaterial } from './MeshBasicMaterial.js'; +export { MeshMatcapMaterial } from './MeshMatcapMaterial.js'; +export { LineDashedMaterial } from './LineDashedMaterial.js'; +export { LineBasicMaterial } from './LineBasicMaterial.js'; +export { Material } from './Material.js'; diff --git a/lib/materials/MeshBasicMaterial.js b/lib/materials/MeshBasicMaterial.js new file mode 100644 index 0000000..207cf6a --- /dev/null +++ b/lib/materials/MeshBasicMaterial.js @@ -0,0 +1,120 @@ +import { Material } from './Material.js'; +import { MultiplyOperation } from '../constants.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + +function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + +} + +MeshBasicMaterial.prototype = Object.create( Material.prototype ); +MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + +MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + +MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + +}; + + +export { MeshBasicMaterial }; diff --git a/lib/materials/MeshDepthMaterial.js b/lib/materials/MeshDepthMaterial.js new file mode 100644 index 0000000..2a143df --- /dev/null +++ b/lib/materials/MeshDepthMaterial.js @@ -0,0 +1,86 @@ +import { Material } from './Material.js'; +import { BasicDepthPacking } from '../constants.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + +function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + +} + +MeshDepthMaterial.prototype = Object.create( Material.prototype ); +MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + +MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + +MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + +}; + + +export { MeshDepthMaterial }; diff --git a/lib/materials/MeshDistanceMaterial.js b/lib/materials/MeshDistanceMaterial.js new file mode 100644 index 0000000..2fa54c5 --- /dev/null +++ b/lib/materials/MeshDistanceMaterial.js @@ -0,0 +1,84 @@ +import { Material } from './Material.js'; +import { Vector3 } from '../math/Vector3.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * skinning: , + * morphTargets: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + +function MeshDistanceMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + +} + +MeshDistanceMaterial.prototype = Object.create( Material.prototype ); +MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial; + +MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + +MeshDistanceMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + +}; + + +export { MeshDistanceMaterial }; diff --git a/lib/materials/MeshLambertMaterial.js b/lib/materials/MeshLambertMaterial.js new file mode 100644 index 0000000..949310e --- /dev/null +++ b/lib/materials/MeshLambertMaterial.js @@ -0,0 +1,131 @@ +import { Material } from './Material.js'; +import { MultiplyOperation } from '../constants.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshLambertMaterial.prototype = Object.create( Material.prototype ); +MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + +MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + +MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshLambertMaterial }; diff --git a/lib/materials/MeshMatcapMaterial.js b/lib/materials/MeshMatcapMaterial.js new file mode 100644 index 0000000..6ccbab8 --- /dev/null +++ b/lib/materials/MeshMatcapMaterial.js @@ -0,0 +1,129 @@ +import { TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * opacity: , + * + * matcap: new THREE.Texture( ), + * + * map: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshMatcapMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'MATCAP': '' }; + + this.type = 'MeshMatcapMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.matcap = null; + + this.map = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.lights = false; + + this.setValues( parameters ); + + // a matcap is required + + if ( this.matcap === null ) { + + var canvas = document.createElement( 'canvas' ); + canvas.width = 1; + canvas.height = 1; + + var context = canvas.getContext( '2d' ); + + context.fillStyle = '#fff'; + context.fillRect( 0, 0, 1, 1 ); + + this.matcap = new THREE.CanvasTexture( canvas ); + + } + +} + +MeshMatcapMaterial.prototype = Object.create( Material.prototype ); +MeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial; + +MeshMatcapMaterial.prototype.isMeshMatcapMaterial = true; + +MeshMatcapMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'MATCAP': '' }; + + this.color.copy( source.color ); + + this.matcap = source.matcap; + + this.map = source.map; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshMatcapMaterial }; diff --git a/lib/materials/MeshNormalMaterial.js b/lib/materials/MeshNormalMaterial.js new file mode 100644 index 0000000..c95f335 --- /dev/null +++ b/lib/materials/MeshNormalMaterial.js @@ -0,0 +1,95 @@ +import { TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshNormalMaterial.prototype = Object.create( Material.prototype ); +MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + +MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + +MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshNormalMaterial }; diff --git a/lib/materials/MeshPhongMaterial.js b/lib/materials/MeshPhongMaterial.js new file mode 100644 index 0000000..e040b1f --- /dev/null +++ b/lib/materials/MeshPhongMaterial.js @@ -0,0 +1,171 @@ +import { MultiplyOperation, TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshPhongMaterial.prototype = Object.create( Material.prototype ); +MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + +MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + +MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshPhongMaterial }; diff --git a/lib/materials/MeshPhysicalMaterial.js b/lib/materials/MeshPhysicalMaterial.js new file mode 100644 index 0000000..24ee7f9 --- /dev/null +++ b/lib/materials/MeshPhysicalMaterial.js @@ -0,0 +1,49 @@ +import { MeshStandardMaterial } from './MeshStandardMaterial.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + +function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + +} + +MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); +MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + +MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + +MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + +}; + + +export { MeshPhysicalMaterial }; diff --git a/lib/materials/MeshStandardMaterial.js b/lib/materials/MeshStandardMaterial.js new file mode 100644 index 0000000..cbbe32d --- /dev/null +++ b/lib/materials/MeshStandardMaterial.js @@ -0,0 +1,180 @@ +import { TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshStandardMaterial.prototype = Object.create( Material.prototype ); +MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + +MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + +MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshStandardMaterial }; diff --git a/lib/materials/MeshToonMaterial.js b/lib/materials/MeshToonMaterial.js new file mode 100644 index 0000000..fbb77e1 --- /dev/null +++ b/lib/materials/MeshToonMaterial.js @@ -0,0 +1,41 @@ +import { MeshPhongMaterial } from './MeshPhongMaterial.js'; + +/** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( ) + * } + */ + +function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + +} + +MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); +MeshToonMaterial.prototype.constructor = MeshToonMaterial; + +MeshToonMaterial.prototype.isMeshToonMaterial = true; + +MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + +}; + + +export { MeshToonMaterial }; diff --git a/lib/materials/PointsMaterial.js b/lib/materials/PointsMaterial.js new file mode 100644 index 0000000..ec4cae4 --- /dev/null +++ b/lib/materials/PointsMaterial.js @@ -0,0 +1,64 @@ +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * + * morphTargets: + * } + */ + +function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + +} + +PointsMaterial.prototype = Object.create( Material.prototype ); +PointsMaterial.prototype.constructor = PointsMaterial; + +PointsMaterial.prototype.isPointsMaterial = true; + +PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.morphTargets = source.morphTargets; + + return this; + +}; + + +export { PointsMaterial }; diff --git a/lib/materials/RawShaderMaterial.js b/lib/materials/RawShaderMaterial.js new file mode 100644 index 0000000..1f35bac --- /dev/null +++ b/lib/materials/RawShaderMaterial.js @@ -0,0 +1,21 @@ +import { ShaderMaterial } from './ShaderMaterial.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + +} + +RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); +RawShaderMaterial.prototype.constructor = RawShaderMaterial; + +RawShaderMaterial.prototype.isRawShaderMaterial = true; + + +export { RawShaderMaterial }; diff --git a/lib/materials/ShaderMaterial.js b/lib/materials/ShaderMaterial.js new file mode 100644 index 0000000..a9ad084 --- /dev/null +++ b/lib/materials/ShaderMaterial.js @@ -0,0 +1,190 @@ +import { Material } from './Material.js'; +import { UniformsUtils } from '../renderers/shaders/UniformsUtils.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + +} + +ShaderMaterial.prototype = Object.create( Material.prototype ); +ShaderMaterial.prototype.constructor = ShaderMaterial; + +ShaderMaterial.prototype.isShaderMaterial = true; + +ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + +}; + +ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = {}; + + for ( var name in this.uniforms ) { + + var uniform = this.uniforms[ name ]; + var value = uniform.value; + + if ( value.isTexture ) { + + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; + + } else if ( value.isColor ) { + + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; + + } else if ( value.isVector2 ) { + + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; + + } else if ( value.isVector3 ) { + + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; + + } else if ( value.isVector4 ) { + + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; + + } else if ( value.isMatrix4 ) { + + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; + + } else { + + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } + + } + + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; + + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + +}; + + +export { ShaderMaterial }; diff --git a/lib/materials/ShadowMaterial.js b/lib/materials/ShadowMaterial.js new file mode 100644 index 0000000..b4622c1 --- /dev/null +++ b/lib/materials/ShadowMaterial.js @@ -0,0 +1,41 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * color: + * } + */ + +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +function ShadowMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + +} + +ShadowMaterial.prototype = Object.create( Material.prototype ); +ShadowMaterial.prototype.constructor = ShadowMaterial; + +ShadowMaterial.prototype.isShadowMaterial = true; + +ShadowMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + +}; + + +export { ShadowMaterial }; diff --git a/lib/materials/SpriteMaterial.js b/lib/materials/SpriteMaterial.js new file mode 100644 index 0000000..73e9d52 --- /dev/null +++ b/lib/materials/SpriteMaterial.js @@ -0,0 +1,55 @@ +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * map: new THREE.Texture( ), + * rotation: , + * sizeAttenuation: + * } + */ + +function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.sizeAttenuation = true; + + this.lights = false; + this.transparent = true; + + this.setValues( parameters ); + +} + +SpriteMaterial.prototype = Object.create( Material.prototype ); +SpriteMaterial.prototype.constructor = SpriteMaterial; +SpriteMaterial.prototype.isSpriteMaterial = true; + +SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + this.sizeAttenuation = source.sizeAttenuation; + + return this; + +}; + + +export { SpriteMaterial }; diff --git a/lib/math/Box2.js b/lib/math/Box2.js new file mode 100644 index 0000000..0010260 --- /dev/null +++ b/lib/math/Box2.js @@ -0,0 +1,244 @@ +import { Vector2 } from './Vector2.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + +} + +Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getCenter() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getSize() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getParameter() target is now required' ); + target = new Vector2(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .clampPoint() target is now required' ); + target = new Vector2(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} ); + + +export { Box2 }; diff --git a/lib/math/Box3.js b/lib/math/Box3.js new file mode 100644 index 0000000..ef2c17c --- /dev/null +++ b/lib/math/Box3.js @@ -0,0 +1,616 @@ +import { Vector3 } from './Vector3.js'; +import { Sphere } from './Sphere.js'; + +/** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + +} + +Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getSize() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var scope, i, l; + + var v1 = new Vector3(); + + function traverse( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } + + return function expandByObject( object ) { + + scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( traverse ); + + return this; + + }; + + }(), + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getParameter() target is now required' ); + target = new Vector3(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= - plane.constant && max >= - plane.constant ); + + }, + + intersectsTriangle: ( function () { + + // triangle centered vertices + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + // triangle edge vectors + var f0 = new Vector3(); + var f1 = new Vector3(); + var f2 = new Vector3(); + + var testAxis = new Vector3(); + + var center = new Vector3(); + var extents = new Vector3(); + + var triangleNormal = new Vector3(); + + function satForAxes( axes ) { + + var i, j; + + for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + var r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z ); + // project all 3 vertices of the triangle onto the seperating axis + var p0 = v0.dot( testAxis ); + var p1 = v1.dot( testAxis ); + var p2 = v2.dot( testAxis ); + // actual test, basically see if either of the most extreme of the triangle points intersects r + if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) { + + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is seperating and we can exit + return false; + + } + + } + + return true; + + } + + return function intersectsTriangle( triangle ) { + + if ( this.isEmpty() ) { + + return false; + + } + + // compute box center and extents + this.getCenter( center ); + extents.subVectors( this.max, center ); + + // translate triangle to aabb origin + v0.subVectors( triangle.a, center ); + v1.subVectors( triangle.b, center ); + v2.subVectors( triangle.c, center ); + + // compute edge vectors for triangle + f0.subVectors( v1, v0 ); + f1.subVectors( v2, v1 ); + f2.subVectors( v0, v2 ); + + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // 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 + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + var axes = [ + 0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y, + f0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x, + - f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0 + ]; + if ( ! satForAxes( axes ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes ) ) { + + return false; + + } + + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + triangleNormal.crossVectors( f0, f1 ); + axes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ]; + return satForAxes( axes ); + + }; + + } )(), + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' ); + target = new Sphere(); + + } + + this.getCenter( target.center ); + + target.radius = this.getSize( v1 ).length() * 0.5; + + return target; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // 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. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if ( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} ); + + +export { Box3 }; diff --git a/lib/math/Color.js b/lib/math/Color.js new file mode 100644 index 0000000..5590100 --- /dev/null +++ b/lib/math/Color.js @@ -0,0 +1,606 @@ +import { _Math } from './Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + +function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + +} + +Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function ( gammaFactor ) { + + this.copyGammaToLinear( this, gammaFactor ); + + return this; + + }, + + convertLinearToGamma: function ( gammaFactor ) { + + this.copyLinearToGamma( this, gammaFactor ); + + return this; + + }, + + copySRGBToLinear: function () { + + function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + + } + + return function copySRGBToLinear( color ) { + + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); + + return this; + + }; + + }(), + + copyLinearToSRGB: function () { + + function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + + } + + return function copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; + + }; + + }(), + + convertSRGBToLinear: function () { + + this.copySRGBToLinear( this ); + + return this; + + }, + + convertLinearToSRGB: function () { + + this.copyLinearToSRGB( this ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( target ) { + + // h,s,l ranges are in 0.0 - 1.0 + + if ( target === undefined ) { + + console.warn( 'THREE.Color: .getHSL() target is now required' ); + target = { h: 0, s: 0, l: 0 }; + + } + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function () { + + var hsl = {}; + + return function ( h, s, l ) { + + this.getHSL( hsl ); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }; + + }(), + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function ( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + lerpHSL: function () { + + var hslA = { h: 0, s: 0, l: 0 }; + var hslB = { h: 0, s: 0, l: 0 }; + + return function lerpHSL( color, alpha ) { + + this.getHSL( hslA ); + color.getHSL( hslB ); + + var h = _Math.lerp( hslA.h, hslB.h, alpha ); + var s = _Math.lerp( hslA.s, hslB.s, alpha ); + var l = _Math.lerp( hslA.l, hslB.l, alpha ); + + this.setHSL( h, s, l ); + + return this; + + }; + + }(), + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + +} ); + + +export { Color }; diff --git a/lib/math/Cylindrical.js b/lib/math/Cylindrical.js new file mode 100644 index 0000000..8b7452f --- /dev/null +++ b/lib/math/Cylindrical.js @@ -0,0 +1,65 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + +function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + +} + +Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + z * z ); + this.theta = Math.atan2( x, z ); + this.y = y; + + return this; + + } + +} ); + + +export { Cylindrical }; diff --git a/lib/math/Euler.js b/lib/math/Euler.js new file mode 100644 index 0000000..8f8d3b6 --- /dev/null +++ b/lib/math/Euler.js @@ -0,0 +1,352 @@ +import { Quaternion } from './Quaternion.js'; +import { Vector3 } from './Vector3.js'; +import { Matrix4 } from './Matrix4.js'; +import { _Math } from './Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + +} + +Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + +Euler.DefaultOrder = 'XYZ'; + +Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + +} ); + +Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +} ); + + +export { Euler }; diff --git a/lib/math/Frustum.js b/lib/math/Frustum.js new file mode 100644 index 0000000..6c0f15e --- /dev/null +++ b/lib/math/Frustum.js @@ -0,0 +1,194 @@ +import { Vector3 } from './Vector3.js'; +import { Sphere } from './Sphere.js'; +import { Plane } from './Plane.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + +function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + +} + +Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + // corner at max distance + + p.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( p ) < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + +} ); + + +export { Frustum }; diff --git a/lib/math/Interpolant.js b/lib/math/Interpolant.js new file mode 100644 index 0000000..4fbe74b --- /dev/null +++ b/lib/math/Interpolant.js @@ -0,0 +1,259 @@ +/** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + +function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + +} + +Object.assign( Interpolant.prototype, { + + evaluate: function ( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function ( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function ( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function ( /* i1, t0, t1 */ ) { + + // empty + + } + +} ); + +//!\ DECLARE ALIAS AFTER assign prototype ! +Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + +} ); + + +export { Interpolant }; diff --git a/lib/math/Line3.js b/lib/math/Line3.js new file mode 100644 index 0000000..4afb80c --- /dev/null +++ b/lib/math/Line3.js @@ -0,0 +1,152 @@ +import { Vector3 } from './Vector3.js'; +import { _Math } from './Math.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + +} + +Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .delta() target is now required' ); + target = new Vector3(); + + } + + return target.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .at() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, target ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + +} ); + + +export { Line3 }; diff --git a/lib/math/Math.js b/lib/math/Math.js new file mode 100644 index 0000000..6b03033 --- /dev/null +++ b/lib/math/Math.js @@ -0,0 +1,153 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: ( function () { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + var lut = []; + + for ( var i = 0; i < 256; i ++ ) { + + lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ); + + } + + return function generateUUID() { + + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + var uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' + + lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' + + lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] + + lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ]; + + // .toUpperCase() here flattens concatenated strings to save heap memory space. + return uuid.toUpperCase(); + + }; + + } )(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + ceilPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + + }, + + floorPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + + } + +}; + + +export { _Math }; diff --git a/lib/math/Matrix3.js b/lib/math/Matrix3.js new file mode 100644 index 0000000..5918293 --- /dev/null +++ b/lib/math/Matrix3.js @@ -0,0 +1,388 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + +function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + +} + +Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) { + + var c = Math.cos( rotation ); + var s = Math.sin( rotation ); + + this.set( + sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx, + - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty, + 0, 0, 1 + ); + + }, + + scale: function ( sx, sy ) { + + var te = this.elements; + + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; + + return this; + + }, + + rotate: function ( theta ) { + + var c = Math.cos( theta ); + var s = Math.sin( theta ); + + var te = this.elements; + + var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; + + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; + + return this; + + }, + + translate: function ( tx, ty ) { + + var te = this.elements; + + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + +} ); + + +export { Matrix3 }; diff --git a/lib/math/Matrix4.js b/lib/math/Matrix4.js new file mode 100644 index 0000000..53a1b50 --- /dev/null +++ b/lib/math/Matrix4.js @@ -0,0 +1,938 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + +} + +Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + // this method does not support reflection matrices + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + te[ 3 ] = 0; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + te[ 7 ] = 0; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + te[ 11 ] = 0; + + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // bottom row + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // last column + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function () { + + var zero = new Vector3( 0, 0, 0 ); + var one = new Vector3( 1, 1, 1 ); + + return function makeRotationFromQuaternion( q ) { + + return this.compose( zero, q, one ); + + }; + + }(), + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 0 ) { + + // up and z are parallel + + if ( Math.abs( up.z ) === 1 ) { + + z.x += 0.0001; + + } else { + + z.z += 0.0001; + + } + + z.normalize(); + x.crossVectors( up, z ); + + } + + x.normalize(); + y.crossVectors( z, x ); + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + var te = this.elements; + + var x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + var sx = scale.x, sy = scale.y, sz = scale.z; + + te[ 0 ] = ( 1 - ( yy + zz ) ) * sx; + te[ 1 ] = ( xy + wz ) * sx; + te[ 2 ] = ( xz - wy ) * sx; + te[ 3 ] = 0; + + te[ 4 ] = ( xy - wz ) * sy; + te[ 5 ] = ( 1 - ( xx + zz ) ) * sy; + te[ 6 ] = ( yz + wx ) * sy; + te[ 7 ] = 0; + + te[ 8 ] = ( xz + wy ) * sz; + te[ 9 ] = ( yz - wx ) * sz; + te[ 10 ] = ( 1 - ( xx + yy ) ) * sz; + te[ 11 ] = 0; + + te[ 12 ] = position.x; + te[ 13 ] = position.y; + te[ 14 ] = position.z; + te[ 15 ] = 1; + + return this; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + +} ); + + +export { Matrix4 }; diff --git a/lib/math/Plane.js b/lib/math/Plane.js new file mode 100644 index 0000000..2f20965 --- /dev/null +++ b/lib/math/Plane.js @@ -0,0 +1,245 @@ +import { Matrix3 } from './Matrix3.js'; +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Plane( normal, constant ) { + + // normal is assumed to be normalized + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + +} + +Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .projectPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .intersectLine() target is now required' ); + target = new Vector3(); + + } + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .coplanarPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + +} ); + + +export { Plane }; diff --git a/lib/math/Quaternion.js b/lib/math/Quaternion.js new file mode 100644 index 0000000..f2aee0d --- /dev/null +++ b/lib/math/Quaternion.js @@ -0,0 +1,637 @@ +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +import { _Math } from './Math.js'; +import { Vector3 } from './Vector3.js'; + +function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + +} + +Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + +} ); + +Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + +} ); + +Object.assign( Quaternion.prototype, { + + isQuaternion: true, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = sin( z / 2 ); + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + angleTo: function ( q ) { + + return 2 * Math.acos( Math.abs( _Math.clamp( this.dot( q ), - 1, 1 ) ) ); + + }, + + rotateTowards: function ( q, step ) { + + var angle = this.angleTo( q ); + + if ( angle === 0 ) return this; + + var t = Math.min( 1, step / angle ); + + this.slerp( q, t ); + + return this; + + }, + + inverse: function () { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + var s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + return this.normalize(); + + } + + var sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +} ); + + +export { Quaternion }; diff --git a/lib/math/Ray.js b/lib/math/Ray.js new file mode 100644 index 0000000..27d1fc2 --- /dev/null +++ b/lib/math/Ray.js @@ -0,0 +1,546 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + +} + +Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .at() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( point, this.origin ); + + var directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, target ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, target ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, target ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, target ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, target ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, target ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, target ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + +} ); + + +export { Ray }; diff --git a/lib/math/Sphere.js b/lib/math/Sphere.js new file mode 100644 index 0000000..430c836 --- /dev/null +++ b/lib/math/Sphere.js @@ -0,0 +1,180 @@ +import { Box3 } from './Box3.js'; +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + +} + +Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + }, + + clampPoint: function ( point, target ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + }, + + getBoundingBox: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); + target = new Box3(); + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + +} ); + + +export { Sphere }; diff --git a/lib/math/Spherical.js b/lib/math/Spherical.js new file mode 100644 index 0000000..75fd25e --- /dev/null +++ b/lib/math/Spherical.js @@ -0,0 +1,90 @@ +import { _Math } from './Math.js'; + +/** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. + * The azimuthal angle (theta) is measured from the positive z-axiz. + */ + +function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // polar angle + this.theta = ( theta !== undefined ) ? theta : 0; // azimuthal angle + + return this; + +} + +Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function () { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( _Math.clamp( y / this.radius, - 1, 1 ) ); + + } + + return this; + + } + +} ); + + +export { Spherical }; diff --git a/lib/math/Triangle.js b/lib/math/Triangle.js new file mode 100644 index 0000000..328604d --- /dev/null +++ b/lib/math/Triangle.js @@ -0,0 +1,349 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + +} + +Object.assign( Triangle, { + + getNormal: function () { + + var v0 = new Vector3(); + + return function getNormal( a, b, c, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getNormal() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( c, b ); + v0.subVectors( a, b ); + target.cross( v0 ); + + var targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + getBarycoord: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function getBarycoord( point, a, b, c, target ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ); + target = new Vector3(); + + } + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return target.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + Triangle.getBarycoord( point, a, b, c, v1 ); + + return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 ); + + }; + + }(), + + getUV: function () { + + var barycoord = new Vector3(); + + return function getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { + + this.getBarycoord( point, p1, p2, p3, barycoord ); + + target.set( 0, 0 ); + target.addScaledVector( uv1, barycoord.x ); + target.addScaledVector( uv2, barycoord.y ); + target.addScaledVector( uv3, barycoord.z ); + + return target; + + }; + + }() + +} ); + +Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + getArea: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function getArea() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + getMidpoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + getNormal: function ( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + }, + + getPlane: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getPlane() target is now required' ); + target = new Vector3(); + + } + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + getBarycoord: function ( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + getUV: function ( point, uv1, uv2, uv3, result ) { + + return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, result ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsTriangle( this ); + + }, + + closestPointToPoint: function () { + + var vab = new Vector3(); + var vac = new Vector3(); + var vbc = new Vector3(); + var vap = new Vector3(); + var vbp = new Vector3(); + var vcp = new Vector3(); + + return function closestPointToPoint( p, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + var a = this.a, b = this.b, c = this.c; + var v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + vab.subVectors( b, a ); + vac.subVectors( c, a ); + vap.subVectors( p, a ); + var d1 = vab.dot( vap ); + var d2 = vac.dot( vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + + } + + vbp.subVectors( p, b ); + var d3 = vab.dot( vbp ); + var d4 = vac.dot( vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + var vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( vab, v ); + + } + + vcp.subVectors( p, c ); + var d5 = vab.dot( vcp ); + var d6 = vac.dot( vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + var vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( vac, w ); + + } + + var va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( vbc, w ); // edge region of BC + + } + + // face region + var denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + return target.copy( a ).addScaledVector( vab, v ).addScaledVector( vac, w ); + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + +} ); + + +export { Triangle }; diff --git a/lib/math/Vector2.js b/lib/math/Vector2.js new file mode 100644 index 0000000..2e6de62 --- /dev/null +++ b/lib/math/Vector2.js @@ -0,0 +1,499 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + +} + +Object.defineProperties( Vector2.prototype, { + + "width": { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height": { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + +} ); + +Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + cross: function ( v ) { + + return this.x * v.y - this.y * v.x; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + +} ); + + +export { Vector2 }; diff --git a/lib/math/Vector3.js b/lib/math/Vector3.js new file mode 100644 index 0000000..3036f9c --- /dev/null +++ b/lib/math/Vector3.js @@ -0,0 +1,734 @@ +import { _Math } from './Math.js'; +import { Matrix4 } from './Matrix4.js'; +import { Quaternion } from './Quaternion.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + +} + +Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function ( camera ) { + + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); + + }, + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + return this.applyMatrix4( matrix.getInverse( camera.projectionMatrix ) ).applyMatrix4( camera.matrixWorld ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); + + }, + + setFromSphericalCoords: function ( radius, phi, theta ) { + + var sinPhiRadius = Math.sin( phi ) * radius; + + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); + + }, + + setFromCylindricalCoords: function ( radius, theta, y ) { + + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + var e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + +} ); + + +export { Vector3 }; diff --git a/lib/math/Vector4.js b/lib/math/Vector4.js new file mode 100644 index 0000000..7b148ae --- /dev/null +++ b/lib/math/Vector4.js @@ -0,0 +1,629 @@ +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + +} + +Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + +} ); + + +export { Vector4 }; diff --git a/lib/math/interpolants/CubicInterpolant.js b/lib/math/interpolants/CubicInterpolant.js new file mode 100644 index 0000000..152505d --- /dev/null +++ b/lib/math/interpolants/CubicInterpolant.js @@ -0,0 +1,156 @@ +import { ZeroCurvatureEnding } from '../../constants.js'; +import { Interpolant } from '../Interpolant.js'; +import { WrapAroundEnding, ZeroSlopeEnding } from '../../constants.js'; + +/** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + +function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + +} + +CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function ( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + +} ); + + +export { CubicInterpolant }; diff --git a/lib/math/interpolants/DiscreteInterpolant.js b/lib/math/interpolants/DiscreteInterpolant.js new file mode 100644 index 0000000..5d3f8e6 --- /dev/null +++ b/lib/math/interpolants/DiscreteInterpolant.js @@ -0,0 +1,30 @@ +import { Interpolant } from '../Interpolant.js'; + +/** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + +function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + +} + +DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function ( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + +} ); + + +export { DiscreteInterpolant }; diff --git a/lib/math/interpolants/LinearInterpolant.js b/lib/math/interpolants/LinearInterpolant.js new file mode 100644 index 0000000..32d6aee --- /dev/null +++ b/lib/math/interpolants/LinearInterpolant.js @@ -0,0 +1,44 @@ +import { Interpolant } from '../Interpolant.js'; + +/** + * @author tschw + */ + +function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + +} + +LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + +} ); + + +export { LinearInterpolant }; diff --git a/lib/math/interpolants/QuaternionLinearInterpolant.js b/lib/math/interpolants/QuaternionLinearInterpolant.js new file mode 100644 index 0000000..d90bbff --- /dev/null +++ b/lib/math/interpolants/QuaternionLinearInterpolant.js @@ -0,0 +1,43 @@ +import { Interpolant } from '../Interpolant.js'; +import { Quaternion } from '../Quaternion.js'; + +/** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + +function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + +} + +QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + +} ); + + +export { QuaternionLinearInterpolant }; diff --git a/lib/moment.min.js b/lib/moment.min.js new file mode 100644 index 0000000..2a3358f --- /dev/null +++ b/lib/moment.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function d(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function h(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n>>0,s=0;sDe(e)?(r=e+1,o-De(e)):(r=e,o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(De(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),H("week","w"),H("isoWeek","W"),L("week",5),L("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=k(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),H("day","d"),H("weekday","e"),H("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=k(e)});var je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var $e=ae;var qe=ae;var Je=ae;function Be(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=de(o[t]),u[t]=de(u[t]),l[t]=de(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ke(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),H("hour","h"),L("hour",13),ue("a",Ke),ue("A",Ke),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=k(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=k(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i))});var et,tt=Te("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:He,monthsShort:Re,week:{dow:0,doy:6},weekdays:je,weekdaysMin:ze,weekdaysShort:Ze,meridiemParse:/[ap]\.?m?\.?/i},st={},it={};function rt(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!st[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),ot(t)}catch(e){}return st[e]}function ot(e,t){var n;return e&&((n=l(t)?lt(e):ut(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function ut(e,t){if(null===t)return delete st[e],null;var n,s=nt;if(t.abbr=e,null!=st[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])s=st[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;s=n._config}return st[e]=new P(b(s,t)),it[e]&&it[e].forEach(function(e){ut(e.name,e.config)}),ot(e),st[e]}function lt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!o(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r=t&&a(i,n,!0)>=t-1)break;t--}r++}return et}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11Pe(n[me],n[_e])?ye:n[ge]<0||24Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ht(e._a[me],s[me]),(e._dayOfYear>De(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[pe]&&0===e._a[ve]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&0<=e&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var ft=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/Z|[+-]\d\d(?::?\d\d)?/,yt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],gt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function vt(e){var t,n,s,i,r,a,o=e._i,u=ft.exec(o)||mt.exec(o);if(u){for(g(e).iso=!0,t=0,n=yt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ln.isLocal=function(){return!!this.isValid()&&!this._isUTC},ln.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ln.isUtc=Vt,ln.isUTC=Vt,ln.zoneAbbr=function(){return this._isUTC?"UTC":""},ln.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ln.dates=n("dates accessor is deprecated. Use date instead.",nn),ln.months=n("months accessor is deprecated. Use month instead",Fe),ln.years=n("years accessor is deprecated. Use year instead",Oe),ln.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),ln.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Yt(e))._a){var t=e._isUTC?y(e._a):Tt(e._a);this._isDSTShifted=this.isValid()&&0h||m.hasOwnProperty(h)&&(n[m[h]]=h)}d=n[c]?"keydown":"keypress"}"keypress"==d&&e.length&&(d="keydown");return{key:k,modifiers:e,action:d}}function C(a,b){return null===a||a===t?!1:a===b?!0:C(a.parentNode,b)}function e(a){function b(a){a= +a||{};var b=!1,l;for(l in n)a[l]?b=!0:n[l]=0;b||(w=!1)}function d(a,b,r,g,F,e){var l,D=[],h=r.type;if(!f._callbacks[a])return[];"keyup"==h&&v(a)&&(b=[a]);for(l=0;l":".","?":"/","|":"\\"},A={option:"alt",command:"meta","return":"enter", +escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},n;for(h=1;20>h;++h)m[111+h]="f"+h;for(h=0;9>=h;++h)m[h+96]=h.toString();e.prototype.bind=function(a,b,d){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,d);return this};e.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};e.prototype.trigger=function(a,b){if(this._directMap[a+":"+b])this._directMap[a+":"+b]({},a);return this};e.prototype.reset=function(){this._callbacks={}; +this._directMap={};return this};e.prototype.stopCallback=function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")||C(b,this.target)?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable};e.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};e.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(m[b]=a[b]);n=null};e.init=function(){var a=e(t),b;for(b in a)"_"!==b.charAt(0)&&(e[b]=function(b){return function(){return a[b].apply(a, +arguments)}}(b))};e.init();p.Mousetrap=e;"undefined"!==typeof module&&module.exports&&(module.exports=e);"function"===typeof define&&define.amd&&define(function(){return e})}})("undefined"!==typeof window?window:null,"undefined"!==typeof window?document:null); diff --git a/lib/objects/Bone.js b/lib/objects/Bone.js new file mode 100644 index 0000000..bbe66db --- /dev/null +++ b/lib/objects/Bone.js @@ -0,0 +1,26 @@ +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + +} + +Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + +} ); + + +export { Bone }; diff --git a/lib/objects/Group.js b/lib/objects/Group.js new file mode 100644 index 0000000..d4ded34 --- /dev/null +++ b/lib/objects/Group.js @@ -0,0 +1,24 @@ +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + +} + +Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group, + + isGroup: true + +} ); + + +export { Group }; diff --git a/lib/objects/LOD.js b/lib/objects/LOD.js new file mode 100644 index 0000000..1c64296 --- /dev/null +++ b/lib/objects/LOD.js @@ -0,0 +1,176 @@ +import { Vector3 } from '../math/Vector3.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + +} + +LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + +} ); + + +export { LOD }; diff --git a/lib/objects/Line.js b/lib/objects/Line.js new file mode 100644 index 0000000..4a84890 --- /dev/null +++ b/lib/objects/Line.js @@ -0,0 +1,267 @@ +import { Sphere } from '../math/Sphere.js'; +import { Ray } from '../math/Ray.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.error( 'THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.' ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + +} + +Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = [ 0 ]; + + for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) { + + start.fromBufferAttribute( positionAttribute, i - 1 ); + end.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + lineDistances[ 0 ] = 0; + + for ( var i = 1, l = vertices.length; i < l; i ++ ) { + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] ); + + } + + } + + return this; + + }; + + }() ), + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += precision; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localPrecision = precision / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localPrecisionSq = localPrecision * localPrecision; + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = ( this && this.isLineSegments ) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.geometry.copy( source.geometry ); + this.material.copy( source.material ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +} ); + + +export { Line }; diff --git a/lib/objects/LineLoop.js b/lib/objects/LineLoop.js new file mode 100644 index 0000000..9fc29cd --- /dev/null +++ b/lib/objects/LineLoop.js @@ -0,0 +1,24 @@ +import { Line } from './Line.js'; + +/** + * @author mgreter / http://github.com/mgreter + */ + +function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + +} + +LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + +} ); + + +export { LineLoop }; diff --git a/lib/objects/LineSegments.js b/lib/objects/LineSegments.js new file mode 100644 index 0000000..30f38c5 --- /dev/null +++ b/lib/objects/LineSegments.js @@ -0,0 +1,85 @@ +import { Line } from './Line.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + +} + +LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = []; + + for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + start.fromBufferAttribute( positionAttribute, i ); + end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + for ( var i = 0, l = vertices.length; i < l; i += 2 ) { + + start.copy( vertices[ i ] ); + end.copy( vertices[ i + 1 ] ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + } + + return this; + + }; + + }() ) + +} ); + + +export { LineSegments }; diff --git a/lib/objects/Mesh.js b/lib/objects/Mesh.js new file mode 100644 index 0000000..f796876 --- /dev/null +++ b/lib/objects/Mesh.js @@ -0,0 +1,462 @@ +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Sphere } from '../math/Sphere.js'; +import { Ray } from '../math/Ray.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Triangle } from '../math/Triangle.js'; +import { Face3 } from '../core/Face3.js'; +import { DoubleSide, BackSide, TrianglesDrawMode } from '../constants.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + +function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + +} + +Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + return this; + + }, + + updateMorphTargets: function () { + + var geometry = this.geometry; + var m, ml, name; + + if ( geometry.isBufferGeometry ) { + + var morphAttributes = geometry.morphAttributes; + var keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + var morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + var morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + name = morphTargets[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, material, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, material, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ); + + } + + var face = new Face3( a, b, c ); + Triangle.getNormal( vA, vB, vC, face.normal ); + + intersection.face = face; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var groups = geometry.groups; + var drawRange = geometry.drawRange; + var i, j, il, jl; + var group, groupMaterial; + var start, end; + + if ( index !== null ) { + + // indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = index.getX( j ); + b = index.getX( j + 1 ); + c = index.getX( j + 2 ); + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = j; + b = j + 1; + c = j + 2; + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = Triangle.getUV( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC, new Vector2() ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + +} ); + + +export { Mesh }; diff --git a/lib/objects/Points.js b/lib/objects/Points.js new file mode 100644 index 0000000..5e81384 --- /dev/null +++ b/lib/objects/Points.js @@ -0,0 +1,148 @@ +import { Sphere } from '../math/Sphere.js'; +import { Ray } from '../math/Ray.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Vector3 } from '../math/Vector3.js'; +import { PointsMaterial } from '../materials/PointsMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + +} + +Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + var intersectPoint = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + +} ); + + +export { Points }; diff --git a/lib/objects/Skeleton.js b/lib/objects/Skeleton.js new file mode 100644 index 0000000..8764e93 --- /dev/null +++ b/lib/objects/Skeleton.js @@ -0,0 +1,178 @@ +import { Matrix4 } from '../math/Matrix4.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + +function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + +} + +Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + }, + + getBoneByName: function ( name ) { + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + +} ); + + +export { Skeleton }; diff --git a/lib/objects/SkinnedMesh.js b/lib/objects/SkinnedMesh.js new file mode 100644 index 0000000..cb1af1d --- /dev/null +++ b/lib/objects/SkinnedMesh.js @@ -0,0 +1,209 @@ +import { Mesh } from './Mesh.js'; +import { Vector4 } from '../math/Vector4.js'; +import { Skeleton } from './Skeleton.js'; +import { Bone } from './Bone.js'; +import { Matrix4 } from '../math/Matrix4.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + +} + +SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.manhattanLength(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.manhattanLength(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + +} ); + + +export { SkinnedMesh }; diff --git a/lib/objects/Sky.js b/lib/objects/Sky.js new file mode 100644 index 0000000..2adb3ad --- /dev/null +++ b/lib/objects/Sky.js @@ -0,0 +1,222 @@ +/** + * @author zz85 / https://github.com/zz85 + * + * Based on "A Practical Analytic Model for Daylight" + * aka The Preetham Model, the de facto standard analytic skydome model + * http://www.cs.utah.edu/~shirley/papers/sunsky/sunsky.pdf + * + * First implemented by Simon Wallner + * http://www.simonwallner.at/projects/atmospheric-scattering + * + * Improved by Martin Upitis + * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR + * + * Three.js integration by zz85 http://twitter.com/blurspline +*/ + +THREE.Sky = function () { + + var shader = THREE.Sky.SkyShader; + + var material = new THREE.ShaderMaterial( { + fragmentShader: shader.fragmentShader, + vertexShader: shader.vertexShader, + uniforms: THREE.UniformsUtils.clone( shader.uniforms ), + side: THREE.BackSide + } ); + + THREE.Mesh.call( this, new THREE.BoxBufferGeometry( 1, 1, 1 ), material ); + +}; + +THREE.Sky.prototype = Object.create( THREE.Mesh.prototype ); + +THREE.Sky.SkyShader = { + + uniforms: { + luminance: { value: 1 }, + turbidity: { value: 2 }, + rayleigh: { value: 1 }, + mieCoefficient: { value: 0.005 }, + mieDirectionalG: { value: 0.8 }, + sunPosition: { value: new THREE.Vector3() } + }, + + vertexShader: [ + 'uniform vec3 sunPosition;', + 'uniform float rayleigh;', + 'uniform float turbidity;', + 'uniform float mieCoefficient;', + + 'varying vec3 vWorldPosition;', + 'varying vec3 vSunDirection;', + 'varying float vSunfade;', + 'varying vec3 vBetaR;', + 'varying vec3 vBetaM;', + 'varying float vSunE;', + + 'const vec3 up = vec3( 0.0, 1.0, 0.0 );', + + // constants for atmospheric scattering + 'const float e = 2.71828182845904523536028747135266249775724709369995957;', + 'const float pi = 3.141592653589793238462643383279502884197169;', + + // wavelength of used primaries, according to preetham + 'const vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );', + // this pre-calcuation replaces older TotalRayleigh(vec3 lambda) function: + // (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn)) + 'const vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );', + + // mie stuff + // K coefficient for the primaries + 'const float v = 4.0;', + 'const vec3 K = vec3( 0.686, 0.678, 0.666 );', + // MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K + 'const vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );', + + // earth shadow hack + // cutoffAngle = pi / 1.95; + 'const float cutoffAngle = 1.6110731556870734;', + 'const float steepness = 1.5;', + 'const float EE = 1000.0;', + + 'float sunIntensity( float zenithAngleCos ) {', + ' zenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );', + ' return EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );', + '}', + + 'vec3 totalMie( float T ) {', + ' float c = ( 0.2 * T ) * 10E-18;', + ' return 0.434 * c * MieConst;', + '}', + + 'void main() {', + + ' vec4 worldPosition = modelMatrix * vec4( position, 1.0 );', + ' vWorldPosition = worldPosition.xyz;', + + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', + ' gl_Position.z = gl_Position.w;', // set z to camera.far + + ' vSunDirection = normalize( sunPosition );', + + ' vSunE = sunIntensity( dot( vSunDirection, up ) );', + + ' vSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );', + + ' float rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );', + + // extinction (absorbtion + out scattering) + // rayleigh coefficients + ' vBetaR = totalRayleigh * rayleighCoefficient;', + + // mie coefficients + ' vBetaM = totalMie( turbidity ) * mieCoefficient;', + + '}' + ].join( '\n' ), + + fragmentShader: [ + 'varying vec3 vWorldPosition;', + 'varying vec3 vSunDirection;', + 'varying float vSunfade;', + 'varying vec3 vBetaR;', + 'varying vec3 vBetaM;', + 'varying float vSunE;', + + 'uniform float luminance;', + 'uniform float mieDirectionalG;', + + 'const vec3 cameraPos = vec3( 0.0, 0.0, 0.0 );', + + // constants for atmospheric scattering + 'const float pi = 3.141592653589793238462643383279502884197169;', + + 'const float n = 1.0003;', // refractive index of air + 'const float N = 2.545E25;', // number of molecules per unit volume for air at + // 288.15K and 1013mb (sea level -45 celsius) + + // optical length at zenith for molecules + 'const float rayleighZenithLength = 8.4E3;', + 'const float mieZenithLength = 1.25E3;', + 'const vec3 up = vec3( 0.0, 1.0, 0.0 );', + // 66 arc seconds -> degrees, and the cosine of that + 'const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;', + + // 3.0 / ( 16.0 * pi ) + 'const float THREE_OVER_SIXTEENPI = 0.05968310365946075;', + // 1.0 / ( 4.0 * pi ) + 'const float ONE_OVER_FOURPI = 0.07957747154594767;', + + 'float rayleighPhase( float cosTheta ) {', + ' return THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );', + '}', + + 'float hgPhase( float cosTheta, float g ) {', + ' float g2 = pow( g, 2.0 );', + ' float inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );', + ' return ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );', + '}', + + // Filmic ToneMapping http://filmicgames.com/archives/75 + 'const float A = 0.15;', + 'const float B = 0.50;', + 'const float C = 0.10;', + 'const float D = 0.20;', + 'const float E = 0.02;', + 'const float F = 0.30;', + + 'const float whiteScale = 1.0748724675633854;', // 1.0 / Uncharted2Tonemap(1000.0) + + 'vec3 Uncharted2Tonemap( vec3 x ) {', + ' return ( ( x * ( A * x + C * B ) + D * E ) / ( x * ( A * x + B ) + D * F ) ) - E / F;', + '}', + + + 'void main() {', + // optical length + // cutoff angle at 90 to avoid singularity in next formula. + ' float zenithAngle = acos( max( 0.0, dot( up, normalize( vWorldPosition - cameraPos ) ) ) );', + ' float inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );', + ' float sR = rayleighZenithLength * inverse;', + ' float sM = mieZenithLength * inverse;', + + // combined extinction factor + ' vec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );', + + // in scattering + ' float cosTheta = dot( normalize( vWorldPosition - cameraPos ), vSunDirection );', + + ' float rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );', + ' vec3 betaRTheta = vBetaR * rPhase;', + + ' float mPhase = hgPhase( cosTheta, mieDirectionalG );', + ' vec3 betaMTheta = vBetaM * mPhase;', + + ' vec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );', + ' Lin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );', + + // nightsky + ' vec3 direction = normalize( vWorldPosition - cameraPos );', + ' float theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]', + ' float phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]', + ' vec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );', + ' vec3 L0 = vec3( 0.1 ) * Fex;', + + // composition + solar disc + ' float sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );', + ' L0 += ( vSunE * 19000.0 * Fex ) * sundisk;', + + ' vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );', + + ' vec3 curr = Uncharted2Tonemap( ( log2( 2.0 / pow( luminance, 4.0 ) ) ) * texColor );', + ' vec3 color = curr * whiteScale;', + + ' vec3 retColor = pow( color, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );', + + ' gl_FragColor = vec4( retColor, 1.0 );', + + '}' + ].join( '\n' ) + +}; diff --git a/lib/objects/Sprite.js b/lib/objects/Sprite.js new file mode 100644 index 0000000..e653fc1 --- /dev/null +++ b/lib/objects/Sprite.js @@ -0,0 +1,181 @@ +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Triangle } from '../math/Triangle.js'; +import { Object3D } from '../core/Object3D.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { InterleavedBuffer } from '../core/InterleavedBuffer.js'; +import { InterleavedBufferAttribute } from '../core/InterleavedBufferAttribute.js'; +import { SpriteMaterial } from '../materials/SpriteMaterial.js'; + +var geometry; + +function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + if ( geometry === undefined ) { + + geometry = new BufferGeometry(); + + var float32Array = new Float32Array( [ + - 0.5, - 0.5, 0, 0, 0, + 0.5, - 0.5, 0, 1, 0, + 0.5, 0.5, 0, 1, 1, + - 0.5, 0.5, 0, 0, 1 + ] ); + + var interleavedBuffer = new InterleavedBuffer( float32Array, 5 ); + + geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] ); + geometry.addAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) ); + geometry.addAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) ); + + } + + this.geometry = geometry; + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + +} + +Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldScale = new Vector3(); + var mvPosition = new Vector3(); + + var alignedPosition = new Vector2(); + var rotatedPosition = new Vector2(); + var viewWorldMatrix = new Matrix4(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) { + + // compute position in camera space + alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale ); + + // to check if rotation is not zero + if ( sin !== undefined ) { + + rotatedPosition.x = ( cos * alignedPosition.x ) - ( sin * alignedPosition.y ); + rotatedPosition.y = ( sin * alignedPosition.x ) + ( cos * alignedPosition.y ); + + } else { + + rotatedPosition.copy( alignedPosition ); + + } + + + vertexPosition.copy( mvPosition ); + vertexPosition.x += rotatedPosition.x; + vertexPosition.y += rotatedPosition.y; + + // transform to world space + vertexPosition.applyMatrix4( viewWorldMatrix ); + + } + + return function raycast( raycaster, intersects ) { + + worldScale.setFromMatrixScale( this.matrixWorld ); + viewWorldMatrix.getInverse( this.modelViewMatrix ).premultiply( this.matrixWorld ); + mvPosition.setFromMatrixPosition( this.modelViewMatrix ); + + var rotation = this.material.rotation; + var sin, cos; + if ( rotation !== 0 ) { + + cos = Math.cos( rotation ); + sin = Math.sin( rotation ); + + } + + var center = this.center; + + transformVertex( vA.set( - 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vB.set( 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vC.set( 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + + uvA.set( 0, 0 ); + uvB.set( 1, 0 ); + uvC.set( 1, 1 ); + + // check first triangle + var intersect = raycaster.ray.intersectTriangle( vA, vB, vC, false, intersectPoint ); + + if ( intersect === null ) { + + // check second triangle + transformVertex( vB.set( - 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + uvB.set( 0, 1 ); + + intersect = raycaster.ray.intersectTriangle( vA, vC, vB, false, intersectPoint ); + if ( intersect === null ) { + + return; + + } + + } + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + uv: Triangle.getUV( intersectPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + return this; + + } + + +} ); + +export { Sprite }; diff --git a/lib/physi.js b/lib/physi.js new file mode 100644 index 0000000..9d5b716 --- /dev/null +++ b/lib/physi.js @@ -0,0 +1,1403 @@ +window.Physijs = (function() { + 'use strict'; + + var SUPPORT_TRANSFERABLE, + _is_simulating = false, + _Physijs = Physijs, // used for noConflict method + Physijs = {}, // object assigned to window.Physijs + Eventable, // class to provide simple event methods + getObjectId, // returns a unique ID for a Physijs mesh object + getEulerXYZFromQuaternion, getQuatertionFromEuler, + convertWorldPositionToObject, // Converts a world-space position to object-space + addObjectChildren, + + _temp1, _temp2, + _temp_vector3_1 = new THREE.Vector3, + _temp_vector3_2 = new THREE.Vector3, + _temp_matrix4_1 = new THREE.Matrix4, + _quaternion_1 = new THREE.Quaternion, + + // constants + MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3 + }, + REPORT_ITEMSIZE = 14, + COLLISIONREPORT_ITEMSIZE = 5, + VEHICLEREPORT_ITEMSIZE = 9, + CONSTRAINTREPORT_ITEMSIZE = 6; + + Physijs.scripts = {}; + + Eventable = function() { + this._eventListeners = {}; + }; + Eventable.prototype.addEventListener = function( event_name, callback ) { + if ( !this._eventListeners.hasOwnProperty( event_name ) ) { + this._eventListeners[event_name] = []; + } + this._eventListeners[event_name].push( callback ); + }; + Eventable.prototype.removeEventListener = function( event_name, callback ) { + var index; + + if ( !this._eventListeners.hasOwnProperty( event_name ) ) return false; + + if ( (index = this._eventListeners[event_name].indexOf( callback )) >= 0 ) { + this._eventListeners[event_name].splice( index, 1 ); + return true; + } + + return false; + }; + Eventable.prototype.dispatchEvent = function( event_name ) { + var i, + parameters = Array.prototype.splice.call( arguments, 1 ); + + if ( this._eventListeners.hasOwnProperty( event_name ) ) { + for ( i = 0; i < this._eventListeners[event_name].length; i++ ) { + this._eventListeners[event_name][i].apply( this, parameters ); + } + } + }; + Eventable.make = function( obj ) { + obj.prototype.addEventListener = Eventable.prototype.addEventListener; + obj.prototype.removeEventListener = Eventable.prototype.removeEventListener; + obj.prototype.dispatchEvent = Eventable.prototype.dispatchEvent; + }; + + getObjectId = (function() { + var _id = 1; + return function() { + return _id++; + }; + })(); + + getEulerXYZFromQuaternion = function ( x, y, z, w ) { + return new THREE.Vector3( + Math.atan2( 2 * ( x * w - y * z ), ( w * w - x * x - y * y + z * z ) ), + Math.asin( 2 * ( x * z + y * w ) ), + Math.atan2( 2 * ( z * w - x * y ), ( w * w + x * x - y * y - z * z ) ) + ); + }; + + getQuatertionFromEuler = function( x, y, z ) { + var c1, s1, c2, s2, c3, s3, c1c2, s1s2; + c1 = Math.cos( y ); + s1 = Math.sin( y ); + c2 = Math.cos( -z ); + s2 = Math.sin( -z ); + c3 = Math.cos( x ); + s3 = Math.sin( x ); + + c1c2 = c1 * c2; + s1s2 = s1 * s2; + + return { + w: c1c2 * c3 - s1s2 * s3, + x: c1c2 * s3 + s1s2 * c3, + y: s1 * c2 * c3 + c1 * s2 * s3, + z: c1 * s2 * c3 - s1 * c2 * s3 + }; + }; + + convertWorldPositionToObject = function( position, object ) { + _temp_matrix4_1.identity(); // reset temp matrix + + // Set the temp matrix's rotation to the object's rotation + _temp_matrix4_1.identity().makeRotationFromQuaternion( object.quaternion ); + + // Invert rotation matrix in order to "unrotate" a point back to object space + _temp_matrix4_1.getInverse( _temp_matrix4_1 ); + + // Yay! Temp vars! + _temp_vector3_1.copy( position ); + _temp_vector3_2.copy( object.position ); + + // Apply the rotation + + return _temp_vector3_1.sub( _temp_vector3_2 ).applyMatrix4( _temp_matrix4_1 ); + }; + + + + // Physijs.noConflict + Physijs.noConflict = function() { + window.Physijs = _Physijs; + return Physijs; + }; + + + // Physijs.createMaterial + Physijs.createMaterial = function( material, friction, restitution ) { + var physijs_material = function(){}; + physijs_material.prototype = material; + physijs_material = new physijs_material; + + physijs_material._physijs = { + id: material.id, + friction: friction === undefined ? .8 : friction, + restitution: restitution === undefined ? .2 : restitution + }; + + return physijs_material; + }; + + + // Constraints + Physijs.PointConstraint = function( objecta, objectb, position ) { + if ( position === undefined ) { + position = objectb; + objectb = undefined; + } + + this.type = 'point'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + } + }; + Physijs.PointConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb + }; + }; + + Physijs.HingeConstraint = function( objecta, objectb, position, axis ) { + if ( axis === undefined ) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'hinge'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.position = position.clone(); + this.axis = axis; + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + } + }; + Physijs.HingeConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + }; + /* + * low = minimum angle in radians + * high = maximum angle in radians + * bias_factor = applied as a factor to constraint error + * relaxation_factor = controls bounce (0.0 == no bounce) + */ + Physijs.HingeConstraint.prototype.setLimits = function( low, high, bias_factor, relaxation_factor ) { + this.scene.execute( 'hinge_setLimits', { constraint: this.id, low: low, high: high, bias_factor: bias_factor, relaxation_factor: relaxation_factor } ); + }; + Physijs.HingeConstraint.prototype.enableAngularMotor = function( velocity, acceleration ) { + this.scene.execute( 'hinge_enableAngularMotor', { constraint: this.id, velocity: velocity, acceleration: acceleration } ); + }; + Physijs.HingeConstraint.prototype.disableMotor = function( velocity, acceleration ) { + this.scene.execute( 'hinge_disableMotor', { constraint: this.id } ); + }; + + Physijs.SliderConstraint = function( objecta, objectb, position, axis ) { + if ( axis === undefined ) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'slider'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.axis = axis; + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + } + }; + Physijs.SliderConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + }; + Physijs.SliderConstraint.prototype.setLimits = function( lin_lower, lin_upper, ang_lower, ang_upper ) { + this.scene.execute( 'slider_setLimits', { constraint: this.id, lin_lower: lin_lower, lin_upper: lin_upper, ang_lower: ang_lower, ang_upper: ang_upper } ); + }; + Physijs.SliderConstraint.prototype.setRestitution = function( linear, angular ) { + this.scene.execute( + 'slider_setRestitution', + { + constraint: this.id, + linear: linear, + angular: angular + } + ); + }; + Physijs.SliderConstraint.prototype.enableLinearMotor = function( velocity, acceleration) { + this.scene.execute( 'slider_enableLinearMotor', { constraint: this.id, velocity: velocity, acceleration: acceleration } ); + }; + Physijs.SliderConstraint.prototype.disableLinearMotor = function() { + this.scene.execute( 'slider_disableLinearMotor', { constraint: this.id } ); + }; + Physijs.SliderConstraint.prototype.enableAngularMotor = function( velocity, acceleration ) { + this.scene.execute( 'slider_enableAngularMotor', { constraint: this.id, velocity: velocity, acceleration: acceleration } ); + }; + Physijs.SliderConstraint.prototype.disableAngularMotor = function() { + this.scene.execute( 'slider_disableAngularMotor', { constraint: this.id } ); + }; + + Physijs.ConeTwistConstraint = function( objecta, objectb, position ) { + if ( position === undefined ) { + throw 'Both objects must be defined in a ConeTwistConstraint.'; + } + this.type = 'conetwist'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + }; + Physijs.ConeTwistConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + }; + Physijs.ConeTwistConstraint.prototype.setLimit = function( x, y, z ) { + this.scene.execute( 'conetwist_setLimit', { constraint: this.id, x: x, y: y, z: z } ); + }; + Physijs.ConeTwistConstraint.prototype.enableMotor = function() { + this.scene.execute( 'conetwist_enableMotor', { constraint: this.id } ); + }; + Physijs.ConeTwistConstraint.prototype.setMaxMotorImpulse = function( max_impulse ) { + this.scene.execute( 'conetwist_setMaxMotorImpulse', { constraint: this.id, max_impulse: max_impulse } ); + }; + Physijs.ConeTwistConstraint.prototype.setMotorTarget = function( target ) { + if ( target instanceof THREE.Vector3 ) { + target = new THREE.Quaternion().setFromEuler( new THREE.Euler( target.x, target.y, target.z ) ); + } else if ( target instanceof THREE.Euler ) { + target = new THREE.Quaternion().setFromEuler( target ); + } else if ( target instanceof THREE.Matrix4 ) { + target = new THREE.Quaternion().setFromRotationMatrix( target ); + } + this.scene.execute( 'conetwist_setMotorTarget', { constraint: this.id, x: target.x, y: target.y, z: target.z, w: target.w } ); + }; + Physijs.ConeTwistConstraint.prototype.disableMotor = function() { + this.scene.execute( 'conetwist_disableMotor', { constraint: this.id } ); + }; + + Physijs.DOFConstraint = function( objecta, objectb, position ) { + if ( position === undefined ) { + position = objectb; + objectb = undefined; + } + this.type = 'dof'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + } + }; + Physijs.DOFConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + }; + Physijs.DOFConstraint.prototype.setLinearLowerLimit = function( limit ) { + this.scene.execute( 'dof_setLinearLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.setLinearUpperLimit = function( limit ) { + this.scene.execute( 'dof_setLinearUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.setAngularLowerLimit = function( limit ) { + this.scene.execute( 'dof_setAngularLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.setAngularUpperLimit = function( limit ) { + this.scene.execute( 'dof_setAngularUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.enableAngularMotor = function( which ) { + this.scene.execute( 'dof_enableAngularMotor', { constraint: this.id, which: which } ); + }; + Physijs.DOFConstraint.prototype.configureAngularMotor = function( which, low_angle, high_angle, velocity, max_force ) { + this.scene.execute( 'dof_configureAngularMotor', { constraint: this.id, which: which, low_angle: low_angle, high_angle: high_angle, velocity: velocity, max_force: max_force } ); + }; + Physijs.DOFConstraint.prototype.disableAngularMotor = function( which ) { + this.scene.execute( 'dof_disableAngularMotor', { constraint: this.id, which: which } ); + }; + + // Physijs.Scene + Physijs.Scene = function( params ) { + var self = this; + + Eventable.call( this ); + THREE.Scene.call( this ); + + this._worker = new Worker( Physijs.scripts.worker || 'physijs_worker.js' ); + this._worker.transferableMessage = this._worker.webkitPostMessage || this._worker.postMessage; + this._materials_ref_counts = {}; + this._objects = {}; + this._vehicles = {}; + this._constraints = {}; + + var ab = new ArrayBuffer( 1 ); + this._worker.transferableMessage( ab, [ab] ); + SUPPORT_TRANSFERABLE = ( ab.byteLength === 0 ); + + this._worker.onmessage = function ( event ) { + var _temp, + data = event.data; + + if ( data instanceof ArrayBuffer && data.byteLength !== 1 ) { // byteLength === 1 is the worker making a SUPPORT_TRANSFERABLE test + data = new Float32Array( data ); + } + + if ( data instanceof Float32Array ) { + + // transferable object + switch ( data[0] ) { + case MESSAGE_TYPES.WORLDREPORT: + self._updateScene( data ); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + self._updateCollisions( data ); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + self._updateVehicles( data ); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + self._updateConstraints( data ); + break; + } + + } else { + + if ( data.cmd ) { + + // non-transferable object + switch ( data.cmd ) { + case 'objectReady': + _temp = data.params; + if ( self._objects[ _temp ] ) { + self._objects[ _temp ].dispatchEvent( 'ready' ); + } + break; + + case 'worldReady': + self.dispatchEvent( 'ready' ); + break; + + case 'vehicle': + window.test = data; + break; + + default: + // Do nothing, just show the message + console.debug('Received: ' + data.cmd); + console.dir(data.params); + break; + } + + } else { + + switch ( data[0] ) { + case MESSAGE_TYPES.WORLDREPORT: + self._updateScene( data ); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + self._updateCollisions( data ); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + self._updateVehicles( data ); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + self._updateConstraints( data ); + break; + } + + } + + } + }; + + + params = params || {}; + params.ammo = Physijs.scripts.ammo || 'ammo.js'; + params.fixedTimeStep = params.fixedTimeStep || 1 / 60; + params.rateLimit = params.rateLimit || true; + this.execute( 'init', params ); + }; + Physijs.Scene.prototype = new THREE.Scene; + Physijs.Scene.prototype.constructor = Physijs.Scene; + Eventable.make( Physijs.Scene ); + + Physijs.Scene.prototype._updateScene = function( data ) { + var num_objects = data[1], + object, + i, offset; + + for ( i = 0; i < num_objects; i++ ) { + offset = 2 + i * REPORT_ITEMSIZE; + object = this._objects[ data[ offset ] ]; + + if ( object === undefined ) { + continue; + } + + if ( object.__dirtyPosition === false ) { + object.position.set( + data[ offset + 1 ], + data[ offset + 2 ], + data[ offset + 3 ] + ); + } + + if ( object.__dirtyRotation === false ) { + object.quaternion.set( + data[ offset + 4 ], + data[ offset + 5 ], + data[ offset + 6 ], + data[ offset + 7 ] + ); + } + + object._physijs.linearVelocity.set( + data[ offset + 8 ], + data[ offset + 9 ], + data[ offset + 10 ] + ); + + object._physijs.angularVelocity.set( + data[ offset + 11 ], + data[ offset + 12 ], + data[ offset + 13 ] + ); + + } + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + + _is_simulating = false; + this.dispatchEvent( 'update' ); + }; + + Physijs.Scene.prototype._updateVehicles = function( data ) { + var vehicle, wheel, + i, offset; + + for ( i = 0; i < ( data.length - 1 ) / VEHICLEREPORT_ITEMSIZE; i++ ) { + offset = 1 + i * VEHICLEREPORT_ITEMSIZE; + vehicle = this._vehicles[ data[ offset ] ]; + + if ( vehicle === undefined ) { + continue; + } + + wheel = vehicle.wheels[ data[ offset + 1 ] ]; + + wheel.position.set( + data[ offset + 2 ], + data[ offset + 3 ], + data[ offset + 4 ] + ); + + wheel.quaternion.set( + data[ offset + 5 ], + data[ offset + 6 ], + data[ offset + 7 ], + data[ offset + 8 ] + ); + } + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + }; + + Physijs.Scene.prototype._updateConstraints = function( data ) { + var constraint, object, + i, offset; + + for ( i = 0; i < ( data.length - 1 ) / CONSTRAINTREPORT_ITEMSIZE; i++ ) { + offset = 1 + i * CONSTRAINTREPORT_ITEMSIZE; + constraint = this._constraints[ data[ offset ] ]; + object = this._objects[ data[ offset + 1 ] ]; + + if ( constraint === undefined || object === undefined ) { + continue; + } + + _temp_vector3_1.set( + data[ offset + 2 ], + data[ offset + 3 ], + data[ offset + 4 ] + ); + _temp_matrix4_1.extractRotation( object.matrix ); + _temp_vector3_1.applyMatrix4( _temp_matrix4_1 ); + + constraint.positiona.addVectors( object.position, _temp_vector3_1 ); + constraint.appliedImpulse = data[ offset + 5 ] ; + } + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + }; + + Physijs.Scene.prototype._updateCollisions = function( data ) { + /** + * #TODO + * This is probably the worst way ever to handle collisions. The inherent evilness is a residual + * effect from the previous version's evilness which mutated when switching to transferable objects. + * + * If you feel inclined to make this better, please do so. + */ + + var i, j, offset, object, object2, id1, id2, + collisions = {}, normal_offsets = {}; + + // Build collision manifest + for ( i = 0; i < data[1]; i++ ) { + offset = 2 + i * COLLISIONREPORT_ITEMSIZE; + object = data[ offset ]; + object2 = data[ offset + 1 ]; + + normal_offsets[ object + '-' + object2 ] = offset + 2; + normal_offsets[ object2 + '-' + object ] = -1 * ( offset + 2 ); + + // Register collisions for both the object colliding and the object being collided with + if ( !collisions[ object ] ) collisions[ object ] = []; + collisions[ object ].push( object2 ); + + if ( !collisions[ object2 ] ) collisions[ object2 ] = []; + collisions[ object2 ].push( object ); + } + + // Deal with collisions + for ( id1 in this._objects ) { + if ( !this._objects.hasOwnProperty( id1 ) ) continue; + object = this._objects[ id1 ]; + + // If object touches anything, ... + if ( collisions[ id1 ] ) { + + // Clean up touches array + for ( j = 0; j < object._physijs.touches.length; j++ ) { + if ( collisions[ id1 ].indexOf( object._physijs.touches[j] ) === -1 ) { + object._physijs.touches.splice( j--, 1 ); + } + } + + // Handle each colliding object + for ( j = 0; j < collisions[ id1 ].length; j++ ) { + id2 = collisions[ id1 ][ j ]; + object2 = this._objects[ id2 ]; + + if ( object2 ) { + // If object was not already touching object2, notify object + if ( object._physijs.touches.indexOf( id2 ) === -1 ) { + object._physijs.touches.push( id2 ); + + _temp_vector3_1.subVectors( object.getLinearVelocity(), object2.getLinearVelocity() ); + _temp1 = _temp_vector3_1.clone(); + + _temp_vector3_1.subVectors( object.getAngularVelocity(), object2.getAngularVelocity() ); + _temp2 = _temp_vector3_1.clone(); + + var normal_offset = normal_offsets[ object._physijs.id + '-' + object2._physijs.id ]; + if ( normal_offset > 0 ) { + _temp_vector3_1.set( + -data[ normal_offset ], + -data[ normal_offset + 1 ], + -data[ normal_offset + 2 ] + ); + } else { + normal_offset *= -1; + _temp_vector3_1.set( + data[ normal_offset ], + data[ normal_offset + 1 ], + data[ normal_offset + 2 ] + ); + } + + object.dispatchEvent( 'collision', object2, _temp1, _temp2, _temp_vector3_1 ); + } + } + } + + } else { + + // not touching other objects + object._physijs.touches.length = 0; + + } + + } + + this.collisions = collisions; + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + }; + + Physijs.Scene.prototype.addConstraint = function ( constraint, show_marker ) { + this._constraints[ constraint.id ] = constraint; + this.execute( 'addConstraint', constraint.getDefinition() ); + + if ( show_marker ) { + var marker; + + switch ( constraint.type ) { + case 'point': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'hinge': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'slider': + marker = new THREE.Mesh( + new THREE.BoxGeometry( 10, 1, 1 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + // This rotation isn't right if all three axis are non-0 values + // TODO: change marker's rotation order to ZYX + marker.rotation.set( + constraint.axis.y, // yes, y and + constraint.axis.x, // x axis are swapped + constraint.axis.z + ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'conetwist': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'dof': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + } + } + + return constraint; + }; + + Physijs.Scene.prototype.onSimulationResume = function() { + this.execute( 'onSimulationResume', { } ); + }; + + Physijs.Scene.prototype.removeConstraint = function( constraint ) { + if ( this._constraints[constraint.id ] !== undefined ) { + this.execute( 'removeConstraint', { id: constraint.id } ); + delete this._constraints[ constraint.id ]; + } + }; + + Physijs.Scene.prototype.execute = function( cmd, params ) { + this._worker.postMessage({ cmd: cmd, params: params }); + }; + + addObjectChildren = function( parent, object ) { + var i; + + for ( i = 0; i < object.children.length; i++ ) { + if ( object.children[i]._physijs ) { + object.children[i].updateMatrix(); + object.children[i].updateMatrixWorld(); + + _temp_vector3_1.setFromMatrixPosition( object.children[i].matrixWorld ); + _quaternion_1.setFromRotationMatrix( object.children[i].matrixWorld ); + + object.children[i]._physijs.position_offset = { + x: _temp_vector3_1.x, + y: _temp_vector3_1.y, + z: _temp_vector3_1.z + }; + + object.children[i]._physijs.rotation = { + x: _quaternion_1.x, + y: _quaternion_1.y, + z: _quaternion_1.z, + w: _quaternion_1.w + }; + + parent._physijs.children.push( object.children[i]._physijs ); + } + + addObjectChildren( parent, object.children[i] ); + } + }; + + Physijs.Scene.prototype.add = function( object ) { + THREE.Mesh.prototype.add.call( this, object ); + + if ( object._physijs ) { + + object.world = this; + + if ( object instanceof Physijs.Vehicle ) { + + this.add( object.mesh ); + this._vehicles[ object._physijs.id ] = object; + this.execute( 'addVehicle', object._physijs ); + + } else { + + object.__dirtyPosition = false; + object.__dirtyRotation = false; + this._objects[object._physijs.id] = object; + + if ( object.children.length ) { + object._physijs.children = []; + addObjectChildren( object, object ); + } + + if ( object.material._physijs ) { + if ( !this._materials_ref_counts.hasOwnProperty( object.material._physijs.id ) ) { + this.execute( 'registerMaterial', object.material._physijs ); + object._physijs.materialId = object.material._physijs.id; + this._materials_ref_counts[object.material._physijs.id] = 1; + } else { + this._materials_ref_counts[object.material._physijs.id]++; + } + } + + // Object starting position + rotation + object._physijs.position = { x: object.position.x, y: object.position.y, z: object.position.z }; + object._physijs.rotation = { x: object.quaternion.x, y: object.quaternion.y, z: object.quaternion.z, w: object.quaternion.w }; + + // Check for scaling + var mass_scaling = new THREE.Vector3( 1, 1, 1 ); + if ( object._physijs.width ) { + object._physijs.width *= object.scale.x; + } + if ( object._physijs.height ) { + object._physijs.height *= object.scale.y; + } + if ( object._physijs.depth ) { + object._physijs.depth *= object.scale.z; + } + + this.execute( 'addObject', object._physijs ); + + } + } + }; + + Physijs.Scene.prototype.remove = function( object ) { + if ( object instanceof Physijs.Vehicle ) { + this.execute( 'removeVehicle', { id: object._physijs.id } ); + while( object.wheels.length ) { + this.remove( object.wheels.pop() ); + } + this.remove( object.mesh ); + delete this._vehicles[ object._physijs.id ]; + } else { + THREE.Mesh.prototype.remove.call( this, object ); + if ( object._physijs ) { + delete this._objects[object._physijs.id]; + this.execute( 'removeObject', { id: object._physijs.id } ); + } + } + if ( object.material && object.material._physijs && this._materials_ref_counts.hasOwnProperty( object.material._physijs.id ) ) { + this._materials_ref_counts[object.material._physijs.id]--; + if(this._materials_ref_counts[object.material._physijs.id] == 0) { + this.execute( 'unRegisterMaterial', object.material._physijs ); + delete this._materials_ref_counts[object.material._physijs.id]; + } + } + }; + + Physijs.Scene.prototype.setFixedTimeStep = function( fixedTimeStep ) { + if ( fixedTimeStep ) { + this.execute( 'setFixedTimeStep', fixedTimeStep ); + } + }; + + Physijs.Scene.prototype.setGravity = function( gravity ) { + if ( gravity ) { + this.execute( 'setGravity', gravity ); + } + }; + + Physijs.Scene.prototype.simulate = function( timeStep, maxSubSteps ) { + var object_id, object, update; + + if ( _is_simulating ) { + return false; + } + + _is_simulating = true; + + for ( object_id in this._objects ) { + if ( !this._objects.hasOwnProperty( object_id ) ) continue; + + object = this._objects[object_id]; + + if ( object.__dirtyPosition || object.__dirtyRotation ) { + update = { id: object._physijs.id }; + + if ( object.__dirtyPosition ) { + update.pos = { x: object.position.x, y: object.position.y, z: object.position.z }; + object.__dirtyPosition = false; + } + + if ( object.__dirtyRotation ) { + update.quat = { x: object.quaternion.x, y: object.quaternion.y, z: object.quaternion.z, w: object.quaternion.w }; + object.__dirtyRotation = false; + } + + this.execute( 'updateTransform', update ); + } + } + + this.execute( 'simulate', { timeStep: timeStep, maxSubSteps: maxSubSteps } ); + + return true; + }; + + + // Phsijs.Mesh + Physijs.Mesh = function ( geometry, material, mass ) { + var index; + + if ( !geometry ) { + return; + } + + Eventable.call( this ); + THREE.Mesh.call( this, geometry, material ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + this._physijs = { + type: null, + id: getObjectId(), + mass: mass || 0, + touches: [], + linearVelocity: new THREE.Vector3, + angularVelocity: new THREE.Vector3 + }; + }; + Physijs.Mesh.prototype = new THREE.Mesh; + Physijs.Mesh.prototype.constructor = Physijs.Mesh; + Eventable.make( Physijs.Mesh ); + + // Physijs.Mesh.mass + Physijs.Mesh.prototype.__defineGetter__('mass', function() { + return this._physijs.mass; + }); + Physijs.Mesh.prototype.__defineSetter__('mass', function( mass ) { + this._physijs.mass = mass; + if ( this.world ) { + this.world.execute( 'updateMass', { id: this._physijs.id, mass: mass } ); + } + }); + + // Physijs.Mesh.applyCentralImpulse + Physijs.Mesh.prototype.applyCentralImpulse = function ( force ) { + if ( this.world ) { + this.world.execute( 'applyCentralImpulse', { id: this._physijs.id, x: force.x, y: force.y, z: force.z } ); + } + }; + + // Physijs.Mesh.applyImpulse + Physijs.Mesh.prototype.applyImpulse = function ( force, offset ) { + if ( this.world ) { + this.world.execute( 'applyImpulse', { id: this._physijs.id, impulse_x: force.x, impulse_y: force.y, impulse_z: force.z, x: offset.x, y: offset.y, z: offset.z } ); + } + }; + + // Physijs.Mesh.applyTorque + Physijs.Mesh.prototype.applyTorque = function ( force ) { + if ( this.world ) { + this.world.execute( 'applyTorque', { id: this._physijs.id, torque_x: force.x, torque_y: force.y, torque_z: force.z } ); + } + }; + + // Physijs.Mesh.applyCentralForce + Physijs.Mesh.prototype.applyCentralForce = function ( force ) { + if ( this.world ) { + this.world.execute( 'applyCentralForce', { id: this._physijs.id, x: force.x, y: force.y, z: force.z } ); + } + }; + + // Physijs.Mesh.applyForce + Physijs.Mesh.prototype.applyForce = function ( force, offset ) { + if ( this.world ) { + this.world.execute( 'applyForce', { id: this._physijs.id, force_x: force.x, force_y : force.y, force_z : force.z, x: offset.x, y: offset.y, z: offset.z } ); + } + }; + + // Physijs.Mesh.getAngularVelocity + Physijs.Mesh.prototype.getAngularVelocity = function () { + return this._physijs.angularVelocity; + }; + + // Physijs.Mesh.setAngularVelocity + Physijs.Mesh.prototype.setAngularVelocity = function ( velocity ) { + if ( this.world ) { + this.world.execute( 'setAngularVelocity', { id: this._physijs.id, x: velocity.x, y: velocity.y, z: velocity.z } ); + } + }; + + // Physijs.Mesh.getLinearVelocity + Physijs.Mesh.prototype.getLinearVelocity = function () { + return this._physijs.linearVelocity; + }; + + // Physijs.Mesh.setLinearVelocity + Physijs.Mesh.prototype.setLinearVelocity = function ( velocity ) { + if ( this.world ) { + this.world.execute( 'setLinearVelocity', { id: this._physijs.id, x: velocity.x, y: velocity.y, z: velocity.z } ); + } + }; + + // Physijs.Mesh.setAngularFactor + Physijs.Mesh.prototype.setAngularFactor = function ( factor ) { + if ( this.world ) { + this.world.execute( 'setAngularFactor', { id: this._physijs.id, x: factor.x, y: factor.y, z: factor.z } ); + } + }; + + // Physijs.Mesh.setLinearFactor + Physijs.Mesh.prototype.setLinearFactor = function ( factor ) { + if ( this.world ) { + this.world.execute( 'setLinearFactor', { id: this._physijs.id, x: factor.x, y: factor.y, z: factor.z } ); + } + }; + + // Physijs.Mesh.setDamping + Physijs.Mesh.prototype.setDamping = function ( linear, angular ) { + if ( this.world ) { + this.world.execute( 'setDamping', { id: this._physijs.id, linear: linear, angular: angular } ); + } + }; + + // Physijs.Mesh.setCcdMotionThreshold + Physijs.Mesh.prototype.setCcdMotionThreshold = function ( threshold ) { + if ( this.world ) { + this.world.execute( 'setCcdMotionThreshold', { id: this._physijs.id, threshold: threshold } ); + } + }; + + // Physijs.Mesh.setCcdSweptSphereRadius + Physijs.Mesh.prototype.setCcdSweptSphereRadius = function ( radius ) { + if ( this.world ) { + this.world.execute( 'setCcdSweptSphereRadius', { id: this._physijs.id, radius: radius } ); + } + }; + + + // Physijs.PlaneMesh + Physijs.PlaneMesh = function ( geometry, material, mass ) { + var width, height; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + + this._physijs.type = 'plane'; + this._physijs.normal = geometry.faces[0].normal.clone(); + this._physijs.mass = (typeof mass === 'undefined') ? width * height : mass; + }; + Physijs.PlaneMesh.prototype = new Physijs.Mesh; + Physijs.PlaneMesh.prototype.constructor = Physijs.PlaneMesh; + + // Physijs.HeightfieldMesh + Physijs.HeightfieldMesh = function ( geometry, material, mass, xdiv, ydiv) { + Physijs.Mesh.call( this, geometry, material, mass ); + + this._physijs.type = 'heightfield'; + this._physijs.xsize = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + this._physijs.ysize = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + this._physijs.xpts = (typeof xdiv === 'undefined') ? Math.sqrt(geometry.vertices.length) : xdiv + 1; + this._physijs.ypts = (typeof ydiv === 'undefined') ? Math.sqrt(geometry.vertices.length) : ydiv + 1; + // note - this assumes our plane geometry is square, unless we pass in specific xdiv and ydiv + this._physijs.absMaxHeight = Math.max(geometry.boundingBox.max.z,Math.abs(geometry.boundingBox.min.z)); + + var points = []; + + var a, b; + for ( var i = 0; i < geometry.vertices.length; i++ ) { + + a = i % this._physijs.xpts; + b = Math.round( ( i / this._physijs.xpts ) - ( (i % this._physijs.xpts) / this._physijs.xpts ) ); + points[i] = geometry.vertices[ a + ( ( this._physijs.ypts - b - 1 ) * this._physijs.ypts ) ].z; + + //points[i] = geometry.vertices[i]; + } + + this._physijs.points = points; + }; + Physijs.HeightfieldMesh.prototype = new Physijs.Mesh; + Physijs.HeightfieldMesh.prototype.constructor = Physijs.HeightfieldMesh; + + // Physijs.BoxMesh + Physijs.BoxMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'box'; + this._physijs.width = width; + this._physijs.height = height; + this._physijs.depth = depth; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.BoxMesh.prototype = new Physijs.Mesh; + Physijs.BoxMesh.prototype.constructor = Physijs.BoxMesh; + + + // Physijs.SphereMesh + Physijs.SphereMesh = function( geometry, material, mass ) { + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingSphere ) { + geometry.computeBoundingSphere(); + } + + this._physijs.type = 'sphere'; + this._physijs.radius = geometry.boundingSphere.radius; + this._physijs.mass = (typeof mass === 'undefined') ? (4/3) * Math.PI * Math.pow(this._physijs.radius, 3) : mass; + }; + Physijs.SphereMesh.prototype = new Physijs.Mesh; + Physijs.SphereMesh.prototype.constructor = Physijs.SphereMesh; + + + // Physijs.CylinderMesh + Physijs.CylinderMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'cylinder'; + this._physijs.width = width; + this._physijs.height = height; + this._physijs.depth = depth; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.CylinderMesh.prototype = new Physijs.Mesh; + Physijs.CylinderMesh.prototype.constructor = Physijs.CylinderMesh; + + + // Physijs.CapsuleMesh + Physijs.CapsuleMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'capsule'; + this._physijs.radius = Math.max(width / 2, depth / 2); + this._physijs.height = height; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.CapsuleMesh.prototype = new Physijs.Mesh; + Physijs.CapsuleMesh.prototype.constructor = Physijs.CapsuleMesh; + + + // Physijs.ConeMesh + Physijs.ConeMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + + this._physijs.type = 'cone'; + this._physijs.radius = width / 2; + this._physijs.height = height; + this._physijs.mass = (typeof mass === 'undefined') ? width * height : mass; + }; + Physijs.ConeMesh.prototype = new Physijs.Mesh; + Physijs.ConeMesh.prototype.constructor = Physijs.ConeMesh; + + + // Physijs.ConcaveMesh + Physijs.ConcaveMesh = function( geometry, material, mass ) { + var i, + width, height, depth, + vertices, face, triangles = []; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + vertices = geometry.vertices; + + for ( i = 0; i < geometry.faces.length; i++ ) { + face = geometry.faces[i]; + if ( face instanceof THREE.Face3) { + + triangles.push([ + { x: vertices[face.a].x, y: vertices[face.a].y, z: vertices[face.a].z }, + { x: vertices[face.b].x, y: vertices[face.b].y, z: vertices[face.b].z }, + { x: vertices[face.c].x, y: vertices[face.c].y, z: vertices[face.c].z } + ]); + + } else if ( face instanceof THREE.Face4 ) { + + triangles.push([ + { x: vertices[face.a].x, y: vertices[face.a].y, z: vertices[face.a].z }, + { x: vertices[face.b].x, y: vertices[face.b].y, z: vertices[face.b].z }, + { x: vertices[face.d].x, y: vertices[face.d].y, z: vertices[face.d].z } + ]); + triangles.push([ + { x: vertices[face.b].x, y: vertices[face.b].y, z: vertices[face.b].z }, + { x: vertices[face.c].x, y: vertices[face.c].y, z: vertices[face.c].z }, + { x: vertices[face.d].x, y: vertices[face.d].y, z: vertices[face.d].z } + ]); + + } + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'concave'; + this._physijs.triangles = triangles; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.ConcaveMesh.prototype = new Physijs.Mesh; + Physijs.ConcaveMesh.prototype.constructor = Physijs.ConcaveMesh; + + + // Physijs.ConvexMesh + Physijs.ConvexMesh = function( geometry, material, mass ) { + var i, + width, height, depth, + points = []; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + for ( i = 0; i < geometry.vertices.length; i++ ) { + points.push({ + x: geometry.vertices[i].x, + y: geometry.vertices[i].y, + z: geometry.vertices[i].z + }); + } + + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'convex'; + this._physijs.points = points; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.ConvexMesh.prototype = new Physijs.Mesh; + Physijs.ConvexMesh.prototype.constructor = Physijs.ConvexMesh; + + + // Physijs.Vehicle + Physijs.Vehicle = function( mesh, tuning ) { + tuning = tuning || new Physijs.VehicleTuning; + this.mesh = mesh; + this.wheels = []; + this._physijs = { + id: getObjectId(), + rigidBody: mesh._physijs.id, + suspension_stiffness: tuning.suspension_stiffness, + suspension_compression: tuning.suspension_compression, + suspension_damping: tuning.suspension_damping, + max_suspension_travel: tuning.max_suspension_travel, + friction_slip: tuning.friction_slip, + max_suspension_force: tuning.max_suspension_force + }; + }; + Physijs.Vehicle.prototype.addWheel = function( wheel_geometry, wheel_material, connection_point, wheel_direction, wheel_axle, suspension_rest_length, wheel_radius, is_front_wheel, tuning ) { + var wheel = new THREE.Mesh( wheel_geometry, wheel_material ); + wheel.castShadow = wheel.receiveShadow = true; + wheel.position.copy( wheel_direction ).multiplyScalar( suspension_rest_length / 100 ).add( connection_point ); + this.world.add( wheel ); + this.wheels.push( wheel ); + + this.world.execute( 'addWheel', { + id: this._physijs.id, + connection_point: { x: connection_point.x, y: connection_point.y, z: connection_point.z }, + wheel_direction: { x: wheel_direction.x, y: wheel_direction.y, z: wheel_direction.z }, + wheel_axle: { x: wheel_axle.x, y: wheel_axle.y, z: wheel_axle.z }, + suspension_rest_length: suspension_rest_length, + wheel_radius: wheel_radius, + is_front_wheel: is_front_wheel, + tuning: tuning + }); + }; + Physijs.Vehicle.prototype.setSteering = function( amount, wheel ) { + if ( wheel !== undefined && this.wheels[ wheel ] !== undefined ) { + this.world.execute( 'setSteering', { id: this._physijs.id, wheel: wheel, steering: amount } ); + } else if ( this.wheels.length > 0 ) { + for ( var i = 0; i < this.wheels.length; i++ ) { + this.world.execute( 'setSteering', { id: this._physijs.id, wheel: i, steering: amount } ); + } + } + }; + Physijs.Vehicle.prototype.setBrake = function( amount, wheel ) { + if ( wheel !== undefined && this.wheels[ wheel ] !== undefined ) { + this.world.execute( 'setBrake', { id: this._physijs.id, wheel: wheel, brake: amount } ); + } else if ( this.wheels.length > 0 ) { + for ( var i = 0; i < this.wheels.length; i++ ) { + this.world.execute( 'setBrake', { id: this._physijs.id, wheel: i, brake: amount } ); + } + } + }; + Physijs.Vehicle.prototype.applyEngineForce = function( amount, wheel ) { + if ( wheel !== undefined && this.wheels[ wheel ] !== undefined ) { + this.world.execute( 'applyEngineForce', { id: this._physijs.id, wheel: wheel, force: amount } ); + } else if ( this.wheels.length > 0 ) { + for ( var i = 0; i < this.wheels.length; i++ ) { + this.world.execute( 'applyEngineForce', { id: this._physijs.id, wheel: i, force: amount } ); + } + } + }; + + // Physijs.VehicleTuning + Physijs.VehicleTuning = function( suspension_stiffness, suspension_compression, suspension_damping, max_suspension_travel, friction_slip, max_suspension_force ) { + this.suspension_stiffness = suspension_stiffness !== undefined ? suspension_stiffness : 5.88; + this.suspension_compression = suspension_compression !== undefined ? suspension_compression : 0.83; + this.suspension_damping = suspension_damping !== undefined ? suspension_damping : 0.88; + this.max_suspension_travel = max_suspension_travel !== undefined ? max_suspension_travel : 500; + this.friction_slip = friction_slip !== undefined ? friction_slip : 10.5; + this.max_suspension_force = max_suspension_force !== undefined ? max_suspension_force : 6000; + }; + + return Physijs; +})(); diff --git a/lib/physics-module.js b/lib/physics-module.js new file mode 100644 index 0000000..f4731eb --- /dev/null +++ b/lib/physics-module.js @@ -0,0 +1,4504 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('three'), require('whs')) : + typeof define === 'function' && define.amd ? define(['exports', 'three', 'whs'], factory) : + (factory((global.PHYSICS = {}),global.THREE,global.WHS)); +}(this, (function (exports,three,whs) { 'use strict'; + + var MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3, + SOFTREPORT: 4 + }; + + var REPORT_ITEMSIZE = 14, + COLLISIONREPORT_ITEMSIZE = 5, + VEHICLEREPORT_ITEMSIZE = 9, + CONSTRAINTREPORT_ITEMSIZE = 6; + + var temp1Vector3 = new three.Vector3(), + temp2Vector3 = new three.Vector3(), + temp1Matrix4 = new three.Matrix4(), + temp1Quat = new three.Quaternion(); + + var getEulerXYZFromQuaternion = function getEulerXYZFromQuaternion(x, y, z, w) { + return new three.Vector3(Math.atan2(2 * (x * w - y * z), w * w - x * x - y * y + z * z), Math.asin(2 * (x * z + y * w)), Math.atan2(2 * (z * w - x * y), w * w + x * x - y * y - z * z)); + }; + + var getQuatertionFromEuler = function getQuatertionFromEuler(x, y, z) { + var c1 = Math.cos(y); + var s1 = Math.sin(y); + var c2 = Math.cos(-z); + var s2 = Math.sin(-z); + var c3 = Math.cos(x); + var s3 = Math.sin(x); + var c1c2 = c1 * c2; + var s1s2 = s1 * s2; + + return { + w: c1c2 * c3 - s1s2 * s3, + x: c1c2 * s3 + s1s2 * c3, + y: s1 * c2 * c3 + c1 * s2 * s3, + z: c1 * s2 * c3 - s1 * c2 * s3 + }; + }; + + var convertWorldPositionToObject = function convertWorldPositionToObject(position, object) { + temp1Matrix4.identity(); // reset temp matrix + + // Set the temp matrix's rotation to the object's rotation + temp1Matrix4.identity().makeRotationFromQuaternion(object.quaternion); + + // Invert rotation matrix in order to "unrotate" a point back to object space + temp1Matrix4.getInverse(temp1Matrix4); + + // Yay! Temp vars! + temp1Vector3.copy(position); + temp2Vector3.copy(object.position); + + // Apply the rotation + return temp1Vector3.sub(temp2Vector3).applyMatrix4(temp1Matrix4); + }; + + var addObjectChildren = function addObjectChildren(parent, object) { + for (var i = 0; i < object.children.length; i++) { + var child = object.children[i]; + var physics = child.component ? child.component.use('physics') : false; + + if (physics) { + var data = physics.data; + + child.updateMatrix(); + child.updateMatrixWorld(); + + temp1Vector3.setFromMatrixPosition(child.matrixWorld); + temp1Quat.setFromRotationMatrix(child.matrixWorld); + + data.position_offset = { + x: temp1Vector3.x, + y: temp1Vector3.y, + z: temp1Vector3.z + }; + + data.rotation = { + x: temp1Quat.x, + y: temp1Quat.y, + z: temp1Quat.z, + w: temp1Quat.w + }; + + parent.component.use('physics').data.children.push(data); + } + + addObjectChildren(parent, child); + } + }; + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + }; + + var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + }; + + var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } + }; + + var Eventable = function () { + function Eventable() { + classCallCheck(this, Eventable); + + this._eventListeners = {}; + } + + createClass(Eventable, [{ + key: "addEventListener", + value: function addEventListener(event_name, callback) { + if (!this._eventListeners.hasOwnProperty(event_name)) this._eventListeners[event_name] = []; + + this._eventListeners[event_name].push(callback); + } + }, { + key: "removeEventListener", + value: function removeEventListener(event_name, callback) { + var index = void 0; + + if (!this._eventListeners.hasOwnProperty(event_name)) return false; + + if ((index = this._eventListeners[event_name].indexOf(callback)) >= 0) { + this._eventListeners[event_name].splice(index, 1); + return true; + } + + return false; + } + }, { + key: "dispatchEvent", + value: function dispatchEvent(event_name) { + var i = void 0; + var parameters = Array.prototype.splice.call(arguments, 1); + + if (this._eventListeners.hasOwnProperty(event_name)) { + for (i = 0; i < this._eventListeners[event_name].length; i++) { + this._eventListeners[event_name][i].apply(this, parameters); + } + } + } + }], [{ + key: "make", + value: function make(obj) { + obj.prototype.addEventListener = Eventable.prototype.addEventListener; + obj.prototype.removeEventListener = Eventable.prototype.removeEventListener; + obj.prototype.dispatchEvent = Eventable.prototype.dispatchEvent; + } + }]); + return Eventable; + }(); + + var ConeTwistConstraint = function () { + function ConeTwistConstraint(obja, objb, position) { + classCallCheck(this, ConeTwistConstraint); + + var objecta = obja; + var objectb = obja; + + if (position === undefined) console.error('Both objects must be defined in a ConeTwistConstraint.'); + + this.type = 'conetwist'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + } + + createClass(ConeTwistConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + } + }, { + key: 'setLimit', + value: function setLimit(x, y, z) { + if (this.worldModule) this.worldModule.execute('conetwist_setLimit', { constraint: this.id, x: x, y: y, z: z }); + } + }, { + key: 'enableMotor', + value: function enableMotor() { + if (this.worldModule) this.worldModule.execute('conetwist_enableMotor', { constraint: this.id }); + } + }, { + key: 'setMaxMotorImpulse', + value: function setMaxMotorImpulse(max_impulse) { + if (this.worldModule) this.worldModule.execute('conetwist_setMaxMotorImpulse', { constraint: this.id, max_impulse: max_impulse }); + } + }, { + key: 'setMotorTarget', + value: function setMotorTarget(target) { + if (target instanceof three.Vector3) target = new three.Quaternion().setFromEuler(new three.Euler(target.x, target.y, target.z));else if (target instanceof three.Euler) target = new three.Quaternion().setFromEuler(target);else if (target instanceof three.Matrix4) target = new three.Quaternion().setFromRotationMatrix(target); + + if (this.worldModule) this.worldModule.execute('conetwist_setMotorTarget', { + constraint: this.id, + x: target.x, + y: target.y, + z: target.z, + w: target.w + }); + } + }]); + return ConeTwistConstraint; + }(); + + var HingeConstraint = function () { + function HingeConstraint(obja, objb, position, axis) { + classCallCheck(this, HingeConstraint); + + var objecta = obja; + var objectb = objb; + + if (axis === undefined) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'hinge'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.position = position.clone(); + this.axis = axis; + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + } + } + + createClass(HingeConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + } + }, { + key: 'setLimits', + value: function setLimits(low, high, bias_factor, relaxation_factor) { + if (this.worldModule) this.worldModule.execute('hinge_setLimits', { + constraint: this.id, + low: low, + high: high, + bias_factor: bias_factor, + relaxation_factor: relaxation_factor + }); + } + }, { + key: 'enableAngularMotor', + value: function enableAngularMotor(velocity, acceleration) { + if (this.worldModule) this.worldModule.execute('hinge_enableAngularMotor', { + constraint: this.id, + velocity: velocity, + acceleration: acceleration + }); + } + }, { + key: 'disableMotor', + value: function disableMotor() { + if (this.worldModule) this.worldModule.execute('hinge_disableMotor', { constraint: this.id }); + } + }]); + return HingeConstraint; + }(); + + var PointConstraint = function () { + function PointConstraint(obja, objb, position) { + classCallCheck(this, PointConstraint); + + var objecta = obja; + var objectb = objb; + + if (position === undefined) { + position = objectb; + objectb = undefined; + } + + this.type = 'point'; + this.appliedImpulse = 0; + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + } + } + + createClass(PointConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb + }; + } + }]); + return PointConstraint; + }(); + + var SliderConstraint = function () { + function SliderConstraint(obja, objb, position, axis) { + classCallCheck(this, SliderConstraint); + + var objecta = obja; + var objectb = objb; + + if (axis === undefined) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'slider'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.axis = axis; + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + } + } + + createClass(SliderConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + } + }, { + key: 'setLimits', + value: function setLimits(lin_lower, lin_upper, ang_lower, ang_upper) { + if (this.worldModule) this.worldModule.execute('slider_setLimits', { + constraint: this.id, + lin_lower: lin_lower, + lin_upper: lin_upper, + ang_lower: ang_lower, + ang_upper: ang_upper + }); + } + }, { + key: 'setRestitution', + value: function setRestitution(linear, angular) { + if (this.worldModule) this.worldModule.execute('slider_setRestitution', { + constraint: this.id, + linear: linear, + angular: angular + }); + } + }, { + key: 'enableLinearMotor', + value: function enableLinearMotor(velocity, acceleration) { + if (this.worldModule) this.worldModule.execute('slider_enableLinearMotor', { + constraint: this.id, + velocity: velocity, + acceleration: acceleration + }); + } + }, { + key: 'disableLinearMotor', + value: function disableLinearMotor() { + if (this.worldModule) this.worldModule.execute('slider_disableLinearMotor', { constraint: this.id }); + } + }, { + key: 'enableAngularMotor', + value: function enableAngularMotor(velocity, acceleration) { + this.scene.execute('slider_enableAngularMotor', { + constraint: this.id, + velocity: velocity, + acceleration: acceleration + }); + } + }, { + key: 'disableAngularMotor', + value: function disableAngularMotor() { + if (this.worldModule) this.worldModule.execute('slider_disableAngularMotor', { constraint: this.id }); + } + }]); + return SliderConstraint; + }(); + + var DOFConstraint = function () { + function DOFConstraint(obja, objb, position) { + classCallCheck(this, DOFConstraint); + + var objecta = obja; + var objectb = objb; + + if (position === undefined) { + position = objectb; + objectb = undefined; + } + + this.type = 'dof'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + } + } + + createClass(DOFConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + } + }, { + key: 'setLinearLowerLimit', + value: function setLinearLowerLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setLinearLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'setLinearUpperLimit', + value: function setLinearUpperLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setLinearUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'setAngularLowerLimit', + value: function setAngularLowerLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setAngularLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'setAngularUpperLimit', + value: function setAngularUpperLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setAngularUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'enableAngularMotor', + value: function enableAngularMotor(which) { + if (this.worldModule) this.worldModule.execute('dof_enableAngularMotor', { constraint: this.id, which: which }); + } + }, { + key: 'configureAngularMotor', + value: function configureAngularMotor(which, low_angle, high_angle, velocity, max_force) { + if (this.worldModule) this.worldModule.execute('dof_configureAngularMotor', { constraint: this.id, which: which, low_angle: low_angle, high_angle: high_angle, velocity: velocity, max_force: max_force }); + } + }, { + key: 'disableAngularMotor', + value: function disableAngularMotor(which) { + if (this.worldModule) this.worldModule.execute('dof_disableAngularMotor', { constraint: this.id, which: which }); + } + }]); + return DOFConstraint; + }(); + + var Vehicle = function () { + function Vehicle(mesh) { + var tuning = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new VehicleTuning(); + classCallCheck(this, Vehicle); + + this.mesh = mesh; + this.wheels = []; + + this._physijs = { + id: getObjectId(), + rigidBody: mesh._physijs.id, + suspension_stiffness: tuning.suspension_stiffness, + suspension_compression: tuning.suspension_compression, + suspension_damping: tuning.suspension_damping, + max_suspension_travel: tuning.max_suspension_travel, + friction_slip: tuning.friction_slip, + max_suspension_force: tuning.max_suspension_force + }; + } + + createClass(Vehicle, [{ + key: 'addWheel', + value: function addWheel(wheel_geometry, wheel_material, connection_point, wheel_direction, wheel_axle, suspension_rest_length, wheel_radius, is_front_wheel, tuning) { + var wheel = new three.Mesh(wheel_geometry, wheel_material); + + wheel.castShadow = wheel.receiveShadow = true; + wheel.position.copy(wheel_direction).multiplyScalar(suspension_rest_length / 100).add(connection_point); + + this.world.add(wheel); + this.wheels.push(wheel); + + this.world.execute('addWheel', { + id: this._physijs.id, + connection_point: { x: connection_point.x, y: connection_point.y, z: connection_point.z }, + wheel_direction: { x: wheel_direction.x, y: wheel_direction.y, z: wheel_direction.z }, + wheel_axle: { x: wheel_axle.x, y: wheel_axle.y, z: wheel_axle.z }, + suspension_rest_length: suspension_rest_length, + wheel_radius: wheel_radius, + is_front_wheel: is_front_wheel, + tuning: tuning + }); + } + }, { + key: 'setSteering', + value: function setSteering(amount, wheel) { + if (wheel !== undefined && this.wheels[wheel] !== undefined) this.world.execute('setSteering', { id: this._physijs.id, wheel: wheel, steering: amount });else if (this.wheels.length > 0) { + for (var i = 0; i < this.wheels.length; i++) { + this.world.execute('setSteering', { id: this._physijs.id, wheel: i, steering: amount }); + } + } + } + }, { + key: 'setBrake', + value: function setBrake(amount, wheel) { + if (wheel !== undefined && this.wheels[wheel] !== undefined) this.world.execute('setBrake', { id: this._physijs.id, wheel: wheel, brake: amount });else if (this.wheels.length > 0) { + for (var i = 0; i < this.wheels.length; i++) { + this.world.execute('setBrake', { id: this._physijs.id, wheel: i, brake: amount }); + } + } + } + }, { + key: 'applyEngineForce', + value: function applyEngineForce(amount, wheel) { + if (wheel !== undefined && this.wheels[wheel] !== undefined) this.world.execute('applyEngineForce', { id: this._physijs.id, wheel: wheel, force: amount });else if (this.wheels.length > 0) { + for (var i = 0; i < this.wheels.length; i++) { + this.world.execute('applyEngineForce', { id: this._physijs.id, wheel: i, force: amount }); + } + } + } + }]); + return Vehicle; + }(); + + var _class, _temp2; + + var WorldModuleBase = (_temp2 = _class = function (_Eventable) { + inherits(WorldModuleBase, _Eventable); + + function WorldModuleBase(options) { + classCallCheck(this, WorldModuleBase); + + var _this = possibleConstructorReturn(this, (WorldModuleBase.__proto__ || Object.getPrototypeOf(WorldModuleBase)).call(this)); + + _this.bridge = { + onAdd: function onAdd(component, self) { + if (component.use('physics')) return self.defer(self.onAddCallback.bind(self), [component]); + return; + }, + onRemove: function onRemove(component, self) { + if (component.use('physics')) return self.defer(self.onRemoveCallback.bind(self), [component]); + return; + } + }; + + + _this.options = Object.assign(WorldModuleBase.defaults, options); + + _this.objects = {}; + _this.vehicles = {}; + _this.constraints = {}; + _this.isSimulating = false; + + _this.getObjectId = function () { + var id = 1; + return function () { + return id++; + }; + }(); + return _this; + } + + createClass(WorldModuleBase, [{ + key: 'setup', + value: function setup() { + var _this2 = this; + + this.receive(function (event) { + var _temp = void 0, + data = event.data; + + if (data instanceof ArrayBuffer && data.byteLength !== 1) // byteLength === 1 is the worker making a SUPPORT_TRANSFERABLE test + data = new Float32Array(data); + + if (data instanceof Float32Array) { + // transferable object + switch (data[0]) { + case MESSAGE_TYPES.WORLDREPORT: + _this2.updateScene(data); + break; + + case MESSAGE_TYPES.SOFTREPORT: + _this2.updateSoftbodies(data); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + _this2.updateCollisions(data); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + _this2.updateVehicles(data); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + _this2.updateConstraints(data); + break; + default: + } + } else if (data.cmd) { + // non-transferable object + switch (data.cmd) { + case 'objectReady': + _temp = data.params; + if (_this2.objects[_temp]) _this2.objects[_temp].dispatchEvent('ready'); + break; + + case 'worldReady': + _this2.dispatchEvent('ready'); + break; + + case 'ammoLoaded': + _this2.dispatchEvent('loaded'); + // console.log("Physics loading time: " + (performance.now() - start) + "ms"); + break; + + case 'vehicle': + window.test = data; + break; + + default: + // Do nothing, just show the message + console.debug('Received: ' + data.cmd); + console.dir(data.params); + break; + } + } else { + switch (data[0]) { + case MESSAGE_TYPES.WORLDREPORT: + _this2.updateScene(data); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + _this2.updateCollisions(data); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + _this2.updateVehicles(data); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + _this2.updateConstraints(data); + break; + default: + } + } + }); + } + }, { + key: 'updateScene', + value: function updateScene(info) { + var index = info[1]; + + while (index--) { + var offset = 2 + index * REPORT_ITEMSIZE; + var object = this.objects[info[offset]]; + var component = object.component; + var data = component.use('physics').data; + + if (object === null) continue; + + if (component.__dirtyPosition === false) { + object.position.set(info[offset + 1], info[offset + 2], info[offset + 3]); + + component.__dirtyPosition = false; + } + + if (component.__dirtyRotation === false) { + object.quaternion.set(info[offset + 4], info[offset + 5], info[offset + 6], info[offset + 7]); + + component.__dirtyRotation = false; + } + + data.linearVelocity.set(info[offset + 8], info[offset + 9], info[offset + 10]); + + data.angularVelocity.set(info[offset + 11], info[offset + 12], info[offset + 13]); + } + + if (this.SUPPORT_TRANSFERABLE) this.send(info.buffer, [info.buffer]); // Give the typed array back to the worker + + this.isSimulating = false; + this.dispatchEvent('update'); + } + }, { + key: 'updateSoftbodies', + value: function updateSoftbodies(info) { + var index = info[1], + offset = 2; + + while (index--) { + var size = info[offset + 1]; + var object = this.objects[info[offset]]; + + if (object === null) continue; + + var data = object.component.use('physics').data; + + var attributes = object.geometry.attributes; + var volumePositions = attributes.position.array; + + var offsetVert = offset + 2; + + // console.log(data.id); + if (!data.isSoftBodyReset) { + object.position.set(0, 0, 0); + object.quaternion.set(0, 0, 0, 0); + + data.isSoftBodyReset = true; + } + + if (data.type === "softTrimesh") { + var volumeNormals = attributes.normal.array; + + for (var i = 0; i < size; i++) { + var offs = offsetVert + i * 18; + + var x1 = info[offs]; + var y1 = info[offs + 1]; + var z1 = info[offs + 2]; + + var nx1 = info[offs + 3]; + var ny1 = info[offs + 4]; + var nz1 = info[offs + 5]; + + var x2 = info[offs + 6]; + var y2 = info[offs + 7]; + var z2 = info[offs + 8]; + + var nx2 = info[offs + 9]; + var ny2 = info[offs + 10]; + var nz2 = info[offs + 11]; + + var x3 = info[offs + 12]; + var y3 = info[offs + 13]; + var z3 = info[offs + 14]; + + var nx3 = info[offs + 15]; + var ny3 = info[offs + 16]; + var nz3 = info[offs + 17]; + + var i9 = i * 9; + + volumePositions[i9] = x1; + volumePositions[i9 + 1] = y1; + volumePositions[i9 + 2] = z1; + + volumePositions[i9 + 3] = x2; + volumePositions[i9 + 4] = y2; + volumePositions[i9 + 5] = z2; + + volumePositions[i9 + 6] = x3; + volumePositions[i9 + 7] = y3; + volumePositions[i9 + 8] = z3; + + volumeNormals[i9] = nx1; + volumeNormals[i9 + 1] = ny1; + volumeNormals[i9 + 2] = nz1; + + volumeNormals[i9 + 3] = nx2; + volumeNormals[i9 + 4] = ny2; + volumeNormals[i9 + 5] = nz2; + + volumeNormals[i9 + 6] = nx3; + volumeNormals[i9 + 7] = ny3; + volumeNormals[i9 + 8] = nz3; + } + + attributes.normal.needsUpdate = true; + offset += 2 + size * 18; + } else if (data.type === "softRopeMesh") { + for (var _i = 0; _i < size; _i++) { + var _offs = offsetVert + _i * 3; + + var x = info[_offs]; + var y = info[_offs + 1]; + var z = info[_offs + 2]; + + volumePositions[_i * 3] = x; + volumePositions[_i * 3 + 1] = y; + volumePositions[_i * 3 + 2] = z; + } + + offset += 2 + size * 3; + } else { + var _volumeNormals = attributes.normal.array; + + for (var _i2 = 0; _i2 < size; _i2++) { + var _offs2 = offsetVert + _i2 * 6; + + var _x = info[_offs2]; + var _y = info[_offs2 + 1]; + var _z = info[_offs2 + 2]; + + var nx = info[_offs2 + 3]; + var ny = info[_offs2 + 4]; + var nz = info[_offs2 + 5]; + + volumePositions[_i2 * 3] = _x; + volumePositions[_i2 * 3 + 1] = _y; + volumePositions[_i2 * 3 + 2] = _z; + + // FIXME: Normals are pointed to look inside; + _volumeNormals[_i2 * 3] = nx; + _volumeNormals[_i2 * 3 + 1] = ny; + _volumeNormals[_i2 * 3 + 2] = nz; + } + + attributes.normal.needsUpdate = true; + offset += 2 + size * 6; + } + + attributes.position.needsUpdate = true; + } + + // if (this.SUPPORT_TRANSFERABLE) + // this.send(info.buffer, [info.buffer]); // Give the typed array back to the worker + + this.isSimulating = false; + } + }, { + key: 'updateVehicles', + value: function updateVehicles(data) { + var vehicle = void 0, + wheel = void 0; + + for (var i = 0; i < (data.length - 1) / VEHICLEREPORT_ITEMSIZE; i++) { + var offset = 1 + i * VEHICLEREPORT_ITEMSIZE; + vehicle = this.vehicles[data[offset]]; + + if (vehicle === null) continue; + + wheel = vehicle.wheels[data[offset + 1]]; + + wheel.position.set(data[offset + 2], data[offset + 3], data[offset + 4]); + + wheel.quaternion.set(data[offset + 5], data[offset + 6], data[offset + 7], data[offset + 8]); + } + + if (this.SUPPORT_TRANSFERABLE) this.send(data.buffer, [data.buffer]); // Give the typed array back to the worker + } + }, { + key: 'updateConstraints', + value: function updateConstraints(data) { + var constraint = void 0, + object = void 0; + + for (var i = 0; i < (data.length - 1) / CONSTRAINTREPORT_ITEMSIZE; i++) { + var offset = 1 + i * CONSTRAINTREPORT_ITEMSIZE; + constraint = this.constraints[data[offset]]; + object = this.objects[data[offset + 1]]; + + if (constraint === undefined || object === undefined) continue; + + temp1Vector3.set(data[offset + 2], data[offset + 3], data[offset + 4]); + + temp1Matrix4.extractRotation(object.matrix); + temp1Vector3.applyMatrix4(temp1Matrix4); + + constraint.positiona.addVectors(object.position, temp1Vector3); + constraint.appliedImpulse = data[offset + 5]; + } + + if (this.SUPPORT_TRANSFERABLE) this.send(data.buffer, [data.buffer]); // Give the typed array back to the worker + } + }, { + key: 'updateCollisions', + value: function updateCollisions(info) { + /** + * #TODO + * This is probably the worst way ever to handle collisions. The inherent evilness is a residual + * effect from the previous version's evilness which mutated when switching to transferable objects. + * + * If you feel inclined to make this better, please do so. + */ + + var collisions = {}, + normal_offsets = {}; + + // Build collision manifest + for (var i = 0; i < info[1]; i++) { + var offset = 2 + i * COLLISIONREPORT_ITEMSIZE; + var object = info[offset]; + var object2 = info[offset + 1]; + + normal_offsets[object + '-' + object2] = offset + 2; + normal_offsets[object2 + '-' + object] = -1 * (offset + 2); + + // Register collisions for both the object colliding and the object being collided with + if (!collisions[object]) collisions[object] = []; + collisions[object].push(object2); + + if (!collisions[object2]) collisions[object2] = []; + collisions[object2].push(object); + } + + // Deal with collisions + for (var id1 in this.objects) { + if (!this.objects.hasOwnProperty(id1)) continue; + var _object = this.objects[id1]; + var component = _object.component; + var data = component.use('physics').data; + + if (_object === null) continue; + + // If object touches anything, ... + if (collisions[id1]) { + // Clean up touches array + for (var j = 0; j < data.touches.length; j++) { + if (collisions[id1].indexOf(data.touches[j]) === -1) data.touches.splice(j--, 1); + } + + // Handle each colliding object + for (var _j = 0; _j < collisions[id1].length; _j++) { + var id2 = collisions[id1][_j]; + var _object2 = this.objects[id2]; + + if (_object2) { + var component2 = _object2.component; + var data2 = component2.use('physics').data; + // If object was not already touching object2, notify object + if (data.touches.indexOf(id2) === -1) { + data.touches.push(id2); + + var vel = component.use('physics').getLinearVelocity(); + var vel2 = component2.use('physics').getLinearVelocity(); + + temp1Vector3.subVectors(vel, vel2); + var temp1 = temp1Vector3.clone(); + + temp1Vector3.subVectors(vel, vel2); + var temp2 = temp1Vector3.clone(); + + var normal_offset = normal_offsets[data.id + '-' + data2.id]; + + if (normal_offset > 0) { + temp1Vector3.set(-info[normal_offset], -info[normal_offset + 1], -info[normal_offset + 2]); + } else { + normal_offset *= -1; + + temp1Vector3.set(info[normal_offset], info[normal_offset + 1], info[normal_offset + 2]); + } + + component.emit('collision', _object2, temp1, temp2, temp1Vector3); + } + } + } + } else data.touches.length = 0; // not touching other objects + } + + this.collisions = collisions; + + if (this.SUPPORT_TRANSFERABLE) this.send(info.buffer, [info.buffer]); // Give the typed array back to the worker + } + }, { + key: 'addConstraint', + value: function addConstraint(constraint, show_marker) { + constraint.id = this.getObjectId(); + this.constraints[constraint.id] = constraint; + constraint.worldModule = this; + this.execute('addConstraint', constraint.getDefinition()); + + if (show_marker) { + var marker = void 0; + + switch (constraint.type) { + case 'point': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + + case 'hinge': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + + case 'slider': + marker = new three.Mesh(new three.BoxGeometry(10, 1, 1), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + + // This rotation isn't right if all three axis are non-0 values + // TODO: change marker's rotation order to ZYX + marker.rotation.set(constraint.axis.y, // yes, y and + constraint.axis.x, // x axis are swapped + constraint.axis.z); + this.objects[constraint.objecta].add(marker); + break; + + case 'conetwist': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + + case 'dof': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + default: + } + } + + return constraint; + } + }, { + key: 'onSimulationResume', + value: function onSimulationResume() { + this.execute('onSimulationResume', {}); + } + }, { + key: 'removeConstraint', + value: function removeConstraint(constraint) { + if (this.constraints[constraint.id] !== undefined) { + this.execute('removeConstraint', { id: constraint.id }); + delete this.constraints[constraint.id]; + } + } + }, { + key: 'execute', + value: function execute(cmd, params) { + this.send({ cmd: cmd, params: params }); + } + }, { + key: 'onAddCallback', + value: function onAddCallback(component) { + var object = component.native; + var data = object.component.use('physics').data; + + if (data) { + component.manager.set('module:world', this); + data.id = this.getObjectId(); + object.component.use('physics').data = data; + + if (object instanceof Vehicle) { + this.onAddCallback(object.mesh); + this.vehicles[data.id] = object; + this.execute('addVehicle', data); + } else { + component.__dirtyPosition = false; + component.__dirtyRotation = false; + this.objects[data.id] = object; + + if (object.children.length) { + data.children = []; + addObjectChildren(object, object); + } + + // object.quaternion.setFromEuler(object.rotation); + // + // console.log(object.component); + // console.log(object.rotation); + + // Object starting position + rotation + data.position = { + x: object.position.x, + y: object.position.y, + z: object.position.z + }; + + data.rotation = { + x: object.quaternion.x, + y: object.quaternion.y, + z: object.quaternion.z, + w: object.quaternion.w + }; + + if (data.width) data.width *= object.scale.x; + if (data.height) data.height *= object.scale.y; + if (data.depth) data.depth *= object.scale.z; + + this.execute('addObject', data); + } + + component.emit('physics:added'); + } + } + }, { + key: 'onRemoveCallback', + value: function onRemoveCallback(component) { + var object = component.native; + + if (object instanceof Vehicle) { + this.execute('removeVehicle', { id: object._physijs.id }); + while (object.wheels.length) { + this.remove(object.wheels.pop()); + }this.remove(object.mesh); + this.vehicles[object._physijs.id] = null; + } else { + // Mesh.prototype.remove.call(this, object); + + if (object._physijs) { + component.manager.remove('module:world'); + this.objects[object._physijs.id] = null; + this.execute('removeObject', { id: object._physijs.id }); + } + } + } + }, { + key: 'defer', + value: function defer(func, args) { + var _this3 = this; + + return new Promise(function (resolve) { + if (_this3.isLoaded) { + func.apply(undefined, toConsumableArray(args)); + resolve(); + } else _this3.loader.then(function () { + func.apply(undefined, toConsumableArray(args)); + resolve(); + }); + }); + } + }, { + key: 'manager', + value: function manager(_manager) { + _manager.define('physics'); + _manager.set('physicsWorker', this.worker); + } + }, { + key: 'integrate', + value: function integrate(self) { + var _this4 = this; + + // ... + + this.setFixedTimeStep = function (fixedTimeStep) { + if (fixedTimeStep) self.execute('setFixedTimeStep', fixedTimeStep); + }; + + this.setGravity = function (gravity) { + if (gravity) self.execute('setGravity', gravity); + }; + + this.addConstraint = self.addConstraint.bind(self); + + this.simulate = function (timeStep, maxSubSteps) { + if (self._stats) self._stats.begin(); + + if (self.isSimulating) return false; + self.isSimulating = true; + + for (var object_id in self.objects) { + if (!self.objects.hasOwnProperty(object_id)) continue; + + var object = self.objects[object_id]; + var component = object.component; + var data = component.use('physics').data; + + if (object !== null && (component.__dirtyPosition || component.__dirtyRotation)) { + var update = { id: data.id }; + + if (component.__dirtyPosition) { + update.pos = { + x: object.position.x, + y: object.position.y, + z: object.position.z + }; + + if (data.isSoftbody) object.position.set(0, 0, 0); + + component.__dirtyPosition = false; + } + + if (component.__dirtyRotation) { + update.quat = { + x: object.quaternion.x, + y: object.quaternion.y, + z: object.quaternion.z, + w: object.quaternion.w + }; + + if (data.isSoftbody) object.rotation.set(0, 0, 0); + + component.__dirtyRotation = false; + } + + self.execute('updateTransform', update); + } + } + + self.execute('simulate', { timeStep: timeStep, maxSubSteps: maxSubSteps }); + + if (self._stats) self._stats.end(); + return true; + }; + + // const simulateProcess = (t) => { + // window.requestAnimationFrame(simulateProcess); + + // this.simulate(1/60, 1); // delta, 1 + // } + + // simulateProcess(); + + self.loader.then(function () { + self.simulateLoop = new whs.Loop(function (clock) { + _this4.simulate(clock.getDelta(), 1); // delta, 1 + }); + + self.simulateLoop.start(_this4); + + console.log(self.options.gravity); + _this4.setGravity(self.options.gravity); + }); + } + }]); + return WorldModuleBase; + }(Eventable), _class.defaults = { + fixedTimeStep: 1 / 60, + rateLimit: true, + ammo: "", + softbody: false, + gravity: new three.Vector3(0, -100, 0) + }, _temp2); + + var TARGET = typeof Symbol === 'undefined' ? '__target' : Symbol(), + SCRIPT_TYPE = 'application/javascript', + BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, + URL = window.URL || window.webkitURL, + Worker = window.Worker; + + /** + * Returns a wrapper around Web Worker code that is constructible. + * + * @function shimWorker + * + * @param { String } filename The name of the file + * @param { Function } fn Function wrapping the code of the worker + */ + function shimWorker(filename, fn) { + return function ShimWorker(forceFallback) { + var o = this; + + if (!fn) { + return new Worker(filename); + } else if (Worker && !forceFallback) { + // Convert the function's inner code to a string to construct the worker + var source = fn.toString().replace(/^function.+?{/, '').slice(0, -1), + objURL = createSourceObject(source); + + this[TARGET] = new Worker(objURL); + URL.revokeObjectURL(objURL); + return this[TARGET]; + } else { + var selfShim = { + postMessage: function postMessage(m) { + if (o.onmessage) { + setTimeout(function () { + o.onmessage({ data: m, target: selfShim }); + }); + } + } + }; + + fn.call(selfShim); + this.postMessage = function (m) { + setTimeout(function () { + selfShim.onmessage({ data: m, target: o }); + }); + }; + this.isThisThread = true; + } + }; + } + // Test Worker capabilities + if (Worker) { + var testWorker, + objURL = createSourceObject('self.onmessage = function () {}'), + testArray = new Uint8Array(1); + + try { + // No workers via blobs in Edge 12 and IE 11 and lower :( + if (/(?:Trident|Edge)\/(?:[567]|12)/i.test(navigator.userAgent)) { + throw new Error('Not available'); + } + testWorker = new Worker(objURL); + + // Native browser on some Samsung devices throws for transferables, let's detect it + testWorker.postMessage(testArray, [testArray.buffer]); + } catch (e) { + Worker = null; + } finally { + URL.revokeObjectURL(objURL); + if (testWorker) { + testWorker.terminate(); + } + } + } + + function createSourceObject(str) { + try { + return URL.createObjectURL(new Blob([str], { type: SCRIPT_TYPE })); + } catch (e) { + var blob = new BlobBuilder(); + blob.append(str); + return URL.createObjectURL(blob.getBlob(type)); + } + } + + var PhysicsWorker = new shimWorker("../worker.js", function (window, document) { + var self = this; + function Events(target) { + var events = {}, + empty = []; + target = target || this; + /** + * On: listen to events + */ + target.on = function (type, func, ctx) { + (events[type] = events[type] || []).push([func, ctx]); + return target; + }; + /** + * Off: stop listening to event / specific callback + */ + target.off = function (type, func) { + type || (events = {}); + var list = events[type] || empty, + i = list.length = func ? list.length : 0; + while (i--) { + func == list[i][0] && list.splice(i, 1); + }return target; + }; + /** + * Emit: send event, callbacks will be triggered + */ + target.emit = function (type) { + var e = events[type] || empty, + list = e.length > 0 ? e.slice(0, e.length) : e, + i = 0, + j; + while (j = list[i++]) { + j[0].apply(j[1], empty.slice.call(arguments, 1)); + }return target; + }; + } + var insideWorker = !self.document; + if (!insideWorker) self = new Events(); + + var send = insideWorker ? self.webkitPostMessage || self.postMessage : function (data) { + self.emit('message', { data: data }); + }; + + self.send = send; + + var SUPPORT_TRANSFERABLE = void 0; + + if (insideWorker) { + var ab = new ArrayBuffer(1); + + send(ab, [ab]); + SUPPORT_TRANSFERABLE = ab.byteLength === 0; + } + + var MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3, + SOFTREPORT: 4 + }; + + // temp variables + var _object = void 0, + _vector = void 0, + _transform = void 0, + _transform_pos = void 0, + _softbody_enabled = false, + _num_objects = 0, + _num_rigidbody_objects = 0, + _num_softbody_objects = 0, + _num_wheels = 0, + _num_constraints = 0, + _softbody_report_size = 0, + + + // world variables + fixedTimeStep = void 0, + world = void 0, + _vec3_1 = void 0, + _vec3_2 = void 0, + _vec3_3 = void 0, + _quat = void 0; + + // private cache + var public_functions = {}, + _objects = [], + _vehicles = [], + _constraints = [], + _objects_ammo = {}, + _object_shapes = {}, + + + // The following objects are to track objects that ammo.js doesn't clean + // up. All are cleaned up when they're corresponding body is destroyed. + // Unfortunately, it's very difficult to get at these objects from the + // body, so we have to track them ourselves. + _motion_states = {}, + + // Don't need to worry about it for cached shapes. + _noncached_shapes = {}, + + // A body with a compound shape always has a regular shape as well, so we + // have track them separately. + _compound_shapes = {}; + + // object reporting + var REPORT_CHUNKSIZE = void 0, + // report array is increased in increments of this chunk size + worldreport = void 0, + softreport = void 0, + collisionreport = void 0, + vehiclereport = void 0, + constraintreport = void 0; + + var WORLDREPORT_ITEMSIZE = 14, + // how many float values each reported item needs + COLLISIONREPORT_ITEMSIZE = 5, + // one float for each object id, and a Vec3 contact normal + VEHICLEREPORT_ITEMSIZE = 9, + // vehicle id, wheel index, 3 for position, 4 for rotation + CONSTRAINTREPORT_ITEMSIZE = 6; // constraint id, offset object, offset, applied impulse + + var getShapeFromCache = function getShapeFromCache(cache_key) { + if (_object_shapes[cache_key] !== undefined) return _object_shapes[cache_key]; + + return null; + }; + + var setShapeCache = function setShapeCache(cache_key, shape) { + _object_shapes[cache_key] = shape; + }; + + var createShape = function createShape(description) { + var shape = void 0; + + _transform.setIdentity(); + switch (description.type) { + case 'compound': + { + shape = new Ammo.btCompoundShape(); + + break; + } + case 'plane': + { + var cache_key = 'plane_' + description.normal.x + '_' + description.normal.y + '_' + description.normal.z; + + if ((shape = getShapeFromCache(cache_key)) === null) { + _vec3_1.setX(description.normal.x); + _vec3_1.setY(description.normal.y); + _vec3_1.setZ(description.normal.z); + shape = new Ammo.btStaticPlaneShape(_vec3_1, 0); + setShapeCache(cache_key, shape); + } + + break; + } + case 'box': + { + var _cache_key = 'box_' + description.width + '_' + description.height + '_' + description.depth; + + if ((shape = getShapeFromCache(_cache_key)) === null) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btBoxShape(_vec3_1); + setShapeCache(_cache_key, shape); + } + + break; + } + case 'sphere': + { + var _cache_key2 = 'sphere_' + description.radius; + + if ((shape = getShapeFromCache(_cache_key2)) === null) { + shape = new Ammo.btSphereShape(description.radius); + setShapeCache(_cache_key2, shape); + } + + break; + } + case 'cylinder': + { + var _cache_key3 = 'cylinder_' + description.width + '_' + description.height + '_' + description.depth; + + if ((shape = getShapeFromCache(_cache_key3)) === null) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btCylinderShape(_vec3_1); + setShapeCache(_cache_key3, shape); + } + + break; + } + case 'capsule': + { + var _cache_key4 = 'capsule_' + description.radius + '_' + description.height; + + if ((shape = getShapeFromCache(_cache_key4)) === null) { + // In Bullet, capsule height excludes the end spheres + shape = new Ammo.btCapsuleShape(description.radius, description.height - 2 * description.radius); + setShapeCache(_cache_key4, shape); + } + + break; + } + case 'cone': + { + var _cache_key5 = 'cone_' + description.radius + '_' + description.height; + + if ((shape = getShapeFromCache(_cache_key5)) === null) { + shape = new Ammo.btConeShape(description.radius, description.height); + setShapeCache(_cache_key5, shape); + } + + break; + } + case 'concave': + { + var triangle_mesh = new Ammo.btTriangleMesh(); + if (!description.data.length) return false; + var data = description.data; + + for (var i = 0; i < data.length / 9; i++) { + _vec3_1.setX(data[i * 9]); + _vec3_1.setY(data[i * 9 + 1]); + _vec3_1.setZ(data[i * 9 + 2]); + + _vec3_2.setX(data[i * 9 + 3]); + _vec3_2.setY(data[i * 9 + 4]); + _vec3_2.setZ(data[i * 9 + 5]); + + _vec3_3.setX(data[i * 9 + 6]); + _vec3_3.setY(data[i * 9 + 7]); + _vec3_3.setZ(data[i * 9 + 8]); + + triangle_mesh.addTriangle(_vec3_1, _vec3_2, _vec3_3, false); + } + + shape = new Ammo.btBvhTriangleMeshShape(triangle_mesh, true, true); + + _noncached_shapes[description.id] = shape; + + break; + } + case 'convex': + { + shape = new Ammo.btConvexHullShape(); + var _data = description.data; + + for (var _i = 0; _i < _data.length / 3; _i++) { + _vec3_1.setX(_data[_i * 3]); + _vec3_1.setY(_data[_i * 3 + 1]); + _vec3_1.setZ(_data[_i * 3 + 2]); + + shape.addPoint(_vec3_1); + } + + _noncached_shapes[description.id] = shape; + + break; + } + case 'heightfield': + { + var xpts = description.xpts, + ypts = description.ypts, + points = description.points, + ptr = Ammo._malloc(4 * xpts * ypts); + + for (var _i2 = 0, p = 0, p2 = 0; _i2 < xpts; _i2++) { + for (var j = 0; j < ypts; j++) { + Ammo.HEAPF32[ptr + p2 >> 2] = points[p]; + + p++; + p2 += 4; + } + } + + shape = new Ammo.btHeightfieldTerrainShape(description.xpts, description.ypts, ptr, 1, -description.absMaxHeight, description.absMaxHeight, 1, 'PHY_FLOAT', false); + + _noncached_shapes[description.id] = shape; + break; + } + default: + // Not recognized + return; + } + + return shape; + }; + + var createSoftBody = function createSoftBody(description) { + var body = void 0; + + var softBodyHelpers = new Ammo.btSoftBodyHelpers(); + + switch (description.type) { + case 'softTrimesh': + { + if (!description.aVertices.length) return false; + + body = softBodyHelpers.CreateFromTriMesh(world.getWorldInfo(), description.aVertices, description.aIndices, description.aIndices.length / 3, false); + + break; + } + case 'softClothMesh': + { + var cr = description.corners; + + body = softBodyHelpers.CreatePatch(world.getWorldInfo(), new Ammo.btVector3(cr[0], cr[1], cr[2]), new Ammo.btVector3(cr[3], cr[4], cr[5]), new Ammo.btVector3(cr[6], cr[7], cr[8]), new Ammo.btVector3(cr[9], cr[10], cr[11]), description.segments[0], description.segments[1], 0, true); + + break; + } + case 'softRopeMesh': + { + var data = description.data; + + body = softBodyHelpers.CreateRope(world.getWorldInfo(), new Ammo.btVector3(data[0], data[1], data[2]), new Ammo.btVector3(data[3], data[4], data[5]), data[6] - 1, 0); + + break; + } + default: + // Not recognized + return; + } + + return body; + }; + + public_functions.init = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (params.noWorker) { + window.Ammo = new params.ammo(); + public_functions.makeWorld(params); + return; + } + + if (params.wasmBuffer) { + importScripts(params.ammo); + + self.Ammo = new loadAmmoFromBinary(params.wasmBuffer)(); + send({ cmd: 'ammoLoaded' }); + public_functions.makeWorld(params); + } else { + importScripts(params.ammo); + send({ cmd: 'ammoLoaded' }); + + self.Ammo = new Ammo(); + public_functions.makeWorld(params); + } + }; + + public_functions.makeWorld = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _transform = new Ammo.btTransform(); + _transform_pos = new Ammo.btTransform(); + _vec3_1 = new Ammo.btVector3(0, 0, 0); + _vec3_2 = new Ammo.btVector3(0, 0, 0); + _vec3_3 = new Ammo.btVector3(0, 0, 0); + _quat = new Ammo.btQuaternion(0, 0, 0, 0); + + REPORT_CHUNKSIZE = params.reportsize || 50; + + if (SUPPORT_TRANSFERABLE) { + // Transferable messages are supported, take advantage of them with TypedArrays + worldreport = new Float32Array(2 + REPORT_CHUNKSIZE * WORLDREPORT_ITEMSIZE); // message id + # of objects to report + chunk size * # of values per object + collisionreport = new Float32Array(2 + REPORT_CHUNKSIZE * COLLISIONREPORT_ITEMSIZE); // message id + # of collisions to report + chunk size * # of values per object + vehiclereport = new Float32Array(2 + REPORT_CHUNKSIZE * VEHICLEREPORT_ITEMSIZE); // message id + # of vehicles to report + chunk size * # of values per object + constraintreport = new Float32Array(2 + REPORT_CHUNKSIZE * CONSTRAINTREPORT_ITEMSIZE); // message id + # of constraints to report + chunk size * # of values per object + } else { + // Transferable messages are not supported, send data as normal arrays + worldreport = []; + collisionreport = []; + vehiclereport = []; + constraintreport = []; + } + + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + + var collisionConfiguration = params.softbody ? new Ammo.btSoftBodyRigidBodyCollisionConfiguration() : new Ammo.btDefaultCollisionConfiguration(), + dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration), + solver = new Ammo.btSequentialImpulseConstraintSolver(); + + var broadphase = void 0; + + if (!params.broadphase) params.broadphase = { type: 'dynamic' }; + // TODO!!! + /* if (params.broadphase.type === 'sweepprune') { + extend(params.broadphase, { + aabbmin: { + x: -50, + y: -50, + z: -50 + }, + aabbmax: { + x: 50, + y: 50, + z: 50 + }, + }); + }*/ + + switch (params.broadphase.type) { + case 'sweepprune': + _vec3_1.setX(params.broadphase.aabbmin.x); + _vec3_1.setY(params.broadphase.aabbmin.y); + _vec3_1.setZ(params.broadphase.aabbmin.z); + + _vec3_2.setX(params.broadphase.aabbmax.x); + _vec3_2.setY(params.broadphase.aabbmax.y); + _vec3_2.setZ(params.broadphase.aabbmax.z); + + broadphase = new Ammo.btAxisSweep3(_vec3_1, _vec3_2); + + break; + case 'dynamic': + default: + broadphase = new Ammo.btDbvtBroadphase(); + break; + } + + world = params.softbody ? new Ammo.btSoftRigidDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration, new Ammo.btDefaultSoftBodySolver()) : new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); + fixedTimeStep = params.fixedTimeStep; + + if (params.softbody) _softbody_enabled = true; + + send({ cmd: 'worldReady' }); + }; + + public_functions.setFixedTimeStep = function (description) { + fixedTimeStep = description; + }; + + public_functions.setGravity = function (description) { + _vec3_1.setX(description.x); + _vec3_1.setY(description.y); + _vec3_1.setZ(description.z); + world.setGravity(_vec3_1); + }; + + public_functions.appendAnchor = function (description) { + _objects[description.obj].appendAnchor(description.node, _objects[description.obj2], description.collisionBetweenLinkedBodies, description.influence); + }; + + public_functions.linkNodes = function (description) { + var self_body = _objects[description.self]; + var other_body = _objects[description.body]; + + var self_node = self_body.get_m_nodes().at(description.n1); + var other_node = other_body.get_m_nodes().at(description.n2); + + var self_vec = self_node.get_m_x(); + var other_vec = other_node.get_m_x(); + + var force_x = other_vec.x() - self_vec.x(); + var force_y = other_vec.y() - self_vec.y(); + var force_z = other_vec.z() - self_vec.z(); + + // var modifier = 30; + + var cached_distance = void 0, + linked = false; + + var _loop = setInterval(function () { + force_x = other_vec.x() - self_vec.x(); + force_y = other_vec.y() - self_vec.y(); + force_z = other_vec.z() - self_vec.z(); + + var distance = Math.sqrt(force_x * force_x + force_y * force_y + force_z * force_z); + + if (cached_distance && !linked && cached_distance < distance) { + // cached_distance && !linked && cached_distance < distance + + linked = true; + + // let self_vel = self_node.get_m_v(); + // + // _vec3_1.setX(-self_vel.x()); + // _vec3_1.setY(-self_vel.y()); + // _vec3_1.setZ(-self_vel.z()); + // + // let other_vel = other_node.get_m_v(); + // + // _vec3_2.setX(-other_vel.x()); + // _vec3_2.setY(-other_vel.y()); + // _vec3_2.setZ(-other_vel.z()); + + console.log('link!'); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + self_body.setVelocity(_vec3_1); + + other_body.setVelocity(_vec3_1); + + // self_body.addVelocity(_vec3_1); + // other_body.addVelocity(_vec3_2); + + // self_relative_x = self_node.x(); + // self_relative_y = self_node.y(); + // self_relative_z = self_node.z(); + // + // other_relative_x = other_node.x(); + // other_relative_y = other_node.y(); + // other_relative_z = other_node.z(); + + // self_relative = new Ammo.btVector3(); + // self_relative.setX(); + + // console.log('link!'); + // self_body.appendAnchor(description.n1, connector, true, 0.5); + // other_body.appendAnchor(description.n2, connector, true, 0.5); + // clearInterval(_loop); + + // _vec3_1.setX(0); + // _vec3_1.setY(0); + // _vec3_1.setZ(0); + + // self_body.setVelocity(_vec3_1); + // other_body.setVelocity(_vec3_1); + + // other_body.addForce( + // _vec3_2, + // description.n2 + // ); + + // description.modifier *= 1.6; + } + + var modifer2 = linked ? 40 : 1; + + force_x *= Math.max(distance, 1) * description.modifier * modifer2; + force_y *= Math.max(distance, 1) * description.modifier * modifer2; + force_z *= Math.max(distance, 1) * description.modifier * modifer2; + + _vec3_1.setX(force_x); + _vec3_1.setY(force_y); + _vec3_1.setZ(force_z); + + _vec3_2.setX(-force_x); + _vec3_2.setY(-force_y); + _vec3_2.setZ(-force_z); + + self_body.addVelocity(_vec3_1, description.n1); + + other_body.addVelocity(_vec3_2, description.n2); + + // } else { + // // self_relative_x = null; + // } + + + // if (self_relative_x) { + // _vec3_1.setX(self_relative_x - self_node.x()); + // _vec3_1.setY(self_relative_y - self_node.y()); + // _vec3_1.setZ(self_relative_z - self_node.z()); + // + // _vec3_2.setX(other_relative_x - other_node.x()); + // _vec3_2.setY(other_relative_y - other_node.y()); + // _vec3_2.setZ(other_relative_z - other_node.z()); + // } else { + + // } + + + cached_distance = distance; + }, 10); + }; + + public_functions.appendLink = function (description) { + // console.log(Ammo); + // console.log(new Ammo.Material()); + + // var _mat = new Ammo.Material(); + // + // _mat.set_m_kAST(0); + // _mat.set_m_kLST(0); + // _mat.set_m_kVST(0); + // + // _objects[description.self].appendLink( + // description.n1, + // description.n2, + // _mat, + // false + // ); + + _vec3_1.setX(1000); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + _objects[description.self].addForce(_vec3_1, description.n1); + }; + + public_functions.appendLinearJoint = function (description) { + // console.log('Ammo', Ammo); + var specs = new Ammo.Specs(); + var _pos = description.specs.position; + + specs.set_position(new Ammo.btVector3(_pos[0], _pos[1], _pos[2])); + if (description.specs.erp) specs.set_erp(description.specs.erp); + if (description.specs.cfm) specs.set_cfm(description.specs.cfm); + if (description.specs.split) specs.set_split(description.specs.split); + + // console.log(specs); + // + // // ljoint.set_m_rpos( + // // new Ammo.btVector3(_pos1[0], _pos1[1], _pos1[2]), + // // new Ammo.btVector3(_pos2[0], _pos2[1], _pos2[2]) + // // ); + // + // // console.log('ljoint', ljoint); + // + + // console.log('body', _objects[description.body]); + _objects[description.self].appendLinearJoint(specs, _objects[description.body]); + }; + + public_functions.addObject = function (description) { + var body = void 0, + motionState = void 0; + + if (description.type.indexOf('soft') !== -1) { + body = createSoftBody(description); + + var sbConfig = body.get_m_cfg(); + + if (description.viterations) sbConfig.set_viterations(description.viterations); + if (description.piterations) sbConfig.set_piterations(description.piterations); + if (description.diterations) sbConfig.set_diterations(description.diterations); + if (description.citerations) sbConfig.set_citerations(description.citerations); + sbConfig.set_collisions(0x11); + sbConfig.set_kDF(description.friction); + sbConfig.set_kDP(description.damping); + if (description.pressure) sbConfig.set_kPR(description.pressure); + if (description.drag) sbConfig.set_kDG(description.drag); + if (description.lift) sbConfig.set_kLF(description.lift); + if (description.anchorHardness) sbConfig.set_kAHR(description.anchorHardness); + if (description.rigidHardness) sbConfig.set_kCHR(description.rigidHardness); + + if (description.klst) body.get_m_materials().at(0).set_m_kLST(description.klst); + if (description.kast) body.get_m_materials().at(0).set_m_kAST(description.kast); + if (description.kvst) body.get_m_materials().at(0).set_m_kVST(description.kvst); + + Ammo.castObject(body, Ammo.btCollisionObject).getCollisionShape().setMargin(typeof description.margin !== 'undefined' ? description.margin : 0.1); + + // Ammo.castObject(body, Ammo.btCollisionObject).getCollisionShape().setMargin(0); + + // Ammo.castObject(body, Ammo.btCollisionObject).getCollisionShape().setLocalScaling(_vec3_1); + body.setActivationState(description.state || 4); + body.type = 0; // SoftBody. + if (description.type === 'softRopeMesh') body.rope = true; + if (description.type === 'softClothMesh') body.cloth = true; + + _transform.setIdentity(); + + // @test + _quat.setX(description.rotation.x); + _quat.setY(description.rotation.y); + _quat.setZ(description.rotation.z); + _quat.setW(description.rotation.w); + body.rotate(_quat); + + _vec3_1.setX(description.position.x); + _vec3_1.setY(description.position.y); + _vec3_1.setZ(description.position.z); + body.translate(_vec3_1); + + _vec3_1.setX(description.scale.x); + _vec3_1.setY(description.scale.y); + _vec3_1.setZ(description.scale.z); + body.scale(_vec3_1); + + body.setTotalMass(description.mass, false); + world.addSoftBody(body, 1, -1); + if (description.type === 'softTrimesh') _softbody_report_size += body.get_m_faces().size() * 3;else if (description.type === 'softRopeMesh') _softbody_report_size += body.get_m_nodes().size();else _softbody_report_size += body.get_m_nodes().size() * 3; + + _num_softbody_objects++; + } else { + var shape = createShape(description); + + if (!shape) return; + + // If there are children then this is a compound shape + if (description.children) { + var compound_shape = new Ammo.btCompoundShape(); + compound_shape.addChildShape(_transform, shape); + + for (var i = 0; i < description.children.length; i++) { + var _child = description.children[i]; + + var trans = new Ammo.btTransform(); + trans.setIdentity(); + + _vec3_1.setX(_child.position_offset.x); + _vec3_1.setY(_child.position_offset.y); + _vec3_1.setZ(_child.position_offset.z); + trans.setOrigin(_vec3_1); + + _quat.setX(_child.rotation.x); + _quat.setY(_child.rotation.y); + _quat.setZ(_child.rotation.z); + _quat.setW(_child.rotation.w); + trans.setRotation(_quat); + + shape = createShape(description.children[i]); + compound_shape.addChildShape(trans, shape); + Ammo.destroy(trans); + } + + shape = compound_shape; + _compound_shapes[description.id] = shape; + } + + _vec3_1.setX(description.scale.x); + _vec3_1.setY(description.scale.y); + _vec3_1.setZ(description.scale.z); + + shape.setLocalScaling(_vec3_1); + shape.setMargin(typeof description.margin !== 'undefined' ? description.margin : 0); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + shape.calculateLocalInertia(description.mass, _vec3_1); + + _transform.setIdentity(); + + _vec3_2.setX(description.position.x); + _vec3_2.setY(description.position.y); + _vec3_2.setZ(description.position.z); + _transform.setOrigin(_vec3_2); + + _quat.setX(description.rotation.x); + _quat.setY(description.rotation.y); + _quat.setZ(description.rotation.z); + _quat.setW(description.rotation.w); + _transform.setRotation(_quat); + + motionState = new Ammo.btDefaultMotionState(_transform); // #TODO: btDefaultMotionState supports center of mass offset as second argument - implement + var rbInfo = new Ammo.btRigidBodyConstructionInfo(description.mass, motionState, shape, _vec3_1); + + rbInfo.set_m_friction(description.friction); + rbInfo.set_m_restitution(description.restitution); + rbInfo.set_m_linearDamping(description.damping); + rbInfo.set_m_angularDamping(description.damping); + + body = new Ammo.btRigidBody(rbInfo); + body.setActivationState(description.state || 4); + Ammo.destroy(rbInfo); + + if (typeof description.collision_flags !== 'undefined') body.setCollisionFlags(description.collision_flags); + + if (description.group && description.mask) world.addRigidBody(body, description.group, description.mask);else world.addRigidBody(body); + body.type = 1; // RigidBody. + _num_rigidbody_objects++; + } + + body.activate(); + + body.id = description.id; + _objects[body.id] = body; + _motion_states[body.id] = motionState; + + _objects_ammo[body.a === undefined ? body.ptr : body.a] = body.id; + _num_objects++; + + send({ cmd: 'objectReady', params: body.id }); + }; + + public_functions.addVehicle = function (description) { + var vehicle_tuning = new Ammo.btVehicleTuning(); + + vehicle_tuning.set_m_suspensionStiffness(description.suspension_stiffness); + vehicle_tuning.set_m_suspensionCompression(description.suspension_compression); + vehicle_tuning.set_m_suspensionDamping(description.suspension_damping); + vehicle_tuning.set_m_maxSuspensionTravelCm(description.max_suspension_travel); + vehicle_tuning.set_m_maxSuspensionForce(description.max_suspension_force); + + var vehicle = new Ammo.btRaycastVehicle(vehicle_tuning, _objects[description.rigidBody], new Ammo.btDefaultVehicleRaycaster(world)); + + vehicle.tuning = vehicle_tuning; + _objects[description.rigidBody].setActivationState(4); + vehicle.setCoordinateSystem(0, 1, 2); + + world.addVehicle(vehicle); + _vehicles[description.id] = vehicle; + }; + public_functions.removeVehicle = function (description) { + _vehicles[description.id] = null; + }; + + public_functions.addWheel = function (description) { + if (_vehicles[description.id] !== undefined) { + var tuning = _vehicles[description.id].tuning; + if (description.tuning !== undefined) { + tuning = new Ammo.btVehicleTuning(); + tuning.set_m_suspensionStiffness(description.tuning.suspension_stiffness); + tuning.set_m_suspensionCompression(description.tuning.suspension_compression); + tuning.set_m_suspensionDamping(description.tuning.suspension_damping); + tuning.set_m_maxSuspensionTravelCm(description.tuning.max_suspension_travel); + tuning.set_m_maxSuspensionForce(description.tuning.max_suspension_force); + } + + _vec3_1.setX(description.connection_point.x); + _vec3_1.setY(description.connection_point.y); + _vec3_1.setZ(description.connection_point.z); + + _vec3_2.setX(description.wheel_direction.x); + _vec3_2.setY(description.wheel_direction.y); + _vec3_2.setZ(description.wheel_direction.z); + + _vec3_3.setX(description.wheel_axle.x); + _vec3_3.setY(description.wheel_axle.y); + _vec3_3.setZ(description.wheel_axle.z); + + _vehicles[description.id].addWheel(_vec3_1, _vec3_2, _vec3_3, description.suspension_rest_length, description.wheel_radius, tuning, description.is_front_wheel); + } + + _num_wheels++; + + if (SUPPORT_TRANSFERABLE) { + vehiclereport = new Float32Array(1 + _num_wheels * VEHICLEREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } else vehiclereport = [MESSAGE_TYPES.VEHICLEREPORT]; + }; + + public_functions.setSteering = function (details) { + if (_vehicles[details.id] !== undefined) _vehicles[details.id].setSteeringValue(details.steering, details.wheel); + }; + + public_functions.setBrake = function (details) { + if (_vehicles[details.id] !== undefined) _vehicles[details.id].setBrake(details.brake, details.wheel); + }; + + public_functions.applyEngineForce = function (details) { + if (_vehicles[details.id] !== undefined) _vehicles[details.id].applyEngineForce(details.force, details.wheel); + }; + + public_functions.removeObject = function (details) { + if (_objects[details.id].type === 0) { + _num_softbody_objects--; + _softbody_report_size -= _objects[details.id].get_m_nodes().size(); + world.removeSoftBody(_objects[details.id]); + } else if (_objects[details.id].type === 1) { + _num_rigidbody_objects--; + world.removeRigidBody(_objects[details.id]); + Ammo.destroy(_motion_states[details.id]); + } + + Ammo.destroy(_objects[details.id]); + if (_compound_shapes[details.id]) Ammo.destroy(_compound_shapes[details.id]); + if (_noncached_shapes[details.id]) Ammo.destroy(_noncached_shapes[details.id]); + + _objects_ammo[_objects[details.id].a === undefined ? _objects[details.id].a : _objects[details.id].ptr] = null; + _objects[details.id] = null; + _motion_states[details.id] = null; + + if (_compound_shapes[details.id]) _compound_shapes[details.id] = null; + if (_noncached_shapes[details.id]) _noncached_shapes[details.id] = null; + _num_objects--; + }; + + public_functions.updateTransform = function (details) { + _object = _objects[details.id]; + + if (_object.type === 1) { + _object.getMotionState().getWorldTransform(_transform); + + if (details.pos) { + _vec3_1.setX(details.pos.x); + _vec3_1.setY(details.pos.y); + _vec3_1.setZ(details.pos.z); + _transform.setOrigin(_vec3_1); + } + + if (details.quat) { + _quat.setX(details.quat.x); + _quat.setY(details.quat.y); + _quat.setZ(details.quat.z); + _quat.setW(details.quat.w); + _transform.setRotation(_quat); + } + + _object.setWorldTransform(_transform); + _object.activate(); + } else if (_object.type === 0) { + // _object.getWorldTransform(_transform); + + if (details.pos) { + _vec3_1.setX(details.pos.x); + _vec3_1.setY(details.pos.y); + _vec3_1.setZ(details.pos.z); + _transform.setOrigin(_vec3_1); + } + + if (details.quat) { + _quat.setX(details.quat.x); + _quat.setY(details.quat.y); + _quat.setZ(details.quat.z); + _quat.setW(details.quat.w); + _transform.setRotation(_quat); + } + + _object.transform(_transform); + } + }; + + public_functions.updateMass = function (details) { + // #TODO: changing a static object into dynamic is buggy + _object = _objects[details.id]; + + // Per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=9&t=3663#p13816 + world.removeRigidBody(_object); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + _object.setMassProps(details.mass, _vec3_1); + world.addRigidBody(_object); + _object.activate(); + }; + + public_functions.applyCentralImpulse = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralImpulse(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.applyImpulse = function (details) { + _vec3_1.setX(details.impulse_x); + _vec3_1.setY(details.impulse_y); + _vec3_1.setZ(details.impulse_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyImpulse(_vec3_1, _vec3_2); + _objects[details.id].activate(); + }; + + public_functions.applyTorque = function (details) { + _vec3_1.setX(details.torque_x); + _vec3_1.setY(details.torque_y); + _vec3_1.setZ(details.torque_z); + + _objects[details.id].applyTorque(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.applyCentralForce = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralForce(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.applyForce = function (details) { + _vec3_1.setX(details.force_x); + _vec3_1.setY(details.force_y); + _vec3_1.setZ(details.force_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyForce(_vec3_1, _vec3_2); + _objects[details.id].activate(); + }; + + public_functions.onSimulationResume = function () { + }; + + public_functions.setAngularVelocity = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularVelocity(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.setLinearVelocity = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearVelocity(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.setAngularFactor = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularFactor(_vec3_1); + }; + + public_functions.setLinearFactor = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearFactor(_vec3_1); + }; + + public_functions.setDamping = function (details) { + _objects[details.id].setDamping(details.linear, details.angular); + }; + + public_functions.setCcdMotionThreshold = function (details) { + _objects[details.id].setCcdMotionThreshold(details.threshold); + }; + + public_functions.setCcdSweptSphereRadius = function (details) { + _objects[details.id].setCcdSweptSphereRadius(details.radius); + }; + + public_functions.addConstraint = function (details) { + var constraint = void 0; + + switch (details.type) { + + case 'point': + { + if (details.objectb === undefined) { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + constraint = new Ammo.btPoint2PointConstraint(_objects[details.objecta], _vec3_1); + } else { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + constraint = new Ammo.btPoint2PointConstraint(_objects[details.objecta], _objects[details.objectb], _vec3_1, _vec3_2); + } + break; + } + case 'hinge': + { + if (details.objectb === undefined) { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.axis.x); + _vec3_2.setY(details.axis.y); + _vec3_2.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint(_objects[details.objecta], _vec3_1, _vec3_2); + } else { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _vec3_3.setX(details.axis.x); + _vec3_3.setY(details.axis.y); + _vec3_3.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint(_objects[details.objecta], _objects[details.objectb], _vec3_1, _vec3_2, _vec3_3, _vec3_3); + } + break; + } + case 'slider': + { + var transformb = void 0; + var transforma = new Ammo.btTransform(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + transforma.setOrigin(_vec3_1); + + var rotation = transforma.getRotation(); + rotation.setEuler(details.axis.x, details.axis.y, details.axis.z); + transforma.setRotation(rotation); + + if (details.objectb) { + transformb = new Ammo.btTransform(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transformb.setOrigin(_vec3_2); + + rotation = transformb.getRotation(); + rotation.setEuler(details.axis.x, details.axis.y, details.axis.z); + transformb.setRotation(rotation); + + constraint = new Ammo.btSliderConstraint(_objects[details.objecta], _objects[details.objectb], transforma, transformb, true); + } else { + constraint = new Ammo.btSliderConstraint(_objects[details.objecta], transforma, true); + } + + constraint.ta = transforma; + constraint.tb = transformb; + + Ammo.destroy(transforma); + if (transformb !== undefined) Ammo.destroy(transformb); + + break; + } + case 'conetwist': + { + var _transforma = new Ammo.btTransform(); + _transforma.setIdentity(); + + var _transformb = new Ammo.btTransform(); + _transformb.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _transforma.setOrigin(_vec3_1); + _transformb.setOrigin(_vec3_2); + + var _rotation = _transforma.getRotation(); + _rotation.setEulerZYX(-details.axisa.z, -details.axisa.y, -details.axisa.x); + _transforma.setRotation(_rotation); + + _rotation = _transformb.getRotation(); + _rotation.setEulerZYX(-details.axisb.z, -details.axisb.y, -details.axisb.x); + _transformb.setRotation(_rotation); + + constraint = new Ammo.btConeTwistConstraint(_objects[details.objecta], _objects[details.objectb], _transforma, _transformb); + + constraint.setLimit(Math.PI, 0, Math.PI); + + constraint.ta = _transforma; + constraint.tb = _transformb; + + Ammo.destroy(_transforma); + Ammo.destroy(_transformb); + + break; + } + case 'dof': + { + var _transformb2 = void 0; + + var _transforma2 = new Ammo.btTransform(); + _transforma2.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _transforma2.setOrigin(_vec3_1); + + var _rotation2 = _transforma2.getRotation(); + _rotation2.setEulerZYX(-details.axisa.z, -details.axisa.y, -details.axisa.x); + _transforma2.setRotation(_rotation2); + + if (details.objectb) { + _transformb2 = new Ammo.btTransform(); + _transformb2.setIdentity(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _transformb2.setOrigin(_vec3_2); + + _rotation2 = _transformb2.getRotation(); + _rotation2.setEulerZYX(-details.axisb.z, -details.axisb.y, -details.axisb.x); + _transformb2.setRotation(_rotation2); + + constraint = new Ammo.btGeneric6DofConstraint(_objects[details.objecta], _objects[details.objectb], _transforma2, _transformb2, true); + } else { + constraint = new Ammo.btGeneric6DofConstraint(_objects[details.objecta], _transforma2, true); + } + + constraint.ta = _transforma2; + constraint.tb = _transformb2; + + Ammo.destroy(_transforma2); + if (_transformb2 !== undefined) Ammo.destroy(_transformb2); + + break; + } + default: + return; + } + + world.addConstraint(constraint); + + constraint.a = _objects[details.objecta]; + constraint.b = _objects[details.objectb]; + + constraint.enableFeedback(); + _constraints[details.id] = constraint; + _num_constraints++; + + if (SUPPORT_TRANSFERABLE) { + constraintreport = new Float32Array(1 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } else constraintreport = [MESSAGE_TYPES.CONSTRAINTREPORT]; + }; + + public_functions.removeConstraint = function (details) { + var constraint = _constraints[details.id]; + + if (constraint !== undefined) { + world.removeConstraint(constraint); + _constraints[details.id] = null; + _num_constraints--; + } + }; + + public_functions.constraint_setBreakingImpulseThreshold = function (details) { + var constraint = _constraints[details.id]; + if (constraint !== undefined) constraint.setBreakingImpulseThreshold(details.threshold); + }; + + public_functions.simulate = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (world) { + if (params.timeStep && params.timeStep < fixedTimeStep) params.timeStep = fixedTimeStep; + + params.maxSubSteps = params.maxSubSteps || Math.ceil(params.timeStep / fixedTimeStep); // If maxSubSteps is not defined, keep the simulation fully up to date + + world.stepSimulation(params.timeStep, params.maxSubSteps, fixedTimeStep); + + if (_vehicles.length > 0) reportVehicles(); + reportCollisions(); + if (_constraints.length > 0) reportConstraints(); + reportWorld(); + if (_softbody_enabled) reportWorld_softbodies(); + } + }; + + // Constraint functions + public_functions.hinge_setLimits = function (params) { + _constraints[params.constraint].setLimit(params.low, params.high, 0, params.bias_factor, params.relaxation_factor); + }; + + public_functions.hinge_enableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.enableAngularMotor(true, params.velocity, params.acceleration); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.hinge_disableMotor = function (params) { + _constraints[params.constraint].enableMotor(false); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_setLimits = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setLowerLinLimit(params.lin_lower || 0); + constraint.setUpperLinLimit(params.lin_upper || 0); + + constraint.setLowerAngLimit(params.ang_lower || 0); + constraint.setUpperAngLimit(params.ang_upper || 0); + }; + + public_functions.slider_setRestitution = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setSoftnessLimLin(params.linear || 0); + constraint.setSoftnessLimAng(params.angular || 0); + }; + + public_functions.slider_enableLinearMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setTargetLinMotorVelocity(params.velocity); + constraint.setMaxLinMotorForce(params.acceleration); + constraint.setPoweredLinMotor(true); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_disableLinearMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setPoweredLinMotor(false); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_enableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setTargetAngMotorVelocity(params.velocity); + constraint.setMaxAngMotorForce(params.acceleration); + constraint.setPoweredAngMotor(true); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_disableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setPoweredAngMotor(false); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.conetwist_setLimit = function (params) { + _constraints[params.constraint].setLimit(params.z, params.y, params.x); // ZYX order + }; + + public_functions.conetwist_enableMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.enableMotor(true); + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.conetwist_setMaxMotorImpulse = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setMaxMotorImpulse(params.max_impulse); + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.conetwist_setMotorTarget = function (params) { + var constraint = _constraints[params.constraint]; + + _quat.setX(params.x); + _quat.setY(params.y); + _quat.setZ(params.z); + _quat.setW(params.w); + + constraint.setMotorTarget(_quat); + + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.conetwist_disableMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.enableMotor(false); + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.dof_setLinearLowerLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearLowerLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_setLinearUpperLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearUpperLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_setAngularLowerLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularLowerLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_setAngularUpperLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularUpperLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_enableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + + var motor = constraint.getRotationalLimitMotor(params.which); + motor.set_m_enableMotor(true); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_configureAngularMotor = function (params) { + var constraint = _constraints[params.constraint], + motor = constraint.getRotationalLimitMotor(params.which); + + motor.set_m_loLimit(params.low_angle); + motor.set_m_hiLimit(params.high_angle); + motor.set_m_targetVelocity(params.velocity); + motor.set_m_maxMotorForce(params.max_force); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_disableAngularMotor = function (params) { + var constraint = _constraints[params.constraint], + motor = constraint.getRotationalLimitMotor(params.which); + + motor.set_m_enableMotor(false); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + var reportWorld = function reportWorld() { + if (SUPPORT_TRANSFERABLE && worldreport.length < 2 + _num_rigidbody_objects * WORLDREPORT_ITEMSIZE) { + worldreport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_rigidbody_objects / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * WORLDREPORT_ITEMSIZE // # of values needed * item size + ); + + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + } + + worldreport[1] = _num_rigidbody_objects; // record how many objects we're reporting on + + { + var i = 0, + index = _objects.length; + + while (index--) { + var object = _objects[index]; + + if (object && object.type === 1) { + // RigidBodies. + // #TODO: we can't use center of mass transform when center of mass can change, + // but getMotionState().getWorldTransform() screws up on objects that have been moved + // object.getMotionState().getWorldTransform( transform ); + // object.getMotionState().getWorldTransform(_transform); + + var transform = object.getCenterOfMassTransform(); + var origin = transform.getOrigin(); + var rotation = transform.getRotation(); + + // add values to report + var offset = 2 + i++ * WORLDREPORT_ITEMSIZE; + + worldreport[offset] = object.id; + + worldreport[offset + 1] = origin.x(); + worldreport[offset + 2] = origin.y(); + worldreport[offset + 3] = origin.z(); + + worldreport[offset + 4] = rotation.x(); + worldreport[offset + 5] = rotation.y(); + worldreport[offset + 6] = rotation.z(); + worldreport[offset + 7] = rotation.w(); + + _vector = object.getLinearVelocity(); + worldreport[offset + 8] = _vector.x(); + worldreport[offset + 9] = _vector.y(); + worldreport[offset + 10] = _vector.z(); + + _vector = object.getAngularVelocity(); + worldreport[offset + 11] = _vector.x(); + worldreport[offset + 12] = _vector.y(); + worldreport[offset + 13] = _vector.z(); + } + } + } + + if (SUPPORT_TRANSFERABLE) send(worldreport.buffer, [worldreport.buffer]);else send(worldreport); + }; + + var reportWorld_softbodies = function reportWorld_softbodies() { + // TODO: Add SUPPORTTRANSFERABLE. + + softreport = new Float32Array(2 // message id & # objects in report + + _num_softbody_objects * 2 + _softbody_report_size * 6); + + softreport[0] = MESSAGE_TYPES.SOFTREPORT; + softreport[1] = _num_softbody_objects; // record how many objects we're reporting on + + { + var offset = 2, + index = _objects.length; + + while (index--) { + var object = _objects[index]; + + if (object && object.type === 0) { + // SoftBodies. + + softreport[offset] = object.id; + + var offsetVert = offset + 2; + + if (object.rope === true) { + var nodes = object.get_m_nodes(); + var size = nodes.size(); + softreport[offset + 1] = size; + + for (var i = 0; i < size; i++) { + var node = nodes.at(i); + var vert = node.get_m_x(); + var off = offsetVert + i * 3; + + softreport[off] = vert.x(); + softreport[off + 1] = vert.y(); + softreport[off + 2] = vert.z(); + } + + offset += size * 3 + 2; + } else if (object.cloth) { + var _nodes = object.get_m_nodes(); + var _size = _nodes.size(); + softreport[offset + 1] = _size; + + for (var _i3 = 0; _i3 < _size; _i3++) { + var _node = _nodes.at(_i3); + var _vert = _node.get_m_x(); + var normal = _node.get_m_n(); + var _off = offsetVert + _i3 * 6; + + softreport[_off] = _vert.x(); + softreport[_off + 1] = _vert.y(); + softreport[_off + 2] = _vert.z(); + + softreport[_off + 3] = -normal.x(); + softreport[_off + 4] = -normal.y(); + softreport[_off + 5] = -normal.z(); + } + + offset += _size * 6 + 2; + } else { + var faces = object.get_m_faces(); + var _size2 = faces.size(); + softreport[offset + 1] = _size2; + + for (var _i4 = 0; _i4 < _size2; _i4++) { + var face = faces.at(_i4); + + var node1 = face.get_m_n(0); + var node2 = face.get_m_n(1); + var node3 = face.get_m_n(2); + + var vert1 = node1.get_m_x(); + var vert2 = node2.get_m_x(); + var vert3 = node3.get_m_x(); + + var normal1 = node1.get_m_n(); + var normal2 = node2.get_m_n(); + var normal3 = node3.get_m_n(); + + var _off2 = offsetVert + _i4 * 18; + + softreport[_off2] = vert1.x(); + softreport[_off2 + 1] = vert1.y(); + softreport[_off2 + 2] = vert1.z(); + + softreport[_off2 + 3] = normal1.x(); + softreport[_off2 + 4] = normal1.y(); + softreport[_off2 + 5] = normal1.z(); + + softreport[_off2 + 6] = vert2.x(); + softreport[_off2 + 7] = vert2.y(); + softreport[_off2 + 8] = vert2.z(); + + softreport[_off2 + 9] = normal2.x(); + softreport[_off2 + 10] = normal2.y(); + softreport[_off2 + 11] = normal2.z(); + + softreport[_off2 + 12] = vert3.x(); + softreport[_off2 + 13] = vert3.y(); + softreport[_off2 + 14] = vert3.z(); + + softreport[_off2 + 15] = normal3.x(); + softreport[_off2 + 16] = normal3.y(); + softreport[_off2 + 17] = normal3.z(); + } + + offset += _size2 * 18 + 2; + } + } + } + } + + // if (SUPPORT_TRANSFERABLE) send(softreport.buffer, [softreport.buffer]); + // else send(softreport); + send(softreport); + }; + + var reportCollisions = function reportCollisions() { + var dp = world.getDispatcher(), + num = dp.getNumManifolds(); + // _collided = false; + + if (SUPPORT_TRANSFERABLE) { + if (collisionreport.length < 2 + num * COLLISIONREPORT_ITEMSIZE) { + collisionreport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_objects / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * COLLISIONREPORT_ITEMSIZE // # of values needed * item size + ); + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + } + } + + collisionreport[1] = 0; // how many collisions we're reporting on + + for (var i = 0; i < num; i++) { + var manifold = dp.getManifoldByIndexInternal(i), + num_contacts = manifold.getNumContacts(); + + if (num_contacts === 0) continue; + + for (var j = 0; j < num_contacts; j++) { + var pt = manifold.getContactPoint(j); + + // if ( pt.getDistance() < 0 ) { + var offset = 2 + collisionreport[1]++ * COLLISIONREPORT_ITEMSIZE; + collisionreport[offset] = _objects_ammo[manifold.getBody0().ptr]; + collisionreport[offset + 1] = _objects_ammo[manifold.getBody1().ptr]; + + _vector = pt.get_m_normalWorldOnB(); + collisionreport[offset + 2] = _vector.x(); + collisionreport[offset + 3] = _vector.y(); + collisionreport[offset + 4] = _vector.z(); + break; + // } + // send(_objects_ammo); + } + } + + if (SUPPORT_TRANSFERABLE) send(collisionreport.buffer, [collisionreport.buffer]);else send(collisionreport); + }; + + var reportVehicles = function reportVehicles() { + if (SUPPORT_TRANSFERABLE) { + if (vehiclereport.length < 2 + _num_wheels * VEHICLEREPORT_ITEMSIZE) { + vehiclereport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_wheels / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * VEHICLEREPORT_ITEMSIZE // # of values needed * item size + ); + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } + } + + { + var i = 0, + j = 0, + index = _vehicles.length; + + while (index--) { + if (_vehicles[index]) { + var vehicle = _vehicles[index]; + + for (j = 0; j < vehicle.getNumWheels(); j++) { + // vehicle.updateWheelTransform( j, true ); + // transform = vehicle.getWheelTransformWS( j ); + var transform = vehicle.getWheelInfo(j).get_m_worldTransform(); + + var origin = transform.getOrigin(); + var rotation = transform.getRotation(); + + // add values to report + var offset = 1 + i++ * VEHICLEREPORT_ITEMSIZE; + + vehiclereport[offset] = index; + vehiclereport[offset + 1] = j; + + vehiclereport[offset + 2] = origin.x(); + vehiclereport[offset + 3] = origin.y(); + vehiclereport[offset + 4] = origin.z(); + + vehiclereport[offset + 5] = rotation.x(); + vehiclereport[offset + 6] = rotation.y(); + vehiclereport[offset + 7] = rotation.z(); + vehiclereport[offset + 8] = rotation.w(); + } + } + } + + if (SUPPORT_TRANSFERABLE && j !== 0) send(vehiclereport.buffer, [vehiclereport.buffer]);else if (j !== 0) send(vehiclereport); + } + }; + + var reportConstraints = function reportConstraints() { + if (SUPPORT_TRANSFERABLE) { + if (constraintreport.length < 2 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE) { + constraintreport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_constraints / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * CONSTRAINTREPORT_ITEMSIZE // # of values needed * item size + ); + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } + } + + { + var offset = 0, + i = 0, + index = _constraints.lenght; + + while (index--) { + if (_constraints[index]) { + var _constraint = _constraints[index]; + var offset_body = _constraint.a; + var transform = _constraint.ta; + var origin = transform.getOrigin(); + + // add values to report + offset = 1 + i++ * CONSTRAINTREPORT_ITEMSIZE; + + constraintreport[offset] = index; + constraintreport[offset + 1] = offset_body.id; + constraintreport[offset + 2] = origin.x; + constraintreport[offset + 3] = origin.y; + constraintreport[offset + 4] = origin.z; + constraintreport[offset + 5] = _constraint.getBreakingImpulseThreshold(); + } + } + + if (SUPPORT_TRANSFERABLE && i !== 0) send(constraintreport.buffer, [constraintreport.buffer]);else if (i !== 0) send(constraintreport); + } + }; + + self.onmessage = function (event) { + if (event.data instanceof Float32Array) { + // transferable object + switch (event.data[0]) { + case MESSAGE_TYPES.WORLDREPORT: + { + worldreport = new Float32Array(event.data); + break; + } + case MESSAGE_TYPES.COLLISIONREPORT: + { + collisionreport = new Float32Array(event.data); + break; + } + case MESSAGE_TYPES.VEHICLEREPORT: + { + vehiclereport = new Float32Array(event.data); + break; + } + case MESSAGE_TYPES.CONSTRAINTREPORT: + { + constraintreport = new Float32Array(event.data); + break; + } + default: + } + + return; + } else if (event.data.cmd && public_functions[event.data.cmd]) public_functions[event.data.cmd](event.data.params); + }; + + self.receive = self.onmessage; + }); + + var WorldModule = function (_WorldModuleBase) { + inherits(WorldModule, _WorldModuleBase); + + function WorldModule() { + var _ref; + + classCallCheck(this, WorldModule); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var _this = possibleConstructorReturn(this, (_ref = WorldModule.__proto__ || Object.getPrototypeOf(WorldModule)).call.apply(_ref, [this].concat(args))); + + _this.worker = new PhysicsWorker(); + _this.worker.transferableMessage = _this.worker.webkitPostMessage || _this.worker.postMessage; + + _this.isLoaded = false; + + var options = _this.options; + + _this.loader = new Promise(function (resolve, reject) { + // if (options.wasm) { + // fetch(options.wasm) + // .then(response => response.arrayBuffer()) + // .then(buffer => { + // options.wasmBuffer = buffer; + // + // this.execute('init', options); + // resolve(); + // }); + // } else { + _this.execute('init', options); + resolve(); + // } + }); + + _this.loader.then(function () { + _this.isLoaded = true; + }); + + // Test SUPPORT_TRANSFERABLE + + var ab = new ArrayBuffer(1); + _this.worker.transferableMessage(ab, [ab]); + _this.SUPPORT_TRANSFERABLE = ab.byteLength === 0; + + _this.setup(); + return _this; + } + + createClass(WorldModule, [{ + key: 'send', + value: function send() { + var _worker; + + (_worker = this.worker).transferableMessage.apply(_worker, arguments); + } + }, { + key: 'receive', + value: function receive(callback) { + this.worker.addEventListener('message', callback); + } + }]); + return WorldModule; + }(WorldModuleBase); + + var _class$1, _temp; + + var properties = { + position: { + get: function get$$1() { + return this._native.position; + }, + set: function set$$1(vector3) { + var pos = this._native.position; + var scope = this; + + Object.defineProperties(pos, { + x: { + get: function get$$1() { + return this._x; + }, + set: function set$$1(x) { + scope.__dirtyPosition = true; + this._x = x; + } + }, + y: { + get: function get$$1() { + return this._y; + }, + set: function set$$1(y) { + scope.__dirtyPosition = true; + this._y = y; + } + }, + z: { + get: function get$$1() { + return this._z; + }, + set: function set$$1(z) { + scope.__dirtyPosition = true; + this._z = z; + } + } + }); + + scope.__dirtyPosition = true; + + pos.copy(vector3); + } + }, + + quaternion: { + get: function get$$1() { + this.__c_rot = true; + return this.native.quaternion; + }, + set: function set$$1(quaternion) { + var _this = this; + + var quat = this._native.quaternion, + native = this._native; + + quat.copy(quaternion); + + quat.onChange(function () { + if (_this.__c_rot) { + if (native.__dirtyRotation === true) { + _this.__c_rot = false; + native.__dirtyRotation = false; + } + native.__dirtyRotation = true; + } + }); + } + }, + + rotation: { + get: function get$$1() { + this.__c_rot = true; + return this._native.rotation; + }, + set: function set$$1(euler) { + var _this2 = this; + + var rot = this._native.rotation, + native = this._native; + + this.quaternion.copy(new three.Quaternion().setFromEuler(euler)); + + rot.onChange(function () { + if (_this2.__c_rot) { + _this2.quaternion.copy(new three.Quaternion().setFromEuler(rot)); + native.__dirtyRotation = true; + } + }); + } + } + }; + + function wrapPhysicsPrototype(scope) { + for (var key in properties) { + Object.defineProperty(scope, key, { + get: properties[key].get.bind(scope), + set: properties[key].set.bind(scope), + configurable: true, + enumerable: true + }); + } + } + + function onCopy(source) { + wrapPhysicsPrototype(this); + + var physics = this.use('physics'); + var sourcePhysics = source.use('physics'); + + this.manager.modules.physics = physics.clone(this.manager); + + physics.data = _extends({}, sourcePhysics.data); + physics.data.isSoftBodyReset = false; + if (physics.data.isSoftbody) physics.data.isSoftBodyReset = false; + + this.position = this.position.clone(); + this.rotation = this.rotation.clone(); + this.quaternion = this.quaternion.clone(); + + return source; + } + + function onWrap() { + this.position = this.position.clone(); + this.rotation = this.rotation.clone(); + this.quaternion = this.quaternion.clone(); + } + + var API = function () { + function API() { + classCallCheck(this, API); + } + + createClass(API, [{ + key: 'applyCentralImpulse', + value: function applyCentralImpulse(force) { + this.execute('applyCentralImpulse', { id: this.data.id, x: force.x, y: force.y, z: force.z }); + } + }, { + key: 'applyImpulse', + value: function applyImpulse(force, offset) { + this.execute('applyImpulse', { + id: this.data.id, + impulse_x: force.x, + impulse_y: force.y, + impulse_z: force.z, + x: offset.x, + y: offset.y, + z: offset.z + }); + } + }, { + key: 'applyTorque', + value: function applyTorque(force) { + this.execute('applyTorque', { + id: this.data.id, + torque_x: force.x, + torque_y: force.y, + torque_z: force.z + }); + } + }, { + key: 'applyCentralForce', + value: function applyCentralForce(force) { + this.execute('applyCentralForce', { + id: this.data.id, + x: force.x, + y: force.y, + z: force.z + }); + } + }, { + key: 'applyForce', + value: function applyForce(force, offset) { + this.execute('applyForce', { + id: this.data.id, + force_x: force.x, + force_y: force.y, + force_z: force.z, + x: offset.x, + y: offset.y, + z: offset.z + }); + } + }, { + key: 'getAngularVelocity', + value: function getAngularVelocity() { + return this.data.angularVelocity; + } + }, { + key: 'setAngularVelocity', + value: function setAngularVelocity(velocity) { + this.execute('setAngularVelocity', { id: this.data.id, x: velocity.x, y: velocity.y, z: velocity.z }); + } + }, { + key: 'getLinearVelocity', + value: function getLinearVelocity() { + return this.data.linearVelocity; + } + }, { + key: 'setLinearVelocity', + value: function setLinearVelocity(velocity) { + this.execute('setLinearVelocity', { id: this.data.id, x: velocity.x, y: velocity.y, z: velocity.z }); + } + }, { + key: 'setAngularFactor', + value: function setAngularFactor(factor) { + this.execute('setAngularFactor', { id: this.data.id, x: factor.x, y: factor.y, z: factor.z }); + } + }, { + key: 'setLinearFactor', + value: function setLinearFactor(factor) { + this.execute('setLinearFactor', { id: this.data.id, x: factor.x, y: factor.y, z: factor.z }); + } + }, { + key: 'setDamping', + value: function setDamping(linear, angular) { + this.execute('setDamping', { id: this.data.id, linear: linear, angular: angular }); + } + }, { + key: 'setCcdMotionThreshold', + value: function setCcdMotionThreshold(threshold) { + this.execute('setCcdMotionThreshold', { id: this.data.id, threshold: threshold }); + } + }, { + key: 'setCcdSweptSphereRadius', + value: function setCcdSweptSphereRadius(radius) { + this.execute('setCcdSweptSphereRadius', { id: this.data.id, radius: radius }); + } + }]); + return API; + }(); + + var _default = (_temp = _class$1 = function (_API) { + inherits(_default, _API); + + function _default(defaults$$1, data) { + classCallCheck(this, _default); + + var _this3 = possibleConstructorReturn(this, (_default.__proto__ || Object.getPrototypeOf(_default)).call(this)); + + _this3.bridge = { + onCopy: onCopy, + onWrap: onWrap + }; + + _this3.data = Object.assign(defaults$$1, data); + return _this3; + } + + createClass(_default, [{ + key: 'integrate', + value: function integrate(self) { + wrapPhysicsPrototype(this); + } + }, { + key: 'manager', + value: function manager(_manager) { + _manager.define('physics'); + + this.execute = function () { + var _manager$get; + + return _manager.has('module:world') ? (_manager$get = _manager.get('module:world')).execute.apply(_manager$get, arguments) : function () {}; + }; + } + }, { + key: 'updateData', + value: function updateData(callback) { + this.bridge.geometry = function (geometry, module) { + if (!callback) return geometry; + + var result = callback(geometry, module); + return result ? result : geometry; + }; + } + }, { + key: 'clone', + value: function clone(manager) { + var clone = new this.constructor(); + clone.data = _extends({}, this.data); + clone.bridge.geometry = this.bridge.geometry; + this.manager.apply(clone, [manager]); + + return clone; + } + }]); + return _default; + }(API), _class$1.rigidbody = function () { + return { + touches: [], + linearVelocity: new three.Vector3(), + angularVelocity: new three.Vector3(), + mass: 10, + scale: new three.Vector3(1, 1, 1), + restitution: 0.3, + friction: 0.8, + damping: 0, + margin: 0 + }; + }, _class$1.softbody = function () { + return { + touches: [], + restitution: 0.3, + friction: 0.8, + damping: 0, + scale: new three.Vector3(1, 1, 1), + pressure: 100, + margin: 0, + klst: 0.9, + kvst: 0.9, + kast: 0.9, + piterations: 1, + viterations: 0, + diterations: 0, + citerations: 4, + anchorHardness: 0.7, + rigidHardness: 1, + isSoftbody: true, + isSoftBodyReset: false + }; + }, _class$1.rope = function () { + return { + touches: [], + friction: 0.8, + scale: new three.Vector3(1, 1, 1), + damping: 0, + margin: 0, + klst: 0.9, + kvst: 0.9, + kast: 0.9, + piterations: 1, + viterations: 0, + diterations: 0, + citerations: 4, + anchorHardness: 0.7, + rigidHardness: 1, + isSoftbody: true + }; + }, _class$1.cloth = function () { + return { + touches: [], + friction: 0.8, + damping: 0, + margin: 0, + scale: new three.Vector3(1, 1, 1), + klst: 0.9, + kvst: 0.9, + kast: 0.9, + piterations: 1, + viterations: 0, + diterations: 0, + citerations: 4, + anchorHardness: 0.7, + rigidHardness: 1 + }; + }, _temp); + + var BoxModule = function (_PhysicsModule) { + inherits(BoxModule, _PhysicsModule); + + function BoxModule(params) { + classCallCheck(this, BoxModule); + + var _this = possibleConstructorReturn(this, (BoxModule.__proto__ || Object.getPrototypeOf(BoxModule)).call(this, _extends({ + type: 'box' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.depth = data.depth || geometry.boundingBox.max.z - geometry.boundingBox.min.z; + }); + return _this; + } + + return BoxModule; + }(_default); + + var CompoundModule = function (_PhysicsModule) { + inherits(CompoundModule, _PhysicsModule); + + function CompoundModule(params) { + classCallCheck(this, CompoundModule); + return possibleConstructorReturn(this, (CompoundModule.__proto__ || Object.getPrototypeOf(CompoundModule)).call(this, _extends({ + type: 'compound' + }, _default.rigidbody()), params)); + } + + return CompoundModule; + }(_default); + + // TODO: Test CapsuleModule in action. + var CapsuleModule = function (_PhysicsModule) { + inherits(CapsuleModule, _PhysicsModule); + + function CapsuleModule(params) { + classCallCheck(this, CapsuleModule); + + var _this = possibleConstructorReturn(this, (CapsuleModule.__proto__ || Object.getPrototypeOf(CapsuleModule)).call(this, _extends({ + type: 'capsule' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.depth = data.depth || geometry.boundingBox.max.z - geometry.boundingBox.min.z; + }); + return _this; + } + + return CapsuleModule; + }(_default); + + var ConcaveModule = function (_PhysicsModule) { + inherits(ConcaveModule, _PhysicsModule); + + function ConcaveModule(params) { + classCallCheck(this, ConcaveModule); + + var _this = possibleConstructorReturn(this, (ConcaveModule.__proto__ || Object.getPrototypeOf(ConcaveModule)).call(this, _extends({ + type: 'concave' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + data.data = _this.geometryProcessor(geometry); + }); + return _this; + } + + createClass(ConcaveModule, [{ + key: 'geometryProcessor', + value: function geometryProcessor(geometry) { + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + var data = geometry.isBufferGeometry ? geometry.attributes.position.array : new Float32Array(geometry.faces.length * 9); + + if (!geometry.isBufferGeometry) { + var vertices = geometry.vertices; + + for (var i = 0; i < geometry.faces.length; i++) { + var face = geometry.faces[i]; + + var vA = vertices[face.a]; + var vB = vertices[face.b]; + var vC = vertices[face.c]; + + var i9 = i * 9; + + data[i9] = vA.x; + data[i9 + 1] = vA.y; + data[i9 + 2] = vA.z; + + data[i9 + 3] = vB.x; + data[i9 + 4] = vB.y; + data[i9 + 5] = vB.z; + + data[i9 + 6] = vC.x; + data[i9 + 7] = vC.y; + data[i9 + 8] = vC.z; + } + } + + return data; + } + }]); + return ConcaveModule; + }(_default); + + var ConeModule = function (_PhysicsModule) { + inherits(ConeModule, _PhysicsModule); + + function ConeModule(params) { + classCallCheck(this, ConeModule); + + var _this = possibleConstructorReturn(this, (ConeModule.__proto__ || Object.getPrototypeOf(ConeModule)).call(this, _extends({ + type: 'cone' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.radius = data.radius || (geometry.boundingBox.max.x - geometry.boundingBox.min.x) / 2; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + }); + return _this; + } + + return ConeModule; + }(_default); + + var ConvexModule = function (_PhysicsModule) { + inherits(ConvexModule, _PhysicsModule); + + function ConvexModule(params) { + classCallCheck(this, ConvexModule); + + var _this = possibleConstructorReturn(this, (ConvexModule.__proto__ || Object.getPrototypeOf(ConvexModule)).call(this, _extends({ + type: 'convex' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + if (!geometry.isBufferGeometry) geometry._bufferGeometry = new three.BufferGeometry().fromGeometry(geometry); + + data.data = geometry.isBufferGeometry ? geometry.attributes.position.array : geometry._bufferGeometry.attributes.position.array; + }); + return _this; + } + + return ConvexModule; + }(_default); + + var CylinderModule = function (_PhysicsModule) { + inherits(CylinderModule, _PhysicsModule); + + function CylinderModule(params) { + classCallCheck(this, CylinderModule); + + var _this = possibleConstructorReturn(this, (CylinderModule.__proto__ || Object.getPrototypeOf(CylinderModule)).call(this, _extends({ + type: 'cylinder' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.depth = data.depth || geometry.boundingBox.max.z - geometry.boundingBox.min.z; + }); + return _this; + } + + return CylinderModule; + }(_default); + + var HeightfieldModule = function (_PhysicsModule) { + inherits(HeightfieldModule, _PhysicsModule); + + function HeightfieldModule(params) { + classCallCheck(this, HeightfieldModule); + + var _this = possibleConstructorReturn(this, (HeightfieldModule.__proto__ || Object.getPrototypeOf(HeightfieldModule)).call(this, _extends({ + type: 'heightfield', + size: new three.Vector2(1, 1), + autoAlign: false + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + var _data$size = data.size, + xdiv = _data$size.x, + ydiv = _data$size.y; + + var verts = geometry.isBufferGeometry ? geometry.attributes.position.array : geometry.vertices; + var size = geometry.isBufferGeometry ? verts.length / 3 : verts.length; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + var xsize = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + var ysize = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + data.xpts = typeof xdiv === 'undefined' ? Math.sqrt(size) : xdiv + 1; + data.ypts = typeof ydiv === 'undefined' ? Math.sqrt(size) : ydiv + 1; + + // note - this assumes our plane geometry is square, unless we pass in specific xdiv and ydiv + data.absMaxHeight = Math.max(geometry.boundingBox.max.y, Math.abs(geometry.boundingBox.min.y)); + + var points = new Float32Array(size), + xpts = data.xpts, + ypts = data.ypts; + + while (size--) { + var vNum = size % xpts + (ypts - Math.round(size / xpts - size % xpts / xpts) - 1) * ypts; + + if (geometry.isBufferGeometry) points[size] = verts[vNum * 3 + 1];else points[size] = verts[vNum].y; + } + + data.points = points; + + data.scale.multiply(new three.Vector3(xsize / (xpts - 1), 1, ysize / (ypts - 1))); + + if (data.autoAlign) geometry.translate(xsize / -2, 0, ysize / -2); + }); + return _this; + } + + return HeightfieldModule; + }(_default); + + var PlaneModule = function (_PhysicsModule) { + inherits(PlaneModule, _PhysicsModule); + + function PlaneModule(params) { + classCallCheck(this, PlaneModule); + + var _this = possibleConstructorReturn(this, (PlaneModule.__proto__ || Object.getPrototypeOf(PlaneModule)).call(this, _extends({ + type: 'plane' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.normal = data.normal || geometry.faces[0].normal.clone(); + }); + return _this; + } + + return PlaneModule; + }(_default); + + var SphereModule = function (_PhysicsModule) { + inherits(SphereModule, _PhysicsModule); + + function SphereModule(params) { + classCallCheck(this, SphereModule); + + var _this = possibleConstructorReturn(this, (SphereModule.__proto__ || Object.getPrototypeOf(SphereModule)).call(this, _extends({ + type: 'sphere' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingSphere) geometry.computeBoundingSphere(); + data.radius = data.radius || geometry.boundingSphere.radius; + }); + return _this; + } + + return SphereModule; + }(_default); + + var SoftbodyModule = function (_PhysicsModule) { + inherits(SoftbodyModule, _PhysicsModule); + + function SoftbodyModule(params) { + classCallCheck(this, SoftbodyModule); + + var _this = possibleConstructorReturn(this, (SoftbodyModule.__proto__ || Object.getPrototypeOf(SoftbodyModule)).call(this, _extends({ + type: 'softTrimesh' + }, _default.softbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + var idxGeometry = geometry.isBufferGeometry ? geometry : function () { + geometry.mergeVertices(); + + var bufferGeometry = new three.BufferGeometry(); + + bufferGeometry.addAttribute('position', new three.BufferAttribute(new Float32Array(geometry.vertices.length * 3), 3).copyVector3sArray(geometry.vertices)); + + bufferGeometry.setIndex(new three.BufferAttribute(new (geometry.faces.length * 3 > 65535 ? Uint32Array : Uint16Array)(geometry.faces.length * 3), 1).copyIndicesArray(geometry.faces)); + + return bufferGeometry; + }(); + + data.aVertices = idxGeometry.attributes.position.array; + data.aIndices = idxGeometry.index.array; + + return new three.BufferGeometry().fromGeometry(geometry); + }); + return _this; + } + + createClass(SoftbodyModule, [{ + key: 'appendAnchor', + value: function appendAnchor(object, node) { + var influence = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + var collisionBetweenLinkedBodies = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + + var o1 = this.data.id; + var o2 = object.use('physics').data.id; + + this.execute('appendAnchor', { + obj: o1, + obj2: o2, + node: node, + influence: influence, + collisionBetweenLinkedBodies: collisionBetweenLinkedBodies + }); + } + }]); + return SoftbodyModule; + }(_default); + + function arrayMax(array) { + if (array.length === 0) return -Infinity; + + var max = array[0]; + + for (var i = 1, l = array.length; i < l; ++i) { + if (array[i] > max) max = array[i]; + } + + return max; + } + + var ClothModule = function (_PhysicsModule) { + inherits(ClothModule, _PhysicsModule); + + function ClothModule(params) { + classCallCheck(this, ClothModule); + + var _this = possibleConstructorReturn(this, (ClothModule.__proto__ || Object.getPrototypeOf(ClothModule)).call(this, _extends({ + type: 'softClothMesh' + }, _default.cloth()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + var geomParams = geometry.parameters; + + var geom = geometry.isBufferGeometry ? geometry : function () { + geometry.mergeVertices(); + + var bufferGeometry = new three.BufferGeometry(); + + bufferGeometry.addAttribute('position', new three.BufferAttribute(new Float32Array(geometry.vertices.length * 3), 3).copyVector3sArray(geometry.vertices)); + + var faces = geometry.faces, + facesLength = faces.length, + uvs = geometry.faceVertexUvs[0]; + + var normalsArray = new Float32Array(facesLength * 3); + // const uvsArray = new Array(geometry.vertices.length * 2); + var uvsArray = new Float32Array(facesLength * 2); + var faceArray = new Uint32Array(facesLength * 3); + + for (var i = 0; i < facesLength; i++) { + var i3 = i * 3; + var normal = faces[i].normal || new Vector3(); + + faceArray[i3] = faces[i].a; + faceArray[i3 + 1] = faces[i].b; + faceArray[i3 + 2] = faces[i].c; + + normalsArray[i3] = normal.x; + normalsArray[i3 + 1] = normal.y; + normalsArray[i3 + 2] = normal.z; + + uvsArray[faces[i].a * 2 + 0] = uvs[i][0].x; // a + uvsArray[faces[i].a * 2 + 1] = uvs[i][0].y; + + uvsArray[faces[i].b * 2 + 0] = uvs[i][1].x; // b + uvsArray[faces[i].b * 2 + 1] = uvs[i][1].y; + + uvsArray[faces[i].c * 2 + 0] = uvs[i][2].x; // c + uvsArray[faces[i].c * 2 + 1] = uvs[i][2].y; + } + + bufferGeometry.addAttribute('normal', new three.BufferAttribute(normalsArray, 3)); + + bufferGeometry.addAttribute('uv', new three.BufferAttribute(uvsArray, 2)); + + bufferGeometry.setIndex(new three.BufferAttribute(new (arrayMax(faces) * 3 > 65535 ? Uint32Array : Uint16Array)(facesLength * 3), 1).copyIndicesArray(faces)); + + return bufferGeometry; + }(); + + var verts = geom.attributes.position.array; + + if (!geomParams.widthSegments) geomParams.widthSegments = 1; + if (!geomParams.heightSegments) geomParams.heightSegments = 1; + + var idx00 = 0; + var idx01 = geomParams.widthSegments; + var idx10 = (geomParams.heightSegments + 1) * (geomParams.widthSegments + 1) - (geomParams.widthSegments + 1); + var idx11 = verts.length / 3 - 1; + + data.corners = [verts[idx01 * 3], verts[idx01 * 3 + 1], verts[idx01 * 3 + 2], // ╗ + verts[idx00 * 3], verts[idx00 * 3 + 1], verts[idx00 * 3 + 2], // ╔ + verts[idx11 * 3], verts[idx11 * 3 + 1], verts[idx11 * 3 + 2], // ╝ + verts[idx10 * 3], verts[idx10 * 3 + 1], verts[idx10 * 3 + 2]]; + + data.segments = [geomParams.widthSegments + 1, geomParams.heightSegments + 1]; + + return geom; + }); + return _this; + } + + createClass(ClothModule, [{ + key: 'appendAnchor', + value: function appendAnchor(object, node, influence) { + var collisionBetweenLinkedBodies = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + + var o1 = this.data.id; + var o2 = object.use('physics').data.id; + + this.execute('appendAnchor', { + obj: o1, + obj2: o2, + node: node, + influence: influence, + collisionBetweenLinkedBodies: collisionBetweenLinkedBodies + }); + } + }, { + key: 'linkNodes', + value: function linkNodes(object, n1, n2, modifier) { + var self = this.data.id; + var body = object.use('physics').data.id; + + this.execute('linkNodes', { + self: self, + body: body, + n1: n1, // self node + n2: n2, // body node + modifier: modifier + }); + } + }, { + key: 'appendLinearJoint', + value: function appendLinearJoint(object, specs) { + var self = this.data.id; + var body = object.use('physics').data.id; + + this.execute('appendLinearJoint', { + self: self, + body: body, + specs: specs + }); + } + }]); + return ClothModule; + }(_default); + + var RopeModule = function (_PhysicsModule) { + inherits(RopeModule, _PhysicsModule); + + function RopeModule(params) { + classCallCheck(this, RopeModule); + + var _this = possibleConstructorReturn(this, (RopeModule.__proto__ || Object.getPrototypeOf(RopeModule)).call(this, _extends({ + type: 'softRopeMesh' + }, _default.rope()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.isBufferGeometry) { + geometry = function () { + var buff = new three.BufferGeometry(); + + buff.addAttribute('position', new three.BufferAttribute(new Float32Array(geometry.vertices.length * 3), 3).copyVector3sArray(geometry.vertices)); + + return buff; + }(); + } + + var length = geometry.attributes.position.array.length / 3; + var vert = function vert(n) { + return new three.Vector3().fromArray(geometry.attributes.position.array, n * 3); + }; + + var v1 = vert(0); + var v2 = vert(length - 1); + + data.data = [v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, length]; + + return geometry; + }); + return _this; + } + + createClass(RopeModule, [{ + key: 'appendAnchor', + value: function appendAnchor(object, node, influence) { + var collisionBetweenLinkedBodies = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + + var o1 = this.data.id; + var o2 = object.use('physics').data.id; + + this.execute('appendAnchor', { + obj: o1, + obj2: o2, + node: node, + influence: influence, + collisionBetweenLinkedBodies: collisionBetweenLinkedBodies + }); + } + }]); + return RopeModule; + }(_default); + + var _class$2, _temp$1; + + var PI_2 = Math.PI / 2; + + // TODO: Fix DOM + function FirstPersonControlsSolver(camera, mesh, params) { + var _this = this; + + var velocityFactor = 1; + var runVelocity = 0.25; + + mesh.use('physics').setAngularFactor({ x: 0, y: 0, z: 0 }); + camera.position.set(0, 0, 0); + + /* Init */ + var player = mesh, + pitchObject = new three.Object3D(); + + pitchObject.add(camera.native); + + var yawObject = new three.Object3D(); + + yawObject.position.y = params.ypos; // eyes are 2 meters above the ground + yawObject.add(pitchObject); + + var quat = new three.Quaternion(); + + var canJump = false, + + // Moves. + moveForward = false, + moveBackward = false, + moveLeft = false, + moveRight = false; + + player.on('collision', function (otherObject, v, r, contactNormal) { + console.log(contactNormal.y); + if (contactNormal.y < 0.5) // Use a "good" threshold value between 0 and 1 here! + canJump = true; + }); + + var onMouseMove = function onMouseMove(event) { + if (_this.enabled === false) return; + + var movementX = typeof event.movementX === 'number' ? event.movementX : typeof event.mozMovementX === 'number' ? event.mozMovementX : typeof event.getMovementX === 'function' ? event.getMovementX() : 0; + var movementY = typeof event.movementY === 'number' ? event.movementY : typeof event.mozMovementY === 'number' ? event.mozMovementY : typeof event.getMovementY === 'function' ? event.getMovementY() : 0; + + yawObject.rotation.y -= movementX * 0.002; + pitchObject.rotation.x -= movementY * 0.002; + + pitchObject.rotation.x = Math.max(-PI_2, Math.min(PI_2, pitchObject.rotation.x)); + }; + + var physics = player.use('physics'); + + var onKeyDown = function onKeyDown(event) { + switch (event.keyCode) { + case 38: // up + case 87: + // w + moveForward = true; + break; + + case 37: // left + case 65: + // a + moveLeft = true; + break; + + case 40: // down + case 83: + // s + moveBackward = true; + break; + + case 39: // right + case 68: + // d + moveRight = true; + break; + + case 32: + // space + console.log(canJump); + if (canJump === true) physics.applyCentralImpulse({ x: 0, y: 300, z: 0 }); + canJump = false; + break; + + case 16: + // shift + runVelocity = 0.5; + break; + + default: + } + }; + + var onKeyUp = function onKeyUp(event) { + switch (event.keyCode) { + case 38: // up + case 87: + // w + moveForward = false; + break; + + case 37: // left + case 65: + // a + moveLeft = false; + break; + + case 40: // down + case 83: + // a + moveBackward = false; + break; + + case 39: // right + case 68: + // d + moveRight = false; + break; + + case 16: + // shift + runVelocity = 0.25; + break; + + default: + } + }; + + document.body.addEventListener('mousemove', onMouseMove, false); + document.body.addEventListener('keydown', onKeyDown, false); + document.body.addEventListener('keyup', onKeyUp, false); + + this.enabled = false; + this.getObject = function () { + return yawObject; + }; + + this.getDirection = function (targetVec) { + targetVec.set(0, 0, -1); + quat.multiplyVector3(targetVec); + }; + + // Moves the camera to the Physi.js object position + // and adds velocity to the object if the run key is down. + var inputVelocity = new three.Vector3(), + euler = new three.Euler(); + + this.update = function (delta) { + if (_this.enabled === false) return; + + delta = delta || 0.5; + delta = Math.min(delta, 0.5, delta); + + inputVelocity.set(0, 0, 0); + + var speed = velocityFactor * delta * params.speed * runVelocity; + + if (moveForward) inputVelocity.z = -speed; + if (moveBackward) inputVelocity.z = speed; + if (moveLeft) inputVelocity.x = -speed; + if (moveRight) inputVelocity.x = speed; + + // Convert velocity to world coordinates + euler.x = pitchObject.rotation.x; + euler.y = yawObject.rotation.y; + euler.order = 'XYZ'; + + quat.setFromEuler(euler); + + inputVelocity.applyQuaternion(quat); + + physics.applyCentralImpulse({ x: inputVelocity.x, y: 0, z: inputVelocity.z }); + physics.setAngularVelocity({ x: inputVelocity.z, y: 0, z: -inputVelocity.x }); + physics.setAngularFactor({ x: 0, y: 0, z: 0 }); + }; + + player.on('physics:added', function () { + player.manager.get('module:world').addEventListener('update', function () { + if (_this.enabled === false) return; + yawObject.position.copy(player.position); + }); + }); + } + + var FirstPersonModule = (_temp$1 = _class$2 = function () { + function FirstPersonModule(object) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + classCallCheck(this, FirstPersonModule); + + this.object = object; + this.params = params; + + if (!this.params.block) { + this.params.block = document.getElementById('blocker'); + } + } + + createClass(FirstPersonModule, [{ + key: 'manager', + value: function manager(_manager) { + var _this2 = this; + + this.controls = new FirstPersonControlsSolver(_manager.get('camera'), this.object, this.params); + + if ('pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document) { + var element = document.body; + + var pointerlockchange = function pointerlockchange() { + if (document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element) { + _this2.controls.enabled = true; + _this2.params.block.style.display = 'none'; + } else { + _this2.controls.enabled = false; + _this2.params.block.style.display = 'block'; + } + }; + + document.addEventListener('pointerlockchange', pointerlockchange, false); + document.addEventListener('mozpointerlockchange', pointerlockchange, false); + document.addEventListener('webkitpointerlockchange', pointerlockchange, false); + + var pointerlockerror = function pointerlockerror() { + console.warn('Pointer lock error.'); + }; + + document.addEventListener('pointerlockerror', pointerlockerror, false); + document.addEventListener('mozpointerlockerror', pointerlockerror, false); + document.addEventListener('webkitpointerlockerror', pointerlockerror, false); + + document.querySelector('body').addEventListener('click', function () { + element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock; + + element.requestFullscreen = element.requestFullscreen || element.mozRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen; + + if (/Firefox/i.test(navigator.userAgent)) { + var fullscreenchange = function fullscreenchange() { + if (document.fullscreenElement === element || document.mozFullscreenElement === element || document.mozFullScreenElement === element) { + document.removeEventListener('fullscreenchange', fullscreenchange); + document.removeEventListener('mozfullscreenchange', fullscreenchange); + + element.requestPointerLock(); + } + }; + + document.addEventListener('fullscreenchange', fullscreenchange, false); + document.addEventListener('mozfullscreenchange', fullscreenchange, false); + + element.requestFullscreen(); + } else element.requestPointerLock(); + }); + } else console.warn('Your browser does not support the PointerLock'); + + _manager.get('scene').add(this.controls.getObject()); + } + }, { + key: 'integrate', + value: function integrate(self) { + var updateProcessor = function updateProcessor(c) { + self.controls.update(c.getDelta()); + }; + + self.updateLoop = new whs.Loop(updateProcessor).start(this); + } + }]); + return FirstPersonModule; + }(), _class$2.defaults = { + block: null, + speed: 1, + ypos: 1 + }, _temp$1); + + exports.getEulerXYZFromQuaternion = getEulerXYZFromQuaternion; + exports.getQuatertionFromEuler = getQuatertionFromEuler; + exports.convertWorldPositionToObject = convertWorldPositionToObject; + exports.addObjectChildren = addObjectChildren; + exports.MESSAGE_TYPES = MESSAGE_TYPES; + exports.REPORT_ITEMSIZE = REPORT_ITEMSIZE; + exports.COLLISIONREPORT_ITEMSIZE = COLLISIONREPORT_ITEMSIZE; + exports.VEHICLEREPORT_ITEMSIZE = VEHICLEREPORT_ITEMSIZE; + exports.CONSTRAINTREPORT_ITEMSIZE = CONSTRAINTREPORT_ITEMSIZE; + exports.temp1Vector3 = temp1Vector3; + exports.temp2Vector3 = temp2Vector3; + exports.temp1Matrix4 = temp1Matrix4; + exports.temp1Quat = temp1Quat; + exports.Eventable = Eventable; + exports.ConeTwistConstraint = ConeTwistConstraint; + exports.HingeConstraint = HingeConstraint; + exports.PointConstraint = PointConstraint; + exports.SliderConstraint = SliderConstraint; + exports.DOFConstraint = DOFConstraint; + exports.WorldModule = WorldModule; + exports.BoxModule = BoxModule; + exports.CompoundModule = CompoundModule; + exports.CapsuleModule = CapsuleModule; + exports.ConcaveModule = ConcaveModule; + exports.ConeModule = ConeModule; + exports.ConvexModule = ConvexModule; + exports.CylinderModule = CylinderModule; + exports.HeightfieldModule = HeightfieldModule; + exports.PlaneModule = PlaneModule; + exports.SphereModule = SphereModule; + exports.SoftbodyModule = SoftbodyModule; + exports.ClothModule = ClothModule; + exports.RopeModule = RopeModule; + exports.FirstPersonModule = FirstPersonModule; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy1tb2R1bGUuanMubWFwIiwic291cmNlcyI6WyIuLi9zcmMvYXBpLmpzIiwiLi4vc3JjL2V2ZW50YWJsZS5qcyIsIi4uL3NyYy9jb25zdHJhaW50cy9Db25lVHdpc3RDb25zdHJhaW50LmpzIiwiLi4vc3JjL2NvbnN0cmFpbnRzL0hpbmdlQ29uc3RyYWludC5qcyIsIi4uL3NyYy9jb25zdHJhaW50cy9Qb2ludENvbnN0cmFpbnQuanMiLCIuLi9zcmMvY29uc3RyYWludHMvU2xpZGVyQ29uc3RyYWludC5qcyIsIi4uL3NyYy9jb25zdHJhaW50cy9ET0ZDb25zdHJhaW50LmpzIiwiLi4vc3JjL3ZlaGljbGUvdmVoaWNsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2NvcmUvV29ybGRNb2R1bGVCYXNlLmpzIiwiLi4vYnVuZGxlLXdvcmtlci93b3JrZXJoZWxwZXIuanMiLCIuLi9zcmMvd29ya2VyLmpzIiwiLi4vc3JjL21vZHVsZXMvV29ybGRNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9jb3JlL1BoeXNpY3NNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Cb3hNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Db21wb3VuZE1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL0NhcHN1bGVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Db25jYXZlTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvQ29uZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL0NvbnZleE1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL0N5bGluZGVyTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvSGVpZ2h0ZmllbGRNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9QbGFuZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL1NwaGVyZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL1NvZnRib2R5TW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvQ2xvdGhNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Sb3BlTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvY29udHJvbHMvRmlyc3RQZXJzb25Nb2R1bGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgVmVjdG9yMyxcbiAgTWF0cml4NCxcbiAgUXVhdGVybmlvblxufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IE1FU1NBR0VfVFlQRVMgPSB7XG4gIFdPUkxEUkVQT1JUOiAwLFxuICBDT0xMSVNJT05SRVBPUlQ6IDEsXG4gIFZFSElDTEVSRVBPUlQ6IDIsXG4gIENPTlNUUkFJTlRSRVBPUlQ6IDMsXG4gIFNPRlRSRVBPUlQ6IDRcbn07XG5cbmNvbnN0IFJFUE9SVF9JVEVNU0laRSA9IDE0LFxuICBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUgPSA1LFxuICBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFID0gOSxcbiAgQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSA9IDY7XG5cbmNvbnN0IHRlbXAxVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCksXG4gIHRlbXAyVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCksXG4gIHRlbXAxTWF0cml4NCA9IG5ldyBNYXRyaXg0KCksXG4gIHRlbXAxUXVhdCA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbmNvbnN0IGdldEV1bGVyWFlaRnJvbVF1YXRlcm5pb24gPSAoeCwgeSwgeiwgdykgPT4ge1xuICByZXR1cm4gbmV3IFZlY3RvcjMoXG4gICAgTWF0aC5hdGFuMigyICogKHggKiB3IC0geSAqIHopLCAodyAqIHcgLSB4ICogeCAtIHkgKiB5ICsgeiAqIHopKSxcbiAgICBNYXRoLmFzaW4oMiAqICh4ICogeiArIHkgKiB3KSksXG4gICAgTWF0aC5hdGFuMigyICogKHogKiB3IC0geCAqIHkpLCAodyAqIHcgKyB4ICogeCAtIHkgKiB5IC0geiAqIHopKVxuICApO1xufTtcblxuY29uc3QgZ2V0UXVhdGVydGlvbkZyb21FdWxlciA9ICh4LCB5LCB6KSA9PiB7XG4gIGNvbnN0IGMxID0gTWF0aC5jb3MoeSk7XG4gIGNvbnN0IHMxID0gTWF0aC5zaW4oeSk7XG4gIGNvbnN0IGMyID0gTWF0aC5jb3MoLXopO1xuICBjb25zdCBzMiA9IE1hdGguc2luKC16KTtcbiAgY29uc3QgYzMgPSBNYXRoLmNvcyh4KTtcbiAgY29uc3QgczMgPSBNYXRoLnNpbih4KTtcbiAgY29uc3QgYzFjMiA9IGMxICogYzI7XG4gIGNvbnN0IHMxczIgPSBzMSAqIHMyO1xuXG4gIHJldHVybiB7XG4gICAgdzogYzFjMiAqIGMzIC0gczFzMiAqIHMzLFxuICAgIHg6IGMxYzIgKiBzMyArIHMxczIgKiBjMyxcbiAgICB5OiBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczMsXG4gICAgejogYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzXG4gIH07XG59O1xuXG5jb25zdCBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0ID0gKHBvc2l0aW9uLCBvYmplY3QpID0+IHtcbiAgdGVtcDFNYXRyaXg0LmlkZW50aXR5KCk7IC8vIHJlc2V0IHRlbXAgbWF0cml4XG5cbiAgLy8gU2V0IHRoZSB0ZW1wIG1hdHJpeCdzIHJvdGF0aW9uIHRvIHRoZSBvYmplY3QncyByb3RhdGlvblxuICB0ZW1wMU1hdHJpeDQuaWRlbnRpdHkoKS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihvYmplY3QucXVhdGVybmlvbik7XG5cbiAgLy8gSW52ZXJ0IHJvdGF0aW9uIG1hdHJpeCBpbiBvcmRlciB0byBcInVucm90YXRlXCIgYSBwb2ludCBiYWNrIHRvIG9iamVjdCBzcGFjZVxuICB0ZW1wMU1hdHJpeDQuZ2V0SW52ZXJzZSh0ZW1wMU1hdHJpeDQpO1xuXG4gIC8vIFlheSEgVGVtcCB2YXJzIVxuICB0ZW1wMVZlY3RvcjMuY29weShwb3NpdGlvbik7XG4gIHRlbXAyVmVjdG9yMy5jb3B5KG9iamVjdC5wb3NpdGlvbik7XG5cbiAgLy8gQXBwbHkgdGhlIHJvdGF0aW9uXG4gIHJldHVybiB0ZW1wMVZlY3RvcjMuc3ViKHRlbXAyVmVjdG9yMykuYXBwbHlNYXRyaXg0KHRlbXAxTWF0cml4NCk7XG59O1xuXG5jb25zdCBhZGRPYmplY3RDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIG9iamVjdCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gb2JqZWN0LmNoaWxkcmVuW2ldO1xuICAgIGNvbnN0IHBoeXNpY3MgPSBjaGlsZC5jb21wb25lbnQgPyBjaGlsZC5jb21wb25lbnQudXNlKCdwaHlzaWNzJykgOiBmYWxzZTtcblxuICAgIGlmIChwaHlzaWNzKSB7XG4gICAgICBjb25zdCBkYXRhID0gcGh5c2ljcy5kYXRhO1xuXG4gICAgICBjaGlsZC51cGRhdGVNYXRyaXgoKTtcbiAgICAgIGNoaWxkLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cbiAgICAgIHRlbXAxVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgdGVtcDFRdWF0LnNldEZyb21Sb3RhdGlvbk1hdHJpeChjaGlsZC5tYXRyaXhXb3JsZCk7XG5cbiAgICAgIGRhdGEucG9zaXRpb25fb2Zmc2V0ID0ge1xuICAgICAgICB4OiB0ZW1wMVZlY3RvcjMueCxcbiAgICAgICAgeTogdGVtcDFWZWN0b3IzLnksXG4gICAgICAgIHo6IHRlbXAxVmVjdG9yMy56XG4gICAgICB9O1xuXG4gICAgICBkYXRhLnJvdGF0aW9uID0ge1xuICAgICAgICB4OiB0ZW1wMVF1YXQueCxcbiAgICAgICAgeTogdGVtcDFRdWF0LnksXG4gICAgICAgIHo6IHRlbXAxUXVhdC56LFxuICAgICAgICB3OiB0ZW1wMVF1YXQud1xuICAgICAgfTtcblxuICAgICAgcGFyZW50LmNvbXBvbmVudC51c2UoJ3BoeXNpY3MnKS5kYXRhLmNoaWxkcmVuLnB1c2goZGF0YSk7XG4gICAgfVxuXG4gICAgYWRkT2JqZWN0Q2hpbGRyZW4ocGFyZW50LCBjaGlsZCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7XG4gIGdldEV1bGVyWFlaRnJvbVF1YXRlcm5pb24sXG4gIGdldFF1YXRlcnRpb25Gcm9tRXVsZXIsXG4gIGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QsXG4gIGFkZE9iamVjdENoaWxkcmVuLFxuXG4gIE1FU1NBR0VfVFlQRVMsXG4gIFJFUE9SVF9JVEVNU0laRSxcbiAgQ09MTElTSU9OUkVQT1JUX0lURU1TSVpFLFxuICBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFLFxuICBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFLFxuXG4gIHRlbXAxVmVjdG9yMyxcbiAgdGVtcDJWZWN0b3IzLFxuICB0ZW1wMU1hdHJpeDQsXG4gIHRlbXAxUXVhdFxufTtcbiIsImV4cG9ydCBjbGFzcyBFdmVudGFibGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IHt9O1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzT3duUHJvcGVydHkoZXZlbnRfbmFtZSkpXG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF9uYW1lXSA9IFtdO1xuXG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRfbmFtZV0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50X25hbWUsIGNhbGxiYWNrKSB7XG4gICAgbGV0IGluZGV4O1xuXG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eShldmVudF9uYW1lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKChpbmRleCA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50X25hbWVdLmluZGV4T2YoY2FsbGJhY2spKSA+PSAwKSB7XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF9uYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudF9uYW1lKSB7XG4gICAgbGV0IGk7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgaWYgKHRoaXMuX2V2ZW50TGlzdGVuZXJzLmhhc093blByb3BlcnR5KGV2ZW50X25hbWUpKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRfbmFtZV0ubGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50X25hbWVdW2ldLmFwcGx5KHRoaXMsIHBhcmFtZXRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBtYWtlKG9iaikge1xuICAgIG9iai5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IEV2ZW50YWJsZS5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcjtcbiAgICBvYmoucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBFdmVudGFibGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI7XG4gICAgb2JqLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gRXZlbnRhYmxlLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50O1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0IH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEV1bGVyLCBNYXRyaXg0LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuXG5leHBvcnQgY2xhc3MgQ29uZVR3aXN0Q29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKG9iamEsIG9iamIsIHBvc2l0aW9uKSB7XG4gICAgY29uc3Qgb2JqZWN0YSA9IG9iamE7XG4gICAgY29uc3Qgb2JqZWN0YiA9IG9iamE7XG5cbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkgY29uc29sZS5lcnJvcignQm90aCBvYmplY3RzIG11c3QgYmUgZGVmaW5lZCBpbiBhIENvbmVUd2lzdENvbnN0cmFpbnQuJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnY29uZXR3aXN0JztcbiAgICB0aGlzLmFwcGxpZWRJbXB1bHNlID0gMDtcbiAgICB0aGlzLndvcmxkTW9kdWxlID0gbnVsbDsgLy8gV2lsbCBiZSByZWRlZmluZWQgYnkgLmFkZENvbnN0cmFpbnRcbiAgICB0aGlzLm9iamVjdGEgPSBvYmplY3RhLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgdGhpcy5wb3NpdGlvbmEgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KHBvc2l0aW9uLCBvYmplY3RhKS5jbG9uZSgpO1xuICAgIHRoaXMub2JqZWN0YiA9IG9iamVjdGIudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYiA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGIpLmNsb25lKCk7XG4gICAgdGhpcy5heGlzYSA9IHt4OiBvYmplY3RhLnJvdGF0aW9uLngsIHk6IG9iamVjdGEucm90YXRpb24ueSwgejogb2JqZWN0YS5yb3RhdGlvbi56fTtcbiAgICB0aGlzLmF4aXNiID0ge3g6IG9iamVjdGIucm90YXRpb24ueCwgeTogb2JqZWN0Yi5yb3RhdGlvbi55LCB6OiBvYmplY3RiLnJvdGF0aW9uLnp9O1xuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXNhOiB0aGlzLmF4aXNhLFxuICAgICAgYXhpc2I6IHRoaXMuYXhpc2JcbiAgICB9O1xuICB9XG5cbiAgc2V0TGltaXQoeCwgeSwgeikge1xuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X3NldExpbWl0Jywge2NvbnN0cmFpbnQ6IHRoaXMuaWQsIHgsIHksIHp9KTtcbiAgfVxuXG4gIGVuYWJsZU1vdG9yKCkge1xuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X2VuYWJsZU1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxuXG4gIHNldE1heE1vdG9ySW1wdWxzZShtYXhfaW1wdWxzZSkge1xuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X3NldE1heE1vdG9ySW1wdWxzZScsIHtjb25zdHJhaW50OiB0aGlzLmlkLCBtYXhfaW1wdWxzZX0pO1xuICB9XG5cbiAgc2V0TW90b3JUYXJnZXQodGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFZlY3RvcjMpXG4gICAgICB0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21FdWxlcihuZXcgRXVsZXIodGFyZ2V0LngsIHRhcmdldC55LCB0YXJnZXQueikpO1xuICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV1bGVyKVxuICAgICAgdGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKS5zZXRGcm9tRXVsZXIodGFyZ2V0KTtcbiAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNYXRyaXg0KVxuICAgICAgdGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKS5zZXRGcm9tUm90YXRpb25NYXRyaXgodGFyZ2V0KTtcblxuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X3NldE1vdG9yVGFyZ2V0Jywge1xuICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgIHg6IHRhcmdldC54LFxuICAgICAgeTogdGFyZ2V0LnksXG4gICAgICB6OiB0YXJnZXQueixcbiAgICAgIHc6IHRhcmdldC53XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Y29udmVydFdvcmxkUG9zaXRpb25Ub09iamVjdH0gZnJvbSAnLi4vYXBpJztcblxuZXhwb3J0IGNsYXNzIEhpbmdlQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKG9iamEsIG9iamIsIHBvc2l0aW9uLCBheGlzKSB7XG4gICAgY29uc3Qgb2JqZWN0YSA9IG9iamE7XG4gICAgbGV0IG9iamVjdGIgPSBvYmpiO1xuXG4gICAgaWYgKGF4aXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXhpcyA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gPSBvYmplY3RiO1xuICAgICAgb2JqZWN0YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAnaGluZ2UnO1xuICAgIHRoaXMuYXBwbGllZEltcHVsc2UgPSAwO1xuICAgIHRoaXMud29ybGRNb2R1bGUgPSBudWxsOyAvLyBXaWxsIGJlIHJlZGVmaW5lZCBieSAuYWRkQ29uc3RyYWludFxuICAgIHRoaXMub2JqZWN0YSA9IG9iamVjdGEudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYSA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGEpLmNsb25lKCk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uLmNsb25lKCk7XG4gICAgdGhpcy5heGlzID0gYXhpcztcblxuICAgIGlmIChvYmplY3RiKSB7XG4gICAgICB0aGlzLm9iamVjdGIgPSBvYmplY3RiLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgICB0aGlzLnBvc2l0aW9uYiA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGIpLmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXM6IHRoaXMuYXhpc1xuICAgIH07XG4gIH1cblxuICBzZXRMaW1pdHMobG93LCBoaWdoLCBiaWFzX2ZhY3RvciwgcmVsYXhhdGlvbl9mYWN0b3IpIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCdoaW5nZV9zZXRMaW1pdHMnLCB7XG4gICAgICBjb25zdHJhaW50OiB0aGlzLmlkLFxuICAgICAgbG93LFxuICAgICAgaGlnaCxcbiAgICAgIGJpYXNfZmFjdG9yLFxuICAgICAgcmVsYXhhdGlvbl9mYWN0b3JcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZUFuZ3VsYXJNb3Rvcih2ZWxvY2l0eSwgYWNjZWxlcmF0aW9uKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnaGluZ2VfZW5hYmxlQW5ndWxhck1vdG9yJywge1xuICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgIHZlbG9jaXR5LFxuICAgICAgYWNjZWxlcmF0aW9uXG4gICAgfSk7XG4gIH1cblxuICBkaXNhYmxlTW90b3IoKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnaGluZ2VfZGlzYWJsZU1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0fSBmcm9tICcuLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgUG9pbnRDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3Iob2JqYSwgb2JqYiwgcG9zaXRpb24pIHtcbiAgICBjb25zdCBvYmplY3RhID0gb2JqYTtcbiAgICBsZXQgb2JqZWN0YiA9IG9iamI7XG5cbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcG9zaXRpb24gPSBvYmplY3RiO1xuICAgICAgb2JqZWN0YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAncG9pbnQnO1xuICAgIHRoaXMuYXBwbGllZEltcHVsc2UgPSAwO1xuICAgIHRoaXMub2JqZWN0YSA9IG9iamVjdGEudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYSA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGEpLmNsb25lKCk7XG5cbiAgICBpZiAob2JqZWN0Yikge1xuICAgICAgdGhpcy5vYmplY3RiID0gb2JqZWN0Yi51c2UoJ3BoeXNpY3MnKS5kYXRhLmlkO1xuICAgICAgdGhpcy5wb3NpdGlvbmIgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KHBvc2l0aW9uLCBvYmplY3RiKS5jbG9uZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgb2JqZWN0YTogdGhpcy5vYmplY3RhLFxuICAgICAgb2JqZWN0YjogdGhpcy5vYmplY3RiLFxuICAgICAgcG9zaXRpb25hOiB0aGlzLnBvc2l0aW9uYSxcbiAgICAgIHBvc2l0aW9uYjogdGhpcy5wb3NpdGlvbmJcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQge2NvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3R9IGZyb20gJy4uL2FwaSc7XG5cbmV4cG9ydCBjbGFzcyBTbGlkZXJDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3Iob2JqYSwgb2JqYiwgcG9zaXRpb24sIGF4aXMpIHtcbiAgICBjb25zdCBvYmplY3RhID0gb2JqYTtcbiAgICBsZXQgb2JqZWN0YiA9IG9iamI7XG5cbiAgICBpZiAoYXhpcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBheGlzID0gcG9zaXRpb247XG4gICAgICBwb3NpdGlvbiA9IG9iamVjdGI7XG4gICAgICBvYmplY3RiID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdzbGlkZXInO1xuICAgIHRoaXMuYXBwbGllZEltcHVsc2UgPSAwO1xuICAgIHRoaXMud29ybGRNb2R1bGUgPSBudWxsOyAvLyBXaWxsIGJlIHJlZGVmaW5lZCBieSAuYWRkQ29uc3RyYWludFxuICAgIHRoaXMub2JqZWN0YSA9IG9iamVjdGEudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYSA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGEpLmNsb25lKCk7XG4gICAgdGhpcy5heGlzID0gYXhpcztcblxuICAgIGlmIChvYmplY3RiKSB7XG4gICAgICB0aGlzLm9iamVjdGIgPSBvYmplY3RiLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgICB0aGlzLnBvc2l0aW9uYiA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGIpLmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXM6IHRoaXMuYXhpc1xuICAgIH07XG4gIH1cblxuICBzZXRMaW1pdHMobGluX2xvd2VyLCBsaW5fdXBwZXIsIGFuZ19sb3dlciwgYW5nX3VwcGVyKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnc2xpZGVyX3NldExpbWl0cycsIHtcbiAgICAgIGNvbnN0cmFpbnQ6IHRoaXMuaWQsXG4gICAgICBsaW5fbG93ZXIsXG4gICAgICBsaW5fdXBwZXIsXG4gICAgICBhbmdfbG93ZXIsXG4gICAgICBhbmdfdXBwZXJcbiAgICB9KTtcbiAgfVxuXG4gIHNldFJlc3RpdHV0aW9uKGxpbmVhciwgYW5ndWxhcikge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoXG4gICAgICAnc2xpZGVyX3NldFJlc3RpdHV0aW9uJyxcbiAgICAgIHtcbiAgICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgICAgbGluZWFyLFxuICAgICAgICBhbmd1bGFyXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGVuYWJsZUxpbmVhck1vdG9yKHZlbG9jaXR5LCBhY2NlbGVyYXRpb24pIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCdzbGlkZXJfZW5hYmxlTGluZWFyTW90b3InLCB7XG4gICAgICBjb25zdHJhaW50OiB0aGlzLmlkLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBhY2NlbGVyYXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIGRpc2FibGVMaW5lYXJNb3RvcigpIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCdzbGlkZXJfZGlzYWJsZUxpbmVhck1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxuXG4gIGVuYWJsZUFuZ3VsYXJNb3Rvcih2ZWxvY2l0eSwgYWNjZWxlcmF0aW9uKSB7XG4gICAgdGhpcy5zY2VuZS5leGVjdXRlKCdzbGlkZXJfZW5hYmxlQW5ndWxhck1vdG9yJywge1xuICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgIHZlbG9jaXR5LFxuICAgICAgYWNjZWxlcmF0aW9uXG4gICAgfSk7XG4gIH1cblxuICBkaXNhYmxlQW5ndWxhck1vdG9yKCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoJ3NsaWRlcl9kaXNhYmxlQW5ndWxhck1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0fSBmcm9tICcuLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgRE9GQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKG9iamEsIG9iamIsIHBvc2l0aW9uKSB7XG4gICAgY29uc3Qgb2JqZWN0YSA9IG9iamE7XG4gICAgbGV0IG9iamVjdGIgPSBvYmpiO1xuXG4gICAgaWYgKCBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgcG9zaXRpb24gPSBvYmplY3RiO1xuICAgICAgb2JqZWN0YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAnZG9mJztcbiAgICB0aGlzLmFwcGxpZWRJbXB1bHNlID0gMDtcbiAgICB0aGlzLndvcmxkTW9kdWxlID0gbnVsbDsgLy8gV2lsbCBiZSByZWRlZmluZWQgYnkgLmFkZENvbnN0cmFpbnRcbiAgICB0aGlzLm9iamVjdGEgPSBvYmplY3RhLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgdGhpcy5wb3NpdGlvbmEgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KCBwb3NpdGlvbiwgb2JqZWN0YSApLmNsb25lKCk7XG4gICAgdGhpcy5heGlzYSA9IHsgeDogb2JqZWN0YS5yb3RhdGlvbi54LCB5OiBvYmplY3RhLnJvdGF0aW9uLnksIHo6IG9iamVjdGEucm90YXRpb24ueiB9O1xuXG4gICAgaWYgKCBvYmplY3RiICkge1xuICAgICAgdGhpcy5vYmplY3RiID0gb2JqZWN0Yi51c2UoJ3BoeXNpY3MnKS5kYXRhLmlkO1xuICAgICAgdGhpcy5wb3NpdGlvbmIgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KCBwb3NpdGlvbiwgb2JqZWN0YiApLmNsb25lKCk7XG4gICAgICB0aGlzLmF4aXNiID0geyB4OiBvYmplY3RiLnJvdGF0aW9uLngsIHk6IG9iamVjdGIucm90YXRpb24ueSwgejogb2JqZWN0Yi5yb3RhdGlvbi56IH07XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXNhOiB0aGlzLmF4aXNhLFxuICAgICAgYXhpc2I6IHRoaXMuYXhpc2JcbiAgICB9O1xuICB9XG5cbiAgc2V0TGluZWFyTG93ZXJMaW1pdChsaW1pdCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2Zfc2V0TGluZWFyTG93ZXJMaW1pdCcsIHsgY29uc3RyYWludDogdGhpcy5pZCwgeDogbGltaXQueCwgeTogbGltaXQueSwgejogbGltaXQueiB9ICk7XG4gIH1cblxuICBzZXRMaW5lYXJVcHBlckxpbWl0IChsaW1pdCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2Zfc2V0TGluZWFyVXBwZXJMaW1pdCcsIHsgY29uc3RyYWludDogdGhpcy5pZCwgeDogbGltaXQueCwgeTogbGltaXQueSwgejogbGltaXQueiB9ICk7XG4gIH1cblxuICBzZXRBbmd1bGFyTG93ZXJMaW1pdCAobGltaXQpIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCAnZG9mX3NldEFuZ3VsYXJMb3dlckxpbWl0JywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB4OiBsaW1pdC54LCB5OiBsaW1pdC55LCB6OiBsaW1pdC56IH0gKTtcbiAgfVxuXG4gIHNldEFuZ3VsYXJVcHBlckxpbWl0IChsaW1pdCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2Zfc2V0QW5ndWxhclVwcGVyTGltaXQnLCB7IGNvbnN0cmFpbnQ6IHRoaXMuaWQsIHg6IGxpbWl0LngsIHk6IGxpbWl0LnksIHo6IGxpbWl0LnogfSApO1xuICB9XG5cbiAgZW5hYmxlQW5ndWxhck1vdG9yICh3aGljaCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2ZfZW5hYmxlQW5ndWxhck1vdG9yJywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB3aGljaDogd2hpY2ggfSApO1xuICB9XG5cbiAgY29uZmlndXJlQW5ndWxhck1vdG9yICh3aGljaCwgbG93X2FuZ2xlLCBoaWdoX2FuZ2xlLCB2ZWxvY2l0eSwgbWF4X2ZvcmNlICkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2ZfY29uZmlndXJlQW5ndWxhck1vdG9yJywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB3aGljaDogd2hpY2gsIGxvd19hbmdsZTogbG93X2FuZ2xlLCBoaWdoX2FuZ2xlOiBoaWdoX2FuZ2xlLCB2ZWxvY2l0eTogdmVsb2NpdHksIG1heF9mb3JjZTogbWF4X2ZvcmNlIH0gKTtcbiAgfVxuXG4gIGRpc2FibGVBbmd1bGFyTW90b3IgKHdoaWNoKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSggJ2RvZl9kaXNhYmxlQW5ndWxhck1vdG9yJywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB3aGljaDogd2hpY2ggfSApO1xuICB9XG59XG4iLCJpbXBvcnQge01lc2h9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7VmVoaWNsZVR1bm5pbmd9IGZyb20gJy4vdHVubmluZyc7XG5cbmV4cG9ydCBjbGFzcyBWZWhpY2xlIHtcbiAgY29uc3RydWN0b3IobWVzaCwgdHVuaW5nID0gbmV3IFZlaGljbGVUdW5pbmcoKSkge1xuICAgIHRoaXMubWVzaCA9IG1lc2g7XG4gICAgdGhpcy53aGVlbHMgPSBbXTtcblxuICAgIHRoaXMuX3BoeXNpanMgPSB7XG4gICAgICBpZDogZ2V0T2JqZWN0SWQoKSxcbiAgICAgIHJpZ2lkQm9keTogbWVzaC5fcGh5c2lqcy5pZCxcbiAgICAgIHN1c3BlbnNpb25fc3RpZmZuZXNzOiB0dW5pbmcuc3VzcGVuc2lvbl9zdGlmZm5lc3MsXG4gICAgICBzdXNwZW5zaW9uX2NvbXByZXNzaW9uOiB0dW5pbmcuc3VzcGVuc2lvbl9jb21wcmVzc2lvbixcbiAgICAgIHN1c3BlbnNpb25fZGFtcGluZzogdHVuaW5nLnN1c3BlbnNpb25fZGFtcGluZyxcbiAgICAgIG1heF9zdXNwZW5zaW9uX3RyYXZlbDogdHVuaW5nLm1heF9zdXNwZW5zaW9uX3RyYXZlbCxcbiAgICAgIGZyaWN0aW9uX3NsaXA6IHR1bmluZy5mcmljdGlvbl9zbGlwLFxuICAgICAgbWF4X3N1c3BlbnNpb25fZm9yY2U6IHR1bmluZy5tYXhfc3VzcGVuc2lvbl9mb3JjZVxuICAgIH07XG4gIH1cblxuICBhZGRXaGVlbCh3aGVlbF9nZW9tZXRyeSwgd2hlZWxfbWF0ZXJpYWwsIGNvbm5lY3Rpb25fcG9pbnQsIHdoZWVsX2RpcmVjdGlvbiwgd2hlZWxfYXhsZSwgc3VzcGVuc2lvbl9yZXN0X2xlbmd0aCwgd2hlZWxfcmFkaXVzLCBpc19mcm9udF93aGVlbCwgdHVuaW5nKSB7XG4gICAgY29uc3Qgd2hlZWwgPSBuZXcgTWVzaCh3aGVlbF9nZW9tZXRyeSwgd2hlZWxfbWF0ZXJpYWwpO1xuXG4gICAgd2hlZWwuY2FzdFNoYWRvdyA9IHdoZWVsLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xuICAgIHdoZWVsLnBvc2l0aW9uLmNvcHkod2hlZWxfZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihzdXNwZW5zaW9uX3Jlc3RfbGVuZ3RoIC8gMTAwKS5hZGQoY29ubmVjdGlvbl9wb2ludCk7XG5cbiAgICB0aGlzLndvcmxkLmFkZCh3aGVlbCk7XG4gICAgdGhpcy53aGVlbHMucHVzaCh3aGVlbCk7XG5cbiAgICB0aGlzLndvcmxkLmV4ZWN1dGUoJ2FkZFdoZWVsJywge1xuICAgICAgaWQ6IHRoaXMuX3BoeXNpanMuaWQsXG4gICAgICBjb25uZWN0aW9uX3BvaW50OiB7eDogY29ubmVjdGlvbl9wb2ludC54LCB5OiBjb25uZWN0aW9uX3BvaW50LnksIHo6IGNvbm5lY3Rpb25fcG9pbnQuen0sXG4gICAgICB3aGVlbF9kaXJlY3Rpb246IHt4OiB3aGVlbF9kaXJlY3Rpb24ueCwgeTogd2hlZWxfZGlyZWN0aW9uLnksIHo6IHdoZWVsX2RpcmVjdGlvbi56fSxcbiAgICAgIHdoZWVsX2F4bGU6IHt4OiB3aGVlbF9heGxlLngsIHk6IHdoZWVsX2F4bGUueSwgejogd2hlZWxfYXhsZS56fSxcbiAgICAgIHN1c3BlbnNpb25fcmVzdF9sZW5ndGgsXG4gICAgICB3aGVlbF9yYWRpdXMsXG4gICAgICBpc19mcm9udF93aGVlbCxcbiAgICAgIHR1bmluZ1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U3RlZXJpbmcoYW1vdW50LCB3aGVlbCkge1xuICAgIGlmICh3aGVlbCAhPT0gdW5kZWZpbmVkICYmIHRoaXMud2hlZWxzW3doZWVsXSAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy53b3JsZC5leGVjdXRlKCdzZXRTdGVlcmluZycsIHtpZDogdGhpcy5fcGh5c2lqcy5pZCwgd2hlZWwsIHN0ZWVyaW5nOiBhbW91bnR9KTtcbiAgICBlbHNlIGlmICh0aGlzLndoZWVscy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud2hlZWxzLmxlbmd0aDsgaSsrKVxuICAgICAgICB0aGlzLndvcmxkLmV4ZWN1dGUoJ3NldFN0ZWVyaW5nJywge2lkOiB0aGlzLl9waHlzaWpzLmlkLCB3aGVlbDogaSwgc3RlZXJpbmc6IGFtb3VudH0pO1xuICAgIH1cbiAgfVxuXG4gIHNldEJyYWtlKGFtb3VudCwgd2hlZWwpIHtcbiAgICBpZiAod2hlZWwgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndoZWVsc1t3aGVlbF0gIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMud29ybGQuZXhlY3V0ZSgnc2V0QnJha2UnLCB7aWQ6IHRoaXMuX3BoeXNpanMuaWQsIHdoZWVsLCBicmFrZTogYW1vdW50fSk7XG4gICAgZWxzZSBpZiAodGhpcy53aGVlbHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndoZWVscy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy53b3JsZC5leGVjdXRlKCdzZXRCcmFrZScsIHtpZDogdGhpcy5fcGh5c2lqcy5pZCwgd2hlZWw6IGksIGJyYWtlOiBhbW91bnR9KTtcbiAgICB9XG4gIH1cblxuICBhcHBseUVuZ2luZUZvcmNlKGFtb3VudCwgd2hlZWwpIHtcbiAgICBpZiAod2hlZWwgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndoZWVsc1t3aGVlbF0gIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMud29ybGQuZXhlY3V0ZSgnYXBwbHlFbmdpbmVGb3JjZScsIHtpZDogdGhpcy5fcGh5c2lqcy5pZCwgd2hlZWwsIGZvcmNlOiBhbW91bnR9KTtcbiAgICBlbHNlIGlmICh0aGlzLndoZWVscy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud2hlZWxzLmxlbmd0aDsgaSsrKVxuICAgICAgICB0aGlzLndvcmxkLmV4ZWN1dGUoJ2FwcGx5RW5naW5lRm9yY2UnLCB7aWQ6IHRoaXMuX3BoeXNpanMuaWQsIHdoZWVsOiBpLCBmb3JjZTogYW1vdW50fSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBTY2VuZSBhcyBTY2VuZU5hdGl2ZSxcbiAgTWVzaCxcbiAgU3BoZXJlR2VvbWV0cnksXG4gIE1lc2hOb3JtYWxNYXRlcmlhbCxcbiAgQm94R2VvbWV0cnksXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge0xvb3B9IGZyb20gJ3docyc7XG5cbmltcG9ydCB7VmVoaWNsZX0gZnJvbSAnLi4vLi4vdmVoaWNsZS92ZWhpY2xlJztcbmltcG9ydCB7RXZlbnRhYmxlfSBmcm9tICcuLi8uLi9ldmVudGFibGUnO1xuXG5pbXBvcnQge1xuICBhZGRPYmplY3RDaGlsZHJlbixcbiAgTUVTU0FHRV9UWVBFUyxcbiAgdGVtcDFWZWN0b3IzLFxuICB0ZW1wMU1hdHJpeDQsXG4gIFJFUE9SVF9JVEVNU0laRSxcbiAgQ09MTElTSU9OUkVQT1JUX0lURU1TSVpFLFxuICBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFLFxuICBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFXG59IGZyb20gJy4uLy4uL2FwaSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmxkTW9kdWxlQmFzZSBleHRlbmRzIEV2ZW50YWJsZSB7XG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBmaXhlZFRpbWVTdGVwOiAxLzYwLFxuICAgIHJhdGVMaW1pdDogdHJ1ZSxcbiAgICBhbW1vOiBcIlwiLFxuICAgIHNvZnRib2R5OiBmYWxzZSxcbiAgICBncmF2aXR5OiBuZXcgVmVjdG9yMygwLCAtMTAwLCAwKVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihXb3JsZE1vZHVsZUJhc2UuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5vYmplY3RzID0ge307XG4gICAgdGhpcy52ZWhpY2xlcyA9IHt9O1xuICAgIHRoaXMuY29uc3RyYWludHMgPSB7fTtcbiAgICB0aGlzLmlzU2ltdWxhdGluZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5nZXRPYmplY3RJZCA9ICgoKSA9PiB7XG4gICAgICBsZXQgaWQgPSAxO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGlkKys7XG4gICAgICB9O1xuICAgIH0pKCk7XG4gIH1cblxuICBzZXR1cCgpIHtcbiAgICB0aGlzLnJlY2VpdmUoZXZlbnQgPT4ge1xuICAgICAgbGV0IF90ZW1wLFxuICAgICAgICBkYXRhID0gZXZlbnQuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciAmJiBkYXRhLmJ5dGVMZW5ndGggIT09IDEpLy8gYnl0ZUxlbmd0aCA9PT0gMSBpcyB0aGUgd29ya2VyIG1ha2luZyBhIFNVUFBPUlRfVFJBTlNGRVJBQkxFIHRlc3RcbiAgICAgICAgZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YSk7XG5cbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgICAgIC8vIHRyYW5zZmVyYWJsZSBvYmplY3RcbiAgICAgICAgc3dpdGNoIChkYXRhWzBdKSB7XG4gICAgICAgICAgY2FzZSBNRVNTQUdFX1RZUEVTLldPUkxEUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVTY2VuZShkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBNRVNTQUdFX1RZUEVTLlNPRlRSRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNvZnRib2RpZXMoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgTUVTU0FHRV9UWVBFUy5DT0xMSVNJT05SRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbGxpc2lvbnMoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgTUVTU0FHRV9UWVBFUy5WRUhJQ0xFUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVWZWhpY2xlcyhkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBNRVNTQUdFX1RZUEVTLkNPTlNUUkFJTlRSRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnN0cmFpbnRzKGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhLmNtZCkge1xuICAgICAgICAvLyBub24tdHJhbnNmZXJhYmxlIG9iamVjdFxuICAgICAgICBzd2l0Y2ggKGRhdGEuY21kKSB7XG4gICAgICAgICAgY2FzZSAnb2JqZWN0UmVhZHknOlxuICAgICAgICAgICAgX3RlbXAgPSBkYXRhLnBhcmFtcztcbiAgICAgICAgICAgIGlmICh0aGlzLm9iamVjdHNbX3RlbXBdKSB0aGlzLm9iamVjdHNbX3RlbXBdLmRpc3BhdGNoRXZlbnQoJ3JlYWR5Jyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3dvcmxkUmVhZHknOlxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZWFkeScpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhbW1vTG9hZGVkJzpcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbG9hZGVkJyk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlBoeXNpY3MgbG9hZGluZyB0aW1lOiBcIiArIChwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3ZlaGljbGUnOlxuICAgICAgICAgICAgd2luZG93LnRlc3QgPSBkYXRhO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gRG8gbm90aGluZywganVzdCBzaG93IHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBSZWNlaXZlZDogJHtkYXRhLmNtZH1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGRhdGEucGFyYW1zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGRhdGFbMF0pIHtcbiAgICAgICAgICBjYXNlIE1FU1NBR0VfVFlQRVMuV09STERSRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjZW5lKGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfVFlQRVMuQ09MTElTSU9OUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xsaXNpb25zKGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfVFlQRVMuVkVISUNMRVJFUE9SVDpcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmVoaWNsZXMoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgTUVTU0FHRV9UWVBFUy5DT05TVFJBSU5UUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb25zdHJhaW50cyhkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVNjZW5lKGluZm8pIHtcbiAgICBsZXQgaW5kZXggPSBpbmZvWzFdO1xuXG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IDIgKyBpbmRleCAqIFJFUE9SVF9JVEVNU0laRTtcbiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tpbmZvW29mZnNldF1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gb2JqZWN0LmNvbXBvbmVudDtcbiAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQudXNlKCdwaHlzaWNzJykuZGF0YTtcblxuICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIGlmIChjb21wb25lbnQuX19kaXJ0eVBvc2l0aW9uID09PSBmYWxzZSkge1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KFxuICAgICAgICAgIGluZm9bb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgaW5mb1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICBpbmZvW29mZnNldCArIDNdXG4gICAgICAgICk7XG5cbiAgICAgICAgY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG9uZW50Ll9fZGlydHlSb3RhdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgb2JqZWN0LnF1YXRlcm5pb24uc2V0KFxuICAgICAgICAgIGluZm9bb2Zmc2V0ICsgNF0sXG4gICAgICAgICAgaW5mb1tvZmZzZXQgKyA1XSxcbiAgICAgICAgICBpbmZvW29mZnNldCArIDZdLFxuICAgICAgICAgIGluZm9bb2Zmc2V0ICsgN11cbiAgICAgICAgKTtcblxuICAgICAgICBjb21wb25lbnQuX19kaXJ0eVJvdGF0aW9uID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGRhdGEubGluZWFyVmVsb2NpdHkuc2V0KFxuICAgICAgICBpbmZvW29mZnNldCArIDhdLFxuICAgICAgICBpbmZvW29mZnNldCArIDldLFxuICAgICAgICBpbmZvW29mZnNldCArIDEwXVxuICAgICAgKTtcblxuICAgICAgZGF0YS5hbmd1bGFyVmVsb2NpdHkuc2V0KFxuICAgICAgICBpbmZvW29mZnNldCArIDExXSxcbiAgICAgICAgaW5mb1tvZmZzZXQgKyAxMl0sXG4gICAgICAgIGluZm9bb2Zmc2V0ICsgMTNdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLlNVUFBPUlRfVFJBTlNGRVJBQkxFKVxuICAgICAgdGhpcy5zZW5kKGluZm8uYnVmZmVyLCBbaW5mby5idWZmZXJdKTsgLy8gR2l2ZSB0aGUgdHlwZWQgYXJyYXkgYmFjayB0byB0aGUgd29ya2VyXG5cbiAgICB0aGlzLmlzU2ltdWxhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgndXBkYXRlJyk7XG4gIH1cblxuICB1cGRhdGVTb2Z0Ym9kaWVzKGluZm8pIHtcbiAgICBsZXQgaW5kZXggPSBpbmZvWzFdLFxuICAgICAgb2Zmc2V0ID0gMjtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBjb25zdCBzaXplID0gaW5mb1tvZmZzZXQgKyAxXTtcbiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tpbmZvW29mZnNldF1dO1xuXG4gICAgICBpZiAob2JqZWN0ID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGF0YSA9IG9iamVjdC5jb21wb25lbnQudXNlKCdwaHlzaWNzJykuZGF0YTtcblxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG9iamVjdC5nZW9tZXRyeS5hdHRyaWJ1dGVzO1xuICAgICAgY29uc3Qgdm9sdW1lUG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuICAgICAgY29uc3Qgb2Zmc2V0VmVydCA9IG9mZnNldCArIDI7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEuaWQpO1xuICAgICAgaWYgKCFkYXRhLmlzU29mdEJvZHlSZXNldCkge1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KDAsIDAsIDApO1xuICAgICAgICBvYmplY3QucXVhdGVybmlvbi5zZXQoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgZGF0YS5pc1NvZnRCb2R5UmVzZXQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSBcInNvZnRUcmltZXNoXCIpIHtcbiAgICAgICAgY29uc3Qgdm9sdW1lTm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmcyA9IG9mZnNldFZlcnQgKyBpICogMTg7XG5cbiAgICAgICAgICBjb25zdCB4MSA9IGluZm9bb2Zmc107XG4gICAgICAgICAgY29uc3QgeTEgPSBpbmZvW29mZnMgKyAxXTtcbiAgICAgICAgICBjb25zdCB6MSA9IGluZm9bb2ZmcyArIDJdO1xuXG4gICAgICAgICAgY29uc3QgbngxID0gaW5mb1tvZmZzICsgM107XG4gICAgICAgICAgY29uc3QgbnkxID0gaW5mb1tvZmZzICsgNF07XG4gICAgICAgICAgY29uc3QgbnoxID0gaW5mb1tvZmZzICsgNV07XG5cbiAgICAgICAgICBjb25zdCB4MiA9IGluZm9bb2ZmcyArIDZdO1xuICAgICAgICAgIGNvbnN0IHkyID0gaW5mb1tvZmZzICsgN107XG4gICAgICAgICAgY29uc3QgejIgPSBpbmZvW29mZnMgKyA4XTtcblxuICAgICAgICAgIGNvbnN0IG54MiA9IGluZm9bb2ZmcyArIDldO1xuICAgICAgICAgIGNvbnN0IG55MiA9IGluZm9bb2ZmcyArIDEwXTtcbiAgICAgICAgICBjb25zdCBuejIgPSBpbmZvW29mZnMgKyAxMV07XG5cbiAgICAgICAgICBjb25zdCB4MyA9IGluZm9bb2ZmcyArIDEyXTtcbiAgICAgICAgICBjb25zdCB5MyA9IGluZm9bb2ZmcyArIDEzXTtcbiAgICAgICAgICBjb25zdCB6MyA9IGluZm9bb2ZmcyArIDE0XTtcblxuICAgICAgICAgIGNvbnN0IG54MyA9IGluZm9bb2ZmcyArIDE1XTtcbiAgICAgICAgICBjb25zdCBueTMgPSBpbmZvW29mZnMgKyAxNl07XG4gICAgICAgICAgY29uc3QgbnozID0gaW5mb1tvZmZzICsgMTddO1xuXG4gICAgICAgICAgY29uc3QgaTkgPSBpICogOTtcblxuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOV0gPSB4MTtcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaTkgKyAxXSA9IHkxO1xuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOSArIDJdID0gejE7XG5cbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaTkgKyAzXSA9IHgyO1xuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOSArIDRdID0geTI7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2k5ICsgNV0gPSB6MjtcblxuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOSArIDZdID0geDM7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2k5ICsgN10gPSB5MztcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaTkgKyA4XSA9IHozO1xuXG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOV0gPSBueDE7XG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOSArIDFdID0gbnkxO1xuICAgICAgICAgIHZvbHVtZU5vcm1hbHNbaTkgKyAyXSA9IG56MTtcblxuICAgICAgICAgIHZvbHVtZU5vcm1hbHNbaTkgKyAzXSA9IG54MjtcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2k5ICsgNF0gPSBueTI7XG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOSArIDVdID0gbnoyO1xuXG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOSArIDZdID0gbngzO1xuICAgICAgICAgIHZvbHVtZU5vcm1hbHNbaTkgKyA3XSA9IG55MztcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2k5ICsgOF0gPSBuejM7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIG9mZnNldCArPSAyICsgc2l6ZSAqIDE4O1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSBcInNvZnRSb3BlTWVzaFwiKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmcyA9IG9mZnNldFZlcnQgKyBpICogMztcblxuICAgICAgICAgIGNvbnN0IHggPSBpbmZvW29mZnNdO1xuICAgICAgICAgIGNvbnN0IHkgPSBpbmZvW29mZnMgKyAxXTtcbiAgICAgICAgICBjb25zdCB6ID0gaW5mb1tvZmZzICsgMl07XG5cbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDNdID0geDtcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDMgKyAxXSA9IHk7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2kgKiAzICsgMl0gPSB6O1xuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0ICs9IDIgKyBzaXplICogMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbHVtZU5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9mZnMgPSBvZmZzZXRWZXJ0ICsgaSAqIDY7XG5cbiAgICAgICAgICBjb25zdCB4ID0gaW5mb1tvZmZzXTtcbiAgICAgICAgICBjb25zdCB5ID0gaW5mb1tvZmZzICsgMV07XG4gICAgICAgICAgY29uc3QgeiA9IGluZm9bb2ZmcyArIDJdO1xuXG4gICAgICAgICAgY29uc3QgbnggPSBpbmZvW29mZnMgKyAzXTtcbiAgICAgICAgICBjb25zdCBueSA9IGluZm9bb2ZmcyArIDRdO1xuICAgICAgICAgIGNvbnN0IG56ID0gaW5mb1tvZmZzICsgNV07XG5cbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDNdID0geDtcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDMgKyAxXSA9IHk7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2kgKiAzICsgMl0gPSB6O1xuXG4gICAgICAgICAgLy8gRklYTUU6IE5vcm1hbHMgYXJlIHBvaW50ZWQgdG8gbG9vayBpbnNpZGU7XG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpICogM10gPSBueDtcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2kgKiAzICsgMV0gPSBueTtcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2kgKiAzICsgMl0gPSBuejtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgb2Zmc2V0ICs9IDIgKyBzaXplICogNjtcbiAgICAgIH1cblxuICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgKHRoaXMuU1VQUE9SVF9UUkFOU0ZFUkFCTEUpXG4gICAgLy8gICB0aGlzLnNlbmQoaW5mby5idWZmZXIsIFtpbmZvLmJ1ZmZlcl0pOyAvLyBHaXZlIHRoZSB0eXBlZCBhcnJheSBiYWNrIHRvIHRoZSB3b3JrZXJcblxuICAgIHRoaXMuaXNTaW11bGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICB1cGRhdGVWZWhpY2xlcyhkYXRhKSB7XG4gICAgbGV0IHZlaGljbGUsIHdoZWVsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoZGF0YS5sZW5ndGggLSAxKSAvIFZFSElDTEVSRVBPUlRfSVRFTVNJWkU7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMSArIGkgKiBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFO1xuICAgICAgdmVoaWNsZSA9IHRoaXMudmVoaWNsZXNbZGF0YVtvZmZzZXRdXTtcblxuICAgICAgaWYgKHZlaGljbGUgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICB3aGVlbCA9IHZlaGljbGUud2hlZWxzW2RhdGFbb2Zmc2V0ICsgMV1dO1xuXG4gICAgICB3aGVlbC5wb3NpdGlvbi5zZXQoXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgMl0sXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgM10sXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgNF1cbiAgICAgICk7XG5cbiAgICAgIHdoZWVsLnF1YXRlcm5pb24uc2V0KFxuICAgICAgICBkYXRhW29mZnNldCArIDVdLFxuICAgICAgICBkYXRhW29mZnNldCArIDZdLFxuICAgICAgICBkYXRhW29mZnNldCArIDddLFxuICAgICAgICBkYXRhW29mZnNldCArIDhdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLlNVUFBPUlRfVFJBTlNGRVJBQkxFKVxuICAgICAgdGhpcy5zZW5kKGRhdGEuYnVmZmVyLCBbZGF0YS5idWZmZXJdKTsgLy8gR2l2ZSB0aGUgdHlwZWQgYXJyYXkgYmFjayB0byB0aGUgd29ya2VyXG4gIH1cblxuICB1cGRhdGVDb25zdHJhaW50cyhkYXRhKSB7XG4gICAgbGV0IGNvbnN0cmFpbnQsIG9iamVjdDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGRhdGEubGVuZ3RoIC0gMSkgLyBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFOyBpKyspIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IDEgKyBpICogQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRTtcbiAgICAgIGNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnRzW2RhdGFbb2Zmc2V0XV07XG4gICAgICBvYmplY3QgPSB0aGlzLm9iamVjdHNbZGF0YVtvZmZzZXQgKyAxXV07XG5cbiAgICAgIGlmIChjb25zdHJhaW50ID09PSB1bmRlZmluZWQgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICB0ZW1wMVZlY3RvcjMuc2V0KFxuICAgICAgICBkYXRhW29mZnNldCArIDJdLFxuICAgICAgICBkYXRhW29mZnNldCArIDNdLFxuICAgICAgICBkYXRhW29mZnNldCArIDRdXG4gICAgICApO1xuXG4gICAgICB0ZW1wMU1hdHJpeDQuZXh0cmFjdFJvdGF0aW9uKG9iamVjdC5tYXRyaXgpO1xuICAgICAgdGVtcDFWZWN0b3IzLmFwcGx5TWF0cml4NCh0ZW1wMU1hdHJpeDQpO1xuXG4gICAgICBjb25zdHJhaW50LnBvc2l0aW9uYS5hZGRWZWN0b3JzKG9iamVjdC5wb3NpdGlvbiwgdGVtcDFWZWN0b3IzKTtcbiAgICAgIGNvbnN0cmFpbnQuYXBwbGllZEltcHVsc2UgPSBkYXRhW29mZnNldCArIDVdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLlNVUFBPUlRfVFJBTlNGRVJBQkxFKVxuICAgICAgdGhpcy5zZW5kKGRhdGEuYnVmZmVyLCBbZGF0YS5idWZmZXJdKTsgLy8gR2l2ZSB0aGUgdHlwZWQgYXJyYXkgYmFjayB0byB0aGUgd29ya2VyXG4gIH1cblxuICB1cGRhdGVDb2xsaXNpb25zKGluZm8pIHtcbiAgICAvKipcbiAgICAgKiAjVE9ET1xuICAgICAqIFRoaXMgaXMgcHJvYmFibHkgdGhlIHdvcnN0IHdheSBldmVyIHRvIGhhbmRsZSBjb2xsaXNpb25zLiBUaGUgaW5oZXJlbnQgZXZpbG5lc3MgaXMgYSByZXNpZHVhbFxuICAgICAqIGVmZmVjdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uJ3MgZXZpbG5lc3Mgd2hpY2ggbXV0YXRlZCB3aGVuIHN3aXRjaGluZyB0byB0cmFuc2ZlcmFibGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIElmIHlvdSBmZWVsIGluY2xpbmVkIHRvIG1ha2UgdGhpcyBiZXR0ZXIsIHBsZWFzZSBkbyBzby5cbiAgICAgKi9cblxuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSB7fSxcbiAgICAgIG5vcm1hbF9vZmZzZXRzID0ge307XG5cbiAgICAvLyBCdWlsZCBjb2xsaXNpb24gbWFuaWZlc3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZm9bMV07IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMiArIGkgKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkU7XG4gICAgICBjb25zdCBvYmplY3QgPSBpbmZvW29mZnNldF07XG4gICAgICBjb25zdCBvYmplY3QyID0gaW5mb1tvZmZzZXQgKyAxXTtcblxuICAgICAgbm9ybWFsX29mZnNldHNbYCR7b2JqZWN0fS0ke29iamVjdDJ9YF0gPSBvZmZzZXQgKyAyO1xuICAgICAgbm9ybWFsX29mZnNldHNbYCR7b2JqZWN0Mn0tJHtvYmplY3R9YF0gPSAtMSAqIChvZmZzZXQgKyAyKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgY29sbGlzaW9ucyBmb3IgYm90aCB0aGUgb2JqZWN0IGNvbGxpZGluZyBhbmQgdGhlIG9iamVjdCBiZWluZyBjb2xsaWRlZCB3aXRoXG4gICAgICBpZiAoIWNvbGxpc2lvbnNbb2JqZWN0XSkgY29sbGlzaW9uc1tvYmplY3RdID0gW107XG4gICAgICBjb2xsaXNpb25zW29iamVjdF0ucHVzaChvYmplY3QyKTtcblxuICAgICAgaWYgKCFjb2xsaXNpb25zW29iamVjdDJdKSBjb2xsaXNpb25zW29iamVjdDJdID0gW107XG4gICAgICBjb2xsaXNpb25zW29iamVjdDJdLnB1c2gob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyBEZWFsIHdpdGggY29sbGlzaW9uc1xuICAgIGZvciAoY29uc3QgaWQxIGluIHRoaXMub2JqZWN0cykge1xuICAgICAgaWYgKCF0aGlzLm9iamVjdHMuaGFzT3duUHJvcGVydHkoaWQxKSkgY29udGludWU7XG4gICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbaWQxXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG9iamVjdC5jb21wb25lbnQ7XG4gICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGE7XG5cbiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBJZiBvYmplY3QgdG91Y2hlcyBhbnl0aGluZywgLi4uXG4gICAgICBpZiAoY29sbGlzaW9uc1tpZDFdKSB7XG4gICAgICAgIC8vIENsZWFuIHVwIHRvdWNoZXMgYXJyYXlcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkYXRhLnRvdWNoZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAoY29sbGlzaW9uc1tpZDFdLmluZGV4T2YoZGF0YS50b3VjaGVzW2pdKSA9PT0gLTEpXG4gICAgICAgICAgICBkYXRhLnRvdWNoZXMuc3BsaWNlKGotLSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWFjaCBjb2xsaWRpbmcgb2JqZWN0XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sbGlzaW9uc1tpZDFdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgaWQyID0gY29sbGlzaW9uc1tpZDFdW2pdO1xuICAgICAgICAgIGNvbnN0IG9iamVjdDIgPSB0aGlzLm9iamVjdHNbaWQyXTtcblxuICAgICAgICAgIGlmIChvYmplY3QyKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQyID0gb2JqZWN0Mi5jb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBkYXRhMiA9IGNvbXBvbmVudDIudXNlKCdwaHlzaWNzJykuZGF0YTtcbiAgICAgICAgICAgIC8vIElmIG9iamVjdCB3YXMgbm90IGFscmVhZHkgdG91Y2hpbmcgb2JqZWN0Miwgbm90aWZ5IG9iamVjdFxuICAgICAgICAgICAgaWYgKGRhdGEudG91Y2hlcy5pbmRleE9mKGlkMikgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGRhdGEudG91Y2hlcy5wdXNoKGlkMik7XG5cbiAgICAgICAgICAgICAgY29uc3QgdmVsID0gY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmdldExpbmVhclZlbG9jaXR5KCk7XG4gICAgICAgICAgICAgIGNvbnN0IHZlbDIgPSBjb21wb25lbnQyLnVzZSgncGh5c2ljcycpLmdldExpbmVhclZlbG9jaXR5KCk7XG5cbiAgICAgICAgICAgICAgdGVtcDFWZWN0b3IzLnN1YlZlY3RvcnModmVsLCB2ZWwyKTtcbiAgICAgICAgICAgICAgY29uc3QgdGVtcDEgPSB0ZW1wMVZlY3RvcjMuY2xvbmUoKTtcblxuICAgICAgICAgICAgICB0ZW1wMVZlY3RvcjMuc3ViVmVjdG9ycyh2ZWwsIHZlbDIpO1xuICAgICAgICAgICAgICBjb25zdCB0ZW1wMiA9IHRlbXAxVmVjdG9yMy5jbG9uZSgpO1xuXG4gICAgICAgICAgICAgIGxldCBub3JtYWxfb2Zmc2V0ID0gbm9ybWFsX29mZnNldHNbYCR7ZGF0YS5pZH0tJHtkYXRhMi5pZH1gXTtcblxuICAgICAgICAgICAgICBpZiAobm9ybWFsX29mZnNldCA+IDApIHtcbiAgICAgICAgICAgICAgICB0ZW1wMVZlY3RvcjMuc2V0KFxuICAgICAgICAgICAgICAgICAgLWluZm9bbm9ybWFsX29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAtaW5mb1tub3JtYWxfb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAtaW5mb1tub3JtYWxfb2Zmc2V0ICsgMl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vcm1hbF9vZmZzZXQgKj0gLTE7XG5cbiAgICAgICAgICAgICAgICB0ZW1wMVZlY3RvcjMuc2V0KFxuICAgICAgICAgICAgICAgICAgaW5mb1tub3JtYWxfb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICAgIGluZm9bbm9ybWFsX29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgaW5mb1tub3JtYWxfb2Zmc2V0ICsgMl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQoJ2NvbGxpc2lvbicsIG9iamVjdDIsIHRlbXAxLCB0ZW1wMiwgdGVtcDFWZWN0b3IzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBkYXRhLnRvdWNoZXMubGVuZ3RoID0gMDsgLy8gbm90IHRvdWNoaW5nIG90aGVyIG9iamVjdHNcbiAgICB9XG5cbiAgICB0aGlzLmNvbGxpc2lvbnMgPSBjb2xsaXNpb25zO1xuXG4gICAgaWYgKHRoaXMuU1VQUE9SVF9UUkFOU0ZFUkFCTEUpXG4gICAgICB0aGlzLnNlbmQoaW5mby5idWZmZXIsIFtpbmZvLmJ1ZmZlcl0pOyAvLyBHaXZlIHRoZSB0eXBlZCBhcnJheSBiYWNrIHRvIHRoZSB3b3JrZXJcbiAgfVxuXG4gIGFkZENvbnN0cmFpbnQoY29uc3RyYWludCwgc2hvd19tYXJrZXIpIHtcbiAgICBjb25zdHJhaW50LmlkID0gdGhpcy5nZXRPYmplY3RJZCgpO1xuICAgIHRoaXMuY29uc3RyYWludHNbY29uc3RyYWludC5pZF0gPSBjb25zdHJhaW50O1xuICAgIGNvbnN0cmFpbnQud29ybGRNb2R1bGUgPSB0aGlzO1xuICAgIHRoaXMuZXhlY3V0ZSgnYWRkQ29uc3RyYWludCcsIGNvbnN0cmFpbnQuZ2V0RGVmaW5pdGlvbigpKTtcblxuICAgIGlmIChzaG93X21hcmtlcikge1xuICAgICAgbGV0IG1hcmtlcjtcblxuICAgICAgc3dpdGNoIChjb25zdHJhaW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAncG9pbnQnOlxuICAgICAgICAgIG1hcmtlciA9IG5ldyBNZXNoKFxuICAgICAgICAgICAgbmV3IFNwaGVyZUdlb21ldHJ5KDEuNSksXG4gICAgICAgICAgICBuZXcgTWVzaE5vcm1hbE1hdGVyaWFsKClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbWFya2VyLnBvc2l0aW9uLmNvcHkoY29uc3RyYWludC5wb3NpdGlvbmEpO1xuICAgICAgICAgIHRoaXMub2JqZWN0c1tjb25zdHJhaW50Lm9iamVjdGFdLmFkZChtYXJrZXIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2hpbmdlJzpcbiAgICAgICAgICBtYXJrZXIgPSBuZXcgTWVzaChcbiAgICAgICAgICAgIG5ldyBTcGhlcmVHZW9tZXRyeSgxLjUpLFxuICAgICAgICAgICAgbmV3IE1lc2hOb3JtYWxNYXRlcmlhbCgpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG1hcmtlci5wb3NpdGlvbi5jb3B5KGNvbnN0cmFpbnQucG9zaXRpb25hKTtcbiAgICAgICAgICB0aGlzLm9iamVjdHNbY29uc3RyYWludC5vYmplY3RhXS5hZGQobWFya2VyKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgIG1hcmtlciA9IG5ldyBNZXNoKFxuICAgICAgICAgICAgbmV3IEJveEdlb21ldHJ5KDEwLCAxLCAxKSxcbiAgICAgICAgICAgIG5ldyBNZXNoTm9ybWFsTWF0ZXJpYWwoKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBtYXJrZXIucG9zaXRpb24uY29weShjb25zdHJhaW50LnBvc2l0aW9uYSk7XG5cbiAgICAgICAgICAvLyBUaGlzIHJvdGF0aW9uIGlzbid0IHJpZ2h0IGlmIGFsbCB0aHJlZSBheGlzIGFyZSBub24tMCB2YWx1ZXNcbiAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgbWFya2VyJ3Mgcm90YXRpb24gb3JkZXIgdG8gWllYXG4gICAgICAgICAgbWFya2VyLnJvdGF0aW9uLnNldChcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuYXhpcy55LCAvLyB5ZXMsIHkgYW5kXG4gICAgICAgICAgICBjb25zdHJhaW50LmF4aXMueCwgLy8geCBheGlzIGFyZSBzd2FwcGVkXG4gICAgICAgICAgICBjb25zdHJhaW50LmF4aXMuelxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5vYmplY3RzW2NvbnN0cmFpbnQub2JqZWN0YV0uYWRkKG1hcmtlcik7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY29uZXR3aXN0JzpcbiAgICAgICAgICBtYXJrZXIgPSBuZXcgTWVzaChcbiAgICAgICAgICAgIG5ldyBTcGhlcmVHZW9tZXRyeSgxLjUpLFxuICAgICAgICAgICAgbmV3IE1lc2hOb3JtYWxNYXRlcmlhbCgpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG1hcmtlci5wb3NpdGlvbi5jb3B5KGNvbnN0cmFpbnQucG9zaXRpb25hKTtcbiAgICAgICAgICB0aGlzLm9iamVjdHNbY29uc3RyYWludC5vYmplY3RhXS5hZGQobWFya2VyKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdkb2YnOlxuICAgICAgICAgIG1hcmtlciA9IG5ldyBNZXNoKFxuICAgICAgICAgICAgbmV3IFNwaGVyZUdlb21ldHJ5KDEuNSksXG4gICAgICAgICAgICBuZXcgTWVzaE5vcm1hbE1hdGVyaWFsKClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbWFya2VyLnBvc2l0aW9uLmNvcHkoY29uc3RyYWludC5wb3NpdGlvbmEpO1xuICAgICAgICAgIHRoaXMub2JqZWN0c1tjb25zdHJhaW50Lm9iamVjdGFdLmFkZChtYXJrZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25zdHJhaW50O1xuICB9XG5cbiAgb25TaW11bGF0aW9uUmVzdW1lKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgnb25TaW11bGF0aW9uUmVzdW1lJywge30pO1xuICB9XG5cbiAgcmVtb3ZlQ29uc3RyYWludChjb25zdHJhaW50KSB7XG4gICAgaWYgKHRoaXMuY29uc3RyYWludHNbY29uc3RyYWludC5pZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5leGVjdXRlKCdyZW1vdmVDb25zdHJhaW50Jywge2lkOiBjb25zdHJhaW50LmlkfSk7XG4gICAgICBkZWxldGUgdGhpcy5jb25zdHJhaW50c1tjb25zdHJhaW50LmlkXTtcbiAgICB9XG4gIH1cblxuICBleGVjdXRlKGNtZCwgcGFyYW1zKSB7XG4gICAgdGhpcy5zZW5kKHtjbWQsIHBhcmFtc30pO1xuICB9XG5cbiAgb25BZGRDYWxsYmFjayhjb21wb25lbnQpIHtcbiAgICBjb25zdCBvYmplY3QgPSBjb21wb25lbnQubmF0aXZlO1xuICAgIGNvbnN0IGRhdGEgPSBvYmplY3QuY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGE7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgY29tcG9uZW50Lm1hbmFnZXIuc2V0KCdtb2R1bGU6d29ybGQnLCB0aGlzKTtcbiAgICAgIGRhdGEuaWQgPSB0aGlzLmdldE9iamVjdElkKCk7XG4gICAgICBvYmplY3QuY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGEgPSBkYXRhO1xuXG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVmVoaWNsZSkge1xuICAgICAgICB0aGlzLm9uQWRkQ2FsbGJhY2sob2JqZWN0Lm1lc2gpO1xuICAgICAgICB0aGlzLnZlaGljbGVzW2RhdGEuaWRdID0gb2JqZWN0O1xuICAgICAgICB0aGlzLmV4ZWN1dGUoJ2FkZFZlaGljbGUnLCBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5fX2RpcnR5UG9zaXRpb24gPSBmYWxzZTtcbiAgICAgICAgY29tcG9uZW50Ll9fZGlydHlSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9iamVjdHNbZGF0YS5pZF0gPSBvYmplY3Q7XG5cbiAgICAgICAgaWYgKG9iamVjdC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBkYXRhLmNoaWxkcmVuID0gW107XG4gICAgICAgICAgYWRkT2JqZWN0Q2hpbGRyZW4ob2JqZWN0LCBvYmplY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb2JqZWN0LnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKG9iamVjdC5yb3RhdGlvbik7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9iamVjdC5jb21wb25lbnQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvYmplY3Qucm90YXRpb24pO1xuXG4gICAgICAgIC8vIE9iamVjdCBzdGFydGluZyBwb3NpdGlvbiArIHJvdGF0aW9uXG4gICAgICAgIGRhdGEucG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogb2JqZWN0LnBvc2l0aW9uLngsXG4gICAgICAgICAgeTogb2JqZWN0LnBvc2l0aW9uLnksXG4gICAgICAgICAgejogb2JqZWN0LnBvc2l0aW9uLnpcbiAgICAgICAgfTtcblxuICAgICAgICBkYXRhLnJvdGF0aW9uID0ge1xuICAgICAgICAgIHg6IG9iamVjdC5xdWF0ZXJuaW9uLngsXG4gICAgICAgICAgeTogb2JqZWN0LnF1YXRlcm5pb24ueSxcbiAgICAgICAgICB6OiBvYmplY3QucXVhdGVybmlvbi56LFxuICAgICAgICAgIHc6IG9iamVjdC5xdWF0ZXJuaW9uLndcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGF0YS53aWR0aCkgZGF0YS53aWR0aCAqPSBvYmplY3Quc2NhbGUueDtcbiAgICAgICAgaWYgKGRhdGEuaGVpZ2h0KSBkYXRhLmhlaWdodCAqPSBvYmplY3Quc2NhbGUueTtcbiAgICAgICAgaWYgKGRhdGEuZGVwdGgpIGRhdGEuZGVwdGggKj0gb2JqZWN0LnNjYWxlLno7XG5cbiAgICAgICAgdGhpcy5leGVjdXRlKCdhZGRPYmplY3QnLCBkYXRhKTtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQoJ3BoeXNpY3M6YWRkZWQnKTtcbiAgICB9XG4gIH1cblxuICBvblJlbW92ZUNhbGxiYWNrKGNvbXBvbmVudCkge1xuICAgIGNvbnN0IG9iamVjdCA9IGNvbXBvbmVudC5uYXRpdmU7XG5cbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVmVoaWNsZSkge1xuICAgICAgdGhpcy5leGVjdXRlKCdyZW1vdmVWZWhpY2xlJywge2lkOiBvYmplY3QuX3BoeXNpanMuaWR9KTtcbiAgICAgIHdoaWxlIChvYmplY3Qud2hlZWxzLmxlbmd0aCkgdGhpcy5yZW1vdmUob2JqZWN0LndoZWVscy5wb3AoKSk7XG5cbiAgICAgIHRoaXMucmVtb3ZlKG9iamVjdC5tZXNoKTtcbiAgICAgIHRoaXMudmVoaWNsZXNbb2JqZWN0Ll9waHlzaWpzLmlkXSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1lc2gucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMsIG9iamVjdCk7XG5cbiAgICAgIGlmIChvYmplY3QuX3BoeXNpanMpIHtcbiAgICAgICAgY29tcG9uZW50Lm1hbmFnZXIucmVtb3ZlKCdtb2R1bGU6d29ybGQnKTtcbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdC5fcGh5c2lqcy5pZF0gPSBudWxsO1xuICAgICAgICB0aGlzLmV4ZWN1dGUoJ3JlbW92ZU9iamVjdCcsIHtpZDogb2JqZWN0Ll9waHlzaWpzLmlkfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVmZXIoZnVuYywgYXJncykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNMb2FkZWQpIHtcbiAgICAgICAgZnVuYyguLi5hcmdzKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHRoaXMubG9hZGVyLnRoZW4oKCkgPT4ge1xuICAgICAgICBmdW5jKC4uLmFyZ3MpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdwaHlzaWNzJyk7XG4gICAgbWFuYWdlci5zZXQoJ3BoeXNpY3NXb3JrZXInLCB0aGlzLndvcmtlcik7XG4gIH1cblxuICBicmlkZ2UgPSB7XG4gICAgb25BZGQoY29tcG9uZW50LCBzZWxmKSB7XG4gICAgICBpZiAoY29tcG9uZW50LnVzZSgncGh5c2ljcycpKSByZXR1cm4gc2VsZi5kZWZlcihzZWxmLm9uQWRkQ2FsbGJhY2suYmluZChzZWxmKSwgW2NvbXBvbmVudF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0sXG5cbiAgICBvblJlbW92ZShjb21wb25lbnQsIHNlbGYpIHtcbiAgICAgIGlmIChjb21wb25lbnQudXNlKCdwaHlzaWNzJykpIHJldHVybiBzZWxmLmRlZmVyKHNlbGYub25SZW1vdmVDYWxsYmFjay5iaW5kKHNlbGYpLCBbY29tcG9uZW50XSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgLy8gLi4uXG5cbiAgICB0aGlzLnNldEZpeGVkVGltZVN0ZXAgPSBmdW5jdGlvbihmaXhlZFRpbWVTdGVwKSB7XG4gICAgICBpZiAoZml4ZWRUaW1lU3RlcCkgc2VsZi5leGVjdXRlKCdzZXRGaXhlZFRpbWVTdGVwJywgZml4ZWRUaW1lU3RlcCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRHcmF2aXR5ID0gZnVuY3Rpb24oZ3Jhdml0eSkge1xuICAgICAgaWYgKGdyYXZpdHkpIHNlbGYuZXhlY3V0ZSgnc2V0R3Jhdml0eScsIGdyYXZpdHkpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ29uc3RyYWludCA9IHNlbGYuYWRkQ29uc3RyYWludC5iaW5kKHNlbGYpO1xuXG4gICAgdGhpcy5zaW11bGF0ZSA9IGZ1bmN0aW9uKHRpbWVTdGVwLCBtYXhTdWJTdGVwcykge1xuICAgICAgaWYgKHNlbGYuX3N0YXRzKSBzZWxmLl9zdGF0cy5iZWdpbigpO1xuXG4gICAgICBpZiAoc2VsZi5pc1NpbXVsYXRpbmcpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlbGYuaXNTaW11bGF0aW5nID0gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBvYmplY3RfaWQgaW4gc2VsZi5vYmplY3RzKSB7XG4gICAgICAgIGlmICghc2VsZi5vYmplY3RzLmhhc093blByb3BlcnR5KG9iamVjdF9pZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHNlbGYub2JqZWN0c1tvYmplY3RfaWRdO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBvYmplY3QuY29tcG9uZW50O1xuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGE7XG5cbiAgICAgICAgaWYgKG9iamVjdCAhPT0gbnVsbCAmJiAoY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbiB8fCBjb21wb25lbnQuX19kaXJ0eVJvdGF0aW9uKSkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IHtpZDogZGF0YS5pZH07XG5cbiAgICAgICAgICBpZiAoY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbikge1xuICAgICAgICAgICAgdXBkYXRlLnBvcyA9IHtcbiAgICAgICAgICAgICAgeDogb2JqZWN0LnBvc2l0aW9uLngsXG4gICAgICAgICAgICAgIHk6IG9iamVjdC5wb3NpdGlvbi55LFxuICAgICAgICAgICAgICB6OiBvYmplY3QucG9zaXRpb24uelxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGRhdGEuaXNTb2Z0Ym9keSkgb2JqZWN0LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcblxuICAgICAgICAgICAgY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb21wb25lbnQuX19kaXJ0eVJvdGF0aW9uKSB7XG4gICAgICAgICAgICB1cGRhdGUucXVhdCA9IHtcbiAgICAgICAgICAgICAgeDogb2JqZWN0LnF1YXRlcm5pb24ueCxcbiAgICAgICAgICAgICAgeTogb2JqZWN0LnF1YXRlcm5pb24ueSxcbiAgICAgICAgICAgICAgejogb2JqZWN0LnF1YXRlcm5pb24ueixcbiAgICAgICAgICAgICAgdzogb2JqZWN0LnF1YXRlcm5pb24ud1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGRhdGEuaXNTb2Z0Ym9keSkgb2JqZWN0LnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcblxuICAgICAgICAgICAgY29tcG9uZW50Ll9fZGlydHlSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuZXhlY3V0ZSgndXBkYXRlVHJhbnNmb3JtJywgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZWxmLmV4ZWN1dGUoJ3NpbXVsYXRlJywge3RpbWVTdGVwLCBtYXhTdWJTdGVwc30pO1xuXG4gICAgICBpZiAoc2VsZi5fc3RhdHMpIHNlbGYuX3N0YXRzLmVuZCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gY29uc3Qgc2ltdWxhdGVQcm9jZXNzID0gKHQpID0+IHtcbiAgICAvLyAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc2ltdWxhdGVQcm9jZXNzKTtcblxuICAgIC8vICAgdGhpcy5zaW11bGF0ZSgxLzYwLCAxKTsgLy8gZGVsdGEsIDFcbiAgICAvLyB9XG5cbiAgICAvLyBzaW11bGF0ZVByb2Nlc3MoKTtcblxuICAgIHNlbGYubG9hZGVyLnRoZW4oKCkgPT4ge1xuICAgICAgc2VsZi5zaW11bGF0ZUxvb3AgPSBuZXcgTG9vcCgoY2xvY2spID0+IHtcbiAgICAgICAgdGhpcy5zaW11bGF0ZShjbG9jay5nZXREZWx0YSgpLCAxKTsgLy8gZGVsdGEsIDFcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLnNpbXVsYXRlTG9vcC5zdGFydCh0aGlzKTtcblxuICAgICAgY29uc29sZS5sb2coc2VsZi5vcHRpb25zLmdyYXZpdHkpO1xuICAgICAgdGhpcy5zZXRHcmF2aXR5KHNlbGYub3B0aW9ucy5ncmF2aXR5KTtcbiAgICB9KTtcbiAgfVxufVxuIiwidmFyIFRBUkdFVCA9IHR5cGVvZiBTeW1ib2wgPT09ICd1bmRlZmluZWQnID8gJ19fdGFyZ2V0JyA6IFN5bWJvbCgpLFxuICAgIFNDUklQVF9UWVBFID0gJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLFxuICAgIEJsb2JCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXIsXG4gICAgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMLFxuICAgIFdvcmtlciA9IHdpbmRvdy5Xb3JrZXI7XG5cbi8qKlxuICogUmV0dXJucyBhIHdyYXBwZXIgYXJvdW5kIFdlYiBXb3JrZXIgY29kZSB0aGF0IGlzIGNvbnN0cnVjdGlibGUuXG4gKlxuICogQGZ1bmN0aW9uIHNoaW1Xb3JrZXJcbiAqXG4gKiBAcGFyYW0geyBTdHJpbmcgfSAgICBmaWxlbmFtZSAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHsgRnVuY3Rpb24gfSAgZm4gICAgICAgICAgRnVuY3Rpb24gd3JhcHBpbmcgdGhlIGNvZGUgb2YgdGhlIHdvcmtlclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGltV29ya2VyIChmaWxlbmFtZSwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gU2hpbVdvcmtlciAoZm9yY2VGYWxsYmFjaykge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCFmbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JrZXIoZmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFdvcmtlciAmJiAhZm9yY2VGYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgZnVuY3Rpb24ncyBpbm5lciBjb2RlIHRvIGEgc3RyaW5nIHRvIGNvbnN0cnVjdCB0aGUgd29ya2VyXG4gICAgICAgICAgICB2YXIgc291cmNlID0gZm4udG9TdHJpbmcoKS5yZXBsYWNlKC9eZnVuY3Rpb24uKz97LywgJycpLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICAgICAgICBvYmpVUkwgPSBjcmVhdGVTb3VyY2VPYmplY3Qoc291cmNlKTtcblxuICAgICAgICAgICAgdGhpc1tUQVJHRVRdID0gbmV3IFdvcmtlcihvYmpVUkwpO1xuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmpVUkwpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbVEFSR0VUXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzZWxmU2hpbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgby5vbm1lc3NhZ2UoeyBkYXRhOiBtLCB0YXJnZXQ6IHNlbGZTaGltIH0pIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm4uY2FsbChzZWxmU2hpbSk7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24obSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgc2VsZlNoaW0ub25tZXNzYWdlKHsgZGF0YTogbSwgdGFyZ2V0OiBvIH0pIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuaXNUaGlzVGhyZWFkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG4vLyBUZXN0IFdvcmtlciBjYXBhYmlsaXRpZXNcbmlmIChXb3JrZXIpIHtcbiAgICB2YXIgdGVzdFdvcmtlcixcbiAgICAgICAgb2JqVVJMID0gY3JlYXRlU291cmNlT2JqZWN0KCdzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHt9JyksXG4gICAgICAgIHRlc3RBcnJheSA9IG5ldyBVaW50OEFycmF5KDEpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gTm8gd29ya2VycyB2aWEgYmxvYnMgaW4gRWRnZSAxMiBhbmQgSUUgMTEgYW5kIGxvd2VyIDooXG4gICAgICAgIGlmICgvKD86VHJpZGVudHxFZGdlKVxcLyg/Ols1NjddfDEyKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHRlc3RXb3JrZXIgPSBuZXcgV29ya2VyKG9ialVSTCk7XG5cbiAgICAgICAgLy8gTmF0aXZlIGJyb3dzZXIgb24gc29tZSBTYW1zdW5nIGRldmljZXMgdGhyb3dzIGZvciB0cmFuc2ZlcmFibGVzLCBsZXQncyBkZXRlY3QgaXRcbiAgICAgICAgdGVzdFdvcmtlci5wb3N0TWVzc2FnZSh0ZXN0QXJyYXksIFt0ZXN0QXJyYXkuYnVmZmVyXSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIFdvcmtlciA9IG51bGw7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9ialVSTCk7XG4gICAgICAgIGlmICh0ZXN0V29ya2VyKSB7XG4gICAgICAgICAgICB0ZXN0V29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTb3VyY2VPYmplY3Qoc3RyKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3N0cl0sIHsgdHlwZTogU0NSSVBUX1RZUEUgfSkpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iQnVpbGRlcigpO1xuICAgICAgICBibG9iLmFwcGVuZChzdHIpO1xuICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iLmdldEJsb2IodHlwZSkpO1xuICAgIH1cbn1cbiIsImltcG9ydCBzaGltV29ya2VyIGZyb20gJ3JvbGx1cC1wbHVnaW4tYnVuZGxlLXdvcmtlcic7XG5leHBvcnQgZGVmYXVsdCBuZXcgc2hpbVdvcmtlcihcIi4uL3dvcmtlci5qc1wiLCBmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xudmFyIHNlbGYgPSB0aGlzO1xuZnVuY3Rpb24gRXZlbnRzKHRhcmdldCkge1xuICB2YXIgZXZlbnRzID0ge30sXG4gICAgZW1wdHkgPSBbXTtcbiAgdGFyZ2V0ID0gdGFyZ2V0IHx8IHRoaXNcbiAgLyoqXG4gICAqICBPbjogbGlzdGVuIHRvIGV2ZW50c1xuICAgKi9cbiAgdGFyZ2V0Lm9uID0gZnVuY3Rpb24gKHR5cGUsIGZ1bmMsIGN0eCkge1xuICAgIChldmVudHNbdHlwZV0gPSBldmVudHNbdHlwZV0gfHwgW10pLnB1c2goW2Z1bmMsIGN0eF0pXG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG4gIC8qKlxuICAgKiAgT2ZmOiBzdG9wIGxpc3RlbmluZyB0byBldmVudCAvIHNwZWNpZmljIGNhbGxiYWNrXG4gICAqL1xuICB0YXJnZXQub2ZmID0gZnVuY3Rpb24gKHR5cGUsIGZ1bmMpIHtcbiAgICB0eXBlIHx8IChldmVudHMgPSB7fSlcbiAgICB2YXIgbGlzdCA9IGV2ZW50c1t0eXBlXSB8fCBlbXB0eSxcbiAgICAgIGkgPSBsaXN0Lmxlbmd0aCA9IGZ1bmMgPyBsaXN0Lmxlbmd0aCA6IDA7XG4gICAgd2hpbGUgKGktLSkgZnVuYyA9PSBsaXN0W2ldWzBdICYmIGxpc3Quc3BsaWNlKGksIDEpXG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG4gIC8qKlxuICAgKiBFbWl0OiBzZW5kIGV2ZW50LCBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWRcbiAgICovXG4gIHRhcmdldC5lbWl0ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICB2YXIgZSA9IGV2ZW50c1t0eXBlXSB8fCBlbXB0eSxcbiAgICAgIGxpc3QgPSBlLmxlbmd0aCA+IDAgPyBlLnNsaWNlKDAsIGUubGVuZ3RoKSA6IGUsXG4gICAgICBpID0gMCxcbiAgICAgIGo7XG4gICAgd2hpbGUgKGogPSBsaXN0W2krK10pIGpbMF0uYXBwbHkoalsxXSwgZW1wdHkuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICAgIHJldHVybiB0YXJnZXRcbiAgfTtcbn07XG5cbmNvbnN0IGluc2lkZVdvcmtlciA9ICFzZWxmLmRvY3VtZW50O1xuaWYgKCFpbnNpZGVXb3JrZXIpIHNlbGYgPSBuZXcgRXZlbnRzKCk7XG5cbmxldCBzZW5kID0gaW5zaWRlV29ya2VyID8gKHNlbGYud2Via2l0UG9zdE1lc3NhZ2UgfHwgc2VsZi5wb3N0TWVzc2FnZSkgOiBmdW5jdGlvbiAoZGF0YSkge1xuICBzZWxmLmVtaXQoJ21lc3NhZ2UnLCB7IGRhdGEgfSk7XG59O1xuXG5zZWxmLnNlbmQgPSBzZW5kO1xuXG5sZXQgU1VQUE9SVF9UUkFOU0ZFUkFCTEU7XG5cbmlmIChpbnNpZGVXb3JrZXIpIHtcbiAgY29uc3QgYWIgPSBuZXcgQXJyYXlCdWZmZXIoMSk7XG5cbiAgc2VuZChhYiwgW2FiXSk7XG4gIFNVUFBPUlRfVFJBTlNGRVJBQkxFID0gKGFiLmJ5dGVMZW5ndGggPT09IDApO1xufVxuXG5jb25zdCBNRVNTQUdFX1RZUEVTID0ge1xuICBXT1JMRFJFUE9SVDogMCxcbiAgQ09MTElTSU9OUkVQT1JUOiAxLFxuICBWRUhJQ0xFUkVQT1JUOiAyLFxuICBDT05TVFJBSU5UUkVQT1JUOiAzLFxuICBTT0ZUUkVQT1JUOiA0XG59O1xuXG4vLyB0ZW1wIHZhcmlhYmxlc1xubGV0IF9vYmplY3QsXG4gIF92ZWN0b3IsXG4gIF90cmFuc2Zvcm0sXG4gIF90cmFuc2Zvcm1fcG9zLFxuICBfc29mdGJvZHlfZW5hYmxlZCA9IGZhbHNlLFxuICBsYXN0X3NpbXVsYXRpb25fZHVyYXRpb24gPSAwLFxuXG4gIF9udW1fb2JqZWN0cyA9IDAsXG4gIF9udW1fcmlnaWRib2R5X29iamVjdHMgPSAwLFxuICBfbnVtX3NvZnRib2R5X29iamVjdHMgPSAwLFxuICBfbnVtX3doZWVscyA9IDAsXG4gIF9udW1fY29uc3RyYWludHMgPSAwLFxuICBfc29mdGJvZHlfcmVwb3J0X3NpemUgPSAwLFxuXG4gIC8vIHdvcmxkIHZhcmlhYmxlc1xuICBmaXhlZFRpbWVTdGVwLCAvLyB1c2VkIHdoZW4gY2FsbGluZyBzdGVwU2ltdWxhdGlvblxuICBsYXN0X3NpbXVsYXRpb25fdGltZSxcblxuICB3b3JsZCxcbiAgX3ZlYzNfMSxcbiAgX3ZlYzNfMixcbiAgX3ZlYzNfMyxcbiAgX3F1YXQ7XG5cbi8vIHByaXZhdGUgY2FjaGVcbmNvbnN0IHB1YmxpY19mdW5jdGlvbnMgPSB7fSxcbiAgX29iamVjdHMgPSBbXSxcbiAgX3ZlaGljbGVzID0gW10sXG4gIF9jb25zdHJhaW50cyA9IFtdLFxuICBfb2JqZWN0c19hbW1vID0ge30sXG4gIF9vYmplY3Rfc2hhcGVzID0ge30sXG5cbiAgLy8gVGhlIGZvbGxvd2luZyBvYmplY3RzIGFyZSB0byB0cmFjayBvYmplY3RzIHRoYXQgYW1tby5qcyBkb2Vzbid0IGNsZWFuXG4gIC8vIHVwLiBBbGwgYXJlIGNsZWFuZWQgdXAgd2hlbiB0aGV5J3JlIGNvcnJlc3BvbmRpbmcgYm9keSBpcyBkZXN0cm95ZWQuXG4gIC8vIFVuZm9ydHVuYXRlbHksIGl0J3MgdmVyeSBkaWZmaWN1bHQgdG8gZ2V0IGF0IHRoZXNlIG9iamVjdHMgZnJvbSB0aGVcbiAgLy8gYm9keSwgc28gd2UgaGF2ZSB0byB0cmFjayB0aGVtIG91cnNlbHZlcy5cbiAgX21vdGlvbl9zdGF0ZXMgPSB7fSxcbiAgLy8gRG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpdCBmb3IgY2FjaGVkIHNoYXBlcy5cbiAgX25vbmNhY2hlZF9zaGFwZXMgPSB7fSxcbiAgLy8gQSBib2R5IHdpdGggYSBjb21wb3VuZCBzaGFwZSBhbHdheXMgaGFzIGEgcmVndWxhciBzaGFwZSBhcyB3ZWxsLCBzbyB3ZVxuICAvLyBoYXZlIHRyYWNrIHRoZW0gc2VwYXJhdGVseS5cbiAgX2NvbXBvdW5kX3NoYXBlcyA9IHt9O1xuXG4vLyBvYmplY3QgcmVwb3J0aW5nXG5sZXQgUkVQT1JUX0NIVU5LU0laRSwgLy8gcmVwb3J0IGFycmF5IGlzIGluY3JlYXNlZCBpbiBpbmNyZW1lbnRzIG9mIHRoaXMgY2h1bmsgc2l6ZVxuICB3b3JsZHJlcG9ydCxcbiAgc29mdHJlcG9ydCxcbiAgY29sbGlzaW9ucmVwb3J0LFxuICB2ZWhpY2xlcmVwb3J0LFxuICBjb25zdHJhaW50cmVwb3J0O1xuXG5jb25zdCBXT1JMRFJFUE9SVF9JVEVNU0laRSA9IDE0LCAvLyBob3cgbWFueSBmbG9hdCB2YWx1ZXMgZWFjaCByZXBvcnRlZCBpdGVtIG5lZWRzXG4gIENPTExJU0lPTlJFUE9SVF9JVEVNU0laRSA9IDUsIC8vIG9uZSBmbG9hdCBmb3IgZWFjaCBvYmplY3QgaWQsIGFuZCBhIFZlYzMgY29udGFjdCBub3JtYWxcbiAgVkVISUNMRVJFUE9SVF9JVEVNU0laRSA9IDksIC8vIHZlaGljbGUgaWQsIHdoZWVsIGluZGV4LCAzIGZvciBwb3NpdGlvbiwgNCBmb3Igcm90YXRpb25cbiAgQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSA9IDY7IC8vIGNvbnN0cmFpbnQgaWQsIG9mZnNldCBvYmplY3QsIG9mZnNldCwgYXBwbGllZCBpbXB1bHNlXG5cbmNvbnN0IGdldFNoYXBlRnJvbUNhY2hlID0gKGNhY2hlX2tleSkgPT4ge1xuICBpZiAoX29iamVjdF9zaGFwZXNbY2FjaGVfa2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBfb2JqZWN0X3NoYXBlc1tjYWNoZV9rZXldO1xuXG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3Qgc2V0U2hhcGVDYWNoZSA9IChjYWNoZV9rZXksIHNoYXBlKSA9PiB7XG4gIF9vYmplY3Rfc2hhcGVzW2NhY2hlX2tleV0gPSBzaGFwZTtcbn07XG5cbmNvbnN0IGNyZWF0ZVNoYXBlID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGxldCBzaGFwZTtcblxuICBfdHJhbnNmb3JtLnNldElkZW50aXR5KCk7XG4gIHN3aXRjaCAoZGVzY3JpcHRpb24udHlwZSkge1xuICBjYXNlICdjb21wb3VuZCc6XG4gICAge1xuICAgICAgc2hhcGUgPSBuZXcgQW1tby5idENvbXBvdW5kU2hhcGUoKTtcblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdwbGFuZSc6XG4gICAge1xuICAgICAgY29uc3QgY2FjaGVfa2V5ID0gYHBsYW5lXyR7ZGVzY3JpcHRpb24ubm9ybWFsLnh9XyR7ZGVzY3JpcHRpb24ubm9ybWFsLnl9XyR7ZGVzY3JpcHRpb24ubm9ybWFsLnp9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIF92ZWMzXzEuc2V0WChkZXNjcmlwdGlvbi5ub3JtYWwueCk7XG4gICAgICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5ub3JtYWwueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5ub3JtYWwueik7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRTdGF0aWNQbGFuZVNoYXBlKF92ZWMzXzEsIDApO1xuICAgICAgICBzZXRTaGFwZUNhY2hlKGNhY2hlX2tleSwgc2hhcGUpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2JveCc6XG4gICAge1xuICAgICAgY29uc3QgY2FjaGVfa2V5ID0gYGJveF8ke2Rlc2NyaXB0aW9uLndpZHRofV8ke2Rlc2NyaXB0aW9uLmhlaWdodH1fJHtkZXNjcmlwdGlvbi5kZXB0aH1gO1xuXG4gICAgICBpZiAoKHNoYXBlID0gZ2V0U2hhcGVGcm9tQ2FjaGUoY2FjaGVfa2V5KSkgPT09IG51bGwpIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRlc2NyaXB0aW9uLndpZHRoIC8gMik7XG4gICAgICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5oZWlnaHQgLyAyKTtcbiAgICAgICAgX3ZlYzNfMS5zZXRaKGRlc2NyaXB0aW9uLmRlcHRoIC8gMik7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRCb3hTaGFwZShfdmVjM18xKTtcbiAgICAgICAgc2V0U2hhcGVDYWNoZShjYWNoZV9rZXksIHNoYXBlKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdzcGhlcmUnOlxuICAgIHtcbiAgICAgIGNvbnN0IGNhY2hlX2tleSA9IGBzcGhlcmVfJHtkZXNjcmlwdGlvbi5yYWRpdXN9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRTcGhlcmVTaGFwZShkZXNjcmlwdGlvbi5yYWRpdXMpO1xuICAgICAgICBzZXRTaGFwZUNhY2hlKGNhY2hlX2tleSwgc2hhcGUpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2N5bGluZGVyJzpcbiAgICB7XG4gICAgICBjb25zdCBjYWNoZV9rZXkgPSBgY3lsaW5kZXJfJHtkZXNjcmlwdGlvbi53aWR0aH1fJHtkZXNjcmlwdGlvbi5oZWlnaHR9XyR7ZGVzY3JpcHRpb24uZGVwdGh9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIF92ZWMzXzEuc2V0WChkZXNjcmlwdGlvbi53aWR0aCAvIDIpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGVzY3JpcHRpb24uaGVpZ2h0IC8gMik7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5kZXB0aCAvIDIpO1xuICAgICAgICBzaGFwZSA9IG5ldyBBbW1vLmJ0Q3lsaW5kZXJTaGFwZShfdmVjM18xKTtcbiAgICAgICAgc2V0U2hhcGVDYWNoZShjYWNoZV9rZXksIHNoYXBlKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdjYXBzdWxlJzpcbiAgICB7XG4gICAgICBjb25zdCBjYWNoZV9rZXkgPSBgY2Fwc3VsZV8ke2Rlc2NyaXB0aW9uLnJhZGl1c31fJHtkZXNjcmlwdGlvbi5oZWlnaHR9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIC8vIEluIEJ1bGxldCwgY2Fwc3VsZSBoZWlnaHQgZXhjbHVkZXMgdGhlIGVuZCBzcGhlcmVzXG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRDYXBzdWxlU2hhcGUoZGVzY3JpcHRpb24ucmFkaXVzLCBkZXNjcmlwdGlvbi5oZWlnaHQgLSAyICogZGVzY3JpcHRpb24ucmFkaXVzKTtcbiAgICAgICAgc2V0U2hhcGVDYWNoZShjYWNoZV9rZXksIHNoYXBlKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdjb25lJzpcbiAgICB7XG4gICAgICBjb25zdCBjYWNoZV9rZXkgPSBgY29uZV8ke2Rlc2NyaXB0aW9uLnJhZGl1c31fJHtkZXNjcmlwdGlvbi5oZWlnaHR9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRDb25lU2hhcGUoZGVzY3JpcHRpb24ucmFkaXVzLCBkZXNjcmlwdGlvbi5oZWlnaHQpO1xuICAgICAgICBzZXRTaGFwZUNhY2hlKGNhY2hlX2tleSwgc2hhcGUpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2NvbmNhdmUnOlxuICAgIHtcbiAgICAgIGNvbnN0IHRyaWFuZ2xlX21lc2ggPSBuZXcgQW1tby5idFRyaWFuZ2xlTWVzaCgpO1xuICAgICAgaWYgKCFkZXNjcmlwdGlvbi5kYXRhLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YSA9IGRlc2NyaXB0aW9uLmRhdGE7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGggLyA5OyBpKyspIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRhdGFbaSAqIDldKTtcbiAgICAgICAgX3ZlYzNfMS5zZXRZKGRhdGFbaSAqIDkgKyAxXSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkYXRhW2kgKiA5ICsgMl0pO1xuXG4gICAgICAgIF92ZWMzXzIuc2V0WChkYXRhW2kgKiA5ICsgM10pO1xuICAgICAgICBfdmVjM18yLnNldFkoZGF0YVtpICogOSArIDRdKTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRhdGFbaSAqIDkgKyA1XSk7XG5cbiAgICAgICAgX3ZlYzNfMy5zZXRYKGRhdGFbaSAqIDkgKyA2XSk7XG4gICAgICAgIF92ZWMzXzMuc2V0WShkYXRhW2kgKiA5ICsgN10pO1xuICAgICAgICBfdmVjM18zLnNldFooZGF0YVtpICogOSArIDhdKTtcblxuICAgICAgICB0cmlhbmdsZV9tZXNoLmFkZFRyaWFuZ2xlKFxuICAgICAgICAgIF92ZWMzXzEsXG4gICAgICAgICAgX3ZlYzNfMixcbiAgICAgICAgICBfdmVjM18zLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZShcbiAgICAgICAgdHJpYW5nbGVfbWVzaCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgX25vbmNhY2hlZF9zaGFwZXNbZGVzY3JpcHRpb24uaWRdID0gc2hhcGU7XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgY2FzZSAnY29udmV4JzpcbiAgICB7XG4gICAgICBzaGFwZSA9IG5ldyBBbW1vLmJ0Q29udmV4SHVsbFNoYXBlKCk7XG4gICAgICBjb25zdCBkYXRhID0gZGVzY3JpcHRpb24uZGF0YTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCAvIDM7IGkrKykge1xuICAgICAgICBfdmVjM18xLnNldFgoZGF0YVtpICogM10pO1xuICAgICAgICBfdmVjM18xLnNldFkoZGF0YVtpICogMyArIDFdKTtcbiAgICAgICAgX3ZlYzNfMS5zZXRaKGRhdGFbaSAqIDMgKyAyXSk7XG5cbiAgICAgICAgc2hhcGUuYWRkUG9pbnQoX3ZlYzNfMSk7XG4gICAgICB9XG5cbiAgICAgIF9ub25jYWNoZWRfc2hhcGVzW2Rlc2NyaXB0aW9uLmlkXSA9IHNoYXBlO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2hlaWdodGZpZWxkJzpcbiAgICB7XG4gICAgICBjb25zdCB4cHRzID0gZGVzY3JpcHRpb24ueHB0cyxcbiAgICAgICAgeXB0cyA9IGRlc2NyaXB0aW9uLnlwdHMsXG4gICAgICAgIHBvaW50cyA9IGRlc2NyaXB0aW9uLnBvaW50cyxcbiAgICAgICAgcHRyID0gQW1tby5fbWFsbG9jKDQgKiB4cHRzICogeXB0cyk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwLCBwID0gMCwgcDIgPSAwOyBpIDwgeHB0czsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgeXB0czsgaisrKSB7XG4gICAgICAgICAgQW1tby5IRUFQRjMyW3B0ciArIHAyID4+IDJdID0gcG9pbnRzW3BdO1xuXG4gICAgICAgICAgcCsrO1xuICAgICAgICAgIHAyICs9IDQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2hhcGUgPSBuZXcgQW1tby5idEhlaWdodGZpZWxkVGVycmFpblNoYXBlKFxuICAgICAgICBkZXNjcmlwdGlvbi54cHRzLFxuICAgICAgICBkZXNjcmlwdGlvbi55cHRzLFxuICAgICAgICBwdHIsXG4gICAgICAgIDEsIC1kZXNjcmlwdGlvbi5hYnNNYXhIZWlnaHQsXG4gICAgICAgIGRlc2NyaXB0aW9uLmFic01heEhlaWdodCxcbiAgICAgICAgMSxcbiAgICAgICAgJ1BIWV9GTE9BVCcsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuXG4gICAgICBfbm9uY2FjaGVkX3NoYXBlc1tkZXNjcmlwdGlvbi5pZF0gPSBzaGFwZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgZGVmYXVsdDpcbiAgICAvLyBOb3QgcmVjb2duaXplZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBzaGFwZTtcbn07XG5cbmNvbnN0IGNyZWF0ZVNvZnRCb2R5ID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGxldCBib2R5O1xuXG4gIGNvbnN0IHNvZnRCb2R5SGVscGVycyA9IG5ldyBBbW1vLmJ0U29mdEJvZHlIZWxwZXJzKCk7XG5cbiAgc3dpdGNoIChkZXNjcmlwdGlvbi50eXBlKSB7XG4gIGNhc2UgJ3NvZnRUcmltZXNoJzpcbiAgICB7XG4gICAgICBpZiAoIWRlc2NyaXB0aW9uLmFWZXJ0aWNlcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgYm9keSA9IHNvZnRCb2R5SGVscGVycy5DcmVhdGVGcm9tVHJpTWVzaChcbiAgICAgICAgd29ybGQuZ2V0V29ybGRJbmZvKCksXG4gICAgICAgIGRlc2NyaXB0aW9uLmFWZXJ0aWNlcyxcbiAgICAgICAgZGVzY3JpcHRpb24uYUluZGljZXMsXG4gICAgICAgIGRlc2NyaXB0aW9uLmFJbmRpY2VzLmxlbmd0aCAvIDMsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ3NvZnRDbG90aE1lc2gnOlxuICAgIHtcbiAgICAgIGNvbnN0IGNyID0gZGVzY3JpcHRpb24uY29ybmVycztcblxuICAgICAgYm9keSA9IHNvZnRCb2R5SGVscGVycy5DcmVhdGVQYXRjaChcbiAgICAgICAgd29ybGQuZ2V0V29ybGRJbmZvKCksXG4gICAgICAgIG5ldyBBbW1vLmJ0VmVjdG9yMyhjclswXSwgY3JbMV0sIGNyWzJdKSxcbiAgICAgICAgbmV3IEFtbW8uYnRWZWN0b3IzKGNyWzNdLCBjcls0XSwgY3JbNV0pLFxuICAgICAgICBuZXcgQW1tby5idFZlY3RvcjMoY3JbNl0sIGNyWzddLCBjcls4XSksXG4gICAgICAgIG5ldyBBbW1vLmJ0VmVjdG9yMyhjcls5XSwgY3JbMTBdLCBjclsxMV0pLFxuICAgICAgICBkZXNjcmlwdGlvbi5zZWdtZW50c1swXSxcbiAgICAgICAgZGVzY3JpcHRpb24uc2VnbWVudHNbMV0sXG4gICAgICAgIDAsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgY2FzZSAnc29mdFJvcGVNZXNoJzpcbiAgICB7XG4gICAgICBjb25zdCBkYXRhID0gZGVzY3JpcHRpb24uZGF0YTtcblxuICAgICAgYm9keSA9IHNvZnRCb2R5SGVscGVycy5DcmVhdGVSb3BlKFxuICAgICAgICB3b3JsZC5nZXRXb3JsZEluZm8oKSxcbiAgICAgICAgbmV3IEFtbW8uYnRWZWN0b3IzKGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0pLFxuICAgICAgICBuZXcgQW1tby5idFZlY3RvcjMoZGF0YVszXSwgZGF0YVs0XSwgZGF0YVs1XSksXG4gICAgICAgIGRhdGFbNl0gLSAxLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGRlZmF1bHQ6XG4gICAgLy8gTm90IHJlY29nbml6ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gYm9keTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuaW5pdCA9IChwYXJhbXMgPSB7fSkgPT4ge1xuICBpZiAocGFyYW1zLm5vV29ya2VyKSB7XG4gICAgd2luZG93LkFtbW8gPSBuZXcgcGFyYW1zLmFtbW8oKTtcbiAgICBwdWJsaWNfZnVuY3Rpb25zLm1ha2VXb3JsZChwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwYXJhbXMud2FzbUJ1ZmZlcikge1xuICAgIGltcG9ydFNjcmlwdHMocGFyYW1zLmFtbW8pO1xuXG4gICAgc2VsZi5BbW1vID0gbmV3IGxvYWRBbW1vRnJvbUJpbmFyeShwYXJhbXMud2FzbUJ1ZmZlcikoKTtcbiAgICBzZW5kKHsgY21kOiAnYW1tb0xvYWRlZCcgfSk7XG4gICAgcHVibGljX2Z1bmN0aW9ucy5tYWtlV29ybGQocGFyYW1zKTtcbiAgfVxuICBlbHNlIHtcbiAgICBpbXBvcnRTY3JpcHRzKHBhcmFtcy5hbW1vKTtcbiAgICBzZW5kKHsgY21kOiAnYW1tb0xvYWRlZCcgfSk7XG5cbiAgICBzZWxmLkFtbW8gPSBuZXcgQW1tbygpO1xuICAgIHB1YmxpY19mdW5jdGlvbnMubWFrZVdvcmxkKHBhcmFtcyk7XG4gIH1cbn1cblxucHVibGljX2Z1bmN0aW9ucy5tYWtlV29ybGQgPSAocGFyYW1zID0ge30pID0+IHtcbiAgX3RyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG4gIF90cmFuc2Zvcm1fcG9zID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgX3ZlYzNfMSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgX3ZlYzNfMiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgX3ZlYzNfMyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgX3F1YXQgPSBuZXcgQW1tby5idFF1YXRlcm5pb24oMCwgMCwgMCwgMCk7XG5cbiAgUkVQT1JUX0NIVU5LU0laRSA9IHBhcmFtcy5yZXBvcnRzaXplIHx8IDUwO1xuXG4gIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkge1xuICAgIC8vIFRyYW5zZmVyYWJsZSBtZXNzYWdlcyBhcmUgc3VwcG9ydGVkLCB0YWtlIGFkdmFudGFnZSBvZiB0aGVtIHdpdGggVHlwZWRBcnJheXNcbiAgICB3b3JsZHJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoMiArIFJFUE9SVF9DSFVOS1NJWkUgKiBXT1JMRFJFUE9SVF9JVEVNU0laRSk7IC8vIG1lc3NhZ2UgaWQgKyAjIG9mIG9iamVjdHMgdG8gcmVwb3J0ICsgY2h1bmsgc2l6ZSAqICMgb2YgdmFsdWVzIHBlciBvYmplY3RcbiAgICBjb2xsaXNpb25yZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KDIgKyBSRVBPUlRfQ0hVTktTSVpFICogQ09MTElTSU9OUkVQT1JUX0lURU1TSVpFKTsgLy8gbWVzc2FnZSBpZCArICMgb2YgY29sbGlzaW9ucyB0byByZXBvcnQgKyBjaHVuayBzaXplICogIyBvZiB2YWx1ZXMgcGVyIG9iamVjdFxuICAgIHZlaGljbGVyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KDIgKyBSRVBPUlRfQ0hVTktTSVpFICogVkVISUNMRVJFUE9SVF9JVEVNU0laRSk7IC8vIG1lc3NhZ2UgaWQgKyAjIG9mIHZlaGljbGVzIHRvIHJlcG9ydCArIGNodW5rIHNpemUgKiAjIG9mIHZhbHVlcyBwZXIgb2JqZWN0XG4gICAgY29uc3RyYWludHJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoMiArIFJFUE9SVF9DSFVOS1NJWkUgKiBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFKTsgLy8gbWVzc2FnZSBpZCArICMgb2YgY29uc3RyYWludHMgdG8gcmVwb3J0ICsgY2h1bmsgc2l6ZSAqICMgb2YgdmFsdWVzIHBlciBvYmplY3RcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBUcmFuc2ZlcmFibGUgbWVzc2FnZXMgYXJlIG5vdCBzdXBwb3J0ZWQsIHNlbmQgZGF0YSBhcyBub3JtYWwgYXJyYXlzXG4gICAgd29ybGRyZXBvcnQgPSBbXTtcbiAgICBjb2xsaXNpb25yZXBvcnQgPSBbXTtcbiAgICB2ZWhpY2xlcmVwb3J0ID0gW107XG4gICAgY29uc3RyYWludHJlcG9ydCA9IFtdO1xuICB9XG5cbiAgd29ybGRyZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLldPUkxEUkVQT1JUO1xuICBjb2xsaXNpb25yZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLkNPTExJU0lPTlJFUE9SVDtcbiAgdmVoaWNsZXJlcG9ydFswXSA9IE1FU1NBR0VfVFlQRVMuVkVISUNMRVJFUE9SVDtcbiAgY29uc3RyYWludHJlcG9ydFswXSA9IE1FU1NBR0VfVFlQRVMuQ09OU1RSQUlOVFJFUE9SVDtcblxuICBjb25zdCBjb2xsaXNpb25Db25maWd1cmF0aW9uID0gcGFyYW1zLnNvZnRib2R5ID9cbiAgICBuZXcgQW1tby5idFNvZnRCb2R5UmlnaWRCb2R5Q29sbGlzaW9uQ29uZmlndXJhdGlvbigpIDpcbiAgICBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCksXG4gICAgZGlzcGF0Y2hlciA9IG5ldyBBbW1vLmJ0Q29sbGlzaW9uRGlzcGF0Y2hlcihjb2xsaXNpb25Db25maWd1cmF0aW9uKSxcbiAgICBzb2x2ZXIgPSBuZXcgQW1tby5idFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcigpO1xuXG4gIGxldCBicm9hZHBoYXNlO1xuXG4gIGlmICghcGFyYW1zLmJyb2FkcGhhc2UpIHBhcmFtcy5icm9hZHBoYXNlID0geyB0eXBlOiAnZHluYW1pYycgfTtcbiAgLy8gVE9ETyEhIVxuICAvKiBpZiAocGFyYW1zLmJyb2FkcGhhc2UudHlwZSA9PT0gJ3N3ZWVwcHJ1bmUnKSB7XG4gICAgZXh0ZW5kKHBhcmFtcy5icm9hZHBoYXNlLCB7XG4gICAgICBhYWJibWluOiB7XG4gICAgICAgIHg6IC01MCxcbiAgICAgICAgeTogLTUwLFxuICAgICAgICB6OiAtNTBcbiAgICAgIH0sXG5cbiAgICAgIGFhYmJtYXg6IHtcbiAgICAgICAgeDogNTAsXG4gICAgICAgIHk6IDUwLFxuICAgICAgICB6OiA1MFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSovXG5cbiAgc3dpdGNoIChwYXJhbXMuYnJvYWRwaGFzZS50eXBlKSB7XG4gIGNhc2UgJ3N3ZWVwcHJ1bmUnOlxuICAgIF92ZWMzXzEuc2V0WChwYXJhbXMuYnJvYWRwaGFzZS5hYWJibWluLngpO1xuICAgIF92ZWMzXzEuc2V0WShwYXJhbXMuYnJvYWRwaGFzZS5hYWJibWluLnkpO1xuICAgIF92ZWMzXzEuc2V0WihwYXJhbXMuYnJvYWRwaGFzZS5hYWJibWluLnopO1xuXG4gICAgX3ZlYzNfMi5zZXRYKHBhcmFtcy5icm9hZHBoYXNlLmFhYmJtYXgueCk7XG4gICAgX3ZlYzNfMi5zZXRZKHBhcmFtcy5icm9hZHBoYXNlLmFhYmJtYXgueSk7XG4gICAgX3ZlYzNfMi5zZXRaKHBhcmFtcy5icm9hZHBoYXNlLmFhYmJtYXgueik7XG5cbiAgICBicm9hZHBoYXNlID0gbmV3IEFtbW8uYnRBeGlzU3dlZXAzKFxuICAgICAgX3ZlYzNfMSxcbiAgICAgIF92ZWMzXzJcbiAgICApO1xuXG4gICAgYnJlYWs7XG4gIGNhc2UgJ2R5bmFtaWMnOlxuICBkZWZhdWx0OlxuICAgIGJyb2FkcGhhc2UgPSBuZXcgQW1tby5idERidnRCcm9hZHBoYXNlKCk7XG4gICAgYnJlYWs7XG4gIH1cblxuICB3b3JsZCA9IHBhcmFtcy5zb2Z0Ym9keSA/XG4gICAgbmV3IEFtbW8uYnRTb2Z0UmlnaWREeW5hbWljc1dvcmxkKGRpc3BhdGNoZXIsIGJyb2FkcGhhc2UsIHNvbHZlciwgY29sbGlzaW9uQ29uZmlndXJhdGlvbiwgbmV3IEFtbW8uYnREZWZhdWx0U29mdEJvZHlTb2x2ZXIoKSkgOlxuICAgIG5ldyBBbW1vLmJ0RGlzY3JldGVEeW5hbWljc1dvcmxkKGRpc3BhdGNoZXIsIGJyb2FkcGhhc2UsIHNvbHZlciwgY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG4gIGZpeGVkVGltZVN0ZXAgPSBwYXJhbXMuZml4ZWRUaW1lU3RlcDtcblxuICBpZiAocGFyYW1zLnNvZnRib2R5KSBfc29mdGJvZHlfZW5hYmxlZCA9IHRydWU7XG5cbiAgc2VuZCh7IGNtZDogJ3dvcmxkUmVhZHknIH0pO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXRGaXhlZFRpbWVTdGVwID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGZpeGVkVGltZVN0ZXAgPSBkZXNjcmlwdGlvbjtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0R3Jhdml0eSA9IChkZXNjcmlwdGlvbikgPT4ge1xuICBfdmVjM18xLnNldFgoZGVzY3JpcHRpb24ueCk7XG4gIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi55KTtcbiAgX3ZlYzNfMS5zZXRaKGRlc2NyaXB0aW9uLnopO1xuICB3b3JsZC5zZXRHcmF2aXR5KF92ZWMzXzEpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5hcHBlbmRBbmNob3IgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgX29iamVjdHNbZGVzY3JpcHRpb24ub2JqXVxuICAgIC5hcHBlbmRBbmNob3IoXG4gICAgICBkZXNjcmlwdGlvbi5ub2RlLFxuICAgICAgX29iamVjdHNbZGVzY3JpcHRpb24ub2JqMl0sXG4gICAgICBkZXNjcmlwdGlvbi5jb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzLFxuICAgICAgZGVzY3JpcHRpb24uaW5mbHVlbmNlXG4gICAgKTtcbn1cblxucHVibGljX2Z1bmN0aW9ucy5saW5rTm9kZXMgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgdmFyIHNlbGZfYm9keSA9IF9vYmplY3RzW2Rlc2NyaXB0aW9uLnNlbGZdO1xuICB2YXIgb3RoZXJfYm9keSA9IF9vYmplY3RzW2Rlc2NyaXB0aW9uLmJvZHldO1xuXG4gIHZhciBzZWxmX25vZGUgPSBzZWxmX2JvZHkuZ2V0X21fbm9kZXMoKS5hdChkZXNjcmlwdGlvbi5uMSk7XG4gIHZhciBvdGhlcl9ub2RlID0gb3RoZXJfYm9keS5nZXRfbV9ub2RlcygpLmF0KGRlc2NyaXB0aW9uLm4yKTtcblxuICB2YXIgc2VsZl92ZWMgPSBzZWxmX25vZGUuZ2V0X21feCgpO1xuICB2YXIgb3RoZXJfdmVjID0gb3RoZXJfbm9kZS5nZXRfbV94KCk7XG5cbiAgdmFyIGZvcmNlX3ggPSBvdGhlcl92ZWMueCgpIC0gc2VsZl92ZWMueCgpO1xuICB2YXIgZm9yY2VfeSA9IG90aGVyX3ZlYy55KCkgLSBzZWxmX3ZlYy55KCk7XG4gIHZhciBmb3JjZV96ID0gb3RoZXJfdmVjLnooKSAtIHNlbGZfdmVjLnooKTtcblxuXG4gIC8vIHZhciBtb2RpZmllciA9IDMwO1xuXG4gIGxldCBjYWNoZWRfZGlzdGFuY2UsIGxpbmtlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IF9sb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGZvcmNlX3ggPSBvdGhlcl92ZWMueCgpIC0gc2VsZl92ZWMueCgpO1xuICAgIGZvcmNlX3kgPSBvdGhlcl92ZWMueSgpIC0gc2VsZl92ZWMueSgpO1xuICAgIGZvcmNlX3ogPSBvdGhlcl92ZWMueigpIC0gc2VsZl92ZWMueigpO1xuXG4gICAgbGV0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGZvcmNlX3ggKiBmb3JjZV94ICsgZm9yY2VfeSAqIGZvcmNlX3kgKyBmb3JjZV96ICogZm9yY2Vfeik7XG5cbiAgICBpZiAoY2FjaGVkX2Rpc3RhbmNlICYmICFsaW5rZWQgJiYgY2FjaGVkX2Rpc3RhbmNlIDwgZGlzdGFuY2UpIHsgLy8gY2FjaGVkX2Rpc3RhbmNlICYmICFsaW5rZWQgJiYgY2FjaGVkX2Rpc3RhbmNlIDwgZGlzdGFuY2VcblxuICAgICAgbGlua2VkID0gdHJ1ZTtcblxuICAgICAgLy8gbGV0IHNlbGZfdmVsID0gc2VsZl9ub2RlLmdldF9tX3YoKTtcbiAgICAgIC8vXG4gICAgICAvLyBfdmVjM18xLnNldFgoLXNlbGZfdmVsLngoKSk7XG4gICAgICAvLyBfdmVjM18xLnNldFkoLXNlbGZfdmVsLnkoKSk7XG4gICAgICAvLyBfdmVjM18xLnNldFooLXNlbGZfdmVsLnooKSk7XG4gICAgICAvL1xuICAgICAgLy8gbGV0IG90aGVyX3ZlbCA9IG90aGVyX25vZGUuZ2V0X21fdigpO1xuICAgICAgLy9cbiAgICAgIC8vIF92ZWMzXzIuc2V0WCgtb3RoZXJfdmVsLngoKSk7XG4gICAgICAvLyBfdmVjM18yLnNldFkoLW90aGVyX3ZlbC55KCkpO1xuICAgICAgLy8gX3ZlYzNfMi5zZXRaKC1vdGhlcl92ZWwueigpKTtcblxuICAgICAgY29uc29sZS5sb2coJ2xpbmshJyk7XG5cbiAgICAgIF92ZWMzXzEuc2V0WCgwKTtcbiAgICAgIF92ZWMzXzEuc2V0WSgwKTtcbiAgICAgIF92ZWMzXzEuc2V0WigwKTtcblxuICAgICAgc2VsZl9ib2R5LnNldFZlbG9jaXR5KFxuICAgICAgICBfdmVjM18xXG4gICAgICApO1xuXG4gICAgICBvdGhlcl9ib2R5LnNldFZlbG9jaXR5KFxuICAgICAgICBfdmVjM18xXG4gICAgICApO1xuXG5cblxuICAgICAgLy8gc2VsZl9ib2R5LmFkZFZlbG9jaXR5KF92ZWMzXzEpO1xuICAgICAgLy8gb3RoZXJfYm9keS5hZGRWZWxvY2l0eShfdmVjM18yKTtcblxuICAgICAgLy8gc2VsZl9yZWxhdGl2ZV94ID0gc2VsZl9ub2RlLngoKTtcbiAgICAgIC8vIHNlbGZfcmVsYXRpdmVfeSA9IHNlbGZfbm9kZS55KCk7XG4gICAgICAvLyBzZWxmX3JlbGF0aXZlX3ogPSBzZWxmX25vZGUueigpO1xuICAgICAgLy9cbiAgICAgIC8vIG90aGVyX3JlbGF0aXZlX3ggPSBvdGhlcl9ub2RlLngoKTtcbiAgICAgIC8vIG90aGVyX3JlbGF0aXZlX3kgPSBvdGhlcl9ub2RlLnkoKTtcbiAgICAgIC8vIG90aGVyX3JlbGF0aXZlX3ogPSBvdGhlcl9ub2RlLnooKTtcblxuICAgICAgLy8gc2VsZl9yZWxhdGl2ZSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgICAgLy8gc2VsZl9yZWxhdGl2ZS5zZXRYKCk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdsaW5rIScpO1xuICAgICAgLy8gc2VsZl9ib2R5LmFwcGVuZEFuY2hvcihkZXNjcmlwdGlvbi5uMSwgY29ubmVjdG9yLCB0cnVlLCAwLjUpO1xuICAgICAgLy8gb3RoZXJfYm9keS5hcHBlbmRBbmNob3IoZGVzY3JpcHRpb24ubjIsIGNvbm5lY3RvciwgdHJ1ZSwgMC41KTtcbiAgICAgIC8vIGNsZWFySW50ZXJ2YWwoX2xvb3ApO1xuXG4gICAgICAvLyBfdmVjM18xLnNldFgoMCk7XG4gICAgICAvLyBfdmVjM18xLnNldFkoMCk7XG4gICAgICAvLyBfdmVjM18xLnNldFooMCk7XG5cbiAgICAgIC8vIHNlbGZfYm9keS5zZXRWZWxvY2l0eShfdmVjM18xKTtcbiAgICAgIC8vIG90aGVyX2JvZHkuc2V0VmVsb2NpdHkoX3ZlYzNfMSk7XG5cbiAgICAgIC8vIG90aGVyX2JvZHkuYWRkRm9yY2UoXG4gICAgICAvLyAgIF92ZWMzXzIsXG4gICAgICAvLyAgIGRlc2NyaXB0aW9uLm4yXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBkZXNjcmlwdGlvbi5tb2RpZmllciAqPSAxLjY7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kaWZlcjIgPSBsaW5rZWQgPyA0MCA6IDE7XG5cbiAgICBmb3JjZV94ICo9IE1hdGgubWF4KGRpc3RhbmNlLCAxKSAqIGRlc2NyaXB0aW9uLm1vZGlmaWVyICogbW9kaWZlcjI7XG4gICAgZm9yY2VfeSAqPSBNYXRoLm1heChkaXN0YW5jZSwgMSkgKiBkZXNjcmlwdGlvbi5tb2RpZmllciAqIG1vZGlmZXIyO1xuICAgIGZvcmNlX3ogKj0gTWF0aC5tYXgoZGlzdGFuY2UsIDEpICogZGVzY3JpcHRpb24ubW9kaWZpZXIgKiBtb2RpZmVyMjtcblxuICAgIF92ZWMzXzEuc2V0WChmb3JjZV94KTtcbiAgICBfdmVjM18xLnNldFkoZm9yY2VfeSk7XG4gICAgX3ZlYzNfMS5zZXRaKGZvcmNlX3opO1xuXG4gICAgX3ZlYzNfMi5zZXRYKC1mb3JjZV94KTtcbiAgICBfdmVjM18yLnNldFkoLWZvcmNlX3kpO1xuICAgIF92ZWMzXzIuc2V0WigtZm9yY2Vfeik7XG5cbiAgICBzZWxmX2JvZHkuYWRkVmVsb2NpdHkoXG4gICAgICBfdmVjM18xLFxuICAgICAgZGVzY3JpcHRpb24ubjFcbiAgICApO1xuXG4gICAgb3RoZXJfYm9keS5hZGRWZWxvY2l0eShcbiAgICAgIF92ZWMzXzIsXG4gICAgICBkZXNjcmlwdGlvbi5uMlxuICAgICk7XG5cbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgLy8gc2VsZl9yZWxhdGl2ZV94ID0gbnVsbDtcbiAgICAvLyB9XG5cblxuXG4gICAgLy8gaWYgKHNlbGZfcmVsYXRpdmVfeCkge1xuICAgIC8vICAgX3ZlYzNfMS5zZXRYKHNlbGZfcmVsYXRpdmVfeCAtIHNlbGZfbm9kZS54KCkpO1xuICAgIC8vICAgX3ZlYzNfMS5zZXRZKHNlbGZfcmVsYXRpdmVfeSAtIHNlbGZfbm9kZS55KCkpO1xuICAgIC8vICAgX3ZlYzNfMS5zZXRaKHNlbGZfcmVsYXRpdmVfeiAtIHNlbGZfbm9kZS56KCkpO1xuICAgIC8vXG4gICAgLy8gICBfdmVjM18yLnNldFgob3RoZXJfcmVsYXRpdmVfeCAtIG90aGVyX25vZGUueCgpKTtcbiAgICAvLyAgIF92ZWMzXzIuc2V0WShvdGhlcl9yZWxhdGl2ZV95IC0gb3RoZXJfbm9kZS55KCkpO1xuICAgIC8vICAgX3ZlYzNfMi5zZXRaKG90aGVyX3JlbGF0aXZlX3ogLSBvdGhlcl9ub2RlLnooKSk7XG4gICAgLy8gfSBlbHNlIHtcblxuICAgIC8vIH1cblxuXG5cblxuICAgIGNhY2hlZF9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICB9LCAxMCk7XG59XG5cbnB1YmxpY19mdW5jdGlvbnMuYXBwZW5kTGluayA9IChkZXNjcmlwdGlvbikgPT4ge1xuICAvLyBjb25zb2xlLmxvZyhBbW1vKTtcbiAgLy8gY29uc29sZS5sb2cobmV3IEFtbW8uTWF0ZXJpYWwoKSk7XG5cbiAgLy8gdmFyIF9tYXQgPSBuZXcgQW1tby5NYXRlcmlhbCgpO1xuICAvL1xuICAvLyBfbWF0LnNldF9tX2tBU1QoMCk7XG4gIC8vIF9tYXQuc2V0X21fa0xTVCgwKTtcbiAgLy8gX21hdC5zZXRfbV9rVlNUKDApO1xuICAvL1xuICAvLyBfb2JqZWN0c1tkZXNjcmlwdGlvbi5zZWxmXS5hcHBlbmRMaW5rKFxuICAvLyAgIGRlc2NyaXB0aW9uLm4xLFxuICAvLyAgIGRlc2NyaXB0aW9uLm4yLFxuICAvLyAgIF9tYXQsXG4gIC8vICAgZmFsc2VcbiAgLy8gKTtcblxuICBfdmVjM18xLnNldFgoMTAwMCk7XG4gIF92ZWMzXzEuc2V0WSgwKTtcbiAgX3ZlYzNfMS5zZXRaKDApO1xuXG4gIF9vYmplY3RzW2Rlc2NyaXB0aW9uLnNlbGZdLmFkZEZvcmNlKFxuICAgIF92ZWMzXzEsXG4gICAgZGVzY3JpcHRpb24ubjFcbiAgKTtcbn1cblxucHVibGljX2Z1bmN0aW9ucy5hcHBlbmRMaW5lYXJKb2ludCA9IChkZXNjcmlwdGlvbikgPT4ge1xuICAvLyBjb25zb2xlLmxvZygnQW1tbycsIEFtbW8pO1xuICB2YXIgc3BlY3MgPSBuZXcgQW1tby5TcGVjcygpO1xuICB2YXIgX3BvcyA9IGRlc2NyaXB0aW9uLnNwZWNzLnBvc2l0aW9uO1xuXG4gIHNwZWNzLnNldF9wb3NpdGlvbihuZXcgQW1tby5idFZlY3RvcjMoX3Bvc1swXSwgX3Bvc1sxXSwgX3Bvc1syXSkpO1xuICBpZiAoZGVzY3JpcHRpb24uc3BlY3MuZXJwKSBzcGVjcy5zZXRfZXJwKGRlc2NyaXB0aW9uLnNwZWNzLmVycCk7XG4gIGlmIChkZXNjcmlwdGlvbi5zcGVjcy5jZm0pIHNwZWNzLnNldF9jZm0oZGVzY3JpcHRpb24uc3BlY3MuY2ZtKTtcbiAgaWYgKGRlc2NyaXB0aW9uLnNwZWNzLnNwbGl0KSBzcGVjcy5zZXRfc3BsaXQoZGVzY3JpcHRpb24uc3BlY3Muc3BsaXQpO1xuXG4gIC8vIGNvbnNvbGUubG9nKHNwZWNzKTtcbiAgLy9cbiAgLy8gLy8gbGpvaW50LnNldF9tX3Jwb3MoXG4gIC8vIC8vICAgbmV3IEFtbW8uYnRWZWN0b3IzKF9wb3MxWzBdLCBfcG9zMVsxXSwgX3BvczFbMl0pLFxuICAvLyAvLyAgIG5ldyBBbW1vLmJ0VmVjdG9yMyhfcG9zMlswXSwgX3BvczJbMV0sIF9wb3MyWzJdKVxuICAvLyAvLyApO1xuICAvL1xuICAvLyAvLyBjb25zb2xlLmxvZygnbGpvaW50JywgbGpvaW50KTtcbiAgLy9cblxuICAvLyBjb25zb2xlLmxvZygnYm9keScsIF9vYmplY3RzW2Rlc2NyaXB0aW9uLmJvZHldKTtcbiAgX29iamVjdHNbZGVzY3JpcHRpb24uc2VsZl1cbiAgICAuYXBwZW5kTGluZWFySm9pbnQoXG4gICAgICBzcGVjcyxcbiAgICAgIF9vYmplY3RzW2Rlc2NyaXB0aW9uLmJvZHldXG4gICAgKTtcbn1cblxucHVibGljX2Z1bmN0aW9ucy5hZGRPYmplY3QgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgbGV0IGJvZHksIG1vdGlvblN0YXRlO1xuXG4gIGlmIChkZXNjcmlwdGlvbi50eXBlLmluZGV4T2YoJ3NvZnQnKSAhPT0gLTEpIHtcbiAgICBib2R5ID0gY3JlYXRlU29mdEJvZHkoZGVzY3JpcHRpb24pO1xuXG4gICAgY29uc3Qgc2JDb25maWcgPSBib2R5LmdldF9tX2NmZygpO1xuXG4gICAgaWYgKGRlc2NyaXB0aW9uLnZpdGVyYXRpb25zKSBzYkNvbmZpZy5zZXRfdml0ZXJhdGlvbnMoZGVzY3JpcHRpb24udml0ZXJhdGlvbnMpO1xuICAgIGlmIChkZXNjcmlwdGlvbi5waXRlcmF0aW9ucykgc2JDb25maWcuc2V0X3BpdGVyYXRpb25zKGRlc2NyaXB0aW9uLnBpdGVyYXRpb25zKTtcbiAgICBpZiAoZGVzY3JpcHRpb24uZGl0ZXJhdGlvbnMpIHNiQ29uZmlnLnNldF9kaXRlcmF0aW9ucyhkZXNjcmlwdGlvbi5kaXRlcmF0aW9ucyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uLmNpdGVyYXRpb25zKSBzYkNvbmZpZy5zZXRfY2l0ZXJhdGlvbnMoZGVzY3JpcHRpb24uY2l0ZXJhdGlvbnMpO1xuICAgIHNiQ29uZmlnLnNldF9jb2xsaXNpb25zKDB4MTEpO1xuICAgIHNiQ29uZmlnLnNldF9rREYoZGVzY3JpcHRpb24uZnJpY3Rpb24pO1xuICAgIHNiQ29uZmlnLnNldF9rRFAoZGVzY3JpcHRpb24uZGFtcGluZyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uLnByZXNzdXJlKSBzYkNvbmZpZy5zZXRfa1BSKGRlc2NyaXB0aW9uLnByZXNzdXJlKTtcbiAgICBpZiAoZGVzY3JpcHRpb24uZHJhZykgc2JDb25maWcuc2V0X2tERyhkZXNjcmlwdGlvbi5kcmFnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24ubGlmdCkgc2JDb25maWcuc2V0X2tMRihkZXNjcmlwdGlvbi5saWZ0KTtcbiAgICBpZiAoZGVzY3JpcHRpb24uYW5jaG9ySGFyZG5lc3MpIHNiQ29uZmlnLnNldF9rQUhSKGRlc2NyaXB0aW9uLmFuY2hvckhhcmRuZXNzKTtcbiAgICBpZiAoZGVzY3JpcHRpb24ucmlnaWRIYXJkbmVzcykgc2JDb25maWcuc2V0X2tDSFIoZGVzY3JpcHRpb24ucmlnaWRIYXJkbmVzcyk7XG5cbiAgICBpZiAoZGVzY3JpcHRpb24ua2xzdCkgYm9keS5nZXRfbV9tYXRlcmlhbHMoKS5hdCgwKS5zZXRfbV9rTFNUKGRlc2NyaXB0aW9uLmtsc3QpO1xuICAgIGlmIChkZXNjcmlwdGlvbi5rYXN0KSBib2R5LmdldF9tX21hdGVyaWFscygpLmF0KDApLnNldF9tX2tBU1QoZGVzY3JpcHRpb24ua2FzdCk7XG4gICAgaWYgKGRlc2NyaXB0aW9uLmt2c3QpIGJvZHkuZ2V0X21fbWF0ZXJpYWxzKCkuYXQoMCkuc2V0X21fa1ZTVChkZXNjcmlwdGlvbi5rdnN0KTtcblxuICAgIEFtbW8uY2FzdE9iamVjdChib2R5LCBBbW1vLmJ0Q29sbGlzaW9uT2JqZWN0KS5nZXRDb2xsaXNpb25TaGFwZSgpLnNldE1hcmdpbihcbiAgICAgIHR5cGVvZiBkZXNjcmlwdGlvbi5tYXJnaW4gIT09ICd1bmRlZmluZWQnID8gZGVzY3JpcHRpb24ubWFyZ2luIDogMC4xXG4gICAgKTtcblxuICAgIC8vIEFtbW8uY2FzdE9iamVjdChib2R5LCBBbW1vLmJ0Q29sbGlzaW9uT2JqZWN0KS5nZXRDb2xsaXNpb25TaGFwZSgpLnNldE1hcmdpbigwKTtcblxuICAgIC8vIEFtbW8uY2FzdE9iamVjdChib2R5LCBBbW1vLmJ0Q29sbGlzaW9uT2JqZWN0KS5nZXRDb2xsaXNpb25TaGFwZSgpLnNldExvY2FsU2NhbGluZyhfdmVjM18xKTtcbiAgICBib2R5LnNldEFjdGl2YXRpb25TdGF0ZShkZXNjcmlwdGlvbi5zdGF0ZSB8fCA0KTtcbiAgICBib2R5LnR5cGUgPSAwOyAvLyBTb2Z0Qm9keS5cbiAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ3NvZnRSb3BlTWVzaCcpIGJvZHkucm9wZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdzb2Z0Q2xvdGhNZXNoJykgYm9keS5jbG90aCA9IHRydWU7XG5cbiAgICBfdHJhbnNmb3JtLnNldElkZW50aXR5KCk7XG5cbiAgICAvLyBAdGVzdFxuICAgIF9xdWF0LnNldFgoZGVzY3JpcHRpb24ucm90YXRpb24ueCk7XG4gICAgX3F1YXQuc2V0WShkZXNjcmlwdGlvbi5yb3RhdGlvbi55KTtcbiAgICBfcXVhdC5zZXRaKGRlc2NyaXB0aW9uLnJvdGF0aW9uLnopO1xuICAgIF9xdWF0LnNldFcoZGVzY3JpcHRpb24ucm90YXRpb24udyk7XG4gICAgYm9keS5yb3RhdGUoX3F1YXQpO1xuXG4gICAgX3ZlYzNfMS5zZXRYKGRlc2NyaXB0aW9uLnBvc2l0aW9uLngpO1xuICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5wb3NpdGlvbi55KTtcbiAgICBfdmVjM18xLnNldFooZGVzY3JpcHRpb24ucG9zaXRpb24ueik7XG4gICAgYm9keS50cmFuc2xhdGUoX3ZlYzNfMSk7XG5cbiAgICBfdmVjM18xLnNldFgoZGVzY3JpcHRpb24uc2NhbGUueCk7XG4gICAgX3ZlYzNfMS5zZXRZKGRlc2NyaXB0aW9uLnNjYWxlLnkpO1xuICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5zY2FsZS56KTtcbiAgICBib2R5LnNjYWxlKF92ZWMzXzEpO1xuXG4gICAgYm9keS5zZXRUb3RhbE1hc3MoZGVzY3JpcHRpb24ubWFzcywgZmFsc2UpO1xuICAgIHdvcmxkLmFkZFNvZnRCb2R5KGJvZHksIDEsIC0xKTtcbiAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ3NvZnRUcmltZXNoJykgX3NvZnRib2R5X3JlcG9ydF9zaXplICs9IGJvZHkuZ2V0X21fZmFjZXMoKS5zaXplKCkgKiAzO1xuICAgIGVsc2UgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdzb2Z0Um9wZU1lc2gnKSBfc29mdGJvZHlfcmVwb3J0X3NpemUgKz0gYm9keS5nZXRfbV9ub2RlcygpLnNpemUoKTtcbiAgICBlbHNlIF9zb2Z0Ym9keV9yZXBvcnRfc2l6ZSArPSBib2R5LmdldF9tX25vZGVzKCkuc2l6ZSgpICogMztcblxuICAgIF9udW1fc29mdGJvZHlfb2JqZWN0cysrO1xuICB9XG4gIGVsc2Uge1xuICAgIGxldCBzaGFwZSA9IGNyZWF0ZVNoYXBlKGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICghc2hhcGUpIHJldHVybjtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBjaGlsZHJlbiB0aGVuIHRoaXMgaXMgYSBjb21wb3VuZCBzaGFwZVxuICAgIGlmIChkZXNjcmlwdGlvbi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY29tcG91bmRfc2hhcGUgPSBuZXcgQW1tby5idENvbXBvdW5kU2hhcGUoKTtcbiAgICAgIGNvbXBvdW5kX3NoYXBlLmFkZENoaWxkU2hhcGUoX3RyYW5zZm9ybSwgc2hhcGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2NyaXB0aW9uLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IF9jaGlsZCA9IGRlc2NyaXB0aW9uLmNoaWxkcmVuW2ldO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdHJhbnMuc2V0SWRlbnRpdHkoKTtcblxuICAgICAgICBfdmVjM18xLnNldFgoX2NoaWxkLnBvc2l0aW9uX29mZnNldC54KTtcbiAgICAgICAgX3ZlYzNfMS5zZXRZKF9jaGlsZC5wb3NpdGlvbl9vZmZzZXQueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihfY2hpbGQucG9zaXRpb25fb2Zmc2V0LnopO1xuICAgICAgICB0cmFucy5zZXRPcmlnaW4oX3ZlYzNfMSk7XG5cbiAgICAgICAgX3F1YXQuc2V0WChfY2hpbGQucm90YXRpb24ueCk7XG4gICAgICAgIF9xdWF0LnNldFkoX2NoaWxkLnJvdGF0aW9uLnkpO1xuICAgICAgICBfcXVhdC5zZXRaKF9jaGlsZC5yb3RhdGlvbi56KTtcbiAgICAgICAgX3F1YXQuc2V0VyhfY2hpbGQucm90YXRpb24udyk7XG4gICAgICAgIHRyYW5zLnNldFJvdGF0aW9uKF9xdWF0KTtcblxuICAgICAgICBzaGFwZSA9IGNyZWF0ZVNoYXBlKGRlc2NyaXB0aW9uLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgY29tcG91bmRfc2hhcGUuYWRkQ2hpbGRTaGFwZSh0cmFucywgc2hhcGUpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnMpO1xuICAgICAgfVxuXG4gICAgICBzaGFwZSA9IGNvbXBvdW5kX3NoYXBlO1xuICAgICAgX2NvbXBvdW5kX3NoYXBlc1tkZXNjcmlwdGlvbi5pZF0gPSBzaGFwZTtcbiAgICB9XG5cbiAgICBfdmVjM18xLnNldFgoZGVzY3JpcHRpb24uc2NhbGUueCk7XG4gICAgX3ZlYzNfMS5zZXRZKGRlc2NyaXB0aW9uLnNjYWxlLnkpO1xuICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5zY2FsZS56KTtcblxuICAgIHNoYXBlLnNldExvY2FsU2NhbGluZyhfdmVjM18xKTtcbiAgICBzaGFwZS5zZXRNYXJnaW4oXG4gICAgICB0eXBlb2YgZGVzY3JpcHRpb24ubWFyZ2luICE9PSAndW5kZWZpbmVkJyA/IGRlc2NyaXB0aW9uLm1hcmdpbiA6IDBcbiAgICApO1xuXG4gICAgX3ZlYzNfMS5zZXRYKDApO1xuICAgIF92ZWMzXzEuc2V0WSgwKTtcbiAgICBfdmVjM18xLnNldFooMCk7XG4gICAgc2hhcGUuY2FsY3VsYXRlTG9jYWxJbmVydGlhKGRlc2NyaXB0aW9uLm1hc3MsIF92ZWMzXzEpO1xuXG4gICAgX3RyYW5zZm9ybS5zZXRJZGVudGl0eSgpO1xuXG4gICAgX3ZlYzNfMi5zZXRYKGRlc2NyaXB0aW9uLnBvc2l0aW9uLngpO1xuICAgIF92ZWMzXzIuc2V0WShkZXNjcmlwdGlvbi5wb3NpdGlvbi55KTtcbiAgICBfdmVjM18yLnNldFooZGVzY3JpcHRpb24ucG9zaXRpb24ueik7XG4gICAgX3RyYW5zZm9ybS5zZXRPcmlnaW4oX3ZlYzNfMik7XG5cbiAgICBfcXVhdC5zZXRYKGRlc2NyaXB0aW9uLnJvdGF0aW9uLngpO1xuICAgIF9xdWF0LnNldFkoZGVzY3JpcHRpb24ucm90YXRpb24ueSk7XG4gICAgX3F1YXQuc2V0WihkZXNjcmlwdGlvbi5yb3RhdGlvbi56KTtcbiAgICBfcXVhdC5zZXRXKGRlc2NyaXB0aW9uLnJvdGF0aW9uLncpO1xuICAgIF90cmFuc2Zvcm0uc2V0Um90YXRpb24oX3F1YXQpO1xuXG4gICAgbW90aW9uU3RhdGUgPSBuZXcgQW1tby5idERlZmF1bHRNb3Rpb25TdGF0ZShfdHJhbnNmb3JtKTsgLy8gI1RPRE86IGJ0RGVmYXVsdE1vdGlvblN0YXRlIHN1cHBvcnRzIGNlbnRlciBvZiBtYXNzIG9mZnNldCBhcyBzZWNvbmQgYXJndW1lbnQgLSBpbXBsZW1lbnRcbiAgICBjb25zdCByYkluZm8gPSBuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8oZGVzY3JpcHRpb24ubWFzcywgbW90aW9uU3RhdGUsIHNoYXBlLCBfdmVjM18xKTtcblxuICAgIHJiSW5mby5zZXRfbV9mcmljdGlvbihkZXNjcmlwdGlvbi5mcmljdGlvbik7XG4gICAgcmJJbmZvLnNldF9tX3Jlc3RpdHV0aW9uKGRlc2NyaXB0aW9uLnJlc3RpdHV0aW9uKTtcbiAgICByYkluZm8uc2V0X21fbGluZWFyRGFtcGluZyhkZXNjcmlwdGlvbi5kYW1waW5nKTtcbiAgICByYkluZm8uc2V0X21fYW5ndWxhckRhbXBpbmcoZGVzY3JpcHRpb24uZGFtcGluZyk7XG5cbiAgICBib2R5ID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkocmJJbmZvKTtcbiAgICBib2R5LnNldEFjdGl2YXRpb25TdGF0ZShkZXNjcmlwdGlvbi5zdGF0ZSB8fCA0KTtcbiAgICBBbW1vLmRlc3Ryb3kocmJJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRpb24uY29sbGlzaW9uX2ZsYWdzICE9PSAndW5kZWZpbmVkJykgYm9keS5zZXRDb2xsaXNpb25GbGFncyhkZXNjcmlwdGlvbi5jb2xsaXNpb25fZmxhZ3MpO1xuXG4gICAgaWYgKGRlc2NyaXB0aW9uLmdyb3VwICYmIGRlc2NyaXB0aW9uLm1hc2spIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5LCBkZXNjcmlwdGlvbi5ncm91cCwgZGVzY3JpcHRpb24ubWFzayk7XG4gICAgZWxzZSB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7XG4gICAgYm9keS50eXBlID0gMTsgLy8gUmlnaWRCb2R5LlxuICAgIF9udW1fcmlnaWRib2R5X29iamVjdHMrKztcbiAgfVxuXG4gIGJvZHkuYWN0aXZhdGUoKTtcblxuICBib2R5LmlkID0gZGVzY3JpcHRpb24uaWQ7XG4gIF9vYmplY3RzW2JvZHkuaWRdID0gYm9keTtcbiAgX21vdGlvbl9zdGF0ZXNbYm9keS5pZF0gPSBtb3Rpb25TdGF0ZTtcblxuICBfb2JqZWN0c19hbW1vW2JvZHkuYSA9PT0gdW5kZWZpbmVkID8gYm9keS5wdHIgOiBib2R5LmFdID0gYm9keS5pZDtcbiAgX251bV9vYmplY3RzKys7XG5cbiAgc2VuZCh7IGNtZDogJ29iamVjdFJlYWR5JywgcGFyYW1zOiBib2R5LmlkIH0pO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5hZGRWZWhpY2xlID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGNvbnN0IHZlaGljbGVfdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7XG5cbiAgdmVoaWNsZV90dW5pbmcuc2V0X21fc3VzcGVuc2lvblN0aWZmbmVzcyhkZXNjcmlwdGlvbi5zdXNwZW5zaW9uX3N0aWZmbmVzcyk7XG4gIHZlaGljbGVfdHVuaW5nLnNldF9tX3N1c3BlbnNpb25Db21wcmVzc2lvbihkZXNjcmlwdGlvbi5zdXNwZW5zaW9uX2NvbXByZXNzaW9uKTtcbiAgdmVoaWNsZV90dW5pbmcuc2V0X21fc3VzcGVuc2lvbkRhbXBpbmcoZGVzY3JpcHRpb24uc3VzcGVuc2lvbl9kYW1waW5nKTtcbiAgdmVoaWNsZV90dW5pbmcuc2V0X21fbWF4U3VzcGVuc2lvblRyYXZlbENtKGRlc2NyaXB0aW9uLm1heF9zdXNwZW5zaW9uX3RyYXZlbCk7XG4gIHZlaGljbGVfdHVuaW5nLnNldF9tX21heFN1c3BlbnNpb25Gb3JjZShkZXNjcmlwdGlvbi5tYXhfc3VzcGVuc2lvbl9mb3JjZSk7XG5cbiAgY29uc3QgdmVoaWNsZSA9IG5ldyBBbW1vLmJ0UmF5Y2FzdFZlaGljbGUoXG4gICAgdmVoaWNsZV90dW5pbmcsXG4gICAgX29iamVjdHNbZGVzY3JpcHRpb24ucmlnaWRCb2R5XSxcbiAgICBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkKVxuICApO1xuXG4gIHZlaGljbGUudHVuaW5nID0gdmVoaWNsZV90dW5pbmc7XG4gIF9vYmplY3RzW2Rlc2NyaXB0aW9uLnJpZ2lkQm9keV0uc2V0QWN0aXZhdGlvblN0YXRlKDQpO1xuICB2ZWhpY2xlLnNldENvb3JkaW5hdGVTeXN0ZW0oMCwgMSwgMik7XG5cbiAgd29ybGQuYWRkVmVoaWNsZSh2ZWhpY2xlKTtcbiAgX3ZlaGljbGVzW2Rlc2NyaXB0aW9uLmlkXSA9IHZlaGljbGU7XG59O1xucHVibGljX2Z1bmN0aW9ucy5yZW1vdmVWZWhpY2xlID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIF92ZWhpY2xlc1tkZXNjcmlwdGlvbi5pZF0gPSBudWxsO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5hZGRXaGVlbCA9IChkZXNjcmlwdGlvbikgPT4ge1xuICBpZiAoX3ZlaGljbGVzW2Rlc2NyaXB0aW9uLmlkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHR1bmluZyA9IF92ZWhpY2xlc1tkZXNjcmlwdGlvbi5pZF0udHVuaW5nO1xuICAgIGlmIChkZXNjcmlwdGlvbi50dW5pbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7XG4gICAgICB0dW5pbmcuc2V0X21fc3VzcGVuc2lvblN0aWZmbmVzcyhkZXNjcmlwdGlvbi50dW5pbmcuc3VzcGVuc2lvbl9zdGlmZm5lc3MpO1xuICAgICAgdHVuaW5nLnNldF9tX3N1c3BlbnNpb25Db21wcmVzc2lvbihkZXNjcmlwdGlvbi50dW5pbmcuc3VzcGVuc2lvbl9jb21wcmVzc2lvbik7XG4gICAgICB0dW5pbmcuc2V0X21fc3VzcGVuc2lvbkRhbXBpbmcoZGVzY3JpcHRpb24udHVuaW5nLnN1c3BlbnNpb25fZGFtcGluZyk7XG4gICAgICB0dW5pbmcuc2V0X21fbWF4U3VzcGVuc2lvblRyYXZlbENtKGRlc2NyaXB0aW9uLnR1bmluZy5tYXhfc3VzcGVuc2lvbl90cmF2ZWwpO1xuICAgICAgdHVuaW5nLnNldF9tX21heFN1c3BlbnNpb25Gb3JjZShkZXNjcmlwdGlvbi50dW5pbmcubWF4X3N1c3BlbnNpb25fZm9yY2UpO1xuICAgIH1cblxuICAgIF92ZWMzXzEuc2V0WChkZXNjcmlwdGlvbi5jb25uZWN0aW9uX3BvaW50LngpO1xuICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5jb25uZWN0aW9uX3BvaW50LnkpO1xuICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5jb25uZWN0aW9uX3BvaW50LnopO1xuXG4gICAgX3ZlYzNfMi5zZXRYKGRlc2NyaXB0aW9uLndoZWVsX2RpcmVjdGlvbi54KTtcbiAgICBfdmVjM18yLnNldFkoZGVzY3JpcHRpb24ud2hlZWxfZGlyZWN0aW9uLnkpO1xuICAgIF92ZWMzXzIuc2V0WihkZXNjcmlwdGlvbi53aGVlbF9kaXJlY3Rpb24ueik7XG5cbiAgICBfdmVjM18zLnNldFgoZGVzY3JpcHRpb24ud2hlZWxfYXhsZS54KTtcbiAgICBfdmVjM18zLnNldFkoZGVzY3JpcHRpb24ud2hlZWxfYXhsZS55KTtcbiAgICBfdmVjM18zLnNldFooZGVzY3JpcHRpb24ud2hlZWxfYXhsZS56KTtcblxuICAgIF92ZWhpY2xlc1tkZXNjcmlwdGlvbi5pZF0uYWRkV2hlZWwoXG4gICAgICBfdmVjM18xLFxuICAgICAgX3ZlYzNfMixcbiAgICAgIF92ZWMzXzMsXG4gICAgICBkZXNjcmlwdGlvbi5zdXNwZW5zaW9uX3Jlc3RfbGVuZ3RoLFxuICAgICAgZGVzY3JpcHRpb24ud2hlZWxfcmFkaXVzLFxuICAgICAgdHVuaW5nLFxuICAgICAgZGVzY3JpcHRpb24uaXNfZnJvbnRfd2hlZWxcbiAgICApO1xuICB9XG5cbiAgX251bV93aGVlbHMrKztcblxuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICB2ZWhpY2xlcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheSgxICsgX251bV93aGVlbHMgKiBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFKTsgLy8gbWVzc2FnZSBpZCAmICggIyBvZiBvYmplY3RzIHRvIHJlcG9ydCAqICMgb2YgdmFsdWVzIHBlciBvYmplY3QgKVxuICAgIHZlaGljbGVyZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLlZFSElDTEVSRVBPUlQ7XG4gIH1cbiAgZWxzZSB2ZWhpY2xlcmVwb3J0ID0gW01FU1NBR0VfVFlQRVMuVkVISUNMRVJFUE9SVF07XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnNldFN0ZWVyaW5nID0gKGRldGFpbHMpID0+IHtcbiAgaWYgKF92ZWhpY2xlc1tkZXRhaWxzLmlkXSAhPT0gdW5kZWZpbmVkKSBfdmVoaWNsZXNbZGV0YWlscy5pZF0uc2V0U3RlZXJpbmdWYWx1ZShkZXRhaWxzLnN0ZWVyaW5nLCBkZXRhaWxzLndoZWVsKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0QnJha2UgPSAoZGV0YWlscykgPT4ge1xuICBpZiAoX3ZlaGljbGVzW2RldGFpbHMuaWRdICE9PSB1bmRlZmluZWQpIF92ZWhpY2xlc1tkZXRhaWxzLmlkXS5zZXRCcmFrZShkZXRhaWxzLmJyYWtlLCBkZXRhaWxzLndoZWVsKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuYXBwbHlFbmdpbmVGb3JjZSA9IChkZXRhaWxzKSA9PiB7XG4gIGlmIChfdmVoaWNsZXNbZGV0YWlscy5pZF0gIT09IHVuZGVmaW5lZCkgX3ZlaGljbGVzW2RldGFpbHMuaWRdLmFwcGx5RW5naW5lRm9yY2UoZGV0YWlscy5mb3JjZSwgZGV0YWlscy53aGVlbCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnJlbW92ZU9iamVjdCA9IChkZXRhaWxzKSA9PiB7XG4gIGlmIChfb2JqZWN0c1tkZXRhaWxzLmlkXS50eXBlID09PSAwKSB7XG4gICAgX251bV9zb2Z0Ym9keV9vYmplY3RzLS07XG4gICAgX3NvZnRib2R5X3JlcG9ydF9zaXplIC09IF9vYmplY3RzW2RldGFpbHMuaWRdLmdldF9tX25vZGVzKCkuc2l6ZSgpO1xuICAgIHdvcmxkLnJlbW92ZVNvZnRCb2R5KF9vYmplY3RzW2RldGFpbHMuaWRdKTtcbiAgfVxuICBlbHNlIGlmIChfb2JqZWN0c1tkZXRhaWxzLmlkXS50eXBlID09PSAxKSB7XG4gICAgX251bV9yaWdpZGJvZHlfb2JqZWN0cy0tO1xuICAgIHdvcmxkLnJlbW92ZVJpZ2lkQm9keShfb2JqZWN0c1tkZXRhaWxzLmlkXSk7XG4gICAgQW1tby5kZXN0cm95KF9tb3Rpb25fc3RhdGVzW2RldGFpbHMuaWRdKTtcbiAgfVxuXG4gIEFtbW8uZGVzdHJveShfb2JqZWN0c1tkZXRhaWxzLmlkXSk7XG4gIGlmIChfY29tcG91bmRfc2hhcGVzW2RldGFpbHMuaWRdKSBBbW1vLmRlc3Ryb3koX2NvbXBvdW5kX3NoYXBlc1tkZXRhaWxzLmlkXSk7XG4gIGlmIChfbm9uY2FjaGVkX3NoYXBlc1tkZXRhaWxzLmlkXSkgQW1tby5kZXN0cm95KF9ub25jYWNoZWRfc2hhcGVzW2RldGFpbHMuaWRdKTtcblxuICBfb2JqZWN0c19hbW1vW19vYmplY3RzW2RldGFpbHMuaWRdLmEgPT09IHVuZGVmaW5lZCA/IF9vYmplY3RzW2RldGFpbHMuaWRdLmEgOiBfb2JqZWN0c1tkZXRhaWxzLmlkXS5wdHJdID0gbnVsbDtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0gPSBudWxsO1xuICBfbW90aW9uX3N0YXRlc1tkZXRhaWxzLmlkXSA9IG51bGw7XG5cbiAgaWYgKF9jb21wb3VuZF9zaGFwZXNbZGV0YWlscy5pZF0pIF9jb21wb3VuZF9zaGFwZXNbZGV0YWlscy5pZF0gPSBudWxsO1xuICBpZiAoX25vbmNhY2hlZF9zaGFwZXNbZGV0YWlscy5pZF0pIF9ub25jYWNoZWRfc2hhcGVzW2RldGFpbHMuaWRdID0gbnVsbDtcbiAgX251bV9vYmplY3RzLS07XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnVwZGF0ZVRyYW5zZm9ybSA9IChkZXRhaWxzKSA9PiB7XG4gIF9vYmplY3QgPSBfb2JqZWN0c1tkZXRhaWxzLmlkXTtcblxuICBpZiAoX29iamVjdC50eXBlID09PSAxKSB7XG4gICAgX29iamVjdC5nZXRNb3Rpb25TdGF0ZSgpLmdldFdvcmxkVHJhbnNmb3JtKF90cmFuc2Zvcm0pO1xuXG4gICAgaWYgKGRldGFpbHMucG9zKSB7XG4gICAgICBfdmVjM18xLnNldFgoZGV0YWlscy5wb3MueCk7XG4gICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3MueSk7XG4gICAgICBfdmVjM18xLnNldFooZGV0YWlscy5wb3Mueik7XG4gICAgICBfdHJhbnNmb3JtLnNldE9yaWdpbihfdmVjM18xKTtcbiAgICB9XG5cbiAgICBpZiAoZGV0YWlscy5xdWF0KSB7XG4gICAgICBfcXVhdC5zZXRYKGRldGFpbHMucXVhdC54KTtcbiAgICAgIF9xdWF0LnNldFkoZGV0YWlscy5xdWF0LnkpO1xuICAgICAgX3F1YXQuc2V0WihkZXRhaWxzLnF1YXQueik7XG4gICAgICBfcXVhdC5zZXRXKGRldGFpbHMucXVhdC53KTtcbiAgICAgIF90cmFuc2Zvcm0uc2V0Um90YXRpb24oX3F1YXQpO1xuICAgIH1cblxuICAgIF9vYmplY3Quc2V0V29ybGRUcmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG4gICAgX29iamVjdC5hY3RpdmF0ZSgpO1xuICB9XG4gIGVsc2UgaWYgKF9vYmplY3QudHlwZSA9PT0gMCkge1xuICAgIC8vIF9vYmplY3QuZ2V0V29ybGRUcmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG5cbiAgICBpZiAoZGV0YWlscy5wb3MpIHtcbiAgICAgIF92ZWMzXzEuc2V0WChkZXRhaWxzLnBvcy54KTtcbiAgICAgIF92ZWMzXzEuc2V0WShkZXRhaWxzLnBvcy55KTtcbiAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvcy56KTtcbiAgICAgIF90cmFuc2Zvcm0uc2V0T3JpZ2luKF92ZWMzXzEpO1xuICAgIH1cblxuICAgIGlmIChkZXRhaWxzLnF1YXQpIHtcbiAgICAgIF9xdWF0LnNldFgoZGV0YWlscy5xdWF0LngpO1xuICAgICAgX3F1YXQuc2V0WShkZXRhaWxzLnF1YXQueSk7XG4gICAgICBfcXVhdC5zZXRaKGRldGFpbHMucXVhdC56KTtcbiAgICAgIF9xdWF0LnNldFcoZGV0YWlscy5xdWF0LncpO1xuICAgICAgX3RyYW5zZm9ybS5zZXRSb3RhdGlvbihfcXVhdCk7XG4gICAgfVxuXG4gICAgX29iamVjdC50cmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG4gIH1cbn07XG5cbnB1YmxpY19mdW5jdGlvbnMudXBkYXRlTWFzcyA9IChkZXRhaWxzKSA9PiB7XG4gIC8vICNUT0RPOiBjaGFuZ2luZyBhIHN0YXRpYyBvYmplY3QgaW50byBkeW5hbWljIGlzIGJ1Z2d5XG4gIF9vYmplY3QgPSBfb2JqZWN0c1tkZXRhaWxzLmlkXTtcblxuICAvLyBQZXIgaHR0cDovL3d3dy5idWxsZXRwaHlzaWNzLm9yZy9CdWxsZXQvcGhwQkIzL3ZpZXd0b3BpYy5waHA/cD0mZj05JnQ9MzY2MyNwMTM4MTZcbiAgd29ybGQucmVtb3ZlUmlnaWRCb2R5KF9vYmplY3QpO1xuXG4gIF92ZWMzXzEuc2V0WCgwKTtcbiAgX3ZlYzNfMS5zZXRZKDApO1xuICBfdmVjM18xLnNldFooMCk7XG5cbiAgX29iamVjdC5zZXRNYXNzUHJvcHMoZGV0YWlscy5tYXNzLCBfdmVjM18xKTtcbiAgd29ybGQuYWRkUmlnaWRCb2R5KF9vYmplY3QpO1xuICBfb2JqZWN0LmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5Q2VudHJhbEltcHVsc2UgPSAoZGV0YWlscykgPT4ge1xuICBfdmVjM18xLnNldFgoZGV0YWlscy54KTtcbiAgX3ZlYzNfMS5zZXRZKGRldGFpbHMueSk7XG4gIF92ZWMzXzEuc2V0WihkZXRhaWxzLnopO1xuXG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFwcGx5Q2VudHJhbEltcHVsc2UoX3ZlYzNfMSk7XG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5SW1wdWxzZSA9IChkZXRhaWxzKSA9PiB7XG4gIF92ZWMzXzEuc2V0WChkZXRhaWxzLmltcHVsc2VfeCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLmltcHVsc2VfeSk7XG4gIF92ZWMzXzEuc2V0WihkZXRhaWxzLmltcHVsc2Vfeik7XG5cbiAgX3ZlYzNfMi5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzIuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18yLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseUltcHVsc2UoXG4gICAgX3ZlYzNfMSxcbiAgICBfdmVjM18yXG4gICk7XG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5VG9ycXVlID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMudG9ycXVlX3gpO1xuICBfdmVjM18xLnNldFkoZGV0YWlscy50b3JxdWVfeSk7XG4gIF92ZWMzXzEuc2V0WihkZXRhaWxzLnRvcnF1ZV96KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseVRvcnF1ZShcbiAgICBfdmVjM18xXG4gICk7XG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5Q2VudHJhbEZvcmNlID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseUNlbnRyYWxGb3JjZShfdmVjM18xKTtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0uYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuYXBwbHlGb3JjZSA9IChkZXRhaWxzKSA9PiB7XG4gIF92ZWMzXzEuc2V0WChkZXRhaWxzLmZvcmNlX3gpO1xuICBfdmVjM18xLnNldFkoZGV0YWlscy5mb3JjZV95KTtcbiAgX3ZlYzNfMS5zZXRaKGRldGFpbHMuZm9yY2Vfeik7XG5cbiAgX3ZlYzNfMi5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzIuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18yLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseUZvcmNlKFxuICAgIF92ZWMzXzEsXG4gICAgX3ZlYzNfMlxuICApO1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5vblNpbXVsYXRpb25SZXN1bWUgPSAoKSA9PiB7XG4gIGxhc3Rfc2ltdWxhdGlvbl90aW1lID0gRGF0ZS5ub3coKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0QW5ndWxhclZlbG9jaXR5ID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRBbmd1bGFyVmVsb2NpdHkoXG4gICAgX3ZlYzNfMVxuICApO1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXRMaW5lYXJWZWxvY2l0eSA9IChkZXRhaWxzKSA9PiB7XG4gIF92ZWMzXzEuc2V0WChkZXRhaWxzLngpO1xuICBfdmVjM18xLnNldFkoZGV0YWlscy55KTtcbiAgX3ZlYzNfMS5zZXRaKGRldGFpbHMueik7XG5cbiAgX29iamVjdHNbZGV0YWlscy5pZF0uc2V0TGluZWFyVmVsb2NpdHkoXG4gICAgX3ZlYzNfMVxuICApO1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXRBbmd1bGFyRmFjdG9yID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRBbmd1bGFyRmFjdG9yKFxuICAgIF92ZWMzXzFcbiAgKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0TGluZWFyRmFjdG9yID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRMaW5lYXJGYWN0b3IoXG4gICAgX3ZlYzNfMVxuICApO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXREYW1waW5nID0gKGRldGFpbHMpID0+IHtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0uc2V0RGFtcGluZyhkZXRhaWxzLmxpbmVhciwgZGV0YWlscy5hbmd1bGFyKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0Q2NkTW90aW9uVGhyZXNob2xkID0gKGRldGFpbHMpID0+IHtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0uc2V0Q2NkTW90aW9uVGhyZXNob2xkKGRldGFpbHMudGhyZXNob2xkKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0Q2NkU3dlcHRTcGhlcmVSYWRpdXMgPSAoZGV0YWlscykgPT4ge1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRDY2RTd2VwdFNwaGVyZVJhZGl1cyhkZXRhaWxzLnJhZGl1cyk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFkZENvbnN0cmFpbnQgPSAoZGV0YWlscykgPT4ge1xuICBsZXQgY29uc3RyYWludDtcblxuICBzd2l0Y2ggKGRldGFpbHMudHlwZSkge1xuXG4gIGNhc2UgJ3BvaW50JzpcbiAgICB7XG4gICAgICBpZiAoZGV0YWlscy5vYmplY3RiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBjb25zdHJhaW50ID0gbmV3IEFtbW8uYnRQb2ludDJQb2ludENvbnN0cmFpbnQoXG4gICAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RhXSxcbiAgICAgICAgICBfdmVjM18xXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICAgIF92ZWMzXzIuc2V0WShkZXRhaWxzLnBvc2l0aW9uYi55KTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRldGFpbHMucG9zaXRpb25iLnopO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQW1tby5idFBvaW50MlBvaW50Q29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0Yl0sXG4gICAgICAgICAgX3ZlYzNfMSxcbiAgICAgICAgICBfdmVjM18yXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2hpbmdlJzpcbiAgICB7XG4gICAgICBpZiAoZGV0YWlscy5vYmplY3RiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5heGlzLngpO1xuICAgICAgICBfdmVjM18yLnNldFkoZGV0YWlscy5heGlzLnkpO1xuICAgICAgICBfdmVjM18yLnNldFooZGV0YWlscy5heGlzLnopO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQW1tby5idEhpbmdlQ29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF92ZWMzXzEsXG4gICAgICAgICAgX3ZlYzNfMlxuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICAgIF92ZWMzXzIuc2V0WShkZXRhaWxzLnBvc2l0aW9uYi55KTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRldGFpbHMucG9zaXRpb25iLnopO1xuXG4gICAgICAgIF92ZWMzXzMuc2V0WChkZXRhaWxzLmF4aXMueCk7XG4gICAgICAgIF92ZWMzXzMuc2V0WShkZXRhaWxzLmF4aXMueSk7XG4gICAgICAgIF92ZWMzXzMuc2V0WihkZXRhaWxzLmF4aXMueik7XG5cbiAgICAgICAgY29uc3RyYWludCA9IG5ldyBBbW1vLmJ0SGluZ2VDb25zdHJhaW50KFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0YV0sXG4gICAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RiXSxcbiAgICAgICAgICBfdmVjM18xLFxuICAgICAgICAgIF92ZWMzXzIsXG4gICAgICAgICAgX3ZlYzNfMyxcbiAgICAgICAgICBfdmVjM18zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ3NsaWRlcic6XG4gICAge1xuICAgICAgbGV0IHRyYW5zZm9ybWI7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1hID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgX3ZlYzNfMS5zZXRZKGRldGFpbHMucG9zaXRpb25hLnkpO1xuICAgICAgX3ZlYzNfMS5zZXRaKGRldGFpbHMucG9zaXRpb25hLnopO1xuXG4gICAgICB0cmFuc2Zvcm1hLnNldE9yaWdpbihfdmVjM18xKTtcblxuICAgICAgbGV0IHJvdGF0aW9uID0gdHJhbnNmb3JtYS5nZXRSb3RhdGlvbigpO1xuICAgICAgcm90YXRpb24uc2V0RXVsZXIoZGV0YWlscy5heGlzLngsIGRldGFpbHMuYXhpcy55LCBkZXRhaWxzLmF4aXMueik7XG4gICAgICB0cmFuc2Zvcm1hLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcblxuICAgICAgaWYgKGRldGFpbHMub2JqZWN0Yikge1xuICAgICAgICB0cmFuc2Zvcm1iID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICAgIF92ZWMzXzIuc2V0WShkZXRhaWxzLnBvc2l0aW9uYi55KTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRldGFpbHMucG9zaXRpb25iLnopO1xuXG4gICAgICAgIHRyYW5zZm9ybWIuc2V0T3JpZ2luKF92ZWMzXzIpO1xuXG4gICAgICAgIHJvdGF0aW9uID0gdHJhbnNmb3JtYi5nZXRSb3RhdGlvbigpO1xuICAgICAgICByb3RhdGlvbi5zZXRFdWxlcihkZXRhaWxzLmF4aXMueCwgZGV0YWlscy5heGlzLnksIGRldGFpbHMuYXhpcy56KTtcbiAgICAgICAgdHJhbnNmb3JtYi5zZXRSb3RhdGlvbihyb3RhdGlvbik7XG5cbiAgICAgICAgY29uc3RyYWludCA9IG5ldyBBbW1vLmJ0U2xpZGVyQ29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0Yl0sXG4gICAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgICB0cmFuc2Zvcm1iLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdHJhaW50ID0gbmV3IEFtbW8uYnRTbGlkZXJDb25zdHJhaW50KFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0YV0sXG4gICAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0cmFpbnQudGEgPSB0cmFuc2Zvcm1hO1xuICAgICAgY29uc3RyYWludC50YiA9IHRyYW5zZm9ybWI7XG5cbiAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm1hKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1iICE9PSB1bmRlZmluZWQpIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm1iKTtcblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdjb25ldHdpc3QnOlxuICAgIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWEgPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuICAgICAgdHJhbnNmb3JtYS5zZXRJZGVudGl0eSgpO1xuXG4gICAgICBjb25zdCB0cmFuc2Zvcm1iID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgIHRyYW5zZm9ybWIuc2V0SWRlbnRpdHkoKTtcblxuICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgX3ZlYzNfMS5zZXRZKGRldGFpbHMucG9zaXRpb25hLnkpO1xuICAgICAgX3ZlYzNfMS5zZXRaKGRldGFpbHMucG9zaXRpb25hLnopO1xuXG4gICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICBfdmVjM18yLnNldFkoZGV0YWlscy5wb3NpdGlvbmIueSk7XG4gICAgICBfdmVjM18yLnNldFooZGV0YWlscy5wb3NpdGlvbmIueik7XG5cbiAgICAgIHRyYW5zZm9ybWEuc2V0T3JpZ2luKF92ZWMzXzEpO1xuICAgICAgdHJhbnNmb3JtYi5zZXRPcmlnaW4oX3ZlYzNfMik7XG5cbiAgICAgIGxldCByb3RhdGlvbiA9IHRyYW5zZm9ybWEuZ2V0Um90YXRpb24oKTtcbiAgICAgIHJvdGF0aW9uLnNldEV1bGVyWllYKC1kZXRhaWxzLmF4aXNhLnosIC1kZXRhaWxzLmF4aXNhLnksIC1kZXRhaWxzLmF4aXNhLngpO1xuICAgICAgdHJhbnNmb3JtYS5zZXRSb3RhdGlvbihyb3RhdGlvbik7XG5cbiAgICAgIHJvdGF0aW9uID0gdHJhbnNmb3JtYi5nZXRSb3RhdGlvbigpO1xuICAgICAgcm90YXRpb24uc2V0RXVsZXJaWVgoLWRldGFpbHMuYXhpc2IueiwgLWRldGFpbHMuYXhpc2IueSwgLWRldGFpbHMuYXhpc2IueCk7XG4gICAgICB0cmFuc2Zvcm1iLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcblxuICAgICAgY29uc3RyYWludCA9IG5ldyBBbW1vLmJ0Q29uZVR3aXN0Q29uc3RyYWludChcbiAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RhXSxcbiAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RiXSxcbiAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgdHJhbnNmb3JtYlxuICAgICAgKTtcblxuICAgICAgY29uc3RyYWludC5zZXRMaW1pdChNYXRoLlBJLCAwLCBNYXRoLlBJKTtcblxuICAgICAgY29uc3RyYWludC50YSA9IHRyYW5zZm9ybWE7XG4gICAgICBjb25zdHJhaW50LnRiID0gdHJhbnNmb3JtYjtcblxuICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybWEpO1xuICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybWIpO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2RvZic6XG4gICAge1xuICAgICAgbGV0IHRyYW5zZm9ybWI7XG5cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWEgPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuICAgICAgdHJhbnNmb3JtYS5zZXRJZGVudGl0eSgpO1xuXG4gICAgICBfdmVjM18xLnNldFgoZGV0YWlscy5wb3NpdGlvbmEueCk7XG4gICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICBfdmVjM18xLnNldFooZGV0YWlscy5wb3NpdGlvbmEueik7XG5cbiAgICAgIHRyYW5zZm9ybWEuc2V0T3JpZ2luKF92ZWMzXzEpO1xuXG4gICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1hLmdldFJvdGF0aW9uKCk7XG4gICAgICByb3RhdGlvbi5zZXRFdWxlclpZWCgtZGV0YWlscy5heGlzYS56LCAtZGV0YWlscy5heGlzYS55LCAtZGV0YWlscy5heGlzYS54KTtcbiAgICAgIHRyYW5zZm9ybWEuc2V0Um90YXRpb24ocm90YXRpb24pO1xuXG4gICAgICBpZiAoZGV0YWlscy5vYmplY3RiKSB7XG4gICAgICAgIHRyYW5zZm9ybWIgPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuICAgICAgICB0cmFuc2Zvcm1iLnNldElkZW50aXR5KCk7XG5cbiAgICAgICAgX3ZlYzNfMi5zZXRYKGRldGFpbHMucG9zaXRpb25iLngpO1xuICAgICAgICBfdmVjM18yLnNldFkoZGV0YWlscy5wb3NpdGlvbmIueSk7XG4gICAgICAgIF92ZWMzXzIuc2V0WihkZXRhaWxzLnBvc2l0aW9uYi56KTtcblxuICAgICAgICB0cmFuc2Zvcm1iLnNldE9yaWdpbihfdmVjM18yKTtcblxuICAgICAgICByb3RhdGlvbiA9IHRyYW5zZm9ybWIuZ2V0Um90YXRpb24oKTtcbiAgICAgICAgcm90YXRpb24uc2V0RXVsZXJaWVgoLWRldGFpbHMuYXhpc2IueiwgLWRldGFpbHMuYXhpc2IueSwgLWRldGFpbHMuYXhpc2IueCk7XG4gICAgICAgIHRyYW5zZm9ybWIuc2V0Um90YXRpb24ocm90YXRpb24pO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQW1tby5idEdlbmVyaWM2RG9mQ29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0Yl0sXG4gICAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgICB0cmFuc2Zvcm1iLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdHJhaW50ID0gbmV3IEFtbW8uYnRHZW5lcmljNkRvZkNvbnN0cmFpbnQoXG4gICAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RhXSxcbiAgICAgICAgICB0cmFuc2Zvcm1hLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3RyYWludC50YSA9IHRyYW5zZm9ybWE7XG4gICAgICBjb25zdHJhaW50LnRiID0gdHJhbnNmb3JtYjtcblxuICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybWEpO1xuICAgICAgaWYgKHRyYW5zZm9ybWIgIT09IHVuZGVmaW5lZCkgQW1tby5kZXN0cm95KHRyYW5zZm9ybWIpO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd29ybGQuYWRkQ29uc3RyYWludChjb25zdHJhaW50KTtcblxuICBjb25zdHJhaW50LmEgPSBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdO1xuICBjb25zdHJhaW50LmIgPSBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGJdO1xuXG4gIGNvbnN0cmFpbnQuZW5hYmxlRmVlZGJhY2soKTtcbiAgX2NvbnN0cmFpbnRzW2RldGFpbHMuaWRdID0gY29uc3RyYWludDtcbiAgX251bV9jb25zdHJhaW50cysrO1xuXG4gIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkge1xuICAgIGNvbnN0cmFpbnRyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KDEgKyBfbnVtX2NvbnN0cmFpbnRzICogQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSk7IC8vIG1lc3NhZ2UgaWQgJiAoICMgb2Ygb2JqZWN0cyB0byByZXBvcnQgKiAjIG9mIHZhbHVlcyBwZXIgb2JqZWN0IClcbiAgICBjb25zdHJhaW50cmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5DT05TVFJBSU5UUkVQT1JUO1xuICB9XG4gIGVsc2UgY29uc3RyYWludHJlcG9ydCA9IFtNRVNTQUdFX1RZUEVTLkNPTlNUUkFJTlRSRVBPUlRdO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5yZW1vdmVDb25zdHJhaW50ID0gKGRldGFpbHMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1tkZXRhaWxzLmlkXTtcblxuICBpZiAoY29uc3RyYWludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd29ybGQucmVtb3ZlQ29uc3RyYWludChjb25zdHJhaW50KTtcbiAgICBfY29uc3RyYWludHNbZGV0YWlscy5pZF0gPSBudWxsO1xuICAgIF9udW1fY29uc3RyYWludHMtLTtcbiAgfVxufTtcblxucHVibGljX2Z1bmN0aW9ucy5jb25zdHJhaW50X3NldEJyZWFraW5nSW1wdWxzZVRocmVzaG9sZCA9IChkZXRhaWxzKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbZGV0YWlscy5pZF07XG4gIGlmIChjb25zdHJhaW50ICE9PSB1bmRlZmluZWQpIGNvbnN0cmFpbnQuc2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkKGRldGFpbHMudGhyZXNob2xkKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2ltdWxhdGUgPSAocGFyYW1zID0ge30pID0+IHtcbiAgaWYgKHdvcmxkKSB7XG4gICAgaWYgKHBhcmFtcy50aW1lU3RlcCAmJiBwYXJhbXMudGltZVN0ZXAgPCBmaXhlZFRpbWVTdGVwKVxuICAgICAgcGFyYW1zLnRpbWVTdGVwID0gZml4ZWRUaW1lU3RlcDtcblxuICAgIHBhcmFtcy5tYXhTdWJTdGVwcyA9IHBhcmFtcy5tYXhTdWJTdGVwcyB8fCBNYXRoLmNlaWwocGFyYW1zLnRpbWVTdGVwIC8gZml4ZWRUaW1lU3RlcCk7IC8vIElmIG1heFN1YlN0ZXBzIGlzIG5vdCBkZWZpbmVkLCBrZWVwIHRoZSBzaW11bGF0aW9uIGZ1bGx5IHVwIHRvIGRhdGVcblxuICAgIHdvcmxkLnN0ZXBTaW11bGF0aW9uKHBhcmFtcy50aW1lU3RlcCwgcGFyYW1zLm1heFN1YlN0ZXBzLCBmaXhlZFRpbWVTdGVwKTtcblxuICAgIGlmIChfdmVoaWNsZXMubGVuZ3RoID4gMCkgcmVwb3J0VmVoaWNsZXMoKTtcbiAgICByZXBvcnRDb2xsaXNpb25zKCk7XG4gICAgaWYgKF9jb25zdHJhaW50cy5sZW5ndGggPiAwKSByZXBvcnRDb25zdHJhaW50cygpO1xuICAgIHJlcG9ydFdvcmxkKCk7XG4gICAgaWYgKF9zb2Z0Ym9keV9lbmFibGVkKSByZXBvcnRXb3JsZF9zb2Z0Ym9kaWVzKCk7XG4gIH1cbn07XG5cbi8vIENvbnN0cmFpbnQgZnVuY3Rpb25zXG5wdWJsaWNfZnVuY3Rpb25zLmhpbmdlX3NldExpbWl0cyA9IChwYXJhbXMpID0+IHtcbiAgX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XS5zZXRMaW1pdChwYXJhbXMubG93LCBwYXJhbXMuaGlnaCwgMCwgcGFyYW1zLmJpYXNfZmFjdG9yLCBwYXJhbXMucmVsYXhhdGlvbl9mYWN0b3IpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5oaW5nZV9lbmFibGVBbmd1bGFyTW90b3IgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuICBjb25zdHJhaW50LmVuYWJsZUFuZ3VsYXJNb3Rvcih0cnVlLCBwYXJhbXMudmVsb2NpdHksIHBhcmFtcy5hY2NlbGVyYXRpb24pO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmhpbmdlX2Rpc2FibGVNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XS5lbmFibGVNb3RvcihmYWxzZSk7XG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zbGlkZXJfc2V0TGltaXRzID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRMb3dlckxpbkxpbWl0KHBhcmFtcy5saW5fbG93ZXIgfHwgMCk7XG4gIGNvbnN0cmFpbnQuc2V0VXBwZXJMaW5MaW1pdChwYXJhbXMubGluX3VwcGVyIHx8IDApO1xuXG4gIGNvbnN0cmFpbnQuc2V0TG93ZXJBbmdMaW1pdChwYXJhbXMuYW5nX2xvd2VyIHx8IDApO1xuICBjb25zdHJhaW50LnNldFVwcGVyQW5nTGltaXQocGFyYW1zLmFuZ191cHBlciB8fCAwKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2xpZGVyX3NldFJlc3RpdHV0aW9uID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRTb2Z0bmVzc0xpbUxpbihwYXJhbXMubGluZWFyIHx8IDApO1xuICBjb25zdHJhaW50LnNldFNvZnRuZXNzTGltQW5nKHBhcmFtcy5hbmd1bGFyIHx8IDApO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zbGlkZXJfZW5hYmxlTGluZWFyTW90b3IgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuICBjb25zdHJhaW50LnNldFRhcmdldExpbk1vdG9yVmVsb2NpdHkocGFyYW1zLnZlbG9jaXR5KTtcbiAgY29uc3RyYWludC5zZXRNYXhMaW5Nb3RvckZvcmNlKHBhcmFtcy5hY2NlbGVyYXRpb24pO1xuICBjb25zdHJhaW50LnNldFBvd2VyZWRMaW5Nb3Rvcih0cnVlKTtcbiAgY29uc3RyYWludC5hLmFjdGl2YXRlKCk7XG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zbGlkZXJfZGlzYWJsZUxpbmVhck1vdG9yID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRQb3dlcmVkTGluTW90b3IoZmFsc2UpO1xuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2xpZGVyX2VuYWJsZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG4gIGNvbnN0cmFpbnQuc2V0VGFyZ2V0QW5nTW90b3JWZWxvY2l0eShwYXJhbXMudmVsb2NpdHkpO1xuICBjb25zdHJhaW50LnNldE1heEFuZ01vdG9yRm9yY2UocGFyYW1zLmFjY2VsZXJhdGlvbik7XG4gIGNvbnN0cmFpbnQuc2V0UG93ZXJlZEFuZ01vdG9yKHRydWUpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnNsaWRlcl9kaXNhYmxlQW5ndWxhck1vdG9yID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRQb3dlcmVkQW5nTW90b3IoZmFsc2UpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmNvbmV0d2lzdF9zZXRMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XS5zZXRMaW1pdChwYXJhbXMueiwgcGFyYW1zLnksIHBhcmFtcy54KTsgLy8gWllYIG9yZGVyXG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmNvbmV0d2lzdF9lbmFibGVNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG4gIGNvbnN0cmFpbnQuZW5hYmxlTW90b3IodHJ1ZSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuICBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuY29uZXR3aXN0X3NldE1heE1vdG9ySW1wdWxzZSA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG4gIGNvbnN0cmFpbnQuc2V0TWF4TW90b3JJbXB1bHNlKHBhcmFtcy5tYXhfaW1wdWxzZSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuICBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuY29uZXR3aXN0X3NldE1vdG9yVGFyZ2V0ID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcblxuICBfcXVhdC5zZXRYKHBhcmFtcy54KTtcbiAgX3F1YXQuc2V0WShwYXJhbXMueSk7XG4gIF9xdWF0LnNldFoocGFyYW1zLnopO1xuICBfcXVhdC5zZXRXKHBhcmFtcy53KTtcblxuICBjb25zdHJhaW50LnNldE1vdG9yVGFyZ2V0KF9xdWF0KTtcblxuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmNvbmV0d2lzdF9kaXNhYmxlTW90b3IgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuICBjb25zdHJhaW50LmVuYWJsZU1vdG9yKGZhbHNlKTtcbiAgY29uc3RyYWludC5hLmFjdGl2YXRlKCk7XG4gIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2Zfc2V0TGluZWFyTG93ZXJMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgX3ZlYzNfMS5zZXRYKHBhcmFtcy54KTtcbiAgX3ZlYzNfMS5zZXRZKHBhcmFtcy55KTtcbiAgX3ZlYzNfMS5zZXRaKHBhcmFtcy56KTtcblxuICBjb25zdHJhaW50LnNldExpbmVhckxvd2VyTGltaXQoX3ZlYzNfMSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuXG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2Zfc2V0TGluZWFyVXBwZXJMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgX3ZlYzNfMS5zZXRYKHBhcmFtcy54KTtcbiAgX3ZlYzNfMS5zZXRZKHBhcmFtcy55KTtcbiAgX3ZlYzNfMS5zZXRaKHBhcmFtcy56KTtcblxuICBjb25zdHJhaW50LnNldExpbmVhclVwcGVyTGltaXQoX3ZlYzNfMSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuXG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2Zfc2V0QW5ndWxhckxvd2VyTGltaXQgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuXG4gIF92ZWMzXzEuc2V0WChwYXJhbXMueCk7XG4gIF92ZWMzXzEuc2V0WShwYXJhbXMueSk7XG4gIF92ZWMzXzEuc2V0WihwYXJhbXMueik7XG5cbiAgY29uc3RyYWludC5zZXRBbmd1bGFyTG93ZXJMaW1pdChfdmVjM18xKTtcbiAgY29uc3RyYWludC5hLmFjdGl2YXRlKCk7XG5cbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmRvZl9zZXRBbmd1bGFyVXBwZXJMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgX3ZlYzNfMS5zZXRYKHBhcmFtcy54KTtcbiAgX3ZlYzNfMS5zZXRZKHBhcmFtcy55KTtcbiAgX3ZlYzNfMS5zZXRaKHBhcmFtcy56KTtcblxuICBjb25zdHJhaW50LnNldEFuZ3VsYXJVcHBlckxpbWl0KF92ZWMzXzEpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcblxuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuZG9mX2VuYWJsZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgY29uc3QgbW90b3IgPSBjb25zdHJhaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKHBhcmFtcy53aGljaCk7XG4gIG1vdG9yLnNldF9tX2VuYWJsZU1vdG9yKHRydWUpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcblxuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuZG9mX2NvbmZpZ3VyZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF0sXG4gICAgbW90b3IgPSBjb25zdHJhaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKHBhcmFtcy53aGljaCk7XG5cbiAgbW90b3Iuc2V0X21fbG9MaW1pdChwYXJhbXMubG93X2FuZ2xlKTtcbiAgbW90b3Iuc2V0X21faGlMaW1pdChwYXJhbXMuaGlnaF9hbmdsZSk7XG4gIG1vdG9yLnNldF9tX3RhcmdldFZlbG9jaXR5KHBhcmFtcy52ZWxvY2l0eSk7XG4gIG1vdG9yLnNldF9tX21heE1vdG9yRm9yY2UocGFyYW1zLm1heF9mb3JjZSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuXG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2ZfZGlzYWJsZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF0sXG4gICAgbW90b3IgPSBjb25zdHJhaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKHBhcmFtcy53aGljaCk7XG5cbiAgbW90b3Iuc2V0X21fZW5hYmxlTW90b3IoZmFsc2UpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcblxuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbmNvbnN0IHJlcG9ydFdvcmxkID0gKCkgPT4ge1xuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUgJiYgd29ybGRyZXBvcnQubGVuZ3RoIDwgMiArIF9udW1fcmlnaWRib2R5X29iamVjdHMgKiBXT1JMRFJFUE9SVF9JVEVNU0laRSkge1xuICAgIHdvcmxkcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShcbiAgICAgIDIgLy8gbWVzc2FnZSBpZCAmICMgb2JqZWN0cyBpbiByZXBvcnRcbiAgICAgICtcbiAgICAgIChNYXRoLmNlaWwoX251bV9yaWdpZGJvZHlfb2JqZWN0cyAvIFJFUE9SVF9DSFVOS1NJWkUpICogUkVQT1JUX0NIVU5LU0laRSkgKiBXT1JMRFJFUE9SVF9JVEVNU0laRSAvLyAjIG9mIHZhbHVlcyBuZWVkZWQgKiBpdGVtIHNpemVcbiAgICApO1xuXG4gICAgd29ybGRyZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLldPUkxEUkVQT1JUO1xuICB9XG5cbiAgd29ybGRyZXBvcnRbMV0gPSBfbnVtX3JpZ2lkYm9keV9vYmplY3RzOyAvLyByZWNvcmQgaG93IG1hbnkgb2JqZWN0cyB3ZSdyZSByZXBvcnRpbmcgb25cblxuICB7XG4gICAgbGV0IGkgPSAwLFxuICAgICAgaW5kZXggPSBfb2JqZWN0cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gX29iamVjdHNbaW5kZXhdO1xuXG4gICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC50eXBlID09PSAxKSB7IC8vIFJpZ2lkQm9kaWVzLlxuICAgICAgICAvLyAjVE9ETzogd2UgY2FuJ3QgdXNlIGNlbnRlciBvZiBtYXNzIHRyYW5zZm9ybSB3aGVuIGNlbnRlciBvZiBtYXNzIGNhbiBjaGFuZ2UsXG4gICAgICAgIC8vICAgICAgICBidXQgZ2V0TW90aW9uU3RhdGUoKS5nZXRXb3JsZFRyYW5zZm9ybSgpIHNjcmV3cyB1cCBvbiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1vdmVkXG4gICAgICAgIC8vIG9iamVjdC5nZXRNb3Rpb25TdGF0ZSgpLmdldFdvcmxkVHJhbnNmb3JtKCB0cmFuc2Zvcm0gKTtcbiAgICAgICAgLy8gb2JqZWN0LmdldE1vdGlvblN0YXRlKCkuZ2V0V29ybGRUcmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gb2JqZWN0LmdldENlbnRlck9mTWFzc1RyYW5zZm9ybSgpO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgICAgIGNvbnN0IHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7XG5cbiAgICAgICAgLy8gYWRkIHZhbHVlcyB0byByZXBvcnRcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMiArIChpKyspICogV09STERSRVBPUlRfSVRFTVNJWkU7XG5cbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0XSA9IG9iamVjdC5pZDtcblxuICAgICAgICB3b3JsZHJlcG9ydFtvZmZzZXQgKyAxXSA9IG9yaWdpbi54KCk7XG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDJdID0gb3JpZ2luLnkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgM10gPSBvcmlnaW4ueigpO1xuXG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDRdID0gcm90YXRpb24ueCgpO1xuICAgICAgICB3b3JsZHJlcG9ydFtvZmZzZXQgKyA1XSA9IHJvdGF0aW9uLnkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgNl0gPSByb3RhdGlvbi56KCk7XG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDddID0gcm90YXRpb24udygpO1xuXG4gICAgICAgIF92ZWN0b3IgPSBvYmplY3QuZ2V0TGluZWFyVmVsb2NpdHkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgOF0gPSBfdmVjdG9yLngoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgOV0gPSBfdmVjdG9yLnkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgMTBdID0gX3ZlY3Rvci56KCk7XG5cbiAgICAgICAgX3ZlY3RvciA9IG9iamVjdC5nZXRBbmd1bGFyVmVsb2NpdHkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgMTFdID0gX3ZlY3Rvci54KCk7XG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDEyXSA9IF92ZWN0b3IueSgpO1xuICAgICAgICB3b3JsZHJlcG9ydFtvZmZzZXQgKyAxM10gPSBfdmVjdG9yLnooKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHNlbmQod29ybGRyZXBvcnQuYnVmZmVyLCBbd29ybGRyZXBvcnQuYnVmZmVyXSk7XG4gIGVsc2Ugc2VuZCh3b3JsZHJlcG9ydCk7XG59O1xuXG5jb25zdCByZXBvcnRXb3JsZF9zb2Z0Ym9kaWVzID0gKCkgPT4ge1xuICAvLyBUT0RPOiBBZGQgU1VQUE9SVFRSQU5TRkVSQUJMRS5cblxuICBzb2Z0cmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShcbiAgICAyIC8vIG1lc3NhZ2UgaWQgJiAjIG9iamVjdHMgaW4gcmVwb3J0XG4gICAgK1xuICAgIF9udW1fc29mdGJvZHlfb2JqZWN0cyAqIDIgK1xuICAgIF9zb2Z0Ym9keV9yZXBvcnRfc2l6ZSAqIDZcbiAgKTtcblxuICBzb2Z0cmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5TT0ZUUkVQT1JUO1xuICBzb2Z0cmVwb3J0WzFdID0gX251bV9zb2Z0Ym9keV9vYmplY3RzOyAvLyByZWNvcmQgaG93IG1hbnkgb2JqZWN0cyB3ZSdyZSByZXBvcnRpbmcgb25cblxuICB7XG4gICAgbGV0IG9mZnNldCA9IDIsXG4gICAgICBpbmRleCA9IF9vYmplY3RzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBjb25zdCBvYmplY3QgPSBfb2JqZWN0c1tpbmRleF07XG5cbiAgICAgIGlmIChvYmplY3QgJiYgb2JqZWN0LnR5cGUgPT09IDApIHsgLy8gU29mdEJvZGllcy5cblxuICAgICAgICBzb2Z0cmVwb3J0W29mZnNldF0gPSBvYmplY3QuaWQ7XG5cbiAgICAgICAgY29uc3Qgb2Zmc2V0VmVydCA9IG9mZnNldCArIDI7XG5cbiAgICAgICAgaWYgKG9iamVjdC5yb3BlID09PSB0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSBvYmplY3QuZ2V0X21fbm9kZXMoKTtcbiAgICAgICAgICBjb25zdCBzaXplID0gbm9kZXMuc2l6ZSgpO1xuICAgICAgICAgIHNvZnRyZXBvcnRbb2Zmc2V0ICsgMV0gPSBzaXplO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5hdChpKTtcbiAgICAgICAgICAgIGNvbnN0IHZlcnQgPSBub2RlLmdldF9tX3goKTtcbiAgICAgICAgICAgIGNvbnN0IG9mZiA9IG9mZnNldFZlcnQgKyBpICogMztcblxuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmZdID0gdmVydC54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDFdID0gdmVydC55KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDJdID0gdmVydC56KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiAzICsgMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmplY3QuY2xvdGgpIHtcbiAgICAgICAgICBjb25zdCBub2RlcyA9IG9iamVjdC5nZXRfbV9ub2RlcygpO1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBub2Rlcy5zaXplKCk7XG4gICAgICAgICAgc29mdHJlcG9ydFtvZmZzZXQgKyAxXSA9IHNpemU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLmF0KGkpO1xuICAgICAgICAgICAgY29uc3QgdmVydCA9IG5vZGUuZ2V0X21feCgpO1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsID0gbm9kZS5nZXRfbV9uKCk7XG4gICAgICAgICAgICBjb25zdCBvZmYgPSBvZmZzZXRWZXJ0ICsgaSAqIDY7XG5cbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmXSA9IHZlcnQueCgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAxXSA9IHZlcnQueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAyXSA9IHZlcnQueigpO1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDNdID0gLW5vcm1hbC54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDRdID0gLW5vcm1hbC55KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDVdID0gLW5vcm1hbC56KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiA2ICsgMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmYWNlcyA9IG9iamVjdC5nZXRfbV9mYWNlcygpO1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBmYWNlcy5zaXplKCk7XG4gICAgICAgICAgc29mdHJlcG9ydFtvZmZzZXQgKyAxXSA9IHNpemU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZmFjZSA9IGZhY2VzLmF0KGkpO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlMSA9IGZhY2UuZ2V0X21fbigwKTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUyID0gZmFjZS5nZXRfbV9uKDEpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZTMgPSBmYWNlLmdldF9tX24oMik7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcnQxID0gbm9kZTEuZ2V0X21feCgpO1xuICAgICAgICAgICAgY29uc3QgdmVydDIgPSBub2RlMi5nZXRfbV94KCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0MyA9IG5vZGUzLmdldF9tX3goKTtcblxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsMSA9IG5vZGUxLmdldF9tX24oKTtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbDIgPSBub2RlMi5nZXRfbV9uKCk7XG4gICAgICAgICAgICBjb25zdCBub3JtYWwzID0gbm9kZTMuZ2V0X21fbigpO1xuXG4gICAgICAgICAgICBjb25zdCBvZmYgPSBvZmZzZXRWZXJ0ICsgaSAqIDE4O1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZl0gPSB2ZXJ0MS54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDFdID0gdmVydDEueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAyXSA9IHZlcnQxLnooKTtcblxuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAzXSA9IG5vcm1hbDEueCgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyA0XSA9IG5vcm1hbDEueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyA1XSA9IG5vcm1hbDEueigpO1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDZdID0gdmVydDIueCgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyA3XSA9IHZlcnQyLnkoKTtcbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgOF0gPSB2ZXJ0Mi56KCk7XG5cbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgOV0gPSBub3JtYWwyLngoKTtcbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgMTBdID0gbm9ybWFsMi55KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDExXSA9IG5vcm1hbDIueigpO1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDEyXSA9IHZlcnQzLngoKTtcbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgMTNdID0gdmVydDMueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAxNF0gPSB2ZXJ0My56KCk7XG5cbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgMTVdID0gbm9ybWFsMy54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDE2XSA9IG5vcm1hbDMueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAxN10gPSBub3JtYWwzLnooKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvZmZzZXQgKz0gc2l6ZSAqIDE4ICsgMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkgc2VuZChzb2Z0cmVwb3J0LmJ1ZmZlciwgW3NvZnRyZXBvcnQuYnVmZmVyXSk7XG4gIC8vIGVsc2Ugc2VuZChzb2Z0cmVwb3J0KTtcbiAgc2VuZChzb2Z0cmVwb3J0KTtcbn07XG5cbmNvbnN0IHJlcG9ydENvbGxpc2lvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IGRwID0gd29ybGQuZ2V0RGlzcGF0Y2hlcigpLFxuICAgIG51bSA9IGRwLmdldE51bU1hbmlmb2xkcygpO1xuICAvLyBfY29sbGlkZWQgPSBmYWxzZTtcblxuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICBpZiAoY29sbGlzaW9ucmVwb3J0Lmxlbmd0aCA8IDIgKyBudW0gKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUpIHtcbiAgICAgIGNvbGxpc2lvbnJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICAgIDIgLy8gbWVzc2FnZSBpZCAmICMgb2JqZWN0cyBpbiByZXBvcnRcbiAgICAgICAgK1xuICAgICAgICAoTWF0aC5jZWlsKF9udW1fb2JqZWN0cyAvIFJFUE9SVF9DSFVOS1NJWkUpICogUkVQT1JUX0NIVU5LU0laRSkgKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUgLy8gIyBvZiB2YWx1ZXMgbmVlZGVkICogaXRlbSBzaXplXG4gICAgICApO1xuICAgICAgY29sbGlzaW9ucmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5DT0xMSVNJT05SRVBPUlQ7XG4gICAgfVxuICB9XG5cbiAgY29sbGlzaW9ucmVwb3J0WzFdID0gMDsgLy8gaG93IG1hbnkgY29sbGlzaW9ucyB3ZSdyZSByZXBvcnRpbmcgb25cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgY29uc3QgbWFuaWZvbGQgPSBkcC5nZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbChpKSxcbiAgICAgIG51bV9jb250YWN0cyA9IG1hbmlmb2xkLmdldE51bUNvbnRhY3RzKCk7XG5cbiAgICBpZiAobnVtX2NvbnRhY3RzID09PSAwKSBjb250aW51ZTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtX2NvbnRhY3RzOyBqKyspIHtcbiAgICAgIGNvbnN0IHB0ID0gbWFuaWZvbGQuZ2V0Q29udGFjdFBvaW50KGopO1xuXG4gICAgICAvLyBpZiAoIHB0LmdldERpc3RhbmNlKCkgPCAwICkge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMiArIChjb2xsaXNpb25yZXBvcnRbMV0rKykgKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkU7XG4gICAgICBjb2xsaXNpb25yZXBvcnRbb2Zmc2V0XSA9IF9vYmplY3RzX2FtbW9bbWFuaWZvbGQuZ2V0Qm9keTAoKS5wdHJdO1xuICAgICAgY29sbGlzaW9ucmVwb3J0W29mZnNldCArIDFdID0gX29iamVjdHNfYW1tb1ttYW5pZm9sZC5nZXRCb2R5MSgpLnB0cl07XG5cbiAgICAgIF92ZWN0b3IgPSBwdC5nZXRfbV9ub3JtYWxXb3JsZE9uQigpO1xuICAgICAgY29sbGlzaW9ucmVwb3J0W29mZnNldCArIDJdID0gX3ZlY3Rvci54KCk7XG4gICAgICBjb2xsaXNpb25yZXBvcnRbb2Zmc2V0ICsgM10gPSBfdmVjdG9yLnkoKTtcbiAgICAgIGNvbGxpc2lvbnJlcG9ydFtvZmZzZXQgKyA0XSA9IF92ZWN0b3IueigpO1xuICAgICAgYnJlYWs7XG4gICAgICAvLyB9XG4gICAgICAvLyBzZW5kKF9vYmplY3RzX2FtbW8pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkgc2VuZChjb2xsaXNpb25yZXBvcnQuYnVmZmVyLCBbY29sbGlzaW9ucmVwb3J0LmJ1ZmZlcl0pO1xuICBlbHNlIHNlbmQoY29sbGlzaW9ucmVwb3J0KTtcbn07XG5cbmNvbnN0IHJlcG9ydFZlaGljbGVzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICBpZiAodmVoaWNsZXJlcG9ydC5sZW5ndGggPCAyICsgX251bV93aGVlbHMgKiBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFKSB7XG4gICAgICB2ZWhpY2xlcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShcbiAgICAgICAgMiAvLyBtZXNzYWdlIGlkICYgIyBvYmplY3RzIGluIHJlcG9ydFxuICAgICAgICArXG4gICAgICAgIChNYXRoLmNlaWwoX251bV93aGVlbHMgLyBSRVBPUlRfQ0hVTktTSVpFKSAqIFJFUE9SVF9DSFVOS1NJWkUpICogVkVISUNMRVJFUE9SVF9JVEVNU0laRSAvLyAjIG9mIHZhbHVlcyBuZWVkZWQgKiBpdGVtIHNpemVcbiAgICAgICk7XG4gICAgICB2ZWhpY2xlcmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5WRUhJQ0xFUkVQT1JUO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBsZXQgaSA9IDAsXG4gICAgICBqID0gMCxcbiAgICAgIGluZGV4ID0gX3ZlaGljbGVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoX3ZlaGljbGVzW2luZGV4XSkge1xuICAgICAgICBjb25zdCB2ZWhpY2xlID0gX3ZlaGljbGVzW2luZGV4XTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgdmVoaWNsZS5nZXROdW1XaGVlbHMoKTsgaisrKSB7XG4gICAgICAgICAgLy8gdmVoaWNsZS51cGRhdGVXaGVlbFRyYW5zZm9ybSggaiwgdHJ1ZSApO1xuICAgICAgICAgIC8vIHRyYW5zZm9ybSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyggaiApO1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHZlaGljbGUuZ2V0V2hlZWxJbmZvKGopLmdldF9tX3dvcmxkVHJhbnNmb3JtKCk7XG5cbiAgICAgICAgICBjb25zdCBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgICAgICAgY29uc3Qgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTtcblxuICAgICAgICAgIC8vIGFkZCB2YWx1ZXMgdG8gcmVwb3J0XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMSArIChpKyspICogVkVISUNMRVJFUE9SVF9JVEVNU0laRTtcblxuICAgICAgICAgIHZlaGljbGVyZXBvcnRbb2Zmc2V0XSA9IGluZGV4O1xuICAgICAgICAgIHZlaGljbGVyZXBvcnRbb2Zmc2V0ICsgMV0gPSBqO1xuXG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyAyXSA9IG9yaWdpbi54KCk7XG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyAzXSA9IG9yaWdpbi55KCk7XG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyA0XSA9IG9yaWdpbi56KCk7XG5cbiAgICAgICAgICB2ZWhpY2xlcmVwb3J0W29mZnNldCArIDVdID0gcm90YXRpb24ueCgpO1xuICAgICAgICAgIHZlaGljbGVyZXBvcnRbb2Zmc2V0ICsgNl0gPSByb3RhdGlvbi55KCk7XG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyA3XSA9IHJvdGF0aW9uLnooKTtcbiAgICAgICAgICB2ZWhpY2xlcmVwb3J0W29mZnNldCArIDhdID0gcm90YXRpb24udygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFNVUFBPUlRfVFJBTlNGRVJBQkxFICYmIGogIT09IDApIHNlbmQodmVoaWNsZXJlcG9ydC5idWZmZXIsIFt2ZWhpY2xlcmVwb3J0LmJ1ZmZlcl0pO1xuICAgIGVsc2UgaWYgKGogIT09IDApIHNlbmQodmVoaWNsZXJlcG9ydCk7XG4gIH1cbn07XG5cbmNvbnN0IHJlcG9ydENvbnN0cmFpbnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICBpZiAoY29uc3RyYWludHJlcG9ydC5sZW5ndGggPCAyICsgX251bV9jb25zdHJhaW50cyAqIENPTlNUUkFJTlRSRVBPUlRfSVRFTVNJWkUpIHtcbiAgICAgIGNvbnN0cmFpbnRyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KFxuICAgICAgICAyIC8vIG1lc3NhZ2UgaWQgJiAjIG9iamVjdHMgaW4gcmVwb3J0XG4gICAgICAgICtcbiAgICAgICAgKE1hdGguY2VpbChfbnVtX2NvbnN0cmFpbnRzIC8gUkVQT1JUX0NIVU5LU0laRSkgKiBSRVBPUlRfQ0hVTktTSVpFKSAqIENPTlNUUkFJTlRSRVBPUlRfSVRFTVNJWkUgLy8gIyBvZiB2YWx1ZXMgbmVlZGVkICogaXRlbSBzaXplXG4gICAgICApO1xuICAgICAgY29uc3RyYWludHJlcG9ydFswXSA9IE1FU1NBR0VfVFlQRVMuQ09OU1RSQUlOVFJFUE9SVDtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbGV0IG9mZnNldCA9IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGluZGV4ID0gX2NvbnN0cmFpbnRzLmxlbmdodDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoX2NvbnN0cmFpbnRzW2luZGV4XSkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW2luZGV4XTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0X2JvZHkgPSBjb25zdHJhaW50LmE7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNvbnN0cmFpbnQudGE7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTtcblxuICAgICAgICAvLyBhZGQgdmFsdWVzIHRvIHJlcG9ydFxuICAgICAgICBvZmZzZXQgPSAxICsgKGkrKykgKiBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFO1xuXG4gICAgICAgIGNvbnN0cmFpbnRyZXBvcnRbb2Zmc2V0XSA9IGluZGV4O1xuICAgICAgICBjb25zdHJhaW50cmVwb3J0W29mZnNldCArIDFdID0gb2Zmc2V0X2JvZHkuaWQ7XG4gICAgICAgIGNvbnN0cmFpbnRyZXBvcnRbb2Zmc2V0ICsgMl0gPSBvcmlnaW4ueDtcbiAgICAgICAgY29uc3RyYWludHJlcG9ydFtvZmZzZXQgKyAzXSA9IG9yaWdpbi55O1xuICAgICAgICBjb25zdHJhaW50cmVwb3J0W29mZnNldCArIDRdID0gb3JpZ2luLno7XG4gICAgICAgIGNvbnN0cmFpbnRyZXBvcnRbb2Zmc2V0ICsgNV0gPSBjb25zdHJhaW50LmdldEJyZWFraW5nSW1wdWxzZVRocmVzaG9sZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSAmJiBpICE9PSAwKSBzZW5kKGNvbnN0cmFpbnRyZXBvcnQuYnVmZmVyLCBbY29uc3RyYWludHJlcG9ydC5idWZmZXJdKTtcbiAgICBlbHNlIGlmIChpICE9PSAwKSBzZW5kKGNvbnN0cmFpbnRyZXBvcnQpO1xuICB9XG59O1xuXG5zZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICBpZiAoZXZlbnQuZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgIC8vIHRyYW5zZmVyYWJsZSBvYmplY3RcbiAgICBzd2l0Y2ggKGV2ZW50LmRhdGFbMF0pIHtcbiAgICBjYXNlIE1FU1NBR0VfVFlQRVMuV09STERSRVBPUlQ6XG4gICAgICB7XG4gICAgICAgIHdvcmxkcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBNRVNTQUdFX1RZUEVTLkNPTExJU0lPTlJFUE9SVDpcbiAgICAgIHtcbiAgICAgICAgY29sbGlzaW9ucmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBNRVNTQUdFX1RZUEVTLlZFSElDTEVSRVBPUlQ6XG4gICAgICB7XG4gICAgICAgIHZlaGljbGVyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KGV2ZW50LmRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIE1FU1NBR0VfVFlQRVMuQ09OU1RSQUlOVFJFUE9SVDpcbiAgICAgIHtcbiAgICAgICAgY29uc3RyYWludHJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoZXZlbnQuZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG4gIGVsc2UgaWYgKGV2ZW50LmRhdGEuY21kICYmIHB1YmxpY19mdW5jdGlvbnNbZXZlbnQuZGF0YS5jbWRdKSBwdWJsaWNfZnVuY3Rpb25zW2V2ZW50LmRhdGEuY21kXShldmVudC5kYXRhLnBhcmFtcyk7XG59O1xuXG5zZWxmLnJlY2VpdmUgPSBzZWxmLm9ubWVzc2FnZTtcblxuXG5cblxufSk7IiwiaW1wb3J0IFdvcmxkTW9kdWxlQmFzZSBmcm9tICcuL2NvcmUvV29ybGRNb2R1bGVCYXNlJztcblxuaW1wb3J0IHtcbiAgYWRkT2JqZWN0Q2hpbGRyZW4sXG4gIE1FU1NBR0VfVFlQRVMsXG4gIHRlbXAxVmVjdG9yMyxcbiAgdGVtcDFNYXRyaXg0LFxuICBSRVBPUlRfSVRFTVNJWkUsXG4gIENPTExJU0lPTlJFUE9SVF9JVEVNU0laRSxcbiAgVkVISUNMRVJFUE9SVF9JVEVNU0laRSxcbiAgQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRVxufSBmcm9tICcuLi9hcGknO1xuXG5pbXBvcnQgUGh5c2ljc1dvcmtlciBmcm9tICd3b3JrZXIhLi4vd29ya2VyLmpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmxkTW9kdWxlIGV4dGVuZHMgV29ybGRNb2R1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgIHN1cGVyKC4uLmFyZ3MpO1xuXG4gICAgdGhpcy53b3JrZXIgPSBuZXcgUGh5c2ljc1dvcmtlcigpO1xuICAgIHRoaXMud29ya2VyLnRyYW5zZmVyYWJsZU1lc3NhZ2UgPSB0aGlzLndvcmtlci53ZWJraXRQb3N0TWVzc2FnZSB8fCB0aGlzLndvcmtlci5wb3N0TWVzc2FnZTtcblxuICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICB0aGlzLmxvYWRlciA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGlmIChvcHRpb25zLndhc20pIHtcbiAgICAgIC8vICAgZmV0Y2gob3B0aW9ucy53YXNtKVxuICAgICAgLy8gICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpXG4gICAgICAvLyAgICAgLnRoZW4oYnVmZmVyID0+IHtcbiAgICAgIC8vICAgICAgIG9wdGlvbnMud2FzbUJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgIC8vXG4gICAgICAvLyAgICAgICB0aGlzLmV4ZWN1dGUoJ2luaXQnLCBvcHRpb25zKTtcbiAgICAgIC8vICAgICAgIHJlc29sdmUoKTtcbiAgICAgIC8vICAgICB9KTtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZSgnaW5pdCcsIG9wdGlvbnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAvLyB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRlci50aGVuKCgpID0+IHt0aGlzLmlzTG9hZGVkID0gdHJ1ZX0pO1xuXG4gICAgLy8gVGVzdCBTVVBQT1JUX1RSQU5TRkVSQUJMRVxuXG4gICAgY29uc3QgYWIgPSBuZXcgQXJyYXlCdWZmZXIoMSk7XG4gICAgdGhpcy53b3JrZXIudHJhbnNmZXJhYmxlTWVzc2FnZShhYiwgW2FiXSk7XG4gICAgdGhpcy5TVVBQT1JUX1RSQU5TRkVSQUJMRSA9IChhYi5ieXRlTGVuZ3RoID09PSAwKTtcblxuICAgIHRoaXMuc2V0dXAoKTtcbiAgfVxuXG4gIHNlbmQoLi4uYXJncykge1xuICAgIHRoaXMud29ya2VyLnRyYW5zZmVyYWJsZU1lc3NhZ2UoLi4uYXJncyk7XG4gIH1cblxuICByZWNlaXZlKGNhbGxiYWNrKSB7XG4gICAgdGhpcy53b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGNhbGxiYWNrKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtWZWN0b3IzLCBRdWF0ZXJuaW9ufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IHByb3BlcnRpZXMgPSB7XG4gIHBvc2l0aW9uOiB7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZS5wb3NpdGlvbjtcbiAgICB9LFxuXG4gICAgc2V0KHZlY3RvcjMpIHtcbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX25hdGl2ZS5wb3NpdGlvbjtcbiAgICAgIGNvbnN0IHNjb3BlID0gdGhpcztcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocG9zLCB7XG4gICAgICAgIHg6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feDtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgc2V0KHgpIHtcbiAgICAgICAgICAgIHNjb3BlLl9fZGlydHlQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl94ID0geDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgc2V0KHkpIHtcbiAgICAgICAgICAgIHNjb3BlLl9fZGlydHlQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl95ID0geTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHo6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fejtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgc2V0KHopIHtcbiAgICAgICAgICAgIHNjb3BlLl9fZGlydHlQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl96ID0gejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzY29wZS5fX2RpcnR5UG9zaXRpb24gPSB0cnVlO1xuXG4gICAgICBwb3MuY29weSh2ZWN0b3IzKTtcbiAgICB9XG4gIH0sXG5cbiAgcXVhdGVybmlvbjoge1xuICAgIGdldCgpIHtcbiAgICAgIHRoaXMuX19jX3JvdCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUucXVhdGVybmlvbjtcbiAgICB9LFxuXG4gICAgc2V0KHF1YXRlcm5pb24pIHtcbiAgICAgIGNvbnN0IHF1YXQgPSB0aGlzLl9uYXRpdmUucXVhdGVybmlvbixcbiAgICAgICAgbmF0aXZlID0gdGhpcy5fbmF0aXZlO1xuXG4gICAgICBxdWF0LmNvcHkocXVhdGVybmlvbik7XG5cbiAgICAgIHF1YXQub25DaGFuZ2UoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fX2Nfcm90KSB7XG4gICAgICAgICAgaWYgKG5hdGl2ZS5fX2RpcnR5Um90YXRpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX19jX3JvdCA9IGZhbHNlO1xuICAgICAgICAgICAgbmF0aXZlLl9fZGlydHlSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuYXRpdmUuX19kaXJ0eVJvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHJvdGF0aW9uOiB7XG4gICAgZ2V0KCkge1xuICAgICAgdGhpcy5fX2Nfcm90ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmUucm90YXRpb247XG4gICAgfSxcblxuICAgIHNldChldWxlcikge1xuICAgICAgY29uc3Qgcm90ID0gdGhpcy5fbmF0aXZlLnJvdGF0aW9uLFxuICAgICAgICBuYXRpdmUgPSB0aGlzLl9uYXRpdmU7XG5cbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbUV1bGVyKGV1bGVyKSk7XG5cbiAgICAgIHJvdC5vbkNoYW5nZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9fY19yb3QpIHtcbiAgICAgICAgICB0aGlzLnF1YXRlcm5pb24uY29weShuZXcgUXVhdGVybmlvbigpLnNldEZyb21FdWxlcihyb3QpKTtcbiAgICAgICAgICBuYXRpdmUuX19kaXJ0eVJvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyYXBQaHlzaWNzUHJvdG90eXBlKHNjb3BlKSB7XG4gIGZvciAobGV0IGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjb3BlLCBrZXksIHtcbiAgICAgIGdldDogcHJvcGVydGllc1trZXldLmdldC5iaW5kKHNjb3BlKSxcbiAgICAgIHNldDogcHJvcGVydGllc1trZXldLnNldC5iaW5kKHNjb3BlKSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkNvcHkoc291cmNlKSB7XG4gIHdyYXBQaHlzaWNzUHJvdG90eXBlKHRoaXMpO1xuXG4gIGNvbnN0IHBoeXNpY3MgPSB0aGlzLnVzZSgncGh5c2ljcycpO1xuICBjb25zdCBzb3VyY2VQaHlzaWNzID0gc291cmNlLnVzZSgncGh5c2ljcycpO1xuXG4gIHRoaXMubWFuYWdlci5tb2R1bGVzLnBoeXNpY3MgPSBwaHlzaWNzLmNsb25lKHRoaXMubWFuYWdlcik7XG5cbiAgcGh5c2ljcy5kYXRhID0gey4uLnNvdXJjZVBoeXNpY3MuZGF0YX07XG4gIHBoeXNpY3MuZGF0YS5pc1NvZnRCb2R5UmVzZXQgPSBmYWxzZTtcbiAgaWYgKHBoeXNpY3MuZGF0YS5pc1NvZnRib2R5KSBwaHlzaWNzLmRhdGEuaXNTb2Z0Qm9keVJlc2V0ID0gZmFsc2U7XG5cbiAgdGhpcy5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb24uY2xvbmUoKTtcbiAgdGhpcy5yb3RhdGlvbiA9IHRoaXMucm90YXRpb24uY2xvbmUoKTtcbiAgdGhpcy5xdWF0ZXJuaW9uID0gdGhpcy5xdWF0ZXJuaW9uLmNsb25lKCk7XG5cbiAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZnVuY3Rpb24gb25XcmFwKCkge1xuICB0aGlzLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbi5jbG9uZSgpO1xuICB0aGlzLnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbi5jbG9uZSgpO1xuICB0aGlzLnF1YXRlcm5pb24gPSB0aGlzLnF1YXRlcm5pb24uY2xvbmUoKTtcbn1cblxuY2xhc3MgQVBJIHtcbiAgYXBwbHlDZW50cmFsSW1wdWxzZShmb3JjZSkge1xuICAgIHRoaXMuZXhlY3V0ZSgnYXBwbHlDZW50cmFsSW1wdWxzZScsIHtpZDogdGhpcy5kYXRhLmlkLCB4OiBmb3JjZS54LCB5OiBmb3JjZS55LCB6OiBmb3JjZS56fSk7XG4gIH1cblxuICBhcHBseUltcHVsc2UoZm9yY2UsIG9mZnNldCkge1xuICAgIHRoaXMuZXhlY3V0ZSgnYXBwbHlJbXB1bHNlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIGltcHVsc2VfeDogZm9yY2UueCxcbiAgICAgIGltcHVsc2VfeTogZm9yY2UueSxcbiAgICAgIGltcHVsc2VfejogZm9yY2UueixcbiAgICAgIHg6IG9mZnNldC54LFxuICAgICAgeTogb2Zmc2V0LnksXG4gICAgICB6OiBvZmZzZXQuelxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlUb3JxdWUoZm9yY2UpIHtcbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGx5VG9ycXVlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIHRvcnF1ZV94OiBmb3JjZS54LFxuICAgICAgdG9ycXVlX3k6IGZvcmNlLnksXG4gICAgICB0b3JxdWVfejogZm9yY2UuelxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlDZW50cmFsRm9yY2UoZm9yY2UpIHtcbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGx5Q2VudHJhbEZvcmNlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIHg6IGZvcmNlLngsXG4gICAgICB5OiBmb3JjZS55LFxuICAgICAgejogZm9yY2UuelxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlGb3JjZShmb3JjZSwgb2Zmc2V0KSB7XG4gICAgdGhpcy5leGVjdXRlKCdhcHBseUZvcmNlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIGZvcmNlX3g6IGZvcmNlLngsXG4gICAgICBmb3JjZV95OiBmb3JjZS55LFxuICAgICAgZm9yY2VfejogZm9yY2UueixcbiAgICAgIHg6IG9mZnNldC54LFxuICAgICAgeTogb2Zmc2V0LnksXG4gICAgICB6OiBvZmZzZXQuelxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QW5ndWxhclZlbG9jaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuYW5ndWxhclZlbG9jaXR5O1xuICB9XG5cbiAgc2V0QW5ndWxhclZlbG9jaXR5KHZlbG9jaXR5KSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldEFuZ3VsYXJWZWxvY2l0eScsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgeDogdmVsb2NpdHkueCwgeTogdmVsb2NpdHkueSwgejogdmVsb2NpdHkuen1cbiAgICApO1xuICB9XG5cbiAgZ2V0TGluZWFyVmVsb2NpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5saW5lYXJWZWxvY2l0eTtcbiAgfVxuXG4gIHNldExpbmVhclZlbG9jaXR5KHZlbG9jaXR5KSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldExpbmVhclZlbG9jaXR5JyxcbiAgICAgIHtpZDogdGhpcy5kYXRhLmlkLCB4OiB2ZWxvY2l0eS54LCB5OiB2ZWxvY2l0eS55LCB6OiB2ZWxvY2l0eS56fVxuICAgICk7XG4gIH1cblxuICBzZXRBbmd1bGFyRmFjdG9yKGZhY3Rvcikge1xuICAgIHRoaXMuZXhlY3V0ZShcbiAgICAgICdzZXRBbmd1bGFyRmFjdG9yJyxcbiAgICAgIHtpZDogdGhpcy5kYXRhLmlkLCB4OiBmYWN0b3IueCwgeTogZmFjdG9yLnksIHo6IGZhY3Rvci56fVxuICAgICk7XG4gIH1cblxuICBzZXRMaW5lYXJGYWN0b3IoZmFjdG9yKSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldExpbmVhckZhY3RvcicsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgeDogZmFjdG9yLngsIHk6IGZhY3Rvci55LCB6OiBmYWN0b3Iuen1cbiAgICApO1xuICB9XG5cbiAgc2V0RGFtcGluZyhsaW5lYXIsIGFuZ3VsYXIpIHtcbiAgICB0aGlzLmV4ZWN1dGUoXG4gICAgICAnc2V0RGFtcGluZycsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgbGluZWFyLCBhbmd1bGFyfVxuICAgICk7XG4gIH1cblxuICBzZXRDY2RNb3Rpb25UaHJlc2hvbGQodGhyZXNob2xkKSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldENjZE1vdGlvblRocmVzaG9sZCcsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgdGhyZXNob2xkfVxuICAgICk7XG4gIH1cblxuICBzZXRDY2RTd2VwdFNwaGVyZVJhZGl1cyhyYWRpdXMpIHtcbiAgICB0aGlzLmV4ZWN1dGUoJ3NldENjZFN3ZXB0U3BoZXJlUmFkaXVzJywge2lkOiB0aGlzLmRhdGEuaWQsIHJhZGl1c30pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQVBJIHtcbiAgc3RhdGljIHJpZ2lkYm9keSA9ICgpID0+ICh7XG4gICAgdG91Y2hlczogW10sXG4gICAgbGluZWFyVmVsb2NpdHk6IG5ldyBWZWN0b3IzKCksXG4gICAgYW5ndWxhclZlbG9jaXR5OiBuZXcgVmVjdG9yMygpLFxuICAgIG1hc3M6IDEwLFxuICAgIHNjYWxlOiBuZXcgVmVjdG9yMygxLCAxLCAxKSxcbiAgICByZXN0aXR1dGlvbjogMC4zLFxuICAgIGZyaWN0aW9uOiAwLjgsXG4gICAgZGFtcGluZzogMCxcbiAgICBtYXJnaW46IDBcbiAgfSk7XG5cbiAgc3RhdGljIHNvZnRib2R5ID0gKCkgPT4gKHtcbiAgICB0b3VjaGVzOiBbXSxcbiAgICByZXN0aXR1dGlvbjogMC4zLFxuICAgIGZyaWN0aW9uOiAwLjgsXG4gICAgZGFtcGluZzogMCxcbiAgICBzY2FsZTogbmV3IFZlY3RvcjMoMSwgMSwgMSksXG4gICAgcHJlc3N1cmU6IDEwMCxcbiAgICBtYXJnaW46IDAsXG4gICAga2xzdDogMC45LFxuICAgIGt2c3Q6IDAuOSxcbiAgICBrYXN0OiAwLjksXG4gICAgcGl0ZXJhdGlvbnM6IDEsXG4gICAgdml0ZXJhdGlvbnM6IDAsXG4gICAgZGl0ZXJhdGlvbnM6IDAsXG4gICAgY2l0ZXJhdGlvbnM6IDQsXG4gICAgYW5jaG9ySGFyZG5lc3M6IDAuNyxcbiAgICByaWdpZEhhcmRuZXNzOiAxLFxuICAgIGlzU29mdGJvZHk6IHRydWUsXG4gICAgaXNTb2Z0Qm9keVJlc2V0OiBmYWxzZVxuICB9KTtcblxuICBzdGF0aWMgcm9wZSA9ICgpID0+ICh7XG4gICAgdG91Y2hlczogW10sXG4gICAgZnJpY3Rpb246IDAuOCxcbiAgICBzY2FsZTogbmV3IFZlY3RvcjMoMSwgMSwgMSksXG4gICAgZGFtcGluZzogMCxcbiAgICBtYXJnaW46IDAsXG4gICAga2xzdDogMC45LFxuICAgIGt2c3Q6IDAuOSxcbiAgICBrYXN0OiAwLjksXG4gICAgcGl0ZXJhdGlvbnM6IDEsXG4gICAgdml0ZXJhdGlvbnM6IDAsXG4gICAgZGl0ZXJhdGlvbnM6IDAsXG4gICAgY2l0ZXJhdGlvbnM6IDQsXG4gICAgYW5jaG9ySGFyZG5lc3M6IDAuNyxcbiAgICByaWdpZEhhcmRuZXNzOiAxLFxuICAgIGlzU29mdGJvZHk6IHRydWVcbiAgfSk7XG5cbiAgc3RhdGljIGNsb3RoID0gKCkgPT4gKHtcbiAgICB0b3VjaGVzOiBbXSxcbiAgICBmcmljdGlvbjogMC44LFxuICAgIGRhbXBpbmc6IDAsXG4gICAgbWFyZ2luOiAwLFxuICAgIHNjYWxlOiBuZXcgVmVjdG9yMygxLCAxLCAxKSxcbiAgICBrbHN0OiAwLjksXG4gICAga3ZzdDogMC45LFxuICAgIGthc3Q6IDAuOSxcbiAgICBwaXRlcmF0aW9uczogMSxcbiAgICB2aXRlcmF0aW9uczogMCxcbiAgICBkaXRlcmF0aW9uczogMCxcbiAgICBjaXRlcmF0aW9uczogNCxcbiAgICBhbmNob3JIYXJkbmVzczogMC43LFxuICAgIHJpZ2lkSGFyZG5lc3M6IDFcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoZGVmYXVsdHMsIGRhdGEpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YSA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIGRhdGEpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICB3cmFwUGh5c2ljc1Byb3RvdHlwZSh0aGlzKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdwaHlzaWNzJyk7XG5cbiAgICB0aGlzLmV4ZWN1dGUgPSAoLi4uZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuIG1hbmFnZXIuaGFzKCdtb2R1bGU6d29ybGQnKVxuICAgICAgPyBtYW5hZ2VyLmdldCgnbW9kdWxlOndvcmxkJykuZXhlY3V0ZSguLi5kYXRhKVxuICAgICAgOiAoKSA9PiB7fTtcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRGF0YShjYWxsYmFjaykge1xuICAgIHRoaXMuYnJpZGdlLmdlb21ldHJ5ID0gZnVuY3Rpb24gKGdlb21ldHJ5LCBtb2R1bGUpIHtcbiAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiBnZW9tZXRyeTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soZ2VvbWV0cnksIG1vZHVsZSk7XG4gICAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogZ2VvbWV0cnk7XG4gICAgfVxuICB9XG5cbiAgY2xvbmUobWFuYWdlcikge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKTtcbiAgICBjbG9uZS5kYXRhID0gey4uLnRoaXMuZGF0YX07XG4gICAgY2xvbmUuYnJpZGdlLmdlb21ldHJ5ID0gdGhpcy5icmlkZ2UuZ2VvbWV0cnk7XG4gICAgdGhpcy5tYW5hZ2VyLmFwcGx5KGNsb25lLCBbbWFuYWdlcl0pO1xuXG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgYnJpZGdlID0ge1xuICAgIG9uQ29weSxcbiAgICBvbldyYXBcbiAgfTtcbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIEJveE1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnYm94JyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucmlnaWRib2R5KClcbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy51cGRhdGVEYXRhKChnZW9tZXRyeSwge2RhdGF9KSA9PiB7XG4gICAgICBpZiAoIWdlb21ldHJ5LmJvdW5kaW5nQm94KSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuICAgICAgZGF0YS53aWR0aCA9IGRhdGEud2lkdGggfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnggLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueDtcbiAgICAgIGRhdGEuaGVpZ2h0ID0gZGF0YS5oZWlnaHQgfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnkgLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueTtcbiAgICAgIGRhdGEuZGVwdGggPSBkYXRhLmRlcHRoIHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC56IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLno7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIENvbXBvdW5kTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdjb21wb3VuZCcsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcbiAgfVxufVxuIiwiaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG4vLyBUT0RPOiBUZXN0IENhcHN1bGVNb2R1bGUgaW4gYWN0aW9uLlxuZXhwb3J0IGNsYXNzIENhcHN1bGVNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ2NhcHN1bGUnLFxuICAgICAgLi4uUGh5c2ljc01vZHVsZS5yaWdpZGJvZHkoKVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLnVwZGF0ZURhdGEoKGdlb21ldHJ5LCB7ZGF0YX0pID0+IHtcbiAgICAgIGlmICghZ2VvbWV0cnkuYm91bmRpbmdCb3gpIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG4gICAgICBkYXRhLndpZHRoID0gZGF0YS53aWR0aCB8fCBnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueCAtIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi54O1xuICAgICAgZGF0YS5oZWlnaHQgPSBkYXRhLmhlaWdodCB8fCBnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueSAtIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi55O1xuICAgICAgZGF0YS5kZXB0aCA9IGRhdGEuZGVwdGggfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnogLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4uejtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F2ZU1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnY29uY2F2ZScsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgZGF0YS5kYXRhID0gdGhpcy5nZW9tZXRyeVByb2Nlc3NvcihnZW9tZXRyeSk7XG4gICAgfSk7XG4gIH1cblxuICBnZW9tZXRyeVByb2Nlc3NvcihnZW9tZXRyeSkge1xuICAgIGlmICghZ2VvbWV0cnkuYm91bmRpbmdCb3gpIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG4gICAgY29uc3QgZGF0YSA9IGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgP1xuICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSA6XG4gICAgICBuZXcgRmxvYXQzMkFycmF5KGdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDkpO1xuXG4gICAgaWYgKCFnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KSB7XG4gICAgICBjb25zdCB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGZhY2UgPSBnZW9tZXRyeS5mYWNlc1tpXTtcblxuICAgICAgICBjb25zdCB2QSA9IHZlcnRpY2VzW2ZhY2UuYV07XG4gICAgICAgIGNvbnN0IHZCID0gdmVydGljZXNbZmFjZS5iXTtcbiAgICAgICAgY29uc3QgdkMgPSB2ZXJ0aWNlc1tmYWNlLmNdO1xuXG4gICAgICAgIGNvbnN0IGk5ID0gaSAqIDk7XG5cbiAgICAgICAgZGF0YVtpOV0gPSB2QS54O1xuICAgICAgICBkYXRhW2k5ICsgMV0gPSB2QS55O1xuICAgICAgICBkYXRhW2k5ICsgMl0gPSB2QS56O1xuXG4gICAgICAgIGRhdGFbaTkgKyAzXSA9IHZCLng7XG4gICAgICAgIGRhdGFbaTkgKyA0XSA9IHZCLnk7XG4gICAgICAgIGRhdGFbaTkgKyA1XSA9IHZCLno7XG5cbiAgICAgICAgZGF0YVtpOSArIDZdID0gdkMueDtcbiAgICAgICAgZGF0YVtpOSArIDddID0gdkMueTtcbiAgICAgICAgZGF0YVtpOSArIDhdID0gdkMuejtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfTtcbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIENvbmVNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ2NvbmUnLFxuICAgICAgLi4uUGh5c2ljc01vZHVsZS5yaWdpZGJvZHkoKVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLnVwZGF0ZURhdGEoKGdlb21ldHJ5LCB7ZGF0YX0pID0+IHtcbiAgICAgIGlmICghZ2VvbWV0cnkuYm91bmRpbmdCb3gpIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG4gICAgICBkYXRhLnJhZGl1cyA9IGRhdGEucmFkaXVzIHx8IChnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueCAtIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi54KSAvIDI7XG4gICAgICBkYXRhLmhlaWdodCA9IGRhdGEuaGVpZ2h0IHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC55IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLnk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7QnVmZmVyR2VvbWV0cnl9IGZyb20gJ3RocmVlJztcbmltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIENvbnZleE1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnY29udmV4JyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucmlnaWRib2R5KClcbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy51cGRhdGVEYXRhKChnZW9tZXRyeSwge2RhdGF9KSA9PiB7XG4gICAgICBpZiAoIWdlb21ldHJ5LmJvdW5kaW5nQm94KSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcbiAgICAgIGlmICghZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSkgZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KGdlb21ldHJ5KTtcblxuICAgICAgZGF0YS5kYXRhID0gZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSA/XG4gICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXkgOlxuICAgICAgICBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG5leHBvcnQgY2xhc3MgQ3lsaW5kZXJNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ2N5bGluZGVyJyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucmlnaWRib2R5KClcbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy51cGRhdGVEYXRhKChnZW9tZXRyeSwge2RhdGF9KSA9PiB7XG4gICAgICBpZiAoIWdlb21ldHJ5LmJvdW5kaW5nQm94KSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuICAgICAgZGF0YS53aWR0aCA9IGRhdGEud2lkdGggfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnggLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueDtcbiAgICAgIGRhdGEuaGVpZ2h0ID0gZGF0YS5oZWlnaHQgfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnkgLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueTtcbiAgICAgIGRhdGEuZGVwdGggPSBkYXRhLmRlcHRoIHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC56IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLno7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcbmltcG9ydCB7VmVjdG9yMywgVmVjdG9yMiwgQnVmZmVyR2VvbWV0cnl9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGNsYXNzIEhlaWdodGZpZWxkTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdoZWlnaHRmaWVsZCcsXG4gICAgICBzaXplOiBuZXcgVmVjdG9yMigxLCAxKSxcbiAgICAgIGF1dG9BbGlnbjogZmFsc2UsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgY29uc3Qge3g6IHhkaXYsIHk6IHlkaXZ9ID0gZGF0YS5zaXplO1xuICAgICAgY29uc3QgdmVydHMgPSBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ID8gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSA6IGdlb21ldHJ5LnZlcnRpY2VzO1xuICAgICAgbGV0IHNpemUgPSBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ID8gdmVydHMubGVuZ3RoIC8gMyA6IHZlcnRzLmxlbmd0aDtcblxuICAgICAgaWYgKCFnZW9tZXRyeS5ib3VuZGluZ0JveCkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgIGNvbnN0IHhzaXplID0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnggLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueDtcbiAgICAgIGNvbnN0IHlzaXplID0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnogLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4uejtcblxuICAgICAgZGF0YS54cHRzID0gKHR5cGVvZiB4ZGl2ID09PSAndW5kZWZpbmVkJykgPyBNYXRoLnNxcnQoc2l6ZSkgOiB4ZGl2ICsgMTtcbiAgICAgIGRhdGEueXB0cyA9ICh0eXBlb2YgeWRpdiA9PT0gJ3VuZGVmaW5lZCcpID8gTWF0aC5zcXJ0KHNpemUpIDogeWRpdiArIDE7XG5cbiAgICAgIC8vIG5vdGUgLSB0aGlzIGFzc3VtZXMgb3VyIHBsYW5lIGdlb21ldHJ5IGlzIHNxdWFyZSwgdW5sZXNzIHdlIHBhc3MgaW4gc3BlY2lmaWMgeGRpdiBhbmQgeWRpdlxuICAgICAgZGF0YS5hYnNNYXhIZWlnaHQgPSBNYXRoLm1heChnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueSwgTWF0aC5hYnMoZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLnkpKTtcblxuICAgICAgY29uc3QgcG9pbnRzID0gbmV3IEZsb2F0MzJBcnJheShzaXplKSxcbiAgICAgICAgeHB0cyA9IGRhdGEueHB0cyxcbiAgICAgICAgeXB0cyA9IGRhdGEueXB0cztcblxuICAgICAgd2hpbGUgKHNpemUtLSkge1xuICAgICAgICBjb25zdCB2TnVtID0gc2l6ZSAlIHhwdHMgKyAoKHlwdHMgLSBNYXRoLnJvdW5kKChzaXplIC8geHB0cykgLSAoKHNpemUgJSB4cHRzKSAvIHhwdHMpKSAtIDEpICogeXB0cyk7XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkpIHBvaW50c1tzaXplXSA9IHZlcnRzW3ZOdW0gKiAzICsgMV07XG4gICAgICAgIGVsc2UgcG9pbnRzW3NpemVdID0gdmVydHNbdk51bV0ueTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgIGRhdGEuc2NhbGUubXVsdGlwbHkoXG4gICAgICAgIG5ldyBWZWN0b3IzKHhzaXplIC8gKHhwdHMgLSAxKSwgMSwgeXNpemUgLyAoeXB0cyAtIDEpKVxuICAgICAgKTtcblxuICAgICAgaWYgKGRhdGEuYXV0b0FsaWduKSBnZW9tZXRyeS50cmFuc2xhdGUoeHNpemUgLyAtMiwgMCwgeXNpemUgLyAtMik7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIFBsYW5lTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdwbGFuZScsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgaWYgKCFnZW9tZXRyeS5ib3VuZGluZ0JveCkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgIGRhdGEud2lkdGggPSBkYXRhLndpZHRoIHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC54IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLng7XG4gICAgICBkYXRhLmhlaWdodCA9IGRhdGEuaGVpZ2h0IHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC55IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLnk7XG4gICAgICBkYXRhLm5vcm1hbCA9IGRhdGEubm9ybWFsIHx8IGdlb21ldHJ5LmZhY2VzWzBdLm5vcm1hbC5jbG9uZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgUGh5c2ljc01vZHVsZSBmcm9tICcuL2NvcmUvUGh5c2ljc01vZHVsZSc7XG5cbmV4cG9ydCBjbGFzcyBTcGhlcmVNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ3NwaGVyZScsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgaWYgKCFnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG4gICAgICBkYXRhLnJhZGl1cyA9IGRhdGEucmFkaXVzIHx8IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLnJhZGl1cztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtCdWZmZXJHZW9tZXRyeSwgQnVmZmVyQXR0cmlidXRlfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgUGh5c2ljc01vZHVsZSBmcm9tICcuL2NvcmUvUGh5c2ljc01vZHVsZSc7XG5cbmV4cG9ydCBjbGFzcyBTb2Z0Ym9keU1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnc29mdFRyaW1lc2gnLFxuICAgICAgLi4uUGh5c2ljc01vZHVsZS5zb2Z0Ym9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgY29uc3QgaWR4R2VvbWV0cnkgPSBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5XG4gICAgICAgID8gZ2VvbWV0cnlcbiAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgIGdlb21ldHJ5Lm1lcmdlVmVydGljZXMoKTtcblxuICAgICAgICAgIGNvbnN0IGJ1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cbiAgICAgICAgICBidWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAncG9zaXRpb24nLFxuICAgICAgICAgICAgbmV3IEJ1ZmZlckF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgbmV3IEZsb2F0MzJBcnJheShnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzKSxcbiAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgKS5jb3B5VmVjdG9yM3NBcnJheShnZW9tZXRyeS52ZXJ0aWNlcylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYnVmZmVyR2VvbWV0cnkuc2V0SW5kZXgoXG4gICAgICAgICAgICBuZXcgQnVmZmVyQXR0cmlidXRlKFxuICAgICAgICAgICAgICBuZXcgKGdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDMgPiA2NTUzNSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXkpKGdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDMpLFxuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICApLmNvcHlJbmRpY2VzQXJyYXkoZ2VvbWV0cnkuZmFjZXMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiBidWZmZXJHZW9tZXRyeTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgZGF0YS5hVmVydGljZXMgPSBpZHhHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuICAgICAgZGF0YS5hSW5kaWNlcyA9IGlkeEdlb21ldHJ5LmluZGV4LmFycmF5O1xuXG4gICAgICByZXR1cm4gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGVuZEFuY2hvcihvYmplY3QsIG5vZGUsIGluZmx1ZW5jZSA9IDEsIGNvbGxpc2lvbkJldHdlZW5MaW5rZWRCb2RpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgbzEgPSB0aGlzLmRhdGEuaWQ7XG4gICAgY29uc3QgbzIgPSBvYmplY3QudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcblxuICAgIHRoaXMuZXhlY3V0ZSgnYXBwZW5kQW5jaG9yJywge1xuICAgICAgb2JqOiBvMSxcbiAgICAgIG9iajI6IG8yLFxuICAgICAgbm9kZSxcbiAgICAgIGluZmx1ZW5jZSxcbiAgICAgIGNvbGxpc2lvbkJldHdlZW5MaW5rZWRCb2RpZXNcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtCdWZmZXJHZW9tZXRyeSwgQnVmZmVyQXR0cmlidXRlfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgUGh5c2ljc01vZHVsZSBmcm9tICcuL2NvcmUvUGh5c2ljc01vZHVsZSc7XG5cbmZ1bmN0aW9uIGFycmF5TWF4KGFycmF5KSB7XG5cdGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiAtIEluZmluaXR5O1xuXG5cdHZhciBtYXggPSBhcnJheVswXTtcblxuXHRmb3IgKGxldCBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XG5cdFx0aWYgKGFycmF5WyBpIF0gPiBtYXgpIG1heCA9IGFycmF5W2ldO1xuXHR9XG5cblx0cmV0dXJuIG1heDtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3RoTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdzb2Z0Q2xvdGhNZXNoJyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUuY2xvdGgoKVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLnVwZGF0ZURhdGEoKGdlb21ldHJ5LCB7ZGF0YX0pID0+IHtcbiAgICAgIGNvbnN0IGdlb21QYXJhbXMgPSBnZW9tZXRyeS5wYXJhbWV0ZXJzO1xuXG4gICAgICBjb25zdCBnZW9tID0gZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeVxuICAgICAgICA/IGdlb21ldHJ5XG4gICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgIGdlb21ldHJ5Lm1lcmdlVmVydGljZXMoKTtcblxuICAgICAgICAgIGNvbnN0IGJ1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cbiAgICAgICAgICBidWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAncG9zaXRpb24nLFxuICAgICAgICAgICAgbmV3IEJ1ZmZlckF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgbmV3IEZsb2F0MzJBcnJheShnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzKSxcbiAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgKS5jb3B5VmVjdG9yM3NBcnJheShnZW9tZXRyeS52ZXJ0aWNlcylcbiAgICAgICAgICApO1xuXG5cdFx0XHRcdFx0Y29uc3QgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcywgZmFjZXNMZW5ndGggPSBmYWNlcy5sZW5ndGgsIHV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbMF07XG5cbiAgICAgICAgICBjb25zdCBub3JtYWxzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZhY2VzTGVuZ3RoICogMyk7XG4gICAgICAgICAgLy8gY29uc3QgdXZzQXJyYXkgPSBuZXcgQXJyYXkoZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICogMik7XG4gICAgICAgICAgY29uc3QgdXZzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZhY2VzTGVuZ3RoICogMik7XG4gICAgICAgICAgY29uc3QgdXZzUmVwbGFjZWRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZmFjZXNMZW5ndGggKiA2KTtcblx0XHRcdFx0XHRjb25zdCBmYWNlQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoZmFjZXNMZW5ndGggKiAzKTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFjZXNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaTMgPSBpICogMztcbiAgICAgICAgICAgIGNvbnN0IGk2ID0gaSAqIDY7XG4gICAgICAgICAgICBjb25zdCBub3JtYWwgPSBmYWNlc1tpXS5ub3JtYWwgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0XHRcdFx0ZmFjZUFycmF5W2kzXSA9IGZhY2VzW2ldLmE7XG4gICAgICAgICAgICBmYWNlQXJyYXlbaTMgKyAxXSA9IGZhY2VzW2ldLmI7XG4gICAgICAgICAgICBmYWNlQXJyYXlbaTMgKyAyXSA9IGZhY2VzW2ldLmM7XG5cbiAgICAgICAgICAgIG5vcm1hbHNBcnJheVtpM10gPSBub3JtYWwueDtcbiAgICAgICAgICAgIG5vcm1hbHNBcnJheVtpMyArIDFdID0gbm9ybWFsLnk7XG4gICAgICAgICAgICBub3JtYWxzQXJyYXlbaTMgKyAyXSA9IG5vcm1hbC56O1xuXG4gICAgICAgICAgICB1dnNBcnJheVtmYWNlc1tpXS5hICogMiArIDBdID0gdXZzW2ldWzBdLng7IC8vIGFcbiAgICAgICAgICAgIHV2c0FycmF5W2ZhY2VzW2ldLmEgKiAyICsgMV0gPSB1dnNbaV1bMF0ueTtcblxuICAgICAgICAgICAgdXZzQXJyYXlbZmFjZXNbaV0uYiAqIDIgKyAwXSA9IHV2c1tpXVsxXS54OyAvLyBiXG4gICAgICAgICAgICB1dnNBcnJheVtmYWNlc1tpXS5iICogMiArIDFdID0gdXZzW2ldWzFdLnk7XG5cbiAgICAgICAgICAgIHV2c0FycmF5W2ZhY2VzW2ldLmMgKiAyICsgMF0gPSB1dnNbaV1bMl0ueDsgLy8gY1xuICAgICAgICAgICAgdXZzQXJyYXlbZmFjZXNbaV0uYyAqIDIgKyAxXSA9IHV2c1tpXVsyXS55O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdub3JtYWwnLFxuICAgICAgICAgICAgbmV3IEJ1ZmZlckF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgbm9ybWFsc0FycmF5LFxuICAgICAgICAgICAgICAzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICd1dicsXG4gICAgICAgICAgICBuZXcgQnVmZmVyQXR0cmlidXRlKFxuICAgICAgICAgICAgICB1dnNBcnJheSxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG5cblx0XHRcdFx0XHRidWZmZXJHZW9tZXRyeS5zZXRJbmRleChcbiAgICAgICAgICAgIG5ldyBCdWZmZXJBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgIG5ldyAoYXJyYXlNYXgoZmFjZXMpICogMyA+IDY1NTM1ID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheSkoZmFjZXNMZW5ndGggKiAzKSxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKS5jb3B5SW5kaWNlc0FycmF5KGZhY2VzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gYnVmZmVyR2VvbWV0cnk7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgIGNvbnN0IHZlcnRzID0gZ2VvbS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG4gICAgICBpZiAoIWdlb21QYXJhbXMud2lkdGhTZWdtZW50cykgZ2VvbVBhcmFtcy53aWR0aFNlZ21lbnRzID0gMTtcbiAgICAgIGlmICghZ2VvbVBhcmFtcy5oZWlnaHRTZWdtZW50cykgZ2VvbVBhcmFtcy5oZWlnaHRTZWdtZW50cyA9IDE7XG5cbiAgICAgIGNvbnN0IGlkeDAwID0gMDtcbiAgICAgIGNvbnN0IGlkeDAxID0gZ2VvbVBhcmFtcy53aWR0aFNlZ21lbnRzO1xuICAgICAgY29uc3QgaWR4MTAgPSAoZ2VvbVBhcmFtcy5oZWlnaHRTZWdtZW50cyArIDEpICogKGdlb21QYXJhbXMud2lkdGhTZWdtZW50cyArIDEpIC0gKGdlb21QYXJhbXMud2lkdGhTZWdtZW50cyArIDEpO1xuICAgICAgY29uc3QgaWR4MTEgPSB2ZXJ0cy5sZW5ndGggLyAzIC0gMTtcblxuICAgICAgZGF0YS5jb3JuZXJzID0gW1xuICAgICAgICB2ZXJ0c1tpZHgwMSAqIDNdLCB2ZXJ0c1tpZHgwMSAqIDMgKyAxXSwgdmVydHNbaWR4MDEgKiAzICsgMl0sIC8vICAg4pWXXG4gICAgICAgIHZlcnRzW2lkeDAwICogM10sIHZlcnRzW2lkeDAwICogMyArIDFdLCB2ZXJ0c1tpZHgwMCAqIDMgKyAyXSwgLy8g4pWUXG4gICAgICAgIHZlcnRzW2lkeDExICogM10sIHZlcnRzW2lkeDExICogMyArIDFdLCB2ZXJ0c1tpZHgxMSAqIDMgKyAyXSwgLy8gICAgICAg4pWdXG4gICAgICAgIHZlcnRzW2lkeDEwICogM10sIHZlcnRzW2lkeDEwICogMyArIDFdLCB2ZXJ0c1tpZHgxMCAqIDMgKyAyXSwgLy8gICAgIOKVmlxuICAgICAgXTtcblxuICAgICAgZGF0YS5zZWdtZW50cyA9IFtnZW9tUGFyYW1zLndpZHRoU2VnbWVudHMgKyAxLCBnZW9tUGFyYW1zLmhlaWdodFNlZ21lbnRzICsgMV07XG5cbiAgICAgIHJldHVybiBnZW9tO1xuICAgIH0pO1xuICB9XG5cbiAgYXBwZW5kQW5jaG9yKG9iamVjdCwgbm9kZSwgaW5mbHVlbmNlLCBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG8xID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IG8yID0gb2JqZWN0LnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG5cbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGVuZEFuY2hvcicsIHtcbiAgICAgIG9iajogbzEsXG4gICAgICBvYmoyOiBvMixcbiAgICAgIG5vZGUsXG4gICAgICBpbmZsdWVuY2UsXG4gICAgICBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzXG4gICAgfSk7XG4gIH1cblxuXHRsaW5rTm9kZXMob2JqZWN0LCBuMSwgbjIsIG1vZGlmaWVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuZGF0YS5pZDtcbiAgICBjb25zdCBib2R5ID0gb2JqZWN0LnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG5cbiAgICB0aGlzLmV4ZWN1dGUoJ2xpbmtOb2RlcycsIHtcbiAgICAgIHNlbGYsXG5cdFx0XHRib2R5LFxuICAgICAgbjEsIC8vIHNlbGYgbm9kZVxuICAgICAgbjIsIC8vIGJvZHkgbm9kZVxuXHRcdFx0bW9kaWZpZXJcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGVuZExpbmVhckpvaW50KG9iamVjdCwgc3BlY3MpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IGJvZHkgPSBvYmplY3QudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcblxuICAgIHRoaXMuZXhlY3V0ZSgnYXBwZW5kTGluZWFySm9pbnQnLCB7XG4gICAgICBzZWxmLFxuICAgICAgYm9keSxcbiAgICAgIHNwZWNzXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7QnVmZmVyR2VvbWV0cnksIEJ1ZmZlckF0dHJpYnV0ZSwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xuaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG5leHBvcnQgY2xhc3MgUm9wZU1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnc29mdFJvcGVNZXNoJyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucm9wZSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgaWYgKCFnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KSB7XG4gICAgICAgIGdlb21ldHJ5ID0gKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWZmID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cbiAgICAgICAgICBidWZmLmFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdwb3NpdGlvbicsXG4gICAgICAgICAgICBuZXcgQnVmZmVyQXR0cmlidXRlKFxuICAgICAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMpLFxuICAgICAgICAgICAgICAzXG4gICAgICAgICAgICApLmNvcHlWZWN0b3Izc0FycmF5KGdlb21ldHJ5LnZlcnRpY2VzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gYnVmZjtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGVuZ3RoID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheS5sZW5ndGggLyAzO1xuICAgICAgY29uc3QgdmVydCA9IG4gPT4gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSwgbiozKTtcblxuICAgICAgY29uc3QgdjEgPSB2ZXJ0KDApO1xuICAgICAgY29uc3QgdjIgPSB2ZXJ0KGxlbmd0aCAtIDEpO1xuXG4gICAgICBkYXRhLmRhdGEgPSBbXG4gICAgICAgIHYxLngsIHYxLnksIHYxLnosXG4gICAgICAgIHYyLngsIHYyLnksIHYyLnosXG4gICAgICAgIGxlbmd0aFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH0pO1xuICB9XG5cbiAgYXBwZW5kQW5jaG9yKG9iamVjdCwgbm9kZSwgaW5mbHVlbmNlLCBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG8xID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IG8yID0gb2JqZWN0LnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG5cbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGVuZEFuY2hvcicsIHtcbiAgICAgIG9iajogbzEsXG4gICAgICBvYmoyOiBvMixcbiAgICAgIG5vZGUsXG4gICAgICBpbmZsdWVuY2UsXG4gICAgICBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7TG9vcH0gZnJvbSAnd2hzJztcblxuaW1wb3J0IHtcbiAgT2JqZWN0M0QsXG4gIFF1YXRlcm5pb24sXG4gIFZlY3RvcjMsXG4gIEV1bGVyXG59IGZyb20gJ3RocmVlJztcblxuY29uc3QgUElfMiA9IE1hdGguUEkgLyAyO1xuXG4vLyBUT0RPOiBGaXggRE9NXG5mdW5jdGlvbiBGaXJzdFBlcnNvbkNvbnRyb2xzU29sdmVyKGNhbWVyYSwgbWVzaCwgcGFyYW1zKSB7XG4gIGNvbnN0IHZlbG9jaXR5RmFjdG9yID0gMTtcbiAgbGV0IHJ1blZlbG9jaXR5ID0gMC4yNTtcblxuICBtZXNoLnVzZSgncGh5c2ljcycpLnNldEFuZ3VsYXJGYWN0b3Ioe3g6IDAsIHk6IDAsIHo6IDB9KTtcbiAgY2FtZXJhLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcblxuICAvKiBJbml0ICovXG4gIGNvbnN0IHBsYXllciA9IG1lc2gsXG4gICAgcGl0Y2hPYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcblxuICBwaXRjaE9iamVjdC5hZGQoY2FtZXJhLm5hdGl2ZSk7XG5cbiAgY29uc3QgeWF3T2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7XG5cbiAgeWF3T2JqZWN0LnBvc2l0aW9uLnkgPSBwYXJhbXMueXBvczsgLy8gZXllcyBhcmUgMiBtZXRlcnMgYWJvdmUgdGhlIGdyb3VuZFxuICB5YXdPYmplY3QuYWRkKHBpdGNoT2JqZWN0KTtcblxuICBjb25zdCBxdWF0ID0gbmV3IFF1YXRlcm5pb24oKTtcblxuICBsZXQgY2FuSnVtcCA9IGZhbHNlLFxuICAgIC8vIE1vdmVzLlxuICAgIG1vdmVGb3J3YXJkID0gZmFsc2UsXG4gICAgbW92ZUJhY2t3YXJkID0gZmFsc2UsXG4gICAgbW92ZUxlZnQgPSBmYWxzZSxcbiAgICBtb3ZlUmlnaHQgPSBmYWxzZTtcblxuICBwbGF5ZXIub24oJ2NvbGxpc2lvbicsIChvdGhlck9iamVjdCwgdiwgciwgY29udGFjdE5vcm1hbCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNvbnRhY3ROb3JtYWwueSk7XG4gICAgaWYgKGNvbnRhY3ROb3JtYWwueSA8IDAuNSkgLy8gVXNlIGEgXCJnb29kXCIgdGhyZXNob2xkIHZhbHVlIGJldHdlZW4gMCBhbmQgMSBoZXJlIVxuICAgICAgY2FuSnVtcCA9IHRydWU7XG4gIH0pO1xuXG4gIGNvbnN0IG9uTW91c2VNb3ZlID0gZXZlbnQgPT4ge1xuICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICBjb25zdCBtb3ZlbWVudFggPSB0eXBlb2YgZXZlbnQubW92ZW1lbnRYID09PSAnbnVtYmVyJ1xuICAgICAgPyBldmVudC5tb3ZlbWVudFggOiB0eXBlb2YgZXZlbnQubW96TW92ZW1lbnRYID09PSAnbnVtYmVyJ1xuICAgICAgICA/IGV2ZW50Lm1vek1vdmVtZW50WCA6IHR5cGVvZiBldmVudC5nZXRNb3ZlbWVudFggPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGV2ZW50LmdldE1vdmVtZW50WCgpIDogMDtcbiAgICBjb25zdCBtb3ZlbWVudFkgPSB0eXBlb2YgZXZlbnQubW92ZW1lbnRZID09PSAnbnVtYmVyJ1xuICAgICAgPyBldmVudC5tb3ZlbWVudFkgOiB0eXBlb2YgZXZlbnQubW96TW92ZW1lbnRZID09PSAnbnVtYmVyJ1xuICAgICAgICA/IGV2ZW50Lm1vek1vdmVtZW50WSA6IHR5cGVvZiBldmVudC5nZXRNb3ZlbWVudFkgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGV2ZW50LmdldE1vdmVtZW50WSgpIDogMDtcblxuICAgIHlhd09iamVjdC5yb3RhdGlvbi55IC09IG1vdmVtZW50WCAqIDAuMDAyO1xuICAgIHBpdGNoT2JqZWN0LnJvdGF0aW9uLnggLT0gbW92ZW1lbnRZICogMC4wMDI7XG5cbiAgICBwaXRjaE9iamVjdC5yb3RhdGlvbi54ID0gTWF0aC5tYXgoLVBJXzIsIE1hdGgubWluKFBJXzIsIHBpdGNoT2JqZWN0LnJvdGF0aW9uLngpKTtcbiAgfTtcblxuICBjb25zdCBwaHlzaWNzID0gcGxheWVyLnVzZSgncGh5c2ljcycpO1xuXG4gIGNvbnN0IG9uS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgMzg6IC8vIHVwXG4gICAgICBjYXNlIDg3OiAvLyB3XG4gICAgICAgIG1vdmVGb3J3YXJkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzc6IC8vIGxlZnRcbiAgICAgIGNhc2UgNjU6IC8vIGFcbiAgICAgICAgbW92ZUxlZnQgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0MDogLy8gZG93blxuICAgICAgY2FzZSA4MzogLy8gc1xuICAgICAgICBtb3ZlQmFja3dhcmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOTogLy8gcmlnaHRcbiAgICAgIGNhc2UgNjg6IC8vIGRcbiAgICAgICAgbW92ZVJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzI6IC8vIHNwYWNlXG4gICAgICAgIGNvbnNvbGUubG9nKGNhbkp1bXApO1xuICAgICAgICBpZiAoY2FuSnVtcCA9PT0gdHJ1ZSkgcGh5c2ljcy5hcHBseUNlbnRyYWxJbXB1bHNlKHt4OiAwLCB5OiAzMDAsIHo6IDB9KTtcbiAgICAgICAgY2FuSnVtcCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxNjogLy8gc2hpZnRcbiAgICAgICAgcnVuVmVsb2NpdHkgPSAwLjU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvbktleVVwID0gZXZlbnQgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSAzODogLy8gdXBcbiAgICAgIGNhc2UgODc6IC8vIHdcbiAgICAgICAgbW92ZUZvcndhcmQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzc6IC8vIGxlZnRcbiAgICAgIGNhc2UgNjU6IC8vIGFcbiAgICAgICAgbW92ZUxlZnQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNDA6IC8vIGRvd25cbiAgICAgIGNhc2UgODM6IC8vIGFcbiAgICAgICAgbW92ZUJhY2t3YXJkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM5OiAvLyByaWdodFxuICAgICAgY2FzZSA2ODogLy8gZFxuICAgICAgICBtb3ZlUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTY6IC8vIHNoaWZ0XG4gICAgICAgIHJ1blZlbG9jaXR5ID0gMC4yNTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCBmYWxzZSk7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbktleVVwLCBmYWxzZSk7XG5cbiAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gIHRoaXMuZ2V0T2JqZWN0ID0gKCkgPT4geWF3T2JqZWN0O1xuXG4gIHRoaXMuZ2V0RGlyZWN0aW9uID0gdGFyZ2V0VmVjID0+IHtcbiAgICB0YXJnZXRWZWMuc2V0KDAsIDAsIC0xKTtcbiAgICBxdWF0Lm11bHRpcGx5VmVjdG9yMyh0YXJnZXRWZWMpO1xuICB9O1xuXG4gIC8vIE1vdmVzIHRoZSBjYW1lcmEgdG8gdGhlIFBoeXNpLmpzIG9iamVjdCBwb3NpdGlvblxuICAvLyBhbmQgYWRkcyB2ZWxvY2l0eSB0byB0aGUgb2JqZWN0IGlmIHRoZSBydW4ga2V5IGlzIGRvd24uXG4gIGNvbnN0IGlucHV0VmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpLFxuICAgIGV1bGVyID0gbmV3IEV1bGVyKCk7XG5cbiAgdGhpcy51cGRhdGUgPSBkZWx0YSA9PiB7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIGRlbHRhID0gZGVsdGEgfHwgMC41O1xuICAgIGRlbHRhID0gTWF0aC5taW4oZGVsdGEsIDAuNSwgZGVsdGEpO1xuXG4gICAgaW5wdXRWZWxvY2l0eS5zZXQoMCwgMCwgMCk7XG5cbiAgICBjb25zdCBzcGVlZCA9IHZlbG9jaXR5RmFjdG9yICogZGVsdGEgKiBwYXJhbXMuc3BlZWQgKiBydW5WZWxvY2l0eTtcblxuICAgIGlmIChtb3ZlRm9yd2FyZCkgaW5wdXRWZWxvY2l0eS56ID0gLXNwZWVkO1xuICAgIGlmIChtb3ZlQmFja3dhcmQpIGlucHV0VmVsb2NpdHkueiA9IHNwZWVkO1xuICAgIGlmIChtb3ZlTGVmdCkgaW5wdXRWZWxvY2l0eS54ID0gLXNwZWVkO1xuICAgIGlmIChtb3ZlUmlnaHQpIGlucHV0VmVsb2NpdHkueCA9IHNwZWVkO1xuXG4gICAgLy8gQ29udmVydCB2ZWxvY2l0eSB0byB3b3JsZCBjb29yZGluYXRlc1xuICAgIGV1bGVyLnggPSBwaXRjaE9iamVjdC5yb3RhdGlvbi54O1xuICAgIGV1bGVyLnkgPSB5YXdPYmplY3Qucm90YXRpb24ueTtcbiAgICBldWxlci5vcmRlciA9ICdYWVonO1xuXG4gICAgcXVhdC5zZXRGcm9tRXVsZXIoZXVsZXIpO1xuXG4gICAgaW5wdXRWZWxvY2l0eS5hcHBseVF1YXRlcm5pb24ocXVhdCk7XG5cbiAgICBwaHlzaWNzLmFwcGx5Q2VudHJhbEltcHVsc2Uoe3g6IGlucHV0VmVsb2NpdHkueCwgeTogMCwgejogaW5wdXRWZWxvY2l0eS56fSk7XG4gICAgcGh5c2ljcy5zZXRBbmd1bGFyVmVsb2NpdHkoe3g6IGlucHV0VmVsb2NpdHkueiwgeTogMCwgejogLWlucHV0VmVsb2NpdHkueH0pO1xuICAgIHBoeXNpY3Muc2V0QW5ndWxhckZhY3Rvcih7eDogMCwgeTogMCwgejogMH0pO1xuICB9O1xuXG4gIHBsYXllci5vbigncGh5c2ljczphZGRlZCcsICgpID0+IHtcbiAgICBwbGF5ZXIubWFuYWdlci5nZXQoJ21vZHVsZTp3b3JsZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICB5YXdPYmplY3QucG9zaXRpb24uY29weShwbGF5ZXIucG9zaXRpb24pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpcnN0UGVyc29uTW9kdWxlIHtcbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIGJsb2NrOiBudWxsLFxuICAgIHNwZWVkOiAxLFxuICAgIHlwb3M6IDFcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihvYmplY3QsIHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMucGFyYW1zLmJsb2NrKSB7XG4gICAgICB0aGlzLnBhcmFtcy5ibG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdibG9ja2VyJyk7XG4gICAgfVxuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgdGhpcy5jb250cm9scyA9IG5ldyBGaXJzdFBlcnNvbkNvbnRyb2xzU29sdmVyKG1hbmFnZXIuZ2V0KCdjYW1lcmEnKSwgdGhpcy5vYmplY3QsIHRoaXMucGFyYW1zKTtcblxuICAgIGlmICgncG9pbnRlckxvY2tFbGVtZW50JyBpbiBkb2N1bWVudFxuICAgICAgfHwgJ21velBvaW50ZXJMb2NrRWxlbWVudCcgaW4gZG9jdW1lbnRcbiAgICAgIHx8ICd3ZWJraXRQb2ludGVyTG9ja0VsZW1lbnQnIGluIGRvY3VtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcblxuICAgICAgY29uc3QgcG9pbnRlcmxvY2tjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC5wb2ludGVyTG9ja0VsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICB8fCBkb2N1bWVudC5tb3pQb2ludGVyTG9ja0VsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICB8fCBkb2N1bWVudC53ZWJraXRQb2ludGVyTG9ja0VsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucGFyYW1zLmJsb2NrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250cm9scy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5wYXJhbXMuYmxvY2suc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgcG9pbnRlcmxvY2tjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21venBvaW50ZXJsb2NrY2hhbmdlJywgcG9pbnRlcmxvY2tjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrY2hhbmdlJywgcG9pbnRlcmxvY2tjaGFuZ2UsIGZhbHNlKTtcblxuICAgICAgY29uc3QgcG9pbnRlcmxvY2tlcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdQb2ludGVyIGxvY2sgZXJyb3IuJyk7XG4gICAgICB9O1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybG9ja2Vycm9yJywgcG9pbnRlcmxvY2tlcnJvciwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96cG9pbnRlcmxvY2tlcnJvcicsIHBvaW50ZXJsb2NrZXJyb3IsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrZXJyb3InLCBwb2ludGVybG9ja2Vycm9yLCBmYWxzZSk7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2sgPSBlbGVtZW50LnJlcXVlc3RQb2ludGVyTG9ja1xuICAgICAgICAgIHx8IGVsZW1lbnQubW96UmVxdWVzdFBvaW50ZXJMb2NrXG4gICAgICAgICAgfHwgZWxlbWVudC53ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2s7XG5cbiAgICAgICAgZWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbiA9IGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW5cbiAgICAgICAgICB8fCBlbGVtZW50Lm1velJlcXVlc3RGdWxsc2NyZWVuXG4gICAgICAgICAgfHwgZWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlblxuICAgICAgICAgIHx8IGVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW47XG5cbiAgICAgICAgaWYgKC9GaXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICAgIGNvbnN0IGZ1bGxzY3JlZW5jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICAgICAgfHwgZG9jdW1lbnQubW96RnVsbHNjcmVlbkVsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICAgICAgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGZ1bGxzY3JlZW5jaGFuZ2UpO1xuICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3pmdWxsc2NyZWVuY2hhbmdlJywgZnVsbHNjcmVlbmNoYW5nZSk7XG5cbiAgICAgICAgICAgICAgZWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGZ1bGxzY3JlZW5jaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3pmdWxsc2NyZWVuY2hhbmdlJywgZnVsbHNjcmVlbmNoYW5nZSwgZmFsc2UpO1xuXG4gICAgICAgICAgZWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgZWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBjb25zb2xlLndhcm4oJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBQb2ludGVyTG9jaycpO1xuXG4gICAgbWFuYWdlci5nZXQoJ3NjZW5lJykuYWRkKHRoaXMuY29udHJvbHMuZ2V0T2JqZWN0KCkpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBjb25zdCB1cGRhdGVQcm9jZXNzb3IgPSBjID0+IHtcbiAgICAgIHNlbGYuY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgfTtcblxuICAgIHNlbGYudXBkYXRlTG9vcCA9IG5ldyBMb29wKHVwZGF0ZVByb2Nlc3Nvcikuc3RhcnQodGhpcyk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJNRVNTQUdFX1RZUEVTIiwiV09STERSRVBPUlQiLCJDT0xMSVNJT05SRVBPUlQiLCJWRUhJQ0xFUkVQT1JUIiwiQ09OU1RSQUlOVFJFUE9SVCIsIlNPRlRSRVBPUlQiLCJSRVBPUlRfSVRFTVNJWkUiLCJDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUiLCJWRUhJQ0xFUkVQT1JUX0lURU1TSVpFIiwiQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSIsInRlbXAxVmVjdG9yMyIsIlZlY3RvcjMiLCJ0ZW1wMlZlY3RvcjMiLCJ0ZW1wMU1hdHJpeDQiLCJNYXRyaXg0IiwidGVtcDFRdWF0IiwiUXVhdGVybmlvbiIsImdldEV1bGVyWFlaRnJvbVF1YXRlcm5pb24iLCJ4IiwieSIsInoiLCJ3IiwiTWF0aCIsImF0YW4yIiwiYXNpbiIsImdldFF1YXRlcnRpb25Gcm9tRXVsZXIiLCJjMSIsImNvcyIsInMxIiwic2luIiwiYzIiLCJzMiIsImMzIiwiczMiLCJjMWMyIiwiczFzMiIsImNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QiLCJwb3NpdGlvbiIsIm9iamVjdCIsImlkZW50aXR5IiwibWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24iLCJxdWF0ZXJuaW9uIiwiZ2V0SW52ZXJzZSIsImNvcHkiLCJzdWIiLCJhcHBseU1hdHJpeDQiLCJhZGRPYmplY3RDaGlsZHJlbiIsInBhcmVudCIsImkiLCJjaGlsZHJlbiIsImxlbmd0aCIsImNoaWxkIiwicGh5c2ljcyIsImNvbXBvbmVudCIsInVzZSIsImRhdGEiLCJ1cGRhdGVNYXRyaXgiLCJ1cGRhdGVNYXRyaXhXb3JsZCIsInNldEZyb21NYXRyaXhQb3NpdGlvbiIsIm1hdHJpeFdvcmxkIiwic2V0RnJvbVJvdGF0aW9uTWF0cml4IiwicG9zaXRpb25fb2Zmc2V0Iiwicm90YXRpb24iLCJwdXNoIiwiRXZlbnRhYmxlIiwiX2V2ZW50TGlzdGVuZXJzIiwiZXZlbnRfbmFtZSIsImNhbGxiYWNrIiwiaGFzT3duUHJvcGVydHkiLCJpbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJwYXJhbWV0ZXJzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJjYWxsIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJvYmoiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRpc3BhdGNoRXZlbnQiLCJDb25lVHdpc3RDb25zdHJhaW50Iiwib2JqYSIsIm9iamIiLCJvYmplY3RhIiwib2JqZWN0YiIsInVuZGVmaW5lZCIsImNvbnNvbGUiLCJlcnJvciIsInR5cGUiLCJhcHBsaWVkSW1wdWxzZSIsIndvcmxkTW9kdWxlIiwiaWQiLCJwb3NpdGlvbmEiLCJjbG9uZSIsInBvc2l0aW9uYiIsImF4aXNhIiwiYXhpc2IiLCJleGVjdXRlIiwiY29uc3RyYWludCIsIm1heF9pbXB1bHNlIiwidGFyZ2V0Iiwic2V0RnJvbUV1bGVyIiwiRXVsZXIiLCJIaW5nZUNvbnN0cmFpbnQiLCJheGlzIiwibG93IiwiaGlnaCIsImJpYXNfZmFjdG9yIiwicmVsYXhhdGlvbl9mYWN0b3IiLCJ2ZWxvY2l0eSIsImFjY2VsZXJhdGlvbiIsIlBvaW50Q29uc3RyYWludCIsIlNsaWRlckNvbnN0cmFpbnQiLCJsaW5fbG93ZXIiLCJsaW5fdXBwZXIiLCJhbmdfbG93ZXIiLCJhbmdfdXBwZXIiLCJsaW5lYXIiLCJhbmd1bGFyIiwic2NlbmUiLCJET0ZDb25zdHJhaW50IiwibGltaXQiLCJ3aGljaCIsImxvd19hbmdsZSIsImhpZ2hfYW5nbGUiLCJtYXhfZm9yY2UiLCJWZWhpY2xlIiwibWVzaCIsInR1bmluZyIsIlZlaGljbGVUdW5pbmciLCJ3aGVlbHMiLCJfcGh5c2lqcyIsImdldE9iamVjdElkIiwicmlnaWRCb2R5Iiwic3VzcGVuc2lvbl9zdGlmZm5lc3MiLCJzdXNwZW5zaW9uX2NvbXByZXNzaW9uIiwic3VzcGVuc2lvbl9kYW1waW5nIiwibWF4X3N1c3BlbnNpb25fdHJhdmVsIiwiZnJpY3Rpb25fc2xpcCIsIm1heF9zdXNwZW5zaW9uX2ZvcmNlIiwid2hlZWxfZ2VvbWV0cnkiLCJ3aGVlbF9tYXRlcmlhbCIsImNvbm5lY3Rpb25fcG9pbnQiLCJ3aGVlbF9kaXJlY3Rpb24iLCJ3aGVlbF9heGxlIiwic3VzcGVuc2lvbl9yZXN0X2xlbmd0aCIsIndoZWVsX3JhZGl1cyIsImlzX2Zyb250X3doZWVsIiwid2hlZWwiLCJNZXNoIiwiY2FzdFNoYWRvdyIsInJlY2VpdmVTaGFkb3ciLCJtdWx0aXBseVNjYWxhciIsImFkZCIsIndvcmxkIiwiYW1vdW50Iiwic3RlZXJpbmciLCJicmFrZSIsImZvcmNlIiwiV29ybGRNb2R1bGVCYXNlIiwib3B0aW9ucyIsImJyaWRnZSIsIm9uQWRkIiwic2VsZiIsImRlZmVyIiwib25BZGRDYWxsYmFjayIsImJpbmQiLCJvblJlbW92ZSIsIm9uUmVtb3ZlQ2FsbGJhY2siLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0cyIsIm9iamVjdHMiLCJ2ZWhpY2xlcyIsImNvbnN0cmFpbnRzIiwiaXNTaW11bGF0aW5nIiwicmVjZWl2ZSIsIl90ZW1wIiwiZXZlbnQiLCJBcnJheUJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJGbG9hdDMyQXJyYXkiLCJ1cGRhdGVTY2VuZSIsInVwZGF0ZVNvZnRib2RpZXMiLCJ1cGRhdGVDb2xsaXNpb25zIiwidXBkYXRlVmVoaWNsZXMiLCJ1cGRhdGVDb25zdHJhaW50cyIsImNtZCIsInBhcmFtcyIsIndpbmRvdyIsInRlc3QiLCJkZWJ1ZyIsImRpciIsImluZm8iLCJvZmZzZXQiLCJfX2RpcnR5UG9zaXRpb24iLCJzZXQiLCJfX2RpcnR5Um90YXRpb24iLCJsaW5lYXJWZWxvY2l0eSIsImFuZ3VsYXJWZWxvY2l0eSIsIlNVUFBPUlRfVFJBTlNGRVJBQkxFIiwic2VuZCIsImJ1ZmZlciIsInNpemUiLCJhdHRyaWJ1dGVzIiwiZ2VvbWV0cnkiLCJ2b2x1bWVQb3NpdGlvbnMiLCJhcnJheSIsIm9mZnNldFZlcnQiLCJpc1NvZnRCb2R5UmVzZXQiLCJ2b2x1bWVOb3JtYWxzIiwibm9ybWFsIiwib2ZmcyIsIngxIiwieTEiLCJ6MSIsIm54MSIsIm55MSIsIm56MSIsIngyIiwieTIiLCJ6MiIsIm54MiIsIm55MiIsIm56MiIsIngzIiwieTMiLCJ6MyIsIm54MyIsIm55MyIsIm56MyIsImk5IiwibmVlZHNVcGRhdGUiLCJueCIsIm55IiwibnoiLCJ2ZWhpY2xlIiwiZXh0cmFjdFJvdGF0aW9uIiwibWF0cml4IiwiYWRkVmVjdG9ycyIsImNvbGxpc2lvbnMiLCJub3JtYWxfb2Zmc2V0cyIsIm9iamVjdDIiLCJpZDEiLCJqIiwidG91Y2hlcyIsImlkMiIsImNvbXBvbmVudDIiLCJkYXRhMiIsInZlbCIsImdldExpbmVhclZlbG9jaXR5IiwidmVsMiIsInN1YlZlY3RvcnMiLCJ0ZW1wMSIsInRlbXAyIiwibm9ybWFsX29mZnNldCIsImVtaXQiLCJzaG93X21hcmtlciIsImdldERlZmluaXRpb24iLCJtYXJrZXIiLCJTcGhlcmVHZW9tZXRyeSIsIk1lc2hOb3JtYWxNYXRlcmlhbCIsIkJveEdlb21ldHJ5IiwibmF0aXZlIiwibWFuYWdlciIsIndpZHRoIiwic2NhbGUiLCJoZWlnaHQiLCJkZXB0aCIsInJlbW92ZSIsInBvcCIsImZ1bmMiLCJhcmdzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpc0xvYWRlZCIsImxvYWRlciIsInRoZW4iLCJkZWZpbmUiLCJ3b3JrZXIiLCJzZXRGaXhlZFRpbWVTdGVwIiwiZml4ZWRUaW1lU3RlcCIsInNldEdyYXZpdHkiLCJncmF2aXR5IiwiYWRkQ29uc3RyYWludCIsInNpbXVsYXRlIiwidGltZVN0ZXAiLCJtYXhTdWJTdGVwcyIsIl9zdGF0cyIsImJlZ2luIiwib2JqZWN0X2lkIiwidXBkYXRlIiwicG9zIiwiaXNTb2Z0Ym9keSIsInF1YXQiLCJlbmQiLCJzaW11bGF0ZUxvb3AiLCJMb29wIiwiY2xvY2siLCJnZXREZWx0YSIsInN0YXJ0IiwibG9nIiwicmF0ZUxpbWl0IiwiYW1tbyIsInNvZnRib2R5IiwiVEFSR0VUIiwiU3ltYm9sIiwiU0NSSVBUX1RZUEUiLCJCbG9iQnVpbGRlciIsIldlYktpdEJsb2JCdWlsZGVyIiwiTW96QmxvYkJ1aWxkZXIiLCJNU0Jsb2JCdWlsZGVyIiwiVVJMIiwid2Via2l0VVJMIiwiV29ya2VyIiwic2hpbVdvcmtlciIsImZpbGVuYW1lIiwiZm4iLCJTaGltV29ya2VyIiwiZm9yY2VGYWxsYmFjayIsIm8iLCJzb3VyY2UiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJzbGljZSIsIm9ialVSTCIsImNyZWF0ZVNvdXJjZU9iamVjdCIsInJldm9rZU9iamVjdFVSTCIsInNlbGZTaGltIiwicG9zdE1lc3NhZ2UiLCJtIiwib25tZXNzYWdlIiwic2V0VGltZW91dCIsImlzVGhpc1RocmVhZCIsInRlc3RXb3JrZXIiLCJ0ZXN0QXJyYXkiLCJVaW50OEFycmF5IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiRXJyb3IiLCJlIiwidGVybWluYXRlIiwic3RyIiwiY3JlYXRlT2JqZWN0VVJMIiwiQmxvYiIsImJsb2IiLCJhcHBlbmQiLCJnZXRCbG9iIiwiZG9jdW1lbnQiLCJFdmVudHMiLCJldmVudHMiLCJlbXB0eSIsIm9uIiwiY3R4Iiwib2ZmIiwibGlzdCIsImluc2lkZVdvcmtlciIsIndlYmtpdFBvc3RNZXNzYWdlIiwiYWIiLCJfb2JqZWN0IiwiX3ZlY3RvciIsIl90cmFuc2Zvcm0iLCJfdHJhbnNmb3JtX3BvcyIsIl9zb2Z0Ym9keV9lbmFibGVkIiwibGFzdF9zaW11bGF0aW9uX2R1cmF0aW9uIiwiX251bV9vYmplY3RzIiwiX251bV9yaWdpZGJvZHlfb2JqZWN0cyIsIl9udW1fc29mdGJvZHlfb2JqZWN0cyIsIl9udW1fd2hlZWxzIiwiX251bV9jb25zdHJhaW50cyIsIl9zb2Z0Ym9keV9yZXBvcnRfc2l6ZSIsIl92ZWMzXzEiLCJfdmVjM18yIiwiX3ZlYzNfMyIsIl9xdWF0IiwicHVibGljX2Z1bmN0aW9ucyIsIl9vYmplY3RzIiwiX3ZlaGljbGVzIiwiX2NvbnN0cmFpbnRzIiwiX29iamVjdHNfYW1tbyIsIl9vYmplY3Rfc2hhcGVzIiwiX21vdGlvbl9zdGF0ZXMiLCJfbm9uY2FjaGVkX3NoYXBlcyIsIl9jb21wb3VuZF9zaGFwZXMiLCJSRVBPUlRfQ0hVTktTSVpFIiwid29ybGRyZXBvcnQiLCJzb2Z0cmVwb3J0IiwiY29sbGlzaW9ucmVwb3J0IiwidmVoaWNsZXJlcG9ydCIsImNvbnN0cmFpbnRyZXBvcnQiLCJXT1JMRFJFUE9SVF9JVEVNU0laRSIsImdldFNoYXBlRnJvbUNhY2hlIiwiY2FjaGVfa2V5Iiwic2V0U2hhcGVDYWNoZSIsInNoYXBlIiwiY3JlYXRlU2hhcGUiLCJkZXNjcmlwdGlvbiIsInNldElkZW50aXR5IiwiQW1tbyIsImJ0Q29tcG91bmRTaGFwZSIsInNldFgiLCJzZXRZIiwic2V0WiIsImJ0U3RhdGljUGxhbmVTaGFwZSIsImJ0Qm94U2hhcGUiLCJyYWRpdXMiLCJidFNwaGVyZVNoYXBlIiwiYnRDeWxpbmRlclNoYXBlIiwiYnRDYXBzdWxlU2hhcGUiLCJidENvbmVTaGFwZSIsInRyaWFuZ2xlX21lc2giLCJidFRyaWFuZ2xlTWVzaCIsImFkZFRyaWFuZ2xlIiwiYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSIsImJ0Q29udmV4SHVsbFNoYXBlIiwiYWRkUG9pbnQiLCJ4cHRzIiwieXB0cyIsInBvaW50cyIsInB0ciIsIl9tYWxsb2MiLCJwIiwicDIiLCJIRUFQRjMyIiwiYnRIZWlnaHRmaWVsZFRlcnJhaW5TaGFwZSIsImFic01heEhlaWdodCIsImNyZWF0ZVNvZnRCb2R5IiwiYm9keSIsInNvZnRCb2R5SGVscGVycyIsImJ0U29mdEJvZHlIZWxwZXJzIiwiYVZlcnRpY2VzIiwiQ3JlYXRlRnJvbVRyaU1lc2giLCJnZXRXb3JsZEluZm8iLCJhSW5kaWNlcyIsImNyIiwiY29ybmVycyIsIkNyZWF0ZVBhdGNoIiwiYnRWZWN0b3IzIiwic2VnbWVudHMiLCJDcmVhdGVSb3BlIiwiaW5pdCIsIm5vV29ya2VyIiwibWFrZVdvcmxkIiwid2FzbUJ1ZmZlciIsImltcG9ydFNjcmlwdHMiLCJsb2FkQW1tb0Zyb21CaW5hcnkiLCJidFRyYW5zZm9ybSIsImJ0UXVhdGVybmlvbiIsInJlcG9ydHNpemUiLCJjb2xsaXNpb25Db25maWd1cmF0aW9uIiwiYnRTb2Z0Qm9keVJpZ2lkQm9keUNvbGxpc2lvbkNvbmZpZ3VyYXRpb24iLCJidERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uIiwiZGlzcGF0Y2hlciIsImJ0Q29sbGlzaW9uRGlzcGF0Y2hlciIsInNvbHZlciIsImJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyIiwiYnJvYWRwaGFzZSIsImFhYmJtaW4iLCJhYWJibWF4IiwiYnRBeGlzU3dlZXAzIiwiYnREYnZ0QnJvYWRwaGFzZSIsImJ0U29mdFJpZ2lkRHluYW1pY3NXb3JsZCIsImJ0RGVmYXVsdFNvZnRCb2R5U29sdmVyIiwiYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQiLCJhcHBlbmRBbmNob3IiLCJub2RlIiwib2JqMiIsImNvbGxpc2lvbkJldHdlZW5MaW5rZWRCb2RpZXMiLCJpbmZsdWVuY2UiLCJsaW5rTm9kZXMiLCJzZWxmX2JvZHkiLCJvdGhlcl9ib2R5Iiwic2VsZl9ub2RlIiwiZ2V0X21fbm9kZXMiLCJhdCIsIm4xIiwib3RoZXJfbm9kZSIsIm4yIiwic2VsZl92ZWMiLCJnZXRfbV94Iiwib3RoZXJfdmVjIiwiZm9yY2VfeCIsImZvcmNlX3kiLCJmb3JjZV96IiwiY2FjaGVkX2Rpc3RhbmNlIiwibGlua2VkIiwiX2xvb3AiLCJzZXRJbnRlcnZhbCIsImRpc3RhbmNlIiwic3FydCIsInNldFZlbG9jaXR5IiwibW9kaWZlcjIiLCJtYXgiLCJtb2RpZmllciIsImFkZFZlbG9jaXR5IiwiYXBwZW5kTGluayIsImFkZEZvcmNlIiwiYXBwZW5kTGluZWFySm9pbnQiLCJzcGVjcyIsIlNwZWNzIiwiX3BvcyIsInNldF9wb3NpdGlvbiIsImVycCIsInNldF9lcnAiLCJjZm0iLCJzZXRfY2ZtIiwic3BsaXQiLCJzZXRfc3BsaXQiLCJhZGRPYmplY3QiLCJtb3Rpb25TdGF0ZSIsInNiQ29uZmlnIiwiZ2V0X21fY2ZnIiwidml0ZXJhdGlvbnMiLCJzZXRfdml0ZXJhdGlvbnMiLCJwaXRlcmF0aW9ucyIsInNldF9waXRlcmF0aW9ucyIsImRpdGVyYXRpb25zIiwic2V0X2RpdGVyYXRpb25zIiwiY2l0ZXJhdGlvbnMiLCJzZXRfY2l0ZXJhdGlvbnMiLCJzZXRfY29sbGlzaW9ucyIsInNldF9rREYiLCJmcmljdGlvbiIsInNldF9rRFAiLCJkYW1waW5nIiwicHJlc3N1cmUiLCJzZXRfa1BSIiwiZHJhZyIsInNldF9rREciLCJsaWZ0Iiwic2V0X2tMRiIsImFuY2hvckhhcmRuZXNzIiwic2V0X2tBSFIiLCJyaWdpZEhhcmRuZXNzIiwic2V0X2tDSFIiLCJrbHN0IiwiZ2V0X21fbWF0ZXJpYWxzIiwic2V0X21fa0xTVCIsImthc3QiLCJzZXRfbV9rQVNUIiwia3ZzdCIsInNldF9tX2tWU1QiLCJjYXN0T2JqZWN0IiwiYnRDb2xsaXNpb25PYmplY3QiLCJnZXRDb2xsaXNpb25TaGFwZSIsInNldE1hcmdpbiIsIm1hcmdpbiIsInNldEFjdGl2YXRpb25TdGF0ZSIsInN0YXRlIiwicm9wZSIsImNsb3RoIiwic2V0VyIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsInNldFRvdGFsTWFzcyIsIm1hc3MiLCJhZGRTb2Z0Qm9keSIsImdldF9tX2ZhY2VzIiwiY29tcG91bmRfc2hhcGUiLCJhZGRDaGlsZFNoYXBlIiwiX2NoaWxkIiwidHJhbnMiLCJzZXRPcmlnaW4iLCJzZXRSb3RhdGlvbiIsImRlc3Ryb3kiLCJzZXRMb2NhbFNjYWxpbmciLCJjYWxjdWxhdGVMb2NhbEluZXJ0aWEiLCJidERlZmF1bHRNb3Rpb25TdGF0ZSIsInJiSW5mbyIsImJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyIsInNldF9tX2ZyaWN0aW9uIiwic2V0X21fcmVzdGl0dXRpb24iLCJyZXN0aXR1dGlvbiIsInNldF9tX2xpbmVhckRhbXBpbmciLCJzZXRfbV9hbmd1bGFyRGFtcGluZyIsImJ0UmlnaWRCb2R5IiwiY29sbGlzaW9uX2ZsYWdzIiwic2V0Q29sbGlzaW9uRmxhZ3MiLCJncm91cCIsIm1hc2siLCJhZGRSaWdpZEJvZHkiLCJhY3RpdmF0ZSIsImEiLCJhZGRWZWhpY2xlIiwidmVoaWNsZV90dW5pbmciLCJidFZlaGljbGVUdW5pbmciLCJzZXRfbV9zdXNwZW5zaW9uU3RpZmZuZXNzIiwic2V0X21fc3VzcGVuc2lvbkNvbXByZXNzaW9uIiwic2V0X21fc3VzcGVuc2lvbkRhbXBpbmciLCJzZXRfbV9tYXhTdXNwZW5zaW9uVHJhdmVsQ20iLCJzZXRfbV9tYXhTdXNwZW5zaW9uRm9yY2UiLCJidFJheWNhc3RWZWhpY2xlIiwiYnREZWZhdWx0VmVoaWNsZVJheWNhc3RlciIsInNldENvb3JkaW5hdGVTeXN0ZW0iLCJyZW1vdmVWZWhpY2xlIiwiYWRkV2hlZWwiLCJzZXRTdGVlcmluZyIsImRldGFpbHMiLCJzZXRTdGVlcmluZ1ZhbHVlIiwic2V0QnJha2UiLCJhcHBseUVuZ2luZUZvcmNlIiwicmVtb3ZlT2JqZWN0IiwicmVtb3ZlU29mdEJvZHkiLCJyZW1vdmVSaWdpZEJvZHkiLCJ1cGRhdGVUcmFuc2Zvcm0iLCJnZXRNb3Rpb25TdGF0ZSIsImdldFdvcmxkVHJhbnNmb3JtIiwic2V0V29ybGRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iLCJ1cGRhdGVNYXNzIiwic2V0TWFzc1Byb3BzIiwiYXBwbHlDZW50cmFsSW1wdWxzZSIsImFwcGx5SW1wdWxzZSIsImltcHVsc2VfeCIsImltcHVsc2VfeSIsImltcHVsc2VfeiIsImFwcGx5VG9ycXVlIiwidG9ycXVlX3giLCJ0b3JxdWVfeSIsInRvcnF1ZV96IiwiYXBwbHlDZW50cmFsRm9yY2UiLCJhcHBseUZvcmNlIiwib25TaW11bGF0aW9uUmVzdW1lIiwibGFzdF9zaW11bGF0aW9uX3RpbWUiLCJzZXRBbmd1bGFyVmVsb2NpdHkiLCJzZXRMaW5lYXJWZWxvY2l0eSIsInNldEFuZ3VsYXJGYWN0b3IiLCJzZXRMaW5lYXJGYWN0b3IiLCJzZXREYW1waW5nIiwic2V0Q2NkTW90aW9uVGhyZXNob2xkIiwidGhyZXNob2xkIiwic2V0Q2NkU3dlcHRTcGhlcmVSYWRpdXMiLCJidFBvaW50MlBvaW50Q29uc3RyYWludCIsImJ0SGluZ2VDb25zdHJhaW50IiwidHJhbnNmb3JtYiIsInRyYW5zZm9ybWEiLCJnZXRSb3RhdGlvbiIsInNldEV1bGVyIiwiYnRTbGlkZXJDb25zdHJhaW50IiwidGEiLCJ0YiIsInNldEV1bGVyWllYIiwiYnRDb25lVHdpc3RDb25zdHJhaW50Iiwic2V0TGltaXQiLCJQSSIsImJ0R2VuZXJpYzZEb2ZDb25zdHJhaW50IiwiYiIsImVuYWJsZUZlZWRiYWNrIiwicmVtb3ZlQ29uc3RyYWludCIsImNvbnN0cmFpbnRfc2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkIiwic2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkIiwiY2VpbCIsInN0ZXBTaW11bGF0aW9uIiwicmVwb3J0VmVoaWNsZXMiLCJyZXBvcnRDb2xsaXNpb25zIiwicmVwb3J0Q29uc3RyYWludHMiLCJyZXBvcnRXb3JsZCIsInJlcG9ydFdvcmxkX3NvZnRib2RpZXMiLCJoaW5nZV9zZXRMaW1pdHMiLCJoaW5nZV9lbmFibGVBbmd1bGFyTW90b3IiLCJlbmFibGVBbmd1bGFyTW90b3IiLCJoaW5nZV9kaXNhYmxlTW90b3IiLCJlbmFibGVNb3RvciIsInNsaWRlcl9zZXRMaW1pdHMiLCJzZXRMb3dlckxpbkxpbWl0Iiwic2V0VXBwZXJMaW5MaW1pdCIsInNldExvd2VyQW5nTGltaXQiLCJzZXRVcHBlckFuZ0xpbWl0Iiwic2xpZGVyX3NldFJlc3RpdHV0aW9uIiwic2V0U29mdG5lc3NMaW1MaW4iLCJzZXRTb2Z0bmVzc0xpbUFuZyIsInNsaWRlcl9lbmFibGVMaW5lYXJNb3RvciIsInNldFRhcmdldExpbk1vdG9yVmVsb2NpdHkiLCJzZXRNYXhMaW5Nb3RvckZvcmNlIiwic2V0UG93ZXJlZExpbk1vdG9yIiwic2xpZGVyX2Rpc2FibGVMaW5lYXJNb3RvciIsInNsaWRlcl9lbmFibGVBbmd1bGFyTW90b3IiLCJzZXRUYXJnZXRBbmdNb3RvclZlbG9jaXR5Iiwic2V0TWF4QW5nTW90b3JGb3JjZSIsInNldFBvd2VyZWRBbmdNb3RvciIsInNsaWRlcl9kaXNhYmxlQW5ndWxhck1vdG9yIiwiY29uZXR3aXN0X3NldExpbWl0IiwiY29uZXR3aXN0X2VuYWJsZU1vdG9yIiwiY29uZXR3aXN0X3NldE1heE1vdG9ySW1wdWxzZSIsInNldE1heE1vdG9ySW1wdWxzZSIsImNvbmV0d2lzdF9zZXRNb3RvclRhcmdldCIsInNldE1vdG9yVGFyZ2V0IiwiY29uZXR3aXN0X2Rpc2FibGVNb3RvciIsImRvZl9zZXRMaW5lYXJMb3dlckxpbWl0Iiwic2V0TGluZWFyTG93ZXJMaW1pdCIsImRvZl9zZXRMaW5lYXJVcHBlckxpbWl0Iiwic2V0TGluZWFyVXBwZXJMaW1pdCIsImRvZl9zZXRBbmd1bGFyTG93ZXJMaW1pdCIsInNldEFuZ3VsYXJMb3dlckxpbWl0IiwiZG9mX3NldEFuZ3VsYXJVcHBlckxpbWl0Iiwic2V0QW5ndWxhclVwcGVyTGltaXQiLCJkb2ZfZW5hYmxlQW5ndWxhck1vdG9yIiwibW90b3IiLCJnZXRSb3RhdGlvbmFsTGltaXRNb3RvciIsInNldF9tX2VuYWJsZU1vdG9yIiwiZG9mX2NvbmZpZ3VyZUFuZ3VsYXJNb3RvciIsInNldF9tX2xvTGltaXQiLCJzZXRfbV9oaUxpbWl0Iiwic2V0X21fdGFyZ2V0VmVsb2NpdHkiLCJzZXRfbV9tYXhNb3RvckZvcmNlIiwiZG9mX2Rpc2FibGVBbmd1bGFyTW90b3IiLCJnZXRDZW50ZXJPZk1hc3NUcmFuc2Zvcm0iLCJvcmlnaW4iLCJnZXRPcmlnaW4iLCJnZXRBbmd1bGFyVmVsb2NpdHkiLCJub2RlcyIsInZlcnQiLCJnZXRfbV9uIiwiZmFjZXMiLCJmYWNlIiwibm9kZTEiLCJub2RlMiIsIm5vZGUzIiwidmVydDEiLCJ2ZXJ0MiIsInZlcnQzIiwibm9ybWFsMSIsIm5vcm1hbDIiLCJub3JtYWwzIiwiZHAiLCJnZXREaXNwYXRjaGVyIiwibnVtIiwiZ2V0TnVtTWFuaWZvbGRzIiwibWFuaWZvbGQiLCJnZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbCIsIm51bV9jb250YWN0cyIsImdldE51bUNvbnRhY3RzIiwicHQiLCJnZXRDb250YWN0UG9pbnQiLCJnZXRCb2R5MCIsImdldEJvZHkxIiwiZ2V0X21fbm9ybWFsV29ybGRPbkIiLCJnZXROdW1XaGVlbHMiLCJnZXRXaGVlbEluZm8iLCJnZXRfbV93b3JsZFRyYW5zZm9ybSIsImxlbmdodCIsIm9mZnNldF9ib2R5IiwiZ2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkIiwiV29ybGRNb2R1bGUiLCJQaHlzaWNzV29ya2VyIiwidHJhbnNmZXJhYmxlTWVzc2FnZSIsInJlamVjdCIsInNldHVwIiwicHJvcGVydGllcyIsImdldCIsIl9uYXRpdmUiLCJ2ZWN0b3IzIiwic2NvcGUiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3giLCJfeSIsIl96IiwiX19jX3JvdCIsIm9uQ2hhbmdlIiwiZXVsZXIiLCJyb3QiLCJ3cmFwUGh5c2ljc1Byb3RvdHlwZSIsImtleSIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIm9uQ29weSIsInNvdXJjZVBoeXNpY3MiLCJtb2R1bGVzIiwib25XcmFwIiwiQVBJIiwiZmFjdG9yIiwiaGFzIiwibW9kdWxlIiwicmVzdWx0IiwiY29uc3RydWN0b3IiLCJyaWdpZGJvZHkiLCJCb3hNb2R1bGUiLCJQaHlzaWNzTW9kdWxlIiwidXBkYXRlRGF0YSIsImJvdW5kaW5nQm94IiwiY29tcHV0ZUJvdW5kaW5nQm94IiwibWluIiwiQ29tcG91bmRNb2R1bGUiLCJDYXBzdWxlTW9kdWxlIiwiQ29uY2F2ZU1vZHVsZSIsImdlb21ldHJ5UHJvY2Vzc29yIiwiaXNCdWZmZXJHZW9tZXRyeSIsInZlcnRpY2VzIiwidkEiLCJ2QiIsInZDIiwiYyIsIkNvbmVNb2R1bGUiLCJDb252ZXhNb2R1bGUiLCJfYnVmZmVyR2VvbWV0cnkiLCJCdWZmZXJHZW9tZXRyeSIsImZyb21HZW9tZXRyeSIsIkN5bGluZGVyTW9kdWxlIiwiSGVpZ2h0ZmllbGRNb2R1bGUiLCJWZWN0b3IyIiwiYXV0b0FsaWduIiwieGRpdiIsInlkaXYiLCJ2ZXJ0cyIsInhzaXplIiwieXNpemUiLCJhYnMiLCJ2TnVtIiwicm91bmQiLCJtdWx0aXBseSIsIlBsYW5lTW9kdWxlIiwiU3BoZXJlTW9kdWxlIiwiYm91bmRpbmdTcGhlcmUiLCJjb21wdXRlQm91bmRpbmdTcGhlcmUiLCJTb2Z0Ym9keU1vZHVsZSIsImlkeEdlb21ldHJ5IiwibWVyZ2VWZXJ0aWNlcyIsImJ1ZmZlckdlb21ldHJ5IiwiYWRkQXR0cmlidXRlIiwiQnVmZmVyQXR0cmlidXRlIiwiY29weVZlY3RvcjNzQXJyYXkiLCJzZXRJbmRleCIsIlVpbnQzMkFycmF5IiwiVWludDE2QXJyYXkiLCJjb3B5SW5kaWNlc0FycmF5IiwibzEiLCJvMiIsImFycmF5TWF4IiwiSW5maW5pdHkiLCJsIiwiQ2xvdGhNb2R1bGUiLCJnZW9tUGFyYW1zIiwiZ2VvbSIsImZhY2VzTGVuZ3RoIiwidXZzIiwiZmFjZVZlcnRleFV2cyIsIm5vcm1hbHNBcnJheSIsInV2c0FycmF5IiwiZmFjZUFycmF5IiwiaTMiLCJ3aWR0aFNlZ21lbnRzIiwiaGVpZ2h0U2VnbWVudHMiLCJpZHgwMCIsImlkeDAxIiwiaWR4MTAiLCJpZHgxMSIsIlJvcGVNb2R1bGUiLCJidWZmIiwiZnJvbUFycmF5IiwibiIsInYxIiwidjIiLCJQSV8yIiwiRmlyc3RQZXJzb25Db250cm9sc1NvbHZlciIsImNhbWVyYSIsInZlbG9jaXR5RmFjdG9yIiwicnVuVmVsb2NpdHkiLCJwbGF5ZXIiLCJwaXRjaE9iamVjdCIsIk9iamVjdDNEIiwieWF3T2JqZWN0IiwieXBvcyIsImNhbkp1bXAiLCJtb3ZlRm9yd2FyZCIsIm1vdmVCYWNrd2FyZCIsIm1vdmVMZWZ0IiwibW92ZVJpZ2h0Iiwib3RoZXJPYmplY3QiLCJ2IiwiciIsImNvbnRhY3ROb3JtYWwiLCJvbk1vdXNlTW92ZSIsImVuYWJsZWQiLCJtb3ZlbWVudFgiLCJtb3pNb3ZlbWVudFgiLCJnZXRNb3ZlbWVudFgiLCJtb3ZlbWVudFkiLCJtb3pNb3ZlbWVudFkiLCJnZXRNb3ZlbWVudFkiLCJvbktleURvd24iLCJrZXlDb2RlIiwib25LZXlVcCIsImdldE9iamVjdCIsImdldERpcmVjdGlvbiIsInRhcmdldFZlYyIsIm11bHRpcGx5VmVjdG9yMyIsImlucHV0VmVsb2NpdHkiLCJkZWx0YSIsInNwZWVkIiwib3JkZXIiLCJhcHBseVF1YXRlcm5pb24iLCJGaXJzdFBlcnNvbk1vZHVsZSIsImJsb2NrIiwiZ2V0RWxlbWVudEJ5SWQiLCJjb250cm9scyIsImVsZW1lbnQiLCJwb2ludGVybG9ja2NoYW5nZSIsInBvaW50ZXJMb2NrRWxlbWVudCIsIm1velBvaW50ZXJMb2NrRWxlbWVudCIsIndlYmtpdFBvaW50ZXJMb2NrRWxlbWVudCIsInN0eWxlIiwiZGlzcGxheSIsInBvaW50ZXJsb2NrZXJyb3IiLCJ3YXJuIiwicXVlcnlTZWxlY3RvciIsInJlcXVlc3RQb2ludGVyTG9jayIsIm1velJlcXVlc3RQb2ludGVyTG9jayIsIndlYmtpdFJlcXVlc3RQb2ludGVyTG9jayIsInJlcXVlc3RGdWxsc2NyZWVuIiwibW96UmVxdWVzdEZ1bGxzY3JlZW4iLCJtb3pSZXF1ZXN0RnVsbFNjcmVlbiIsIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiwiZnVsbHNjcmVlbmNoYW5nZSIsImZ1bGxzY3JlZW5FbGVtZW50IiwibW96RnVsbHNjcmVlbkVsZW1lbnQiLCJtb3pGdWxsU2NyZWVuRWxlbWVudCIsInVwZGF0ZVByb2Nlc3NvciIsInVwZGF0ZUxvb3AiXSwibWFwcGluZ3MiOiI7Ozs7OztNQU1NQSxnQkFBZ0I7RUFDcEJDLGVBQWEsQ0FETztFQUVwQkMsbUJBQWlCLENBRkc7RUFHcEJDLGlCQUFlLENBSEs7RUFJcEJDLG9CQUFrQixDQUpFO0VBS3BCQyxjQUFZO0VBTFEsQ0FBdEI7O0FBUUEsTUFBTUMsa0JBQWtCLEVBQXhCO0VBQUEsSUFDRUMsMkJBQTJCLENBRDdCO0VBQUEsSUFFRUMseUJBQXlCLENBRjNCO0VBQUEsSUFHRUMsNEJBQTRCLENBSDlCOztBQUtBLE1BQU1DLGVBQWUsSUFBSUMsYUFBSixFQUFyQjtFQUFBLElBQ0VDLGVBQWUsSUFBSUQsYUFBSixFQURqQjtFQUFBLElBRUVFLGVBQWUsSUFBSUMsYUFBSixFQUZqQjtFQUFBLElBR0VDLFlBQVksSUFBSUMsZ0JBQUosRUFIZDs7QUFLQSxNQUFNQyw0QkFBNEIsU0FBNUJBLHlCQUE0QixDQUFDQyxDQUFELEVBQUlDLENBQUosRUFBT0MsQ0FBUCxFQUFVQyxDQUFWLEVBQWdCO0VBQ2hELFNBQU8sSUFBSVYsYUFBSixDQUNMVyxLQUFLQyxLQUFMLENBQVcsS0FBS0wsSUFBSUcsQ0FBSixHQUFRRixJQUFJQyxD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 diff --git a/lib/physijs_worker.js b/lib/physijs_worker.js new file mode 100644 index 0000000..a6c3811 --- /dev/null +++ b/lib/physijs_worker.js @@ -0,0 +1,1415 @@ +'use strict'; +var + transferableMessage = self.webkitPostMessage || self.postMessage, + + // enum + MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3 + }, + + // temp variables + _object, + _vector, + _transform, + + // functions + public_functions = {}, + getShapeFromCache, + setShapeCache, + createShape, + reportWorld, + reportVehicles, + reportCollisions, + reportConstraints, + + // world variables + fixedTimeStep, // used when calling stepSimulation + rateLimit, // sets whether or not to sync the simulation rate with fixedTimeStep + last_simulation_time, + last_simulation_duration = 0, + world, + transform, + _vec3_1, + _vec3_2, + _vec3_3, + _quat, + // private cache + _objects = {}, + _vehicles = {}, + _constraints = {}, + _materials = {}, + _objects_ammo = {}, + _num_objects = 0, + _num_wheels = 0, + _num_constraints = 0, + _object_shapes = {}, + + // The following objects are to track objects that ammo.js doesn't clean + // up. All are cleaned up when they're corresponding body is destroyed. + // Unfortunately, it's very difficult to get at these objects from the + // body, so we have to track them ourselves. + _motion_states = {}, + // Don't need to worry about it for cached shapes. + _noncached_shapes = {}, + // A body with a compound shape always has a regular shape as well, so we + // have track them separately. + _compound_shapes = {}, + + // object reporting + REPORT_CHUNKSIZE, // report array is increased in increments of this chunk size + + WORLDREPORT_ITEMSIZE = 14, // how many float values each reported item needs + worldreport, + + COLLISIONREPORT_ITEMSIZE = 5, // one float for each object id, and a Vec3 contact normal + collisionreport, + + VEHICLEREPORT_ITEMSIZE = 9, // vehicle id, wheel index, 3 for position, 4 for rotation + vehiclereport, + + CONSTRAINTREPORT_ITEMSIZE = 6, // constraint id, offset object, offset, applied impulse + constraintreport; + +var ab = new ArrayBuffer( 1 ); + +transferableMessage( ab, [ab] ); +var SUPPORT_TRANSFERABLE = ( ab.byteLength === 0 ); + +getShapeFromCache = function ( cache_key ) { + if ( _object_shapes[ cache_key ] !== undefined ) { + return _object_shapes[ cache_key ]; + } + return null; +}; + +setShapeCache = function ( cache_key, shape ) { + _object_shapes[ cache_key ] = shape; +} + +createShape = function( description ) { + var cache_key, shape; + + _transform.setIdentity(); + switch ( description.type ) { + case 'plane': + cache_key = 'plane_' + description.normal.x + '_' + description.normal.y + '_' + description.normal.z; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + _vec3_1.setX(description.normal.x); + _vec3_1.setY(description.normal.y); + _vec3_1.setZ(description.normal.z); + shape = new Ammo.btStaticPlaneShape(_vec3_1, 0 ); + setShapeCache( cache_key, shape ); + } + break; + + case 'box': + cache_key = 'box_' + description.width + '_' + description.height + '_' + description.depth; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btBoxShape(_vec3_1); + setShapeCache( cache_key, shape ); + } + break; + + case 'sphere': + cache_key = 'sphere_' + description.radius; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + shape = new Ammo.btSphereShape( description.radius ); + setShapeCache( cache_key, shape ); + } + break; + + case 'cylinder': + cache_key = 'cylinder_' + description.width + '_' + description.height + '_' + description.depth; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btCylinderShape(_vec3_1); + setShapeCache( cache_key, shape ); + } + break; + + case 'capsule': + cache_key = 'capsule_' + description.radius + '_' + description.height; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + // In Bullet, capsule height excludes the end spheres + shape = new Ammo.btCapsuleShape( description.radius, description.height - 2 * description.radius ); + setShapeCache( cache_key, shape ); + } + break; + + case 'cone': + cache_key = 'cone_' + description.radius + '_' + description.height; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + shape = new Ammo.btConeShape( description.radius, description.height ); + setShapeCache( cache_key, shape ); + } + break; + + case 'concave': + var i, triangle, triangle_mesh = new Ammo.btTriangleMesh; + if (!description.triangles.length) return false + + for ( i = 0; i < description.triangles.length; i++ ) { + triangle = description.triangles[i]; + + _vec3_1.setX(triangle[0].x); + _vec3_1.setY(triangle[0].y); + _vec3_1.setZ(triangle[0].z); + + _vec3_2.setX(triangle[1].x); + _vec3_2.setY(triangle[1].y); + _vec3_2.setZ(triangle[1].z); + + _vec3_3.setX(triangle[2].x); + _vec3_3.setY(triangle[2].y); + _vec3_3.setZ(triangle[2].z); + + triangle_mesh.addTriangle( + _vec3_1, + _vec3_2, + _vec3_3, + true + ); + } + + shape = new Ammo.btBvhTriangleMeshShape( + triangle_mesh, + true, + true + ); + _noncached_shapes[description.id] = shape; + break; + + case 'convex': + var i, point, shape = new Ammo.btConvexHullShape; + for ( i = 0; i < description.points.length; i++ ) { + point = description.points[i]; + + _vec3_1.setX(point.x); + _vec3_1.setY(point.y); + _vec3_1.setZ(point.z); + + shape.addPoint(_vec3_1); + + } + _noncached_shapes[description.id] = shape; + break; + + case 'heightfield': + + var ptr = Ammo.allocate(4 * description.xpts * description.ypts, "float", Ammo.ALLOC_NORMAL); + + for (var f = 0; f < description.points.length; f++) { + Ammo.setValue(ptr + f, description.points[f] , 'float'); + } + + shape = new Ammo.btHeightfieldTerrainShape( + description.xpts, + description.ypts, + ptr, + 1, + -description.absMaxHeight, + description.absMaxHeight, + 2, + 0, + false + ); + + _vec3_1.setX(description.xsize/(description.xpts - 1)); + _vec3_1.setY(description.ysize/(description.ypts - 1)); + _vec3_1.setZ(1); + + shape.setLocalScaling(_vec3_1); + _noncached_shapes[description.id] = shape; + break; + + default: + // Not recognized + return; + break; + } + + return shape; +}; + +public_functions.init = function( params ) { + importScripts( params.ammo ); + + _transform = new Ammo.btTransform; + _vec3_1 = new Ammo.btVector3(0,0,0); + _vec3_2 = new Ammo.btVector3(0,0,0); + _vec3_3 = new Ammo.btVector3(0,0,0); + _quat = new Ammo.btQuaternion(0,0,0,0); + + REPORT_CHUNKSIZE = params.reportsize || 50; + if ( SUPPORT_TRANSFERABLE ) { + // Transferable messages are supported, take advantage of them with TypedArrays + worldreport = new Float32Array(2 + REPORT_CHUNKSIZE * WORLDREPORT_ITEMSIZE); // message id + # of objects to report + chunk size * # of values per object + collisionreport = new Float32Array(2 + REPORT_CHUNKSIZE * COLLISIONREPORT_ITEMSIZE); // message id + # of collisions to report + chunk size * # of values per object + vehiclereport = new Float32Array(2 + REPORT_CHUNKSIZE * VEHICLEREPORT_ITEMSIZE); // message id + # of vehicles to report + chunk size * # of values per object + constraintreport = new Float32Array(2 + REPORT_CHUNKSIZE * CONSTRAINTREPORT_ITEMSIZE); // message id + # of constraints to report + chunk size * # of values per object + } else { + // Transferable messages are not supported, send data as normal arrays + worldreport = []; + collisionreport = []; + vehiclereport = []; + constraintreport = []; + } + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + + var collisionConfiguration = new Ammo.btDefaultCollisionConfiguration, + dispatcher = new Ammo.btCollisionDispatcher( collisionConfiguration ), + solver = new Ammo.btSequentialImpulseConstraintSolver, + broadphase; + + if ( !params.broadphase ) params.broadphase = { type: 'dynamic' }; + switch ( params.broadphase.type ) { + case 'sweepprune': + + _vec3_1.setX(params.broadphase.aabbmin.x); + _vec3_1.setY(params.broadphase.aabbmin.y); + _vec3_1.setZ(params.broadphase.aabbmin.z); + + _vec3_2.setX(params.broadphase.aabbmax.x); + _vec3_2.setY(params.broadphase.aabbmax.y); + _vec3_2.setZ(params.broadphase.aabbmax.z); + + broadphase = new Ammo.btAxisSweep3( + _vec3_1, + _vec3_2 + ); + + break; + + case 'dynamic': + default: + broadphase = new Ammo.btDbvtBroadphase; + break; + } + + world = new Ammo.btDiscreteDynamicsWorld( dispatcher, broadphase, solver, collisionConfiguration ); + + fixedTimeStep = params.fixedTimeStep; + rateLimit = params.rateLimit; + + transferableMessage({ cmd: 'worldReady' }); +}; + +public_functions.registerMaterial = function( description ) { + _materials[ description.id ] = description; +}; + +public_functions.unRegisterMaterial = function( description ) { + delete _materials[ description.id ]; +}; + +public_functions.setFixedTimeStep = function( description ) { + fixedTimeStep = description; +}; + +public_functions.setGravity = function( description ) { + _vec3_1.setX(description.x); + _vec3_1.setY(description.y); + _vec3_1.setZ(description.z); + world.setGravity(_vec3_1); +}; + +public_functions.addObject = function( description ) { + + var i, + localInertia, shape, motionState, rbInfo, body; + +shape = createShape( description ); +if (!shape) return +// If there are children then this is a compound shape +if ( description.children ) { + var compound_shape = new Ammo.btCompoundShape, _child; + compound_shape.addChildShape( _transform, shape ); + + for ( i = 0; i < description.children.length; i++ ) { + _child = description.children[i]; + + var trans = new Ammo.btTransform; + trans.setIdentity(); + + _vec3_1.setX(_child.position_offset.x); + _vec3_1.setY(_child.position_offset.y); + _vec3_1.setZ(_child.position_offset.z); + trans.setOrigin(_vec3_1); + + _quat.setX(_child.rotation.x); + _quat.setY(_child.rotation.y); + _quat.setZ(_child.rotation.z); + _quat.setW(_child.rotation.w); + trans.setRotation(_quat); + + shape = createShape( description.children[i] ); + compound_shape.addChildShape( trans, shape ); + Ammo.destroy(trans); + } + + shape = compound_shape; + _compound_shapes[ description.id ] = shape; + } + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + shape.calculateLocalInertia( description.mass, _vec3_1 ); + + _transform.setIdentity(); + + _vec3_2.setX(description.position.x); + _vec3_2.setY(description.position.y); + _vec3_2.setZ(description.position.z); + _transform.setOrigin(_vec3_2); + + _quat.setX(description.rotation.x); + _quat.setY(description.rotation.y); + _quat.setZ(description.rotation.z); + _quat.setW(description.rotation.w); + _transform.setRotation(_quat); + + motionState = new Ammo.btDefaultMotionState( _transform ); // #TODO: btDefaultMotionState supports center of mass offset as second argument - implement + rbInfo = new Ammo.btRigidBodyConstructionInfo( description.mass, motionState, shape, _vec3_1 ); + + if ( description.materialId !== undefined ) { + rbInfo.set_m_friction( _materials[ description.materialId ].friction ); + rbInfo.set_m_restitution( _materials[ description.materialId ].restitution ); + } + + body = new Ammo.btRigidBody( rbInfo ); + Ammo.destroy(rbInfo); + + if ( typeof description.collision_flags !== 'undefined' ) { + body.setCollisionFlags( description.collision_flags ); + } + + world.addRigidBody( body ); + + body.id = description.id; + _objects[ body.id ] = body; + _motion_states[ body.id ] = motionState; + + var ptr = body.a != undefined ? body.a : body.ptr; + _objects_ammo[ptr] = body.id; + _num_objects++; + + transferableMessage({ cmd: 'objectReady', params: body.id }); +}; + +public_functions.addVehicle = function( description ) { + var vehicle_tuning = new Ammo.btVehicleTuning(), + vehicle; + + vehicle_tuning.set_m_suspensionStiffness( description.suspension_stiffness ); + vehicle_tuning.set_m_suspensionCompression( description.suspension_compression ); + vehicle_tuning.set_m_suspensionDamping( description.suspension_damping ); + vehicle_tuning.set_m_maxSuspensionTravelCm( description.max_suspension_travel ); + vehicle_tuning.set_m_maxSuspensionForce( description.max_suspension_force ); + + vehicle = new Ammo.btRaycastVehicle( vehicle_tuning, _objects[ description.rigidBody ], new Ammo.btDefaultVehicleRaycaster( world ) ); + vehicle.tuning = vehicle_tuning; + + _objects[ description.rigidBody ].setActivationState( 4 ); + vehicle.setCoordinateSystem( 0, 1, 2 ); + + world.addVehicle( vehicle ); + _vehicles[ description.id ] = vehicle; +}; +public_functions.removeVehicle = function( description ) { + delete _vehicles[ description.id ]; +}; + +public_functions.addWheel = function( description ) { + if ( _vehicles[description.id] !== undefined ) { + var tuning = _vehicles[description.id].tuning; + if ( description.tuning !== undefined ) { + tuning = new Ammo.btVehicleTuning(); + tuning.set_m_suspensionStiffness( description.tuning.suspension_stiffness ); + tuning.set_m_suspensionCompression( description.tuning.suspension_compression ); + tuning.set_m_suspensionDamping( description.tuning.suspension_damping ); + tuning.set_m_maxSuspensionTravelCm( description.tuning.max_suspension_travel ); + tuning.set_m_maxSuspensionForce( description.tuning.max_suspension_force ); + } + + _vec3_1.setX(description.connection_point.x); + _vec3_1.setY(description.connection_point.y); + _vec3_1.setZ(description.connection_point.z); + + _vec3_2.setX(description.wheel_direction.x); + _vec3_2.setY(description.wheel_direction.y); + _vec3_2.setZ(description.wheel_direction.z); + + _vec3_3.setX(description.wheel_axle.x); + _vec3_3.setY(description.wheel_axle.y); + _vec3_3.setZ(description.wheel_axle.z); + + _vehicles[description.id].addWheel( + _vec3_1, + _vec3_2, + _vec3_3, + description.suspension_rest_length, + description.wheel_radius, + tuning, + description.is_front_wheel + ); + } + + _num_wheels++; + + if ( SUPPORT_TRANSFERABLE ) { + vehiclereport = new Float32Array(1 + _num_wheels * VEHICLEREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } else { + vehiclereport = [ MESSAGE_TYPES.VEHICLEREPORT ]; + } +}; + +public_functions.setSteering = function( details ) { + if ( _vehicles[details.id] !== undefined ) { + _vehicles[details.id].setSteeringValue( details.steering, details.wheel ); + } +}; +public_functions.setBrake = function( details ) { + if ( _vehicles[details.id] !== undefined ) { + _vehicles[details.id].setBrake( details.brake, details.wheel ); + } +}; +public_functions.applyEngineForce = function( details ) { + if ( _vehicles[details.id] !== undefined ) { + _vehicles[details.id].applyEngineForce( details.force, details.wheel ); + } +}; + +public_functions.removeObject = function( details ) { + world.removeRigidBody( _objects[details.id] ); + Ammo.destroy(_objects[details.id]); + Ammo.destroy(_motion_states[details.id]); + if (_compound_shapes[details.id]) Ammo.destroy(_compound_shapes[details.id]); + if (_noncached_shapes[details.id]) Ammo.destroy(_noncached_shapes[details.id]); + var ptr = _objects[details.id].a != undefined ? _objects[details.id].a : _objects[details.id].ptr; + delete _objects_ammo[ptr]; + delete _objects[details.id]; + delete _motion_states[details.id]; + if (_compound_shapes[details.id]) delete _compound_shapes[details.id]; + if (_noncached_shapes[details.id]) delete _noncached_shapes[details.id]; + _num_objects--; +}; + +public_functions.updateTransform = function( details ) { + _object = _objects[details.id]; + _object.getMotionState().getWorldTransform( _transform ); + + if ( details.pos ) { + _vec3_1.setX(details.pos.x); + _vec3_1.setY(details.pos.y); + _vec3_1.setZ(details.pos.z); + _transform.setOrigin(_vec3_1); + } + + if ( details.quat ) { + _quat.setX(details.quat.x); + _quat.setY(details.quat.y); + _quat.setZ(details.quat.z); + _quat.setW(details.quat.w); + _transform.setRotation(_quat); + } + + _object.setWorldTransform( _transform ); + _object.activate(); +}; + +public_functions.updateMass = function( details ) { + // #TODO: changing a static object into dynamic is buggy + _object = _objects[details.id]; + + // Per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=9&t=3663#p13816 + world.removeRigidBody( _object ); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + _object.setMassProps( details.mass, _vec3_1 ); + world.addRigidBody( _object ); + _object.activate(); +}; + +public_functions.applyCentralImpulse = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralImpulse(_vec3_1); + _objects[details.id].activate(); +}; + +public_functions.applyImpulse = function ( details ) { + + _vec3_1.setX(details.impulse_x); + _vec3_1.setY(details.impulse_y); + _vec3_1.setZ(details.impulse_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyImpulse( + _vec3_1, + _vec3_2 + ); + _objects[details.id].activate(); +}; + +public_functions.applyTorque = function ( details ) { + + _vec3_1.setX(details.torque_x); + _vec3_1.setY(details.torque_y); + _vec3_1.setZ(details.torque_z); + + _objects[details.id].applyTorque( + _vec3_1 + ); + _objects[details.id].activate(); +}; + +public_functions.applyCentralForce = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralForce(_vec3_1); + _objects[details.id].activate(); +}; + +public_functions.applyForce = function ( details ) { + + _vec3_1.setX(details.force_x); + _vec3_1.setY(details.force_y); + _vec3_1.setZ(details.force_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyForce( + _vec3_1, + _vec3_2 + ); + _objects[details.id].activate(); +}; + +public_functions.onSimulationResume = function( params ) { + last_simulation_time = Date.now(); +}; + +public_functions.setAngularVelocity = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularVelocity( + _vec3_1 + ); + _objects[details.id].activate(); +}; + +public_functions.setLinearVelocity = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearVelocity( + _vec3_1 + ); + _objects[details.id].activate(); +}; + +public_functions.setAngularFactor = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularFactor( + _vec3_1 + ); +}; + +public_functions.setLinearFactor = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearFactor( + _vec3_1 + ); +}; + +public_functions.setDamping = function ( details ) { + _objects[details.id].setDamping( details.linear, details.angular ); +}; + +public_functions.setCcdMotionThreshold = function ( details ) { + _objects[details.id].setCcdMotionThreshold( details.threshold ); +}; + +public_functions.setCcdSweptSphereRadius = function ( details ) { + _objects[details.id].setCcdSweptSphereRadius( details.radius ); +}; + +public_functions.addConstraint = function ( details ) { + var constraint; + + switch ( details.type ) { + + case 'point': + if ( details.objectb === undefined ) { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + constraint = new Ammo.btPoint2PointConstraint( + _objects[ details.objecta ], + _vec3_1 + ); + } else { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + constraint = new Ammo.btPoint2PointConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + _vec3_1, + _vec3_2 + ); + } + break; + + case 'hinge': + if ( details.objectb === undefined ) { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.axis.x); + _vec3_2.setY(details.axis.y); + _vec3_2.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint( + _objects[ details.objecta ], + _vec3_1, + _vec3_2 + ); + } else { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _vec3_3.setX(details.axis.x); + _vec3_3.setY(details.axis.y); + _vec3_3.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + _vec3_1, + _vec3_2, + _vec3_3, + _vec3_3 + ); + } + break; + + case 'slider': + var transforma, transformb, rotation; + + transforma = new Ammo.btTransform(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + transforma.setOrigin(_vec3_1); + + var rotation = transforma.getRotation(); + rotation.setEuler( details.axis.x, details.axis.y, details.axis.z ); + transforma.setRotation( rotation ); + + if ( details.objectb ) { + transformb = new Ammo.btTransform(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transformb.setOrigin(_vec3_2); + + rotation = transformb.getRotation(); + rotation.setEuler( details.axis.x, details.axis.y, details.axis.z ); + transformb.setRotation( rotation ); + + constraint = new Ammo.btSliderConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + transforma, + transformb, + true + ); + } else { + constraint = new Ammo.btSliderConstraint( + _objects[ details.objecta ], + transforma, + true + ); + } + + Ammo.destroy(transforma); + if (transformb != undefined) { + Ammo.destroy(transformb); + } + break; + + case 'conetwist': + var transforma, transformb; + + transforma = new Ammo.btTransform(); + transforma.setIdentity(); + + transformb = new Ammo.btTransform(); + transformb.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transforma.setOrigin(_vec3_1); + transformb.setOrigin(_vec3_2); + + var rotation = transforma.getRotation(); + rotation.setEulerZYX( -details.axisa.z, -details.axisa.y, -details.axisa.x ); + transforma.setRotation( rotation ); + + rotation = transformb.getRotation(); + rotation.setEulerZYX( -details.axisb.z, -details.axisb.y, -details.axisb.x ); + transformb.setRotation( rotation ); + + constraint = new Ammo.btConeTwistConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + transforma, + transformb + ); + + constraint.setLimit( Math.PI, 0, Math.PI ); + + Ammo.destroy(transforma); + Ammo.destroy(transformb); + + break; + + case 'dof': + var transforma, transformb, rotation; + + transforma = new Ammo.btTransform(); + transforma.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + transforma.setOrigin(_vec3_1 ); + + rotation = transforma.getRotation(); + rotation.setEulerZYX( -details.axisa.z, -details.axisa.y, -details.axisa.x ); + transforma.setRotation( rotation ); + + if ( details.objectb ) { + transformb = new Ammo.btTransform(); + transformb.setIdentity(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transformb.setOrigin(_vec3_2); + + rotation = transformb.getRotation(); + rotation.setEulerZYX( -details.axisb.z, -details.axisb.y, -details.axisb.x ); + transformb.setRotation( rotation ); + + constraint = new Ammo.btGeneric6DofConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + transforma, + transformb + ); + } else { + constraint = new Ammo.btGeneric6DofConstraint( + _objects[ details.objecta ], + transforma + ); + } + Ammo.destroy(transforma); + if (transformb != undefined) { + Ammo.destroy(transformb); + } + break; + + default: + return; + + }; + + world.addConstraint( constraint ); + + constraint.enableFeedback(); + _constraints[ details.id ] = constraint; + _num_constraints++; + + if ( SUPPORT_TRANSFERABLE ) { + constraintreport = new Float32Array(1 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } else { + constraintreport = [ MESSAGE_TYPES.CONSTRAINTREPORT ]; + } +}; + +public_functions.removeConstraint = function( details ) { + var constraint = _constraints[ details.id ]; + if ( constraint !== undefined ) { + world.removeConstraint( constraint ); + delete _constraints[ details.id ]; + _num_constraints--; + } +}; + +public_functions.constraint_setBreakingImpulseThreshold = function( details ) { + var constraint = _constraints[ details.id ]; + if ( constraint !== undefind ) { + constraint.setBreakingImpulseThreshold( details.threshold ); + } +}; + +public_functions.simulate = function simulate( params ) { + if ( world ) { + params = params || {}; + + if ( !params.timeStep ) { + if ( last_simulation_time ) { + params.timeStep = 0; + while ( params.timeStep + last_simulation_duration <= fixedTimeStep ) { + params.timeStep = ( Date.now() - last_simulation_time ) / 1000; // time since last simulation + } + } else { + params.timeStep = fixedTimeStep; // handle first frame + } + } else { + if ( params.timeStep < fixedTimeStep ) { + params.timeStep = fixedTimeStep; + } + } + + params.maxSubSteps = params.maxSubSteps || Math.ceil( params.timeStep / fixedTimeStep ); // If maxSubSteps is not defined, keep the simulation fully up to date + + last_simulation_duration = Date.now(); + world.stepSimulation( params.timeStep, params.maxSubSteps, fixedTimeStep ); + + reportVehicles(); + reportCollisions(); + reportConstraints(); + reportWorld(); + + last_simulation_duration = ( Date.now() - last_simulation_duration ) / 1000; + last_simulation_time = Date.now(); + } +}; + + +// Constraint functions +public_functions.hinge_setLimits = function( params ) { + _constraints[ params.constraint ].setLimit( params.low, params.high, 0, params.bias_factor, params.relaxation_factor ); +}; +public_functions.hinge_enableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.enableAngularMotor( true, params.velocity, params.acceleration ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.hinge_disableMotor = function( params ) { + _constraints[ params.constraint ].enableMotor( false ); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; + +public_functions.slider_setLimits = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setLowerLinLimit( params.lin_lower || 0 ); + constraint.setUpperLinLimit( params.lin_upper || 0 ); + + constraint.setLowerAngLimit( params.ang_lower || 0 ); + constraint.setUpperAngLimit( params.ang_upper || 0 ); +}; +public_functions.slider_setRestitution = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setSoftnessLimLin( params.linear || 0 ); + constraint.setSoftnessLimAng( params.angular || 0 ); +}; +public_functions.slider_enableLinearMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setTargetLinMotorVelocity( params.velocity ); + constraint.setMaxLinMotorForce( params.acceleration ); + constraint.setPoweredLinMotor( true ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.slider_disableLinearMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setPoweredLinMotor( false ); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.slider_enableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setTargetAngMotorVelocity( params.velocity ); + constraint.setMaxAngMotorForce( params.acceleration ); + constraint.setPoweredAngMotor( true ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.slider_disableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setPoweredAngMotor( false ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; + +public_functions.conetwist_setLimit = function( params ) { + _constraints[ params.constraint ].setLimit( params.z, params.y, params.x ); // ZYX order +}; +public_functions.conetwist_enableMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.enableMotor( true ); + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; +public_functions.conetwist_setMaxMotorImpulse = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setMaxMotorImpulse( params.max_impulse ); + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; +public_functions.conetwist_setMotorTarget = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _quat.setX(params.x); + _quat.setY(params.y); + _quat.setZ(params.z); + _quat.setW(params.w); + + constraint.setMotorTarget(_quat); + + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; +public_functions.conetwist_disableMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.enableMotor( false ); + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; + +public_functions.dof_setLinearLowerLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearLowerLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_setLinearUpperLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearUpperLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_setAngularLowerLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularLowerLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_setAngularUpperLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularUpperLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_enableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + + var motor = constraint.getRotationalLimitMotor( params.which ); + motor.set_m_enableMotor( true ); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_configureAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + + var motor = constraint.getRotationalLimitMotor( params.which ); + + motor.set_m_loLimit( params.low_angle ); + motor.set_m_hiLimit( params.high_angle ); + motor.set_m_targetVelocity( params.velocity ); + motor.set_m_maxMotorForce( params.max_force ); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_disableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + + var motor = constraint.getRotationalLimitMotor( params.which ); + motor.set_m_enableMotor( false ); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; + +reportWorld = function() { + var index, object, + transform, origin, rotation, + offset = 0, + i = 0; + + if ( SUPPORT_TRANSFERABLE ) { + if ( worldreport.length < 2 + _num_objects * WORLDREPORT_ITEMSIZE ) { + worldreport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_objects / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * WORLDREPORT_ITEMSIZE // # of values needed * item size + ); + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + } + } + + worldreport[1] = _num_objects; // record how many objects we're reporting on + + //for ( i = 0; i < worldreport[1]; i++ ) { + for ( index in _objects ) { + if ( _objects.hasOwnProperty( index ) ) { + object = _objects[index]; + + // #TODO: we can't use center of mass transform when center of mass can change, + // but getMotionState().getWorldTransform() screws up on objects that have been moved + //object.getMotionState().getWorldTransform( transform ); + transform = object.getCenterOfMassTransform(); + + origin = transform.getOrigin(); + rotation = transform.getRotation(); + + // add values to report + offset = 2 + (i++) * WORLDREPORT_ITEMSIZE; + + worldreport[ offset ] = object.id; + + worldreport[ offset + 1 ] = origin.x(); + worldreport[ offset + 2 ] = origin.y(); + worldreport[ offset + 3 ] = origin.z(); + + worldreport[ offset + 4 ] = rotation.x(); + worldreport[ offset + 5 ] = rotation.y(); + worldreport[ offset + 6 ] = rotation.z(); + worldreport[ offset + 7 ] = rotation.w(); + + _vector = object.getLinearVelocity(); + worldreport[ offset + 8 ] = _vector.x(); + worldreport[ offset + 9 ] = _vector.y(); + worldreport[ offset + 10 ] = _vector.z(); + + _vector = object.getAngularVelocity(); + worldreport[ offset + 11 ] = _vector.x(); + worldreport[ offset + 12 ] = _vector.y(); + worldreport[ offset + 13 ] = _vector.z(); + } + } + + + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( worldreport.buffer, [worldreport.buffer] ); + } else { + transferableMessage( worldreport ); + } + +}; + +reportCollisions = function() { + var i, offset, + dp = world.getDispatcher(), + num = dp.getNumManifolds(), + manifold, num_contacts, j, pt, + _collided = false; + + if ( SUPPORT_TRANSFERABLE ) { + if ( collisionreport.length < 2 + num * COLLISIONREPORT_ITEMSIZE ) { + collisionreport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_objects / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * COLLISIONREPORT_ITEMSIZE // # of values needed * item size + ); + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + } + } + + collisionreport[1] = 0; // how many collisions we're reporting on + + for ( i = 0; i < num; i++ ) { + manifold = dp.getManifoldByIndexInternal( i ); + + num_contacts = manifold.getNumContacts(); + if ( num_contacts === 0 ) { + continue; + } + + for ( j = 0; j < num_contacts; j++ ) { + pt = manifold.getContactPoint( j ); + //if ( pt.getDistance() < 0 ) { + offset = 2 + (collisionreport[1]++) * COLLISIONREPORT_ITEMSIZE; + collisionreport[ offset ] = _objects_ammo[ manifold.getBody0() ]; + collisionreport[ offset + 1 ] = _objects_ammo[ manifold.getBody1() ]; + + _vector = pt.get_m_normalWorldOnB(); + collisionreport[ offset + 2 ] = _vector.x(); + collisionreport[ offset + 3 ] = _vector.y(); + collisionreport[ offset + 4 ] = _vector.z(); + break; + //} + + transferableMessage( _objects_ammo ); + + } + } + + + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( collisionreport.buffer, [collisionreport.buffer] ); + } else { + transferableMessage( collisionreport ); + } +}; + +reportVehicles = function() { + var index, vehicle, + transform, origin, rotation, + offset = 0, + i = 0, j = 0; + + if ( SUPPORT_TRANSFERABLE ) { + if ( vehiclereport.length < 2 + _num_wheels * VEHICLEREPORT_ITEMSIZE ) { + vehiclereport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_wheels / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * VEHICLEREPORT_ITEMSIZE // # of values needed * item size + ); + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } + } + + for ( index in _vehicles ) { + if ( _vehicles.hasOwnProperty( index ) ) { + vehicle = _vehicles[index]; + + for ( j = 0; j < vehicle.getNumWheels(); j++ ) { + + //vehicle.updateWheelTransform( j, true ); + + //transform = vehicle.getWheelTransformWS( j ); + transform = vehicle.getWheelInfo( j ).get_m_worldTransform(); + + origin = transform.getOrigin(); + rotation = transform.getRotation(); + + // add values to report + offset = 1 + (i++) * VEHICLEREPORT_ITEMSIZE; + + vehiclereport[ offset ] = index; + vehiclereport[ offset + 1 ] = j; + + vehiclereport[ offset + 2 ] = origin.x(); + vehiclereport[ offset + 3 ] = origin.y(); + vehiclereport[ offset + 4 ] = origin.z(); + + vehiclereport[ offset + 5 ] = rotation.x(); + vehiclereport[ offset + 6 ] = rotation.y(); + vehiclereport[ offset + 7 ] = rotation.z(); + vehiclereport[ offset + 8 ] = rotation.w(); + + } + + } + } + + if ( j !== 0 ) { + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( vehiclereport.buffer, [vehiclereport.buffer] ); + } else { + transferableMessage( vehiclereport ); + } + } +}; + +reportConstraints = function() { + var index, constraint, + offset_body, + transform, origin, + offset = 0, + i = 0; + + if ( SUPPORT_TRANSFERABLE ) { + if ( constraintreport.length < 2 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE ) { + constraintreport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_constraints / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * CONSTRAINTREPORT_ITEMSIZE // # of values needed * item size + ); + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } + } + + for ( index in _constraints ) { + if ( _constraints.hasOwnProperty( index ) ) { + constraint = _constraints[index]; + offset_body = constraint.getRigidBodyA(); + transform = constraint.getFrameOffsetA(); + origin = transform.getOrigin(); + + // add values to report + offset = 1 + (i++) * CONSTRAINTREPORT_ITEMSIZE; + + constraintreport[ offset ] = index; + constraintreport[ offset + 1 ] = offset_body.id; + constraintreport[ offset + 2 ] = origin.getX(); + constraintreport[ offset + 3 ] = origin.getY(); + constraintreport[ offset + 4 ] = origin.getZ(); + constraintreport[ offset + 5 ] = constraint.getAppliedImpulse(); + } + } + + + if ( i !== 0 ) { + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( constraintreport.buffer, [constraintreport.buffer] ); + } else { + transferableMessage( constraintreport ); + } + } + +}; + +self.onmessage = function( event ) { + + if ( event.data instanceof Float32Array ) { + // transferable object + + switch ( event.data[0] ) { + case MESSAGE_TYPES.WORLDREPORT: + worldreport = new Float32Array( event.data ); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + collisionreport = new Float32Array( event.data ); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + vehiclereport = new Float32Array( event.data ); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + constraintreport = new Float32Array( event.data ); + break; + } + + return; + } + + if ( event.data.cmd && public_functions[event.data.cmd] ) { + //if ( event.data.params.id !== undefined && _objects[event.data.params.id] === undefined && event.data.cmd !== 'addObject' && event.data.cmd !== 'registerMaterial' ) return; + public_functions[event.data.cmd]( event.data.params ); + } + +}; diff --git a/lib/polyfills.js b/lib/polyfills.js new file mode 100644 index 0000000..7b618fa --- /dev/null +++ b/lib/polyfills.js @@ -0,0 +1,98 @@ +// Polyfills + +if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + +} + +if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + +} + +// + +if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + +} + +if ( 'name' in Function.prototype === false ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + +} + +if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + +} diff --git a/lib/renderers/WebGL2Renderer.js b/lib/renderers/WebGL2Renderer.js new file mode 100644 index 0000000..d0ad1c3 --- /dev/null +++ b/lib/renderers/WebGL2Renderer.js @@ -0,0 +1,189 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { REVISION } from '../constants.js'; +import { WebGLExtensions } from './webgl/WebGLExtensions.js'; +import { WebGLState } from './webgl/WebGLState.js'; +import { Color } from '../math/Color.js'; +import { Vector4 } from '../math/Vector4.js'; + +function WebGL2Renderer( parameters ) { + + console.log( 'THREE.WebGL2Renderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + // initialize + + var gl; + + try { + + var attributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', function () { } ); + + gl = _context || _canvas.getContext( 'webgl2', attributes ); + + if ( gl === null ) { + + if ( _canvas.getContext( 'webgl2' ) !== null ) { + + throw new Error( 'Error creating WebGL2 context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL2 context.' ); + + } + + } + + } catch ( error ) { + + console.error( 'THREE.WebGL2Renderer: ' + error.message ); + + } + + // + + var _autoClear = true, + _autoClearColor = true, + _autoClearDepth = true, + _autoClearStencil = true, + + _clearColor = new Color( 0x000000 ), + _clearAlpha = 0, + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ); + + var extensions = new WebGLExtensions( gl ); + var state = new WebGLState( gl, extensions, function () {} ); + + // + + function clear( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= gl.STENCIL_BUFFER_BIT; + + gl.clear( bits ); + + } + + function setPixelRatio( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + setSize( _viewport.z, _viewport.w, false ); + + } + + function setSize( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + setViewport( 0, 0, width, height ); + + } + + function setViewport( x, y, width, height ) { + + state.viewport( _viewport.set( x, y, width, height ) ); + + } + + function render( scene, camera ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGL2Renderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + var background = scene.background; + var forceClear = false; + + if ( background === null ) { + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } else if ( background && background.isColor ) { + + state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha ); + forceClear = true; + + } + + if ( _autoClear || forceClear ) { + + this.clear( _autoClearColor, _autoClearDepth, _autoClearStencil ); + + } + + } + + function onContextLost( event ) { + + event.preventDefault(); + + } + + return { + domElement: _canvas, + + clear: clear, + setPixelRatio: setPixelRatio, + setSize: setSize, + render: render + }; + +} + + +export { WebGL2Renderer }; diff --git a/lib/renderers/WebGLRenderTarget.js b/lib/renderers/WebGLRenderTarget.js new file mode 100644 index 0000000..f5313b3 --- /dev/null +++ b/lib/renderers/WebGLRenderTarget.js @@ -0,0 +1,95 @@ +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { Texture } from '../textures/Texture.js'; +import { LinearFilter } from '../constants.js'; +import { Vector4 } from '../math/Vector4.js'; + +/** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + +/* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers +*/ +function WebGLRenderTarget( width, height, options ) { + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : true; + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + +} + +WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { WebGLRenderTarget }; diff --git a/lib/renderers/WebGLRenderTargetCube.js b/lib/renderers/WebGLRenderTargetCube.js new file mode 100644 index 0000000..6662016 --- /dev/null +++ b/lib/renderers/WebGLRenderTargetCube.js @@ -0,0 +1,22 @@ +import { WebGLRenderTarget } from './WebGLRenderTarget.js'; + +/** + * @author alteredq / http://alteredqualia.com + */ + +function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + +} + +WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); +WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + +WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + +export { WebGLRenderTargetCube }; diff --git a/lib/renderers/WebGLRenderer.js b/lib/renderers/WebGLRenderer.js new file mode 100644 index 0000000..7b760cf --- /dev/null +++ b/lib/renderers/WebGLRenderer.js @@ -0,0 +1,2642 @@ +import { + REVISION, + RGBAFormat, + HalfFloatType, + FloatType, + UnsignedByteType, + TriangleFanDrawMode, + TriangleStripDrawMode, + TrianglesDrawMode, + LinearToneMapping, + BackSide +} from '../constants.js'; +import { _Math } from '../math/Math.js'; +import { DataTexture } from '../textures/DataTexture.js'; +import { Frustum } from '../math/Frustum.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { ShaderLib } from './shaders/ShaderLib.js'; +import { UniformsLib } from './shaders/UniformsLib.js'; +import { UniformsUtils } from './shaders/UniformsUtils.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector4 } from '../math/Vector4.js'; +import { WebGLAnimation } from './webgl/WebGLAnimation.js'; +import { WebGLAttributes } from './webgl/WebGLAttributes.js'; +import { WebGLBackground } from './webgl/WebGLBackground.js'; +import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer.js'; +import { WebGLCapabilities } from './webgl/WebGLCapabilities.js'; +import { WebGLClipping } from './webgl/WebGLClipping.js'; +import { WebGLExtensions } from './webgl/WebGLExtensions.js'; +import { WebGLGeometries } from './webgl/WebGLGeometries.js'; +import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js'; +import { WebGLInfo } from './webgl/WebGLInfo.js'; +import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js'; +import { WebGLObjects } from './webgl/WebGLObjects.js'; +import { WebGLPrograms } from './webgl/WebGLPrograms.js'; +import { WebGLProperties } from './webgl/WebGLProperties.js'; +import { WebGLRenderLists } from './webgl/WebGLRenderLists.js'; +import { WebGLRenderStates } from './webgl/WebGLRenderStates.js'; +import { WebGLShadowMap } from './webgl/WebGLShadowMap.js'; +import { WebGLState } from './webgl/WebGLState.js'; +import { WebGLTextures } from './webgl/WebGLTextures.js'; +import { WebGLUniforms } from './webgl/WebGLUniforms.js'; +import { WebGLUtils } from './webgl/WebGLUtils.js'; +import { WebVRManager } from './webvr/WebVRManager.js'; +import { WebXRManager } from './webvr/WebXRManager.js'; + +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + +function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + var currentRenderList = null; + var currentRenderState = null; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + _isContextLost = false, + + // internal state cache + + _framebuffer = null, + + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + + // geometry and program caching + + _currentGeometryProgram = { + geometry: null, + program: null, + wireframe: false + }, + + _currentCamera = null, + _currentArrayCamera = null, + + _currentViewport = new Vector4(), + _currentScissor = new Vector4(), + _currentScissorTest = null, + + // + + _usedTextureUnits = 0, + + // + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ), + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(); + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + + } + + var extensions, capabilities, state, info; + var properties, textures, attributes, geometries, objects; + var programCache, renderLists, renderStates; + + var background, morphtargets, bufferRenderer, indexedBufferRenderer; + + var utils; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + if ( ! capabilities.isWebGL2 ) { + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'OES_element_index_uint' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + } + + extensions.get( 'OES_texture_float_linear' ); + + utils = new WebGLUtils( _gl, extensions, capabilities ); + + state = new WebGLState( _gl, extensions, utils, capabilities ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + attributes = new WebGLAttributes( _gl ); + geometries = new WebGLGeometries( _gl, attributes, info ); + objects = new WebGLObjects( geometries, info ); + morphtargets = new WebGLMorphtargets( _gl ); + programCache = new WebGLPrograms( _this, extensions, capabilities ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(); + + background = new WebGLBackground( _this, state, objects, _premultipliedAlpha ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities ); + + info.programs = programCache.programs; + + _this.context = _gl; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // vr + + var vr = null; + + if ( typeof navigator !== 'undefined' ) { + + vr = ( 'xr' in navigator ) ? new WebXRManager( _this ) : new WebVRManager( _this ); + + } + + this.vr = vr; + + // shadow map + + var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize ); + + this.shadowMap = shadowMap; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + if ( vr.isPresenting() ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function () { + + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + }; + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function () { + + return _currentViewport; + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewport.set( x, _height - y - height, width, height ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + _scissor.set( x, _height - y - height, width, height ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return background.getClearColor(); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + objects.dispose(); + + vr.dispose(); + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + initGLContext(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.normal ); + _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.uv ); + _gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.color ); + _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + var frontFaceCW = ( object.isMesh && object.normalMatrix.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, fog, material, object ); + + var updateBuffers = false; + + if ( _currentGeometryProgram.geometry !== geometry.id || + _currentGeometryProgram.program !== program.id || + _currentGeometryProgram.wireframe !== ( material.wireframe === true ) ) { + + _currentGeometryProgram.geometry = geometry.id; + _currentGeometryProgram.program = program.id; + _currentGeometryProgram.wireframe = material.wireframe === true; + updateBuffers = true; + + } + + if ( object.morphTargetInfluences ) { + + morphtargets.update( object, geometry, material, program ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var attribute; + var renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer ); + + } + + } + + // + + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } else if ( object.isSprite ) { + + renderer.setMode( _gl.TRIANGLES ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry ) { + + if ( geometry && geometry.isInstancedBufferGeometry & ! capabilities.isWebGL2 ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + var buffer = attribute.buffer; + var type = attribute.type; + var bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights( camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( vr.isPresenting() ) return; + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof window !== 'undefined' ) animation.setContext( window ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + vr.setAnimationLoop( callback ); + + animation.start(); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( ! ( camera && camera.isCamera ) ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost ) return; + + // reset caching for this frame + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( vr.enabled ) { + + camera = vr.getCamera( camera ); + + } + + // + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.onBeforeRender( _this, scene, camera, renderTarget ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + var shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + currentRenderState.setupLights( camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + if ( this.info.autoReset ) this.info.reset(); + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + background.render( currentRenderList, scene, camera, forceClear ); + + // render scene + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + scene.onAfterRender( _this, scene, camera ); + + if ( vr.enabled ) { + + vr.submitFrame(); + + } + + // _gl.finish(); + + currentRenderList = null; + currentRenderState = null; + + }; + + function projectObject( object, camera, sortObjects ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + if ( camera.isArrayCamera ) { + + _currentArrayCamera = camera; + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + if ( 'viewport' in camera2 ) { // XR + + state.viewport( _currentViewport.copy( camera2.viewport ) ); + + } else { + + var bounds = camera2.bounds; + + var x = bounds.x * _width; + var y = bounds.y * _height; + var width = bounds.z * _width; + var height = bounds.w * _height; + + state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) ); + + } + + currentRenderState.setupLights( camera2 ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + _currentArrayCamera = null; + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + + renderObjectImmediate( object, program ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var lights = currentRenderState.state.lights; + var shadowsArray = currentRenderState.state.shadowsArray; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + var parameters = programCache.getParameters( + material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) { + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + programChange = false; + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.onBeforeCompile( materialProperties.shader, _this ); + + // Computing code again as onBeforeCompile may have changed the shaders + code = programCache.getProgramCode( material, parameters ); + + program = programCache.acquireProgram( material, materialProperties.shader, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.shader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + if ( lightsHash === undefined ) { + + materialProperties.lightsHash = lightsHash = {}; + + } + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.directionalLights.value = lights.state.directional; + uniforms.spotLights.value = lights.state.spot; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.pointLights.value = lights.state.point; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + var lights = currentRenderState.state.lights; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else { + + refreshUniformsPhong( m_uniforms, material ); + + } + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else { + + refreshUniformsStandard( m_uniforms, material ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + refreshUniformsMatcap( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDepth( m_uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDistance( m_uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsNormal( m_uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( m_uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( m_uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + m_uniforms.color.value = material.color; + m_uniforms.opacity.value = material.opacity; + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1; + if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2; + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value = material.color; + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + if ( material.envMap ) { + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + refreshUniformsStandard( uniforms, material ); + + uniforms.reflectivity.value = material.reflectivity; // also part of uniforms common + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture3D = ( function () { + + // backwards compatibility: peel texture.texture + return function setTexture3D( texture, slot ) { + + textures.setTexture3D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + // + + this.setFramebuffer = function ( value ) { + + _framebuffer = value; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var framebuffer = _framebuffer; + var isCube = false; + + if ( renderTarget ) { + + var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLRenderTargetCube ) { + + framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ]; + isCube = true; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level ) { + + var width = texture.image.width; + var height = texture.image.height; + var glFormat = utils.convert( texture.format ); + + this.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 ); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) { + + var width = srcTexture.image.width; + var height = srcTexture.image.height; + var glFormat = utils.convert( dstTexture.format ); + var glType = utils.convert( dstTexture.type ); + + this.setTexture2D( dstTexture, 0 ); + + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data ); + + } else { + + _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, glFormat, glType, srcTexture.image ); + + } + + }; + +} + + +export { WebGLRenderer }; diff --git a/lib/renderers/shaders/ShaderChunk.js b/lib/renderers/shaders/ShaderChunk.js new file mode 100644 index 0000000..725f7a8 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk.js @@ -0,0 +1,243 @@ +import alphamap_fragment from './ShaderChunk/alphamap_fragment.glsl'; +import alphamap_pars_fragment from './ShaderChunk/alphamap_pars_fragment.glsl'; +import alphatest_fragment from './ShaderChunk/alphatest_fragment.glsl'; +import aomap_fragment from './ShaderChunk/aomap_fragment.glsl'; +import aomap_pars_fragment from './ShaderChunk/aomap_pars_fragment.glsl'; +import begin_vertex from './ShaderChunk/begin_vertex.glsl'; +import beginnormal_vertex from './ShaderChunk/beginnormal_vertex.glsl'; +import bsdfs from './ShaderChunk/bsdfs.glsl'; +import bumpmap_pars_fragment from './ShaderChunk/bumpmap_pars_fragment.glsl'; +import clipping_planes_fragment from './ShaderChunk/clipping_planes_fragment.glsl'; +import clipping_planes_pars_fragment from './ShaderChunk/clipping_planes_pars_fragment.glsl'; +import clipping_planes_pars_vertex from './ShaderChunk/clipping_planes_pars_vertex.glsl'; +import clipping_planes_vertex from './ShaderChunk/clipping_planes_vertex.glsl'; +import color_fragment from './ShaderChunk/color_fragment.glsl'; +import color_pars_fragment from './ShaderChunk/color_pars_fragment.glsl'; +import color_pars_vertex from './ShaderChunk/color_pars_vertex.glsl'; +import color_vertex from './ShaderChunk/color_vertex.glsl'; +import common from './ShaderChunk/common.glsl'; +import cube_uv_reflection_fragment from './ShaderChunk/cube_uv_reflection_fragment.glsl'; +import defaultnormal_vertex from './ShaderChunk/defaultnormal_vertex.glsl'; +import displacementmap_pars_vertex from './ShaderChunk/displacementmap_pars_vertex.glsl'; +import displacementmap_vertex from './ShaderChunk/displacementmap_vertex.glsl'; +import emissivemap_fragment from './ShaderChunk/emissivemap_fragment.glsl'; +import emissivemap_pars_fragment from './ShaderChunk/emissivemap_pars_fragment.glsl'; +import encodings_fragment from './ShaderChunk/encodings_fragment.glsl'; +import encodings_pars_fragment from './ShaderChunk/encodings_pars_fragment.glsl'; +import envmap_fragment from './ShaderChunk/envmap_fragment.glsl'; +import envmap_pars_fragment from './ShaderChunk/envmap_pars_fragment.glsl'; +import envmap_pars_vertex from './ShaderChunk/envmap_pars_vertex.glsl'; +import envmap_vertex from './ShaderChunk/envmap_vertex.glsl'; +import fog_vertex from './ShaderChunk/fog_vertex.glsl'; +import fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl'; +import fog_fragment from './ShaderChunk/fog_fragment.glsl'; +import fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl'; +import gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl'; +import lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl'; +import lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl'; +import lights_lambert_vertex from './ShaderChunk/lights_lambert_vertex.glsl'; +import lights_pars_begin from './ShaderChunk/lights_pars_begin.glsl'; +import envmap_physical_pars_fragment from './ShaderChunk/envmap_physical_pars_fragment.glsl'; +import lights_phong_fragment from './ShaderChunk/lights_phong_fragment.glsl'; +import lights_phong_pars_fragment from './ShaderChunk/lights_phong_pars_fragment.glsl'; +import lights_physical_fragment from './ShaderChunk/lights_physical_fragment.glsl'; +import lights_physical_pars_fragment from './ShaderChunk/lights_physical_pars_fragment.glsl'; +import lights_fragment_begin from './ShaderChunk/lights_fragment_begin.glsl'; +import lights_fragment_maps from './ShaderChunk/lights_fragment_maps.glsl'; +import lights_fragment_end from './ShaderChunk/lights_fragment_end.glsl'; +import logdepthbuf_fragment from './ShaderChunk/logdepthbuf_fragment.glsl'; +import logdepthbuf_pars_fragment from './ShaderChunk/logdepthbuf_pars_fragment.glsl'; +import logdepthbuf_pars_vertex from './ShaderChunk/logdepthbuf_pars_vertex.glsl'; +import logdepthbuf_vertex from './ShaderChunk/logdepthbuf_vertex.glsl'; +import map_fragment from './ShaderChunk/map_fragment.glsl'; +import map_pars_fragment from './ShaderChunk/map_pars_fragment.glsl'; +import map_particle_fragment from './ShaderChunk/map_particle_fragment.glsl'; +import map_particle_pars_fragment from './ShaderChunk/map_particle_pars_fragment.glsl'; +import metalnessmap_fragment from './ShaderChunk/metalnessmap_fragment.glsl'; +import metalnessmap_pars_fragment from './ShaderChunk/metalnessmap_pars_fragment.glsl'; +import morphnormal_vertex from './ShaderChunk/morphnormal_vertex.glsl'; +import morphtarget_pars_vertex from './ShaderChunk/morphtarget_pars_vertex.glsl'; +import morphtarget_vertex from './ShaderChunk/morphtarget_vertex.glsl'; +import normal_fragment_begin from './ShaderChunk/normal_fragment_begin.glsl'; +import normal_fragment_maps from './ShaderChunk/normal_fragment_maps.glsl'; +import normalmap_pars_fragment from './ShaderChunk/normalmap_pars_fragment.glsl'; +import packing from './ShaderChunk/packing.glsl'; +import premultiplied_alpha_fragment from './ShaderChunk/premultiplied_alpha_fragment.glsl'; +import project_vertex from './ShaderChunk/project_vertex.glsl'; +import dithering_fragment from './ShaderChunk/dithering_fragment.glsl'; +import dithering_pars_fragment from './ShaderChunk/dithering_pars_fragment.glsl'; +import roughnessmap_fragment from './ShaderChunk/roughnessmap_fragment.glsl'; +import roughnessmap_pars_fragment from './ShaderChunk/roughnessmap_pars_fragment.glsl'; +import shadowmap_pars_fragment from './ShaderChunk/shadowmap_pars_fragment.glsl'; +import shadowmap_pars_vertex from './ShaderChunk/shadowmap_pars_vertex.glsl'; +import shadowmap_vertex from './ShaderChunk/shadowmap_vertex.glsl'; +import shadowmask_pars_fragment from './ShaderChunk/shadowmask_pars_fragment.glsl'; +import skinbase_vertex from './ShaderChunk/skinbase_vertex.glsl'; +import skinning_pars_vertex from './ShaderChunk/skinning_pars_vertex.glsl'; +import skinning_vertex from './ShaderChunk/skinning_vertex.glsl'; +import skinnormal_vertex from './ShaderChunk/skinnormal_vertex.glsl'; +import specularmap_fragment from './ShaderChunk/specularmap_fragment.glsl'; +import specularmap_pars_fragment from './ShaderChunk/specularmap_pars_fragment.glsl'; +import tonemapping_fragment from './ShaderChunk/tonemapping_fragment.glsl'; +import tonemapping_pars_fragment from './ShaderChunk/tonemapping_pars_fragment.glsl'; +import uv_pars_fragment from './ShaderChunk/uv_pars_fragment.glsl'; +import uv_pars_vertex from './ShaderChunk/uv_pars_vertex.glsl'; +import uv_vertex from './ShaderChunk/uv_vertex.glsl'; +import uv2_pars_fragment from './ShaderChunk/uv2_pars_fragment.glsl'; +import uv2_pars_vertex from './ShaderChunk/uv2_pars_vertex.glsl'; +import uv2_vertex from './ShaderChunk/uv2_vertex.glsl'; +import worldpos_vertex from './ShaderChunk/worldpos_vertex.glsl'; + +import background_frag from './ShaderLib/background_frag.glsl'; +import background_vert from './ShaderLib/background_vert.glsl'; +import cube_frag from './ShaderLib/cube_frag.glsl'; +import cube_vert from './ShaderLib/cube_vert.glsl'; +import depth_frag from './ShaderLib/depth_frag.glsl'; +import depth_vert from './ShaderLib/depth_vert.glsl'; +import distanceRGBA_frag from './ShaderLib/distanceRGBA_frag.glsl'; +import distanceRGBA_vert from './ShaderLib/distanceRGBA_vert.glsl'; +import equirect_frag from './ShaderLib/equirect_frag.glsl'; +import equirect_vert from './ShaderLib/equirect_vert.glsl'; +import linedashed_frag from './ShaderLib/linedashed_frag.glsl'; +import linedashed_vert from './ShaderLib/linedashed_vert.glsl'; +import meshbasic_frag from './ShaderLib/meshbasic_frag.glsl'; +import meshbasic_vert from './ShaderLib/meshbasic_vert.glsl'; +import meshlambert_frag from './ShaderLib/meshlambert_frag.glsl'; +import meshlambert_vert from './ShaderLib/meshlambert_vert.glsl'; +import meshmatcap_frag from './ShaderLib/meshmatcap_frag.glsl'; +import meshmatcap_vert from './ShaderLib/meshmatcap_vert.glsl'; +import meshphong_frag from './ShaderLib/meshphong_frag.glsl'; +import meshphong_vert from './ShaderLib/meshphong_vert.glsl'; +import meshphysical_frag from './ShaderLib/meshphysical_frag.glsl'; +import meshphysical_vert from './ShaderLib/meshphysical_vert.glsl'; +import normal_frag from './ShaderLib/normal_frag.glsl'; +import normal_vert from './ShaderLib/normal_vert.glsl'; +import points_frag from './ShaderLib/points_frag.glsl'; +import points_vert from './ShaderLib/points_vert.glsl'; +import shadow_frag from './ShaderLib/shadow_frag.glsl'; +import shadow_vert from './ShaderLib/shadow_vert.glsl'; +import sprite_frag from './ShaderLib/sprite_frag.glsl'; +import sprite_vert from './ShaderLib/sprite_vert.glsl'; + +export var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + background_frag: background_frag, + background_vert: background_vert, + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshmatcap_frag: meshmatcap_frag, + meshmatcap_vert: meshmatcap_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert, + sprite_frag: sprite_frag, + sprite_vert: sprite_vert +}; diff --git a/lib/renderers/shaders/ShaderChunk/alphamap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/alphamap_fragment.glsl new file mode 100644 index 0000000..1aa712e --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/alphamap_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_ALPHAMAP + + diffuseColor.a *= texture2D( alphaMap, vUv ).g; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl new file mode 100644 index 0000000..4a84b49 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_ALPHAMAP + + uniform sampler2D alphaMap; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/alphatest_fragment.glsl b/lib/renderers/shaders/ShaderChunk/alphatest_fragment.glsl new file mode 100644 index 0000000..448b2bf --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/alphatest_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef ALPHATEST + + if ( diffuseColor.a < ALPHATEST ) discard; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/aomap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/aomap_fragment.glsl new file mode 100644 index 0000000..4b5df8e --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/aomap_fragment.glsl @@ -0,0 +1,16 @@ +#ifdef USE_AOMAP + + // reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture + float ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0; + + reflectedLight.indirectDiffuse *= ambientOcclusion; + + #if defined( USE_ENVMAP ) && defined( PHYSICAL ) + + float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + + reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness ); + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl new file mode 100644 index 0000000..73277ab --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef USE_AOMAP + + uniform sampler2D aoMap; + uniform float aoMapIntensity; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/begin_vertex.glsl b/lib/renderers/shaders/ShaderChunk/begin_vertex.glsl new file mode 100644 index 0000000..9f681c6 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/begin_vertex.glsl @@ -0,0 +1,2 @@ + +vec3 transformed = vec3( position ); diff --git a/lib/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl new file mode 100644 index 0000000..f24d6d4 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl @@ -0,0 +1,2 @@ + +vec3 objectNormal = vec3( normal ); diff --git a/lib/renderers/shaders/ShaderChunk/bsdfs.glsl b/lib/renderers/shaders/ShaderChunk/bsdfs.glsl new file mode 100644 index 0000000..7137ada --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/bsdfs.glsl @@ -0,0 +1,295 @@ +float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) { + +#if defined ( PHYSICALLY_CORRECT_LIGHTS ) + + // based upon Frostbite 3 Moving to Physically-based Rendering + // page 32, equation 26: E[window1] + // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + // this is intended to be used on spot and point lights who are represented as luminous intensity + // but who must be converted to luminous irradiance for surface lighting calculation + float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 ); + + if( cutoffDistance > 0.0 ) { + + distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) ); + + } + + return distanceFalloff; + +#else + + if( cutoffDistance > 0.0 && decayExponent > 0.0 ) { + + return pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent ); + + } + + return 1.0; + +#endif + +} + +vec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) { + + return RECIPROCAL_PI * diffuseColor; + +} // validated + +vec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) { + + // Original approximation by Christophe Schlick '94 + // float fresnel = pow( 1.0 - dotLH, 5.0 ); + + // Optimized variant (presented by Epic at SIGGRAPH '13) + // https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf + float fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH ); + + return ( 1.0 - specularColor ) * fresnel + specularColor; + +} // validated + +// Microfacet Models for Refraction through Rough Surfaces - equation (34) +// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html +// alpha is "roughness squared" in Disney’s reparameterization +float G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) { + + // geometry term (normalized) = G(l)⋅G(v) / 4(n⋅l)(n⋅v) + // also see #12151 + + float a2 = pow2( alpha ); + + float gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); + float gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); + + return 1.0 / ( gl * gv ); + +} // validated + +// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2 +// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf +float G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) { + + float a2 = pow2( alpha ); + + // dotNL and dotNV are explicitly swapped. This is not a mistake. + float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); + float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); + + return 0.5 / max( gv + gl, EPSILON ); + +} + +// Microfacet Models for Refraction through Rough Surfaces - equation (33) +// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html +// alpha is "roughness squared" in Disney’s reparameterization +float D_GGX( const in float alpha, const in float dotNH ) { + + float a2 = pow2( alpha ); + + float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1 + + return RECIPROCAL_PI * a2 / pow2( denom ); + +} + +// GGX Distribution, Schlick Fresnel, GGX-Smith Visibility +vec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) { + + float alpha = pow2( roughness ); // UE4's roughness + + vec3 halfDir = normalize( incidentLight.direction + geometry.viewDir ); + + float dotNL = saturate( dot( geometry.normal, incidentLight.direction ) ); + float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + float dotNH = saturate( dot( geometry.normal, halfDir ) ); + float dotLH = saturate( dot( incidentLight.direction, halfDir ) ); + + vec3 F = F_Schlick( specularColor, dotLH ); + + float G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV ); + + float D = D_GGX( alpha, dotNH ); + + return F * ( G * D ); + +} // validated + +// Rect Area Light + +// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines +// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt +// code: https://github.com/selfshadow/ltc_code/ + +vec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) { + + const float LUT_SIZE = 64.0; + const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE; + const float LUT_BIAS = 0.5 / LUT_SIZE; + + float dotNV = saturate( dot( N, V ) ); + + // texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) ) + vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) ); + + uv = uv * LUT_SCALE + LUT_BIAS; + + return uv; + +} + +float LTC_ClippedSphereFormFactor( const in vec3 f ) { + + // Real-Time Area Lighting: a Journey from Research to Production (p.102) + // An approximation of the form factor of a horizon-clipped rectangle. + + float l = length( f ); + + return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 ); + +} + +vec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) { + + float x = dot( v1, v2 ); + + float y = abs( x ); + + // rational polynomial approximation to theta / sin( theta ) / 2PI + float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y; + float b = 3.4175940 + ( 4.1616724 + y ) * y; + float v = a / b; + + float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v; + + return cross( v1, v2 ) * theta_sintheta; + +} + +vec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) { + + // bail if point is on back side of plane of light + // assumes ccw winding order of light vertices + vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ]; + vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ]; + vec3 lightNormal = cross( v1, v2 ); + + if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 ); + + // construct orthonormal basis around N + vec3 T1, T2; + T1 = normalize( V - N * dot( V, N ) ); + T2 = - cross( N, T1 ); // negated from paper; possibly due to a different handedness of world coordinate system + + // compute transform + mat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) ); + + // transform rect + vec3 coords[ 4 ]; + coords[ 0 ] = mat * ( rectCoords[ 0 ] - P ); + coords[ 1 ] = mat * ( rectCoords[ 1 ] - P ); + coords[ 2 ] = mat * ( rectCoords[ 2 ] - P ); + coords[ 3 ] = mat * ( rectCoords[ 3 ] - P ); + + // project rect onto sphere + coords[ 0 ] = normalize( coords[ 0 ] ); + coords[ 1 ] = normalize( coords[ 1 ] ); + coords[ 2 ] = normalize( coords[ 2 ] ); + coords[ 3 ] = normalize( coords[ 3 ] ); + + // calculate vector form factor + vec3 vectorFormFactor = vec3( 0.0 ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] ); + + // adjust for horizon clipping + float result = LTC_ClippedSphereFormFactor( vectorFormFactor ); + +/* + // alternate method of adjusting for horizon clipping (see referece) + // refactoring required + float len = length( vectorFormFactor ); + float z = vectorFormFactor.z / len; + + const float LUT_SIZE = 64.0; + const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE; + const float LUT_BIAS = 0.5 / LUT_SIZE; + + // tabulated horizon-clipped sphere, apparently... + vec2 uv = vec2( z * 0.5 + 0.5, len ); + uv = uv * LUT_SCALE + LUT_BIAS; + + float scale = texture2D( ltc_2, uv ).w; + + float result = len * scale; +*/ + + return vec3( result ); + +} + +// End Rect Area Light + +// ref: https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile +vec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) { + + float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + + const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 ); + + const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 ); + + vec4 r = roughness * c0 + c1; + + float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y; + + vec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw; + + return specularColor * AB.x + AB.y; + +} // validated + + +float G_BlinnPhong_Implicit( /* const in float dotNL, const in float dotNV */ ) { + + // geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v) + return 0.25; + +} + +float D_BlinnPhong( const in float shininess, const in float dotNH ) { + + return RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess ); + +} + +vec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) { + + vec3 halfDir = normalize( incidentLight.direction + geometry.viewDir ); + + //float dotNL = saturate( dot( geometry.normal, incidentLight.direction ) ); + //float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + float dotNH = saturate( dot( geometry.normal, halfDir ) ); + float dotLH = saturate( dot( incidentLight.direction, halfDir ) ); + + vec3 F = F_Schlick( specularColor, dotLH ); + + float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ ); + + float D = D_BlinnPhong( shininess, dotNH ); + + return F * ( G * D ); + +} // validated + +// source: http://simonstechblog.blogspot.ca/2011/12/microfacet-brdf.html +float GGXRoughnessToBlinnExponent( const in float ggxRoughness ) { + return ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 ); +} + +float BlinnExponentToGGXRoughness( const in float blinnExponent ) { + return sqrt( 2.0 / ( blinnExponent + 2.0 ) ); +} diff --git a/lib/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl new file mode 100644 index 0000000..5de9a65 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl @@ -0,0 +1,44 @@ +#ifdef USE_BUMPMAP + + uniform sampler2D bumpMap; + uniform float bumpScale; + + // Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen + // http://api.unrealengine.com/attachments/Engine/Rendering/LightingAndShadows/BumpMappingWithoutTangentSpace/mm_sfgrad_bump.pdf + + // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2) + + vec2 dHdxy_fwd() { + + vec2 dSTdx = dFdx( vUv ); + vec2 dSTdy = dFdy( vUv ); + + float Hll = bumpScale * texture2D( bumpMap, vUv ).x; + float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll; + float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll; + + return vec2( dBx, dBy ); + + } + + vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) { + + // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988 + + vec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) ); + vec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) ); + vec3 vN = surf_norm; // normalized + + vec3 R1 = cross( vSigmaY, vN ); + vec3 R2 = cross( vN, vSigmaX ); + + float fDet = dot( vSigmaX, R1 ); + + fDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 ); + + vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 ); + return normalize( abs( fDet ) * surf_norm - vGrad ); + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl new file mode 100644 index 0000000..bea6ffa --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl @@ -0,0 +1,29 @@ +#if NUM_CLIPPING_PLANES > 0 + + vec4 plane; + + #pragma unroll_loop + for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { + + plane = clippingPlanes[ i ]; + if ( dot( vViewPosition, plane.xyz ) > plane.w ) discard; + + } + + #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES + + bool clipped = true; + + #pragma unroll_loop + for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { + + plane = clippingPlanes[ i ]; + clipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped; + + } + + if ( clipped ) discard; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl new file mode 100644 index 0000000..0a58ad8 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl @@ -0,0 +1,9 @@ +#if NUM_CLIPPING_PLANES > 0 + + #if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP ) + varying vec3 vViewPosition; + #endif + + uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl new file mode 100644 index 0000000..0a3f269 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl @@ -0,0 +1,3 @@ +#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP ) + varying vec3 vViewPosition; +#endif diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl new file mode 100644 index 0000000..f288a3d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl @@ -0,0 +1,4 @@ +#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP ) + vViewPosition = - mvPosition.xyz; +#endif + diff --git a/lib/renderers/shaders/ShaderChunk/color_fragment.glsl b/lib/renderers/shaders/ShaderChunk/color_fragment.glsl new file mode 100644 index 0000000..693fdf0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + diffuseColor.rgb *= vColor; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/color_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/color_pars_fragment.glsl new file mode 100644 index 0000000..4f59898 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + varying vec3 vColor; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/color_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/color_pars_vertex.glsl new file mode 100644 index 0000000..f3862c3 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_pars_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + varying vec3 vColor; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/color_vertex.glsl b/lib/renderers/shaders/ShaderChunk/color_vertex.glsl new file mode 100644 index 0000000..7bd534d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + vColor.xyz = color.xyz; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/common.glsl b/lib/renderers/shaders/ShaderChunk/common.glsl new file mode 100644 index 0000000..2ed7888 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/common.glsl @@ -0,0 +1,95 @@ +#define PI 3.14159265359 +#define PI2 6.28318530718 +#define PI_HALF 1.5707963267949 +#define RECIPROCAL_PI 0.31830988618 +#define RECIPROCAL_PI2 0.15915494 +#define LOG2 1.442695 +#define EPSILON 1e-6 + +#define saturate(a) clamp( a, 0.0, 1.0 ) +#define whiteCompliment(a) ( 1.0 - saturate( a ) ) + +float pow2( const in float x ) { return x*x; } +float pow3( const in float x ) { return x*x*x; } +float pow4( const in float x ) { float x2 = x*x; return x2*x2; } +float average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); } +// expects values in the range of [0,1]x[0,1], returns values in the [0,1] range. +// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ +highp float rand( const in vec2 uv ) { + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract(sin(sn) * c); +} + +struct IncidentLight { + vec3 color; + vec3 direction; + bool visible; +}; + +struct ReflectedLight { + vec3 directDiffuse; + vec3 directSpecular; + vec3 indirectDiffuse; + vec3 indirectSpecular; +}; + +struct GeometricContext { + vec3 position; + vec3 normal; + vec3 viewDir; +}; + +vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + +} + +// http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations +vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); + +} + +vec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) { + + float distance = dot( planeNormal, point - pointOnPlane ); + + return - distance * planeNormal + point; + +} + +float sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) { + + return sign( dot( point - pointOnPlane, planeNormal ) ); + +} + +vec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) { + + return lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine; + +} + +mat3 transposeMat3( const in mat3 m ) { + + mat3 tmp; + + tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x ); + tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y ); + tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z ); + + return tmp; + +} + +// https://en.wikipedia.org/wiki/Relative_luminance +float linearToRelativeLuminance( const in vec3 color ) { + + vec3 weights = vec3( 0.2126, 0.7152, 0.0722 ); + + return dot( weights, color.rgb ); + +} diff --git a/lib/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl b/lib/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl new file mode 100644 index 0000000..7023989 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl @@ -0,0 +1,128 @@ +#ifdef ENVMAP_TYPE_CUBE_UV + +#define cubeUV_textureSize (1024.0) + +int getFaceFromDirection(vec3 direction) { + vec3 absDirection = abs(direction); + int face = -1; + if( absDirection.x > absDirection.z ) { + if(absDirection.x > absDirection.y ) + face = direction.x > 0.0 ? 0 : 3; + else + face = direction.y > 0.0 ? 1 : 4; + } + else { + if(absDirection.z > absDirection.y ) + face = direction.z > 0.0 ? 2 : 5; + else + face = direction.y > 0.0 ? 1 : 4; + } + return face; +} +#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0) +#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0)) + +vec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) { + float scale = exp2(cubeUV_maxLods1 - roughnessLevel); + float dxRoughness = dFdx(roughness); + float dyRoughness = dFdy(roughness); + vec3 dx = dFdx( vec * scale * dxRoughness ); + vec3 dy = dFdy( vec * scale * dyRoughness ); + float d = max( dot( dx, dx ), dot( dy, dy ) ); + // Clamp the value to the max mip level counts. hard coded to 6 mips + d = clamp(d, 1.0, cubeUV_rangeClamp); + float mipLevel = 0.5 * log2(d); + return vec2(floor(mipLevel), fract(mipLevel)); +} + +#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0) +#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize) + +vec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) { + mipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel; + float a = 16.0 * cubeUV_rcpTextureSize; + + vec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) ); + vec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed; + // float powScale = exp2(roughnessLevel + mipLevel); + float powScale = exp2_packed.x * exp2_packed.y; + // float scale = 1.0 / exp2(roughnessLevel + 2.0 + mipLevel); + float scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25; + // float mipOffset = 0.75*(1.0 - 1.0/exp2(mipLevel))/exp2(roughnessLevel); + float mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x; + + bool bRes = mipLevel == 0.0; + scale = bRes && (scale < a) ? a : scale; + + vec3 r; + vec2 offset; + int face = getFaceFromDirection(direction); + + float rcpPowScale = 1.0 / powScale; + + if( face == 0) { + r = vec3(direction.x, -direction.z, direction.y); + offset = vec2(0.0+mipOffset,0.75 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? a : offset.y; + } + else if( face == 1) { + r = vec3(direction.y, direction.x, direction.z); + offset = vec2(scale+mipOffset, 0.75 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? a : offset.y; + } + else if( face == 2) { + r = vec3(direction.z, direction.x, direction.y); + offset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? a : offset.y; + } + else if( face == 3) { + r = vec3(direction.x, direction.z, direction.y); + offset = vec2(0.0+mipOffset,0.5 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y; + } + else if( face == 4) { + r = vec3(direction.y, direction.x, -direction.z); + offset = vec2(scale+mipOffset, 0.5 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y; + } + else { + r = vec3(direction.z, -direction.x, direction.y); + offset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y; + } + r = normalize(r); + float texelOffset = 0.5 * cubeUV_rcpTextureSize; + vec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5; + vec2 base = offset + vec2( texelOffset ); + return base + s * ( scale - 2.0 * texelOffset ); +} + +#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0) + +vec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) { + float roughnessVal = roughness* cubeUV_maxLods3; + float r1 = floor(roughnessVal); + float r2 = r1 + 1.0; + float t = fract(roughnessVal); + vec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness); + float s = mipInfo.y; + float level0 = mipInfo.x; + float level1 = level0 + 1.0; + level1 = level1 > 5.0 ? 5.0 : level1; + + // round to nearest mipmap if we are not interpolating. + level0 += min( floor( s + 0.5 ), 5.0 ); + + // Tri linear interpolation. + vec2 uv_10 = getCubeUV(reflectedDirection, r1, level0); + vec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10)); + + vec2 uv_20 = getCubeUV(reflectedDirection, r2, level0); + vec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20)); + + vec4 result = mix(color10, color20, t); + + return vec4(result.rgb, 1.0); +} + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl new file mode 100644 index 0000000..38c9509 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl @@ -0,0 +1,7 @@ +vec3 transformedNormal = normalMatrix * objectNormal; + +#ifdef FLIP_SIDED + + transformedNormal = - transformedNormal; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl new file mode 100644 index 0000000..5e77159 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl @@ -0,0 +1,7 @@ +#ifdef USE_DISPLACEMENTMAP + + uniform sampler2D displacementMap; + uniform float displacementScale; + uniform float displacementBias; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl b/lib/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl new file mode 100644 index 0000000..0c8dce0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_DISPLACEMENTMAP + + transformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/dithering_fragment.glsl b/lib/renderers/shaders/ShaderChunk/dithering_fragment.glsl new file mode 100644 index 0000000..a81e01d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/dithering_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( DITHERING ) + + gl_FragColor.rgb = dithering( gl_FragColor.rgb ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl new file mode 100644 index 0000000..591bfc4 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl @@ -0,0 +1,18 @@ +#if defined( DITHERING ) + + // based on https://www.shadertoy.com/view/MslGR8 + vec3 dithering( vec3 color ) { + //Calculate grid position + float grid_position = rand( gl_FragCoord.xy ); + + //Shift the individual colors differently, thus making it even harder to see the dithering pattern + vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); + + //modify shift acording to grid position. + dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); + + //shift the color by dither_shift + return color + dither_shift_RGB; + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl new file mode 100644 index 0000000..1d65996 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl @@ -0,0 +1,9 @@ +#ifdef USE_EMISSIVEMAP + + vec4 emissiveColor = texture2D( emissiveMap, vUv ); + + emissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb; + + totalEmissiveRadiance *= emissiveColor.rgb; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl new file mode 100644 index 0000000..c05bb7f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_EMISSIVEMAP + + uniform sampler2D emissiveMap; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/encodings_fragment.glsl b/lib/renderers/shaders/ShaderChunk/encodings_fragment.glsl new file mode 100644 index 0000000..189d735 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/encodings_fragment.glsl @@ -0,0 +1 @@ + gl_FragColor = linearToOutputTexel( gl_FragColor ); diff --git a/lib/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl new file mode 100644 index 0000000..211952c --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl @@ -0,0 +1,83 @@ +// For a discussion of what this is, please read this: http://lousodrome.net/blog/light/2013/05/26/gamma-correct-and-hdr-rendering-in-a-32-bits-buffer/ + +vec4 LinearToLinear( in vec4 value ) { + return value; +} + +vec4 GammaToLinear( in vec4 value, in float gammaFactor ) { + return vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a ); +} + +vec4 LinearToGamma( in vec4 value, in float gammaFactor ) { + return vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a ); +} + +vec4 sRGBToLinear( in vec4 value ) { + return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a ); +} + +vec4 LinearTosRGB( in vec4 value ) { + return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); +} + +vec4 RGBEToLinear( in vec4 value ) { + return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 ); +} + +vec4 LinearToRGBE( in vec4 value ) { + float maxComponent = max( max( value.r, value.g ), value.b ); + float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 ); + return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 ); +// return vec4( value.brg, ( 3.0 + 128.0 ) / 256.0 ); +} + +// reference: http://iwasbeingirony.blogspot.ca/2010/06/difference-between-rgbm-and-rgbd.html +vec4 RGBMToLinear( in vec4 value, in float maxRange ) { + return vec4( value.rgb * value.a * maxRange, 1.0 ); +} + +vec4 LinearToRGBM( in vec4 value, in float maxRange ) { + float maxRGB = max( value.r, max( value.g, value.b ) ); + float M = clamp( maxRGB / maxRange, 0.0, 1.0 ); + M = ceil( M * 255.0 ) / 255.0; + return vec4( value.rgb / ( M * maxRange ), M ); +} + +// reference: http://iwasbeingirony.blogspot.ca/2010/06/difference-between-rgbm-and-rgbd.html +vec4 RGBDToLinear( in vec4 value, in float maxRange ) { + return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 ); +} + +vec4 LinearToRGBD( in vec4 value, in float maxRange ) { + float maxRGB = max( value.r, max( value.g, value.b ) ); + float D = max( maxRange / maxRGB, 1.0 ); + D = min( floor( D ) / 255.0, 1.0 ); + return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D ); +} + +// LogLuv reference: http://graphicrants.blogspot.ca/2009/04/rgbm-color-encoding.html + +// M matrix, for encoding +const mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 ); +vec4 LinearToLogLuv( in vec4 value ) { + vec3 Xp_Y_XYZp = value.rgb * cLogLuvM; + Xp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) ); + vec4 vResult; + vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z; + float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0; + vResult.w = fract( Le ); + vResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0; + return vResult; +} + +// Inverse M matrix, for decoding +const mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 ); +vec4 LogLuvToLinear( in vec4 value ) { + float Le = value.z * 255.0 + value.w; + vec3 Xp_Y_XYZp; + Xp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 ); + Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y; + Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z; + vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM; + return vec4( max( vRGB, 0.0 ), 1.0 ); +} diff --git a/lib/renderers/shaders/ShaderChunk/envmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/envmap_fragment.glsl new file mode 100644 index 0000000..d401e2b --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_fragment.glsl @@ -0,0 +1,72 @@ +#ifdef USE_ENVMAP + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) + + vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition ); + + // Transforming Normal Vectors with the Inverse Transformation + vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); + + #ifdef ENVMAP_MODE_REFLECTION + + vec3 reflectVec = reflect( cameraToVertex, worldNormal ); + + #else + + vec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio ); + + #endif + + #else + + vec3 reflectVec = vReflect; + + #endif + + #ifdef ENVMAP_TYPE_CUBE + + vec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) ); + + #elif defined( ENVMAP_TYPE_EQUIREC ) + + vec2 sampleUV; + + reflectVec = normalize( reflectVec ); + + sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + + sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5; + + vec4 envColor = texture2D( envMap, sampleUV ); + + #elif defined( ENVMAP_TYPE_SPHERE ) + + reflectVec = normalize( reflectVec ); + + vec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) ); + + vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 ); + + #else + + vec4 envColor = vec4( 0.0 ); + + #endif + + envColor = envMapTexelToLinear( envColor ); + + #ifdef ENVMAP_BLENDING_MULTIPLY + + outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); + + #elif defined( ENVMAP_BLENDING_MIX ) + + outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); + + #elif defined( ENVMAP_BLENDING_ADD ) + + outgoingLight += envColor.xyz * specularStrength * reflectivity; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl new file mode 100644 index 0000000..3e6e377 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl @@ -0,0 +1,26 @@ +#if defined( USE_ENVMAP ) || defined( PHYSICAL ) + uniform float reflectivity; + uniform float envMapIntensity; +#endif + +#ifdef USE_ENVMAP + + #if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) ) + varying vec3 vWorldPosition; + #endif + + #ifdef ENVMAP_TYPE_CUBE + uniform samplerCube envMap; + #else + uniform sampler2D envMap; + #endif + uniform float flipEnvMap; + uniform int maxMipLevel; + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL ) + uniform float refractionRatio; + #else + varying vec3 vReflect; + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl new file mode 100644 index 0000000..7feab75 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_ENVMAP + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) + varying vec3 vWorldPosition; + + #else + + varying vec3 vReflect; + uniform float refractionRatio; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl new file mode 100644 index 0000000..db22ff0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl @@ -0,0 +1,133 @@ +#if defined( USE_ENVMAP ) && defined( PHYSICAL ) + + vec3 getLightProbeIndirectIrradiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in int maxMIPLevel ) { + + vec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix ); + + #ifdef ENVMAP_TYPE_CUBE + + vec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz ); + + // TODO: replace with properly filtered cubemaps and access the irradiance LOD level, be it the last LOD level + // of a specular cubemap, or just the default level of a specially created irradiance cubemap. + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) ); + + #else + + // force the bias high to get the last LOD level as it is the most blurred. + vec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #elif defined( ENVMAP_TYPE_CUBE_UV ) + + vec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz ); + vec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 ); + + #else + + vec4 envMapColor = vec4( 0.0 ); + + #endif + + return PI * envMapColor.rgb * envMapIntensity; + + } + + // taken from here: http://casual-effects.blogspot.ca/2011/08/plausible-environment-lighting-in-two.html + float getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) { + + //float envMapWidth = pow( 2.0, maxMIPLevelScalar ); + //float desiredMIPLevel = log2( envMapWidth * sqrt( 3.0 ) ) - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 ); + + float maxMIPLevelScalar = float( maxMIPLevel ); + float desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 ); + + // clamp to allowable LOD ranges. + return clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar ); + + } + + vec3 getLightProbeIndirectRadiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) { + + #ifdef ENVMAP_MODE_REFLECTION + + vec3 reflectVec = reflect( -geometry.viewDir, geometry.normal ); + + #else + + vec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio ); + + #endif + + reflectVec = inverseTransformDirection( reflectVec, viewMatrix ); + + float specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel ); + + #ifdef ENVMAP_TYPE_CUBE + + vec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz ); + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel ); + + #else + + vec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #elif defined( ENVMAP_TYPE_CUBE_UV ) + + vec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz ); + vec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent )); + + #elif defined( ENVMAP_TYPE_EQUIREC ) + + vec2 sampleUV; + sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5; + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel ); + + #else + + vec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #elif defined( ENVMAP_TYPE_SPHERE ) + + vec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) ); + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel ); + + #else + + vec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #endif + + return envMapColor.rgb * envMapIntensity; + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_vertex.glsl b/lib/renderers/shaders/ShaderChunk/envmap_vertex.glsl new file mode 100644 index 0000000..ce32d52 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_vertex.glsl @@ -0,0 +1,25 @@ +#ifdef USE_ENVMAP + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) + + vWorldPosition = worldPosition.xyz; + + #else + + vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition ); + + vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); + + #ifdef ENVMAP_MODE_REFLECTION + + vReflect = reflect( cameraToVertex, worldNormal ); + + #else + + vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); + + #endif + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_fragment.glsl b/lib/renderers/shaders/ShaderChunk/fog_fragment.glsl new file mode 100644 index 0000000..8307a32 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_fragment.glsl @@ -0,0 +1,15 @@ +#ifdef USE_FOG + + #ifdef FOG_EXP2 + + float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) ); + + #else + + float fogFactor = smoothstep( fogNear, fogFar, fogDepth ); + + #endif + + gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl new file mode 100644 index 0000000..26c4093 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl @@ -0,0 +1,17 @@ +#ifdef USE_FOG + + uniform vec3 fogColor; + varying float fogDepth; + + #ifdef FOG_EXP2 + + uniform float fogDensity; + + #else + + uniform float fogNear; + uniform float fogFar; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl new file mode 100644 index 0000000..b9658ca --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_FOG + + varying float fogDepth; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_vertex.glsl b/lib/renderers/shaders/ShaderChunk/fog_vertex.glsl new file mode 100644 index 0000000..0e808ad --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_FOG + + fogDepth = -mvPosition.z; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl new file mode 100644 index 0000000..c8332ba --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl @@ -0,0 +1,24 @@ +#ifdef TOON + + uniform sampler2D gradientMap; + + vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { + + // dotNL will be from -1.0 to 1.0 + float dotNL = dot( normal, lightDirection ); + vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 ); + + #ifdef USE_GRADIENTMAP + + return texture2D( gradientMap, coord ).rgb; + + #else + + return ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 ); + + #endif + + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lightmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lightmap_fragment.glsl new file mode 100644 index 0000000..1392a60 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lightmap_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_LIGHTMAP + + reflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity; // factor of PI should not be present; included here to prevent breakage + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl new file mode 100644 index 0000000..a75c38f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef USE_LIGHTMAP + + uniform sampler2D lightMap; + uniform float lightMapIntensity; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl b/lib/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl new file mode 100644 index 0000000..7af8dfb --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl @@ -0,0 +1,123 @@ +/** + * This is a template that can be used to light a material, it uses pluggable + * RenderEquations (RE)for specific lighting scenarios. + * + * Instructions for use: + * - Ensure that both RE_Direct, RE_IndirectDiffuse and RE_IndirectSpecular are defined + * - If you have defined an RE_IndirectSpecular, you need to also provide a Material_LightProbeLOD. <---- ??? + * - Create a material parameter that is to be passed as the third parameter to your lighting functions. + * + * TODO: + * - Add area light support. + * - Add sphere light support. + * - Add diffuse light probe (irradiance cubemap) support. + */ + +GeometricContext geometry; + +geometry.position = - vViewPosition; +geometry.normal = normal; +geometry.viewDir = normalize( vViewPosition ); + +IncidentLight directLight; + +#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct ) + + PointLight pointLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + pointLight = pointLights[ i ]; + + getPointDirectLightIrradiance( pointLight, geometry, directLight ); + + #ifdef USE_SHADOWMAP + directLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; + #endif + + RE_Direct( directLight, geometry, material, reflectedLight ); + + } + +#endif + +#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct ) + + SpotLight spotLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + spotLight = spotLights[ i ]; + + getSpotDirectLightIrradiance( spotLight, geometry, directLight ); + + #ifdef USE_SHADOWMAP + directLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0; + #endif + + RE_Direct( directLight, geometry, material, reflectedLight ); + + } + +#endif + +#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) + + DirectionalLight directionalLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + directionalLight = directionalLights[ i ]; + + getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight ); + + #ifdef USE_SHADOWMAP + directLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + #endif + + RE_Direct( directLight, geometry, material, reflectedLight ); + + } + +#endif + +#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea ) + + RectAreaLight rectAreaLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { + + rectAreaLight = rectAreaLights[ i ]; + RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight ); + + } + +#endif + +#if defined( RE_IndirectDiffuse ) + + vec3 irradiance = getAmbientLightIrradiance( ambientLightColor ); + + #if ( NUM_HEMI_LIGHTS > 0 ) + + #pragma unroll_loop + for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { + + irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry ); + + } + + #endif + +#endif + +#if defined( RE_IndirectSpecular ) + + vec3 radiance = vec3( 0.0 ); + vec3 clearCoatRadiance = vec3( 0.0 ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_fragment_end.glsl b/lib/renderers/shaders/ShaderChunk/lights_fragment_end.glsl new file mode 100644 index 0000000..c727183 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_fragment_end.glsl @@ -0,0 +1,11 @@ +#if defined( RE_IndirectDiffuse ) + + RE_IndirectDiffuse( irradiance, geometry, material, reflectedLight ); + +#endif + +#if defined( RE_IndirectSpecular ) + + RE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl b/lib/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl new file mode 100644 index 0000000..dfba604 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl @@ -0,0 +1,33 @@ +#if defined( RE_IndirectDiffuse ) + + #ifdef USE_LIGHTMAP + + vec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity; + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + lightMapIrradiance *= PI; // factor of PI should not be present; included here to prevent breakage + + #endif + + irradiance += lightMapIrradiance; + + #endif + + #if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV ) + + irradiance += getLightProbeIndirectIrradiance( /*lightProbe,*/ geometry, maxMipLevel ); + + #endif + +#endif + +#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular ) + + radiance += getLightProbeIndirectRadiance( /*specularLightProbe,*/ geometry, Material_BlinnShininessExponent( material ), maxMipLevel ); + + #ifndef STANDARD + clearCoatRadiance += getLightProbeIndirectRadiance( /*specularLightProbe,*/ geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel ); + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl b/lib/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl new file mode 100644 index 0000000..b6f5660 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl @@ -0,0 +1,115 @@ +vec3 diffuse = vec3( 1.0 ); + +GeometricContext geometry; +geometry.position = mvPosition.xyz; +geometry.normal = normalize( transformedNormal ); +geometry.viewDir = normalize( -mvPosition.xyz ); + +GeometricContext backGeometry; +backGeometry.position = geometry.position; +backGeometry.normal = -geometry.normal; +backGeometry.viewDir = geometry.viewDir; + +vLightFront = vec3( 0.0 ); + +#ifdef DOUBLE_SIDED + vLightBack = vec3( 0.0 ); +#endif + +IncidentLight directLight; +float dotNL; +vec3 directLightColor_Diffuse; + +#if NUM_POINT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + getPointDirectLightIrradiance( pointLights[ i ], geometry, directLight ); + + dotNL = dot( geometry.normal, directLight.direction ); + directLightColor_Diffuse = PI * directLight.color; + + vLightFront += saturate( dotNL ) * directLightColor_Diffuse; + + #ifdef DOUBLE_SIDED + + vLightBack += saturate( -dotNL ) * directLightColor_Diffuse; + + #endif + + } + +#endif + +#if NUM_SPOT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + getSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight ); + + dotNL = dot( geometry.normal, directLight.direction ); + directLightColor_Diffuse = PI * directLight.color; + + vLightFront += saturate( dotNL ) * directLightColor_Diffuse; + + #ifdef DOUBLE_SIDED + + vLightBack += saturate( -dotNL ) * directLightColor_Diffuse; + + #endif + } + +#endif + +/* +#if NUM_RECT_AREA_LIGHTS > 0 + + for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { + + // TODO (abelnation): implement + + } + +#endif +*/ + +#if NUM_DIR_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + getDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight ); + + dotNL = dot( geometry.normal, directLight.direction ); + directLightColor_Diffuse = PI * directLight.color; + + vLightFront += saturate( dotNL ) * directLightColor_Diffuse; + + #ifdef DOUBLE_SIDED + + vLightBack += saturate( -dotNL ) * directLightColor_Diffuse; + + #endif + + } + +#endif + +#if NUM_HEMI_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { + + vLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry ); + + #ifdef DOUBLE_SIDED + + vLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry ); + + #endif + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_pars_begin.glsl b/lib/renderers/shaders/ShaderChunk/lights_pars_begin.glsl new file mode 100644 index 0000000..071be7c --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_pars_begin.glsl @@ -0,0 +1,170 @@ +uniform vec3 ambientLightColor; + +vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) { + + vec3 irradiance = ambientLightColor; + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; + + #endif + + return irradiance; + +} + +#if NUM_DIR_LIGHTS > 0 + + struct DirectionalLight { + vec3 direction; + vec3 color; + + int shadow; + float shadowBias; + float shadowRadius; + vec2 shadowMapSize; + }; + + uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ]; + + void getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) { + + directLight.color = directionalLight.color; + directLight.direction = directionalLight.direction; + directLight.visible = true; + + } + +#endif + + +#if NUM_POINT_LIGHTS > 0 + + struct PointLight { + vec3 position; + vec3 color; + float distance; + float decay; + + int shadow; + float shadowBias; + float shadowRadius; + vec2 shadowMapSize; + float shadowCameraNear; + float shadowCameraFar; + }; + + uniform PointLight pointLights[ NUM_POINT_LIGHTS ]; + + // directLight is an out parameter as having it as a return value caused compiler errors on some devices + void getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) { + + vec3 lVector = pointLight.position - geometry.position; + directLight.direction = normalize( lVector ); + + float lightDistance = length( lVector ); + + directLight.color = pointLight.color; + directLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay ); + directLight.visible = ( directLight.color != vec3( 0.0 ) ); + + } + +#endif + + +#if NUM_SPOT_LIGHTS > 0 + + struct SpotLight { + vec3 position; + vec3 direction; + vec3 color; + float distance; + float decay; + float coneCos; + float penumbraCos; + + int shadow; + float shadowBias; + float shadowRadius; + vec2 shadowMapSize; + }; + + uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ]; + + // directLight is an out parameter as having it as a return value caused compiler errors on some devices + void getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) { + + vec3 lVector = spotLight.position - geometry.position; + directLight.direction = normalize( lVector ); + + float lightDistance = length( lVector ); + float angleCos = dot( directLight.direction, spotLight.direction ); + + if ( angleCos > spotLight.coneCos ) { + + float spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos ); + + directLight.color = spotLight.color; + directLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay ); + directLight.visible = true; + + } else { + + directLight.color = vec3( 0.0 ); + directLight.visible = false; + + } + } + +#endif + + +#if NUM_RECT_AREA_LIGHTS > 0 + + struct RectAreaLight { + vec3 color; + vec3 position; + vec3 halfWidth; + vec3 halfHeight; + }; + + // Pre-computed values of LinearTransformedCosine approximation of BRDF + // BRDF approximation Texture is 64x64 + uniform sampler2D ltc_1; // RGBA Float + uniform sampler2D ltc_2; // RGBA Float + + uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ]; + +#endif + + +#if NUM_HEMI_LIGHTS > 0 + + struct HemisphereLight { + vec3 direction; + vec3 skyColor; + vec3 groundColor; + }; + + uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ]; + + vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) { + + float dotNL = dot( geometry.normal, hemiLight.direction ); + float hemiDiffuseWeight = 0.5 * dotNL + 0.5; + + vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; + + #endif + + return irradiance; + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl new file mode 100644 index 0000000..3bc610a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl @@ -0,0 +1,5 @@ +BlinnPhongMaterial material; +material.diffuseColor = diffuseColor.rgb; +material.specularColor = specular; +material.specularShininess = shininess; +material.specularStrength = specularStrength; diff --git a/lib/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl new file mode 100644 index 0000000..4e41227 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl @@ -0,0 +1,53 @@ +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + + +struct BlinnPhongMaterial { + + vec3 diffuseColor; + vec3 specularColor; + float specularShininess; + float specularStrength; + +}; + +void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { + + #ifdef TOON + + vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color; + + #else + + float dotNL = saturate( dot( geometry.normal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + + #endif + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; // punctual light + + #endif + + reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + + reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength; + +} + +void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { + + reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + +} + +#define RE_Direct RE_Direct_BlinnPhong +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong + +#define Material_LightProbeLOD( material ) (0) diff --git a/lib/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl new file mode 100644 index 0000000..c726580 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl @@ -0,0 +1,10 @@ +PhysicalMaterial material; +material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); +material.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 ); +#ifdef STANDARD + material.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor ); +#else + material.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor ); + material.clearCoat = saturate( clearCoat ); // Burley clearcoat model + material.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 ); +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl new file mode 100644 index 0000000..32ed0f2 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl @@ -0,0 +1,135 @@ +struct PhysicalMaterial { + + vec3 diffuseColor; + float specularRoughness; + vec3 specularColor; + + #ifndef STANDARD + float clearCoat; + float clearCoatRoughness; + #endif + +}; + +#define MAXIMUM_SPECULAR_COEFFICIENT 0.16 +#define DEFAULT_SPECULAR_COEFFICIENT 0.04 + +// Clear coat directional hemishperical reflectance (this approximation should be improved) +float clearCoatDHRApprox( const in float roughness, const in float dotNL ) { + + return DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) ); + +} + +#if NUM_RECT_AREA_LIGHTS > 0 + + void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + vec3 normal = geometry.normal; + vec3 viewDir = geometry.viewDir; + vec3 position = geometry.position; + vec3 lightPos = rectAreaLight.position; + vec3 halfWidth = rectAreaLight.halfWidth; + vec3 halfHeight = rectAreaLight.halfHeight; + vec3 lightColor = rectAreaLight.color; + float roughness = material.specularRoughness; + + vec3 rectCoords[ 4 ]; + rectCoords[ 0 ] = lightPos - halfWidth - halfHeight; // counterclockwise + rectCoords[ 1 ] = lightPos + halfWidth - halfHeight; + rectCoords[ 2 ] = lightPos + halfWidth + halfHeight; + rectCoords[ 3 ] = lightPos - halfWidth + halfHeight; + + vec2 uv = LTC_Uv( normal, viewDir, roughness ); + + vec4 t1 = texture2D( ltc_1, uv ); + vec4 t2 = texture2D( ltc_2, uv ); + + mat3 mInv = mat3( + vec3( t1.x, 0, t1.y ), + vec3( 0, 1, 0 ), + vec3( t1.z, 0, t1.w ) + ); + + // LTC Fresnel Approximation by Stephen Hill + // http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf + vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y ); + + reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords ); + + reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords ); + + } + +#endif + +void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + float dotNL = saturate( dot( geometry.normal, directLight.direction ) ); + + vec3 irradiance = dotNL * directLight.color; + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; // punctual light + + #endif + + #ifndef STANDARD + float clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL ); + #else + float clearCoatDHR = 0.0; + #endif + + reflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness ); + + reflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + + #ifndef STANDARD + + reflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness ); + + #endif + +} + +void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + +} + +void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + #ifndef STANDARD + float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + float dotNL = dotNV; + float clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL ); + #else + float clearCoatDHR = 0.0; + #endif + + reflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness ); + + #ifndef STANDARD + + reflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness ); + + #endif + +} + +#define RE_Direct RE_Direct_Physical +#define RE_Direct_RectArea RE_Direct_RectArea_Physical +#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical +#define RE_IndirectSpecular RE_IndirectSpecular_Physical + +#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness ) +#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness ) + +// ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf +float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { + + return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); + +} diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl new file mode 100644 index 0000000..55833fb --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) + + gl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl new file mode 100644 index 0000000..38b2586 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl @@ -0,0 +1,6 @@ +#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) + + uniform float logDepthBufFC; + varying float vFragDepth; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl new file mode 100644 index 0000000..08da5ad --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_LOGDEPTHBUF + + #ifdef USE_LOGDEPTHBUF_EXT + + varying float vFragDepth; + + #else + + uniform float logDepthBufFC; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl new file mode 100644 index 0000000..7c7c852 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl @@ -0,0 +1,15 @@ +#ifdef USE_LOGDEPTHBUF + + #ifdef USE_LOGDEPTHBUF_EXT + + vFragDepth = 1.0 + gl_Position.w; + + #else + + gl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0; + + gl_Position.z *= gl_Position.w; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_fragment.glsl new file mode 100644 index 0000000..b5fb51b --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_fragment.glsl @@ -0,0 +1,8 @@ +#ifdef USE_MAP + + vec4 texelColor = texture2D( map, vUv ); + + texelColor = mapTexelToLinear( texelColor ); + diffuseColor *= texelColor; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_pars_fragment.glsl new file mode 100644 index 0000000..d9a0346 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_MAP + + uniform sampler2D map; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_particle_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_particle_fragment.glsl new file mode 100644 index 0000000..65b041f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_particle_fragment.glsl @@ -0,0 +1,7 @@ +#ifdef USE_MAP + + vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy; + vec4 mapTexel = texture2D( map, uv ); + diffuseColor *= mapTexelToLinear( mapTexel ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl new file mode 100644 index 0000000..8ff8083 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef USE_MAP + + uniform mat3 uvTransform; + uniform sampler2D map; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl new file mode 100644 index 0000000..f01ba6f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl @@ -0,0 +1,10 @@ +float metalnessFactor = metalness; + +#ifdef USE_METALNESSMAP + + vec4 texelMetalness = texture2D( metalnessMap, vUv ); + + // reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture + metalnessFactor *= texelMetalness.b; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl new file mode 100644 index 0000000..1d9c869 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_METALNESSMAP + + uniform sampler2D metalnessMap; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl new file mode 100644 index 0000000..b14763b --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl @@ -0,0 +1,8 @@ +#ifdef USE_MORPHNORMALS + + objectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ]; + objectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ]; + objectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ]; + objectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ]; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl new file mode 100644 index 0000000..a6664a5 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_MORPHTARGETS + + #ifndef USE_MORPHNORMALS + + uniform float morphTargetInfluences[ 8 ]; + + #else + + uniform float morphTargetInfluences[ 4 ]; + + #endif + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl b/lib/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl new file mode 100644 index 0000000..baa0d6d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl @@ -0,0 +1,17 @@ +#ifdef USE_MORPHTARGETS + + transformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ]; + transformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ]; + transformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ]; + transformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ]; + + #ifndef USE_MORPHNORMALS + + transformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ]; + transformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ]; + transformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ]; + transformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ]; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl b/lib/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl new file mode 100644 index 0000000..acc515a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl @@ -0,0 +1,19 @@ +#ifdef FLAT_SHADED + + // Workaround for Adreno/Nexus5 not able able to do dFdx( vViewPosition ) ... + + vec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) ); + vec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) ); + vec3 normal = normalize( cross( fdx, fdy ) ); + +#else + + vec3 normal = normalize( vNormal ); + + #ifdef DOUBLE_SIDED + + normal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 ); + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl b/lib/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl new file mode 100644 index 0000000..5339430 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl @@ -0,0 +1,31 @@ +#ifdef USE_NORMALMAP + + #ifdef OBJECTSPACE_NORMALMAP + + normal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals + + #ifdef FLIP_SIDED + + normal = - normal; + + #endif + + #ifdef DOUBLE_SIDED + + normal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 ); + + #endif + + normal = normalize( normalMatrix * normal ); + + #else // tangent-space normal map + + normal = perturbNormal2Arb( -vViewPosition, normal ); + + #endif + +#elif defined( USE_BUMPMAP ) + + normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl new file mode 100644 index 0000000..c347018 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl @@ -0,0 +1,42 @@ +#ifdef USE_NORMALMAP + + uniform sampler2D normalMap; + uniform vec2 normalScale; + + #ifdef OBJECTSPACE_NORMALMAP + + uniform mat3 normalMatrix; + + #else + + // Per-Pixel Tangent Space Normal Mapping + // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html + + vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) { + + // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988 + + vec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) ); + vec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) ); + vec2 st0 = dFdx( vUv.st ); + vec2 st1 = dFdy( vUv.st ); + + float scale = sign( st1.t * st0.s - st0.t * st1.s ); // we do not care about the magnitude + + vec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale ); + vec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale ); + vec3 N = normalize( surf_norm ); + mat3 tsn = mat3( S, T, N ); + + vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; + + mapN.xy *= normalScale; + mapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 ); + + return normalize( tsn * mapN ); + + } + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/packing.glsl b/lib/renderers/shaders/ShaderChunk/packing.glsl new file mode 100644 index 0000000..24c8e34 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/packing.glsl @@ -0,0 +1,41 @@ +vec3 packNormalToRGB( const in vec3 normal ) { + return normalize( normal ) * 0.5 + 0.5; +} + +vec3 unpackRGBToNormal( const in vec3 rgb ) { + return 2.0 * rgb.xyz - 1.0; +} + +const float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1) +const float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1) + +const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. ); +const vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. ); + +const float ShiftRight8 = 1. / 256.; + +vec4 packDepthToRGBA( const in float v ) { + vec4 r = vec4( fract( v * PackFactors ), v ); + r.yzw -= r.xyz * ShiftRight8; // tidy overflow + return r * PackUpscale; +} + +float unpackRGBAToDepth( const in vec4 v ) { + return dot( v, UnpackFactors ); +} + +// NOTE: viewZ/eyeZ is < 0 when in front of the camera per OpenGL conventions + +float viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) { + return ( viewZ + near ) / ( near - far ); +} +float orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) { + return linearClipZ * ( near - far ) - near; +} + +float viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) { + return (( near + viewZ ) * far ) / (( far - near ) * viewZ ); +} +float perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) { + return ( near * far ) / ( ( far - near ) * invClipZ - far ); +} diff --git a/lib/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl b/lib/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl new file mode 100644 index 0000000..4127319 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef PREMULTIPLIED_ALPHA + + // Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation. + gl_FragColor.rgb *= gl_FragColor.a; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/project_vertex.glsl b/lib/renderers/shaders/ShaderChunk/project_vertex.glsl new file mode 100644 index 0000000..32061dd --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/project_vertex.glsl @@ -0,0 +1,3 @@ +vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 ); + +gl_Position = projectionMatrix * mvPosition; diff --git a/lib/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl new file mode 100644 index 0000000..2de0151 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl @@ -0,0 +1,10 @@ +float roughnessFactor = roughness; + +#ifdef USE_ROUGHNESSMAP + + vec4 texelRoughness = texture2D( roughnessMap, vUv ); + + // reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture + roughnessFactor *= texelRoughness.g; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl new file mode 100644 index 0000000..0f25712 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_ROUGHNESSMAP + + uniform sampler2D roughnessMap; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl new file mode 100644 index 0000000..5f0c598 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl @@ -0,0 +1,243 @@ +#ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ]; + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ]; + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ]; + varying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ]; + + #endif + + #if NUM_POINT_LIGHTS > 0 + + uniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ]; + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ]; + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): create uniforms for area light shadows + + #endif + */ + + float texture2DCompare( sampler2D depths, vec2 uv, float compare ) { + + return step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) ); + + } + + float texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) { + + const vec2 offset = vec2( 0.0, 1.0 ); + + vec2 texelSize = vec2( 1.0 ) / size; + vec2 centroidUV = floor( uv * size + 0.5 ) / size; + + float lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare ); + float lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare ); + float rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare ); + float rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare ); + + vec2 f = fract( uv * size + 0.5 ); + + float a = mix( lb, lt, f.y ); + float b = mix( rb, rt, f.y ); + float c = mix( a, b, f.x ); + + return c; + + } + + float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) { + + float shadow = 1.0; + + shadowCoord.xyz /= shadowCoord.w; + shadowCoord.z += shadowBias; + + // if ( something && something ) breaks ATI OpenGL shader compiler + // if ( all( something, something ) ) using this instead + + bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 ); + bool inFrustum = all( inFrustumVec ); + + bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 ); + + bool frustumTest = all( frustumTestVec ); + + if ( frustumTest ) { + + #if defined( SHADOWMAP_TYPE_PCF ) + + vec2 texelSize = vec2( 1.0 ) / shadowMapSize; + + float dx0 = - texelSize.x * shadowRadius; + float dy0 = - texelSize.y * shadowRadius; + float dx1 = + texelSize.x * shadowRadius; + float dy1 = + texelSize.y * shadowRadius; + + shadow = ( + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z ) + ) * ( 1.0 / 9.0 ); + + #elif defined( SHADOWMAP_TYPE_PCF_SOFT ) + + vec2 texelSize = vec2( 1.0 ) / shadowMapSize; + + float dx0 = - texelSize.x * shadowRadius; + float dy0 = - texelSize.y * shadowRadius; + float dx1 = + texelSize.x * shadowRadius; + float dy1 = + texelSize.y * shadowRadius; + + shadow = ( + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z ) + ) * ( 1.0 / 9.0 ); + + #else // no percentage-closer filtering: + + shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ); + + #endif + + } + + return shadow; + + } + + // cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D + // vector suitable for 2D texture mapping. This code uses the following layout for the + // 2D texture: + // + // xzXZ + // y Y + // + // Y - Positive y direction + // y - Negative y direction + // X - Positive x direction + // x - Negative x direction + // Z - Positive z direction + // z - Negative z direction + // + // Source and test bed: + // https://gist.github.com/tschw/da10c43c467ce8afd0c4 + + vec2 cubeToUV( vec3 v, float texelSizeY ) { + + // Number of texels to avoid at the edge of each square + + vec3 absV = abs( v ); + + // Intersect unit cube + + float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) ); + absV *= scaleToCube; + + // Apply scale to avoid seams + + // two texels less per square (one texel will do for NEAREST) + v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY ); + + // Unwrap + + // space: -1 ... 1 range for each square + // + // #X## dim := ( 4 , 2 ) + // # # center := ( 1 , 1 ) + + vec2 planar = v.xy; + + float almostATexel = 1.5 * texelSizeY; + float almostOne = 1.0 - almostATexel; + + if ( absV.z >= almostOne ) { + + if ( v.z > 0.0 ) + planar.x = 4.0 - v.x; + + } else if ( absV.x >= almostOne ) { + + float signX = sign( v.x ); + planar.x = v.z * signX + 2.0 * signX; + + } else if ( absV.y >= almostOne ) { + + float signY = sign( v.y ); + planar.x = v.x + 2.0 * signY + 2.0; + planar.y = v.z * signY - 2.0; + + } + + // Transform to UV space + + // scale := 0.5 / dim + // translate := ( center + 0.5 ) / dim + return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 ); + + } + + float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) { + + vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) ); + + // for point lights, the uniform @vShadowCoord is re-purposed to hold + // the vector from the light to the world-space position of the fragment. + vec3 lightToPosition = shadowCoord.xyz; + + // dp = normalized distance from light to fragment position + float dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp? + dp += shadowBias; + + // bd3D = base direction 3D + vec3 bd3D = normalize( lightToPosition ); + + #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) + + vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y; + + return ( + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp ) + ) * ( 1.0 / 9.0 ); + + #else // no percentage-closer filtering + + return texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ); + + #endif + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl new file mode 100644 index 0000000..7417a5a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl @@ -0,0 +1,32 @@ +#ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ]; + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ]; + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + uniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ]; + varying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ]; + + #endif + + #if NUM_POINT_LIGHTS > 0 + + uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ]; + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ]; + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): uniforms for area light shadows + + #endif + */ + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl b/lib/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl new file mode 100644 index 0000000..c06a680 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl @@ -0,0 +1,44 @@ +#ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition; + + } + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + vSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition; + + } + + #endif + + #if NUM_POINT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition; + + } + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): update vAreaShadowCoord with area light info + + #endif + */ + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl new file mode 100644 index 0000000..ea953bc --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl @@ -0,0 +1,61 @@ +float getShadowMask() { + + float shadow = 1.0; + + #ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + DirectionalLight directionalLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + directionalLight = directionalLights[ i ]; + shadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + + } + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + SpotLight spotLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + spotLight = spotLights[ i ]; + shadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0; + + } + + #endif + + #if NUM_POINT_LIGHTS > 0 + + PointLight pointLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + pointLight = pointLights[ i ]; + shadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; + + } + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): update shadow for Area light + + #endif + */ + + #endif + + return shadow; + +} diff --git a/lib/renderers/shaders/ShaderChunk/skinbase_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinbase_vertex.glsl new file mode 100644 index 0000000..d1b3d39 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinbase_vertex.glsl @@ -0,0 +1,8 @@ +#ifdef USE_SKINNING + + mat4 boneMatX = getBoneMatrix( skinIndex.x ); + mat4 boneMatY = getBoneMatrix( skinIndex.y ); + mat4 boneMatZ = getBoneMatrix( skinIndex.z ); + mat4 boneMatW = getBoneMatrix( skinIndex.w ); + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl new file mode 100644 index 0000000..65459eb --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl @@ -0,0 +1,46 @@ +#ifdef USE_SKINNING + + uniform mat4 bindMatrix; + uniform mat4 bindMatrixInverse; + + #ifdef BONE_TEXTURE + + uniform sampler2D boneTexture; + uniform int boneTextureSize; + + mat4 getBoneMatrix( const in float i ) { + + float j = i * 4.0; + float x = mod( j, float( boneTextureSize ) ); + float y = floor( j / float( boneTextureSize ) ); + + float dx = 1.0 / float( boneTextureSize ); + float dy = 1.0 / float( boneTextureSize ); + + y = dy * ( y + 0.5 ); + + vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) ); + vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) ); + vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) ); + vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) ); + + mat4 bone = mat4( v1, v2, v3, v4 ); + + return bone; + + } + + #else + + uniform mat4 boneMatrices[ MAX_BONES ]; + + mat4 getBoneMatrix( const in float i ) { + + mat4 bone = boneMatrices[ int(i) ]; + return bone; + + } + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/skinning_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinning_vertex.glsl new file mode 100644 index 0000000..6a116e6 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinning_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_SKINNING + + vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); + + vec4 skinned = vec4( 0.0 ); + skinned += boneMatX * skinVertex * skinWeight.x; + skinned += boneMatY * skinVertex * skinWeight.y; + skinned += boneMatZ * skinVertex * skinWeight.z; + skinned += boneMatW * skinVertex * skinWeight.w; + + transformed = ( bindMatrixInverse * skinned ).xyz; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl new file mode 100644 index 0000000..b378a67 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl @@ -0,0 +1,12 @@ +#ifdef USE_SKINNING + + mat4 skinMatrix = mat4( 0.0 ); + skinMatrix += skinWeight.x * boneMatX; + skinMatrix += skinWeight.y * boneMatY; + skinMatrix += skinWeight.z * boneMatZ; + skinMatrix += skinWeight.w * boneMatW; + skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix; + + objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/specularmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/specularmap_fragment.glsl new file mode 100644 index 0000000..8afac60 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/specularmap_fragment.glsl @@ -0,0 +1,12 @@ +float specularStrength; + +#ifdef USE_SPECULARMAP + + vec4 texelSpecular = texture2D( specularMap, vUv ); + specularStrength = texelSpecular.r; + +#else + + specularStrength = 1.0; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl new file mode 100644 index 0000000..3df2e42 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_SPECULARMAP + + uniform sampler2D specularMap; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl b/lib/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl new file mode 100644 index 0000000..ce35d9a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( TONE_MAPPING ) + + gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl new file mode 100644 index 0000000..f5a8742 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl @@ -0,0 +1,41 @@ +#ifndef saturate + #define saturate(a) clamp( a, 0.0, 1.0 ) +#endif + +uniform float toneMappingExposure; +uniform float toneMappingWhitePoint; + +// exposure only +vec3 LinearToneMapping( vec3 color ) { + + return toneMappingExposure * color; + +} + +// source: https://www.cs.utah.edu/~reinhard/cdrom/ +vec3 ReinhardToneMapping( vec3 color ) { + + color *= toneMappingExposure; + return saturate( color / ( vec3( 1.0 ) + color ) ); + +} + +// source: http://filmicgames.com/archives/75 +#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 ) ) +vec3 Uncharted2ToneMapping( vec3 color ) { + + // John Hable's filmic operator from Uncharted 2 video game + color *= toneMappingExposure; + return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) ); + +} + +// source: http://filmicgames.com/archives/75 +vec3 OptimizedCineonToneMapping( vec3 color ) { + + // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson + color *= toneMappingExposure; + color = max( vec3( 0.0 ), color - 0.004 ); + return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) ); + +} diff --git a/lib/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl new file mode 100644 index 0000000..37274db --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) + + varying vec2 vUv2; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl new file mode 100644 index 0000000..6aaa13e --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl @@ -0,0 +1,6 @@ +#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) + + attribute vec2 uv2; + varying vec2 vUv2; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv2_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv2_vertex.glsl new file mode 100644 index 0000000..72d546a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv2_vertex.glsl @@ -0,0 +1,5 @@ +#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) + + vUv2 = uv2; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl new file mode 100644 index 0000000..d1bb954 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl @@ -0,0 +1,5 @@ +#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 ) + + varying vec2 vUv; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl new file mode 100644 index 0000000..b92d9e5 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl @@ -0,0 +1,6 @@ +#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 ) + + varying vec2 vUv; + uniform mat3 uvTransform; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/uv_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv_vertex.glsl new file mode 100644 index 0000000..16a75b0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv_vertex.glsl @@ -0,0 +1,5 @@ +#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 ) + + vUv = ( uvTransform * vec3( uv, 1 ) ).xy; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/worldpos_vertex.glsl b/lib/renderers/shaders/ShaderChunk/worldpos_vertex.glsl new file mode 100644 index 0000000..daccd25 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/worldpos_vertex.glsl @@ -0,0 +1,5 @@ +#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) + + vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 ); + +#endif diff --git a/lib/renderers/shaders/ShaderLib.js b/lib/renderers/shaders/ShaderLib.js new file mode 100644 index 0000000..6292e1c --- /dev/null +++ b/lib/renderers/shaders/ShaderLib.js @@ -0,0 +1,284 @@ +import { ShaderChunk } from './ShaderChunk.js'; +import { UniformsUtils } from './UniformsUtils.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { UniformsLib } from './UniformsLib.js'; +import { Color } from '../../math/Color.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + +var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + matcap: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ] ), + + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + sprite: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + + }, + + background: { + + uniforms: { + t2D: { value: null }, + }, + + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + + }, + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + +}; + +ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + +}; + + +export { ShaderLib }; diff --git a/lib/renderers/shaders/ShaderLib/background_frag.glsl b/lib/renderers/shaders/ShaderLib/background_frag.glsl new file mode 100644 index 0000000..2428b5a --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/background_frag.glsl @@ -0,0 +1,9 @@ +uniform sampler2D t2D; + +varying vec2 vUv; + +void main() { + + gl_FragColor = texture2D( t2D, vUv ); + +} diff --git a/lib/renderers/shaders/ShaderLib/background_vert.glsl b/lib/renderers/shaders/ShaderLib/background_vert.glsl new file mode 100644 index 0000000..19fd839 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/background_vert.glsl @@ -0,0 +1,10 @@ +varying vec2 vUv; + +void main() { + + vUv = uv; + + gl_Position = vec4( position, 1.0 ); + gl_Position.z = 1.0; + +} diff --git a/lib/renderers/shaders/ShaderLib/cube_frag.glsl b/lib/renderers/shaders/ShaderLib/cube_frag.glsl new file mode 100644 index 0000000..4b8a499 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/cube_frag.glsl @@ -0,0 +1,12 @@ +uniform samplerCube tCube; +uniform float tFlip; +uniform float opacity; + +varying vec3 vWorldDirection; + +void main() { + + gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) ); + gl_FragColor.a *= opacity; + +} diff --git a/lib/renderers/shaders/ShaderLib/cube_vert.glsl b/lib/renderers/shaders/ShaderLib/cube_vert.glsl new file mode 100644 index 0000000..86df047 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/cube_vert.glsl @@ -0,0 +1,14 @@ +varying vec3 vWorldDirection; + +#include + +void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + gl_Position.z = gl_Position.w; // set z to camera.far + +} diff --git a/lib/renderers/shaders/ShaderLib/depth_frag.glsl b/lib/renderers/shaders/ShaderLib/depth_frag.glsl new file mode 100644 index 0000000..d53113e --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/depth_frag.glsl @@ -0,0 +1,43 @@ +#if DEPTH_PACKING == 3200 + + uniform float opacity; + +#endif + +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( 1.0 ); + + #if DEPTH_PACKING == 3200 + + diffuseColor.a = opacity; + + #endif + + #include + #include + #include + + #include + + #if DEPTH_PACKING == 3200 + + gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity ); + + #elif DEPTH_PACKING == 3201 + + gl_FragColor = packDepthToRGBA( gl_FragCoord.z ); + + #endif + +} diff --git a/lib/renderers/shaders/ShaderLib/depth_vert.glsl b/lib/renderers/shaders/ShaderLib/depth_vert.glsl new file mode 100644 index 0000000..edf12fb --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/depth_vert.glsl @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + #include + + #ifdef USE_DISPLACEMENTMAP + + #include + #include + #include + + #endif + + #include + #include + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl b/lib/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl new file mode 100644 index 0000000..8dbf8f4 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl @@ -0,0 +1,31 @@ +#define DISTANCE + +uniform vec3 referencePosition; +uniform float nearDistance; +uniform float farDistance; +varying vec3 vWorldPosition; + +#include +#include +#include +#include +#include +#include + +void main () { + + #include + + vec4 diffuseColor = vec4( 1.0 ); + + #include + #include + #include + + float dist = length( vWorldPosition - referencePosition ); + dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); + dist = saturate( dist ); // clamp to [ 0, 1 ] + + gl_FragColor = packDepthToRGBA( dist ); + +} diff --git a/lib/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl b/lib/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl new file mode 100644 index 0000000..abecdef --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl @@ -0,0 +1,36 @@ +#define DISTANCE + +varying vec3 vWorldPosition; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + #include + + #ifdef USE_DISPLACEMENTMAP + + #include + #include + #include + + #endif + + #include + #include + #include + #include + #include + #include + #include + + vWorldPosition = worldPosition.xyz; + +} diff --git a/lib/renderers/shaders/ShaderLib/equirect_frag.glsl b/lib/renderers/shaders/ShaderLib/equirect_frag.glsl new file mode 100644 index 0000000..eaf2ff2 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/equirect_frag.glsl @@ -0,0 +1,19 @@ +uniform sampler2D tEquirect; + +varying vec3 vWorldDirection; + +#include + +void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV; + + sampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + + sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5; + + gl_FragColor = texture2D( tEquirect, sampleUV ); + +} diff --git a/lib/renderers/shaders/ShaderLib/equirect_vert.glsl b/lib/renderers/shaders/ShaderLib/equirect_vert.glsl new file mode 100644 index 0000000..da1dfcb --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/equirect_vert.glsl @@ -0,0 +1,12 @@ +varying vec3 vWorldDirection; + +#include + +void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/linedashed_frag.glsl b/lib/renderers/shaders/ShaderLib/linedashed_frag.glsl new file mode 100644 index 0000000..3c93173 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/linedashed_frag.glsl @@ -0,0 +1,40 @@ +uniform vec3 diffuse; +uniform float opacity; + +uniform float dashSize; +uniform float totalSize; + +varying float vLineDistance; + +#include +#include +#include +#include +#include + +void main() { + + #include + + if ( mod( vLineDistance, totalSize ) > dashSize ) { + + discard; + + } + + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + + outgoingLight = diffuseColor.rgb; // simple shader + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/linedashed_vert.glsl b/lib/renderers/shaders/ShaderLib/linedashed_vert.glsl new file mode 100644 index 0000000..5d7057d --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/linedashed_vert.glsl @@ -0,0 +1,25 @@ +uniform float scale; +attribute float lineDistance; + +varying float vLineDistance; + +#include +#include +#include +#include +#include + +void main() { + + #include + + vLineDistance = scale * lineDistance; + + vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); + gl_Position = projectionMatrix * mvPosition; + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshbasic_frag.glsl b/lib/renderers/shaders/ShaderLib/meshbasic_frag.glsl new file mode 100644 index 0000000..f0bc539 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshbasic_frag.glsl @@ -0,0 +1,66 @@ +uniform vec3 diffuse; +uniform float opacity; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + #include + #include + #include + #include + + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + + // accumulation (baked indirect lighting only) + #ifdef USE_LIGHTMAP + + reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity; + + #else + + reflectedLight.indirectDiffuse += vec3( 1.0 ); + + #endif + + // modulation + #include + + reflectedLight.indirectDiffuse *= diffuseColor.rgb; + + vec3 outgoingLight = reflectedLight.indirectDiffuse; + + #include + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshbasic_vert.glsl b/lib/renderers/shaders/ShaderLib/meshbasic_vert.glsl new file mode 100644 index 0000000..20f3c15 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshbasic_vert.glsl @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + #include + + #ifdef USE_ENVMAP + + #include + #include + #include + #include + + #endif + + #include + #include + #include + #include + #include + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshlambert_frag.glsl b/lib/renderers/shaders/ShaderLib/meshlambert_frag.glsl new file mode 100644 index 0000000..5f1c222 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshlambert_frag.glsl @@ -0,0 +1,84 @@ +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float opacity; + +varying vec3 vLightFront; + +#ifdef DOUBLE_SIDED + + varying vec3 vLightBack; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + + #include + #include + #include + #include + #include + #include + #include + + // accumulation + reflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor ); + + #include + + reflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ); + + #ifdef DOUBLE_SIDED + + reflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack; + + #else + + reflectedLight.directDiffuse = vLightFront; + + #endif + + reflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask(); + + // modulation + #include + + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; + + #include + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshlambert_vert.glsl b/lib/renderers/shaders/ShaderLib/meshlambert_vert.glsl new file mode 100644 index 0000000..77b2a61 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshlambert_vert.glsl @@ -0,0 +1,50 @@ +#define LAMBERT + +varying vec3 vLightFront; + +#ifdef DOUBLE_SIDED + + varying vec3 vLightBack; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + + #include + #include + #include + #include + #include + + #include + #include + #include + #include + #include + #include + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshmatcap_frag.glsl b/lib/renderers/shaders/ShaderLib/meshmatcap_frag.glsl new file mode 100644 index 0000000..a370091 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshmatcap_frag.glsl @@ -0,0 +1,57 @@ +#define MATCAP + +uniform vec3 diffuse; +uniform float opacity; +uniform sampler2D matcap; + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + #include + #include + #include + #include + + vec3 viewDir = normalize( vViewPosition ); + vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) ); + vec3 y = cross( viewDir, x ); + vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks + + vec4 matcapColor = texture2D( matcap, uv ); + + matcapColor = matcapTexelToLinear( matcapColor ); + + vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshmatcap_vert.glsl b/lib/renderers/shaders/ShaderLib/meshmatcap_vert.glsl new file mode 100644 index 0000000..04de25d --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshmatcap_vert.glsl @@ -0,0 +1,49 @@ +#define MATCAP + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include + +void main() { + + #include + + #include + #include + #include + #include + #include + + #ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + + #endif + + #include + #include + #include + #include + #include + + #include + #include + #include + + vViewPosition = - mvPosition.xyz; + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphong_frag.glsl b/lib/renderers/shaders/ShaderLib/meshphong_frag.glsl new file mode 100644 index 0000000..57c8239 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphong_frag.glsl @@ -0,0 +1,72 @@ +#define PHONG + +uniform vec3 diffuse; +uniform vec3 emissive; +uniform vec3 specular; +uniform float shininess; +uniform float opacity; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + + #include + #include + #include + #include + #include + #include + #include + #include + #include + + // accumulation + #include + #include + #include + #include + + // modulation + #include + + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; + + #include + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphong_vert.glsl b/lib/renderers/shaders/ShaderLib/meshphong_vert.glsl new file mode 100644 index 0000000..e79d5fe --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphong_vert.glsl @@ -0,0 +1,57 @@ +#define PHONG + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + + #include + #include + #include + #include + #include + +#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + +#endif + + #include + #include + #include + #include + #include + #include + #include + + vViewPosition = - mvPosition.xyz; + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphysical_frag.glsl b/lib/renderers/shaders/ShaderLib/meshphysical_frag.glsl new file mode 100644 index 0000000..a428ebd --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphysical_frag.glsl @@ -0,0 +1,86 @@ +#define PHYSICAL + +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float roughness; +uniform float metalness; +uniform float opacity; + +#ifndef STANDARD + uniform float clearCoat; + uniform float clearCoatRoughness; +#endif + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + // accumulation + #include + #include + #include + #include + + // modulation + #include + + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphysical_vert.glsl b/lib/renderers/shaders/ShaderLib/meshphysical_vert.glsl new file mode 100644 index 0000000..4dbc2d4 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphysical_vert.glsl @@ -0,0 +1,55 @@ +#define PHYSICAL + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + + #include + #include + #include + #include + #include + +#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + +#endif + + #include + #include + #include + #include + #include + #include + #include + + vViewPosition = - mvPosition.xyz; + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/normal_frag.glsl b/lib/renderers/shaders/ShaderLib/normal_frag.glsl new file mode 100644 index 0000000..88a2c43 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/normal_frag.glsl @@ -0,0 +1,31 @@ +#define NORMAL + +uniform float opacity; + +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) ) + + varying vec3 vViewPosition; + +#endif + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + + gl_FragColor = vec4( packNormalToRGB( normal ), opacity ); + +} diff --git a/lib/renderers/shaders/ShaderLib/normal_vert.glsl b/lib/renderers/shaders/ShaderLib/normal_vert.glsl new file mode 100644 index 0000000..131edc6 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/normal_vert.glsl @@ -0,0 +1,50 @@ +#define NORMAL + +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) ) + + varying vec3 vViewPosition; + +#endif + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include + +void main() { + + #include + + #include + #include + #include + #include + #include + +#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + +#endif + + #include + #include + #include + #include + #include + #include + +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) ) + + vViewPosition = - mvPosition.xyz; + +#endif + +} diff --git a/lib/renderers/shaders/ShaderLib/points_frag.glsl b/lib/renderers/shaders/ShaderLib/points_frag.glsl new file mode 100644 index 0000000..c891d0f --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/points_frag.glsl @@ -0,0 +1,32 @@ +uniform vec3 diffuse; +uniform float opacity; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + #include + #include + + outgoingLight = diffuseColor.rgb; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/points_vert.glsl b/lib/renderers/shaders/ShaderLib/points_vert.glsl new file mode 100644 index 0000000..9526b76 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/points_vert.glsl @@ -0,0 +1,33 @@ +uniform float size; +uniform float scale; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + #include + + gl_PointSize = size; + + #ifdef USE_SIZEATTENUATION + + bool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); + + if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z ); + + #endif + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/shadow_frag.glsl b/lib/renderers/shaders/ShaderLib/shadow_frag.glsl new file mode 100644 index 0000000..67ead61 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/shadow_frag.glsl @@ -0,0 +1,18 @@ +uniform vec3 color; +uniform float opacity; + +#include +#include +#include +#include +#include +#include +#include + +void main() { + + gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) ); + + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/shadow_vert.glsl b/lib/renderers/shaders/ShaderLib/shadow_vert.glsl new file mode 100644 index 0000000..82fe4dd --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/shadow_vert.glsl @@ -0,0 +1,12 @@ +#include +#include + +void main() { + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/sprite_frag.glsl b/lib/renderers/shaders/ShaderLib/sprite_frag.glsl new file mode 100644 index 0000000..5ca65b6 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/sprite_frag.glsl @@ -0,0 +1,30 @@ +uniform vec3 diffuse; +uniform float opacity; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + #include + + outgoingLight = diffuseColor.rgb; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/sprite_vert.glsl b/lib/renderers/shaders/ShaderLib/sprite_vert.glsl new file mode 100644 index 0000000..aeb3e51 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/sprite_vert.glsl @@ -0,0 +1,42 @@ +uniform float rotation; +uniform vec2 center; + +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 ); + + vec2 scale; + scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) ); + scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) ); + + #ifndef USE_SIZEATTENUATION + + bool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); + + if ( isPerspective ) scale *= - mvPosition.z; + + #endif + + vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale; + + vec2 rotatedPosition; + rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y; + rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y; + + mvPosition.xy += rotatedPosition; + + gl_Position = projectionMatrix * mvPosition; + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/UniformsLib.js b/lib/renderers/shaders/UniformsLib.js new file mode 100644 index 0000000..47b859b --- /dev/null +++ b/lib/renderers/shaders/UniformsLib.js @@ -0,0 +1,200 @@ +import { Color } from '../../math/Color.js'; +import { Vector2 } from '../../math/Vector2.js'; +import { Matrix3 } from '../../math/Matrix3.js'; + +/** + * Uniforms library for shared webgl shaders + */ + +var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + + alphaMap: { value: null }, + + }, + + specularmap: { + + specularMap: { value: null }, + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + }, + + sprite: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + center: { value: new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + } + +}; + +export { UniformsLib }; diff --git a/lib/renderers/shaders/UniformsUtils.js b/lib/renderers/shaders/UniformsUtils.js new file mode 100644 index 0000000..8e31adb --- /dev/null +++ b/lib/renderers/shaders/UniformsUtils.js @@ -0,0 +1,67 @@ +/** + * Uniform Utilities + */ + +var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + +}; + + +export { UniformsUtils }; diff --git a/lib/renderers/webgl/WebGLAnimation.js b/lib/renderers/webgl/WebGLAnimation.js new file mode 100644 index 0000000..3943d99 --- /dev/null +++ b/lib/renderers/webgl/WebGLAnimation.js @@ -0,0 +1,56 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLAnimation() { + + var context = null; + var isAnimating = false; + var animationLoop = null; + + function onAnimationFrame( time, frame ) { + + if ( isAnimating === false ) return; + + animationLoop( time, frame ); + + context.requestAnimationFrame( onAnimationFrame ); + + } + + return { + + start: function () { + + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; + + context.requestAnimationFrame( onAnimationFrame ); + + isAnimating = true; + + }, + + stop: function () { + + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + +} + +export { WebGLAnimation }; diff --git a/lib/renderers/webgl/WebGLAttributes.js b/lib/renderers/webgl/WebGLAttributes.js new file mode 100644 index 0000000..586ef58 --- /dev/null +++ b/lib/renderers/webgl/WebGLAttributes.js @@ -0,0 +1,155 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLAttributes( gl ) { + + var buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = gl.FLOAT; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); + + } else if ( array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, gl.STATIC_DRAW ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = - 1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + +} + + +export { WebGLAttributes }; diff --git a/lib/renderers/webgl/WebGLBackground.js b/lib/renderers/webgl/WebGLBackground.js new file mode 100644 index 0000000..9f7dcb5 --- /dev/null +++ b/lib/renderers/webgl/WebGLBackground.js @@ -0,0 +1,149 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { BackSide, FrontSide } from '../../constants.js'; +import { BoxBufferGeometry } from '../../geometries/BoxGeometry.js'; +import { PlaneBufferGeometry } from '../../geometries/PlaneGeometry.js'; +import { ShaderMaterial } from '../../materials/ShaderMaterial.js'; +import { Color } from '../../math/Color.js'; +import { Mesh } from '../../objects/Mesh.js'; +import { ShaderLib } from '../shaders/ShaderLib.js'; +import { UniformsUtils } from '../shaders/UniformsUtils.js'; + +function WebGLBackground( renderer, state, objects, premultipliedAlpha ) { + + var clearColor = new Color( 0x000000 ); + var clearAlpha = 0; + + var planeMesh; + var boxMesh; + + function render( renderList, scene, camera, forceClear ) { + + var background = scene.background; + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && ( background.isCubeTexture || background.isWebGLRenderTargetCube ) ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxBufferGeometry( 1, 1, 1 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ), + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.removeAttribute( 'normal' ); + boxMesh.geometry.removeAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + objects.update( boxMesh ); + + } + + boxMesh.material.uniforms.tCube.value = ( background.isWebGLRenderTargetCube ) ? background.texture : background; + boxMesh.material.uniforms.tFlip.value = ( background.isWebGLRenderTargetCube ) ? 1 : - 1; + + // push to the pre-sorted opaque render list + renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + planeMesh.geometry.removeAttribute( 'normal' ); + + objects.update( planeMesh ); + + } + + planeMesh.material.uniforms.t2D.value = background; + + // push to the pre-sorted opaque render list + renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha ) { + + clearColor.set( color ); + clearAlpha = alpha !== undefined ? alpha : 1; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + +} + + +export { WebGLBackground }; diff --git a/lib/renderers/webgl/WebGLBufferRenderer.js b/lib/renderers/webgl/WebGLBufferRenderer.js new file mode 100644 index 0000000..2978c56 --- /dev/null +++ b/lib/renderers/webgl/WebGLBufferRenderer.js @@ -0,0 +1,59 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawArraysInstanced' : 'drawArraysInstancedANGLE' ]( mode, start, count, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + +} + + +export { WebGLBufferRenderer }; diff --git a/lib/renderers/webgl/WebGLCapabilities.js b/lib/renderers/webgl/WebGLCapabilities.js new file mode 100644 index 0000000..ccb3624 --- /dev/null +++ b/lib/renderers/webgl/WebGLCapabilities.js @@ -0,0 +1,116 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext; + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + isWebGL2: isWebGL2, + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + +} + + +export { WebGLCapabilities }; diff --git a/lib/renderers/webgl/WebGLClipping.js b/lib/renderers/webgl/WebGLClipping.js new file mode 100644 index 0000000..9107fbc --- /dev/null +++ b/lib/renderers/webgl/WebGLClipping.js @@ -0,0 +1,164 @@ +/** + * @author tschw + */ + +import { Matrix3 } from '../../math/Matrix3.js'; +import { Plane } from '../../math/Plane.js'; + +function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + +} + + +export { WebGLClipping }; diff --git a/lib/renderers/webgl/WebGLExtensions.js b/lib/renderers/webgl/WebGLExtensions.js new file mode 100644 index 0000000..bff3fd8 --- /dev/null +++ b/lib/renderers/webgl/WebGLExtensions.js @@ -0,0 +1,61 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + +} + + +export { WebGLExtensions }; diff --git a/lib/renderers/webgl/WebGLGeometries.js b/lib/renderers/webgl/WebGLGeometries.js new file mode 100644 index 0000000..8ef204e --- /dev/null +++ b/lib/renderers/webgl/WebGLGeometries.js @@ -0,0 +1,184 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js'; +import { BufferGeometry } from '../../core/BufferGeometry.js'; +import { arrayMax } from '../../utils.js'; + +function WebGLGeometries( gl, attributes, info ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + var attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + +} + + +export { WebGLGeometries }; diff --git a/lib/renderers/webgl/WebGLIndexedBufferRenderer.js b/lib/renderers/webgl/WebGLIndexedBufferRenderer.js new file mode 100644 index 0000000..c23f2e3 --- /dev/null +++ b/lib/renderers/webgl/WebGLIndexedBufferRenderer.js @@ -0,0 +1,69 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawElementsInstanced' : 'drawElementsInstancedANGLE' ]( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + +} + + +export { WebGLIndexedBufferRenderer }; diff --git a/lib/renderers/webgl/WebGLInfo.js b/lib/renderers/webgl/WebGLInfo.js new file mode 100644 index 0000000..de30b40 --- /dev/null +++ b/lib/renderers/webgl/WebGLInfo.js @@ -0,0 +1,83 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + */ + +function WebGLInfo( gl ) { + + var memory = { + geometries: 0, + textures: 0 + }; + + var render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + instanceCount = instanceCount || 1; + + render.calls ++; + + switch ( mode ) { + + case gl.TRIANGLES: + render.triangles += instanceCount * ( count / 3 ); + break; + + case gl.TRIANGLE_STRIP: + case gl.TRIANGLE_FAN: + render.triangles += instanceCount * ( count - 2 ); + break; + + case gl.LINES: + render.lines += instanceCount * ( count / 2 ); + break; + + case gl.LINE_STRIP: + render.lines += instanceCount * ( count - 1 ); + break; + + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + + case gl.POINTS: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + +} + + +export { WebGLInfo }; diff --git a/lib/renderers/webgl/WebGLLights.js b/lib/renderers/webgl/WebGLLights.js new file mode 100644 index 0000000..80e0ee0 --- /dev/null +++ b/lib/renderers/webgl/WebGLLights.js @@ -0,0 +1,345 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Color } from '../../math/Color.js'; +import { Matrix4 } from '../../math/Matrix4.js'; +import { Vector2 } from '../../math/Vector2.js'; +import { Vector3 } from '../../math/Vector3.js'; + +function UniformsCache() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + +var count = 0; + +function WebGLLights() { + + var cache = new UniformsCache(); + + var state = { + + id: count ++, + + hash: { + stateID: - 1, + directionalLength: - 1, + pointLength: - 1, + spotLength: - 1, + rectAreaLength: - 1, + hemiLength: - 1, + shadowsLength: - 1 + }, + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + var vector3 = new Vector3(); + var matrix4 = new Matrix4(); + var matrix42 = new Matrix4(); + + function setup( lights, shadows, camera ) { + + var r = 0, g = 0, b = 0; + + var directionalLength = 0; + var pointLength = 0; + var spotLength = 0; + var rectAreaLength = 0; + var hemiLength = 0; + + var viewMatrix = camera.matrixWorldInverse; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + var color = light.color; + var intensity = light.intensity; + var distance = light.distance; + + var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + uniforms.shadowCameraNear = shadow.camera.near; + uniforms.shadowCameraFar = shadow.camera.far; + + } + + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = cache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.hash.stateID = state.id; + state.hash.directionalLength = directionalLength; + state.hash.pointLength = pointLength; + state.hash.spotLength = spotLength; + state.hash.rectAreaLength = rectAreaLength; + state.hash.hemiLength = hemiLength; + state.hash.shadowsLength = shadows.length; + + } + + return { + setup: setup, + state: state + }; + +} + + +export { WebGLLights }; diff --git a/lib/renderers/webgl/WebGLMorphtargets.js b/lib/renderers/webgl/WebGLMorphtargets.js new file mode 100644 index 0000000..8a2ae10 --- /dev/null +++ b/lib/renderers/webgl/WebGLMorphtargets.js @@ -0,0 +1,111 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + +} + +function WebGLMorphtargets( gl ) { + + var influencesList = {}; + var morphInfluences = new Float32Array( 8 ); + + function update( object, geometry, material, program ) { + + var objectInfluences = object.morphTargetInfluences; + + var length = objectInfluences.length; + + var influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + var morphTargets = material.morphTargets && geometry.morphAttributes.position; + var morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + // Remove current morphAttributes + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + if ( influence[ 1 ] !== 0 ) { + + if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i ); + if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + // Collect influences + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + // Add morphAttributes + + for ( var i = 0; i < 8; i ++ ) { + + var influence = influences[ i ]; + + if ( influence ) { + + var index = influence[ 0 ]; + var value = influence[ 1 ]; + + if ( value ) { + + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + morphInfluences[ i ] = value; + continue; + + } + + } + + morphInfluences[ i ] = 0; + + } + + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + }; + +} + + +export { WebGLMorphtargets }; diff --git a/lib/renderers/webgl/WebGLObjects.js b/lib/renderers/webgl/WebGLObjects.js new file mode 100644 index 0000000..8a2528e --- /dev/null +++ b/lib/renderers/webgl/WebGLObjects.js @@ -0,0 +1,52 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLObjects( geometries, info ) { + + var updateList = {}; + + function update( object ) { + + var frame = info.render.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function dispose() { + + updateList = {}; + + } + + return { + + update: update, + dispose: dispose + + }; + +} + + +export { WebGLObjects }; diff --git a/lib/renderers/webgl/WebGLProgram.js b/lib/renderers/webgl/WebGLProgram.js new file mode 100644 index 0000000..9f06a15 --- /dev/null +++ b/lib/renderers/webgl/WebGLProgram.js @@ -0,0 +1,730 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { WebGLUniforms } from './WebGLUniforms.js'; +import { WebGLShader } from './WebGLShader.js'; +import { ShaderChunk } from '../shaders/ShaderChunk.js'; +import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, EquirectangularRefractionMapping, CubeRefractionMapping, SphericalReflectionMapping, EquirectangularReflectionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, CineonToneMapping, Uncharted2ToneMapping, ReinhardToneMapping, LinearToneMapping, GammaEncoding, RGBDEncoding, RGBM16Encoding, RGBM7Encoding, RGBEEncoding, sRGBEncoding, LinearEncoding } from '../../constants.js'; + +var programIdCount = 0; + +function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + +} + +function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + +} + +function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + +} + +function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case Uncharted2ToneMapping: + toneMappingName = 'Uncharted2'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + +} + +function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || ( parameters.normalMap && ! parameters.objectSpaceNormalMap ) || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + +} + +function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + +} + +function fetchAttributeLocations( gl, program ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + +} + +function filterEmptyLine( string ) { + + return string !== ''; + +} + +function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + +} + +function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + +} + +function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + +} + +function unrollLoops( string ) { + + var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + +} + +function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = shader.vertexShader; + var fragmentShader = shader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && ( capabilities.isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.matcapEncoding || 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 + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.matcapEncoding ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '', + + parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( capabilities.isWebGL2 && ! material.isRawShaderMaterial ) { + + var isGLSL3ShaderMaterial = false; + + var versionRegex = /^\s*#version\s+300\s+es\s*\n/; + + if ( material.isShaderMaterial && + vertexShader.match( versionRegex ) !== null && + fragmentShader.match( versionRegex ) !== null ) { + + isGLSL3ShaderMaterial = true; + + vertexShader = vertexShader.replace( versionRegex, '' ); + fragmentShader = fragmentShader.replace( versionRegex, '' ); + + } + + // GLSL 3.0 conversion + prefixVertex = [ + '#version 300 es\n', + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + '#version 300 es\n', + '#define varying in', + isGLSL3ShaderMaterial ? '' : 'out highp vec4 pc_fragColor;', + isGLSL3ShaderMaterial ? '' : '#define gl_FragColor pc_fragColor', + '#define gl_FragDepthEXT gl_FragDepth', + '#define texture2D texture', + '#define textureCube texture', + '#define texture2DProj textureProj', + '#define texture2DLodEXT textureLod', + '#define texture2DProjLodEXT textureProjLod', + '#define textureCubeLodEXT textureLod', + '#define texture2DGradEXT textureGrad', + '#define texture2DProjGradEXT textureProjGrad', + '#define textureCubeGradEXT textureGrad' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ).trim(); + var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.name = shader.name; + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + +} + +export { WebGLProgram }; diff --git a/lib/renderers/webgl/WebGLPrograms.js b/lib/renderers/webgl/WebGLPrograms.js new file mode 100644 index 0000000..daf4152 --- /dev/null +++ b/lib/renderers/webgl/WebGLPrograms.js @@ -0,0 +1,312 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, GammaEncoding, LinearEncoding, ObjectSpaceNormalMap } from '../../constants.js'; +import { WebGLProgram } from './WebGLProgram.js'; + +function WebGLPrograms( renderer, extensions, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "matcapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "objectSpaceNormalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = capabilities.precision; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + matcap: !! material.matcap, + matcapEncoding: getTextureEncodingFromMap( material.matcap, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( material.onBeforeCompile.toString() ); + + array.push( renderer.gammaOutput ); + + array.push( renderer.gammaFactor ); + + return array.join(); + + }; + + this.acquireProgram = function ( material, shader, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + +} + + +export { WebGLPrograms }; diff --git a/lib/renderers/webgl/WebGLProperties.js b/lib/renderers/webgl/WebGLProperties.js new file mode 100644 index 0000000..e875912 --- /dev/null +++ b/lib/renderers/webgl/WebGLProperties.js @@ -0,0 +1,52 @@ +/** + * @author fordacious / fordacious.github.io + */ + +function WebGLProperties() { + + var properties = new WeakMap(); + + function get( object ) { + + var map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + +} + + +export { WebGLProperties }; diff --git a/lib/renderers/webgl/WebGLRenderLists.js b/lib/renderers/webgl/WebGLRenderLists.js new file mode 100644 index 0000000..76656dd --- /dev/null +++ b/lib/renderers/webgl/WebGLRenderLists.js @@ -0,0 +1,161 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + +} + +function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + +} + + +function WebGLRenderList() { + + var renderItems = []; + var renderItemsIndex = 0; + + var opaque = []; + var transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transparent.length = 0; + + } + + function push( object, geometry, material, z, group ) { + + var renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + + ( material.transparent === true ? transparent : opaque ).push( renderItem ); + + renderItemsIndex ++; + + } + + function sort() { + + if ( opaque.length > 1 ) opaque.sort( painterSortStable ); + if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + + sort: sort + }; + +} + +function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + +} + + +export { WebGLRenderLists }; diff --git a/lib/renderers/webgl/WebGLRenderStates.js b/lib/renderers/webgl/WebGLRenderStates.js new file mode 100644 index 0000000..dc90f63 --- /dev/null +++ b/lib/renderers/webgl/WebGLRenderStates.js @@ -0,0 +1,104 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { WebGLLights } from './WebGLLights.js'; + +function WebGLRenderState() { + + var lights = new WebGLLights(); + + var lightsArray = []; + var shadowsArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights( camera ) { + + lights.setup( lightsArray, shadowsArray, camera ); + + } + + var state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + + pushLight: pushLight, + pushShadow: pushShadow + }; + +} + +function WebGLRenderStates() { + + var renderStates = {}; + + function get( scene, camera ) { + + var renderState; + + if ( renderStates[ scene.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ] = {}; + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + if ( renderStates[ scene.id ][ camera.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + renderState = renderStates[ scene.id ][ camera.id ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = {}; + + } + + return { + get: get, + dispose: dispose + }; + +} + + +export { WebGLRenderStates }; diff --git a/lib/renderers/webgl/WebGLShader.js b/lib/renderers/webgl/WebGLShader.js new file mode 100644 index 0000000..ca2a0d9 --- /dev/null +++ b/lib/renderers/webgl/WebGLShader.js @@ -0,0 +1,46 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + +} + +function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + +} + + +export { WebGLShader }; diff --git a/lib/renderers/webgl/WebGLShadowMap.js b/lib/renderers/webgl/WebGLShadowMap.js new file mode 100644 index 0000000..6c14464 --- /dev/null +++ b/lib/renderers/webgl/WebGLShadowMap.js @@ -0,0 +1,430 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { FrontSide, BackSide, DoubleSide, RGBAFormat, NearestFilter, PCFShadowMap, RGBADepthPacking } from '../../constants.js'; +import { WebGLRenderTarget } from '../WebGLRenderTarget.js'; +import { MeshDepthMaterial } from '../../materials/MeshDepthMaterial.js'; +import { MeshDistanceMaterial } from '../../materials/MeshDistanceMaterial.js'; +import { Vector4 } from '../../math/Vector4.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { Vector2 } from '../../math/Vector2.js'; +import { Matrix4 } from '../../math/Matrix4.js'; +import { Frustum } from '../../math/Frustum.js'; + +function WebGLShadowMap( _renderer, _objects, maxTextureSize ) { + + var _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new MeshDepthMaterial( { + + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _depthMaterials[ i ] = depthMaterial; + + // + + var distanceMaterial = new MeshDistanceMaterial( { + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + // TODO Clean up (needed in case of contextlost) + var _gl = _renderer.context; + var _state = _renderer.state; + + // Set GL state for depth map. + _state.disable( _gl.BLEND ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + var shadow = light.shadow; + var isPointLight = light && light.isPointLight; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( isPointLight ) { + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + if ( isPointLight ) { + + faceCount = 6; + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ]; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.isMeshDistanceMaterial ) { + + result.referencePosition.copy( lightPositionWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + +} + + +export { WebGLShadowMap }; diff --git a/lib/renderers/webgl/WebGLState.js b/lib/renderers/webgl/WebGLState.js new file mode 100644 index 0000000..9181de3 --- /dev/null +++ b/lib/renderers/webgl/WebGLState.js @@ -0,0 +1,978 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceFront, CullFaceBack, CullFaceNone, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NoBlending, NormalBlending, AddEquation, DoubleSide, BackSide } from '../../constants.js'; +import { Vector4 } from '../../math/Vector4.js'; + +function WebGLState( gl, extensions, utils, capabilities ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4( 0, 0, 0, 0 ); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var enabledCapabilities = {}; + + var compressedTextureFormats = null; + + var currentProgram = null; + + var currentBlendingEnabled = null; + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ); + + var lineWidthAvailable = false; + var version = 0; + var glVersion = gl.getParameter( gl.VERSION ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + setBlending( NoBlending ); + + // + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' ); + + extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) || + extensions.get( 'WEBGL_compressed_texture_astc' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled ) { + + disable( gl.BLEND ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( ! currentBlendingEnabled ) { + + enable( gl.BLEND ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( gl.FUNC_ADD ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.ONE, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + break; + + case MultiplyBlending: + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = null; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + var flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + enabledCapabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentProgram = null; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + +} + + +export { WebGLState }; diff --git a/lib/renderers/webgl/WebGLTextures.js b/lib/renderers/webgl/WebGLTextures.js new file mode 100644 index 0000000..c7a8603 --- /dev/null +++ b/lib/renderers/webgl/WebGLTextures.js @@ -0,0 +1,948 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { LinearFilter, NearestFilter, RGBFormat, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, ClampToEdgeWrapping, NearestMipMapLinearFilter, NearestMipMapNearestFilter } from '../../constants.js'; +import { _Math } from '../../math/Math.js'; + +function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + var _videoTextures = {}; + var _canvas; + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + return; + + } + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) { + + if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + + _canvas.width = _Math.floorPowerOfTwo( image.width ); + _canvas.height = _Math.floorPowerOfTwo( image.height ); + + var context = _canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, _canvas.width, _canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height ); + + return _canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( capabilities.isWebGL2 ) return false; + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) { + + return texture.generateMipmaps && isPowerOfTwo && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height ) { + + _gl.generateMipmap( target ); + + var textureProperties = properties.get( texture ); + + // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 + textureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E; + + } + + function getInternalFormat( glFormat, glType ) { + + if ( ! capabilities.isWebGL2 ) return glFormat; + + if ( glFormat === _gl.RED ) { + + if ( glType === _gl.FLOAT ) return _gl.R32F; + if ( glType === _gl.HALF_FLOAT ) return _gl.R16F; + if ( glType === _gl.UNSIGNED_BYTE ) return _gl.R8; + + } + + if ( glFormat === _gl.RGB ) { + + if ( glType === _gl.FLOAT ) return _gl.RGB32F; + if ( glType === _gl.HALF_FLOAT ) return _gl.RGB16F; + if ( glType === _gl.UNSIGNED_BYTE ) return _gl.RGB8; + + } + + if ( glFormat === _gl.RGBA ) { + + if ( glType === _gl.FLOAT ) return _gl.RGBA32F; + if ( glType === _gl.HALF_FLOAT ) return _gl.RGBA16F; + if ( glType === _gl.UNSIGNED_BYTE ) return _gl.RGBA8; + + } + + return glFormat; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + delete _videoTextures[ texture.id ]; + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + info.memory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTexture3D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture ); + + } + + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( ! isCompressed ) { + + textureProperties.__maxMipLevel = 0; + + } else { + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + // We assume images for cube map have the same size. + generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + var textureType; + + if ( texture.isDataTexture3D ) { + + textureType = _gl.TEXTURE_3D; + + } else { + + textureType = _gl.TEXTURE_2D; + + } + + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + state.activeTexture( _gl.TEXTURE0 + slot ); + + + state.bindTexture( textureType, textureProperties.__webglTexture ); + + + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( textureType, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + glInternalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( ! capabilities.isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' ); + glInternalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( capabilities.isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + glInternalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + glInternalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else if ( texture.isDataTexture3D ) { + + state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + generateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = utils.convert( renderTarget.texture.format ); + var glType = utils.convert( renderTarget.texture.type ); + var glInternalFormat = getInternalFormat( glFormat, glType ); + state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) { + + var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.bindTexture( target, null ); + + } + + } + + function updateVideoTexture( texture ) { + + var id = texture.id; + var frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures[ id ] !== frame ) { + + _videoTextures[ id ] = frame; + texture.update(); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + +} + + +export { WebGLTextures }; diff --git a/lib/renderers/webgl/WebGLUniforms.js b/lib/renderers/webgl/WebGLUniforms.js new file mode 100644 index 0000000..4bdd1bd --- /dev/null +++ b/lib/renderers/webgl/WebGLUniforms.js @@ -0,0 +1,876 @@ +/** + * @author tschw + * @author Mugen87 / https://github.com/Mugen87 + * @author mrdoob / http://mrdoob.com/ + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + +import { CubeTexture } from '../../textures/CubeTexture.js'; +import { Texture } from '../../textures/Texture.js'; +import { DataTexture3D } from '../../textures/DataTexture3D.js'; + +var emptyTexture = new Texture(); +var emptyTexture3d = new DataTexture3D(); +var emptyCubeTexture = new CubeTexture(); + +// --- Base for inner nodes (including the root) --- + +function UniformContainer() { + + this.seq = []; + this.map = {}; + +} + +// --- Utilities --- + +// Array Caches (provide typed arrays for temporary by size) + +var arrayCacheF32 = []; +var arrayCacheI32 = []; + +// Float32Array caches used for uploading Matrix uniforms + +var mat4array = new Float32Array( 16 ); +var mat3array = new Float32Array( 9 ); +var mat2array = new Float32Array( 4 ); + +// Flattening for arrays of vectors and matrices + +function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + +} + +function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( var i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + +} + +function copyArray( a, b ) { + + for ( var i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + +} + +// Texture unit allocation + +function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + +} + +// --- Setters --- + +// Note: Defining these methods externally, because they come in a bunch +// and this way their names minify. + +// Single scalar + +function setValue1f( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + +} + +function setValue1i( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single float vector (from flat array or THREE.VectorN) + +function setValue2fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValue3fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValue4fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +// Single matrix (from flat array or MatrixN) + +function setValue2fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + +} + +function setValue3fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + +} + +function setValue4fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + +} + +// Single texture (2D / Cube) + +function setValueT1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture2D( v || emptyTexture, unit ); + +} + +function setValueT3D1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture3D( v || emptyTexture3d, unit ); + +} + +function setValueT6( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTextureCube( v || emptyCubeTexture, unit ); + +} + +// Integer / Boolean vectors or arrays thereof (always flat arrays) + +function setValue2iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValue3iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValue4iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + +} + +// Helper to pick the right setter for the singular case + +function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8B5F: return setValueT3D1; // SAMPLER_3D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + +} + +// Array of scalars + +function setValue1fv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1fv( this.addr, v ); + + copyArray( cache, v ); + +} +function setValue1iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1iv( this.addr, v ); + + copyArray( cache, v ); + +} + +// Array of vectors (flat or from THREE classes) + +function setValueV2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 2 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform2fv( this.addr, data ); + + this.updateCache( data ); + +} + +function setValueV3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 3 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform3fv( this.addr, data ); + + this.updateCache( data ); + +} + +function setValueV4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform4fv( this.addr, data ); + + this.updateCache( data ); + +} + +// Array of matrices (flat or from THREE clases) + +function setValueM2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix2fv( this.addr, false, data ); + + this.updateCache( data ); + +} + +function setValueM3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 9 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix3fv( this.addr, false, data ); + + this.updateCache( data ); + +} + +function setValueM4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 16 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix4fv( this.addr, false, data ); + + this.updateCache( data ); + +} + +// Array of textures (2D / Cube) + +function setValueT1a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + +} + +function setValueT6a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + +} + +// Helper to pick the right setter for a pure (bottom-level) array + +function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + +} + +// --- Uniform Classes --- + +function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + +} + +function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + +} + +PureArrayUniform.prototype.updateCache = function ( data ) { + + var cache = this.cache; + + if ( data instanceof Float32Array && cache.length !== data.length ) { + + this.cache = new Float32Array( data.length ); + + } + + copyArray( cache, data ); + +}; + +function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + +} + +StructuredUniform.prototype.setValue = function ( gl, value, renderer ) { + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ], renderer ); + + } + +}; + +// --- Top-level --- + +// Parser - builds up the property tree from the path strings + +var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + +// extracts +// - the identifier (member name or array index) +// - followed by an optional right bracket (found when array index) +// - followed by an optional left bracket or dot (type of subscript) +// +// Note: These portions can be read in a non-overlapping fashion and +// allow straightforward parsing of the hierarchy that WebGL encodes +// in the uniform names. + +function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + +} + +function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + +} + +// Root Container + +function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + +} + +WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + +}; + +WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + +}; + + +// Static interface + +WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + +}; + +WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + +}; + +export { WebGLUniforms }; diff --git a/lib/renderers/webgl/WebGLUtils.js b/lib/renderers/webgl/WebGLUtils.js new file mode 100644 index 0000000..ad85324 --- /dev/null +++ b/lib/renderers/webgl/WebGLUtils.js @@ -0,0 +1,168 @@ +/** + * @author thespite / http://www.twitter.com/thespite + */ + +import { MaxEquation, MinEquation, 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, RGB_ETC1_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, SrcAlphaSaturateFactor, OneMinusDstColorFactor, DstColorFactor, OneMinusDstAlphaFactor, DstAlphaFactor, OneMinusSrcAlphaFactor, SrcAlphaFactor, OneMinusSrcColorFactor, SrcColorFactor, OneFactor, ZeroFactor, ReverseSubtractEquation, SubtractEquation, AddEquation, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RedFormat, RGBAFormat, RGBFormat, AlphaFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort565Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestFilter, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping } from '../../constants.js'; + +function WebGLUtils( gl, extensions, capabilities ) { + + function convert( p ) { + + var extension; + + if ( p === RepeatWrapping ) return gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return gl.BYTE; + if ( p === ShortType ) return gl.SHORT; + if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT; + if ( p === IntType ) return gl.INT; + if ( p === UnsignedIntType ) return gl.UNSIGNED_INT; + if ( p === FloatType ) return gl.FLOAT; + + if ( p === HalfFloatType ) { + + if ( capabilities.isWebGL2 ) return gl.HALF_FLOAT; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return gl.ALPHA; + if ( p === RGBFormat ) return gl.RGB; + if ( p === RGBAFormat ) return gl.RGBA; + if ( p === LuminanceFormat ) return gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL; + if ( p === RedFormat ) return gl.RED; + + if ( p === AddEquation ) return gl.FUNC_ADD; + if ( p === SubtractEquation ) return gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return gl.ZERO; + if ( p === OneFactor ) return gl.ONE; + if ( p === SrcColorFactor ) return gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + return p; + + } + + } + + if ( p === MinEquation || p === MaxEquation ) { + + if ( capabilities.isWebGL2 ) { + + if ( p === MinEquation ) return gl.MIN; + if ( p === MaxEquation ) return gl.MAX; + + } + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + if ( capabilities.isWebGL2 ) return gl.UNSIGNED_INT_24_8; + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + return { convert: convert }; + +} + + +export { WebGLUtils }; diff --git a/lib/renderers/webvr/WebVRManager.js b/lib/renderers/webvr/WebVRManager.js new file mode 100644 index 0000000..9dc0028 --- /dev/null +++ b/lib/renderers/webvr/WebVRManager.js @@ -0,0 +1,401 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Group } from '../../objects/Group.js'; +import { Matrix4 } from '../../math/Matrix4.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { Vector4 } from '../../math/Vector4.js'; +import { Quaternion } from '../../math/Quaternion.js'; +import { ArrayCamera } from '../../cameras/ArrayCamera.js'; +import { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js'; +import { WebGLAnimation } from '../webgl/WebGLAnimation.js'; +import { setProjectionFromUnion } from './WebVRUtils.js'; + +function WebVRManager( renderer ) { + + var scope = this; + + var device = null; + var frameData = null; + + var poseTarget = null; + + var controllers = []; + var standingMatrix = new Matrix4(); + var standingMatrixInverse = new Matrix4(); + + var framebufferScaleFactor = 1.0; + + var frameOfReferenceType = 'stage'; + + if ( typeof window !== 'undefined' && 'VRFrameData' in window ) { + + frameData = new window.VRFrameData(); + window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false ); + + } + + var matrixWorldInverse = new Matrix4(); + var tempQuaternion = new Quaternion(); + var tempPosition = new Vector3(); + + var cameraL = new PerspectiveCamera(); + cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 ); + cameraL.layers.enable( 1 ); + + var cameraR = new PerspectiveCamera(); + cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 ); + cameraR.layers.enable( 2 ); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + function isPresenting() { + + return device !== null && device.isPresenting === true; + + } + + var currentSize, currentPixelRatio; + + function onVRDisplayPresentChange() { + + if ( isPresenting() ) { + + var eyeParameters = device.getEyeParameters( 'left' ); + var renderWidth = eyeParameters.renderWidth * framebufferScaleFactor; + var renderHeight = eyeParameters.renderHeight * framebufferScaleFactor; + + currentPixelRatio = renderer.getPixelRatio(); + currentSize = renderer.getSize(); + + renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 ); + + animation.start(); + + } else { + + if ( scope.enabled ) { + + renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio ); + + } + + animation.stop(); + + } + + } + + // + + var triggers = []; + + function findGamepad( id ) { + + var gamepads = navigator.getGamepads && navigator.getGamepads(); + + for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) { + + var gamepad = gamepads[ i ]; + + if ( gamepad && ( gamepad.id === 'Daydream Controller' || + gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' || + gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) || + gamepad.id.startsWith( 'Spatial Controller' ) ) ) { + + if ( j === id ) return gamepad; + + j ++; + + } + + } + + } + + function updateControllers() { + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var gamepad = findGamepad( i ); + + if ( gamepad !== undefined && gamepad.pose !== undefined ) { + + if ( gamepad.pose === null ) return; + + // Pose + + var pose = gamepad.pose; + + if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 ); + + if ( pose.position !== null ) controller.position.fromArray( pose.position ); + if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation ); + controller.matrix.compose( controller.position, controller.quaternion, controller.scale ); + controller.matrix.premultiply( standingMatrix ); + controller.matrix.decompose( controller.position, controller.quaternion, controller.scale ); + controller.matrixWorldNeedsUpdate = true; + controller.visible = true; + + // Trigger + + var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1; + + if ( triggers[ i ] !== gamepad.buttons[ buttonId ].pressed ) { + + triggers[ i ] = gamepad.buttons[ buttonId ].pressed; + + if ( triggers[ i ] === true ) { + + controller.dispatchEvent( { type: 'selectstart' } ); + + } else { + + controller.dispatchEvent( { type: 'selectend' } ); + controller.dispatchEvent( { type: 'select' } ); + + } + + } + + } else { + + controller.visible = false; + + } + + } + + } + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + + animation.setContext( value ); + + }; + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setPoseTarget = function ( object ) { + + if ( object !== undefined ) poseTarget = object; + + }; + + this.getCamera = function ( camera ) { + + var userHeight = frameOfReferenceType === 'stage' ? 1.6 : 0; + + if ( device === null ) { + + camera.position.set( 0, userHeight, 0 ); + return camera; + + } + + device.depthNear = camera.near; + device.depthFar = camera.far; + + device.getFrameData( frameData ); + + // + + if ( frameOfReferenceType === 'stage' ) { + + var stageParameters = device.stageParameters; + + if ( stageParameters ) { + + standingMatrix.fromArray( stageParameters.sittingToStandingTransform ); + + } else { + + standingMatrix.makeTranslation( 0, userHeight, 0 ); + + } + + } + + + var pose = frameData.pose; + var poseObject = poseTarget !== null ? poseTarget : camera; + + // We want to manipulate poseObject by its position and quaternion components since users may rely on them. + poseObject.matrix.copy( standingMatrix ); + poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale ); + + if ( pose.orientation !== null ) { + + tempQuaternion.fromArray( pose.orientation ); + poseObject.quaternion.multiply( tempQuaternion ); + + } + + if ( pose.position !== null ) { + + tempQuaternion.setFromRotationMatrix( standingMatrix ); + tempPosition.fromArray( pose.position ); + tempPosition.applyQuaternion( tempQuaternion ); + poseObject.position.add( tempPosition ); + + } + + poseObject.updateMatrixWorld(); + + if ( device.isPresenting === false ) return camera; + + // + + cameraL.near = camera.near; + cameraR.near = camera.near; + + cameraL.far = camera.far; + cameraR.far = camera.far; + + cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix ); + cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix ); + + // TODO (mrdoob) Double check this code + + standingMatrixInverse.getInverse( standingMatrix ); + + if ( frameOfReferenceType === 'stage' ) { + + cameraL.matrixWorldInverse.multiply( standingMatrixInverse ); + cameraR.matrixWorldInverse.multiply( standingMatrixInverse ); + + } + + var parent = poseObject.parent; + + if ( parent !== null ) { + + matrixWorldInverse.getInverse( parent.matrixWorld ); + + cameraL.matrixWorldInverse.multiply( matrixWorldInverse ); + cameraR.matrixWorldInverse.multiply( matrixWorldInverse ); + + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse ); + cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse ); + + cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix ); + cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix ); + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + // + + var layers = device.getLayers(); + + if ( layers.length ) { + + var layer = layers[ 0 ]; + + if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) { + + cameraL.bounds.fromArray( layer.leftBounds ); + + } + + if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) { + + cameraR.bounds.fromArray( layer.rightBounds ); + + } + + } + + updateControllers(); + + return cameraVR; + + }; + + this.getStandingMatrix = function () { + + return standingMatrix; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var animation = new WebGLAnimation(); + + this.setAnimationLoop = function ( callback ) { + + animation.setAnimationLoop( callback ); + + }; + + this.submitFrame = function () { + + if ( isPresenting() ) device.submitFrame(); + + }; + + this.dispose = function () { + + if ( typeof window !== 'undefined' ) { + + window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange ); + + } + + }; + +} + +export { WebVRManager }; diff --git a/lib/renderers/webvr/WebVRUtils.js b/lib/renderers/webvr/WebVRUtils.js new file mode 100644 index 0000000..d8b7b2d --- /dev/null +++ b/lib/renderers/webvr/WebVRUtils.js @@ -0,0 +1,66 @@ +/** + * @author jsantell / https://www.jsantell.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector3 } from '../../math/Vector3.js'; + +var cameraLPos = new Vector3(); +var cameraRPos = new Vector3(); + +/** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + */ +function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + var ipd = cameraLPos.distanceTo( cameraRPos ); + + var projL = cameraL.projectionMatrix.elements; + var projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + var near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + var far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + var topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + var bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + var leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + var rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + var left = near * leftFov; + var right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + var zOffset = ipd / ( - leftFov + rightFov ); + var xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + var near2 = near + zOffset; + var far2 = far + zOffset; + var left2 = left - xOffset; + var right2 = right + ( ipd - xOffset ); + var top2 = topFov * far / far2 * near2; + var bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + +} + +export { setProjectionFromUnion }; diff --git a/lib/renderers/webvr/WebXRManager.js b/lib/renderers/webvr/WebXRManager.js new file mode 100644 index 0000000..93a7c17 --- /dev/null +++ b/lib/renderers/webvr/WebXRManager.js @@ -0,0 +1,313 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Group } from '../../objects/Group.js'; +import { Vector4 } from '../../math/Vector4.js'; +import { ArrayCamera } from '../../cameras/ArrayCamera.js'; +import { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js'; +import { WebGLAnimation } from '../webgl/WebGLAnimation.js'; +import { setProjectionFromUnion } from './WebVRUtils.js'; + +function WebXRManager( renderer ) { + + var gl = renderer.context; + + var device = null; + var session = null; + + var framebufferScaleFactor = 1.0; + + var frameOfReference = null; + var frameOfReferenceType = 'stage'; + + var pose = null; + + var controllers = []; + var inputSources = []; + + function isPresenting() { + + return session !== null && frameOfReference !== null; + + } + + // + + var cameraL = new PerspectiveCamera(); + cameraL.layers.enable( 1 ); + cameraL.viewport = new Vector4(); + + var cameraR = new PerspectiveCamera(); + cameraR.layers.enable( 2 ); + cameraR.viewport = new Vector4(); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + if ( value instanceof XRDevice ) gl.setCompatibleXRDevice( value ); + + }; + + // + + function onSessionEvent( event ) { + + var controller = controllers[ inputSources.indexOf( event.inputSource ) ]; + if ( controller ) controller.dispatchEvent( { type: event.type } ); + + } + + function onSessionEnd() { + + renderer.setFramebuffer( null ); + animation.stop(); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setSession = function ( value ) { + + session = value; + + if ( session !== null ) { + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + + session.baseLayer = new XRWebGLLayer( session, gl, { framebufferScaleFactor: framebufferScaleFactor } ); + session.requestFrameOfReference( frameOfReferenceType ).then( function ( value ) { + + frameOfReference = value; + + renderer.setFramebuffer( session.baseLayer.framebuffer ); + + animation.setContext( session ); + animation.start(); + + } ); + + // + + inputSources = session.getInputSources(); + + session.addEventListener( 'inputsourceschange', function () { + + inputSources = session.getInputSources(); + console.log( inputSources ); + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + controller.userData.inputSource = inputSources[ i ]; + + } + + } ); + + } + + }; + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + } + + this.getCamera = function ( camera ) { + + if ( isPresenting() ) { + + var parent = camera.parent; + var cameras = cameraVR.cameras; + + updateCamera( cameraVR, parent ); + + for ( var i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + // update camera and its children + + camera.matrixWorld.copy( cameraVR.matrixWorld ); + + var children = camera.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( true ); + + } + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + return cameraVR; + + } + + return camera; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getDevicePose( frameOfReference ); + + if ( pose !== null ) { + + var layer = session.baseLayer; + var views = frame.views; + + for ( var i = 0; i < views.length; i ++ ) { + + var view = views[ i ]; + var viewport = layer.getViewport( view ); + var viewMatrix = pose.getViewMatrix( view ); + + var camera = cameraVR.cameras[ i ]; + camera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraVR.matrix.copy( camera.matrix ); + + } + + } + + } + + // + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var inputSource = inputSources[ i ]; + + if ( inputSource ) { + + var inputPose = frame.getInputPose( inputSource, frameOfReference ); + + if ( inputPose !== null ) { + + if ( 'targetRay' in inputPose ) { + + controller.matrix.elements = inputPose.targetRay.transformMatrix; + + } else if ( 'pointerMatrix' in inputPose ) { + + // DEPRECATED + + controller.matrix.elements = inputPose.pointerMatrix; + + } + + controller.matrix.decompose( controller.position, controller.rotation, controller.scale ); + controller.visible = true; + + continue; + + } + + } + + controller.visible = false; + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + // DEPRECATED + + this.getStandingMatrix = function () { + + console.warn( 'THREE.WebXRManager: getStandingMatrix() is no longer needed.' ); + return new THREE.Matrix4(); + + }; + + this.submitFrame = function () {}; + +} + +export { WebXRManager }; diff --git a/lib/scenes/Fog.js b/lib/scenes/Fog.js new file mode 100644 index 0000000..2daf22e --- /dev/null +++ b/lib/scenes/Fog.js @@ -0,0 +1,38 @@ +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function Fog( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + +} + +Fog.prototype.isFog = true; + +Fog.prototype.clone = function () { + + return new Fog( this.color, this.near, this.far ); + +}; + +Fog.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + +}; + +export { Fog }; diff --git a/lib/scenes/FogExp2.js b/lib/scenes/FogExp2.js new file mode 100644 index 0000000..5bcec07 --- /dev/null +++ b/lib/scenes/FogExp2.js @@ -0,0 +1,35 @@ +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function FogExp2( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + +} + +FogExp2.prototype.isFogExp2 = true; + +FogExp2.prototype.clone = function () { + + return new FogExp2( this.color, this.density ); + +}; + +FogExp2.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + +}; + +export { FogExp2 }; diff --git a/lib/scenes/Scene.js b/lib/scenes/Scene.js new file mode 100644 index 0000000..0c26ea9 --- /dev/null +++ b/lib/scenes/Scene.js @@ -0,0 +1,55 @@ +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Scene() { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + +} + +Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + +} ); + + + +export { Scene }; diff --git a/lib/textures/CanvasTexture.js b/lib/textures/CanvasTexture.js new file mode 100644 index 0000000..5239619 --- /dev/null +++ b/lib/textures/CanvasTexture.js @@ -0,0 +1,19 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Texture } from './Texture.js'; + +function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + +} + +CanvasTexture.prototype = Object.create( Texture.prototype ); +CanvasTexture.prototype.constructor = CanvasTexture; +CanvasTexture.prototype.isCanvasTexture = true; + +export { CanvasTexture }; diff --git a/lib/textures/CompressedTexture.js b/lib/textures/CompressedTexture.js new file mode 100644 index 0000000..9e800e5 --- /dev/null +++ b/lib/textures/CompressedTexture.js @@ -0,0 +1,32 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +import { Texture } from './Texture.js'; + +function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + +} + +CompressedTexture.prototype = Object.create( Texture.prototype ); +CompressedTexture.prototype.constructor = CompressedTexture; + +CompressedTexture.prototype.isCompressedTexture = true; + + +export { CompressedTexture }; diff --git a/lib/textures/CubeTexture.js b/lib/textures/CubeTexture.js new file mode 100644 index 0000000..3e6d7cf --- /dev/null +++ b/lib/textures/CubeTexture.js @@ -0,0 +1,41 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Texture } from './Texture.js'; +import { CubeReflectionMapping } from '../constants.js'; + +function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + +} + +CubeTexture.prototype = Object.create( Texture.prototype ); +CubeTexture.prototype.constructor = CubeTexture; + +CubeTexture.prototype.isCubeTexture = true; + +Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + +} ); + + +export { CubeTexture }; diff --git a/lib/textures/DataTexture.js b/lib/textures/DataTexture.js new file mode 100644 index 0000000..5544075 --- /dev/null +++ b/lib/textures/DataTexture.js @@ -0,0 +1,29 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +import { Texture } from './Texture.js'; +import { NearestFilter } from '../constants.js'; + +function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + +} + +DataTexture.prototype = Object.create( Texture.prototype ); +DataTexture.prototype.constructor = DataTexture; + +DataTexture.prototype.isDataTexture = true; + + +export { DataTexture }; diff --git a/lib/textures/DataTexture3D.js b/lib/textures/DataTexture3D.js new file mode 100644 index 0000000..5aae390 --- /dev/null +++ b/lib/textures/DataTexture3D.js @@ -0,0 +1,34 @@ +/** + * @author Artur Trzesiok + */ + +import { Texture } from './Texture.js'; +import { NearestFilter } from '../constants.js'; + +function DataTexture3D( data, width, height, depth ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in DataTexture3D directly. + // + // var texture = new THREE.DataTexture3D( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + Texture.call( this, null ); + + this.image = { data: data, width: width, height: height, depth: depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + +} + +DataTexture3D.prototype = Object.create( Texture.prototype ); +DataTexture3D.prototype.constructor = DataTexture3D; +DataTexture3D.prototype.isDataTexture3D = true; + +export { DataTexture3D }; diff --git a/lib/textures/DepthTexture.js b/lib/textures/DepthTexture.js new file mode 100644 index 0000000..9800e18 --- /dev/null +++ b/lib/textures/DepthTexture.js @@ -0,0 +1,38 @@ +/** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + +import { Texture } from './Texture.js'; +import { NearestFilter, UnsignedShortType, UnsignedInt248Type, DepthFormat, DepthStencilFormat } from '../constants.js'; + +function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + +} + +DepthTexture.prototype = Object.create( Texture.prototype ); +DepthTexture.prototype.constructor = DepthTexture; +DepthTexture.prototype.isDepthTexture = true; + +export { DepthTexture }; diff --git a/lib/textures/Texture.js b/lib/textures/Texture.js new file mode 100644 index 0000000..d23cce9 --- /dev/null +++ b/lib/textures/Texture.js @@ -0,0 +1,317 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { UVMapping } from '../constants.js'; +import { MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearEncoding, UnsignedByteType, RGBAFormat, LinearMipMapLinearFilter, LinearFilter } from '../constants.js'; +import { _Math } from '../math/Math.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { ImageUtils } from '../extras/ImageUtils.js'; + +var textureId = 0; + +function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + +} + +Texture.DEFAULT_IMAGE = undefined; +Texture.DEFAULT_MAPPING = UVMapping; + +Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Texture, + + isTexture: true, + + updateMatrix: function () { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + var output = { + + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { + + var url; + + if ( Array.isArray( image ) ) { + + // process array of images e.g. CubeTexture + + url = []; + + for ( var i = 0, l = image.length; i < l; i ++ ) { + + url.push( ImageUtils.getDataURL( image[ i ] ) ); + + } + + } else { + + // process single image + + url = ImageUtils.getDataURL( image ); + + } + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: url + }; + + } + + output.image = image.uuid; + + } + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return uv; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + return uv; + + } + +} ); + +Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + +} ); + + +export { Texture }; diff --git a/lib/textures/VideoTexture.js b/lib/textures/VideoTexture.js new file mode 100644 index 0000000..848b23d --- /dev/null +++ b/lib/textures/VideoTexture.js @@ -0,0 +1,36 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Texture } from './Texture.js'; + +function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + +} + +VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), { + + constructor: VideoTexture, + + isVideoTexture: true, + + update: function () { + + var video = this.image; + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + +} ); + + +export { VideoTexture }; diff --git a/lib/three.js b/lib/three.js new file mode 100644 index 0000000..0984296 --- /dev/null +++ b/lib/three.js @@ -0,0 +1,48206 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = {}))); +}(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( 'name' in Function.prototype === false ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = listenerArray.slice( 0 ); + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '98dev'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RedFormat = 1028; + var RGB_S3TC_DXT1_Format = 33776; + var RGBA_S3TC_DXT1_Format = 33777; + var RGBA_S3TC_DXT3_Format = 33778; + var RGBA_S3TC_DXT5_Format = 33779; + var RGB_PVRTC_4BPPV1_Format = 35840; + var RGB_PVRTC_2BPPV1_Format = 35841; + var RGBA_PVRTC_4BPPV1_Format = 35842; + var RGBA_PVRTC_2BPPV1_Format = 35843; + var RGB_ETC1_Format = 36196; + var RGBA_ASTC_4x4_Format = 37808; + var RGBA_ASTC_5x4_Format = 37809; + var RGBA_ASTC_5x5_Format = 37810; + var RGBA_ASTC_6x5_Format = 37811; + var RGBA_ASTC_6x6_Format = 37812; + var RGBA_ASTC_8x5_Format = 37813; + var RGBA_ASTC_8x6_Format = 37814; + var RGBA_ASTC_8x8_Format = 37815; + var RGBA_ASTC_10x5_Format = 37816; + var RGBA_ASTC_10x6_Format = 37817; + var RGBA_ASTC_10x8_Format = 37818; + var RGBA_ASTC_10x10_Format = 37819; + var RGBA_ASTC_12x10_Format = 37820; + var RGBA_ASTC_12x12_Format = 37821; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + var TangentSpaceNormalMap = 0; + var ObjectSpaceNormalMap = 1; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: ( function () { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + var lut = []; + + for ( var i = 0; i < 256; i ++ ) { + + lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ); + + } + + return function generateUUID() { + + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + var uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' + + lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' + + lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] + + lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ]; + + // .toUpperCase() here flattens concatenated strings to save heap memory space. + return uuid.toUpperCase(); + + }; + + } )(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + ceilPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + + }, + + floorPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Object.defineProperties( Vector2.prototype, { + + "width": { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height": { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + + } ); + + Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + cross: function ( v ) { + + return this.x * v.y - this.y * v.x; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + // this method does not support reflection matrices + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + te[ 3 ] = 0; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + te[ 7 ] = 0; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + te[ 11 ] = 0; + + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // bottom row + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // last column + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function () { + + var zero = new Vector3( 0, 0, 0 ); + var one = new Vector3( 1, 1, 1 ); + + return function makeRotationFromQuaternion( q ) { + + return this.compose( zero, q, one ); + + }; + + }(), + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 0 ) { + + // up and z are parallel + + if ( Math.abs( up.z ) === 1 ) { + + z.x += 0.0001; + + } else { + + z.z += 0.0001; + + } + + z.normalize(); + x.crossVectors( up, z ); + + } + + x.normalize(); + y.crossVectors( z, x ); + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + var te = this.elements; + + var x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + var sx = scale.x, sy = scale.y, sz = scale.z; + + te[ 0 ] = ( 1 - ( yy + zz ) ) * sx; + te[ 1 ] = ( xy + wz ) * sx; + te[ 2 ] = ( xz - wy ) * sx; + te[ 3 ] = 0; + + te[ 4 ] = ( xy - wz ) * sy; + te[ 5 ] = ( 1 - ( xx + zz ) ) * sy; + te[ 6 ] = ( yz + wx ) * sy; + te[ 7 ] = 0; + + te[ 8 ] = ( xz + wy ) * sz; + te[ 9 ] = ( yz - wx ) * sz; + te[ 10 ] = ( 1 - ( xx + yy ) ) * sz; + te[ 11 ] = 0; + + te[ 12 ] = position.x; + te[ 13 ] = position.y; + te[ 14 ] = position.z; + te[ 15 ] = 1; + + return this; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Quaternion.prototype, { + + isQuaternion: true, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = sin( z / 2 ); + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + angleTo: function ( q ) { + + return 2 * Math.acos( Math.abs( _Math.clamp( this.dot( q ), - 1, 1 ) ) ); + + }, + + rotateTowards: function ( q, step ) { + + var angle = this.angleTo( q ); + + if ( angle === 0 ) return this; + + var t = Math.min( 1, step / angle ); + + this.slerp( q, t ); + + return this; + + }, + + inverse: function () { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + var s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + return this.normalize(); + + } + + var sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function ( camera ) { + + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); + + }, + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + return this.applyMatrix4( matrix.getInverse( camera.projectionMatrix ) ).applyMatrix4( camera.matrixWorld ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); + + }, + + setFromSphericalCoords: function ( radius, phi, theta ) { + + var sinPhiRadius = Math.sin( phi ) * radius; + + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); + + }, + + setFromCylindricalCoords: function ( radius, theta, y ) { + + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + var e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) { + + var c = Math.cos( rotation ); + var s = Math.sin( rotation ); + + this.set( + sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx, + - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty, + 0, 0, 1 + ); + + }, + + scale: function ( sx, sy ) { + + var te = this.elements; + + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; + + return this; + + }, + + rotate: function ( theta ) { + + var c = Math.cos( theta ); + var s = Math.sin( theta ); + + var te = this.elements; + + var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; + + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; + + return this; + + }, + + translate: function ( tx, ty ) { + + var te = this.elements; + + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var ImageUtils = { + + getDataURL: function ( image ) { + + var canvas; + + if ( typeof HTMLCanvasElement == 'undefined' ) { + + return image.src; + + } else if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + var context = canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Texture, + + isTexture: true, + + updateMatrix: function () { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + var output = { + + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { + + var url; + + if ( Array.isArray( image ) ) { + + // process array of images e.g. CubeTexture + + url = []; + + for ( var i = 0, l = image.length; i < l; i ++ ) { + + url.push( ImageUtils.getDataURL( image[ i ] ) ); + + } + + } else { + + // process single image + + url = ImageUtils.getDataURL( image ); + + } + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: url + }; + + } + + output.image = image.uuid; + + } + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return uv; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + return uv; + + } + + } ); + + Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + } ); + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : true; + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getSize() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var scope, i, l; + + var v1 = new Vector3(); + + function traverse( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } + + return function expandByObject( object ) { + + scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( traverse ); + + return this; + + }; + + }(), + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getParameter() target is now required' ); + target = new Vector3(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= - plane.constant && max >= - plane.constant ); + + }, + + intersectsTriangle: ( function () { + + // triangle centered vertices + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + // triangle edge vectors + var f0 = new Vector3(); + var f1 = new Vector3(); + var f2 = new Vector3(); + + var testAxis = new Vector3(); + + var center = new Vector3(); + var extents = new Vector3(); + + var triangleNormal = new Vector3(); + + function satForAxes( axes ) { + + var i, j; + + for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + var r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z ); + // project all 3 vertices of the triangle onto the seperating axis + var p0 = v0.dot( testAxis ); + var p1 = v1.dot( testAxis ); + var p2 = v2.dot( testAxis ); + // actual test, basically see if either of the most extreme of the triangle points intersects r + if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) { + + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is seperating and we can exit + return false; + + } + + } + + return true; + + } + + return function intersectsTriangle( triangle ) { + + if ( this.isEmpty() ) { + + return false; + + } + + // compute box center and extents + this.getCenter( center ); + extents.subVectors( this.max, center ); + + // translate triangle to aabb origin + v0.subVectors( triangle.a, center ); + v1.subVectors( triangle.b, center ); + v2.subVectors( triangle.c, center ); + + // compute edge vectors for triangle + f0.subVectors( v1, v0 ); + f1.subVectors( v2, v1 ); + f2.subVectors( v0, v2 ); + + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // 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 + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + var axes = [ + 0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y, + f0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x, + - f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0 + ]; + if ( ! satForAxes( axes ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes ) ) { + + return false; + + } + + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + triangleNormal.crossVectors( f0, f1 ); + axes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ]; + return satForAxes( axes ); + + }; + + } )(), + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' ); + target = new Sphere(); + + } + + this.getCenter( target.center ); + + target.radius = this.getSize( v1 ).length() * 0.5; + + return target; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // 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. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if ( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + }, + + clampPoint: function ( point, target ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + }, + + getBoundingBox: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); + target = new Box3(); + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + // normal is assumed to be normalized + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .projectPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .intersectLine() target is now required' ); + target = new Vector3(); + + } + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .coplanarPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + // corner at max distance + + p.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( p ) < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + } ); + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var 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"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\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"; + + var 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"; + + var 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"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var 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"; + + var 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( sampler2D envMap, 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"; + + var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var 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.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\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.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\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.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, 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.r, 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var fog_vertex = "#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif\n"; + + var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif\n"; + + var 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"; + + var 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"; + + var 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"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var 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"; + + var 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"; + + var envmap_physical_pars_fragment = "#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( envMap, 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( envMap, 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"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif\n"; + + var 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"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var 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"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var normal_fragment_maps = "#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\n#endif\n"; + + var 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"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n"; + + var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; + + var 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"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n"; + + var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tgl_FragColor = texture2D( t2D, vUv );\n}\n"; + + var background_vert = "varying vec2 vUv;\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4( position, 1.0 );\n\tgl_Position.z = 1.0;\n}\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \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"; + + var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n"; + + var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\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"; + + var equirect_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var 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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshmatcap_frag = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\tvec4 matcapColor = texture2D( matcap, uv );\n\tmatcapColor = matcapTexelToLinear( matcapColor );\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshmatcap_vert = "#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var 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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; + + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n"; + + var shadow_vert = "#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}\n"; + + var sprite_vert = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + background_frag: background_frag, + background_vert: background_vert, + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshmatcap_frag: meshmatcap_frag, + meshmatcap_vert: meshmatcap_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert, + sprite_frag: sprite_frag, + sprite_vert: sprite_vert + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function ( gammaFactor ) { + + this.copyGammaToLinear( this, gammaFactor ); + + return this; + + }, + + convertLinearToGamma: function ( gammaFactor ) { + + this.copyLinearToGamma( this, gammaFactor ); + + return this; + + }, + + copySRGBToLinear: function () { + + function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + + } + + return function copySRGBToLinear( color ) { + + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); + + return this; + + }; + + }(), + + copyLinearToSRGB: function () { + + function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + + } + + return function copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; + + }; + + }(), + + convertSRGBToLinear: function () { + + this.copySRGBToLinear( this ); + + return this; + + }, + + convertLinearToSRGB: function () { + + this.copyLinearToSRGB( this ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( target ) { + + // h,s,l ranges are in 0.0 - 1.0 + + if ( target === undefined ) { + + console.warn( 'THREE.Color: .getHSL() target is now required' ); + target = { h: 0, s: 0, l: 0 }; + + } + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function () { + + var hsl = {}; + + return function ( h, s, l ) { + + this.getHSL( hsl ); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }; + + }(), + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function ( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + lerpHSL: function () { + + var hslA = { h: 0, s: 0, l: 0 }; + var hslB = { h: 0, s: 0, l: 0 }; + + return function lerpHSL( color, alpha ) { + + this.getHSL( hslA ); + color.getHSL( hslB ); + + var h = _Math.lerp( hslA.h, hslB.h, alpha ); + var s = _Math.lerp( hslA.s, hslB.s, alpha ); + var l = _Math.lerp( hslA.l, hslB.l, alpha ); + + this.setHSL( h, s, l ); + + return this; + + }; + + }(), + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + } ); + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + + alphaMap: { value: null }, + + }, + + specularmap: { + + specularMap: { value: null }, + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + }, + + sprite: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + center: { value: new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + matcap: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ] ), + + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + sprite: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + + }, + + background: { + + uniforms: { + t2D: { value: null }, + }, + + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + + }, + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAnimation() { + + var context = null; + var isAnimating = false; + var animationLoop = null; + + function onAnimationFrame( time, frame ) { + + if ( isAnimating === false ) return; + + animationLoop( time, frame ); + + context.requestAnimationFrame( onAnimationFrame ); + + } + + return { + + start: function () { + + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; + + context.requestAnimationFrame( onAnimationFrame ); + + isAnimating = true; + + }, + + stop: function () { + + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes( gl ) { + + var buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? 35048 : 35044; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = 5126; + + if ( array instanceof Float32Array ) { + + type = 5126; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); + + } else if ( array instanceof Uint16Array ) { + + type = 5123; + + } else if ( array instanceof Int16Array ) { + + type = 5122; + + } else if ( array instanceof Uint32Array ) { + + type = 5125; + + } else if ( array instanceof Int32Array ) { + + type = 5124; + + } else if ( array instanceof Int8Array ) { + + type = 5120; + + } else if ( array instanceof Uint8Array ) { + + type = 5121; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, 35044 ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = - 1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1 | 0; + + } + + Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Object3D, + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + applyQuaternion: function ( q ) { + + this.quaternion.premultiply( q ); + + return this; + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateOnWorldAxis: function () { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + var q1 = new Quaternion(); + + return function rotateOnWorldAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This method does not support objects having non-uniformly-scaled parent(s) + + var q1 = new Quaternion(); + var m1 = new Matrix4(); + var target = new Vector3(); + var position = new Vector3(); + + return function lookAt( x, y, z ) { + + if ( x.isVector3 ) { + + target.copy( x ); + + } else { + + target.set( x, y, z ); + + } + + var parent = this.parent; + + this.updateWorldMatrix( true, false ); + + position.setFromMatrixPosition( this.matrixWorld ); + + if ( this.isCamera ) { + + m1.lookAt( position, target, this.up ); + + } else { + + m1.lookAt( target, position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + if ( parent ) { + + m1.extractRotation( parent.matrixWorld ); + q1.setFromRotationMatrix( m1 ); + this.quaternion.premultiply( q1.inverse() ); + + } + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + return this; + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ); + target = new Quaternion(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, target, scale ); + + return target; + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, target ); + + return target; + + }; + + }(), + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); + + }, + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + updateWorldMatrix: function ( updateParents, updateChildren ) { + + var parent = this.parent; + + if ( updateParents === true && parent !== null ) { + + parent.updateWorldMatrix( true, false ); + + } + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + // update children + + if ( updateChildren === true ) { + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateWorldMatrix( false, true ); + + } + + } + + }, + + toJSON: function ( meta ) { + + // meta is a string when called from JSON.stringify + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.isMesh || this.isLine || this.isPoints ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + var parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + var shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + var shapes = extractFromCache( meta.shapes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var geometryId = 0; // Geometry uses even numbers as Id + + function Geometry() { + + Object.defineProperty( this, 'id', { value: geometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3().fromArray( positions, i ) ); + + if ( colors !== undefined ) { + + scope.colors.push( new Color().fromArray( colors, i ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexColors = ( colors === undefined ) ? [] : [ + scope.colors[ a ].clone(), + scope.colors[ b ].clone(), + scope.colors[ c ].clone() ]; + + var vertexNormals = ( normals === undefined ) ? [] : [ + new Vector3().fromArray( normals, a * 3 ), + new Vector3().fromArray( normals, b * 3 ), + new Vector3().fromArray( normals, c * 3 ) + ]; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ + new Vector2().fromArray( uvs, a * 2 ), + new Vector2().fromArray( uvs, b * 2 ), + new Vector2().fromArray( uvs, c * 2 ) + ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ + new Vector2().fromArray( uvs2, a * 2 ), + new Vector2().fromArray( uvs2, b * 2 ), + new Vector2().fromArray( uvs2, c * 2 ) + ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + if ( mesh.matrixAutoUpdate ) mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + setFromPoints: function ( points ) { + + this.vertices = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return this; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + } ); + + // + + function Int8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = { + name: morphTargets[ i ].name, + data: [] + }; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = { + name: morphNormals[ i ].name, + data: [] + }; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + if ( vertices.length > 0 && faces.length === 0 ) { + + console.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' ); + + } + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + this.userData = {}; + + } + + BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + return this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return this; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + setFromPoints: function ( points ) { + + var position = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 ); + attribute.name = morphTarget.name; + + array.push( attribute.copyVector3sArray( morphTarget.data ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + for ( var i = 0, il = index.count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var vector = new Vector3(); + + return function normalizeNormals() { + + var normals = this.attributes.normal; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + vector.x = normals.getX( i ); + vector.y = normals.getY( i ); + vector.z = normals.getZ( i ); + + vector.normalize(); + + normals.setXYZ( i, vector.x, vector.y, vector.z ); + + } + + }; + + }(), + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + var groups = this.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + // BoxBufferGeometry + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + width = width || 1; + height = height || 1; + depth = depth || 1; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + // PlaneBufferGeometry + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + width = width || 1; + height = height || 1; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.flatShading = false; + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.visible = true; + + this.userData = {}; + + this.needsUpdate = true; + + } + + Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Material, + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = ( meta === undefined || typeof meta === 'string' ); + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + + if ( this.aoMap && this.aoMap.isTexture ) { + + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; + + } + + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + + } + + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + if ( this.combine !== undefined ) data.combine = this.combine; + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.flatShading === true ) data.flatShading = this.flatShading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; + + if ( this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.morphTargets === true ) data.morphTargets = true; + if ( this.skinning === true ) data.skinning = true; + + if ( this.visible === false ) data.visible = false; + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.flatShading = source.flatShading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.premultipliedAlpha = source.premultipliedAlpha; + + this.visible = source.visible; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + this.shadowSide = source.shadowSide; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = {}; + + for ( var name in this.uniforms ) { + + var uniform = this.uniforms[ name ]; + var value = uniform.value; + + if ( value.isTexture ) { + + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; + + } else if ( value.isColor ) { + + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; + + } else if ( value.isVector2 ) { + + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; + + } else if ( value.isVector3 ) { + + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; + + } else if ( value.isVector4 ) { + + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; + + } else if ( value.isMatrix4 ) { + + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; + + } else { + + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } + + } + + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; + + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .at() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( point, this.origin ); + + var directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, target ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, target ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, target ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, target ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, target ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, target ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, target ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Object.assign( Triangle, { + + getNormal: function () { + + var v0 = new Vector3(); + + return function getNormal( a, b, c, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getNormal() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( c, b ); + v0.subVectors( a, b ); + target.cross( v0 ); + + var targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + getBarycoord: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function getBarycoord( point, a, b, c, target ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ); + target = new Vector3(); + + } + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return target.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + Triangle.getBarycoord( point, a, b, c, v1 ); + + return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 ); + + }; + + }(), + + getUV: function () { + + var barycoord = new Vector3(); + + return function getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { + + this.getBarycoord( point, p1, p2, p3, barycoord ); + + target.set( 0, 0 ); + target.addScaledVector( uv1, barycoord.x ); + target.addScaledVector( uv2, barycoord.y ); + target.addScaledVector( uv3, barycoord.z ); + + return target; + + }; + + }() + + } ); + + Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + getArea: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function getArea() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + getMidpoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + getNormal: function ( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + }, + + getPlane: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getPlane() target is now required' ); + target = new Vector3(); + + } + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + getBarycoord: function ( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + getUV: function ( point, uv1, uv2, uv3, result ) { + + return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, result ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsTriangle( this ); + + }, + + closestPointToPoint: function () { + + var vab = new Vector3(); + var vac = new Vector3(); + var vbc = new Vector3(); + var vap = new Vector3(); + var vbp = new Vector3(); + var vcp = new Vector3(); + + return function closestPointToPoint( p, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + var a = this.a, b = this.b, c = this.c; + var v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + vab.subVectors( b, a ); + vac.subVectors( c, a ); + vap.subVectors( p, a ); + var d1 = vab.dot( vap ); + var d2 = vac.dot( vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + + } + + vbp.subVectors( p, b ); + var d3 = vab.dot( vbp ); + var d4 = vac.dot( vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + var vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( vab, v ); + + } + + vcp.subVectors( p, c ); + var d5 = vab.dot( vcp ); + var d6 = vac.dot( vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + var vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( vac, w ); + + } + + var va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( vbc, w ); // edge region of BC + + } + + // face region + var denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + return target.copy( a ).addScaledVector( vab, v ).addScaledVector( vac, w ); + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + return this; + + }, + + updateMorphTargets: function () { + + var geometry = this.geometry; + var m, ml, name; + + if ( geometry.isBufferGeometry ) { + + var morphAttributes = geometry.morphAttributes; + var keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + var morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + var morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + name = morphTargets[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, material, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, material, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ); + + } + + var face = new Face3( a, b, c ); + Triangle.getNormal( vA, vB, vC, face.normal ); + + intersection.face = face; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var groups = geometry.groups; + var drawRange = geometry.drawRange; + var i, j, il, jl; + var group, groupMaterial; + var start, end; + + if ( index !== null ) { + + // indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = index.getX( j ); + b = index.getX( j + 1 ); + c = index.getX( j + 2 ); + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = j; + b = j + 1; + c = j + 2; + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = Triangle.getUV( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC, new Vector2() ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBackground( renderer, state, objects, premultipliedAlpha ) { + + var clearColor = new Color( 0x000000 ); + var clearAlpha = 0; + + var planeMesh; + var boxMesh; + + function render( renderList, scene, camera, forceClear ) { + + var background = scene.background; + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && ( background.isCubeTexture || background.isWebGLRenderTargetCube ) ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxBufferGeometry( 1, 1, 1 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ), + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.removeAttribute( 'normal' ); + boxMesh.geometry.removeAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + objects.update( boxMesh ); + + } + + boxMesh.material.uniforms.tCube.value = ( background.isWebGLRenderTargetCube ) ? background.texture : background; + boxMesh.material.uniforms.tFlip.value = ( background.isWebGLRenderTargetCube ) ? 1 : - 1; + + // push to the pre-sorted opaque render list + renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + planeMesh.geometry.removeAttribute( 'normal' ); + + objects.update( planeMesh ); + + } + + planeMesh.material.uniforms.t2D.value = background; + + // push to the pre-sorted opaque render list + renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha ) { + + clearColor.set( color ); + clearAlpha = alpha !== undefined ? alpha : 1; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawArraysInstanced' : 'drawArraysInstancedANGLE' ]( mode, start, count, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext; + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + var maxTextures = gl.getParameter( 34930 ); + var maxVertexTextures = gl.getParameter( 35660 ); + var maxTextureSize = gl.getParameter( 3379 ); + var maxCubemapSize = gl.getParameter( 34076 ); + + var maxAttributes = gl.getParameter( 34921 ); + var maxVertexUniforms = gl.getParameter( 36347 ); + var maxVaryings = gl.getParameter( 36348 ); + var maxFragmentUniforms = gl.getParameter( 36349 ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + isWebGL2: isWebGL2, + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, attributes, info ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + var attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, 34963 ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], 34962 ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], 34962 ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, 34963 ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawElementsInstanced' : 'drawElementsInstancedANGLE' ]( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLInfo( gl ) { + + var memory = { + geometries: 0, + textures: 0 + }; + + var render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + instanceCount = instanceCount || 1; + + render.calls ++; + + switch ( mode ) { + + case 4: + render.triangles += instanceCount * ( count / 3 ); + break; + + case 5: + case 6: + render.triangles += instanceCount * ( count - 2 ); + break; + + case 1: + render.lines += instanceCount * ( count / 2 ); + break; + + case 3: + render.lines += instanceCount * ( count - 1 ); + break; + + case 2: + render.lines += instanceCount * count; + break; + + case 0: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + + } + + function WebGLMorphtargets( gl ) { + + var influencesList = {}; + var morphInfluences = new Float32Array( 8 ); + + function update( object, geometry, material, program ) { + + var objectInfluences = object.morphTargetInfluences; + + var length = objectInfluences.length; + + var influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + var morphTargets = material.morphTargets && geometry.morphAttributes.position; + var morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + // Remove current morphAttributes + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + if ( influence[ 1 ] !== 0 ) { + + if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i ); + if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + // Collect influences + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + // Add morphAttributes + + for ( var i = 0; i < 8; i ++ ) { + + var influence = influences[ i ]; + + if ( influence ) { + + var index = influence[ 0 ]; + var value = influence[ 1 ]; + + if ( value ) { + + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + morphInfluences[ i ] = value; + continue; + + } + + } + + morphInfluences[ i ] = 0; + + } + + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( geometries, info ) { + + var updateList = {}; + + function update( object ) { + + var frame = info.render.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function dispose() { + + updateList = {}; + + } + + return { + + update: update, + dispose: dispose + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author Artur Trzesiok + */ + + function DataTexture3D( data, width, height, depth ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in DataTexture3D directly. + // + // var texture = new THREE.DataTexture3D( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + Texture.call( this, null ); + + this.image = { data: data, width: width, height: height, depth: depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + + } + + DataTexture3D.prototype = Object.create( Texture.prototype ); + DataTexture3D.prototype.constructor = DataTexture3D; + DataTexture3D.prototype.isDataTexture3D = true; + + /** + * @author tschw + * @author Mugen87 / https://github.com/Mugen87 + * @author mrdoob / http://mrdoob.com/ + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyTexture3d = new DataTexture3D(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array( 16 ); + var mat3array = new Float32Array( 9 ); + var mat2array = new Float32Array( 4 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( var i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + + } + + function copyArray( a, b ) { + + for ( var i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + + } + + function setValue1i( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + + } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + function setValue3fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + function setValue4fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + + } + + function setValue3fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + + } + + function setValue4fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT3D1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture3D( v || emptyTexture3d, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + + } + + function setValue3iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + + } + + function setValue4iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + + } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8B5F: return setValueT3D1; // SAMPLER_3D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1fv( this.addr, v ); + + copyArray( cache, v ); + + } + function setValue1iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1iv( this.addr, v ); + + copyArray( cache, v ); + + } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 2 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform2fv( this.addr, data ); + + this.updateCache( data ); + + } + + function setValueV3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 3 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform3fv( this.addr, data ); + + this.updateCache( data ); + + } + + function setValueV4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform4fv( this.addr, data ); + + this.updateCache( data ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix2fv( this.addr, false, data ); + + this.updateCache( data ); + + } + + function setValueM3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 9 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix3fv( this.addr, false, data ); + + this.updateCache( data ); + + } + + function setValueM4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 16 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix4fv( this.addr, false, data ); + + this.updateCache( data ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + PureArrayUniform.prototype.updateCache = function ( data ) { + + var cache = this.cache; + + if ( data instanceof Float32Array && cache.length !== data.length ) { + + this.cache = new Float32Array( data.length ); + + } + + copyArray( cache, data ); + + }; + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function ( gl, value, renderer ) { + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ], renderer ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, 35718 ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, 35713 ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === 35633 ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case Uncharted2ToneMapping: + toneMappingName = 'Uncharted2'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || ( parameters.normalMap && ! parameters.objectSpaceNormalMap ) || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, 35721 ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + + } + + function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = shader.vertexShader; + var fragmentShader = shader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && ( capabilities.isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.matcapEncoding || 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 + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.matcapEncoding ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '', + + parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( capabilities.isWebGL2 && ! material.isRawShaderMaterial ) { + + var isGLSL3ShaderMaterial = false; + + var versionRegex = /^\s*#version\s+300\s+es\s*\n/; + + if ( material.isShaderMaterial && + vertexShader.match( versionRegex ) !== null && + fragmentShader.match( versionRegex ) !== null ) { + + isGLSL3ShaderMaterial = true; + + vertexShader = vertexShader.replace( versionRegex, '' ); + fragmentShader = fragmentShader.replace( versionRegex, '' ); + + } + + // GLSL 3.0 conversion + prefixVertex = [ + '#version 300 es\n', + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + '#version 300 es\n', + '#define varying in', + isGLSL3ShaderMaterial ? '' : 'out highp vec4 pc_fragColor;', + isGLSL3ShaderMaterial ? '' : '#define gl_FragColor pc_fragColor', + '#define gl_FragDepthEXT gl_FragDepth', + '#define texture2D texture', + '#define textureCube texture', + '#define texture2DProj textureProj', + '#define texture2DLodEXT textureLod', + '#define texture2DProjLodEXT textureProjLod', + '#define textureCubeLodEXT textureLod', + '#define texture2DGradEXT textureGrad', + '#define texture2DProjGradEXT textureProjGrad', + '#define textureCubeGradEXT textureGrad' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, 35633, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ).trim(); + var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, 35714 ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter( program, 35715 ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.name = shader.name; + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, extensions, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "matcapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "objectSpaceNormalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = capabilities.precision; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + matcap: !! material.matcap, + matcapEncoding: getTextureEncodingFromMap( material.matcap, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( material.onBeforeCompile.toString() ); + + array.push( renderer.gammaOutput ); + + array.push( renderer.gammaFactor ); + + return array.join(); + + }; + + this.acquireProgram = function ( material, shader, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = new WeakMap(); + + function get( object ) { + + var map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + + function WebGLRenderList() { + + var renderItems = []; + var renderItemsIndex = 0; + + var opaque = []; + var transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transparent.length = 0; + + } + + function push( object, geometry, material, z, group ) { + + var renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + + ( material.transparent === true ? transparent : opaque ).push( renderItem ); + + renderItemsIndex ++; + + } + + function sort() { + + if ( opaque.length > 1 ) opaque.sort( painterSortStable ); + if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + + sort: sort + }; + + } + + function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function UniformsCache() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + var count = 0; + + function WebGLLights() { + + var cache = new UniformsCache(); + + var state = { + + id: count ++, + + hash: { + stateID: - 1, + directionalLength: - 1, + pointLength: - 1, + spotLength: - 1, + rectAreaLength: - 1, + hemiLength: - 1, + shadowsLength: - 1 + }, + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + var vector3 = new Vector3(); + var matrix4 = new Matrix4(); + var matrix42 = new Matrix4(); + + function setup( lights, shadows, camera ) { + + var r = 0, g = 0, b = 0; + + var directionalLength = 0; + var pointLength = 0; + var spotLength = 0; + var rectAreaLength = 0; + var hemiLength = 0; + + var viewMatrix = camera.matrixWorldInverse; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + var color = light.color; + var intensity = light.intensity; + var distance = light.distance; + + var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + uniforms.shadowCameraNear = shadow.camera.near; + uniforms.shadowCameraFar = shadow.camera.far; + + } + + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = cache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.hash.stateID = state.id; + state.hash.directionalLength = directionalLength; + state.hash.pointLength = pointLength; + state.hash.spotLength = spotLength; + state.hash.rectAreaLength = rectAreaLength; + state.hash.hemiLength = hemiLength; + state.hash.shadowsLength = shadows.length; + + } + + return { + setup: setup, + state: state + }; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLRenderState() { + + var lights = new WebGLLights(); + + var lightsArray = []; + var shadowsArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights( camera ) { + + lights.setup( lightsArray, shadowsArray, camera ); + + } + + var state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + + pushLight: pushLight, + pushShadow: pushShadow + }; + + } + + function WebGLRenderStates() { + + var renderStates = {}; + + function get( scene, camera ) { + + var renderState; + + if ( renderStates[ scene.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ] = {}; + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + if ( renderStates[ scene.id ][ camera.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + renderState = renderStates[ scene.id ][ camera.id ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * skinning: , + * morphTargets: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + + function MeshDistanceMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDistanceMaterial.prototype = Object.create( Material.prototype ); + MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial; + + MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + + MeshDistanceMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _objects, maxTextureSize ) { + + var _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new MeshDepthMaterial( { + + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _depthMaterials[ i ] = depthMaterial; + + // + + var distanceMaterial = new MeshDistanceMaterial( { + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + // TODO Clean up (needed in case of contextlost) + var _gl = _renderer.context; + var _state = _renderer.state; + + // Set GL state for depth map. + _state.disable( 3042 ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + var shadow = light.shadow; + var isPointLight = light && light.isPointLight; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( isPointLight ) { + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + if ( isPointLight ) { + + faceCount = 6; + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ]; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.isMeshDistanceMaterial ) { + + result.referencePosition.copy( lightPositionWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, utils, capabilities ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4( 0, 0, 0, 0 ); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( 2929 ); + + } else { + + disable( 2929 ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( 512 ); + break; + + case AlwaysDepth: + + gl.depthFunc( 519 ); + break; + + case LessDepth: + + gl.depthFunc( 513 ); + break; + + case LessEqualDepth: + + gl.depthFunc( 515 ); + break; + + case EqualDepth: + + gl.depthFunc( 514 ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( 518 ); + break; + + case GreaterDepth: + + gl.depthFunc( 516 ); + break; + + case NotEqualDepth: + + gl.depthFunc( 517 ); + break; + + default: + + gl.depthFunc( 515 ); + + } + + } else { + + gl.depthFunc( 515 ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( 2960 ); + + } else { + + disable( 2960 ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( 34921 ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var enabledCapabilities = {}; + + var compressedTextureFormats = null; + + var currentProgram = null; + + var currentBlendingEnabled = null; + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( 35661 ); + + var lineWidthAvailable = false; + var version = 0; + var glVersion = gl.getParameter( 7938 ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, 10241, 9728 ); + gl.texParameteri( type, 10240, 9728 ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 ); + emptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( 2929 ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( 2884 ); + + setBlending( NoBlending ); + + // + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' ); + + extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) || + extensions.get( 'WEBGL_compressed_texture_astc' ) ) { + + var formats = gl.getParameter( 34467 ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled ) { + + disable( 3042 ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( ! currentBlendingEnabled ) { + + enable( 3042 ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( 32774 ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 1, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 1, 1 ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( 0, 0, 769, 771 ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( 0, 768, 0, 770 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 770, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 770, 1 ); + break; + + case SubtractiveBlending: + gl.blendFunc( 0, 769 ); + break; + + case MultiplyBlending: + gl.blendFunc( 0, 768 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = null; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( 2884 ) + : enable( 2884 ); + + var flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( 2304 ); + + } else { + + gl.frontFace( 2305 ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( 2884 ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( 1029 ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( 1028 ); + + } else { + + gl.cullFace( 1032 ); + + } + + } + + } else { + + disable( 2884 ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( 32823 ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( 32823 ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( 3089 ); + + } else { + + disable( 3089 ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + enabledCapabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentProgram = null; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + var _videoTextures = {}; + var _canvas; + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + return; + + } + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) { + + if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + + _canvas.width = _Math.floorPowerOfTwo( image.width ); + _canvas.height = _Math.floorPowerOfTwo( image.height ); + + var context = _canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, _canvas.width, _canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height ); + + return _canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( capabilities.isWebGL2 ) return false; + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) { + + return texture.generateMipmaps && isPowerOfTwo && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height ) { + + _gl.generateMipmap( target ); + + var textureProperties = properties.get( texture ); + + // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 + textureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E; + + } + + function getInternalFormat( glFormat, glType ) { + + if ( ! capabilities.isWebGL2 ) return glFormat; + + if ( glFormat === 6403 ) { + + if ( glType === 5126 ) return 33326; + if ( glType === 5131 ) return 33325; + if ( glType === 5121 ) return 33321; + + } + + if ( glFormat === 6407 ) { + + if ( glType === 5126 ) return 34837; + if ( glType === 5131 ) return 34843; + if ( glType === 5121 ) return 32849; + + } + + if ( glFormat === 6408 ) { + + if ( glType === 5126 ) return 34836; + if ( glType === 5131 ) return 34842; + if ( glType === 5121 ) return 32856; + + } + + return glFormat; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return 9728; + + } + + return 9729; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + delete _videoTextures[ texture.id ]; + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + info.memory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 3553, textureProperties.__webglTexture ); + + } + + function setTexture3D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 32879, textureProperties.__webglTexture ); + + } + + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( 37440, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( 34067, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( ! isCompressed ) { + + textureProperties.__maxMipLevel = 0; + + } else { + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + // We assume images for cube map have the same size. + generateMipmap( 34067, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, 10242, utils.convert( texture.wrapS ) ); + _gl.texParameteri( textureType, 10243, utils.convert( texture.wrapT ) ); + + _gl.texParameteri( textureType, 10240, utils.convert( texture.magFilter ) ); + _gl.texParameteri( textureType, 10241, utils.convert( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, 10242, 33071 ); + _gl.texParameteri( textureType, 10243, 33071 ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ); + + } + + _gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + var textureType; + + if ( texture.isDataTexture3D ) { + + textureType = 32879; + + } else { + + textureType = 3553; + + } + + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + state.activeTexture( 33984 + slot ); + + + state.bindTexture( textureType, textureProperties.__webglTexture ); + + + + _gl.pixelStorei( 37440, texture.flipY ); + _gl.pixelStorei( 37441, texture.premultiplyAlpha ); + _gl.pixelStorei( 3317, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( textureType, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + glInternalFormat = 6402; + + if ( texture.type === FloatType ) { + + if ( ! capabilities.isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' ); + glInternalFormat = 36012; + + } else if ( capabilities.isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + glInternalFormat = 33189; + + } + + if ( texture.format === DepthFormat && glInternalFormat === 6402 ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + glInternalFormat = 34041; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else if ( texture.isDataTexture3D ) { + + state.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + generateMipmap( 3553, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = utils.convert( renderTarget.texture.format ); + var glType = utils.convert( renderTarget.texture.type ); + var glInternalFormat = getInternalFormat( glFormat, glType ); + state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( 36160, framebuffer ); + _gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( 36160, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( 36161, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( 36161, 33189, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( 36161, 32854, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( 36161, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + _gl.bindFramebuffer( 36160, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( 36160, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( 34067, textureProperties.__webglTexture ); + setTextureParameters( 34067, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, 36064, 34069 + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( 34067, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( 34067, null ); + + } else { + + state.bindTexture( 3553, textureProperties.__webglTexture ); + setTextureParameters( 3553, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 36064, 3553 ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( 3553, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( 3553, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) { + + var target = renderTarget.isWebGLRenderTargetCube ? 34067 : 3553; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.bindTexture( target, null ); + + } + + } + + function updateVideoTexture( texture ) { + + var id = texture.id; + var frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures[ id ] !== frame ) { + + _videoTextures[ id ] = frame; + texture.update(); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author thespite / http://www.twitter.com/thespite + */ + + function WebGLUtils( gl, extensions, capabilities ) { + + function convert( p ) { + + var extension; + + if ( p === RepeatWrapping ) return 10497; + if ( p === ClampToEdgeWrapping ) return 33071; + if ( p === MirroredRepeatWrapping ) return 33648; + + if ( p === NearestFilter ) return 9728; + if ( p === NearestMipMapNearestFilter ) return 9984; + if ( p === NearestMipMapLinearFilter ) return 9986; + + if ( p === LinearFilter ) return 9729; + if ( p === LinearMipMapNearestFilter ) return 9985; + if ( p === LinearMipMapLinearFilter ) return 9987; + + if ( p === UnsignedByteType ) return 5121; + if ( p === UnsignedShort4444Type ) return 32819; + if ( p === UnsignedShort5551Type ) return 32820; + if ( p === UnsignedShort565Type ) return 33635; + + if ( p === ByteType ) return 5120; + if ( p === ShortType ) return 5122; + if ( p === UnsignedShortType ) return 5123; + if ( p === IntType ) return 5124; + if ( p === UnsignedIntType ) return 5125; + if ( p === FloatType ) return 5126; + + if ( p === HalfFloatType ) { + + if ( capabilities.isWebGL2 ) return 5131; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return 6406; + if ( p === RGBFormat ) return 6407; + if ( p === RGBAFormat ) return 6408; + if ( p === LuminanceFormat ) return 6409; + if ( p === LuminanceAlphaFormat ) return 6410; + if ( p === DepthFormat ) return 6402; + if ( p === DepthStencilFormat ) return 34041; + if ( p === RedFormat ) return 6403; + + if ( p === AddEquation ) return 32774; + if ( p === SubtractEquation ) return 32778; + if ( p === ReverseSubtractEquation ) return 32779; + + if ( p === ZeroFactor ) return 0; + if ( p === OneFactor ) return 1; + if ( p === SrcColorFactor ) return 768; + if ( p === OneMinusSrcColorFactor ) return 769; + if ( p === SrcAlphaFactor ) return 770; + if ( p === OneMinusSrcAlphaFactor ) return 771; + if ( p === DstAlphaFactor ) return 772; + if ( p === OneMinusDstAlphaFactor ) return 773; + + if ( p === DstColorFactor ) return 774; + if ( p === OneMinusDstColorFactor ) return 775; + if ( p === SrcAlphaSaturateFactor ) return 776; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + return p; + + } + + } + + if ( p === MinEquation || p === MaxEquation ) { + + if ( capabilities.isWebGL2 ) { + + if ( p === MinEquation ) return 32775; + if ( p === MaxEquation ) return 32776; + + } + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + if ( capabilities.isWebGL2 ) return 34042; + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + return { convert: convert }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group, + + isGroup: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + + } + + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); + + return this; + + }, + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize(); + + }, + + updateMatrixWorld: function ( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + this.matrixWorldInverse.getInverse( this.matrixWorld ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.cameras = array || []; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + /** + * @author jsantell / https://www.jsantell.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var cameraLPos = new Vector3(); + var cameraRPos = new Vector3(); + + /** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + */ + function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + var ipd = cameraLPos.distanceTo( cameraRPos ); + + var projL = cameraL.projectionMatrix.elements; + var projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + var near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + var far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + var topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + var bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + var leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + var rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + var left = near * leftFov; + var right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + var zOffset = ipd / ( - leftFov + rightFov ); + var xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + var near2 = near + zOffset; + var far2 = far + zOffset; + var left2 = left - xOffset; + var right2 = right + ( ipd - xOffset ); + var top2 = topFov * far / far2 * near2; + var bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebVRManager( renderer ) { + + var scope = this; + + var device = null; + var frameData = null; + + var poseTarget = null; + + var controllers = []; + var standingMatrix = new Matrix4(); + var standingMatrixInverse = new Matrix4(); + + var framebufferScaleFactor = 1.0; + + var frameOfReferenceType = 'stage'; + + if ( typeof window !== 'undefined' && 'VRFrameData' in window ) { + + frameData = new window.VRFrameData(); + window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false ); + + } + + var matrixWorldInverse = new Matrix4(); + var tempQuaternion = new Quaternion(); + var tempPosition = new Vector3(); + + var cameraL = new PerspectiveCamera(); + cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 ); + cameraL.layers.enable( 1 ); + + var cameraR = new PerspectiveCamera(); + cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 ); + cameraR.layers.enable( 2 ); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + function isPresenting() { + + return device !== null && device.isPresenting === true; + + } + + var currentSize, currentPixelRatio; + + function onVRDisplayPresentChange() { + + if ( isPresenting() ) { + + var eyeParameters = device.getEyeParameters( 'left' ); + var renderWidth = eyeParameters.renderWidth * framebufferScaleFactor; + var renderHeight = eyeParameters.renderHeight * framebufferScaleFactor; + + currentPixelRatio = renderer.getPixelRatio(); + currentSize = renderer.getSize(); + + renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 ); + + animation.start(); + + } else { + + if ( scope.enabled ) { + + renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio ); + + } + + animation.stop(); + + } + + } + + // + + var triggers = []; + + function findGamepad( id ) { + + var gamepads = navigator.getGamepads && navigator.getGamepads(); + + for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) { + + var gamepad = gamepads[ i ]; + + if ( gamepad && ( gamepad.id === 'Daydream Controller' || + gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' || + gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) || + gamepad.id.startsWith( 'Spatial Controller' ) ) ) { + + if ( j === id ) return gamepad; + + j ++; + + } + + } + + } + + function updateControllers() { + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var gamepad = findGamepad( i ); + + if ( gamepad !== undefined && gamepad.pose !== undefined ) { + + if ( gamepad.pose === null ) return; + + // Pose + + var pose = gamepad.pose; + + if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 ); + + if ( pose.position !== null ) controller.position.fromArray( pose.position ); + if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation ); + controller.matrix.compose( controller.position, controller.quaternion, controller.scale ); + controller.matrix.premultiply( standingMatrix ); + controller.matrix.decompose( controller.position, controller.quaternion, controller.scale ); + controller.matrixWorldNeedsUpdate = true; + controller.visible = true; + + // Trigger + + var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1; + + if ( triggers[ i ] !== gamepad.buttons[ buttonId ].pressed ) { + + triggers[ i ] = gamepad.buttons[ buttonId ].pressed; + + if ( triggers[ i ] === true ) { + + controller.dispatchEvent( { type: 'selectstart' } ); + + } else { + + controller.dispatchEvent( { type: 'selectend' } ); + controller.dispatchEvent( { type: 'select' } ); + + } + + } + + } else { + + controller.visible = false; + + } + + } + + } + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + + animation.setContext( value ); + + }; + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setPoseTarget = function ( object ) { + + if ( object !== undefined ) poseTarget = object; + + }; + + this.getCamera = function ( camera ) { + + var userHeight = frameOfReferenceType === 'stage' ? 1.6 : 0; + + if ( device === null ) { + + camera.position.set( 0, userHeight, 0 ); + return camera; + + } + + device.depthNear = camera.near; + device.depthFar = camera.far; + + device.getFrameData( frameData ); + + // + + if ( frameOfReferenceType === 'stage' ) { + + var stageParameters = device.stageParameters; + + if ( stageParameters ) { + + standingMatrix.fromArray( stageParameters.sittingToStandingTransform ); + + } else { + + standingMatrix.makeTranslation( 0, userHeight, 0 ); + + } + + } + + + var pose = frameData.pose; + var poseObject = poseTarget !== null ? poseTarget : camera; + + // We want to manipulate poseObject by its position and quaternion components since users may rely on them. + poseObject.matrix.copy( standingMatrix ); + poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale ); + + if ( pose.orientation !== null ) { + + tempQuaternion.fromArray( pose.orientation ); + poseObject.quaternion.multiply( tempQuaternion ); + + } + + if ( pose.position !== null ) { + + tempQuaternion.setFromRotationMatrix( standingMatrix ); + tempPosition.fromArray( pose.position ); + tempPosition.applyQuaternion( tempQuaternion ); + poseObject.position.add( tempPosition ); + + } + + poseObject.updateMatrixWorld(); + + if ( device.isPresenting === false ) return camera; + + // + + cameraL.near = camera.near; + cameraR.near = camera.near; + + cameraL.far = camera.far; + cameraR.far = camera.far; + + cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix ); + cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix ); + + // TODO (mrdoob) Double check this code + + standingMatrixInverse.getInverse( standingMatrix ); + + if ( frameOfReferenceType === 'stage' ) { + + cameraL.matrixWorldInverse.multiply( standingMatrixInverse ); + cameraR.matrixWorldInverse.multiply( standingMatrixInverse ); + + } + + var parent = poseObject.parent; + + if ( parent !== null ) { + + matrixWorldInverse.getInverse( parent.matrixWorld ); + + cameraL.matrixWorldInverse.multiply( matrixWorldInverse ); + cameraR.matrixWorldInverse.multiply( matrixWorldInverse ); + + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse ); + cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse ); + + cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix ); + cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix ); + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + // + + var layers = device.getLayers(); + + if ( layers.length ) { + + var layer = layers[ 0 ]; + + if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) { + + cameraL.bounds.fromArray( layer.leftBounds ); + + } + + if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) { + + cameraR.bounds.fromArray( layer.rightBounds ); + + } + + } + + updateControllers(); + + return cameraVR; + + }; + + this.getStandingMatrix = function () { + + return standingMatrix; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var animation = new WebGLAnimation(); + + this.setAnimationLoop = function ( callback ) { + + animation.setAnimationLoop( callback ); + + }; + + this.submitFrame = function () { + + if ( isPresenting() ) device.submitFrame(); + + }; + + this.dispose = function () { + + if ( typeof window !== 'undefined' ) { + + window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange ); + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebXRManager( renderer ) { + + var gl = renderer.context; + + var device = null; + var session = null; + + var framebufferScaleFactor = 1.0; + + var frameOfReference = null; + var frameOfReferenceType = 'stage'; + + var pose = null; + + var controllers = []; + var inputSources = []; + + function isPresenting() { + + return session !== null && frameOfReference !== null; + + } + + // + + var cameraL = new PerspectiveCamera(); + cameraL.layers.enable( 1 ); + cameraL.viewport = new Vector4(); + + var cameraR = new PerspectiveCamera(); + cameraR.layers.enable( 2 ); + cameraR.viewport = new Vector4(); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + if ( value instanceof XRDevice ) gl.setCompatibleXRDevice( value ); + + }; + + // + + function onSessionEvent( event ) { + + var controller = controllers[ inputSources.indexOf( event.inputSource ) ]; + if ( controller ) controller.dispatchEvent( { type: event.type } ); + + } + + function onSessionEnd() { + + renderer.setFramebuffer( null ); + animation.stop(); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setSession = function ( value ) { + + session = value; + + if ( session !== null ) { + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + + session.baseLayer = new XRWebGLLayer( session, gl, { framebufferScaleFactor: framebufferScaleFactor } ); + session.requestFrameOfReference( frameOfReferenceType ).then( function ( value ) { + + frameOfReference = value; + + renderer.setFramebuffer( session.baseLayer.framebuffer ); + + animation.setContext( session ); + animation.start(); + + } ); + + // + + inputSources = session.getInputSources(); + + session.addEventListener( 'inputsourceschange', function () { + + inputSources = session.getInputSources(); + console.log( inputSources ); + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + controller.userData.inputSource = inputSources[ i ]; + + } + + } ); + + } + + }; + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + } + + this.getCamera = function ( camera ) { + + if ( isPresenting() ) { + + var parent = camera.parent; + var cameras = cameraVR.cameras; + + updateCamera( cameraVR, parent ); + + for ( var i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + // update camera and its children + + camera.matrixWorld.copy( cameraVR.matrixWorld ); + + var children = camera.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( true ); + + } + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + return cameraVR; + + } + + return camera; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getDevicePose( frameOfReference ); + + if ( pose !== null ) { + + var layer = session.baseLayer; + var views = frame.views; + + for ( var i = 0; i < views.length; i ++ ) { + + var view = views[ i ]; + var viewport = layer.getViewport( view ); + var viewMatrix = pose.getViewMatrix( view ); + + var camera = cameraVR.cameras[ i ]; + camera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraVR.matrix.copy( camera.matrix ); + + } + + } + + } + + // + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var inputSource = inputSources[ i ]; + + if ( inputSource ) { + + var inputPose = frame.getInputPose( inputSource, frameOfReference ); + + if ( inputPose !== null ) { + + if ( 'targetRay' in inputPose ) { + + controller.matrix.elements = inputPose.targetRay.transformMatrix; + + } else if ( 'pointerMatrix' in inputPose ) { + + // DEPRECATED + + controller.matrix.elements = inputPose.pointerMatrix; + + } + + controller.matrix.decompose( controller.position, controller.rotation, controller.scale ); + controller.visible = true; + + continue; + + } + + } + + controller.visible = false; + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + // DEPRECATED + + this.getStandingMatrix = function () { + + console.warn( 'THREE.WebXRManager: getStandingMatrix() is no longer needed.' ); + return new THREE.Matrix4(); + + }; + + this.submitFrame = function () {}; + + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + var currentRenderList = null; + var currentRenderState = null; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + _isContextLost = false, + + // internal state cache + + _framebuffer = null, + + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + + // geometry and program caching + + _currentGeometryProgram = { + geometry: null, + program: null, + wireframe: false + }, + + _currentCamera = null, + _currentArrayCamera = null, + + _currentViewport = new Vector4(), + _currentScissor = new Vector4(), + _currentScissorTest = null, + + // + + _usedTextureUnits = 0, + + // + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ), + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(); + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + + } + + var extensions, capabilities, state, info; + var properties, textures, attributes, geometries, objects; + var programCache, renderLists, renderStates; + + var background, morphtargets, bufferRenderer, indexedBufferRenderer; + + var utils; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + if ( ! capabilities.isWebGL2 ) { + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'OES_element_index_uint' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + } + + extensions.get( 'OES_texture_float_linear' ); + + utils = new WebGLUtils( _gl, extensions, capabilities ); + + state = new WebGLState( _gl, extensions, utils, capabilities ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + attributes = new WebGLAttributes( _gl ); + geometries = new WebGLGeometries( _gl, attributes, info ); + objects = new WebGLObjects( geometries, info ); + morphtargets = new WebGLMorphtargets( _gl ); + programCache = new WebGLPrograms( _this, extensions, capabilities ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(); + + background = new WebGLBackground( _this, state, objects, _premultipliedAlpha ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities ); + + info.programs = programCache.programs; + + _this.context = _gl; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // vr + + var vr = null; + + if ( typeof navigator !== 'undefined' ) { + + vr = ( 'xr' in navigator ) ? new WebXRManager( _this ) : new WebVRManager( _this ); + + } + + this.vr = vr; + + // shadow map + + var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize ); + + this.shadowMap = shadowMap; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + if ( vr.isPresenting() ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function () { + + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + }; + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function () { + + return _currentViewport; + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewport.set( x, _height - y - height, width, height ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + _scissor.set( x, _height - y - height, width, height ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return background.getClearColor(); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= 16384; + if ( depth === undefined || depth ) bits |= 256; + if ( stencil === undefined || stencil ) bits |= 1024; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + objects.dispose(); + + vr.dispose(); + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + initGLContext(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( 34962, buffers.position ); + _gl.bufferData( 34962, object.positionArray, 35048 ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, 5126, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( 34962, buffers.normal ); + _gl.bufferData( 34962, object.normalArray, 35048 ); + + state.enableAttribute( programAttributes.normal ); + _gl.vertexAttribPointer( programAttributes.normal, 3, 5126, false, 0, 0 ); + + } + + if ( object.hasUvs ) { + + _gl.bindBuffer( 34962, buffers.uv ); + _gl.bufferData( 34962, object.uvArray, 35048 ); + + state.enableAttribute( programAttributes.uv ); + _gl.vertexAttribPointer( programAttributes.uv, 2, 5126, false, 0, 0 ); + + } + + if ( object.hasColors ) { + + _gl.bindBuffer( 34962, buffers.color ); + _gl.bufferData( 34962, object.colorArray, 35048 ); + + state.enableAttribute( programAttributes.color ); + _gl.vertexAttribPointer( programAttributes.color, 3, 5126, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( 4, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + var frontFaceCW = ( object.isMesh && object.normalMatrix.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, fog, material, object ); + + var updateBuffers = false; + + if ( _currentGeometryProgram.geometry !== geometry.id || + _currentGeometryProgram.program !== program.id || + _currentGeometryProgram.wireframe !== ( material.wireframe === true ) ) { + + _currentGeometryProgram.geometry = geometry.id; + _currentGeometryProgram.program = program.id; + _currentGeometryProgram.wireframe = material.wireframe === true; + updateBuffers = true; + + } + + if ( object.morphTargetInfluences ) { + + morphtargets.update( object, geometry, material, program ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var attribute; + var renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( 34963, attribute.buffer ); + + } + + } + + // + + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( 1 ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( 4 ); + break; + + case TriangleStripDrawMode: + renderer.setMode( 5 ); + break; + + case TriangleFanDrawMode: + renderer.setMode( 6 ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( 1 ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( 2 ); + + } else { + + renderer.setMode( 3 ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( 0 ); + + } else if ( object.isSprite ) { + + renderer.setMode( 4 ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry ) { + + if ( geometry && geometry.isInstancedBufferGeometry & ! capabilities.isWebGL2 ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + var buffer = attribute.buffer; + var type = attribute.type; + var bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( 34962, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( 34962, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights( camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( vr.isPresenting() ) return; + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof window !== 'undefined' ) animation.setContext( window ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + vr.setAnimationLoop( callback ); + + animation.start(); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( ! ( camera && camera.isCamera ) ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost ) return; + + // reset caching for this frame + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( vr.enabled ) { + + camera = vr.getCamera( camera ); + + } + + // + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.onBeforeRender( _this, scene, camera, renderTarget ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + var shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + currentRenderState.setupLights( camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + if ( this.info.autoReset ) this.info.reset(); + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + background.render( currentRenderList, scene, camera, forceClear ); + + // render scene + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + scene.onAfterRender( _this, scene, camera ); + + if ( vr.enabled ) { + + vr.submitFrame(); + + } + + // _gl.finish(); + + currentRenderList = null; + currentRenderState = null; + + }; + + function projectObject( object, camera, sortObjects ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + if ( camera.isArrayCamera ) { + + _currentArrayCamera = camera; + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + if ( 'viewport' in camera2 ) { // XR + + state.viewport( _currentViewport.copy( camera2.viewport ) ); + + } else { + + var bounds = camera2.bounds; + + var x = bounds.x * _width; + var y = bounds.y * _height; + var width = bounds.z * _width; + var height = bounds.w * _height; + + state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) ); + + } + + currentRenderState.setupLights( camera2 ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + _currentArrayCamera = null; + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + + renderObjectImmediate( object, program ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var lights = currentRenderState.state.lights; + var shadowsArray = currentRenderState.state.shadowsArray; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + var parameters = programCache.getParameters( + material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) { + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + programChange = false; + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.onBeforeCompile( materialProperties.shader, _this ); + + // Computing code again as onBeforeCompile may have changed the shaders + code = programCache.getProgramCode( material, parameters ); + + program = programCache.acquireProgram( material, materialProperties.shader, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.shader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + if ( lightsHash === undefined ) { + + materialProperties.lightsHash = lightsHash = {}; + + } + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.directionalLights.value = lights.state.directional; + uniforms.spotLights.value = lights.state.spot; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.pointLights.value = lights.state.point; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + var lights = currentRenderState.state.lights; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else { + + refreshUniformsPhong( m_uniforms, material ); + + } + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else { + + refreshUniformsStandard( m_uniforms, material ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + refreshUniformsMatcap( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDepth( m_uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDistance( m_uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsNormal( m_uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( m_uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( m_uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + m_uniforms.color.value = material.color; + m_uniforms.opacity.value = material.opacity; + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1; + if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2; + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value = material.color; + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + if ( material.envMap ) { + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + refreshUniformsStandard( uniforms, material ); + + uniforms.reflectivity.value = material.reflectivity; // also part of uniforms common + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture3D = ( function () { + + // backwards compatibility: peel texture.texture + return function setTexture3D( texture, slot ) { + + textures.setTexture3D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + // + + this.setFramebuffer = function ( value ) { + + _framebuffer = value; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var framebuffer = _framebuffer; + var isCube = false; + + if ( renderTarget ) { + + var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLRenderTargetCube ) { + + framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ]; + isCube = true; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( 36160, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( 36160, 36064, 34069 + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( 36160, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( 36160 ) === 36053 ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( 36160, _currentFramebuffer ); + + } + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level ) { + + var width = texture.image.width; + var height = texture.image.height; + var glFormat = utils.convert( texture.format ); + + this.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( 3553, level || 0, glFormat, position.x, position.y, width, height, 0 ); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) { + + var width = srcTexture.image.width; + var height = srcTexture.image.height; + var glFormat = utils.convert( dstTexture.format ); + var glType = utils.convert( dstTexture.type ); + + this.setTexture2D( dstTexture, 0 ); + + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( 3553, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data ); + + } else { + + _gl.texSubImage2D( 3553, level || 0, position.x, position.y, glFormat, glType, srcTexture.image ); + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color, this.density ); + + }; + + FogExp2.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color, this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene() { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * map: new THREE.Texture( ), + * rotation: , + * sizeAttenuation: + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.sizeAttenuation = true; + + this.lights = false; + this.transparent = true; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + var geometry; + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + if ( geometry === undefined ) { + + geometry = new BufferGeometry(); + + var float32Array = new Float32Array( [ + - 0.5, - 0.5, 0, 0, 0, + 0.5, - 0.5, 0, 1, 0, + 0.5, 0.5, 0, 1, 1, + - 0.5, 0.5, 0, 0, 1 + ] ); + + var interleavedBuffer = new InterleavedBuffer( float32Array, 5 ); + + geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] ); + geometry.addAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) ); + geometry.addAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) ); + + } + + this.geometry = geometry; + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldScale = new Vector3(); + var mvPosition = new Vector3(); + + var alignedPosition = new Vector2(); + var rotatedPosition = new Vector2(); + var viewWorldMatrix = new Matrix4(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) { + + // compute position in camera space + alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale ); + + // to check if rotation is not zero + if ( sin !== undefined ) { + + rotatedPosition.x = ( cos * alignedPosition.x ) - ( sin * alignedPosition.y ); + rotatedPosition.y = ( sin * alignedPosition.x ) + ( cos * alignedPosition.y ); + + } else { + + rotatedPosition.copy( alignedPosition ); + + } + + + vertexPosition.copy( mvPosition ); + vertexPosition.x += rotatedPosition.x; + vertexPosition.y += rotatedPosition.y; + + // transform to world space + vertexPosition.applyMatrix4( viewWorldMatrix ); + + } + + return function raycast( raycaster, intersects ) { + + worldScale.setFromMatrixScale( this.matrixWorld ); + viewWorldMatrix.getInverse( this.modelViewMatrix ).premultiply( this.matrixWorld ); + mvPosition.setFromMatrixPosition( this.modelViewMatrix ); + + var rotation = this.material.rotation; + var sin, cos; + if ( rotation !== 0 ) { + + cos = Math.cos( rotation ); + sin = Math.sin( rotation ); + + } + + var center = this.center; + + transformVertex( vA.set( - 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vB.set( 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vC.set( 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + + uvA.set( 0, 0 ); + uvB.set( 1, 0 ); + uvC.set( 1, 1 ); + + // check first triangle + var intersect = raycaster.ray.intersectTriangle( vA, vB, vC, false, intersectPoint ); + + if ( intersect === null ) { + + // check second triangle + transformVertex( vB.set( - 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + uvB.set( 0, 1 ); + + intersect = raycaster.ray.intersectTriangle( vA, vC, vB, false, intersectPoint ); + if ( intersect === null ) { + + return; + + } + + } + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + uv: Triangle.getUV( intersectPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + return this; + + } + + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + }, + + getBoneByName: function ( name ) { + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.manhattanLength(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.manhattanLength(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.error( 'THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.' ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = [ 0 ]; + + for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) { + + start.fromBufferAttribute( positionAttribute, i - 1 ); + end.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + lineDistances[ 0 ] = 0; + + for ( var i = 1, l = vertices.length; i < l; i ++ ) { + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] ); + + } + + } + + return this; + + }; + + }() ), + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += precision; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localPrecision = precision / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localPrecisionSq = localPrecision * localPrecision; + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = ( this && this.isLineSegments ) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.geometry.copy( source.geometry ); + this.material.copy( source.material ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = []; + + for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + start.fromBufferAttribute( positionAttribute, i ); + end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + for ( var i = 0, l = vertices.length; i < l; i += 2 ) { + + start.copy( vertices[ i ] ); + end.copy( vertices[ i + 1 ] ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + } + + return this; + + }; + + }() ) + + } ); + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * + * morphTargets: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + var intersectPoint = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + } + + VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), { + + constructor: VideoTexture, + + isVideoTexture: true, + + update: function () { + + var video = this.image; + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + CanvasTexture.prototype.isCanvasTexture = true; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + // ParametricBufferGeometry + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + if ( func.length < 3 ) { + + console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' ); + + } + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, + 0, 5, 2, 1, 2, 5, 1, 5, 3, + 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±1, ±1, ±1) + - 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, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + // TubeBufferGeometry + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + var P = new Vector3(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 1; + tube = tube || 0.4; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + // TorusBufferGeometry + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 1; + tube = tube || 0.4; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * Port from https://github.com/mapbox/earcut (v2.1.2) + */ + + var Earcut = { + + triangulate: function ( data, holeIndices, dim ) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length, + outerNode = linkedList( data, 0, outerLen, dim, true ), + triangles = []; + + if ( ! outerNode ) return triangles; + + var minX, minY, maxX, maxY, x, y, invSize; + + if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim ); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + + if ( data.length > 80 * dim ) { + + minX = maxX = data[ 0 ]; + minY = maxY = data[ 1 ]; + + for ( var i = dim; i < outerLen; i += dim ) { + + x = data[ i ]; + y = data[ i + 1 ]; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + + invSize = Math.max( maxX - minX, maxY - minY ); + invSize = invSize !== 0 ? 1 / invSize : 0; + + } + + earcutLinked( outerNode, triangles, dim, minX, minY, invSize ); + + return triangles; + + } + + }; + + // create a circular doubly linked list from polygon points in the specified winding order + + function linkedList( data, start, end, dim, clockwise ) { + + var i, last; + + if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) { + + for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } else { + + for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } + + if ( last && equals( last, last.next ) ) { + + removeNode( last ); + last = last.next; + + } + + return last; + + } + + // eliminate colinear or duplicate points + + function filterPoints( start, end ) { + + if ( ! start ) return start; + if ( ! end ) end = start; + + var p = start, again; + + do { + + again = false; + + if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) { + + removeNode( p ); + p = end = p.prev; + if ( p === p.next ) break; + again = true; + + } else { + + p = p.next; + + } + + } while ( again || p !== end ); + + return end; + + } + + // main ear slicing loop which triangulates a polygon (given as a linked list) + + function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) { + + if ( ! ear ) return; + + // interlink polygon nodes in z-order + + if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize ); + + var stop = ear, prev, next; + + // iterate through ears, slicing them one by one + + while ( ear.prev !== ear.next ) { + + prev = ear.prev; + next = ear.next; + + if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) { + + // cut off the triangle + triangles.push( prev.i / dim ); + triangles.push( ear.i / dim ); + triangles.push( next.i / dim ); + + removeNode( ear ); + + // skipping the next vertice leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + + if ( ear === stop ) { + + // try filtering points and slicing again + + if ( ! pass ) { + + earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 ); + + // if this didn't work, try curing all small self-intersections locally + + } else if ( pass === 1 ) { + + ear = cureLocalIntersections( ear, triangles, dim ); + earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 ); + + // as a last resort, try splitting the remaining polygon into two + + } else if ( pass === 2 ) { + + splitEarcut( ear, triangles, dim, minX, minY, invSize ); + + } + + break; + + } + + } + + } + + // check whether a polygon node forms a valid ear with adjacent nodes + + function isEar( ear ) { + + var a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + var p = ear.next.next; + + while ( p !== ear.prev ) { + + if ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) { + + return false; + + } + + p = p.next; + + } + + return true; + + } + + function isEarHashed( ear, minX, minY, invSize ) { + + var a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + + var minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ), + minTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ), + maxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ), + maxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y ); + + // z-order range for the current triangle bbox; + + var minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + // first look for points inside the triangle in increasing z-order + + var p = ear.nextZ; + + while ( p && p.z <= maxZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.nextZ; + + } + + // then look for points in decreasing z-order + + p = ear.prevZ; + + while ( p && p.z >= minZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + + p = p.prevZ; + + } + + return true; + + } + + // go through all polygon nodes and cure small local self-intersections + + function cureLocalIntersections( start, triangles, dim ) { + + var p = start; + + do { + + var a = p.prev, b = p.next.next; + + if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) { + + triangles.push( a.i / dim ); + triangles.push( p.i / dim ); + triangles.push( b.i / dim ); + + // remove two nodes involved + + removeNode( p ); + removeNode( p.next ); + + p = start = b; + + } + + p = p.next; + + } while ( p !== start ); + + return p; + + } + + // try splitting polygon into two and triangulate them independently + + function splitEarcut( start, triangles, dim, minX, minY, invSize ) { + + // look for a valid diagonal that divides the polygon into two + + var a = start; + + do { + + var b = a.next.next; + + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + + var c = splitPolygon( a, b ); + + // filter colinear points around the cuts + + a = filterPoints( a, a.next ); + c = filterPoints( c, c.next ); + + // run earcut on each half + + earcutLinked( a, triangles, dim, minX, minY, invSize ); + earcutLinked( c, triangles, dim, minX, minY, invSize ); + return; + + } + + b = b.next; + + } + + a = a.next; + + } while ( a !== start ); + + } + + // link every hole into the outer loop, producing a single-ring polygon without holes + + function eliminateHoles( data, holeIndices, outerNode, dim ) { + + var queue = [], i, len, start, end, list; + + for ( i = 0, len = holeIndices.length; i < len; i ++ ) { + + start = holeIndices[ i ] * dim; + end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length; + list = linkedList( data, start, end, dim, false ); + if ( list === list.next ) list.steiner = true; + queue.push( getLeftmost( list ) ); + + } + + queue.sort( compareX ); + + // process holes from left to right + + for ( i = 0; i < queue.length; i ++ ) { + + eliminateHole( queue[ i ], outerNode ); + outerNode = filterPoints( outerNode, outerNode.next ); + + } + + return outerNode; + + } + + function compareX( a, b ) { + + return a.x - b.x; + + } + + // find a bridge between vertices that connects hole with an outer ring and and link it + + function eliminateHole( hole, outerNode ) { + + outerNode = findHoleBridge( hole, outerNode ); + + if ( outerNode ) { + + var b = splitPolygon( outerNode, hole ); + + filterPoints( b, b.next ); + + } + + } + + // David Eberly's algorithm for finding a bridge between hole and outer polygon + + function findHoleBridge( hole, outerNode ) { + + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = - Infinity, + m; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + + do { + + if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) { + + var x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y ); + + if ( x <= hx && x > qx ) { + + qx = x; + + if ( x === hx ) { + + if ( hy === p.y ) return p; + if ( hy === p.next.y ) return p.next; + + } + + m = p.x < p.next.x ? p : p.next; + + } + + } + + p = p.next; + + } while ( p !== outerNode ); + + if ( ! m ) return null; + + if ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m.next; + + while ( p !== stop ) { + + if ( hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) { + + tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential + + if ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } + + return m; + + } + + // interlink polygon nodes in z-order + + function indexCurve( start, minX, minY, invSize ) { + + var p = start; + + do { + + if ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize ); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + + } while ( p !== start ); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked( p ); + + } + + // Simon Tatham's linked list merge sort algorithm + // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html + + function sortLinked( list ) { + + var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; + + do { + + p = list; + list = null; + tail = null; + numMerges = 0; + + while ( p ) { + + numMerges ++; + q = p; + pSize = 0; + + for ( i = 0; i < inSize; i ++ ) { + + pSize ++; + q = q.nextZ; + if ( ! q ) break; + + } + + qSize = inSize; + + while ( pSize > 0 || ( qSize > 0 && q ) ) { + + if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) { + + e = p; + p = p.nextZ; + pSize --; + + } else { + + e = q; + q = q.nextZ; + qSize --; + + } + + if ( tail ) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + + } + + p = q; + + } + + tail.nextZ = null; + inSize *= 2; + + } while ( numMerges > 1 ); + + return list; + + } + + // z-order of a point given coords and inverse of the longer side of data bbox + + function zOrder( x, y, minX, minY, invSize ) { + + // coords are transformed into non-negative 15-bit integer range + + x = 32767 * ( x - minX ) * invSize; + y = 32767 * ( y - minY ) * invSize; + + x = ( x | ( x << 8 ) ) & 0x00FF00FF; + x = ( x | ( x << 4 ) ) & 0x0F0F0F0F; + x = ( x | ( x << 2 ) ) & 0x33333333; + x = ( x | ( x << 1 ) ) & 0x55555555; + + y = ( y | ( y << 8 ) ) & 0x00FF00FF; + y = ( y | ( y << 4 ) ) & 0x0F0F0F0F; + y = ( y | ( y << 2 ) ) & 0x33333333; + y = ( y | ( y << 1 ) ) & 0x55555555; + + return x | ( y << 1 ); + + } + + // find the leftmost node of a polygon ring + + function getLeftmost( start ) { + + var p = start, leftmost = start; + + do { + + if ( p.x < leftmost.x ) leftmost = p; + p = p.next; + + } while ( p !== start ); + + return leftmost; + + } + + // check if a point lies within a convex triangle + + function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) { + + return ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 && + ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 && + ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0; + + } + + // check if a diagonal between two polygon nodes is valid (lies in polygon interior) + + function isValidDiagonal( a, b ) { + + return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && + locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ); + + } + + // signed area of a triangle + + function area( p, q, r ) { + + return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y ); + + } + + // check if two points are equal + + function equals( p1, p2 ) { + + return p1.x === p2.x && p1.y === p2.y; + + } + + // check if two segments intersect + + function intersects( p1, q1, p2, q2 ) { + + if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) || + ( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true; + + return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 && + area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0; + + } + + // check if a polygon diagonal intersects any polygon segments + + function intersectsPolygon( a, b ) { + + var p = a; + + do { + + if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects( p, p.next, a, b ) ) { + + return true; + + } + + p = p.next; + + } while ( p !== a ); + + return false; + + } + + // check if a polygon diagonal is locally inside the polygon + + function locallyInside( a, b ) { + + return area( a.prev, a, a.next ) < 0 ? + area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 : + area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0; + + } + + // check if the middle point of a polygon diagonal is inside the polygon + + function middleInside( a, b ) { + + var p = a, + inside = false, + px = ( a.x + b.x ) / 2, + py = ( a.y + b.y ) / 2; + + do { + + if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y && + ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) { + + inside = ! inside; + + } + + p = p.next; + + } while ( p !== a ); + + return inside; + + } + + // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; + // if one belongs to the outer ring and another to a hole, it merges it into a single ring + + function splitPolygon( a, b ) { + + var a2 = new Node( a.i, a.x, a.y ), + b2 = new Node( b.i, b.x, b.y ), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + + } + + // create a node and optionally link it with previous one (in a circular doubly linked list) + + function insertNode( i, x, y, last ) { + + var p = new Node( i, x, y ); + + if ( ! last ) { + + p.prev = p; + p.next = p; + + } else { + + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + + } + + return p; + + } + + function removeNode( p ) { + + p.next.prev = p.prev; + p.prev.next = p.next; + + if ( p.prevZ ) p.prevZ.nextZ = p.nextZ; + if ( p.nextZ ) p.nextZ.prevZ = p.prevZ; + + } + + function Node( i, x, y ) { + + // vertice index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertice nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = null; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + + } + + function signedArea( data, start, end, dim ) { + + var sum = 0; + + for ( var i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + triangulateShape: function ( contour, holes ) { + + var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + var holeIndices = []; // array of hole indices + var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + var holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( var i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + var triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( var i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + + }; + + function removeDupEndPts( points ) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + function addContour( vertices, contour ) { + + for ( var i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + ExtrudeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + + }; + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry( shapes, options ) { + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + var scope = this; + + var verticesArray = []; + var uvArray = []; + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + addShape( shape ); + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + var placeholder = []; + + // options + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + var steps = options.steps !== undefined ? options.steps : 1; + var depth = options.depth !== undefined ? options.depth : 100; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var extrudePath = options.extrudePath; + + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // deprecated options + + if ( options.amount !== undefined ) { + + console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' ); + depth = options.amount; + + } + + // + + var extrudePts, extrudeByPath = false; + var splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, depth + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length / 3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + + } + + ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + + ExtrudeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + + }; + + // + + var WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + }; + + function toJSON( shapes, options, data ) { + + // + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + // + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + TextGeometry.prototype = Object.create( Geometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + // TextBufferGeometry + + function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size ); + + // translate parameters to ExtrudeGeometry API + + parameters.depth = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); + TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + // SphereBufferGeometry + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + // RingBufferGeometry + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0.5; + outerRadius = outerRadius || 1; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + // LatheBufferGeometry + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + ShapeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON$1( shapes, data ); + + }; + + // ShapeBufferGeometry + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + ShapeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON$1( shapes, data ); + + }; + + // + + function toJSON$1( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + + } + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + edges[ key ].face2 = i; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var e = edges[ key ]; + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + // CylinderBufferGeometry + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 1; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 1; + height = height || 1; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + // ConeBufferGeometry + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + // CircleBufferGeometry + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = /*#__PURE__*/Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * color: + * } + */ + + function ShadowMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( Material.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + ShadowMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * opacity: , + * + * matcap: new THREE.Texture( ), + * + * map: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshMatcapMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'MATCAP': '' }; + + this.type = 'MeshMatcapMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.matcap = null; + + this.map = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.lights = false; + + this.setValues( parameters ); + + // a matcap is required + + if ( this.matcap === null ) { + + var canvas = document.createElement( 'canvas' ); + canvas.width = 1; + canvas.height = 1; + + var context = canvas.getContext( '2d' ); + + context.fillStyle = '#fff'; + context.fillRect( 0, 0, 1, 1 ); + + this.matcap = new THREE.CanvasTexture( canvas ); + + } + + } + + MeshMatcapMaterial.prototype = Object.create( Material.prototype ); + MeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial; + + MeshMatcapMaterial.prototype.isMeshMatcapMaterial = true; + + MeshMatcapMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'MATCAP': '' }; + + this.color.copy( source.color ); + + this.matcap = source.matcap; + + this.map = source.map; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + LineBasicMaterial.call( this ); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + LineBasicMaterial.prototype.copy.call( this, source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = /*#__PURE__*/Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshDistanceMaterial: MeshDistanceMaterial, + MeshBasicMaterial: MeshBasicMaterial, + MeshMatcapMaterial: MeshMatcapMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function ( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function ( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function ( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function ( /* i1, t0, t1 */ ) { + + // empty + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function ( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function ( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + } + + // Static methods + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + toJSON: function ( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + + } ); + + Object.assign( KeyframeTrack.prototype, { + + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrack.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + } + + function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + + } + + function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + var trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + validate: function () { + + var valid = true; + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false; + var itemsLoaded = 0; + var itemsTotal = 0; + var urlModifier = undefined; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + return this; + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var loading = {}; + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = decodeURIComponent( data ); + + if ( isBase64 ) data = atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + var view = new Uint8Array( data.length ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ view.buffer ], { type: mimeType } ); + + } else { + + response = view.buffer; + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + // Initialise array for duplicate requests + + loading[ url ] = []; + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = this.response; + + Cache.add( url, response ); + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + if ( this.status === 200 || this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + request.addEventListener( 'progress', function ( event ) { + + var callbacks = loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + request.addEventListener( 'abort', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io/ + */ + + function AnimationLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AnimationLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json, onLoad ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + onLoad( animations ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + function onImageLoad() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.jpe?g$/i ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u, optionalTarget ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = 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 + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + }, + + fromJSON: function ( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.type = 'EllipseCurve'; + + this.aX = aX || 0; + this.aY = aY || 0; + + this.xRadius = xRadius || 1; + this.yRadius = yRadius || 1; + + this.aStartAngle = aStartAngle || 0; + this.aEndAngle = aEndAngle || 2 * Math.PI; + + this.aClockwise = aClockwise || false; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + }; + + EllipseCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + }; + + + EllipseCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + }; + + EllipseCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + ArcCurve.prototype.isArcCurve = true; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly(); + + function CatmullRomCurve3( points, closed, curveType, tension ) { + + Curve.call( this ); + + this.type = 'CatmullRomCurve3'; + + this.points = points || []; + this.closed = closed || false; + this.curveType = curveType || 'centripetal'; + this.tension = tension || 0.5; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + + CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var points = this.points; + var l = points.length; + + var p = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.curveType === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + }; + + CatmullRomCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + }; + + CatmullRomCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + }; + + CatmullRomCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function QuadraticBezierP2( t, p ) { + + return t * t * p; + + } + + function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + + } + + function CubicBezierP3( t, p ) { + + return t * t * t * p; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + this.v3 = v3 || new Vector2(); + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.isCubicBezierCurve = true; + + CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + }; + + CubicBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + this.v3 = v3 || new Vector3(); + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + + CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + }; + + CubicBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve'; + + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve.prototype.getTangent = function ( /* t */ ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + LineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve3'; + + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.isLineCurve3 = true; + + LineCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + + QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + }; + + QuadraticBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + + QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + }; + + QuadraticBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.type = 'SplineCurve'; + + this.points = points || []; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var points = this.points; + var p = ( points.length - 1 ) * t; + + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var p1 = points[ intPoint ]; + var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + }; + + SplineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + }; + + SplineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + }; + + SplineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + }; + + + + var Curves = /*#__PURE__*/Object.freeze({ + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve + }); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + copy: function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.curves = []; + + for ( var i = 0, l = source.curves.length; i < l; i ++ ) { + + var curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + }, + + toJSON: function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + var curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( var i = 0, l = json.curves.length; i < l; i ++ ) { + + var curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + Path.prototype = Object.assign( Object.create( CurvePath.prototype ), { + + constructor: Path, + + setFromPoints: function ( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( var i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + }, + + copy: function ( source ) { + + CurvePath.prototype.copy.call( this, source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + }, + + toJSON: function () { + + var data = CurvePath.prototype.toJSON.call( this ); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + }, + + fromJSON: function ( json ) { + + CurvePath.prototype.fromJSON.call( this, json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape( points ) { + + Path.call( this, points ); + + this.uuid = _Math.generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( Path.prototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + copy: function ( source ) { + + Path.prototype.copy.call( this, source ); + + this.holes = []; + + for ( var i = 0, l = source.holes.length; i < l; i ++ ) { + + var hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + }, + + toJSON: function () { + + var data = Path.prototype.toJSON.call( this ); + + data.uuid = this.uuid; + data.holes = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + var hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Path.prototype.fromJSON.call( this, json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( var i = 0, l = json.holes.length; i < l; i ++ ) { + + var hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI; + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / ( 4 * Math.PI ); + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = ( left !== undefined ) ? left : - 1; + this.right = ( right !== undefined ) ? right : 1; + this.top = ( top !== undefined ) ? top : 1; + this.bottom = ( bottom !== undefined ) ? bottom : - 1; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + } + + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.combine !== undefined ) material.combine = json.combine; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.visible !== undefined ) material.visible = json.visible; + if ( json.userData !== undefined ) material.userData = json.userData; + + // Shader Material + + if ( json.uniforms !== undefined ) { + + for ( var name in json.uniforms ) { + + var uniform = json.uniforms[ name ]; + + material.uniforms[ name ] = {}; + + switch ( uniform.type ) { + + case 't': + material.uniforms[ name ].value = getTexture( uniform.value ); + break; + + case 'c': + material.uniforms[ name ].value = new Color().setHex( uniform.value ); + break; + + case 'v2': + material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); + break; + + case 'v3': + material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); + break; + + case 'v4': + material.uniforms[ name ].value = new Vector4().fromArray( uniform.value ); + break; + + case 'm4': + material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); + break; + + default: + material.uniforms[ name ].value = uniform.value; + + } + + } + + } + + if ( json.defines !== undefined ) material.defines = json.defines; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setTextures: function ( value ) { + + this.textures = value; + return this; + + } + + } ); + + /** + * @author Don McCurdy / https://www.donmccurdy.com + */ + + var LoaderUtils = { + + decodeText: function ( array ) { + + if ( typeof TextDecoder !== 'undefined' ) { + + return new TextDecoder().decode( array ); + + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + var s = ''; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + // Merges multi-byte utf-8 characters. + return decodeURIComponent( escape( s ) ); + + }, + + extractUrlBase: function ( url ) { + + var index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() {} + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + Object.assign( Loader.prototype, { + + crossOrigin: 'anonymous', + + onLoadStart: function () {}, + + onLoadProgress: function () {}, + + onLoadComplete: function () {}, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = value; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, path ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function parse( json, path ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, this.resourcePath || path, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.resourcePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + var loader = new FileLoader( scope.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: function ( json, onLoad ) { + + var shapes = this.parseShape( json.shapes ); + var geometries = this.parseGeometries( json.geometries, shapes ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseShape: function ( json ) { + + var shapes = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + }, + + parseGeometries: function ( json, shapes ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + + case 'ExtrudeGeometry': + case 'ExtrudeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + var extrudePath = data.options.extrudePath; + + if ( extrudePath !== undefined ) { + + data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.options + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.resourcePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var data = json[ i ]; + + var clip = AnimationClip.parse( data ); + + if ( data.uuid !== undefined ) clip.uuid = data.uuid; + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, il = json.length; i < il; i ++ ) { + + var image = json[ i ]; + var url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + images[ image.uuid ] = []; + + for ( var j = 0, jl = url.length; j < jl; j ++ ) { + + var currentUrl = url[ j ]; + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( currentUrl ) ? currentUrl : scope.resourcePath + currentUrl; + + images[ image.uuid ].push( loadImage( path ) ); + + } + + } else { + + // load single image + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.resourcePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture; + + if ( Array.isArray( images[ data.image ] ) ) { + + texture = new CubeTexture( images[ data.image ] ); + + } else { + + texture = new Texture( images[ data.image ] ); + + } + + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + if ( data.layers !== undefined ) object.layers.mask = data.layers; + + if ( data.children !== undefined ) { + + var children = data.children; + + for ( var i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + } ); + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + /** + * @author thespite / http://clicktorelease.com/ + */ + + + function ImageBitmapLoader( manager ) { + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + this.manager = manager !== undefined ? manager : DefaultLoadingManager; + this.options = undefined; + + } + + ImageBitmapLoader.prototype = { + + constructor: ImageBitmapLoader, + + setOptions: function setOptions( options ) { + + this.options = options; + + return this; + + }, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + fetch( url ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, scope.options ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + }, + + setCrossOrigin: function ( /* value */ ) { + + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + + function Font( data ) { + + this.type = 'Font'; + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size ) { + + if ( size === undefined ) size = 100; + + var shapes = []; + var paths = createPaths( text, size, this.data ); + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + function createPaths( text, size, data ) { + + var chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // see #13988 + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var paths = []; + + var offsetX = 0, offsetY = 0; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY, data ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( char, scale, offsetX, offsetY, data ) { + + var glyph = data.glyphs[ char ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + // Create a copy of the buffer. The `decodeAudioData` method + // detaches the buffer when complete, preventing reuse. + var bufferCopy = buffer.slice( 0 ); + + var context = AudioContext.getContext(); + context.decodeAudioData( bufferCopy, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution, options ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + options = options || { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.update = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + this.clear = function ( renderer, color, depth, stencil ) { + + var renderTarget = this.renderTarget; + + for ( var i = 0; i < 6; i ++ ) { + + renderTarget.activeCubeFace = i; + renderer.setRenderTarget( renderTarget ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + return this; + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + return this; + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.offset = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setMediaElementSource: function ( mediaElement ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaNode'; + this.source = this.context.createMediaElementSource( mediaElement ); + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + this.startTime = this.context.currentTime; + source.start( this.startTime, this.offset ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + this.source.stop(); + this.source.onended = null; + this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate; + this.isPlaying = false; + + } + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.source.onended = null; + this.offset = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + return this; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + return this; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + return this; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + return this; + + }, + + setDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) { + + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var panner = this.panner; + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + panner.setPosition( position.x, position.y, position.z ); + panner.setOrientation( orientation.x, orientation.y, orientation.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + // Characters [].:/ are reserved for track binding syntax. + var RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; + + function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: ( function () { + + var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' ); + + return function sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( reservedRe, '' ); + + }; + + }() ), + + parseTrackName: function () { + + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + var wordChar = '[^' + RESERVED_CHARS_RE + ']'; + var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar ); + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot ); + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar ); + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar ); + + var trackRe = new RegExp( '' + + '^' + + directoryRe + + nodeRe + + objectRe + + propertyRe + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function parseTrackName( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) { + + if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + + } else { + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup() { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length, + knownObject = undefined; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function () { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = - 1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function () { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function () { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function () { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function () { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function () { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function ( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function ( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function ( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function () { + + return this._effectiveWeight; + + }, + + fadeIn: function ( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function ( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function ( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function ( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function () { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function ( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function () { + + return this._effectiveTimeScale; + + }, + + setDuration: function ( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function ( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function ( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function ( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function () { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function () { + + return this._mixer; + + }, + + getClip: function () { + + return this._clip; + + }, + + getRoot: function () { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function ( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function ( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function ( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function ( deltaTime ) { + + var time = this.time + deltaTime; + var duration = this._clip.duration; + var loop = this.loop; + var loopCount = this._loopCount; + + var pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === - 1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function ( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function ( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + } ); + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: AnimationMixer, + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function ( source ) { + + BufferGeometry.prototype.copy.call( this, source ); + + this.maxInstancedCount = source.maxInstancedCount; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) { + + if ( typeof ( normalized ) === 'number' ) { + + meshPerAttribute = normalized; + + normalized = false; + + console.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' ); + + } + + BufferAttribute.call( this, array, itemSize, normalized ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. + * The azimuthal angle (theta) is measured from the positive z-axiz. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // polar angle + this.theta = ( theta !== undefined ) ? theta : 0; // azimuthal angle + + return this; + + } + + Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function () { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( _Math.clamp( y / this.radius, - 1, 1 ) ); + + } + + return this; + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + z * z ); + this.theta = Math.atan2( x, z ); + this.y = y; + + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getCenter() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getSize() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getParameter() target is now required' ); + target = new Vector2(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .clampPoint() target is now required' ); + target = new Vector2(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .delta() target is now required' ); + target = new Vector3(); + + } + + return target.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .at() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, target ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( /* renderCallback */ ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + this.light.updateMatrixWorld(); + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function getBoneList( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + } + + function SkeletonHelper( object ) { + + var bones = getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + } + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.updateMatrixWorld = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function updateMatrixWorld( force ) { + + var bones = this.bones; + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize, color ) { + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var material = new LineBasicMaterial( { fog: false } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.line = new Line( geometry, material ); + this.add( this.line ); + + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = this.line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + if ( this.color !== undefined ) { + + this.line.material.color.set( this.color ); + + } else { + + this.line.material.color.copy( this.light.color ); + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + if ( this.color === undefined ) this.material.vertexColors = VertexColors; + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( v3 ); + this.targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 0x333333 ); + + // near + + addLine( 'n1', 'n2', colorFrustum ); + addLine( 'n2', 'n4', colorFrustum ); + addLine( 'n4', 'n3', colorFrustum ); + addLine( 'n3', 'n1', colorFrustum ); + + // far + + addLine( 'f1', 'f2', colorFrustum ); + addLine( 'f2', 'f4', colorFrustum ); + addLine( 'f4', 'f3', colorFrustum ); + addLine( 'f3', 'f1', colorFrustum ); + + // sides + + addLine( 'n1', 'f1', colorFrustum ); + addLine( 'n2', 'f2', colorFrustum ); + addLine( 'n3', 'f3', colorFrustum ); + addLine( 'n4', 'f4', colorFrustum ); + + // cone + + addLine( 'p', 'n1', colorCone ); + addLine( 'p', 'n2', colorCone ); + addLine( 'p', 'n3', colorCone ); + addLine( 'p', 'n4', colorCone ); + + // up + + addLine( 'u1', 'u2', colorUp ); + addLine( 'u2', 'u3', colorUp ); + addLine( 'u3', 'u1', colorUp ); + + // target + + addLine( 'c', 't', colorTarget ); + addLine( 'p', 'c', colorCross ); + + // cross + + addLine( 'cn1', 'cn2', colorCross ); + addLine( 'cn3', 'cn4', colorCross ); + + addLine( 'cf1', 'cf2', colorCross ); + addLine( 'cf3', 'cf4', colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( 'c', 0, 0, - 1 ); + setPoint( 't', 0, 0, 1 ); + + // near + + setPoint( 'n1', - w, - h, - 1 ); + setPoint( 'n2', w, - h, - 1 ); + setPoint( 'n3', - w, h, - 1 ); + setPoint( 'n4', w, h, - 1 ); + + // far + + setPoint( 'f1', - w, - h, 1 ); + setPoint( 'f2', w, - h, 1 ); + setPoint( 'f3', - w, h, 1 ); + setPoint( 'f4', w, h, 1 ); + + // up + + setPoint( 'u1', w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', - w, 0, 1 ); + setPoint( 'cf2', w, 0, 1 ); + setPoint( 'cf3', 0, - h, 1 ); + setPoint( 'cf4', 0, h, 1 ); + + setPoint( 'cn1', - w, 0, - 1 ); + setPoint( 'cn2', w, 0, - 1 ); + setPoint( 'cn3', 0, - h, - 1 ); + setPoint( 'cn4', 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + + }; + + BoxHelper.prototype.copy = function ( source ) { + + LineSegments.prototype.copy.call( this, source ); + + this.object = source.object; + + return this; + + }; + + BoxHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3Helper( box, hex ) { + + this.type = 'Box3Helper'; + + this.box = box; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ] ); + + var 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 ]; + + var geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.geometry.computeBoundingSphere(); + + } + + Box3Helper.prototype = Object.create( LineSegments.prototype ); + Box3Helper.prototype.constructor = Box3Helper; + + Box3Helper.prototype.updateMatrixWorld = function ( force ) { + + var box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function PlaneHelper( plane, size, hex ) { + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = ( size === undefined ) ? 1 : size; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + Line.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + // + + var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + var geometry2 = new BufferGeometry(); + geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) ); + + } + + PlaneHelper.prototype = Object.create( Line.prototype ); + PlaneHelper.prototype.constructor = PlaneHelper; + + PlaneHelper.prototype.updateMatrixWorld = function ( force ) { + + var scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here + + this.lookAt( this.plane.normal ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry, coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( dir === undefined ) dir = new THREE.Vector3( 0, 0, 1 ); + if ( origin === undefined ) origin = new THREE.Vector3( 0, 0, 0 ); + if ( length === undefined ) length = 1; + if ( color === undefined ) color = 0xffff00; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + ArrowHelper.prototype.copy = function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + this.line.copy( source.line ); + this.cone.copy( source.cone ); + + return this; + + }; + + ArrowHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxesHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxesHelper.prototype = Object.create( LineSegments.prototype ); + AxesHelper.prototype.constructor = AxesHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + + } + + var LineStrip = 0; + + var LinePieces = 1; + + function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + + } + + function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; + + } + + function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + + } + + function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + + } + + // + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + + } + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + Object.assign( CurvePath.prototype, { + + createPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from path points (for Line or Points objects) + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createSpacedPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from equidistant sampling along the path + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + // + + Object.assign( Path.prototype, { + + fromPoints: function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + this.setFromPoints( points ); + + } + + } ); + + // + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( /* a */ ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( /* optionalTarget */ ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( /* samplingCoef */ ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + // + + function AxisHelper( size ) { + + console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' ); + return new AxesHelper( size ); + + } + + function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + + } + + function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + + }; + + function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + // + + Object.assign( Loader.prototype, { + + extractUrlBase: function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + + } + + } ); + + function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + + } + + function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + + } + + Object.assign( JSONLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.JSONLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + + } ); + + Object.assign( ObjectLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + + } ); + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + Object.assign( _Math, { + + random16: function () { + + console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + nearestPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' ); + return _Math.floorPowerOfTwo( value ); + + }, + + nextPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' ); + return _Math.ceilPowerOfTwo( value ); + + } + + } ); + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Triangle.prototype, { + + area: function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + + }, + barycoordFromPoint: function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + + }, + midpoint: function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + + }, + normal: function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + + }, + plane: function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + + } + + } ); + + Object.assign( Triangle, { + + barycoordFromPoint: function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + + }, + normal: function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extractAllPoints: function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + + }, + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + // + + Object.assign( Geometry.prototype, { + + computeTangents: function () { + + console.error( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + computeLineDistances: function () { + + console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' ); + + } + + } ); + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + getWorldRotation: function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + copyIndicesArray: function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.assign( ExtrudeBufferGeometry.prototype, { + + getArrays: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' ); + + }, + + addShapeList: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' ); + + }, + + addShape: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' ); + + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + + overdraw: { + get: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + } + }, + + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + clearTarget: function ( renderTarget, color, depth, stencil ) { + + console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ); + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }, + + animate: function ( callback ) { + + console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ); + this.setAnimationLoop( callback ); + + }, + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + getMaxAnisotropy: function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + + }, + + getPrecision: function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + + }, + + resetGLState: function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }, + setFaceCulling: function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Object.defineProperties( WebVRManager.prototype, { + + standing: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .standing has been removed.' ); + + } + }, + userHeight: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .userHeight has been removed.' ); + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + + }; + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + ImageUtils.crossOrigin = undefined; + + ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }; + + ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }; + + ImageUtils.loadCompressedTexture = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }; + + ImageUtils.loadCompressedTextureCube = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + }; + + // + + function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been removed' ); + + } + + // + + var SceneUtils = { + + createMultiMaterialObject: function ( /* geometry, materials */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + detach: function ( /* child, parent, scene */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + attach: function ( /* child, scene, parent */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + } + + }; + + // + + function LensFlare() { + + console.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' ); + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.LineLoop = LineLoop; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.DataTexture3D = DataTexture3D; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.Texture = Texture; + exports.AnimationLoader = AnimationLoader; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.ImageBitmapLoader = ImageBitmapLoader; + exports.FontLoader = FontLoader; + exports.FileLoader = FileLoader; + exports.Loader = Loader; + exports.LoaderUtils = LoaderUtils; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.RectAreaLight = RectAreaLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.ArrayCamera = ArrayCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.AudioContext = AudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.Face3 = Face3; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Cylindrical = Cylindrical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.Color = Color; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.RectAreaLightHelper = RectAreaLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.PolarGridHelper = PolarGridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoxHelper = BoxHelper; + exports.Box3Helper = Box3Helper; + exports.PlaneHelper = PlaneHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxesHelper = AxesHelper; + exports.Shape = Shape; + exports.Path = Path; + exports.ShapePath = ShapePath; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ImageUtils = ImageUtils; + exports.ShapeUtils = ShapeUtils; + exports.WebGLUtils = WebGLUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.TextBufferGeometry = TextBufferGeometry; + exports.SphereGeometry = SphereGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ShapeBufferGeometry = ShapeBufferGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.ExtrudeBufferGeometry = ExtrudeBufferGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshToonMaterial = MeshToonMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshDistanceMaterial = MeshDistanceMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.MeshMatcapMaterial = MeshMatcapMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.Float64BufferAttribute = Float64BufferAttribute; + exports.Float32BufferAttribute = Float32BufferAttribute; + exports.Uint32BufferAttribute = Uint32BufferAttribute; + exports.Int32BufferAttribute = Int32BufferAttribute; + exports.Uint16BufferAttribute = Uint16BufferAttribute; + exports.Int16BufferAttribute = Int16BufferAttribute; + exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute; + exports.Uint8BufferAttribute = Uint8BufferAttribute; + exports.Int8BufferAttribute = Int8BufferAttribute; + exports.BufferAttribute = BufferAttribute; + exports.ArcCurve = ArcCurve; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.CubicBezierCurve = CubicBezierCurve; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.EllipseCurve = EllipseCurve; + exports.LineCurve = LineCurve; + exports.LineCurve3 = LineCurve3; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.SplineCurve = SplineCurve; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RedFormat = RedFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.RGBA_ASTC_4x4_Format = RGBA_ASTC_4x4_Format; + exports.RGBA_ASTC_5x4_Format = RGBA_ASTC_5x4_Format; + exports.RGBA_ASTC_5x5_Format = RGBA_ASTC_5x5_Format; + exports.RGBA_ASTC_6x5_Format = RGBA_ASTC_6x5_Format; + exports.RGBA_ASTC_6x6_Format = RGBA_ASTC_6x6_Format; + exports.RGBA_ASTC_8x5_Format = RGBA_ASTC_8x5_Format; + exports.RGBA_ASTC_8x6_Format = RGBA_ASTC_8x6_Format; + exports.RGBA_ASTC_8x8_Format = RGBA_ASTC_8x8_Format; + exports.RGBA_ASTC_10x5_Format = RGBA_ASTC_10x5_Format; + exports.RGBA_ASTC_10x6_Format = RGBA_ASTC_10x6_Format; + exports.RGBA_ASTC_10x8_Format = RGBA_ASTC_10x8_Format; + exports.RGBA_ASTC_10x10_Format = RGBA_ASTC_10x10_Format; + exports.RGBA_ASTC_12x10_Format = RGBA_ASTC_12x10_Format; + exports.RGBA_ASTC_12x12_Format = RGBA_ASTC_12x12_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.TangentSpaceNormalMap = TangentSpaceNormalMap; + exports.ObjectSpaceNormalMap = ObjectSpaceNormalMap; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MeshFaceMaterial; + exports.MultiMaterial = MultiMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Particle; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Int8Attribute = Int8Attribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Float64Attribute = Float64Attribute; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.Spline = Spline; + exports.AxisHelper = AxisHelper; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.XHRLoader = XHRLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.GeometryUtils = GeometryUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + exports.SceneUtils = SceneUtils; + exports.LensFlare = LensFlare; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 0000000..6783c51 --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,37 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function arrayMin( array ) { + + if ( array.length === 0 ) return Infinity; + + var min = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] < min ) min = array[ i ]; + + } + + return min; + +} + +function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + +} + +export { arrayMin, arrayMax }; diff --git a/lib/whs.js b/lib/whs.js new file mode 100644 index 0000000..3af1d41 --- /dev/null +++ b/lib/whs.js @@ -0,0 +1,62443 @@ +/* WhitestormJS Framework v2.2.0-beta.2 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.WHS = {}))); +}(this, (function (exports) { 'use strict'; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var runtime = createCommonjsModule(function (module) { + /** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + !(function(global) { + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined; // More compressible than void 0. + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + var inModule = 'object' === "object"; + var runtime = global.regeneratorRuntime; + if (runtime) { + if (inModule) { + // If regeneratorRuntime is defined globally and we're in a module, + // make the exports object identical to regeneratorRuntime. + module.exports = runtime; + } + // Don't bother evaluating the rest of this file if the runtime was + // already defined globally. + return; + } + + // Define the runtime globally (as expected by generated code) as either + // module.exports (if we're in a module) or a new, empty object. + runtime = global.regeneratorRuntime = inModule ? module.exports : {}; + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + runtime.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + var IteratorPrototype = {}; + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + if (NativeIteratorPrototype && + NativeIteratorPrototype !== Op && + hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = + Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunctionPrototype[toStringTagSymbol] = + GeneratorFunction.displayName = "GeneratorFunction"; + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + prototype[method] = function(arg) { + return this._invoke(method, arg); + }; + }); + } + + runtime.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + runtime.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + if (!(toStringTagSymbol in genFun)) { + genFun[toStringTagSymbol] = "GeneratorFunction"; + } + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + runtime.awrap = function(arg) { + return { __await: arg }; + }; + + function AsyncIterator(generator) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + if (value && + typeof value === "object" && + hasOwn.call(value, "__await")) { + return Promise.resolve(value.__await).then(function(value) { + invoke("next", value, resolve, reject); + }, function(err) { + invoke("throw", err, resolve, reject); + }); + } + + return Promise.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. If the Promise is rejected, however, the + // result for this iteration will be rejected with the same + // reason. Note that rejections of yielded Promises are not + // thrown back into the generator function, as is the case + // when an awaited Promise is rejected. This difference in + // behavior between yield and await is important, because it + // allows the consumer to decide what to do with the yielded + // rejection (swallow it and continue, manually .throw it back + // into the generator, abandon iteration, whatever). With + // await, by contrast, there is no opportunity to examine the + // rejection reason outside the generator function, so the + // only option is to throw it from the await expression, and + // let the generator function handle the exception. + result.value = unwrapped; + resolve(result); + }, reject); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new Promise(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + runtime.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + runtime.async = function(innerFn, outerFn, self, tryLocsList) { + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList) + ); + + return runtime.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + if (delegate.iterator.return) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + Gp[toStringTagSymbol] = "Generator"; + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + runtime.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + runtime.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined; + } + + return ContinueSentinel; + } + }; + })( + // In sloppy mode, unbound `this` refers to the global object, fallback to + // Function constructor if we're in global strict mode. That is sadly a form + // of indirect eval which violates Content Security Policy. + (function() { return this })() || Function("return this")() + ); + }); + + /** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + // This method of obtaining a reference to the global object needs to be + // kept identical to the way it is obtained in runtime.js + var g = (function() { return this })() || Function("return this")(); + + // Use `getOwnPropertyNames` because not all browsers support calling + // `hasOwnProperty` on the global `self` object in a worker. See #183. + var hadRuntime = g.regeneratorRuntime && + Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0; + + // Save the old regeneratorRuntime in case it needs to be restored later. + var oldRuntime = hadRuntime && g.regeneratorRuntime; + + // Force reevalutation of runtime.js. + g.regeneratorRuntime = undefined; + + var runtimeModule = runtime; + + if (hadRuntime) { + // Restore the original runtime. + g.regeneratorRuntime = oldRuntime; + } else { + // Remove the global property added by runtime.js. + try { + delete g.regeneratorRuntime; + } catch(e) { + g.regeneratorRuntime = undefined; + } + } + + var regenerator = runtimeModule; + + // 7.1.4 ToInteger + var ceil = Math.ceil; + var floor = Math.floor; + var _toInteger = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); + }; + + // 7.2.1 RequireObjectCoercible(argument) + var _defined = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; + }; + + // true -> String#at + // false -> String#codePointAt + var _stringAt = function (TO_STRING) { + return function (that, pos) { + var s = String(_defined(that)); + var i = _toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; + }; + + var _library = true; + + var _global = createCommonjsModule(function (module) { + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); + if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + }); + + var _core = createCommonjsModule(function (module) { + var core = module.exports = { version: '2.5.6' }; + if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + }); + var _core_1 = _core.version; + + var _aFunction = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; + }; + + // optional / simple context binding + + var _ctx = function (fn, that, length) { + _aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; + }; + + var _isObject = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; + }; + + var _anObject = function (it) { + if (!_isObject(it)) throw TypeError(it + ' is not an object!'); + return it; + }; + + var _fails = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } + }; + + // Thank's IE8 for his funny defineProperty + var _descriptors = !_fails(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; + }); + + var document$1 = _global.document; + // typeof document.createElement is 'object' in old IE + var is = _isObject(document$1) && _isObject(document$1.createElement); + var _domCreate = function (it) { + return is ? document$1.createElement(it) : {}; + }; + + var _ie8DomDefine = !_descriptors && !_fails(function () { + return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7; + }); + + // 7.1.1 ToPrimitive(input [, PreferredType]) + + // instead of the ES6 spec version, we didn't implement @@toPrimitive case + // and the second argument - flag - preferred type is a string + var _toPrimitive = function (it, S) { + if (!_isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); + }; + + var dP = Object.defineProperty; + + var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) { + _anObject(O); + P = _toPrimitive(P, true); + _anObject(Attributes); + if (_ie8DomDefine) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; + }; + + var _objectDp = { + f: f + }; + + var _propertyDesc = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; + }; + + var _hide = _descriptors ? function (object, key, value) { + return _objectDp.f(object, key, _propertyDesc(1, value)); + } : function (object, key, value) { + object[key] = value; + return object; + }; + + var hasOwnProperty = {}.hasOwnProperty; + var _has = function (it, key) { + return hasOwnProperty.call(it, key); + }; + + var PROTOTYPE = 'prototype'; + + var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var IS_WRAP = type & $export.W; + var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {}); + var expProto = exports[PROTOTYPE]; + var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] : (_global[name] || {})[PROTOTYPE]; + var key, own, out; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + if (own && _has(exports, key)) continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? _ctx(out, _global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function (C) { + var F = function (a, b, c) { + if (this instanceof C) { + switch (arguments.length) { + case 0: return new C(); + case 1: return new C(a); + case 2: return new C(a, b); + } return new C(a, b, c); + } return C.apply(this, arguments); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out; + // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% + if (IS_PROTO) { + (exports.virtual || (exports.virtual = {}))[key] = out; + // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% + if (type & $export.R && expProto && !expProto[key]) _hide(expProto, key, out); + } + } + }; + // type bitmap + $export.F = 1; // forced + $export.G = 2; // global + $export.S = 4; // static + $export.P = 8; // proto + $export.B = 16; // bind + $export.W = 32; // wrap + $export.U = 64; // safe + $export.R = 128; // real proto method for `library` + var _export = $export; + + var _redefine = _hide; + + var _iterators = {}; + + var toString = {}.toString; + + var _cof = function (it) { + return toString.call(it).slice(8, -1); + }; + + // fallback for non-array-like ES3 and non-enumerable old V8 strings + + // eslint-disable-next-line no-prototype-builtins + var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return _cof(it) == 'String' ? it.split('') : Object(it); + }; + + // to indexed object, toObject with fallback for non-array-like ES3 strings + + + var _toIobject = function (it) { + return _iobject(_defined(it)); + }; + + // 7.1.15 ToLength + + var min = Math.min; + var _toLength = function (it) { + return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 + }; + + var max = Math.max; + var min$1 = Math.min; + var _toAbsoluteIndex = function (index, length) { + index = _toInteger(index); + return index < 0 ? max(index + length, 0) : min$1(index, length); + }; + + // false -> Array#indexOf + // true -> Array#includes + + + + var _arrayIncludes = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = _toIobject($this); + var length = _toLength(O.length); + var index = _toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; + }; + + var _shared = createCommonjsModule(function (module) { + var SHARED = '__core-js_shared__'; + var store = _global[SHARED] || (_global[SHARED] = {}); + + (module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); + })('versions', []).push({ + version: _core.version, + mode: _library ? 'pure' : 'global', + copyright: '© 2018 Denis Pushkarev (zloirock.ru)' + }); + }); + + var id = 0; + var px = Math.random(); + var _uid = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); + }; + + var shared = _shared('keys'); + + var _sharedKey = function (key) { + return shared[key] || (shared[key] = _uid(key)); + }; + + var arrayIndexOf = _arrayIncludes(false); + var IE_PROTO = _sharedKey('IE_PROTO'); + + var _objectKeysInternal = function (object, names) { + var O = _toIobject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (_has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; + }; + + // IE 8- don't enum bug keys + var _enumBugKeys = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' + ).split(','); + + // 19.1.2.14 / 15.2.3.14 Object.keys(O) + + + + var _objectKeys = Object.keys || function keys(O) { + return _objectKeysInternal(O, _enumBugKeys); + }; + + var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) { + _anObject(O); + var keys = _objectKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]); + return O; + }; + + var document$2 = _global.document; + var _html = document$2 && document$2.documentElement; + + // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) + + + + var IE_PROTO$1 = _sharedKey('IE_PROTO'); + var Empty = function () { /* empty */ }; + var PROTOTYPE$1 = 'prototype'; + + // Create object with fake `null` prototype: use iframe Object with cleared prototype + var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = _domCreate('iframe'); + var i = _enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + _html.appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]]; + return createDict(); + }; + + var _objectCreate = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE$1] = _anObject(O); + result = new Empty(); + Empty[PROTOTYPE$1] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO$1] = O; + } else result = createDict(); + return Properties === undefined ? result : _objectDps(result, Properties); + }; + + var _wks = createCommonjsModule(function (module) { + var store = _shared('wks'); + + var Symbol = _global.Symbol; + var USE_SYMBOL = typeof Symbol == 'function'; + + var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name)); + }; + + $exports.store = store; + }); + + var def = _objectDp.f; + + var TAG = _wks('toStringTag'); + + var _setToStringTag = function (it, tag, stat) { + if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); + }; + + var IteratorPrototype = {}; + + // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() + _hide(IteratorPrototype, _wks('iterator'), function () { return this; }); + + var _iterCreate = function (Constructor, NAME, next) { + Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) }); + _setToStringTag(Constructor, NAME + ' Iterator'); + }; + + // 7.1.13 ToObject(argument) + + var _toObject = function (it) { + return Object(_defined(it)); + }; + + // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) + + + var IE_PROTO$2 = _sharedKey('IE_PROTO'); + var ObjectProto = Object.prototype; + + var _objectGpo = Object.getPrototypeOf || function (O) { + O = _toObject(O); + if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; + }; + + var ITERATOR = _wks('iterator'); + var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` + var FF_ITERATOR = '@@iterator'; + var KEYS = 'keys'; + var VALUES = 'values'; + + var returnThis = function () { return this; }; + + var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + _iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = _objectGpo($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + _setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + _hide(proto, ITERATOR, $default); + } + // Plug for library + _iterators[NAME] = $default; + _iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) _redefine(proto, key, methods[key]); + } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; + }; + + var $at = _stringAt(true); + + // 21.1.3.27 String.prototype[@@iterator]() + _iterDefine(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index + // 21.1.5.2.1 %StringIteratorPrototype%.next() + }, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; + }); + + var _iterStep = function (done, value) { + return { value: value, done: !!done }; + }; + + // 22.1.3.4 Array.prototype.entries() + // 22.1.3.13 Array.prototype.keys() + // 22.1.3.29 Array.prototype.values() + // 22.1.3.30 Array.prototype[@@iterator]() + var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) { + this._t = _toIobject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind + // 22.1.5.2.1 %ArrayIteratorPrototype%.next() + }, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return _iterStep(1); + } + if (kind == 'keys') return _iterStep(0, index); + if (kind == 'values') return _iterStep(0, O[index]); + return _iterStep(0, [index, O[index]]); + }, 'values'); + + // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) + _iterators.Arguments = _iterators.Array; + + var TO_STRING_TAG = _wks('toStringTag'); + + var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' + + 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' + + 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' + + 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' + + 'TextTrackList,TouchList').split(','); + + for (var i = 0; i < DOMIterables.length; i++) { + var NAME = DOMIterables[i]; + var Collection = _global[NAME]; + var proto = Collection && Collection.prototype; + if (proto && !proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME); + _iterators[NAME] = _iterators.Array; + } + + // getting tag from 19.1.3.6 Object.prototype.toString() + + var TAG$1 = _wks('toStringTag'); + // ES3 wrong here + var ARG = _cof(function () { return arguments; }()) == 'Arguments'; + + // fallback for IE11 Script Access Denied error + var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } + }; + + var _classof = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T + // builtinTag case + : ARG ? _cof(O) + // ES3 arguments fallback + : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; + }; + + var _anInstance = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; + }; + + // call something on iterator step with safe closing on error + + var _iterCall = function (iterator, fn, value, entries) { + try { + return entries ? fn(_anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) _anObject(ret.call(iterator)); + throw e; + } + }; + + // check on default Array iterator + + var ITERATOR$1 = _wks('iterator'); + var ArrayProto = Array.prototype; + + var _isArrayIter = function (it) { + return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR$1] === it); + }; + + var ITERATOR$2 = _wks('iterator'); + + var core_getIteratorMethod = _core.getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR$2] + || it['@@iterator'] + || _iterators[_classof(it)]; + }; + + var _forOf = createCommonjsModule(function (module) { + var BREAK = {}; + var RETURN = {}; + var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable); + var f = _ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) { + result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = _iterCall(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } + }; + exports.BREAK = BREAK; + exports.RETURN = RETURN; + }); + + // 7.3.20 SpeciesConstructor(O, defaultConstructor) + + + var SPECIES = _wks('species'); + var _speciesConstructor = function (O, D) { + var C = _anObject(O).constructor; + var S; + return C === undefined || (S = _anObject(C)[SPECIES]) == undefined ? D : _aFunction(S); + }; + + // fast apply, http://jsperf.lnkit.com/fast-apply/5 + var _invoke = function (fn, args, that) { + var un = that === undefined; + switch (args.length) { + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); + }; + + var process = _global.process; + var setTask = _global.setImmediate; + var clearTask = _global.clearImmediate; + var MessageChannel = _global.MessageChannel; + var Dispatch = _global.Dispatch; + var counter = 0; + var queue = {}; + var ONREADYSTATECHANGE = 'onreadystatechange'; + var defer, channel, port; + var run = function () { + var id = +this; + // eslint-disable-next-line no-prototype-builtins + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } + }; + var listener = function (event) { + run.call(event.data); + }; + // Node.js 0.9+ & IE10+ has setImmediate, otherwise: + if (!setTask || !clearTask) { + setTask = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) args.push(arguments[i++]); + queue[++counter] = function () { + // eslint-disable-next-line no-new-func + _invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (_cof(process) == 'process') { + defer = function (id) { + process.nextTick(_ctx(run, id, 1)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(_ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = _ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) { + defer = function (id) { + _global.postMessage(id + '', '*'); + }; + _global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in _domCreate('script')) { + defer = function (id) { + _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () { + _html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(_ctx(run, id, 1), 0); + }; + } + } + var _task = { + set: setTask, + clear: clearTask + }; + + var macrotask = _task.set; + var Observer = _global.MutationObserver || _global.WebKitMutationObserver; + var process$1 = _global.process; + var Promise$1 = _global.Promise; + var isNode = _cof(process$1) == 'process'; + + var _microtask = function () { + var head, last, notify; + + var flush = function () { + var parent, fn; + if (isNode && (parent = process$1.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (e) { + if (head) notify(); + else last = undefined; + throw e; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // Node.js + if (isNode) { + notify = function () { + process$1.nextTick(flush); + }; + // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 + } else if (Observer && !(_global.navigator && _global.navigator.standalone)) { + var toggle = true; + var node = document.createTextNode(''); + new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (Promise$1 && Promise$1.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + var promise = Promise$1.resolve(undefined); + notify = function () { + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(_global, flush); + }; + } + + return function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; + }; + }; + + // 25.4.1.5 NewPromiseCapability(C) + + + function PromiseCapability(C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = _aFunction(resolve); + this.reject = _aFunction(reject); + } + + var f$1 = function (C) { + return new PromiseCapability(C); + }; + + var _newPromiseCapability = { + f: f$1 + }; + + var _perform = function (exec) { + try { + return { e: false, v: exec() }; + } catch (e) { + return { e: true, v: e }; + } + }; + + var navigator = _global.navigator; + + var _userAgent = navigator && navigator.userAgent || ''; + + var _promiseResolve = function (C, x) { + _anObject(C); + if (_isObject(x) && x.constructor === C) return x; + var promiseCapability = _newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; + }; + + var _redefineAll = function (target, src, safe) { + for (var key in src) { + if (safe && target[key]) target[key] = src[key]; + else _hide(target, key, src[key]); + } return target; + }; + + var SPECIES$1 = _wks('species'); + + var _setSpecies = function (KEY) { + var C = typeof _core[KEY] == 'function' ? _core[KEY] : _global[KEY]; + if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, { + configurable: true, + get: function () { return this; } + }); + }; + + var ITERATOR$3 = _wks('iterator'); + var SAFE_CLOSING = false; + + try { + var riter = [7][ITERATOR$3](); + riter['return'] = function () { SAFE_CLOSING = true; }; + } catch (e) { /* empty */ } + + var _iterDetect = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR$3](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR$3] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; + }; + + var task = _task.set; + var microtask = _microtask(); + + + + + var PROMISE = 'Promise'; + var TypeError$1 = _global.TypeError; + var process$2 = _global.process; + var versions = process$2 && process$2.versions; + var v8 = versions && versions.v8 || ''; + var $Promise = _global[PROMISE]; + var isNode$1 = _classof(process$2) == 'process'; + var empty = function () { /* empty */ }; + var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; + var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f; + + var USE_NATIVE = !!function () { + try { + // correct subclassing with @@species support + var promise = $Promise.resolve(1); + var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) { + exec(empty, empty); + }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return (isNode$1 || typeof PromiseRejectionEvent == 'function') + && promise.then(empty) instanceof FakePromise + // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // we can't detect it synchronously, so just check versions + && v8.indexOf('6.6') !== 0 + && _userAgent.indexOf('Chrome/66') === -1; + } catch (e) { /* empty */ } + }(); + + // helpers + var isThenable = function (it) { + var then; + return _isObject(it) && typeof (then = it.then) == 'function' ? then : false; + }; + var notify = function (promise, isReject) { + if (promise._n) return; + promise._n = true; + var chain = promise._c; + microtask(function () { + var value = promise._v; + var ok = promise._s == 1; + var i = 0; + var run = function (reaction) { + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (promise._h == 2) onHandleUnhandled(promise); + promise._h = 1; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // may throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError$1('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (e) { + if (domain && !exited) domain.exit(); + reject(e); + } + }; + while (chain.length > i) run(chain[i++]); // variable length - can't use forEach + promise._c = []; + promise._n = false; + if (isReject && !promise._h) onUnhandled(promise); + }); + }; + var onUnhandled = function (promise) { + task.call(_global, function () { + var value = promise._v; + var unhandled = isUnhandled(promise); + var result, handler, console; + if (unhandled) { + result = _perform(function () { + if (isNode$1) { + process$2.emit('unhandledRejection', value, promise); + } else if (handler = _global.onunhandledrejection) { + handler({ promise: promise, reason: value }); + } else if ((console = _global.console) && console.error) { + console.error('Unhandled promise rejection', value); + } + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1; + } promise._a = undefined; + if (unhandled && result.e) throw result.v; + }); + }; + var isUnhandled = function (promise) { + return promise._h !== 1 && (promise._a || promise._c).length === 0; + }; + var onHandleUnhandled = function (promise) { + task.call(_global, function () { + var handler; + if (isNode$1) { + process$2.emit('rejectionHandled', promise); + } else if (handler = _global.onrejectionhandled) { + handler({ promise: promise, reason: promise._v }); + } + }); + }; + var $reject = function (value) { + var promise = this; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + promise._v = value; + promise._s = 2; + if (!promise._a) promise._a = promise._c.slice(); + notify(promise, true); + }; + var $resolve = function (value) { + var promise = this; + var then; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + try { + if (promise === value) throw TypeError$1("Promise can't be resolved itself"); + if (then = isThenable(value)) { + microtask(function () { + var wrapper = { _w: promise, _d: false }; // wrap + try { + then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1)); + } catch (e) { + $reject.call(wrapper, e); + } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); + } + } catch (e) { + $reject.call({ _w: promise, _d: false }, e); // wrap + } + }; + + // constructor polyfill + if (!USE_NATIVE) { + // 25.4.3.1 Promise(executor) + $Promise = function Promise(executor) { + _anInstance(this, $Promise, PROMISE, '_h'); + _aFunction(executor); + Internal.call(this); + try { + executor(_ctx($resolve, this, 1), _ctx($reject, this, 1)); + } catch (err) { + $reject.call(this, err); + } + }; + // eslint-disable-next-line no-unused-vars + Internal = function Promise(executor) { + this._c = []; // <- awaiting reactions + this._a = undefined; // <- checked in isUnhandled reactions + this._s = 0; // <- state + this._d = false; // <- done + this._v = undefined; // <- value + this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled + this._n = false; // <- notify + }; + Internal.prototype = _redefineAll($Promise.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected) { + var reaction = newPromiseCapability(_speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = isNode$1 ? process$2.domain : undefined; + this._c.push(reaction); + if (this._a) this._a.push(reaction); + if (this._s) notify(this, false); + return reaction.promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + this.promise = promise; + this.resolve = _ctx($resolve, promise, 1); + this.reject = _ctx($reject, promise, 1); + }; + _newPromiseCapability.f = newPromiseCapability = function (C) { + return C === $Promise || C === Wrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + } + + _export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise }); + _setToStringTag($Promise, PROMISE); + _setSpecies(PROMISE); + Wrapper = _core[PROMISE]; + + // statics + _export(_export.S + _export.F * !USE_NATIVE, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r) { + var capability = newPromiseCapability(this); + var $$reject = capability.reject; + $$reject(r); + return capability.promise; + } + }); + _export(_export.S + _export.F * (_library || !USE_NATIVE), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x) { + return _promiseResolve(_library && this === Wrapper ? $Promise : this, x); + } + }); + _export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) { + $Promise.all(iter)['catch'](empty); + })), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = _perform(function () { + var values = []; + var index = 0; + var remaining = 1; + _forOf(iterable, false, function (promise) { + var $index = index++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.e) reject(result.v); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = _perform(function () { + _forOf(iterable, false, function (promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.e) reject(result.v); + return capability.promise; + } + }); + + _export(_export.P + _export.R, 'Promise', { 'finally': function (onFinally) { + var C = _speciesConstructor(this, _core.Promise || _global.Promise); + var isFunction = typeof onFinally == 'function'; + return this.then( + isFunction ? function (x) { + return _promiseResolve(C, onFinally()).then(function () { return x; }); + } : onFinally, + isFunction ? function (e) { + return _promiseResolve(C, onFinally()).then(function () { throw e; }); + } : onFinally + ); + } }); + + // https://github.com/tc39/proposal-promise-try + + + + + _export(_export.S, 'Promise', { 'try': function (callbackfn) { + var promiseCapability = _newPromiseCapability.f(this); + var result = _perform(callbackfn); + (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); + return promiseCapability.promise; + } }); + + var promise = _core.Promise; + + var promise$1 = promise; + + function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new promise$1(function (resolve, reject) { + var gen = fn.apply(self, args); + + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + promise$1.resolve(value).then(_next, _throw); + } + } + + function _next(value) { + step("next", value); + } + + function _throw(err) { + step("throw", err); + } + + _next(); + }); + }; + } + + var asyncToGenerator = _asyncToGenerator; + + var f$2 = {}.propertyIsEnumerable; + + var _objectPie = { + f: f$2 + }; + + var gOPD = Object.getOwnPropertyDescriptor; + + var f$3 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = _toIobject(O); + P = _toPrimitive(P, true); + if (_ie8DomDefine) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]); + }; + + var _objectGopd = { + f: f$3 + }; + + // most Object methods by ES6 should accept primitives + + + + var _objectSap = function (KEY, exec) { + var fn = (_core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp); + }; + + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + + var $getOwnPropertyDescriptor = _objectGopd.f; + + _objectSap('getOwnPropertyDescriptor', function () { + return function getOwnPropertyDescriptor(it, key) { + return $getOwnPropertyDescriptor(_toIobject(it), key); + }; + }); + + var $Object = _core.Object; + var getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + return $Object.getOwnPropertyDescriptor(it, key); + }; + + var getOwnPropertyDescriptor$1 = getOwnPropertyDescriptor; + + var _meta = createCommonjsModule(function (module) { + var META = _uid('meta'); + + + var setDesc = _objectDp.f; + var id = 0; + var isExtensible = Object.isExtensible || function () { + return true; + }; + var FREEZE = !_fails(function () { + return isExtensible(Object.preventExtensions({})); + }); + var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); + }; + var fastKey = function (it, create) { + // return primitive with prefix + if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; + }; + var getWeak = function (it, create) { + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; + }; + // add metadata on freeze-family methods calling + var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it); + return it; + }; + var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze + }; + }); + var _meta_1 = _meta.KEY; + var _meta_2 = _meta.NEED; + var _meta_3 = _meta.fastKey; + var _meta_4 = _meta.getWeak; + var _meta_5 = _meta.onFreeze; + + var f$4 = _wks; + + var _wksExt = { + f: f$4 + }; + + var defineProperty = _objectDp.f; + var _wksDefine = function (name) { + var $Symbol = _core.Symbol || (_core.Symbol = _library ? {} : _global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) }); + }; + + var f$5 = Object.getOwnPropertySymbols; + + var _objectGops = { + f: f$5 + }; + + // all enumerable object keys, includes symbols + + + + var _enumKeys = function (it) { + var result = _objectKeys(it); + var getSymbols = _objectGops.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = _objectPie.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; + }; + + // 7.2.2 IsArray(argument) + + var _isArray = Array.isArray || function isArray(arg) { + return _cof(arg) == 'Array'; + }; + + // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) + + var hiddenKeys = _enumBugKeys.concat('length', 'prototype'); + + var f$6 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return _objectKeysInternal(O, hiddenKeys); + }; + + var _objectGopn = { + f: f$6 + }; + + // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + + var gOPN = _objectGopn.f; + var toString$1 = {}.toString; + + var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + + var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } + }; + + var f$7 = function getOwnPropertyNames(it) { + return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it)); + }; + + var _objectGopnExt = { + f: f$7 + }; + + // ECMAScript 6 symbols shim + + + + + + var META = _meta.KEY; + + + + + + + + + + + + + + + + + + + + var gOPD$1 = _objectGopd.f; + var dP$1 = _objectDp.f; + var gOPN$1 = _objectGopnExt.f; + var $Symbol = _global.Symbol; + var $JSON = _global.JSON; + var _stringify = $JSON && $JSON.stringify; + var PROTOTYPE$2 = 'prototype'; + var HIDDEN = _wks('_hidden'); + var TO_PRIMITIVE = _wks('toPrimitive'); + var isEnum = {}.propertyIsEnumerable; + var SymbolRegistry = _shared('symbol-registry'); + var AllSymbols = _shared('symbols'); + var OPSymbols = _shared('op-symbols'); + var ObjectProto$1 = Object[PROTOTYPE$2]; + var USE_NATIVE$1 = typeof $Symbol == 'function'; + var QObject = _global.QObject; + // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 + var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild; + + // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 + var setSymbolDesc = _descriptors && _fails(function () { + return _objectCreate(dP$1({}, 'a', { + get: function () { return dP$1(this, 'a', { value: 7 }).a; } + })).a != 7; + }) ? function (it, key, D) { + var protoDesc = gOPD$1(ObjectProto$1, key); + if (protoDesc) delete ObjectProto$1[key]; + dP$1(it, key, D); + if (protoDesc && it !== ObjectProto$1) dP$1(ObjectProto$1, key, protoDesc); + } : dP$1; + + var wrap = function (tag) { + var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]); + sym._k = tag; + return sym; + }; + + var isSymbol = USE_NATIVE$1 && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; + } : function (it) { + return it instanceof $Symbol; + }; + + var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D); + _anObject(it); + key = _toPrimitive(key, true); + _anObject(D); + if (_has(AllSymbols, key)) { + if (!D.enumerable) { + if (!_has(it, HIDDEN)) dP$1(it, HIDDEN, _propertyDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _objectCreate(D, { enumerable: _propertyDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP$1(it, key, D); + }; + var $defineProperties = function defineProperties(it, P) { + _anObject(it); + var keys = _enumKeys(P = _toIobject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; + }; + var $create = function create(it, P) { + return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P); + }; + var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = _toPrimitive(key, true)); + if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false; + return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true; + }; + var $getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(it, key) { + it = _toIobject(it); + key = _toPrimitive(key, true); + if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return; + var D = gOPD$1(it, key); + if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; + }; + var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN$1(_toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; + }; + var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto$1; + var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]); + } return result; + }; + + // 19.4.1.1 Symbol([description]) + if (!USE_NATIVE$1) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = _uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto$1) $set.call(OPSymbols, value); + if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, _propertyDesc(1, value)); + }; + if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() { + return this._k; + }); + + _objectGopd.f = $getOwnPropertyDescriptor$1; + _objectDp.f = $defineProperty; + _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames; + _objectPie.f = $propertyIsEnumerable; + _objectGops.f = $getOwnPropertySymbols; + + if (_descriptors && !_library) { + _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + _wksExt.f = function (name) { + return wrap(_wks(name)); + }; + } + + _export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Symbol: $Symbol }); + + for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' + ).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]); + + for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]); + + _export(_export.S + _export.F * !USE_NATIVE$1, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return _has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } + }); + + _export(_export.S + _export.F * !USE_NATIVE$1, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor$1, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols + }); + + // 24.3.2 JSON.stringify(value [, replacer [, space]]) + $JSON && _export(_export.S + _export.F * (!USE_NATIVE$1 || _fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; + })), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!_isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } + }); + + // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) + $Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf); + // 19.4.3.5 Symbol.prototype[@@toStringTag] + _setToStringTag($Symbol, 'Symbol'); + // 20.2.1.9 Math[@@toStringTag] + _setToStringTag(Math, 'Math', true); + // 24.3.3 JSON[@@toStringTag] + _setToStringTag(_global.JSON, 'JSON', true); + + var getOwnPropertySymbols = _core.Object.getOwnPropertySymbols; + + var getOwnPropertySymbols$1 = getOwnPropertySymbols; + + // 19.1.2.14 Object.keys(O) + + + + _objectSap('keys', function () { + return function keys(it) { + return _objectKeys(_toObject(it)); + }; + }); + + var keys = _core.Object.keys; + + var keys$1 = keys; + + // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) + _export(_export.S + _export.F * !_descriptors, 'Object', { defineProperty: _objectDp.f }); + + var $Object$1 = _core.Object; + var defineProperty$1 = function defineProperty(it, key, desc) { + return $Object$1.defineProperty(it, key, desc); + }; + + var defineProperty$2 = defineProperty$1; + + function _defineProperty(obj, key, value) { + if (key in obj) { + defineProperty$2(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + var defineProperty$3 = _defineProperty; + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + var ownKeys = keys$1(source); + + if (typeof getOwnPropertySymbols$1 === 'function') { + ownKeys = ownKeys.concat(getOwnPropertySymbols$1(source).filter(function (sym) { + return getOwnPropertyDescriptor$1(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + defineProperty$3(target, key, source[key]); + }); + } + + return target; + } + + var objectSpread = _objectSpread; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var classCallCheck = _classCallCheck; + + // Works with __proto__ only. Old v8 can't work with null proto objects. + /* eslint-disable no-proto */ + + + var check = function (O, proto) { + _anObject(O); + if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); + }; + var _setProto = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check + }; + + // 19.1.3.19 Object.setPrototypeOf(O, proto) + + _export(_export.S, 'Object', { setPrototypeOf: _setProto.set }); + + var setPrototypeOf = _core.Object.setPrototypeOf; + + var setPrototypeOf$1 = setPrototypeOf; + + var setPrototypeOf$2 = createCommonjsModule(function (module) { + function _setPrototypeOf(o, p) { + module.exports = _setPrototypeOf = setPrototypeOf$1 || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); + } + + module.exports = _setPrototypeOf; + }); + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + setPrototypeOf$2(subClass.prototype, superClass && superClass.prototype); + if (superClass) setPrototypeOf$2(subClass, superClass); + } + + var inherits = _inherits; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + + defineProperty$2(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + var createClass = _createClass; + + var iterator = _wksExt.f('iterator'); + + var iterator$1 = iterator; + + _wksDefine('asyncIterator'); + + _wksDefine('observable'); + + var symbol = _core.Symbol; + + var symbol$1 = symbol; + + var _typeof_1 = createCommonjsModule(function (module) { + function _typeof2(obj) { if (typeof symbol$1 === "function" && typeof iterator$1 === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof symbol$1 === "function" && obj.constructor === symbol$1 && obj !== symbol$1.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); } + + function _typeof(obj) { + if (typeof symbol$1 === "function" && _typeof2(iterator$1) === "symbol") { + module.exports = _typeof = function _typeof(obj) { + return _typeof2(obj); + }; + } else { + module.exports = _typeof = function _typeof(obj) { + return obj && typeof symbol$1 === "function" && obj.constructor === symbol$1 && obj !== symbol$1.prototype ? "symbol" : _typeof2(obj); + }; + } + + return _typeof(obj); + } + + module.exports = _typeof; + }); + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + var assertThisInitialized = _assertThisInitialized; + + function _possibleConstructorReturn(self, call) { + if (call && (_typeof_1(call) === "object" || typeof call === "function")) { + return call; + } + + return assertThisInitialized(self); + } + + var possibleConstructorReturn = _possibleConstructorReturn; + + // 19.1.2.9 Object.getPrototypeOf(O) + + + + _objectSap('getPrototypeOf', function () { + return function getPrototypeOf(it) { + return _objectGpo(_toObject(it)); + }; + }); + + var getPrototypeOf = _core.Object.getPrototypeOf; + + var getPrototypeOf$1 = getPrototypeOf; + + var getPrototypeOf$2 = createCommonjsModule(function (module) { + function _getPrototypeOf(o) { + module.exports = _getPrototypeOf = getPrototypeOf$1 || function _getPrototypeOf(o) { + return o.__proto__; + }; + + return _getPrototypeOf(o); + } + + module.exports = _getPrototypeOf; + }); + + var extend = function extend(object) { + for (var _len = arguments.length, extensions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + extensions[_key - 1] = arguments[_key]; + } + + // $.extend alternative, ... is the spread operator. + for (var _i = 0; _i < extensions.length; _i++) { + var extension = extensions[_i]; + // console.log(extension); + // console.log(typeof extension); + if (!extension) continue; // Ignore null and undefined objects and parameters. + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = Object.getOwnPropertyNames(extension)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var prop = _step.value; + + // Do not traverse the prototype chain. + if (object[prop] !== undefined && extension[prop] && object[prop].toString() === '[object Object]' && extension[prop].toString() === '[object Object]') { + // Goes deep only if object[prop] and extension[prop] are both objects ! + if (object[prop].constructor === Object) extend(object[prop], extension[prop]); + } else object[prop] = typeof object[prop] === 'undefined' ? extension[prop] : object[prop]; + + if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop].slice(); // Add values that do not already exist. + else if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop]; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return != null) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + + return object; + }; + + var instruct = function instruct(array, instArray) { + var tempObject = {}; + + for (var i = 0, max = instArray.length; i < max; i++) { + var guide = instArray[i]; + tempObject[guide] = array[i]; + } + + return tempObject; + }; + var transformData = function transformData(object, instructions) { + for (var key in instructions) { + if (Array.isArray(object[key])) object[key] = instruct(object[key], instructions[key]);else if (object[key] instanceof Object && !Array.isArray(instructions[key])) object[key] = transformData(object[key], instructions[key]); + } + + return object; + }; + var toArray = function toArray(object, instruction) { + var tempArray = []; + + for (var i = 0, max = instruction.length; i < max; i++) { + var guide = instruction[i]; + tempArray[i] = object[guide]; + } + + return tempArray; + }; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( 'name' in Function.prototype === false ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = listenerArray.slice( 0 ); + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '92'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 33776; + var RGBA_S3TC_DXT1_Format = 33777; + var RGBA_S3TC_DXT3_Format = 33778; + var RGBA_S3TC_DXT5_Format = 33779; + var RGB_PVRTC_4BPPV1_Format = 35840; + var RGB_PVRTC_2BPPV1_Format = 35841; + var RGBA_PVRTC_4BPPV1_Format = 35842; + var RGBA_PVRTC_2BPPV1_Format = 35843; + var RGB_ETC1_Format = 36196; + var RGBA_ASTC_4x4_Format = 37808; + var RGBA_ASTC_5x4_Format = 37809; + var RGBA_ASTC_5x5_Format = 37810; + var RGBA_ASTC_6x5_Format = 37811; + var RGBA_ASTC_6x6_Format = 37812; + var RGBA_ASTC_8x5_Format = 37813; + var RGBA_ASTC_8x6_Format = 37814; + var RGBA_ASTC_8x8_Format = 37815; + var RGBA_ASTC_10x5_Format = 37816; + var RGBA_ASTC_10x6_Format = 37817; + var RGBA_ASTC_10x8_Format = 37818; + var RGBA_ASTC_10x10_Format = 37819; + var RGBA_ASTC_12x10_Format = 37820; + var RGBA_ASTC_12x12_Format = 37821; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: ( function () { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + var lut = []; + + for ( var i = 0; i < 256; i ++ ) { + + lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ); + + } + + return function generateUUID() { + + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + var uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' + + lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' + + lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] + + lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ]; + + // .toUpperCase() here flattens concatenated strings to save heap memory space. + return uuid.toUpperCase(); + + }; + + } )(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + ceilPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + + }, + + floorPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Object.defineProperties( Vector2.prototype, { + + "width": { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height": { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + + } ); + + Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q._x, y = q._y, z = q._z, w = q._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 0 ) { + + // up and z are parallel + + if ( Math.abs( up.z ) === 1 ) { + + z.x += 0.0001; + + } else { + + z.z += 0.0001; + + } + + z.normalize(); + x.crossVectors( up, z ); + + } + + x.normalize(); + y.crossVectors( z, x ); + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Quaternion.prototype, { + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = sin( z / 2 ); + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix = new Matrix4(); + + return function project( camera ) { + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + var sinPhiRadius = Math.sin( s.phi ) * s.radius; + + this.x = sinPhiRadius * Math.sin( s.theta ); + this.y = Math.cos( s.phi ) * s.radius; + this.z = sinPhiRadius * Math.cos( s.theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + this.x = c.radius * Math.sin( c.theta ); + this.y = c.y; + this.z = c.radius * Math.cos( c.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + var e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) { + + var c = Math.cos( rotation ); + var s = Math.sin( rotation ); + + this.set( + sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx, + - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty, + 0, 0, 1 + ); + + }, + + scale: function ( sx, sy ) { + + var te = this.elements; + + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; + + return this; + + }, + + rotate: function ( theta ) { + + var c = Math.cos( theta ); + var s = Math.sin( theta ); + + var te = this.elements; + + var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; + + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; + + return this; + + }, + + translate: function ( tx, ty ) { + + var te = this.elements; + + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Texture, + + isTexture: true, + + updateMatrix: function () { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + var context = canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + } ); + + Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + } ); + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getSize() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var scope, i, l; + + var v1 = new Vector3(); + + function traverse( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } + + return function expandByObject( object ) { + + scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( traverse ); + + return this; + + }; + + }(), + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getParameter() target is now required' ); + target = new Vector3(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + intersectsTriangle: ( function () { + + // triangle centered vertices + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + // triangle edge vectors + var f0 = new Vector3(); + var f1 = new Vector3(); + var f2 = new Vector3(); + + var testAxis = new Vector3(); + + var center = new Vector3(); + var extents = new Vector3(); + + var triangleNormal = new Vector3(); + + function satForAxes( axes ) { + + var i, j; + + for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + var r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z ); + // project all 3 vertices of the triangle onto the seperating axis + var p0 = v0.dot( testAxis ); + var p1 = v1.dot( testAxis ); + var p2 = v2.dot( testAxis ); + // actual test, basically see if either of the most extreme of the triangle points intersects r + if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) { + + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is seperating and we can exit + return false; + + } + + } + + return true; + + } + + return function intersectsTriangle( triangle ) { + + if ( this.isEmpty() ) { + + return false; + + } + + // compute box center and extents + this.getCenter( center ); + extents.subVectors( this.max, center ); + + // translate triangle to aabb origin + v0.subVectors( triangle.a, center ); + v1.subVectors( triangle.b, center ); + v2.subVectors( triangle.c, center ); + + // compute edge vectors for triangle + f0.subVectors( v1, v0 ); + f1.subVectors( v2, v1 ); + f2.subVectors( v0, v2 ); + + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // 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 + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + var axes = [ + 0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y, + f0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x, + - f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0 + ]; + if ( ! satForAxes( axes ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes ) ) { + + return false; + + } + + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + triangleNormal.crossVectors( f0, f1 ); + axes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ]; + return satForAxes( axes ); + + }; + + } )(), + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' ); + target = new Sphere(); + + } + + this.getCenter( target.center ); + + target.radius = this.getSize( v1 ).length() * 0.5; + + return target; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // 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. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if ( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + }, + + clampPoint: function ( point, target ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + }, + + getBoundingBox: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); + target = new Box3(); + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + // normal is assumed to be normalized + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .projectPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .intersectLine() target is now required' ); + target = new Vector3(); + + } + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .coplanarPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + } ); + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var 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"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var 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"; + + var 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\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; + + var 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"; + + var 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"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var 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"; + + var 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"; + + var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; + + var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; + + var 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"; + + var 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"; + + var 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"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var 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"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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 );\t\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\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\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; + + var 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"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n"; + + var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; + + var 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"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n"; + + var 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"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \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"; + + var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n"; + + var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \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"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var 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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var 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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; + + var 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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var 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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n"; + + var shadow_vert = "#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_pars_maps: lights_pars_maps, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( target ) { + + // h,s,l ranges are in 0.0 - 1.0 + + if ( target === undefined ) { + + console.warn( 'THREE.Color: .getHSL() target is now required' ); + target = { h: 0, s: 0, l: 0 }; + + } + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function () { + + var hsl = {}; + + return function ( h, s, l ) { + + this.getHSL( hsl ); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }; + + }(), + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function ( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + } ); + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + + alphaMap: { value: null }, + + }, + + specularmap: { + + specularMap: { value: null }, + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes( gl ) { + + var buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = gl.FLOAT; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); + + } else if ( array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, gl.STATIC_DRAW ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = - 1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1 | 0; + + } + + Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Object3D, + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + applyQuaternion: function ( q ) { + + this.quaternion.premultiply( q ); + + return this; + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateOnWorldAxis: function () { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + var q1 = new Quaternion(); + + return function rotateOnWorldAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This method does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + var vector = new Vector3(); + + return function lookAt( x, y, z ) { + + if ( x.isVector3 ) { + + vector.copy( x ); + + } else { + + vector.set( x, y, z ); + + } + + if ( this.isCamera ) { + + m1.lookAt( this.position, vector, this.up ); + + } else { + + m1.lookAt( vector, this.position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + return this; + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ); + target = new Quaternion(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, target, scale ); + + return target; + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, target ); + + return target; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.getWorldQuaternion( quaternion ); + + return target.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is a string when called from JSON.stringify + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + + object.matrix = this.matrix.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.geometry !== undefined ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + var parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + var shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + var shapes = extractFromCache( meta.shapes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }, + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.getWorldQuaternion( quaternion ); + + return target.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + updateMatrixWorld: function ( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + this.matrixWorldInverse.getInverse( this.matrixWorld ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var geometryId = 0; // Geometry uses even numbers as Id + + function Geometry() { + + Object.defineProperty( this, 'id', { value: geometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + if ( mesh.matrixAutoUpdate ) mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + setFromPoints: function ( points ) { + + this.vertices = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return this; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + } ); + + // + + function Int8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + setFromPoints: function ( points ) { + + var position = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var vector = new Vector3(); + + return function normalizeNormals() { + + var normals = this.attributes.normal; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + vector.x = normals.getX( i ); + vector.y = normals.getY( i ); + vector.z = normals.getZ( i ); + + vector.normalize(); + + normals.setXYZ( i, vector.x, vector.y, vector.z ); + + } + + }; + + }(), + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + var groups = this.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + // BoxBufferGeometry + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + width = width || 1; + height = height || 1; + depth = depth || 1; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + // PlaneBufferGeometry + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + width = width || 1; + height = height || 1; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.flatShading = false; + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this.userData = {}; + + this.needsUpdate = true; + + } + + Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Material, + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = ( meta === undefined || typeof meta === 'string' ); + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.flatShading === true ) data.flatShading = this.flatShading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.morphTargets === true ) data.morphTargets = true; + if ( this.skinning === true ) data.skinning = true; + + if ( this.visible === false ) data.visible = false; + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.flatShading = source.flatShading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + this.shadowSide = source.shadowSide; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .at() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( point, this.origin ); + + var directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, target ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, target ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, target ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, target ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, target ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, target ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, target ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .delta() target is now required' ); + target = new Vector3(); + + } + + return target.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .at() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, target ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Object.assign( Triangle, { + + getNormal: function () { + + var v0 = new Vector3(); + + return function getNormal( a, b, c, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getNormal() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( c, b ); + v0.subVectors( a, b ); + target.cross( v0 ); + + var targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + getBarycoord: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function getBarycoord( point, a, b, c, target ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ); + target = new Vector3(); + + } + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return target.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + Triangle.getBarycoord( point, a, b, c, v1 ); + + return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 ); + + }; + + }() + + } ); + + Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + getArea: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function getArea() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + getMidpoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + getNormal: function ( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + }, + + getPlane: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getPlane() target is now required' ); + target = new Vector3(); + + } + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + getBarycoord: function ( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsTriangle( this ); + + }, + + closestPointToPoint: function () { + + var plane = new Plane(); + var edgeList = [ new Line3(), new Line3(), new Line3() ]; + var projectedPoint = new Vector3(); + var closestPoint = new Vector3(); + + return function closestPointToPoint( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if ( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + target.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for ( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if ( distance < minDistance ) { + + minDistance = distance; + + target.copy( closestPoint ); + + } + + } + + } + + return target; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + return this; + + }, + + updateMorphTargets: function () { + + var geometry = this.geometry; + var m, ml, name; + + if ( geometry.isBufferGeometry ) { + + var morphAttributes = geometry.morphAttributes; + var keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + var morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + var morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + name = morphTargets[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.getBarycoord( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + var face = new Face3( a, b, c ); + Triangle.getNormal( vA, vB, vC, face.normal ); + + intersection.face = face; + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var i, l; + + if ( index !== null ) { + + // indexed buffer geometry + + for ( i = 0, l = index.count; i < l; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + for ( i = 0, l = position.count; i < l; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) intersects.push( intersection ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBackground( renderer, state, geometries, premultipliedAlpha ) { + + var clearColor = new Color( 0x000000 ); + var clearAlpha = 0; + + var planeCamera, planeMesh; + var boxMesh; + + function render( renderList, scene, camera, forceClear ) { + + var background = scene.background; + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxBufferGeometry( 1, 1, 1 ), + new ShaderMaterial( { + uniforms: ShaderLib.cube.uniforms, + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.removeAttribute( 'normal' ); + boxMesh.geometry.removeAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + geometries.update( boxMesh.geometry ); + + } + + boxMesh.material.uniforms.tCube.value = background; + + renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeCamera === undefined ) { + + planeCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + + geometries.update( planeMesh.geometry ); + + } + + planeMesh.material.map = background; + + // TODO Push this to renderList + + renderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha ) { + + clearColor.set( color ); + clearAlpha = alpha !== undefined ? alpha : 1; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, info ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + if ( position.isInterleavedBufferAttribute ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount ); + + } + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, attributes, info ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO Remove duplicate code + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ geometry.id ]; + + } + + attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, info ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLInfo( gl ) { + + var memory = { + geometries: 0, + textures: 0 + }; + + var render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + instanceCount = instanceCount || 1; + + render.calls ++; + + switch ( mode ) { + + case gl.TRIANGLES: + render.triangles += instanceCount * ( count / 3 ); + break; + + case gl.TRIANGLE_STRIP: + case gl.TRIANGLE_FAN: + render.triangles += instanceCount * ( count - 2 ); + break; + + case gl.LINES: + render.lines += instanceCount * ( count / 2 ); + break; + + case gl.LINE_STRIP: + render.lines += instanceCount * ( count - 1 ); + break; + + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + + case gl.POINTS: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + + } + + function WebGLMorphtargets( gl ) { + + var influencesList = {}; + var morphInfluences = new Float32Array( 8 ); + + function update( object, geometry, material, program ) { + + var objectInfluences = object.morphTargetInfluences; + + var length = objectInfluences.length; + + var influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + var morphTargets = material.morphTargets && geometry.morphAttributes.position; + var morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + // Remove current morphAttributes + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + if ( influence[ 1 ] !== 0 ) { + + if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i ); + if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + // Collect influences + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + // Add morphAttributes + + for ( var i = 0; i < 8; i ++ ) { + + var influence = influences[ i ]; + + if ( influence ) { + + var index = influence[ 0 ]; + var value = influence[ 1 ]; + + if ( value ) { + + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + morphInfluences[ i ] = value; + continue; + + } + + } + + morphInfluences[ i ] = 0; + + } + + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( geometries, info ) { + + var updateList = {}; + + function update( object ) { + + var frame = info.render.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function dispose() { + + updateList = {}; + + } + + return { + + update: update, + dispose: dispose + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array( 16 ); + var mat3array = new Float32Array( 9 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { + + gl.uniform1f( this.addr, v ); + + } + + function setValue1i( gl, v ) { + + gl.uniform1i( this.addr, v ); + + } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) { + + gl.uniform2fv( this.addr, v ); + + } else { + + gl.uniform2f( this.addr, v.x, v.y ); + + } + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + } else if ( v.r !== undefined ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + } else { + + gl.uniform3fv( this.addr, v ); + + } + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) { + + gl.uniform4fv( this.addr, v ); + + } else { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix3fv( this.addr, false, v ); + + } else { + + mat3array.set( v.elements ); + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + } + + } + + function setValue4fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix4fv( this.addr, false, v ); + + } else { + + mat4array.set( v.elements ); + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { + + gl.uniform2iv( this.addr, v ); + + } + + function setValue3iv( gl, v ) { + + gl.uniform3iv( this.addr, v ); + + } + + function setValue4iv( gl, v ) { + + gl.uniform4iv( this.addr, v ); + + } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { + + gl.uniform1fv( this.addr, v ); + + } + function setValue1iv( gl, v ) { + + gl.uniform1iv( this.addr, v ); + + } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function ( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for ( ; ; ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case Uncharted2ToneMapping: + toneMappingName = 'Uncharted2'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + + } + + function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, extensions, code, material, shader, parameters ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = shader.vertexShader; + var fragmentShader = shader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( material.extensions, parameters, extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( 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 + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '', + + parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ).trim(); + var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.name = shader.name; + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, extensions, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = capabilities.precision; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( material.onBeforeCompile.toString() ); + + array.push( renderer.gammaOutput ); + + return array.join(); + + }; + + this.acquireProgram = function ( material, shader, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, extensions, code, material, shader, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = new WeakMap(); + + function get( object ) { + + var map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + function WebGLRenderList() { + + var renderItems = []; + var renderItemsIndex = 0; + + var opaque = []; + var transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transparent.length = 0; + + } + + function push( object, geometry, material, z, group ) { + + var renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + ( material.transparent === true ? transparent : opaque ).push( renderItem ); + + renderItemsIndex ++; + + } + + function sort() { + + if ( opaque.length > 1 ) opaque.sort( painterSortStable ); + if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + + sort: sort + }; + + } + + function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function UniformsCache() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + var count = 0; + + function WebGLLights() { + + var cache = new UniformsCache(); + + var state = { + + id: count ++, + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + var vector3 = new Vector3(); + var matrix4 = new Matrix4(); + var matrix42 = new Matrix4(); + + function setup( lights, shadows, camera ) { + + var r = 0, g = 0, b = 0; + + var directionalLength = 0; + var pointLength = 0; + var spotLength = 0; + var rectAreaLength = 0; + var hemiLength = 0; + + var viewMatrix = camera.matrixWorldInverse; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + var color = light.color; + var intensity = light.intensity; + var distance = light.distance; + + var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + uniforms.shadowCameraNear = shadow.camera.near; + uniforms.shadowCameraFar = shadow.camera.far; + + } + + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = cache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.hash = state.id + ',' + directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + shadows.length; + + } + + return { + setup: setup, + state: state + }; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLRenderState() { + + var lights = new WebGLLights(); + + var lightsArray = []; + var shadowsArray = []; + var spritesArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + spritesArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function pushSprite( shadowLight ) { + + spritesArray.push( shadowLight ); + + } + + function setupLights( camera ) { + + lights.setup( lightsArray, shadowsArray, camera ); + + } + + var state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + spritesArray: spritesArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + + pushLight: pushLight, + pushShadow: pushShadow, + pushSprite: pushSprite + }; + + } + + function WebGLRenderStates() { + + var renderStates = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + + var renderState = renderStates[ hash ]; + + if ( renderState === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ hash ] = renderState; + + } + + return renderState; + + } + + function dispose() { + + renderStates = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * skinning: , + * morphTargets: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + + function MeshDistanceMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDistanceMaterial.prototype = Object.create( Material.prototype ); + MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial; + + MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + + MeshDistanceMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _objects, maxTextureSize ) { + + var _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new MeshDepthMaterial( { + + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _depthMaterials[ i ] = depthMaterial; + + // + + var distanceMaterial = new MeshDistanceMaterial( { + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + // TODO Clean up (needed in case of contextlost) + var _gl = _renderer.context; + var _state = _renderer.state; + + // Set GL state for depth map. + _state.disable( _gl.BLEND ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + var shadow = light.shadow; + var isPointLight = light && light.isPointLight; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( isPointLight ) { + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + if ( isPointLight ) { + + faceCount = 6; + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ]; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.isMeshDistanceMaterial ) { + + result.referencePosition.copy( lightPositionWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) { + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation( program, 'position' ), + uv: gl.getAttribLocation( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + center: gl.getUniformLocation( program, 'center' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + fogDepth: gl.getUniformLocation( program, 'fogDepth' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new CanvasTexture( canvas ); + + } + + this.render = function ( sprites, scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + state.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog.isFog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog.isFogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + var center = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + sprite.onBeforeRender( renderer, scene, camera, undefined, material, undefined ); + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + center[ 0 ] = sprite.center.x - 0.5; + center[ 1 ] = sprite.center.y - 0.5; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.center, center ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + state.buffers.depth.setTest( material.depthTest ); + state.buffers.depth.setMask( material.depthWrite ); + state.buffers.color.setMask( material.colorWrite ); + + textures.setTexture2D( material.map || texture, 0 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + sprite.onAfterRender( renderer, scene, camera, undefined, material, undefined ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + state.reset(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + capabilities.precision + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 center;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + 'varying float fogDepth;', + + 'void main() {', + + ' vUV = uvOffset + uv * uvScale;', + + ' vec2 alignedPosition = ( position - center ) * scale;', + + ' vec2 rotatedPosition;', + ' rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + ' rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + ' vec4 mvPosition;', + + ' mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + ' mvPosition.xy += rotatedPosition;', + + ' gl_Position = projectionMatrix * mvPosition;', + + ' fogDepth = - mvPosition.z;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + capabilities.precision + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + 'varying float fogDepth;', + + 'void main() {', + + ' vec4 texture = texture2D( map, vUV );', + + ' gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + ' if ( gl_FragColor.a < alphaTest ) discard;', + + ' if ( fogType > 0 ) {', + + ' float fogFactor = 0.0;', + + ' if ( fogType == 1 ) {', + + ' fogFactor = smoothstep( fogNear, fogFar, fogDepth );', + + ' } else {', + + ' const float LOG2 = 1.442695;', + ' fogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );', + ' fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + ' }', + + ' gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );', + + ' }', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, utils ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4( 0, 0, 0, 0 ); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentProgram = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ); + + var lineWidthAvailable = false; + var version = 0; + var glVersion = gl.getParameter( gl.VERSION ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + // + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) || + extensions.get( 'WEBGL_compressed_texture_astc' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + switch ( blending ) { + + case AdditiveBlending: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + break; + + case SubtractiveBlending: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + break; + + case MultiplyBlending: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + break; + + default: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + } + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } else { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + var flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + material.transparent === true + ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : setBlending( NoBlending ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentProgram = null; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); /* global WebGL2RenderingContext */ + var _videoTextures = {}; + var _canvas; + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + return; + + } + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) { + + if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + + _canvas.width = _Math.floorPowerOfTwo( image.width ); + _canvas.height = _Math.floorPowerOfTwo( image.height ); + + var context = _canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, _canvas.width, _canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image ); + + return _canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) { + + return texture.generateMipmaps && isPowerOfTwo && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height ) { + + _gl.generateMipmap( target ); + + var textureProperties = properties.get( texture ); + + // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 + textureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + delete _videoTextures[ texture.id ]; + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + info.memory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( ! isCompressed ) { + + textureProperties.__maxMipLevel = 0; + + } else { + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + // We assume images for cube map have the same size. + generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( ! _isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' ); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + generateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = utils.convert( renderTarget.texture.format ); + var glType = utils.convert( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) { + + var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.bindTexture( target, null ); + + } + + } + + function updateVideoTexture( texture ) { + + var id = texture.id; + var frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures[ id ] !== frame ) { + + _videoTextures[ id ] = frame; + texture.update(); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author thespite / http://www.twitter.com/thespite + */ + + function WebGLUtils( gl, extensions ) { + + function convert( p ) { + + var extension; + + if ( p === RepeatWrapping ) return gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return gl.BYTE; + if ( p === ShortType ) return gl.SHORT; + if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT; + if ( p === IntType ) return gl.INT; + if ( p === UnsignedIntType ) return gl.UNSIGNED_INT; + if ( p === FloatType ) return gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return gl.ALPHA; + if ( p === RGBFormat ) return gl.RGB; + if ( p === RGBAFormat ) return gl.RGBA; + if ( p === LuminanceFormat ) return gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return gl.FUNC_ADD; + if ( p === SubtractEquation ) return gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return gl.ZERO; + if ( p === OneFactor ) return gl.ONE; + if ( p === SrcColorFactor ) return gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + return p; + + } + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + return { convert: convert }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.cameras = array || []; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebVRManager( renderer ) { + + var scope = this; + + var device = null; + var frameData = null; + + var poseTarget = null; + + var standingMatrix = new Matrix4(); + var standingMatrixInverse = new Matrix4(); + + if ( typeof window !== 'undefined' && 'VRFrameData' in window ) { + + frameData = new window.VRFrameData(); + window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false ); + + } + + var matrixWorldInverse = new Matrix4(); + var tempQuaternion = new Quaternion(); + var tempPosition = new Vector3(); + + var cameraL = new PerspectiveCamera(); + cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 ); + cameraL.layers.enable( 1 ); + + var cameraR = new PerspectiveCamera(); + cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 ); + cameraR.layers.enable( 2 ); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + function isPresenting() { + + return device !== null && device.isPresenting === true; + + } + + var currentSize, currentPixelRatio; + + function onVRDisplayPresentChange() { + + if ( isPresenting() ) { + + var eyeParameters = device.getEyeParameters( 'left' ); + var renderWidth = eyeParameters.renderWidth; + var renderHeight = eyeParameters.renderHeight; + + currentPixelRatio = renderer.getPixelRatio(); + currentSize = renderer.getSize(); + + renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 ); + + } else if ( scope.enabled ) { + + renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio ); + + } + + } + + // + + this.enabled = false; + this.userHeight = 1.6; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + + }; + + this.setPoseTarget = function ( object ) { + + if ( object !== undefined ) poseTarget = object; + + }; + + this.getCamera = function ( camera ) { + + if ( device === null ) return camera; + + device.depthNear = camera.near; + device.depthFar = camera.far; + + device.getFrameData( frameData ); + + // + + var stageParameters = device.stageParameters; + + if ( stageParameters ) { + + standingMatrix.fromArray( stageParameters.sittingToStandingTransform ); + + } else { + + standingMatrix.makeTranslation( 0, scope.userHeight, 0 ); + + } + + + var pose = frameData.pose; + var poseObject = poseTarget !== null ? poseTarget : camera; + + // We want to manipulate poseObject by its position and quaternion components since users may rely on them. + poseObject.matrix.copy( standingMatrix ); + poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale ); + + if ( pose.orientation !== null ) { + + tempQuaternion.fromArray( pose.orientation ); + poseObject.quaternion.multiply( tempQuaternion ); + + } + + if ( pose.position !== null ) { + + tempQuaternion.setFromRotationMatrix( standingMatrix ); + tempPosition.fromArray( pose.position ); + tempPosition.applyQuaternion( tempQuaternion ); + poseObject.position.add( tempPosition ); + + } + + poseObject.updateMatrixWorld(); + + if ( device.isPresenting === false ) return camera; + + // + + cameraL.near = camera.near; + cameraR.near = camera.near; + + cameraL.far = camera.far; + cameraR.far = camera.far; + + cameraVR.matrixWorld.copy( camera.matrixWorld ); + cameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse ); + + cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix ); + cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix ); + + // TODO (mrdoob) Double check this code + + standingMatrixInverse.getInverse( standingMatrix ); + + cameraL.matrixWorldInverse.multiply( standingMatrixInverse ); + cameraR.matrixWorldInverse.multiply( standingMatrixInverse ); + + var parent = poseObject.parent; + + if ( parent !== null ) { + + matrixWorldInverse.getInverse( parent.matrixWorld ); + + cameraL.matrixWorldInverse.multiply( matrixWorldInverse ); + cameraR.matrixWorldInverse.multiply( matrixWorldInverse ); + + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse ); + cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse ); + + cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix ); + cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix ); + + // HACK (mrdoob) + // https://github.com/w3c/webvr/issues/203 + + cameraVR.projectionMatrix.copy( cameraL.projectionMatrix ); + + // + + var layers = device.getLayers(); + + if ( layers.length ) { + + var layer = layers[ 0 ]; + + if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) { + + cameraL.bounds.fromArray( layer.leftBounds ); + + } + + if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) { + + cameraR.bounds.fromArray( layer.rightBounds ); + + } + + } + + return cameraVR; + + }; + + this.getStandingMatrix = function () { + + return standingMatrix; + + }; + + this.submitFrame = function () { + + if ( isPresenting() ) device.submitFrame(); + + }; + + this.dispose = function () { + + if ( typeof window !== 'undefined' ) { + + window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange ); + + } + + }; + + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + var currentRenderList = null; + var currentRenderState = null; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + _isContextLost = false, + + // internal state cache + + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + + _currentCamera = null, + _currentArrayCamera = null, + + _currentViewport = new Vector4(), + _currentScissor = new Vector4(), + _currentScissorTest = null, + + // + + _usedTextureUnits = 0, + + // + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ), + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(); + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + + } + + var extensions, capabilities, state, info; + var properties, textures, attributes, geometries, objects; + var programCache, renderLists, renderStates; + + var background, morphtargets, bufferRenderer, indexedBufferRenderer; + var spriteRenderer; + + var utils; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'OES_element_index_uint' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + utils = new WebGLUtils( _gl, extensions ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + state = new WebGLState( _gl, extensions, utils ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + attributes = new WebGLAttributes( _gl ); + geometries = new WebGLGeometries( _gl, attributes, info ); + objects = new WebGLObjects( geometries, info ); + morphtargets = new WebGLMorphtargets( _gl ); + programCache = new WebGLPrograms( _this, extensions, capabilities ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(); + + background = new WebGLBackground( _this, state, geometries, _premultipliedAlpha ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info ); + + spriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, textures, capabilities ); + + info.programs = programCache.programs; + + _this.context = _gl; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // vr + + var vr = new WebVRManager( _this ); + + this.vr = vr; + + // shadow map + + var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize ); + + this.shadowMap = shadowMap; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + var device = vr.getDevice(); + + if ( device && device.isPresenting ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function () { + + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + }; + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function () { + + return _currentViewport; + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewport.set( x, _height - y - height, width, height ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + _scissor.set( x, _height - y - height, width, height ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return background.getClearColor(); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + objects.dispose(); + + vr.dispose(); + + stopAnimation(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + initGLContext(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program, material ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + ! material.isMeshNormalMaterial && + material.flatShading === true ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.normal ); + + _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.uv ); + + _gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.color ); + + _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, fog, material, object ); + var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true ); + + var updateBuffers = false; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + if ( object.morphTargetInfluences ) { + + morphtargets.update( object, geometry, material, program ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var attribute; + var renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer ); + + } + + } + + // + + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry ) { + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + var buffer = attribute.buffer; + var type = attribute.type; + var bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights( camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Animation Loop + + var isAnimating = false; + var onAnimationFrame = null; + + function startAnimation() { + + if ( isAnimating ) return; + + requestAnimationLoopFrame(); + + isAnimating = true; + + } + + function stopAnimation() { + + isAnimating = false; + + } + + function requestAnimationLoopFrame() { + + var device = vr.getDevice(); + + if ( device && device.isPresenting ) { + + device.requestAnimationFrame( animationLoop ); + + } else { + + window.requestAnimationFrame( animationLoop ); + + } + + } + + function animationLoop( time ) { + + if ( isAnimating === false ) return; + + onAnimationFrame( time ); + + requestAnimationLoopFrame(); + + } + + this.animate = function ( callback ) { + + onAnimationFrame = callback; + onAnimationFrame !== null ? startAnimation() : stopAnimation(); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( ! ( camera && camera.isCamera ) ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost ) return; + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( vr.enabled ) { + + camera = vr.getCamera( camera ); + + } + + // + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.onBeforeRender( _this, scene, camera, renderTarget ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + var shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + currentRenderState.setupLights( camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + if ( this.info.autoReset ) this.info.reset(); + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + background.render( currentRenderList, scene, camera, forceClear ); + + // render scene + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // custom renderers + + var spritesArray = currentRenderState.state.spritesArray; + + spriteRenderer.render( spritesArray, scene, camera ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + scene.onAfterRender( _this, scene, camera ); + + if ( vr.enabled ) { + + vr.submitFrame(); + + } + + // _gl.finish(); + + currentRenderList = null; + currentRenderState = null; + + }; + + /* + // TODO Duplicated code (Frustum) + + var _sphere = new Sphere(); + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + */ + + function projectObject( object, camera, sortObjects ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + currentRenderState.pushSprite( object ); + + } + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + if ( camera.isArrayCamera ) { + + _currentArrayCamera = camera; + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + var bounds = camera2.bounds; + + var x = bounds.x * _width; + var y = bounds.y * _height; + var width = bounds.z * _width; + var height = bounds.w * _height; + + state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + _currentArrayCamera = null; + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + renderObjectImmediate( object, program, material ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var lights = currentRenderState.state.lights; + var shadowsArray = currentRenderState.state.shadowsArray; + + var parameters = programCache.getParameters( + material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( materialProperties.lightsHash !== lights.state.hash ) { + + properties.update( material, 'lightsHash', lights.state.hash ); + programChange = false; + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.onBeforeCompile( materialProperties.shader, _this ); + + program = programCache.acquireProgram( material, materialProperties.shader, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.shader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = lights.state.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.directionalLights.value = lights.state.directional; + uniforms.spotLights.value = lights.state.spot; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.pointLights.value = lights.state.point; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + var lights = currentRenderState.state.lights; + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== lights.state.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + // Avoid unneeded uniform updates per ArrayCamera's sub-camera + + if ( _currentCamera !== ( _currentArrayCamera || camera ) ) { + + _currentCamera = ( _currentArrayCamera || camera ); + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else { + + refreshUniformsPhong( m_uniforms, material ); + + } + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else { + + refreshUniformsStandard( m_uniforms, material ); + + } + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDepth( m_uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDistance( m_uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsNormal( m_uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( m_uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + m_uniforms.color.value = material.color; + m_uniforms.opacity.value = material.opacity; + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1; + if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2; + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + material.uniformsNeedUpdate = false; + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value = material.color; + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + if ( material.envMap ) { + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var framebuffer = null; + var isCube = false; + + if ( renderTarget ) { + + var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLRenderTargetCube ) { + + framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ]; + isCube = true; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level ) { + + var width = texture.image.width; + var height = texture.image.height; + var glFormat = utils.convert( texture.format ); + + this.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 ); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) { + + var width = srcTexture.image.width; + var height = srcTexture.image.height; + var glFormat = utils.convert( dstTexture.format ); + var glType = utils.convert( dstTexture.type ); + var pixels = srcTexture.isDataTexture ? srcTexture.image.data : srcTexture.image; + + this.setTexture2D( dstTexture, 0 ); + + _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, pixels ); + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene() { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldPosition = new Vector3(); + var worldScale = new Vector3(); + + return function raycast( raycaster, intersects ) { + + worldPosition.setFromMatrixPosition( this.matrixWorld ); + raycaster.ray.closestPointToPoint( worldPosition, intersectPoint ); + + worldScale.setFromMatrixScale( this.matrixWorld ); + var guessSizeSq = worldScale.x * worldScale.y / 4; + + if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return; + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + return this; + + } + + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + }, + + getBoneByName: function ( name ) { + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.manhattanLength(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.manhattanLength(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = [ 0 ]; + + for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) { + + start.fromBufferAttribute( positionAttribute, i - 1 ); + end.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + lineDistances[ 0 ] = 0; + + for ( var i = 1, l = vertices.length; i < l; i ++ ) { + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] ); + + } + + } + + return this; + + }; + + }() ), + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = ( this && this.isLineSegments ) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = []; + + for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + start.fromBufferAttribute( positionAttribute, i ); + end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + for ( var i = 0, l = vertices.length; i < l; i += 2 ) { + + start.copy( vertices[ i ] ); + end.copy( vertices[ i + 1 ] ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + } + + return this; + + }; + + }() ) + + } ); + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + var intersectPoint = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group, + + isGroup: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + } + + VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), { + + constructor: VideoTexture, + + isVideoTexture: true, + + update: function () { + + var video = this.image; + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + // ParametricBufferGeometry + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, + 0, 5, 2, 1, 2, 5, 1, 5, 3, + 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±1, ±1, ±1) + - 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, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + // TubeBufferGeometry + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + var P = new Vector3(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 1; + tube = tube || 0.4; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + // TorusBufferGeometry + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 1; + tube = tube || 0.4; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * Port from https://github.com/mapbox/earcut (v2.1.2) + */ + + var Earcut = { + + triangulate: function ( data, holeIndices, dim ) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length, + outerNode = linkedList( data, 0, outerLen, dim, true ), + triangles = []; + + if ( ! outerNode ) return triangles; + + var minX, minY, maxX, maxY, x, y, invSize; + + if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim ); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + + if ( data.length > 80 * dim ) { + + minX = maxX = data[ 0 ]; + minY = maxY = data[ 1 ]; + + for ( var i = dim; i < outerLen; i += dim ) { + + x = data[ i ]; + y = data[ i + 1 ]; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + + invSize = Math.max( maxX - minX, maxY - minY ); + invSize = invSize !== 0 ? 1 / invSize : 0; + + } + + earcutLinked( outerNode, triangles, dim, minX, minY, invSize ); + + return triangles; + + } + + }; + + // create a circular doubly linked list from polygon points in the specified winding order + + function linkedList( data, start, end, dim, clockwise ) { + + var i, last; + + if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) { + + for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } else { + + for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } + + if ( last && equals( last, last.next ) ) { + + removeNode( last ); + last = last.next; + + } + + return last; + + } + + // eliminate colinear or duplicate points + + function filterPoints( start, end ) { + + if ( ! start ) return start; + if ( ! end ) end = start; + + var p = start, again; + + do { + + again = false; + + if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) { + + removeNode( p ); + p = end = p.prev; + if ( p === p.next ) break; + again = true; + + } else { + + p = p.next; + + } + + } while ( again || p !== end ); + + return end; + + } + + // main ear slicing loop which triangulates a polygon (given as a linked list) + + function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) { + + if ( ! ear ) return; + + // interlink polygon nodes in z-order + + if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize ); + + var stop = ear, prev, next; + + // iterate through ears, slicing them one by one + + while ( ear.prev !== ear.next ) { + + prev = ear.prev; + next = ear.next; + + if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) { + + // cut off the triangle + triangles.push( prev.i / dim ); + triangles.push( ear.i / dim ); + triangles.push( next.i / dim ); + + removeNode( ear ); + + // skipping the next vertice leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + + if ( ear === stop ) { + + // try filtering points and slicing again + + if ( ! pass ) { + + earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 ); + + // if this didn't work, try curing all small self-intersections locally + + } else if ( pass === 1 ) { + + ear = cureLocalIntersections( ear, triangles, dim ); + earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 ); + + // as a last resort, try splitting the remaining polygon into two + + } else if ( pass === 2 ) { + + splitEarcut( ear, triangles, dim, minX, minY, invSize ); + + } + + break; + + } + + } + + } + + // check whether a polygon node forms a valid ear with adjacent nodes + + function isEar( ear ) { + + var a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + var p = ear.next.next; + + while ( p !== ear.prev ) { + + if ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) { + + return false; + + } + + p = p.next; + + } + + return true; + + } + + function isEarHashed( ear, minX, minY, invSize ) { + + var a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + + var minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ), + minTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ), + maxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ), + maxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y ); + + // z-order range for the current triangle bbox; + + var minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + // first look for points inside the triangle in increasing z-order + + var p = ear.nextZ; + + while ( p && p.z <= maxZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.nextZ; + + } + + // then look for points in decreasing z-order + + p = ear.prevZ; + + while ( p && p.z >= minZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + + p = p.prevZ; + + } + + return true; + + } + + // go through all polygon nodes and cure small local self-intersections + + function cureLocalIntersections( start, triangles, dim ) { + + var p = start; + + do { + + var a = p.prev, b = p.next.next; + + if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) { + + triangles.push( a.i / dim ); + triangles.push( p.i / dim ); + triangles.push( b.i / dim ); + + // remove two nodes involved + + removeNode( p ); + removeNode( p.next ); + + p = start = b; + + } + + p = p.next; + + } while ( p !== start ); + + return p; + + } + + // try splitting polygon into two and triangulate them independently + + function splitEarcut( start, triangles, dim, minX, minY, invSize ) { + + // look for a valid diagonal that divides the polygon into two + + var a = start; + + do { + + var b = a.next.next; + + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + + var c = splitPolygon( a, b ); + + // filter colinear points around the cuts + + a = filterPoints( a, a.next ); + c = filterPoints( c, c.next ); + + // run earcut on each half + + earcutLinked( a, triangles, dim, minX, minY, invSize ); + earcutLinked( c, triangles, dim, minX, minY, invSize ); + return; + + } + + b = b.next; + + } + + a = a.next; + + } while ( a !== start ); + + } + + // link every hole into the outer loop, producing a single-ring polygon without holes + + function eliminateHoles( data, holeIndices, outerNode, dim ) { + + var queue = [], i, len, start, end, list; + + for ( i = 0, len = holeIndices.length; i < len; i ++ ) { + + start = holeIndices[ i ] * dim; + end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length; + list = linkedList( data, start, end, dim, false ); + if ( list === list.next ) list.steiner = true; + queue.push( getLeftmost( list ) ); + + } + + queue.sort( compareX ); + + // process holes from left to right + + for ( i = 0; i < queue.length; i ++ ) { + + eliminateHole( queue[ i ], outerNode ); + outerNode = filterPoints( outerNode, outerNode.next ); + + } + + return outerNode; + + } + + function compareX( a, b ) { + + return a.x - b.x; + + } + + // find a bridge between vertices that connects hole with an outer ring and and link it + + function eliminateHole( hole, outerNode ) { + + outerNode = findHoleBridge( hole, outerNode ); + + if ( outerNode ) { + + var b = splitPolygon( outerNode, hole ); + + filterPoints( b, b.next ); + + } + + } + + // David Eberly's algorithm for finding a bridge between hole and outer polygon + + function findHoleBridge( hole, outerNode ) { + + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = - Infinity, + m; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + + do { + + if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) { + + var x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y ); + + if ( x <= hx && x > qx ) { + + qx = x; + + if ( x === hx ) { + + if ( hy === p.y ) return p; + if ( hy === p.next.y ) return p.next; + + } + + m = p.x < p.next.x ? p : p.next; + + } + + } + + p = p.next; + + } while ( p !== outerNode ); + + if ( ! m ) return null; + + if ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m.next; + + while ( p !== stop ) { + + if ( hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) { + + tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential + + if ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } + + return m; + + } + + // interlink polygon nodes in z-order + + function indexCurve( start, minX, minY, invSize ) { + + var p = start; + + do { + + if ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize ); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + + } while ( p !== start ); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked( p ); + + } + + // Simon Tatham's linked list merge sort algorithm + // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html + + function sortLinked( list ) { + + var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; + + do { + + p = list; + list = null; + tail = null; + numMerges = 0; + + while ( p ) { + + numMerges ++; + q = p; + pSize = 0; + + for ( i = 0; i < inSize; i ++ ) { + + pSize ++; + q = q.nextZ; + if ( ! q ) break; + + } + + qSize = inSize; + + while ( pSize > 0 || ( qSize > 0 && q ) ) { + + if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) { + + e = p; + p = p.nextZ; + pSize --; + + } else { + + e = q; + q = q.nextZ; + qSize --; + + } + + if ( tail ) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + + } + + p = q; + + } + + tail.nextZ = null; + inSize *= 2; + + } while ( numMerges > 1 ); + + return list; + + } + + // z-order of a point given coords and inverse of the longer side of data bbox + + function zOrder( x, y, minX, minY, invSize ) { + + // coords are transformed into non-negative 15-bit integer range + + x = 32767 * ( x - minX ) * invSize; + y = 32767 * ( y - minY ) * invSize; + + x = ( x | ( x << 8 ) ) & 0x00FF00FF; + x = ( x | ( x << 4 ) ) & 0x0F0F0F0F; + x = ( x | ( x << 2 ) ) & 0x33333333; + x = ( x | ( x << 1 ) ) & 0x55555555; + + y = ( y | ( y << 8 ) ) & 0x00FF00FF; + y = ( y | ( y << 4 ) ) & 0x0F0F0F0F; + y = ( y | ( y << 2 ) ) & 0x33333333; + y = ( y | ( y << 1 ) ) & 0x55555555; + + return x | ( y << 1 ); + + } + + // find the leftmost node of a polygon ring + + function getLeftmost( start ) { + + var p = start, leftmost = start; + + do { + + if ( p.x < leftmost.x ) leftmost = p; + p = p.next; + + } while ( p !== start ); + + return leftmost; + + } + + // check if a point lies within a convex triangle + + function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) { + + return ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 && + ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 && + ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0; + + } + + // check if a diagonal between two polygon nodes is valid (lies in polygon interior) + + function isValidDiagonal( a, b ) { + + return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && + locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ); + + } + + // signed area of a triangle + + function area( p, q, r ) { + + return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y ); + + } + + // check if two points are equal + + function equals( p1, p2 ) { + + return p1.x === p2.x && p1.y === p2.y; + + } + + // check if two segments intersect + + function intersects( p1, q1, p2, q2 ) { + + if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) || + ( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true; + + return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 && + area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0; + + } + + // check if a polygon diagonal intersects any polygon segments + + function intersectsPolygon( a, b ) { + + var p = a; + + do { + + if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects( p, p.next, a, b ) ) { + + return true; + + } + + p = p.next; + + } while ( p !== a ); + + return false; + + } + + // check if a polygon diagonal is locally inside the polygon + + function locallyInside( a, b ) { + + return area( a.prev, a, a.next ) < 0 ? + area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 : + area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0; + + } + + // check if the middle point of a polygon diagonal is inside the polygon + + function middleInside( a, b ) { + + var p = a, + inside = false, + px = ( a.x + b.x ) / 2, + py = ( a.y + b.y ) / 2; + + do { + + if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y && + ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) { + + inside = ! inside; + + } + + p = p.next; + + } while ( p !== a ); + + return inside; + + } + + // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; + // if one belongs to the outer ring and another to a hole, it merges it into a single ring + + function splitPolygon( a, b ) { + + var a2 = new Node( a.i, a.x, a.y ), + b2 = new Node( b.i, b.x, b.y ), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + + } + + // create a node and optionally link it with previous one (in a circular doubly linked list) + + function insertNode( i, x, y, last ) { + + var p = new Node( i, x, y ); + + if ( ! last ) { + + p.prev = p; + p.next = p; + + } else { + + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + + } + + return p; + + } + + function removeNode( p ) { + + p.next.prev = p.prev; + p.prev.next = p.next; + + if ( p.prevZ ) p.prevZ.nextZ = p.nextZ; + if ( p.nextZ ) p.nextZ.prevZ = p.prevZ; + + } + + function Node( i, x, y ) { + + // vertice index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertice nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = null; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + + } + + function signedArea( data, start, end, dim ) { + + var sum = 0; + + for ( var i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + triangulateShape: function ( contour, holes ) { + + var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + var holeIndices = []; // array of hole indices + var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + var holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( var i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + var triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( var i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + + }; + + function removeDupEndPts( points ) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + function addContour( vertices, contour ) { + + for ( var i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry( shapes, options ) { + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + var scope = this; + + var verticesArray = []; + var uvArray = []; + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + addShape( shape, options ); + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + var placeholder = []; + + // options + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + var steps = options.steps !== undefined ? options.steps : 1; + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var extrudePath = options.extrudePath; + + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // + + var extrudePts, extrudeByPath = false; + var splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length / 3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + + } + + ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + + var WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + TextGeometry.prototype = Object.create( Geometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + // TextBufferGeometry + + function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); + TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + // SphereBufferGeometry + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + // RingBufferGeometry + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0.5; + outerRadius = outerRadius || 1; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + // LatheBufferGeometry + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + ShapeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + + }; + + // ShapeBufferGeometry + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + ShapeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + + }; + + // + + function toJSON( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + + } + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + edges[ key ].face2 = i; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var e = edges[ key ]; + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + // CylinderBufferGeometry + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 1; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 1; + height = height || 1; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + // ConeBufferGeometry + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + // CircleBufferGeometry + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * color: + * } + */ + + function ShadowMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( Material.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + ShadowMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + LineBasicMaterial.call( this ); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + LineBasicMaterial.prototype.copy.call( this, source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshDistanceMaterial: MeshDistanceMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false; + var itemsLoaded = 0; + var itemsTotal = 0; + var urlModifier = undefined; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + return this; + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var loading = {}; + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = window.decodeURIComponent( data ); + + if ( isBase64 ) data = window.atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + var view = new Uint8Array( data.length ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ view.buffer ], { type: mimeType } ); + + } else { + + response = view.buffer; + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + window.setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + window.setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + // Initialise array for duplicate requests + + loading[ url ] = []; + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = this.response; + + Cache.add( url, response ); + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + if ( this.status === 200 ) { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + request.addEventListener( 'progress', function ( event ) { + + var callbacks = loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + crossOrigin: 'Anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + image.addEventListener( 'load', function () { + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + /* + image.addEventListener( 'progress', function ( event ) { + + if ( onProgress ) onProgress( event ); + + }, false ); + */ + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + crossOrigin: 'Anonymous', + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + crossOrigin: 'Anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u, optionalTarget ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = 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 + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + }, + + fromJSON: function ( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.type = 'EllipseCurve'; + + this.aX = aX || 0; + this.aY = aY || 0; + + this.xRadius = xRadius || 1; + this.yRadius = yRadius || 1; + + this.aStartAngle = aStartAngle || 0; + this.aEndAngle = aEndAngle || 2 * Math.PI; + + this.aClockwise = aClockwise || false; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + }; + + EllipseCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + }; + + + EllipseCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + }; + + EllipseCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + ArcCurve.prototype.isArcCurve = true; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px$1 = new CubicPoly(); + var py = new CubicPoly(); + var pz = new CubicPoly(); + + function CatmullRomCurve3( points, closed, curveType, tension ) { + + Curve.call( this ); + + this.type = 'CatmullRomCurve3'; + + this.points = points || []; + this.closed = closed || false; + this.curveType = curveType || 'centripetal'; + this.tension = tension || 0.5; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + + CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var points = this.points; + var l = points.length; + + var p = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.curveType === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px$1.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px$1.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px$1.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + }; + + CatmullRomCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + }; + + CatmullRomCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + }; + + CatmullRomCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function QuadraticBezierP2( t, p ) { + + return t * t * p; + + } + + function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + + } + + function CubicBezierP3( t, p ) { + + return t * t * t * p; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + this.v3 = v3 || new Vector2(); + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.isCubicBezierCurve = true; + + CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + }; + + CubicBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + this.v3 = v3 || new Vector3(); + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + + CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + }; + + CubicBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve'; + + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve.prototype.getTangent = function ( /* t */ ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + LineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve3'; + + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.isLineCurve3 = true; + + LineCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + + QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + }; + + QuadraticBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + + QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + }; + + QuadraticBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.type = 'SplineCurve'; + + this.points = points || []; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var points = this.points; + var p = ( points.length - 1 ) * t; + + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var p1 = points[ intPoint ]; + var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + }; + + SplineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + }; + + SplineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + }; + + SplineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + }; + + + + var Curves = Object.freeze({ + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve + }); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + copy: function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.curves = []; + + for ( var i = 0, l = source.curves.length; i < l; i ++ ) { + + var curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + }, + + toJSON: function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + var curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( var i = 0, l = json.curves.length; i < l; i ++ ) { + + var curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + Path.prototype = Object.assign( Object.create( CurvePath.prototype ), { + + constructor: Path, + + setFromPoints: function ( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( var i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + }, + + copy: function ( source ) { + + CurvePath.prototype.copy.call( this, source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + }, + + toJSON: function () { + + var data = CurvePath.prototype.toJSON.call( this ); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + }, + + fromJSON: function ( json ) { + + CurvePath.prototype.fromJSON.call( this, json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape( points ) { + + Path.call( this, points ); + + this.uuid = _Math.generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( Path.prototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + copy: function ( source ) { + + Path.prototype.copy.call( this, source ); + + this.holes = []; + + for ( var i = 0, l = source.holes.length; i < l; i ++ ) { + + var hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + }, + + toJSON: function () { + + var data = Path.prototype.toJSON.call( this ); + + data.uuid = this.uuid; + data.holes = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + var hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Path.prototype.fromJSON.call( this, json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( var i = 0, l = json.holes.length; i < l; i ++ ) { + + var hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI; + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / ( 4 * Math.PI ); + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + } + + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrack.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function ( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function ( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function ( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function ( /* i1, t0, t1 */ ) { + + // empty + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function ( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function ( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function ( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function ( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function ( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + + } + + } ); + + Object.assign( KeyframeTrack.prototype, { + + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + } ); + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.visible !== undefined ) material.visible = json.visible; + if ( json.userData !== undefined ) material.userData = json.userData; + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() {} + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + Object.assign( Loader.prototype, { + + crossOrigin: undefined, + + onLoadStart: function () {}, + + onLoadProgress: function () {}, + + onLoadComplete: function () {}, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = value; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + } ); + + /** + * @author Don McCurdy / https://www.donmccurdy.com + */ + + var LoaderUtils = { + + decodeText: function ( array ) { + + if ( typeof TextDecoder !== 'undefined' ) { + + return new TextDecoder().decode( array ); + + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + var s = ''; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + // Merges multi-byte utf-8 characters. + return decodeURIComponent( escape( s ) ); + + }, + + extractUrlBase: function ( url ) { + + var index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url ); + + var loader = new FileLoader( this.manager ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function parse( json, texturePath ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var shapes = this.parseShape( json.shapes ); + var geometries = this.parseGeometries( json.geometries, shapes ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseShape: function ( json ) { + + var shapes = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + }, + + parseGeometries: function ( json, shapes ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + var children = data.children; + + for ( var i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + } ); + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.type = 'Font'; + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var shapes = []; + var paths = createPaths( text, size, divisions, this.data ); + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + function createPaths( text, size, divisions, data ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var paths = []; + + var offsetX = 0, offsetY = 0; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, divisions, scale, offsetX, offsetY, data ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( char, divisions, scale, offsetX, offsetY, data ) { + + var glyph = data.glyphs[ char ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = AudioContext.getContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.update = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + this.clear = function ( renderer, color, depth, stencil ) { + + var renderTarget = this.renderTarget; + + for ( var i = 0; i < 6; i ++ ) { + + renderTarget.activeCubeFace = i; + renderer.setRenderTarget( renderTarget ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.offset = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + this.startTime = this.context.currentTime; + source.start( this.startTime, this.offset ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + this.source.stop(); + this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate; + this.isPlaying = false; + + } + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.offset = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + // Characters [].:/ are reserved for track binding syntax. + var RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; + + function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: ( function () { + + var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' ); + + return function sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( reservedRe, '' ); + + }; + + }() ), + + parseTrackName: function () { + + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + var wordChar = '[^' + RESERVED_CHARS_RE + ']'; + var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar ); + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot ); + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar ); + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar ); + + var trackRe = new RegExp( '' + + '^' + + directoryRe + + nodeRe + + objectRe + + propertyRe + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function parseTrackName( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) { + + if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + + } else { + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup() { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length, + knownObject = undefined; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function () { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = - 1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function () { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function () { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function () { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function () { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function () { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function ( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function ( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function ( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function () { + + return this._effectiveWeight; + + }, + + fadeIn: function ( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function ( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function ( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function ( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function () { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function ( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function () { + + return this._effectiveTimeScale; + + }, + + setDuration: function ( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function ( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function ( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function ( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function () { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function () { + + return this._mixer; + + }, + + getClip: function () { + + return this._clip; + + }, + + getRoot: function () { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function ( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function ( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function ( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function ( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function ( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function ( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + } ); + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: AnimationMixer, + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function ( source ) { + + BufferGeometry.prototype.copy.call( this, source ); + + this.maxInstancedCount = source.maxInstancedCount; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function () { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function ( vec3 ) { + + this.radius = vec3.length(); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis + this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function ( vec3 ) { + + this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z ); + this.theta = Math.atan2( vec3.x, vec3.z ); + this.y = vec3.y; + + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getCenter() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getSize() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getParameter() target is now required' ); + target = new Vector2(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .clampPoint() target is now required' ); + target = new Vector2(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( /* renderCallback */ ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + this.light.updateMatrixWorld(); + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function getBoneList( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + } + + function SkeletonHelper( object ) { + + var bones = getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + } + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.updateMatrixWorld = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function updateMatrixWorld( force ) { + + var bones = this.bones; + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize, color ) { + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var material = new LineBasicMaterial( { fog: false } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.line = new Line( geometry, material ); + this.add( this.line ); + + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = this.line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + if ( this.color !== undefined ) { + + this.line.material.color.set( this.color ); + + } else { + + this.line.material.color.copy( this.light.color ); + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + if ( this.color === undefined ) this.material.vertexColors = VertexColors; + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( v3 ); + this.targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 0x333333 ); + + // near + + addLine( 'n1', 'n2', colorFrustum ); + addLine( 'n2', 'n4', colorFrustum ); + addLine( 'n4', 'n3', colorFrustum ); + addLine( 'n3', 'n1', colorFrustum ); + + // far + + addLine( 'f1', 'f2', colorFrustum ); + addLine( 'f2', 'f4', colorFrustum ); + addLine( 'f4', 'f3', colorFrustum ); + addLine( 'f3', 'f1', colorFrustum ); + + // sides + + addLine( 'n1', 'f1', colorFrustum ); + addLine( 'n2', 'f2', colorFrustum ); + addLine( 'n3', 'f3', colorFrustum ); + addLine( 'n4', 'f4', colorFrustum ); + + // cone + + addLine( 'p', 'n1', colorCone ); + addLine( 'p', 'n2', colorCone ); + addLine( 'p', 'n3', colorCone ); + addLine( 'p', 'n4', colorCone ); + + // up + + addLine( 'u1', 'u2', colorUp ); + addLine( 'u2', 'u3', colorUp ); + addLine( 'u3', 'u1', colorUp ); + + // target + + addLine( 'c', 't', colorTarget ); + addLine( 'p', 'c', colorCross ); + + // cross + + addLine( 'cn1', 'cn2', colorCross ); + addLine( 'cn3', 'cn4', colorCross ); + + addLine( 'cf1', 'cf2', colorCross ); + addLine( 'cf3', 'cf4', colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( 'c', 0, 0, - 1 ); + setPoint( 't', 0, 0, 1 ); + + // near + + setPoint( 'n1', - w, - h, - 1 ); + setPoint( 'n2', w, - h, - 1 ); + setPoint( 'n3', - w, h, - 1 ); + setPoint( 'n4', w, h, - 1 ); + + // far + + setPoint( 'f1', - w, - h, 1 ); + setPoint( 'f2', w, - h, 1 ); + setPoint( 'f3', - w, h, 1 ); + setPoint( 'f4', w, h, 1 ); + + // up + + setPoint( 'u1', w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', - w, 0, 1 ); + setPoint( 'cf2', w, 0, 1 ); + setPoint( 'cf3', 0, - h, 1 ); + setPoint( 'cf4', 0, h, 1 ); + + setPoint( 'cn1', - w, 0, - 1 ); + setPoint( 'cn2', w, 0, - 1 ); + setPoint( 'cn3', 0, - h, - 1 ); + setPoint( 'cn4', 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3Helper( box, hex ) { + + this.type = 'Box3Helper'; + + this.box = box; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ] ); + + var 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 ]; + + var geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.geometry.computeBoundingSphere(); + + } + + Box3Helper.prototype = Object.create( LineSegments.prototype ); + Box3Helper.prototype.constructor = Box3Helper; + + Box3Helper.prototype.updateMatrixWorld = function ( force ) { + + var box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function PlaneHelper( plane, size, hex ) { + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = ( size === undefined ) ? 1 : size; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + Line.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + // + + var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + var geometry2 = new BufferGeometry(); + geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) ); + + } + + PlaneHelper.prototype = Object.create( Line.prototype ); + PlaneHelper.prototype.constructor = PlaneHelper; + + PlaneHelper.prototype.updateMatrixWorld = function ( force ) { + + var scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.lookAt( this.plane.normal ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry; + var coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxesHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxesHelper.prototype = Object.create( LineSegments.prototype ); + AxesHelper.prototype.constructor = AxesHelper; + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + Object.assign( CurvePath.prototype, { + + createPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from path points (for Line or Points objects) + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createSpacedPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from equidistant sampling along the path + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + // + + Object.assign( Path.prototype, { + + fromPoints: function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + this.setFromPoints( points ); + + } + + } ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( /* a */ ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( /* optionalTarget */ ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( /* samplingCoef */ ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + + }; + + // + + Object.assign( Loader.prototype, { + + extractUrlBase: function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + + } + + } ); + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + Object.assign( _Math, { + + random16: function () { + + console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + nearestPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' ); + return _Math.floorPowerOfTwo( value ); + + }, + + nextPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' ); + return _Math.ceilPowerOfTwo( value ); + + } + + } ); + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Triangle.prototype, { + + area: function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + + }, + barycoordFromPoint: function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + + }, + midpoint: function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + + }, + normal: function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + + }, + plane: function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + + } + + } ); + + Object.assign( Triangle, { + + barycoordFromPoint: function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + + }, + normal: function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extractAllPoints: function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + + }, + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + // + + Object.assign( Geometry.prototype, { + + computeTangents: function () { + + console.error( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + computeLineDistances: function () { + + console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' ); + + } + + } ); + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + getWorldRotation: function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + copyIndicesArray: function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.assign( ExtrudeBufferGeometry.prototype, { + + getArrays: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' ); + + }, + + addShapeList: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' ); + + }, + + addShape: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' ); + + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + getMaxAnisotropy: function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + + }, + + getPrecision: function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + + }, + + resetGLState: function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }, + setFaceCulling: function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Object.defineProperties( WebVRManager.prototype, { + + standing: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .standing has been removed.' ); + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + + }; + + var minivents_commonjs = function Events(target){ + var events = {}, empty = []; + target = target || this; + /** + * On: listen to events + */ + target.on = function(type, func, ctx){ + (events[type] = events[type] || []).push([func, ctx]); + return target + }; + /** + * Off: stop listening to event / specific callback + */ + target.off = function(type, func){ + type || (events = {}); + var list = events[type] || empty, + i = list.length = func ? list.length : 0; + while(i--) func == list[i][0] && list.splice(i,1); + return target + }; + /** + * Emit: send event, callbacks will be triggered + */ + target.emit = function(type){ + var e = events[type] || empty, list = e.length > 0 ? e.slice(0, e.length) : e, i=0, j; + while(j=list[i++]) j[0].apply(j[1], empty.slice.call(arguments, 1)); + return target + }; + }; + + // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) + _export(_export.S, 'Object', { create: _objectCreate }); + + var $Object$2 = _core.Object; + var create = function create(P, D) { + return $Object$2.create(P, D); + }; + + var create$1 = create; + + var _validateCollection = function (it, TYPE) { + if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; + }; + + var dP$2 = _objectDp.f; + + + + + + + + + + var fastKey = _meta.fastKey; + + var SIZE = _descriptors ? '_s' : 'size'; + + var getEntry = function (that, key) { + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return that._i[index]; + // frozen object case + for (entry = that._f; entry; entry = entry.n) { + if (entry.k == key) return entry; + } + }; + + var _collectionStrong = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + _anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = _objectCreate(null); // index + that._f = undefined; // first entry + that._l = undefined; // last entry + that[SIZE] = 0; // size + if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that); + }); + _redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { + entry.r = true; + if (entry.p) entry.p = entry.p.n = undefined; + delete data[entry.i]; + } + that._f = that._l = undefined; + that[SIZE] = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = _validateCollection(this, NAME); + var entry = getEntry(that, key); + if (entry) { + var next = entry.n; + var prev = entry.p; + delete that._i[entry.i]; + entry.r = true; + if (prev) prev.n = next; + if (next) next.p = prev; + if (that._f == entry) that._f = next; + if (that._l == entry) that._l = prev; + that[SIZE]--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + _validateCollection(this, NAME); + var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.n : this._f) { + f(entry.v, entry.k, this); + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(_validateCollection(this, NAME), key); + } + }); + if (_descriptors) dP$2(C.prototype, 'size', { + get: function () { + return _validateCollection(this, NAME)[SIZE]; + } + }); + return C; + }, + def: function (that, key, value) { + var entry = getEntry(that, key); + var prev, index; + // change existing entry + if (entry) { + entry.v = value; + // create new entry + } else { + that._l = entry = { + i: index = fastKey(key, true), // <- index + k: key, // <- key + v: value, // <- value + p: prev = that._l, // <- previous entry + n: undefined, // <- next entry + r: false // <- removed + }; + if (!that._f) that._f = entry; + if (prev) prev.n = entry; + that[SIZE]++; + // add to index + if (index !== 'F') that._i[index] = entry; + } return that; + }, + getEntry: getEntry, + setStrong: function (C, NAME, IS_MAP) { + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + _iterDefine(C, NAME, function (iterated, kind) { + this._t = _validateCollection(iterated, NAME); // target + this._k = kind; // kind + this._l = undefined; // previous + }, function () { + var that = this; + var kind = that._k; + var entry = that._l; + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + // get next entry + if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { + // or finish the iteration + that._t = undefined; + return _iterStep(1); + } + // return step by kind + if (kind == 'keys') return _iterStep(0, entry.k); + if (kind == 'values') return _iterStep(0, entry.v); + return _iterStep(0, [entry.k, entry.v]); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + _setSpecies(NAME); + } + }; + + var SPECIES$2 = _wks('species'); + + var _arraySpeciesConstructor = function (original) { + var C; + if (_isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined; + if (_isObject(C)) { + C = C[SPECIES$2]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; + }; + + // 9.4.2.3 ArraySpeciesCreate(originalArray, length) + + + var _arraySpeciesCreate = function (original, length) { + return new (_arraySpeciesConstructor(original))(length); + }; + + // 0 -> Array#forEach + // 1 -> Array#map + // 2 -> Array#filter + // 3 -> Array#some + // 4 -> Array#every + // 5 -> Array#find + // 6 -> Array#findIndex + + + + + + var _arrayMethods = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || _arraySpeciesCreate; + return function ($this, callbackfn, that) { + var O = _toObject($this); + var self = _iobject(O); + var f = _ctx(callbackfn, that, 3); + var length = _toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; + }; + + var dP$3 = _objectDp.f; + var each = _arrayMethods(0); + + + var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = _global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + if (!_descriptors || typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + _redefineAll(C.prototype, methods); + _meta.NEED = true; + } else { + C = wrapper(function (target, iterable) { + _anInstance(target, C, NAME, '_c'); + target._c = new Base(); + if (iterable != undefined) _forOf(iterable, IS_MAP, target[ADDER], target); + }); + each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) { + var IS_ADDER = KEY == 'add' || KEY == 'set'; + if (KEY in proto && !(IS_WEAK && KEY == 'clear')) _hide(C.prototype, KEY, function (a, b) { + _anInstance(this, C, KEY); + if (!IS_ADDER && IS_WEAK && !_isObject(a)) return KEY == 'get' ? undefined : false; + var result = this._c[KEY](a === 0 ? 0 : a, b); + return IS_ADDER ? this : result; + }); + }); + IS_WEAK || dP$3(C.prototype, 'size', { + get: function () { + return this._c.size; + } + }); + } + + _setToStringTag(C, NAME); + + O[NAME] = C; + _export(_export.G + _export.W + _export.F, O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; + }; + + var MAP = 'Map'; + + // 23.1 Map Objects + var es6_map = _collection(MAP, function (get) { + return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; + }, { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = _collectionStrong.getEntry(_validateCollection(this, MAP), key); + return entry && entry.v; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return _collectionStrong.def(_validateCollection(this, MAP), key === 0 ? 0 : key, value); + } + }, _collectionStrong, true); + + var _arrayFromIterable = function (iter, ITERATOR) { + var result = []; + _forOf(iter, false, result.push, result, ITERATOR); + return result; + }; + + // https://github.com/DavidBruant/Map-Set.prototype.toJSON + + + var _collectionToJson = function (NAME) { + return function toJSON() { + if (_classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic"); + return _arrayFromIterable(this); + }; + }; + + // https://github.com/DavidBruant/Map-Set.prototype.toJSON + + + _export(_export.P + _export.R, 'Map', { toJSON: _collectionToJson('Map') }); + + // https://tc39.github.io/proposal-setmap-offrom/ + + + var _setCollectionOf = function (COLLECTION) { + _export(_export.S, COLLECTION, { of: function of() { + var length = arguments.length; + var A = new Array(length); + while (length--) A[length] = arguments[length]; + return new this(A); + } }); + }; + + // https://tc39.github.io/proposal-setmap-offrom/#sec-map.of + _setCollectionOf('Map'); + + // https://tc39.github.io/proposal-setmap-offrom/ + + + + + + var _setCollectionFrom = function (COLLECTION) { + _export(_export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) { + var mapFn = arguments[1]; + var mapping, A, n, cb; + _aFunction(this); + mapping = mapFn !== undefined; + if (mapping) _aFunction(mapFn); + if (source == undefined) return new this(); + A = []; + if (mapping) { + n = 0; + cb = _ctx(mapFn, arguments[2], 2); + _forOf(source, false, function (nextItem) { + A.push(cb(nextItem, n++)); + }); + } else { + _forOf(source, false, A.push, A); + } + return new this(A); + } }); + }; + + // https://tc39.github.io/proposal-setmap-offrom/#sec-map.from + _setCollectionFrom('Map'); + + var map = _core.Map; + + var map$1 = map; + + var arraySlice = [].slice; + var factories = {}; + + var construct = function (F, len, args) { + if (!(len in factories)) { + for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']'; + // eslint-disable-next-line no-new-func + factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')'); + } return factories[len](F, args); + }; + + var _bind = Function.bind || function bind(that /* , ...args */) { + var fn = _aFunction(this); + var partArgs = arraySlice.call(arguments, 1); + var bound = function (/* args... */) { + var args = partArgs.concat(arraySlice.call(arguments)); + return this instanceof bound ? construct(fn, args.length, args) : _invoke(fn, args, that); + }; + if (_isObject(fn.prototype)) bound.prototype = fn.prototype; + return bound; + }; + + // 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) + + + + + + + + var rConstruct = (_global.Reflect || {}).construct; + + // MS Edge supports only 2 arguments and argumentsList argument is optional + // FF Nightly sets third argument as `new.target`, but does not create `this` from it + var NEW_TARGET_BUG = _fails(function () { + function F() { /* empty */ } + return !(rConstruct(function () { /* empty */ }, [], F) instanceof F); + }); + var ARGS_BUG = !_fails(function () { + rConstruct(function () { /* empty */ }); + }); + + _export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { + construct: function construct(Target, args /* , newTarget */) { + _aFunction(Target); + _anObject(args); + var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); + if (Target == newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + $args.push.apply($args, args); + return new (_bind.apply(Target, $args))(); + } + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype); + var result = Function.apply.call(Target, instance, args); + return _isObject(result) ? result : instance; + } + }); + + var construct$1 = _core.Reflect.construct; + + var construct$2 = construct$1; + + var construct$3 = createCommonjsModule(function (module) { + function _construct(Parent, args, Class) { + if (typeof Reflect !== "undefined" && construct$2) { + module.exports = _construct = construct$2; + } else { + module.exports = _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Parent.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) setPrototypeOf$2(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); + } + + module.exports = _construct; + }); + + var wrapNativeSuper = createCommonjsModule(function (module) { + function _wrapNativeSuper(Class) { + var _cache = typeof map$1 === "function" ? new map$1() : undefined; + + module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + + _cache.set(Class, Wrapper); + } + + function Wrapper() {} + + Wrapper.prototype = create$1(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return setPrototypeOf$2(Wrapper, setPrototypeOf$2(function Super() { + return construct$3(Class, arguments, getPrototypeOf$2(this).constructor); + }, Class)); + }; + + return _wrapNativeSuper(Class); + } + + module.exports = _wrapNativeSuper; + }); + + var CompositionError$1 = + /*#__PURE__*/ + function (_Error) { + function CompositionError(classInstance, message, component) { + var _this; + + classCallCheck(this, CompositionError); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(CompositionError).call(this, "@".concat(classInstance, ": ").concat(message))); + + var stackArray = _this.stack.split('\n'); + + stackArray.splice(1, 2); + _this.stack = stackArray.join('\n'); + if (console) console.error('Component:', component); + _this.name = 'CompositionError'; + return _this; + } + + inherits(CompositionError, _Error); + + return CompositionError; + }(wrapNativeSuper(Error)); + var DependencyError = + /*#__PURE__*/ + function (_Error2) { + function DependencyError(classInstance, message, activeModule) { + var _this2; + + var dependencyModule = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + classCallCheck(this, DependencyError); + + _this2 = possibleConstructorReturn(this, getPrototypeOf$2(DependencyError).call(this, "@".concat(classInstance, ": ").concat(message))); + + var stackArray = _this2.stack.split('\n'); + + stackArray.splice(1, 2); + _this2.stack = stackArray.join('\n'); + if (console) console.error('Active module:', activeModule); + if (console && dependencyModule) console.error('Dependency published by module:', dependencyModule); + _this2.name = 'DependencyError'; + return _this2; + } + + inherits(DependencyError, _Error2); + + return DependencyError; + }(wrapNativeSuper(Error)); + var ManagerError = + /*#__PURE__*/ + function (_Error3) { + function ManagerError(classInstance, message, component) { + var _this3; + + var activeModule = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + classCallCheck(this, ManagerError); + + _this3 = possibleConstructorReturn(this, getPrototypeOf$2(ManagerError).call(this, "@".concat(classInstance, ": ").concat(message))); + + var stackArray = _this3.stack.split('\n'); + + stackArray.splice(1, 2); + _this3.stack = stackArray.join('\n'); + if (console) console.error('Component:', component); + if (console && activeModule) console.error('Active module:', activeModule); + _this3.name = 'ManagerError'; + return _this3; + } + + inherits(ManagerError, _Error3); + + return ManagerError; + }(wrapNativeSuper(Error)); + + var warnDeps = function warnDeps() { + throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/'); + }; + + try { + if (!REVISION) warnDeps(); + } catch (err) { + warnDeps(); + } + /** + * @class ModuleSystem + * @category core + * @description Provides API for classes that will use Modules.
+ * This class includes basic event system with those supported methods: + *
.on()
.off()
.emit()
+ * @extends Events + * @memberof module:core + */ + + + var ModuleSystem = + /*#__PURE__*/ + function (_Events) { + function ModuleSystem() { + classCallCheck(this, ModuleSystem); + + return possibleConstructorReturn(this, getPrototypeOf$2(ModuleSystem).apply(this, arguments)); + } + + createClass(ModuleSystem, [{ + key: "integrateModules", + // INTEGRATING + + /** + * @method integrateModules + * @instance + * @description This method applies all modules from .modules collection. + * @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules. + * @memberof module:core.ModuleSystem + */ + value: function integrateModules(source) { + if (!this.modules && !source) return; + if (source && source.modules) this.modules = source.modules.slice(0); + + if (this.modules) { + for (var i = 0, max = this.modules.length; i < max; i++) { + this.applyModule(this.modules[i], false); + } + } + + if (source) this.applyBridge({ + onCopy: source + }); + } // APPLYING MODULE (...and a "bridge" for module) + + /** + * @method applyBridge + * @instance + * @description Makes component-specific API to work with modules. + * @param {Object} bridgeMap + * @return {Object} Returns object with modified values. + * @memberof module:core.ModuleSystem + */ + + }, { + key: "applyBridge", + value: function applyBridge() { + var bridgeMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var modules = this.modules; + if (!modules) return bridgeMap; + + for (var i = 0, max = modules.length; i < max; i++) { + for (var key in bridgeMap) { + if (bridgeMap[key]) { + var module = modules[i]; + if (module && module.bridge && module.bridge[key]) bridgeMap[key] = module.bridge[key].apply(this, [bridgeMap[key], module]); + } + } + } + + return bridgeMap; + } + /** + * @method applyCommand + * @instance + * @description .applyCommand runs a method called `name` on all modules. + * @param {String} name the method name. + * @param {Function} [cb=(func, moduleScope) => func.apply(this, [moduleScope])] How the function is wrapped/ + * @memberof module:core.ModuleSystem + */ + + }, { + key: "applyCommand", + value: function applyCommand(name) { + var _this = this; + + var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (func, moduleScope) { + return func.apply(_this, [moduleScope]); + }; + var modules = this.modules; + if (!modules) return; + + for (var i = 0, max = modules.length; i < max; i++) { + var module = modules[i]; + if (name in module) cb(module[name], module); + } + } + /** + * @method applyModule + * @instance + * @description .applyModule is also used in .integrateModules() function. + * It does exactly what its name says (applies module to component or app). + * @param {Object} module the module to apply + * @param {Boolean} [push=true] + * @return {Object} Returns module that was applied. + * @throws {ManagerError} + * @memberof module:core.ModuleSystem + */ + + }, { + key: "applyModule", + value: function applyModule(module) { + var push = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + if (!module) return; + if (push && this.modules) this.modules.push(module);else if (push) this.modules = [module]; + if (this.manager) this.manager.active(module); + if (module.manager && this.manager) module.manager(this.manager);else if (module.manager) { + throw new ManagerError('Component', "Module requires ModuleManager that is turned off for this component", this, module); + } + if (module.integrate) module.integrate.bind(this)(module); + return module; + } + /** + * @method disposeModules + * @instance + * @description Disposes of all modules + * @memberof module:core.ModuleSystem + */ + + }, { + key: "disposeModules", + value: function disposeModules() { + while (this.modules.length) { + this.disposeModule(this.modules[0]); + } + } + /** + * @method disposeModule + * @instance + * @description Disposes of the given module + * @param {Object} module the module to dispose + * @return {Module} Returns module that was removed. + * @memberof module:core.ModuleSystem + */ + + }, { + key: "disposeModule", + value: function disposeModule(module) { + if (!module) return; + this.modules.splice(this.modules.indexOf(module), 1); + if (module.dispose) module.dispose.bind(this)(module); + return module; + } // PIPED METHOD + + /** + * @method module + * @instance + * @description piped version of .applyModule(). + * @param {Object} module the module to apply + * @return {this} returns this - app/component + * @throws {ManagerError} + * @memberof module:core.ModuleSystem + * @example Piped modules + * component + * .module(new Module1()) + * .module(new Module2()) + * .module(new Module3()) + */ + + }, { + key: "module", + value: function module(_module) { + this.applyModule(_module); + return this; + } + }]); + + inherits(ModuleSystem, _Events); + + return ModuleSystem; + }(minivents_commonjs); + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + var arrayWithHoles = _arrayWithHoles; + + var core_getIterator = _core.getIterator = function (it) { + var iterFn = core_getIteratorMethod(it); + if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!'); + return _anObject(iterFn.call(it)); + }; + + var getIterator = core_getIterator; + + var getIterator$1 = getIterator; + + function _iterableToArrayLimit(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = getIterator$1(arr), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + var iterableToArrayLimit = _iterableToArrayLimit; + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + + var nonIterableRest = _nonIterableRest; + + function _slicedToArray(arr, i) { + return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); + } + + var slicedToArray = _slicedToArray; + + function symbolObservablePonyfill(root) { + var result; + var Symbol = root.Symbol; + + if (typeof Symbol === 'function') { + if (Symbol.observable) { + result = Symbol.observable; + } else { + result = Symbol('observable'); + Symbol.observable = result; + } + } else { + result = '@@observable'; + } + + return result; + } + + /* global window */ + + var root; + + if (typeof self !== 'undefined') { + root = self; + } else if (typeof window !== 'undefined') { + root = window; + } else if (typeof global !== 'undefined') { + root = global; + } else if (typeof module !== 'undefined') { + root = module; + } else { + root = Function('return this')(); + } + + var result = symbolObservablePonyfill(root); + + /** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ + var ActionTypes = { + INIT: '@@redux/INIT' + Math.random().toString(36).substring(7).split('').join('.'), + REPLACE: '@@redux/REPLACE' + Math.random().toString(36).substring(7).split('').join('.') + }; + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + /** + * @param {any} obj The object to inspect. + * @returns {boolean} True if the argument appears to be a plain object. + */ + function isPlainObject(obj) { + if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) return false; + + var proto = obj; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + return Object.getPrototypeOf(obj) === proto; + } + + /** + * Creates a Redux store that holds the state tree. + * The only way to change the data in the store is to call `dispatch()` on it. + * + * There should only be a single store in your app. To specify how different + * parts of the state tree respond to actions, you may combine several reducers + * into a single reducer function by using `combineReducers`. + * + * @param {Function} reducer A function that returns the next state tree, given + * the current state tree and the action to handle. + * + * @param {any} [preloadedState] The initial state. You may optionally specify it + * to hydrate the state from the server in universal apps, or to restore a + * previously serialized user session. + * If you use `combineReducers` to produce the root reducer function, this must be + * an object with the same shape as `combineReducers` keys. + * + * @param {Function} [enhancer] The store enhancer. You may optionally specify it + * to enhance the store with third-party capabilities such as middleware, + * time travel, persistence, etc. The only store enhancer that ships with Redux + * is `applyMiddleware()`. + * + * @returns {Store} A Redux store that lets you read the state, dispatch actions + * and subscribe to changes. + */ + function createStore(reducer, preloadedState, enhancer) { + var _ref2; + + if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { + enhancer = preloadedState; + preloadedState = undefined; + } + + if (typeof enhancer !== 'undefined') { + if (typeof enhancer !== 'function') { + throw new Error('Expected the enhancer to be a function.'); + } + + return enhancer(createStore)(reducer, preloadedState); + } + + if (typeof reducer !== 'function') { + throw new Error('Expected the reducer to be a function.'); + } + + var currentReducer = reducer; + var currentState = preloadedState; + var currentListeners = []; + var nextListeners = currentListeners; + var isDispatching = false; + + function ensureCanMutateNextListeners() { + if (nextListeners === currentListeners) { + nextListeners = currentListeners.slice(); + } + } + + /** + * Reads the state tree managed by the store. + * + * @returns {any} The current state tree of your application. + */ + function getState() { + if (isDispatching) { + throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.'); + } + + return currentState; + } + + /** + * Adds a change listener. It will be called any time an action is dispatched, + * and some part of the state tree may potentially have changed. You may then + * call `getState()` to read the current state tree inside the callback. + * + * You may call `dispatch()` from a change listener, with the following + * caveats: + * + * 1. The subscriptions are snapshotted just before every `dispatch()` call. + * If you subscribe or unsubscribe while the listeners are being invoked, this + * will not have any effect on the `dispatch()` that is currently in progress. + * However, the next `dispatch()` call, whether nested or not, will use a more + * recent snapshot of the subscription list. + * + * 2. The listener should not expect to see all state changes, as the state + * might have been updated multiple times during a nested `dispatch()` before + * the listener is called. It is, however, guaranteed that all subscribers + * registered before the `dispatch()` started will be called with the latest + * state by the time it exits. + * + * @param {Function} listener A callback to be invoked on every dispatch. + * @returns {Function} A function to remove this change listener. + */ + function subscribe(listener) { + if (typeof listener !== 'function') { + throw new Error('Expected the listener to be a function.'); + } + + if (isDispatching) { + throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.'); + } + + var isSubscribed = true; + + ensureCanMutateNextListeners(); + nextListeners.push(listener); + + return function unsubscribe() { + if (!isSubscribed) { + return; + } + + if (isDispatching) { + throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.'); + } + + isSubscribed = false; + + ensureCanMutateNextListeners(); + var index = nextListeners.indexOf(listener); + nextListeners.splice(index, 1); + }; + } + + /** + * Dispatches an action. It is the only way to trigger a state change. + * + * The `reducer` function, used to create the store, will be called with the + * current state tree and the given `action`. Its return value will + * be considered the **next** state of the tree, and the change listeners + * will be notified. + * + * The base implementation only supports plain object actions. If you want to + * dispatch a Promise, an Observable, a thunk, or something else, you need to + * wrap your store creating function into the corresponding middleware. For + * example, see the documentation for the `redux-thunk` package. Even the + * middleware will eventually dispatch plain object actions using this method. + * + * @param {Object} action A plain object representing “what changed”. It is + * a good idea to keep actions serializable so you can record and replay user + * sessions, or use the time travelling `redux-devtools`. An action must have + * a `type` property which may not be `undefined`. It is a good idea to use + * string constants for action types. + * + * @returns {Object} For convenience, the same action object you dispatched. + * + * Note that, if you use a custom middleware, it may wrap `dispatch()` to + * return something else (for example, a Promise you can await). + */ + function dispatch(action) { + if (!isPlainObject(action)) { + throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.'); + } + + if (typeof action.type === 'undefined') { + throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?'); + } + + if (isDispatching) { + throw new Error('Reducers may not dispatch actions.'); + } + + try { + isDispatching = true; + currentState = currentReducer(currentState, action); + } finally { + isDispatching = false; + } + + var listeners = currentListeners = nextListeners; + for (var i = 0; i < listeners.length; i++) { + var listener = listeners[i]; + listener(); + } + + return action; + } + + /** + * Replaces the reducer currently used by the store to calculate the state. + * + * You might need this if your app implements code splitting and you want to + * load some of the reducers dynamically. You might also need this if you + * implement a hot reloading mechanism for Redux. + * + * @param {Function} nextReducer The reducer for the store to use instead. + * @returns {void} + */ + function replaceReducer(nextReducer) { + if (typeof nextReducer !== 'function') { + throw new Error('Expected the nextReducer to be a function.'); + } + + currentReducer = nextReducer; + dispatch({ type: ActionTypes.REPLACE }); + } + + /** + * Interoperability point for observable/reactive libraries. + * @returns {observable} A minimal observable of state changes. + * For more information, see the observable proposal: + * https://github.com/tc39/proposal-observable + */ + function observable() { + var _ref; + + var outerSubscribe = subscribe; + return _ref = { + /** + * The minimal observable subscription method. + * @param {Object} observer Any object that can be used as an observer. + * The observer object should have a `next` method. + * @returns {subscription} An object with an `unsubscribe` method that can + * be used to unsubscribe the observable from the store, and prevent further + * emission of values from the observable. + */ + subscribe: function subscribe(observer) { + if ((typeof observer === 'undefined' ? 'undefined' : _typeof(observer)) !== 'object' || observer === null) { + throw new TypeError('Expected the observer to be an object.'); + } + + function observeState() { + if (observer.next) { + observer.next(getState()); + } + } + + observeState(); + var unsubscribe = outerSubscribe(observeState); + return { unsubscribe: unsubscribe }; + } + }, _ref[result] = function () { + return this; + }, _ref; + } + + // When a store is created, an "INIT" action is dispatched so that every + // reducer returns their initial state. This effectively populates + // the initial state tree. + dispatch({ type: ActionTypes.INIT }); + + return _ref2 = { + dispatch: dispatch, + subscribe: subscribe, + getState: getState, + replaceReducer: replaceReducer + }, _ref2[result] = observable, _ref2; + } + + /** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ + function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); + } + /* eslint-enable no-console */ + try { + // This error was thrown as a convenience so that if you enable + // "break on all exceptions" in your console, + // it would pause the execution at this line. + throw new Error(message); + } catch (e) {} // eslint-disable-line no-empty + } + + /* + * This is a dummy function to check if the function name has been altered by minification. + * If the function has been minified and NODE_ENV !== 'production', warn the user. + */ + function isCrushed() {} + + if (undefined !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') { + warning("You are currently using minified code outside of NODE_ENV === 'production'. " + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.'); + } + + /** + * @class ModuleManager + * @category core + * @param {Object} object handler + * @description Solves modules dependencies + * @memberof module:core + */ + + var ModuleManager = + /*#__PURE__*/ + function () { + function ModuleManager(object) { + classCallCheck(this, ModuleManager); + + this.handler = object; + this.currentModule = null; + this.store = createStore(function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}, '']; + var action = arguments.length > 1 ? arguments[1] : undefined; + state[0][action.key] = action.data; + state[1] = action.key; + return state; + }); + this.modules = {}; + } + /** + * @method active + * @instance + * @description Sets .currentModule to provided module. + * @param {Object} module the module to make current + * @memberof module:core.ModuleManager + */ + + + createClass(ModuleManager, [{ + key: "active", + value: function active(module) { + this.currentModule = module; + } + /** + * @method reset + * @instance + * @description Set's .currentModule to null. + * @memberof module:core.ModuleManager + */ + + }, { + key: "reset", + value: function reset() { + this.currentModule = null; + } + /** + * @method define + * @instance + * @description Define the module in manager + * @param name The module name + * @memberof module:core.ModuleManager + */ + + }, { + key: "define", + value: function define(name) { + this.modules[name] = this.currentModule; + } + /** + * @method use + * @instance + * @description Get the defined module from manager + * @param name The module name + * @memberof module:core.ModuleManager + */ + + }, { + key: "use", + value: function use(name) { + return this.modules[name]; + } + /** + * @method set + * @instance + * @description An alias for .add()

+ * Use this method if you know that you will overwrite existing dependency.
+ * Use it in your app, but not in module that you provide to other people. + * @param {String} key the key of the dependency + * @param {Object} data the value of the dependency + * @memberof module:core.ModuleManager + */ + + }, { + key: "set", + value: function set(key, data) { + this.store.dispatch({ + type: 'ADD', + key: key, + data: data + }); + } + /** + * @method get + * @instance + * @description Returns dependency in store object, by key. + * @param {String} key the key of the dependency + * @memberof module:core.ModuleManager + * @return {Object|Module} + * @throws {DependencyError} if dependency is not in the store + * @example Get the 'hello' dependency + * manager.get('hello'); // -> {world: true} + */ + + }, { + key: "get", + value: function get(key) { + if (!this.store.getState()[0][key]) { + throw new DependencyError('ModuleManager', "Module requires '".concat(key, "' dependency"), this.currentModule); + } + + return this.store.getState()[0][key]; + } + /** + * @method has + * @instance + * @description Returns whether manager has a dependency with the given key + * @param {String} key the key of the dependency + * @memberof module:core.ModuleManager + * @return {Boolean} Promise that is resolved when all promises completed. + * @example Check whether the store has the 'hello' dependency + * manager.has('hello'); // -> true + */ + + }, { + key: "has", + value: function has(key) { + return Boolean(this.store.getState()[0][key]); + } + /** + * @method update + * @instance + * @description Updates deps + * @param {Object} [depsMap={}] + * @memberof module:core.ModuleManager + */ + + }, { + key: "update", + value: function update() { + var _this = this; + + var depsMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.store.subscribe(function () { + var _this$store$getState = _this.store.getState(), + _this$store$getState2 = slicedToArray(_this$store$getState, 2), + data = _this$store$getState2[0], + changedKey = _this$store$getState2[1]; + + var callback = depsMap[changedKey]; + if (callback) callback(data[changedKey]); + }); + } + /** + * @method add + * @alias module:core.ModuleManager#set + * @memberof module:core.ModuleManager + */ + + }, { + key: "add", + value: function add() { + console.warn('.add() method is deprecated. Use .set() instead'); + return this.set.apply(this, arguments); + } + /** + * @method require + * @instance + * @description Require module + * @param {String} name Defined name + * @param {Function} moduleExecutor Function that returns applied module + * @memberof module:core.ModuleManager + */ + + }, { + key: "require", + value: function require(name, moduleExecutor) { + if (this.use(name) === undefined) this.handler.applyModule(moduleExecutor()); + } + }]); + + return ModuleManager; + }(); + + /** + * @class Component + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends ModuleSystem + * @memberof module:core + */ + + var Component = + /*#__PURE__*/ + function (_ModuleSystem) { + /** + * Default values for parameters + * @member {Object} module:core.Component#defaults + * @static + * @default { + * modules: [], + * manager: true + * } + */ + + /** + * Static instructions + * @member {Object} module:core.Component#instructions + * @static + * @default {} + */ + + /** + * Array of promises that should be resolved before Component is ready. + * @member {Array} module:core.Component#_wait + * @private + */ + // Collection of promises; + + /** + * Collection of `modules`. + * @member {Array} module:core.Component#modules + * @public + */ + // Collection of modules; + + /** + * Collection of `child` Components. + * @member {Array} module:core.Component#children + * @public + */ + // For keeping children components; + function Component() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Component.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Component.instructions; + + classCallCheck(this, Component); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Component).call(this)); // Apply polyfilled parameters to .params; + + defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "_wait", []), "modules", []), "children", []); + + _this.params = extend(transformData(params, instructions), defaults); + if (_this.params.manager) _this.manager = new ModuleManager(assertThisInitialized(assertThisInitialized(_this))); + _this.modules = _this.params.modules; + + _this.integrateModules(); + + return _this; + } + /** + * @method wait + * @instance + * @description Wait for a promise. + * @param {Promise} [promise] - The promise that should be added to a queue. + * @return {Promise} Promise that is resolved when all promises completed. + * @memberof module:core.Component + */ + + + createClass(Component, [{ + key: "wait", + value: function wait(promise) { + if (promise) this._wait.push(promise); + return Promise.all(this._wait); + } + /** + * @method defer + * @instance + * @description Execute `func` (Callback) when Component is ready. + * @param {Function} func - Callback. + * @memberof module:core.Component + */ + + }, { + key: "defer", + value: function defer(func) { + var _this2 = this; + + if (this.isDeffered) this.wait().then(function () { + return func(_this2); + });else func(this); + } // PARAMETERS + + /** + * @method updateParams + * @instance + * @description Updates parameters of the Component. + * @return {Object} Params of this Component + * @memberof module:core.Component + */ + + }, { + key: "updateParams", + value: function updateParams() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.params = extend(params, this.params); + return this.params; + } // COPYING & CLONING + + /** + * @method clone + * @instance + * @description Clone this component + * @return {object} a cloned component with all its source component' params copied. + * @memberof module:core.Component + */ + + }, { + key: "clone", + value: function clone() { + return new this.constructor(this.params).copy(this); + } + /** + * @method copy + * @instance + * @description Copy source native and integrate `modules` to it. + * @param {Component} source - Source component that is used for `copy()` action. + * @param {Function} [customize] - Callback executed before modules integration process. + * @return {this} Component + * @memberof module:core.Component + */ + + }, { + key: "copy", + value: function copy(source, customize) { + this.params = objectSpread({}, source.params); + if (source.native) this.native = source.native.clone(source.params); + if (customize) customize(); + this.integrateModules(source); + return this; + } + /** + * @method add + * @instance + * @description Add a child `Component`. + * @param {Component} object - Component that should be added as a `child`. + * @return {Promise} Resolved when action is done. + * @memberof module:core.Component + */ + + }, { + key: "add", + value: function () { + var _add = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee(object) { + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!object.parent) { + _context.next = 3; + break; + } + + _context.next = 3; + return object.parent.remove(object); + + case 3: + _context.next = 5; + return this.wait(); + + case 5: + _context.next = 7; + return object.wait(); + + case 7: + if (object.native) { + _context.next = 9; + break; + } + + throw new CompositionError$1('Component', 'there is no object.native', this); + + case 9: + object.parent = this; + _context.next = 12; + return this.applyBridge({ + onAdd: object + }).onAdd; + + case 12: + this.native.add(object.native); + this.children.push(object); + return _context.abrupt("return", object); + + case 15: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + return function add(_x) { + return _add.apply(this, arguments); + }; + }() + /** + * @method remove + * @instance + * @description Remove a child `Component`. + * @param {Component} object - Component that should be a **child** of this Component. + * @return {Promise} Resolved when action is done. + * @memberof module:core.Component + */ + + }, { + key: "remove", + value: function () { + var _remove = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee2(object) { + return regenerator.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(object.parent !== this)) { + _context2.next = 2; + break; + } + + return _context2.abrupt("return"); + + case 2: + _context2.next = 4; + return this.wait(); + + case 4: + _context2.next = 6; + return object.wait(); + + case 6: + object.parent = null; + this.native.remove(object.native); + this.children.splice(this.children.indexOf(object), 1); + + case 9: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + return function remove(_x2) { + return _remove.apply(this, arguments); + }; + }() + /** + * @method addTo + * @instance + * @description Adds `this` Component to specified `App`/`Component`. + * @param {Component} object - Component that will be a parent of `this`. + * @memberof module:core.Component + */ + + }, { + key: "addTo", + value: function addTo(object) { + return object.add(this); + } + }, { + key: "get", + value: function get(key) { + return this.manager.get(key); + } + }, { + key: "use", + value: function use(key) { + return this.manager.use(key); + } + /** + * Returns whether the object is `async` (`wait` promises are more than `0`). + * @member {Boolean} module:core.Component#isDeffered + */ + + }, { + key: "isDeffered", + get: function get() { + return this._wait.length > 0; + } + /** + * Returns the `ModuleManager` used for this component. + * @member {ModuleManager} module:core.Component#manager + * @throws {ManagerError} + */ + + }, { + key: "manager", + get: function get() { + if (this._manager) return this._manager; + throw new ManagerError('Component', "ModuleManager is not used in this component. 'manager' parameter should be set as 'true'", this); + }, + set: function set(manager) { + this._manager = manager; + } + /** + * Returns the `native` object used for this component. + * @member {Object} module:core.Component#native + */ + + }, { + key: "native", + get: function get() { + return this._native; + }, + set: function set(mesh) { + this._native = mesh; + this._native.component = this; + return this._native; + } + }]); + + inherits(Component, _ModuleSystem); + + return Component; + }(ModuleSystem); + + defineProperty$3(defineProperty$3(Component, "defaults", { + modules: null, + manager: true + }), "instructions", {}); + + // 26.1.6 Reflect.get(target, propertyKey [, receiver]) + + + + + + + + function get(target, propertyKey /* , receiver */) { + var receiver = arguments.length < 3 ? target : arguments[2]; + var desc, proto; + if (_anObject(target) === receiver) return target[propertyKey]; + if (desc = _objectGopd.f(target, propertyKey)) return _has(desc, 'value') + ? desc.value + : desc.get !== undefined + ? desc.get.call(receiver) + : undefined; + if (_isObject(proto = _objectGpo(target))) return get(proto, propertyKey, receiver); + } + + _export(_export.S, 'Reflect', { get: get }); + + var get$1 = _core.Reflect.get; + + var get$2 = get$1; + + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = getPrototypeOf$2(object); + if (object === null) break; + } + + return object; + } + + var superPropBase = _superPropBase; + + var get$3 = createCommonjsModule(function (module) { + function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && get$2) { + module.exports = _get = get$2; + } else { + module.exports = _get = function _get(target, property, receiver) { + var base = superPropBase(target, property); + if (!base) return; + + var desc = getOwnPropertyDescriptor$1(base, property); + + if (desc.get) { + return desc.get.call(receiver); + } + + return desc.value; + }; + } + + return _get(target, property, receiver || target); + } + + module.exports = _get; + }); + + function attributes() { + for (var _len = arguments.length, mappers = new Array(_len), _key = 0; _key < _len; _key++) { + mappers[_key] = arguments[_key]; + } + + return function (target) { + for (var i = 0; i < mappers.length; i++) { + var mapper = mappers[i]; + + for (var k = 0; k < mapper.map.length; k++) { + var attribute = mapper.map[k]; + Object.defineProperty(target.prototype, attribute, { + get: mapper.getter(attribute), + set: mapper.setter(attribute), + configurable: mapper.configurable, + enumerable: mapper.enumerable + }); + } + } + }; + } + function copy() { + for (var _len2 = arguments.length, map = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + map[_key2] = arguments[_key2]; + } + + return { + map: map, + getter: function getter(name) { + return function () { + return this.native[name]; + }; + }, + setter: function setter(name) { + return function (value) { + this.native[name].copy(value); + }; + }, + configurable: true, + enumerable: true + }; + } + function mirror() { + for (var _len3 = arguments.length, map = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + map[_key3] = arguments[_key3]; + } + + return { + map: map, + getter: function getter(name) { + return function () { + return this.native[name]; + }; + }, + setter: function setter(name) { + return function (value) { + this.native[name] = value; + }; + }, + configurable: true, + enumerable: true + }; + } + + var _dec, _class; + var + /** + * @class MeshComponent + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends module:core.Component + * @memberof module:core + */ + MeshComponent = (_dec = attributes(copy('position', 'rotation', 'quaternion', 'scale'), mirror('material', 'geometry')), _dec(_class = + /*#__PURE__*/ + function (_Component) { + createClass(MeshComponent, null, [{ + key: "custom", + + /** + * Default values for parameters + * @member {Object} module:core.MeshComponent#defaults + * @static + * @default + * { + * build: true, + * geometry: {}, + * material: false, + * + * shadow: { + * cast: true, + * receive: true + * }, + * + * position: {x: 0, y: 0, z: 0}, + * rotation: {x: 0, y: 0, z: 0}, + * scale: {x: 1, y: 1, z: 1} + * } + */ + + /** + * Static instructions + * @member {Object} module:core.MeshComponent#instructions + * @static + * @default + * { + * position: ['x', 'y', 'z'], + * rotation: ['x', 'y', 'z'], + * scale: ['x', 'y', 'z'] + * } + */ + // CUSTOM GEOMETRY HANDLING + value: function custom(geom) { + var constructor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Mesh; + return ( + /*#__PURE__*/ + function (_MeshComponent) { + function _class2() { + classCallCheck(this, _class2); + + return possibleConstructorReturn(this, getPrototypeOf$2(_class2).apply(this, arguments)); + } + + createClass(_class2, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: geom, + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new constructor(geometry, material) + }).mesh; + } + }]); + + inherits(_class2, _MeshComponent); + + return _class2; + }(MeshComponent) + ); + } + }, { + key: "create", + value: function create(geom, params, constructor) { + return new (MeshComponent.custom(geom, constructor))(params); + } + }, { + key: "from", + value: function from(mesh) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + params.build = false; + var component = new MeshComponent(params); + component.native = mesh; + component.wrap(); + return component; + } + }]); + + function MeshComponent(params) { + var _this; + + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : MeshComponent.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : MeshComponent.instructions; + + classCallCheck(this, MeshComponent); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(MeshComponent).call(this, params, defaults, instructions)); + + if (_this.params.build) { + var build = _this.build(_this.params); + + if (!build) { + throw new CompositionError$1('MeshComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this))); + } + + if (build instanceof Promise) { + _this.wait(build); + + _this.wait(new Promise(function (resolve) { + build.then(function (native) { + _this.native = native; + + _this.wrap().then(resolve); + }); + })); + } else { + _this.native = build; + + _this.wait(_this.wrap()); + } + } + + _this.applyCommand('postIntegrate'); + + return _this; + } // BUILDING & WRAPPING + + /** + * @method build + * @description Build livecycle should return a native object. + * @throws {CompositionError} + * @memberof module:core.MeshComponent + */ + + + createClass(MeshComponent, [{ + key: "build", + value: function build() { + throw new CompositionError$1('MeshComponent', 'Instance should have it\'s own .build().', this); + } + /** + * @method wrap + * @instance + * @description Wraps transforms (`position` & `rotation`) + * @return {Promise} Resolved when action is completed + * @memberof module:core.MeshComponent + */ + + }, { + key: "wrap", + value: function wrap() { + var _this2 = this; + + return new Promise(function (resolve) { + // TODO: Fix defer with physics + // this.defer(() => { + var _this2$params = _this2.params, + position = _this2$params.position, + rotation = _this2$params.rotation, + scale = _this2$params.scale, + shadow = _this2$params.shadow; + + _this2.position.set(position.x, position.y, position.z); + + _this2.rotation.set(rotation.x, rotation.y, rotation.z); + + _this2.scale.set(scale.x, scale.y, scale.z); + + _this2.native.castShadow = shadow.cast; + _this2.native.receiveShadow = shadow.receive; + + _this2.applyBridge({ + onWrap: 1 + }); + + resolve(_this2); // }); + }); + } // COPYING & CLONING + + /** + * @method copy + * @instance + * @description Copy source transforms & execute `Component.copy()` + * @return {this} MeshComponent + * @memberof module:core.MeshComponent + */ + + }, { + key: "copy", + value: function copy$$1(source) { + var _this3 = this; + + return get$3(getPrototypeOf$2(MeshComponent.prototype), "copy", this).call(this, source, function () { + _this3.position.copy(source.position); + + _this3.rotation.copy(source.rotation); + + _this3.quaternion.copy(source.quaternion); + }); + } + /** + * @method clone + * @instance + * @description Make a clone of this MeshComponent using `.copy()` + * @return {MeshComponent} clone of this object + * @memberof module:core.MeshComponent + */ + + }, { + key: "clone", + value: function clone(geometry, material) { + var dest = new this.constructor({ + build: false + }).copy(this); + if (geometry) dest.geometry = dest.geometry.clone(); + if (material) dest.material = dest.material.clone(); + return dest; + } + }]); + + inherits(MeshComponent, _Component); + + return MeshComponent; + }(Component)) || _class); + + defineProperty$3(defineProperty$3(MeshComponent, "defaults", objectSpread({}, Component.defaults, { + build: true, + geometry: {}, + material: false, + shadow: { + cast: true, + receive: true + }, + position: { + x: 0, + y: 0, + z: 0 + }, + rotation: { + x: 0, + y: 0, + z: 0 + }, + scale: { + x: 1, + y: 1, + z: 1 + } + })), "instructions", { + position: ['x', 'y', 'z'], + rotation: ['x', 'y', 'z'], + scale: ['x', 'y', 'z'] + }); + + var _dec$1, _class$1; + var + /** + * @class LightComponent + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends module:core.Component + * @memberof module:core + */ + LightComponent = (_dec$1 = attributes(copy('position', 'rotation', 'quaternion', 'target')), _dec$1(_class$1 = + /*#__PURE__*/ + function (_Component) { + createClass(LightComponent, null, [{ + key: "from", + + /** + * Default values for parameters + * @member {Object} module:core.LightComponent#defaults + * @static + * @default + * { + * build: true, + * + * shadow: { + * cast: true, + * + * bias: 0, + * radius: 1, + * + * mapSize: { + * width: 1024, + * height: 1024 + * }, + * + * camera: { + * near: true, + * far: 400, + * fov: 90, + * + * top: 200, + * bottom: -200, + * left: -200, + * right: 200 + * } + * }, + * + * position: {x: 0, y: 0, z: 0}, + * rotation: {x: 0, y: 0, z: 0} + * } + */ + + /** + * Static instructions + * @member {Object} module:core.LightComponent#instructions + * @static + * @default + * { + * position: ['x', 'y', 'z'], + * rotation: ['x', 'y', 'z'] + * } + */ + value: function from(light) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var wrapShadow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + params.build = false; + var component = new LightComponent(params); + component.native = light; + component.wrap(); + if (wrapShadow) component.wrapShadow(); + return component; + } + }]); + + function LightComponent(params) { + var _this; + + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : LightComponent.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : LightComponent.instructions; + + classCallCheck(this, LightComponent); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(LightComponent).call(this, params, defaults, instructions)); + + if (_this.params.build) { + var build = _this.build(_this.params); + + if (!build) { + throw new CompositionError$1('LightComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this))); + } + + if (build instanceof Promise) { + build.then(function (native) { + _this.native = native; + }); + } else _this.native = build; + + _this.wait(_this.wrap()); + } + + _this.applyCommand('postIntegrate'); + + return _this; + } // BUILDING & WRAPPING + + /** + * @method build + * @instance + * @description Build livecycle should return a native object. + * @throws {CompositionError} + * @memberof module:core.LightComponent + */ + + + createClass(LightComponent, [{ + key: "build", + value: function build() { + throw new CompositionError$1('MeshComponent', 'Instance should have it\'s own .build().', this); + } + /** + * @method wrap + * @instance + * @description Wraps transforms (`position` & `rotation`) + * @return {Promise} Resolved when action is completed + * @memberof module:core.LightComponent + */ + + }, { + key: "wrap", + value: function wrap() { + var _this2 = this; + + return new Promise(function (resolve) { + _this2.defer(function () { + var _this2$params = _this2.params, + position = _this2$params.position, + rotation = _this2$params.rotation; + + _this2.position.set(position.x, position.y, position.z); + + _this2.rotation.set(rotation.x, rotation.y, rotation.z); + + _this2.applyBridge({ + onWrap: 1 + }); + + resolve(_this2); + }); + }); + } + /** + * @method wrapShadow + * @instance + * @description Wraps shadow properties + * @memberof module:core.LightComponent + */ + + }, { + key: "wrapShadow", + value: function wrapShadow() { + var native = this.native, + shadow = this.params.shadow; + native.castShadow = shadow.cast; + native.shadow.mapSize.width = shadow.mapSize.width; + native.shadow.mapSize.height = shadow.mapSize.height; + native.shadow.bias = shadow.bias; + native.shadow.radius = shadow.radius; + var shadowCamera = native.shadow.camera; + var camera = shadow.camera; + shadowCamera.near = camera.near; + shadowCamera.far = camera.far; + shadowCamera.fov = camera.fov; + shadowCamera.left = camera.left; + shadowCamera.right = camera.right; + shadowCamera.top = camera.top; + shadowCamera.bottom = camera.bottom; + } // COPYING & CLONING + + /** + * @method copy + * @instance + * @description Copy source transforms & execute `Component.copy()` + * @return {this} LightComponent + * @memberof module:core.LightComponent + */ + + }, { + key: "copy", + value: function copy$$1(source) { + var _this3 = this; + + return get$3(getPrototypeOf$2(LightComponent.prototype), "copy", this).call(this, source, function () { + if (_this3.target) _this3.target.copy(source.target()); + + _this3.position.copy(source.position); + + _this3.rotation.copy(source.rotation); + + _this3.quaternion.copy(source.quaternion); + }); + } + /** + * @method clone + * @instance + * @description Make a clone of this LightComponent using `.copy()` + * @return {LightComponent} clone of this object + * @memberof module:core.LightComponent + */ + + }, { + key: "clone", + value: function clone() { + return new this.constructor({ + build: false + }).copy(this); + } + }]); + + inherits(LightComponent, _Component); + + return LightComponent; + }(Component)) || _class$1); + + defineProperty$3(defineProperty$3(LightComponent, "defaults", objectSpread({}, Component.defaults, { + build: true, + shadow: { + cast: true, + bias: 0, + radius: 1, + mapSize: { + width: 1024, + height: 1024 + }, + camera: { + near: true, + far: 400, + fov: 90, + top: 200, + bottom: -200, + left: -200, + right: 200 + } + }, + position: { + x: 0, + y: 0, + z: 0 + }, + rotation: { + x: 0, + y: 0, + z: 0 + } + })), "instructions", { + position: ['x', 'y', 'z'], + rotation: ['x', 'y', 'z'] + }); + + var _dec$2, _class$2; + var + /** + * @class CameraComponent + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends module:core.Component + * @memberof module:core + */ + CameraComponent = (_dec$2 = attributes(copy('position', 'rotation', 'quaternion', 'target')), _dec$2(_class$2 = + /*#__PURE__*/ + function (_Component) { + createClass(CameraComponent, null, [{ + key: "from", + + /** + * Default values for parameters + * @member {Object} module:core.CameraComponent#defaults + * @static + * @default + * { + * build: true, + * + * position: {x: 0, y: 0, z: 0}, + * rotation: {x: 0, y: 0, z: 0} + * } + */ + + /** + * Static instructions + * @member {Object} module:core.CameraComponent#instructions + * @static + * @default + * { + * position: ['x', 'y', 'z'], + * rotation: ['x', 'y', 'z'], + * scale: ['x', 'y', 'z'] + * } + */ + value: function from(camera) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + params.build = false; + var component = new CameraComponent(params); + component.native = camera; + component.wrap(); + return component; + } + }]); + + function CameraComponent(params) { + var _this; + + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CameraComponent.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : CameraComponent.instructions; + + classCallCheck(this, CameraComponent); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(CameraComponent).call(this, params, defaults, instructions)); + + if (_this.params.build) { + var build = _this.build(_this.params); + + if (!build) { + throw new CompositionError$1('CameraComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this))); + } + + if (build instanceof Promise) { + build.then(function (native) { + _this.native = native; + }); + } else _this.native = build; + + _this.wait(_this.wrap()); + } + + _this.applyCommand('postIntegrate'); + + return _this; + } // BUILDING & WRAPPING + + /** + * @method build + * @instance + * @description Build livecycle should return a native object. + * @throws {CompositionError} + * @memberof module:core.CameraComponent + */ + + + createClass(CameraComponent, [{ + key: "build", + value: function build() { + throw new CompositionError$1('CameraComponent', 'Instance should have it\'s own .build().', this); + } + /** + * @method wrap + * @instance + * @description Wraps transforms (`position` & `rotation`) + * @return {Promise} Resolved when action is completed + * @memberof module:core.CameraComponent + */ + + }, { + key: "wrap", + value: function wrap() { + var _this2 = this; + + return new Promise(function (resolve) { + _this2.defer(function () { + _this2.position.set(_this2.params.position.x, _this2.params.position.y, _this2.params.position.z); + + _this2.rotation.set(_this2.params.rotation.x, _this2.params.rotation.y, _this2.params.rotation.z); + + _this2.applyBridge({ + onWrap: 1 + }); + + resolve(_this2); + }); + }); + } + /** + * @method copy + * @instance + * @description Copy source transforms & execute `Component.copy()` + * @return {this} CameraComponent + * @memberof module:core.CameraComponent + */ + + }, { + key: "copy", + value: function copy$$1(source) { + var _this3 = this; + + return get$3(getPrototypeOf$2(CameraComponent.prototype), "copy", this).call(this, source, function () { + if (_this3.target) _this3.target.copy(source.target()); + + _this3.position.copy(source.position); + + _this3.rotation.copy(source.rotation); + + _this3.quaternion.copy(source.quaternion); + }); + } + /** + * @method clone + * @instance + * @description Make a clone of this CameraComponent using `.copy()` + * @return {CameraComponent} clone of this object + * @memberof module:core.CameraComponent + */ + + }, { + key: "clone", + value: function clone() { + return new this.constructor({ + build: false + }).copy(this); + } + }]); + + inherits(CameraComponent, _Component); + + return CameraComponent; + }(Component)) || _class$2); + + defineProperty$3(defineProperty$3(CameraComponent, "defaults", objectSpread({}, Component.defaults, { + build: true, + position: { + x: 0, + y: 0, + z: 0 + }, + rotation: { + x: 0, + y: 0, + z: 0 + } + })), "instructions", { + position: ['x', 'y', 'z'], + rotation: ['x', 'y', 'z'], + scale: ['x', 'y', 'z'] + }); + + const version = "2.2.0-beta.2"; + + var system = { + window: typeof window === 'undefined' ? global : window + }; + + /** + * @class App + * @category core + * @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes. + * @param {Array} [modules=[]] - Array of Modules + * @extends ModuleSystem + * @memberof module:core + */ + + var App = + /*#__PURE__*/ + function (_ModuleSystem) { + /** + * @description Defines whether the scene should render or not + * @member {Boolean} module:core.App#enabled + * @public + */ + + /** + * Loops in this app + * @description Array of loops that are executed by this app. + * @member {Array} module:core.App#loops + * @public + */ + function App() { + var _this; + + var modules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + + classCallCheck(this, App); + + console.log("WHS.App ".concat(version)); + _this = possibleConstructorReturn(this, getPrototypeOf$2(App).call(this)); + + defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "enabled", true), "loops", []); + + _this.manager = new ModuleManager(assertThisInitialized(assertThisInitialized(_this))); + _this.modules = modules; + + _this.integrateModules(); + + return _this; + } // CONTROLS & UPDATING + + /** + * @method start + * @description Start rendering loop and physics simulation (if you use version with physics). + * @memberof module:core.App + */ + + + createClass(App, [{ + key: "start", + value: function start() { + var _this2 = this; + + var requestAnimFrame = function () { + return system.window.requestAnimationFrame || system.window.webkitRequestAnimationFrame || system.window.mozRequestAnimationFrame || function (callback) { + system.window.setTimeout(callback, 1000 / 60); + }; + }(); + + var process = function process() { + _this2.request = requestAnimFrame(function () { + return process(); + }); + if (!_this2.enabled) return; + + for (var i = 0, ll = _this2.loops.length; i < ll; i++) { + var e = _this2.loops[i]; + if (e.enabled) e.execute(e.clock); + } + }; + + this.enabled = true; + if (!this.request) process(); + } + /** + * @method stop + * @description Stops rendering loops + * @memberof module:core.App + */ + + }, { + key: "stop", + value: function stop() { + this.enabled = false; + } + /** + * @method addLoop + * @description Adds loop to this app. + * @param {Object} loop - the loop to add + * @return {Promise} Promise that is resolved when promises completed. + * @memberof module:core.App + * @example Adding a loop to an app + * const loop = new Loop(() => { + * // ... + * }); + * + * const app = new App(); + * + * app.addLoop(loop); + * loop.start(); + */ + + }, { + key: "addLoop", + value: function addLoop(loop) { + var _this3 = this; + + return new Promise(function (resolve) { + _this3.loops.push(loop); + + resolve(loop); + }); + } + /** + * @method removeLoop + * @description Removes loop from this app. + * @param {Object} loop - the loop to remove + * @return {Promise} Promise that is resolved when promises completed. + * @memberof module:core.App + */ + + }, { + key: "removeLoop", + value: function removeLoop(loop) { + var _this4 = this; + + return new Promise(function (resolve) { + var index = _this4.loops.indexOf(loop); + + if (index !== -1) _this4.loops.splice(index, 1); + resolve(loop); + }); + } + }, { + key: "get", + value: function get(key) { + return this.manager.get(key); + } + }, { + key: "use", + value: function use(key) { + return this.manager.use(key); + } + }]); + + inherits(App, _ModuleSystem); + + return App; + }(ModuleSystem); + + /** + * @class Loop + * @category core + * @param {Function} func function to execute on each animation frame + * @param {Boolean} [useClock=true] passes a Clock to the function when called, if true + * @memberof module:core + */ + + var Loop = + /*#__PURE__*/ + function () { + function Loop(func) { + var useClock = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + classCallCheck(this, Loop); + + this.func = func; + this.clock = useClock ? new Clock() : null; + this.enabled = false; + } // CONTROLS + + /** + * @method start + * @instance + * @description Starts this loop, clock if it has one. Won't do anything if loop enabled already. + * @param {Component} [world] app to add this loop to, if provided. + * @memberof module:core.Loop + */ + + + createClass(Loop, [{ + key: "start", + value: function start(world) { + if (this.enabled) return; + if (world) world.addLoop(this); + if (this.clock) this.clock.start(); + this.enabled = true; + } + /** + * @method stop + * @instance + * @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled) + * @param {Component} [world] app to remove this loop from, if provided. + * @memberof module:core.Loop + */ + + }, { + key: "stop", + value: function stop(world) { + if (!this.enabled) return; + if (this.clock) this.clock.stop(); + this.enabled = false; + if (world) world.removeLoop(this); + } // EXECUTION + + /** + * @method execute + * @instance + * @description Executes the function of this loop + * @memberof module:core.Loop + * @returns {*} whatever the function of this loop returns + */ + + }, { + key: "execute", + value: function execute() { + return this.func(this.clock); + } + }]); + + return Loop; + }(); + + /** @module core */ + + /** + * @class AmbientLight + * @category components/lights + * @description AmbientLight is a simple class, it extends Light and inherits all its methods. + * AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target. + * It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light. + * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating an AmbientLight + * new AmbientLight({ + * color: 0xffffff, + * intensity: 0.2 + * }).addTo(world); + */ + + var AmbientLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function AmbientLight$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, AmbientLight$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(AmbientLight$$1).call(this, params, AmbientLight$$1.defaults)); + } + + createClass(AmbientLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new AmbientLight(params.color, params.intensity) + }).light; + } + }]); + + inherits(AmbientLight$$1, _LightComponent); + + return AmbientLight$$1; + }(LightComponent); + + defineProperty$3(AmbientLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1 + })); + + /** + * @class DirectionalLight + * @category components/lights + * @description DirectinalLight creates a light that shines from a specific direction not from a specific position.

+ * This light will behave as though it is infinitely far away and the rays produced from it are all parallel.

+ * The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.

+ * It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters. + * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0) + * new DirectionalLight({ + * color: 0xffffff, + * intensity: 0.2, + * + * position: [10, 20, 10] + * }).addTo(app); + */ + + var DirectionalLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function DirectionalLight$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DirectionalLight$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(DirectionalLight$$1).call(this, params, DirectionalLight$$1.defaults)); + + _this.wrapShadow(); + + return _this; + } + + createClass(DirectionalLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new DirectionalLight(params.color, params.intensity) + }).light; + } + }]); + + inherits(DirectionalLight$$1, _LightComponent); + + return DirectionalLight$$1; + }(LightComponent); + + defineProperty$3(DirectionalLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1 + })); + + /** + * @class HemisphereLight + * @category components/lights + * @description HemisphereLight is a light source positioned directly above the scene.
+ * It also doesn't need position and target properties. + * @classDesc + * + * @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating a HemisphereLight + * new HemisphereLight({ + * skyColor: 0xff0000, + * groundColor: 0x0000ff, + * intensity: 0.2 + * }).addTo(app); + */ + + var HemisphereLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function HemisphereLight$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, HemisphereLight$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(HemisphereLight$$1).call(this, params, HemisphereLight$$1.defaults)); + } + + createClass(HemisphereLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new HemisphereLight(params.skyColor, params.groundColor, params.intensity) + }).light; + } + }]); + + inherits(HemisphereLight$$1, _LightComponent); + + return HemisphereLight$$1; + }(LightComponent); + + defineProperty$3(HemisphereLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + skyColor: 0xffffff, + groundColor: 0xffffff, + intensity: 1 + })); + + /** + * @class PointLight + * @category components/lights + * @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)

+ * It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.
+ * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params. + * @extends LightComponent + * @memberof module:components/lights + * @example Creating a PointLight + * new PointLight( { + * color: 0xff0000, + * intensity: 2, + * distance: 300 + * + * position: [10, 20, 10] + * }).addTo(app); + */ + + var PointLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function PointLight$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, PointLight$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(PointLight$$1).call(this, params, PointLight$$1.defaults)); + + _this.wrapShadow(); + + return _this; + } + + createClass(PointLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new PointLight(params.color, params.intensity, params.distance, params.decay) + }).light; + } + }]); + + inherits(PointLight$$1, _LightComponent); + + return PointLight$$1; + }(LightComponent); + + defineProperty$3(PointLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1, + distance: 100, + decay: 1 + })); + + /** + * @class SpotLight + * @category components/lights + * @description SpotLight creates spot light that can cast shadow in one direction.

+ * It has the same parameters as AmbientLight in light, but it also supports pos and target.

+ * SpotLight affects meshes with lambert and phong material. + * @classDesc + * + * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0) + * new SpotLight({ + * color: 0x00ff00, + * intensity: 3, + * distance: 1000 + * + * position: [10, 20, 10] + * }).addTo(app); + */ + + var SpotLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function SpotLight$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, SpotLight$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(SpotLight$$1).call(this, params, SpotLight$$1.defaults)); + + _this.wrapShadow(); + + return _this; + } + + createClass(SpotLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new SpotLight(params.color, params.intensity, params.distance, params.angle, params.exponent, params.decay) + }).light; + } + }]); + + inherits(SpotLight$$1, _LightComponent); + + return SpotLight$$1; + }(LightComponent); + + defineProperty$3(SpotLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1, + distance: 100, + angle: Math.PI / 3, + exponent: 0, + decay: 1 + })); + + var AreaLight = + /*#__PURE__*/ + function (_LightComponent) { + function AreaLight() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, AreaLight); + + return possibleConstructorReturn(this, getPrototypeOf$2(AreaLight).call(this, params, AreaLight.defaults)); + } + + createClass(AreaLight, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new RectAreaLight(params.color, params.intensity, params.width, params.height) + }).light; + } + }]); + + inherits(AreaLight, _LightComponent); + + return AreaLight; + }(LightComponent); + + defineProperty$3(AreaLight, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1, + width: 10, + height: 10 + })); + + /** @module components/lights */ + + /** + * @class CubeCamera + * @category components/cameras + * @description Creates 6 cameras that render to a WebGLRenderTargetCube + * @param {Object} [params] - The parameters object. + * @memberof module:components/cameras + * @extends module:core.CameraComponent + * @example Creates a CubeCamera and set it as app's camera + * const camera = new CubeCamera({ + * camera: { + * cubeResolution: 256 + * }, + * + * position: { + * x: 0, + * y: 100, + * z: 0 + * } + * }); + * + * app.camera = camera; + */ + + var CubeCamera$1 = + /*#__PURE__*/ + function (_CameraComponent) { + /** + * Default values for parameters + * @member {Object} module:components/cameras.CubeCamera#defaults + * @static + * @default
+	   * {
+	   *   camera: {
+	   *     near: 1,
+	   *     far: 1000,
+	   *     cubeResolution: 128
+	   *   }
+	   * }
+ */ + function CubeCamera$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, CubeCamera$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(CubeCamera$$1).call(this, params, CubeCamera$$1.defaults)); + } + + createClass(CubeCamera$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + camera: new CubeCamera(params.near, params.far, params.cubeResolution) + }).camera; + } + }]); + + inherits(CubeCamera$$1, _CameraComponent); + + return CubeCamera$$1; + }(CameraComponent); + + defineProperty$3(CubeCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, { + near: 1, + far: 1000, + cubeResolution: 128 + })); + + /** + * @class OrthographicCamera + * @category components/cameras + * @description Camera with orthographic projection. + * @param {Object} [params] - The parameters object. + * @memberof module:components/cameras + * @extends module:core.CameraComponent + * @example Create an OrthographicCamera and set it as app's camera + * const camera = new OrthographicCamera({ + * camera: { + * far: 10000 + * }, + * + * position: { + * y: 50 + * } + * }); + * + * app.camera = camera; + */ + + var OrthographicCamera$1 = + /*#__PURE__*/ + function (_CameraComponent) { + /** + * Default values for parameters + * @member {Object} module:components/cameras.OrthographicCamera#defaults + * @static + * @default
+	   * {
+	   *   near: 1,
+	   *   far: 1000,
+	   *   left: system.window.innerWidth / -2,
+	   *   right: system.window.innerWidth / 2,
+	   *   top: system.window.innerHeight / 2,
+	   *   bottom: system.window.innerHeight / -2
+	   * }
+ */ + function OrthographicCamera$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, OrthographicCamera$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(OrthographicCamera$$1).call(this, params, OrthographicCamera$$1.defaults)); + } + + createClass(OrthographicCamera$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + camera: new OrthographicCamera(params.left, params.right, params.top, params.bottom, params.near, params.far) + }).camera; + } + }]); + + inherits(OrthographicCamera$$1, _CameraComponent); + + return OrthographicCamera$$1; + }(CameraComponent); + + defineProperty$3(OrthographicCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, { + near: 1, + far: 1000, + left: system.window.innerWidth / -2, + right: system.window.innerWidth / 2, + top: system.window.innerHeight / 2, + bottom: system.window.innerHeight / -2 + })); + + /** + * @class PerspectiveCamera + * @description Camera with perspective projection. + * @category components/cameras + * @param {Object} [params] - The parameters object. + * @memberof module:components/cameras + * @extends module:core.CameraComponent + * @example Create an PerspectiveCamera and set it as app's camera + * const camera = new PerspectiveCamera({ + * fov: 75, + * aspect: window.innerWidth / window.innerHeight, + * + * position: { + * x: 0, + * y: 100, + * z: 0 + * } + * }); + * + * app.camera = camera; + */ + + var PerspectiveCamera$1 = + /*#__PURE__*/ + function (_CameraComponent) { + /** + * Default values for parameters + * @member {Object} module:components/cameras.PerspectiveCamera#defaults + * @static + * @default
+	   * {
+	   *   near: 1,
+	   *   far: 1000,
+	   *   fov: 75,
+	   *   aspect: system.window.innerWidth / system.window.innerHeight
+	   * }
+ */ + function PerspectiveCamera$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, PerspectiveCamera$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(PerspectiveCamera$$1).call(this, params, PerspectiveCamera$$1.defaults)); + } + + createClass(PerspectiveCamera$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + camera: new PerspectiveCamera(params.fov, params.aspect, params.near, params.far) + }).camera; + } + }]); + + inherits(PerspectiveCamera$$1, _CameraComponent); + + return PerspectiveCamera$$1; + }(CameraComponent); + + defineProperty$3(PerspectiveCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, { + near: 1, + far: 1000, + fov: 75, + aspect: system.window.innerWidth / system.window.innerHeight + })); + + /** @module components/cameras */ + + /** + * @class Box + * @category components/meshes + * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to + * pass specific parameters to build this mesh as a geometry object. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Box, and adding to app + * new Box({ + * geometry: { + * width: 2, + * height: 2, + * depth: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [50, 60, 70] + * }).addTo(app); + */ + + var Box = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Box#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     width: 1,
+	   *     height: 1,
+	   *     depth: 1,
+	   *     widthSegments: 1,
+	   *     heightSegments: 1,
+	   *     depthSegments: 1
+	   *   }
+	   * }
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Box#instructions + * @static + * @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements'] + */ + function Box() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Box); + + return possibleConstructorReturn(this, getPrototypeOf$2(Box).call(this, params, Box.defaults, Box.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Box + */ + + + createClass(Box, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? BoxBufferGeometry : BoxGeometry)(params.geometry.width, params.geometry.height, params.geometry.depth, params.geometry.widthSegments, params.geometry.heightSegments, params.geometry.depthSegments); + return geometry; + } + }]); + + inherits(Box, _MeshComponent); + + return Box; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Box, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + width: 1, + height: 1, + depth: 1, + widthSegments: 1, + heightSegments: 1, + depthSegments: 1 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements'] + })); + + /** + * @class Circle + * @category components/meshes + * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to + * pass specific parameters to build this mesh as a geometry object. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Circle, and adding to app + * new Circle({ + * geometry: { + * radius: 4, + * segments: 16 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [50, 60, 70] + * }).addTo(app); + */ + + var Circle = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Circle#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 50,
+	   *     segments: 8,
+	   *     thetaStart: 0,
+	   *     thetaLength: Math.PI * 2
+	   *   }
+	   * }
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Circle#instructions + * @static + * @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength'] + */ + function Circle() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Circle); + + return possibleConstructorReturn(this, getPrototypeOf$2(Circle).call(this, params, Circle.defaults, Circle.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Circle + */ + + + createClass(Circle, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? CircleBufferGeometry : CircleGeometry)(params.geometry.radius, params.geometry.segments, params.geometry.thetaStart, params.geometry.thetaLength); + return geometry; + } + }]); + + inherits(Circle, _MeshComponent); + + return Circle; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Circle, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 50, + segments: 8, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'segments', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Cone + * @category components/meshes + * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

+ * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
+ * The surface area and the volume of a cylinder have been known since deep antiquity. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Cone, and adding to app + * new Cone({ + * geometry: { + * radiusTop: 2, + * radiusBottom: 4, + * height: 5 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * pos: [0, 100, 0] + * }).addTo(app); + */ + + var Cone = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Cone#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 20,
+	   *     height: 100,
+	   *     radiusSegments: 32,
+	   *     heightSegments: 1,
+	   *     openEnded: false,
+	   *     thetaStart: 0,
+	   *     thetaLength: Math.PI * 2
+	   *   }
+	   * }
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Cone#instructions + * @static + * @default
+	   * geometry: [
+	   *   'radius',
+	   *   'height',
+	   *   'radiusSegments',
+	   *   'heightSegments',
+	   *   'openEnded',
+	   *   'thetaStart',
+	   *   'thetaLength'
+	   * ]
+	   * 
+ */ + function Cone() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Cone); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Cone).call(this, params, Cone.defaults, Cone.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Cone.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Cone + */ + + + createClass(Cone, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? ConeBufferGeometry : ConeGeometry)(params.geometry.radius, params.geometry.height, params.geometry.radiusSegments, params.geometry.heightSegments, params.geometry.openEnded, params.geometry.thetaStart, params.geometry.thetaLength); + return geometry; + } + }]); + + inherits(Cone, _MeshComponent); + + return Cone; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Cone, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 20, + height: 100, + radiusSegments: 32, + heightSegments: 1, + openEnded: false, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'height', 'radiusSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Cylinder + * @category components/meshes + * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

+ * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
+ * The surface area and the volume of a cylinder have been known since deep antiquity. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Cylinder, and adding to app + * new Cylinder({ + * geometry: { + * radiusTop: 2, + * radiusBottom: 4, + * height: 5 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * pos: [0, 100, 0] + * }).addTo(app); + */ + + var Cylinder = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Cylinder#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radiusTop: 20,
+	   *     radiusBottom: 20,
+	   *     height: 100,
+	   *     radiusSegments: 32,
+	   *     heightSegments: 1,
+	   *     openEnded: false,
+	   *     thetaStart: 0,
+	   *     thetaLength: Math.PI * 2
+	   *   }
+	   * }
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Cylinder#instructions + * @static + * @default
+	   * geometry: [
+	   *   'radiusTop',
+	   *   'radiusBottom',
+	   *   'height',
+	   *   'radiusSegments',
+	   *   'heightSegments',
+	   *   'openEnded',
+	   *   'thetaStart',
+	   *   'thetaLength'
+	   * ]
+	   * 
+ */ + function Cylinder() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Cylinder); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Cylinder).call(this, params, Cylinder.defaults, Cylinder.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Cylinder.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Cylinder + */ + + + createClass(Cylinder, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? CylinderBufferGeometry : CylinderGeometry)(params.geometry.radiusTop, params.geometry.radiusBottom, params.geometry.height, params.geometry.radiusSegments, params.geometry.heightSegments, params.geometry.openEnded, params.geometry.thetaStart, params.geometry.thetaLength); + return geometry; + } + }]); + + inherits(Cylinder, _MeshComponent); + + return Cylinder; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Cylinder, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radiusTop: 0, + radiusBottom: 1, + height: 1, + radiusSegments: 32, + heightSegments: 1, + openEnded: false, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radiusTop', 'radiusBottom', 'height', 'radiusSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Dodecahedron + * @category components/meshes + * @description In geometry, a dodecahedron is any polyhedron with twelve flat faces.

+ * The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid.
+ * There are also three regular star dodecahedra, which are constructed as stellations of the convex form.
+ * All of these have icosahedral symmetry, order 120. + * Dodecahedron creates Dodecahedron object by it's radius and detail. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Dodecahedron, and adding to app + * new Dodecahedron({ + * geometry: { + * radius: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * y: 10 + * } + * }).addTo(app); + */ + + var Dodecahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Dodecahedron#defaults + * @static + * @default
+	   * geometry: {
+	   *   radius: 1,
+	   *   detail: 0
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Dodecahedron#instructions + * @static + * @default
+	   * geometry: ['radius', 'detail']
+	   * 
+ */ + function Dodecahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Dodecahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Dodecahedron).call(this, params, Dodecahedron.defaults, Dodecahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Dodecahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Dodecahedron + */ + + + createClass(Dodecahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? DodecahedronBufferGeometry : DodecahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Dodecahedron, _MeshComponent); + + return Dodecahedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Dodecahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'detail'] + })); + + /** + * @class Extrude + * @category components/meshes + * @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on THREE.Vector2.
+ * Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.

+ * You can also find some interesting examples made using three.js which is a core of whs.js, such as: + * - Webgl geometry extrude + * - Extrude shapes from geodata + * - Extrude splines + * + * Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with THREE.Shape to get extrude effect of shape defined by 2D vectors. + * This class is similar to THREE.ExtrudeGeometry, + * but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot). + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a shape, then an Extrude from it + * const shape = new THREE.Shape([ + * new THREE.Vector2(-4,-4), + * new THREE.Vector2(-2,0), + * new THREE.Vector2(-4,4), + * new THREE.Vector2(0,2), + * new THREE.Vector2(4,4), + * new THREE.Vector2(2,0), + * new THREE.Vector2(4,-4), + * new THREE.Vector2(0,-2) + * ]); + * + * const extrude = new Extrude({ + * geometry: { + * shapes: shape, + * options: { + * bevelEnabled: false, + * bevelSize: 0, + * amount: 2 + * } + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }); + * + * extrude.addTo(app); + */ + + var Extrude = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Extrude#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     shapes: [],
+	   *     options: {}
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Extrude#instructions + * @static + * @default
+	   * {
+	   *   geometry: ['shapes', 'options']
+	   * }
+	   * 
+ */ + function Extrude() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Extrude); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Extrude).call(this, params, Extrude.defaults, Extrude.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Extrude.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Extrude + */ + + + createClass(Extrude, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new ExtrudeGeometry(params.geometry.shapes, params.geometry.options); + return params.buffer ? new BufferGeometry().fromGeometry(geometry) : geometry; + } + }]); + + inherits(Extrude, _MeshComponent); + + return Extrude; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Extrude, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + shapes: [], + options: {} + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['shapes', 'options'] + })); + + /** + * @class Icosahedron + * @category components/meshes + * @description In geometry, an icosahedron is a polyhedron with 20 faces.
+ * There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.
+ * `Icosahedron` creates an Icosahedron object by its radius and detail. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Icosahedron, and adding to app + * new Icosahedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Icosahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Icosahedron#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 1,
+	   *     detail: 0
+	   *   }
+	   * }
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Icosahedron#instructions + * @static + * @default {geometry: ['radius', 'detail']} + */ + function Icosahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Icosahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Icosahedron).call(this, params, Icosahedron.defaults, Icosahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Icosahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Icosahedron + */ + + + createClass(Icosahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? IcosahedronBufferGeometry : IcosahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Icosahedron, _MeshComponent); + + return Icosahedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Icosahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'detail'] + })); + + /** + * @class Lathe + * @category components/meshes + * @description A `LatheGeometry` allows you to create shapes from a smooth curve. + * This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.

+ * In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis. + * The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees. + * The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry.

+ * The following example shows a geometry which can be generated using `Lathe` class. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Lath, and adding to app + * const points = []; + * + * for (let i = 0; i < 10; i++) { + * points.push( + * new THREE.Vector2( + * (Math.sin(i * 0.7) * 15 + 50) / 10, + * (i - 5) * 0.2 + * ) + * ); + * } + * + * const lathe = new Lathe({ + * geometry: { + * points: points + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 50, 10] + * }).addTo(app); + */ + + var Lathe = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Lathe#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     points: []
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Lathe#instructions + * @static + * @default
{
+	   *   geometry: ['points']
+	   * }
+	   * 
+ */ + function Lathe() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Lathe); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Lathe).call(this, params, Lathe.defaults, Lathe.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Lathe.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Lathe + */ + + + createClass(Lathe, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? LatheBufferGeometry : LatheGeometry)(params.geometry.points); + } + }]); + + inherits(Lathe, _MeshComponent); + + return Lathe; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Lathe, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + points: [] + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['points'] + })); + + /** + * @class Line + * @category components/meshes + * @description Line component is generated from a curve/line and amount of vectors that should be used (points). + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Line, and adding to app + * new Line({ + * geometry: { + * curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0)) + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Line$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Line#defaults + * @static + * @default
+	   * {
+	   *   curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
+	   *   points: 50
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Line#instructions + * @static + * @default
{
+	   *   geometry: ['curve', 'points']
+	   * }
+	   * 
+ */ + function Line$$1(params) { + classCallCheck(this, Line$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(Line$$1).call(this, params, Line$$1.defaults, Line$$1.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Line + */ + + + createClass(Line$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Line(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = params.buffer ? new BufferGeometry() : new Geometry(); + + if (params.buffer) { + var pp = params.curve.getPoints(params.points); + var verts = new Float32Array(pp.length * 3); + + for (var i = 0, max = pp.length; i < max; i++) { + var i3 = i * 3; + verts[i3] = pp[i].x; + verts[i3 + 1] = pp[i].y; + verts[i3 + 2] = pp[i].z; + } + + geometry.addAttribute('position', new BufferAttribute(verts, 3)); + } else geometry.vertices = params.curve.getPoints(params.points); + + return geometry; + } + }]); + + inherits(Line$$1, _MeshComponent); + + return Line$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Line$1, "defaults", objectSpread({}, MeshComponent.defaults, { + curve: null, + points: 50 + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['curve', 'points'] + })); + + /** + * @class Importer + * @category components/meshes + * @description Importer is a loader for meshes and any other data to your scene + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Importer, and adding to app + * new Importer({ + * loader: new THREE.OBJLoader(), + * + * parser(geometry, material) { // data from loader + * return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case) + * }, + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Importer = + /*#__PURE__*/ + function (_MeshComponent) { + createClass(Importer, null, [{ + key: "filter", + + /** + * Default values for parameters + * @member {Object} module:components/meshes.Importer#defaults + * @static + * @default
+	     * {
+	     *   url: '',
+	     *   loader: new JSONLoader(),
+	     *
+	     *   onLoad() {},
+	     *   onProgress() {},
+	     *   onError() {},
+	     *
+	     *   texturePath: null,
+	     *   useCustomMaterial: false,
+	     *
+	     *   parser(geometry, materials) {
+	     *     return new Mesh(geometry, materials);
+	     *   }
+	     * }
+ */ + + /** + * @method filter + * @description Default values for filter + * @static + * @param {THREE.Mesh} object Instance for iterating through it's children. + * @param {Function} filter Function with child as argument, should return a boolean whether include the child or not. + * @return {THREE.Mesh} object with children + * @memberof module:components/meshes.Importer + * @example Removing unnecessary lights from children + * new Importer({ + * loader: new THREE.OBJLoader(), + * + * parse(group) { // data from loader + * return Importer.filter(group, child => !child.isLight); // remove lights + * }, + * + * position: [0, 100, 0] + * }).addTo(app); + */ + value: function filter(object, _filter) { + var processFilter = function processFilter(object) { + object.children.forEach(function (el, index) { + if (el.children) processFilter(el); + if (!_filter(el)) object.children.splice(index, 1); + }); + return object; + }; + + return processFilter(object); + } + }]); + + function Importer() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Importer); + + return possibleConstructorReturn(this, getPrototypeOf$2(Importer).call(this, params, Importer.defaults, Importer.instructions, false)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Importer + */ + + + createClass(Importer, [{ + key: "build", + value: function build() { + var _this = this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new Promise(function (resolve) { + if (params.texturePath) params.loader.setTexturePath(params.texturePath); + params.loader.load(params.url, function () { + for (var _len = arguments.length, data = new Array(_len), _key = 0; _key < _len; _key++) { + data[_key] = arguments[_key]; + } + + // geometry, materials + params.onLoad.apply(params, data); + var object = params.parser.apply(_this, data); + if (params.material) object.material = _this.applyBridge({ + material: params.material + }).material; + resolve(object); + }, params.onProgress, params.onError); + }); + } + }]); + + inherits(Importer, _MeshComponent); + + return Importer; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Importer, "defaults", objectSpread({}, MeshComponent.defaults, { + url: '', + loader: new JSONLoader(), + onLoad: function onLoad() {}, + onProgress: function onProgress() {}, + // TODO add onComplete? + onError: function onError() {}, + texturePath: null, + useCustomMaterial: false, + parser: function parser(geometry, material) { + var _this$applyBridge = this.applyBridge({ + geometry: geometry, + material: material + }), + geom = _this$applyBridge.geometry, + mat = _this$applyBridge.material; + + return this.applyBridge({ + mesh: geom.bones ? new SkinnedMesh(geom, mat) : new Mesh(geom, mat) + }).mesh; + } + })), "instructions", objectSpread({}, MeshComponent.instructions)); + + /** + * @class Octahedron + * @category components/meshes + * @description In geometry, an octahedron is a polyhedron with eight faces. + * A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex. + *

+ * `Octahedron` creates an Octahedron object by its `radius` and `detail`. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating an Octahedron, and adding to app + * new Octahedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Octahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Octahedron#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 1,
+	   *     detail: 0
+	   *   }
+	   * }
+	   * 
+ */ + function Octahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Octahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Octahedron).call(this, params, Octahedron.defaults, Octahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Octahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Octahedron + */ + + + createClass(Octahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? OctahedronBufferGeometry : OctahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Octahedron, _MeshComponent); + + return Octahedron; + }(MeshComponent); + + defineProperty$3(Octahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })); + + /** + * @class Parametric + * @category components/meshes + * @description `Parametric` generates a geometry representing a Parametric surface + *

+ * It is usually used to develop different kinds of highfields or visualize a math function. + *
+ * - Parametric surface + * - "Graphulus" + *

+ * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`. + * We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`. + * const createParametric = (u, v) => { + * return new THREE.Vector3(u * 30, Math.random() * 5, v * 30); + * } + * + * new Parametric({ + * geometry: { + * func: createParametric + * }, + * + * material: new THREE.MeshLambertMaterial({ + * color: 0xffffff, + * side: THREE.DoubleSide + * }), + * + * position: [0, 100, -100] + * }).addTo(app); + */ + + var Parametric = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Parametric#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     func: (u, v) => new Vector3(u, v, 0),
+	   *     slices: 10,
+	   *     tacks: 10
+	   *   }
+	   * }
+	   * 
+ */ + function Parametric() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Parametric); + + return possibleConstructorReturn(this, getPrototypeOf$2(Parametric).call(this, params, Parametric.defaults, Parametric.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Parametric + */ + + + createClass(Parametric, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? ParametricBufferGeometry : ParametricGeometry)(params.geometry.func, params.geometry.slices, params.geometry.stacks); + } + }]); + + inherits(Parametric, _MeshComponent); + + return Parametric; + }(MeshComponent); + + defineProperty$3(Parametric, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + func: function func(u, v) { + return new Vector3(u, v, 0); + }, + slices: 10, + stacks: 10 + } + })); + + /** + * @class Plane + * @category components/meshes + * @description `Plane` is used for creating planes given some `width` and `height`. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Plane, and adding to app + * new Plane({ + * geometry: { + * width: 20, + * height: 30 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Plane$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Plane#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     width: 10,
+	   *     height: 10,
+	   *     wSegments: 1,
+	   *     hSegments: 1
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Plane#instructions + * @static + * @default
+	   * {
+	   *   geometry: ['width', 'height', 'wSegments', 'hSegments']
+	   * }
+	   * 
+ */ + function Plane$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Plane$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Plane$$1).call(this, params, Plane$$1.defaults, Plane$$1.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Plane$$1.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Plane + */ + + + createClass(Plane$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? PlaneBufferGeometry : PlaneGeometry)(params.geometry.width, params.geometry.height, params.geometry.wSegments, params.geometry.hSegments); + return geometry; + } + }]); + + inherits(Plane$$1, _MeshComponent); + + return Plane$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Plane$1, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + width: 10, + height: 10, + wSegments: 1, + hSegments: 1 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['width', 'height', 'wSegments', 'hSegments'] + })); + + var verticesOfCube = [-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1], + indicesOfFaces = [2, 1, 0, 0, 3, 2, 0, 4, 7, 7, 3, 0, 0, 1, 5, 5, 4, 0, 1, 2, 6, 6, 5, 1, 2, 3, 7, 7, 6, 2, 4, 5, 6, 6, 7, 4]; + /** + * @class Polyhedron + * @category components/meshes + * @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices. + *

+ * `Polyhedron` creates a Polyhedron by its `radius` and `detail`. + *

+ * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating an Polyhedron, and adding to app + * new Polyhedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Polyhedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Polyhedron#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     verticesOfCube: [
+	   *       -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,
+	   *       -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1
+	   *     ],
+	   *
+	   *     indicesOfFaces: [
+	   *       2, 1, 0, 0, 3, 2,
+	   *       0, 4, 7, 7, 3, 0,
+	   *       0, 1, 5, 5, 4, 0,
+	   *       1, 2, 6, 6, 5, 1,
+	   *       2, 3, 7, 7, 6, 2,
+	   *       4, 5, 6, 6, 7, 4
+	   *     ],
+	   *
+	   *     radius: 6,
+	   *     detail: 2
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Polyhedron#instructions + * @static + * @default
+	   * {
+	   *   geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
+	   * }
+	   * 
+ */ + function Polyhedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Polyhedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Polyhedron).call(this, params, Polyhedron.defaults, Polyhedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Polyhedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Polyhedron + */ + + + createClass(Polyhedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? PolyhedronBufferGeometry : PolyhedronGeometry)(params.geometry.verticesOfCube, params.geometry.indicesOfFaces, params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Polyhedron, _MeshComponent); + + return Polyhedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(Polyhedron, "verticesOfCube", verticesOfCube), "indicesOfFaces", indicesOfFaces), "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + verticesOfCube: verticesOfCube, + indicesOfFaces: indicesOfFaces, + radius: 6, + detail: 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail'] + })); + + /** + * @class Ring + * @category components/meshes + * @description Ring class creates a circle or just 2D Torus. Does not support physics. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Ring, and adding to app + * new Ring({ + * geometry: { + * innerRadius: 5, + * outerRadius: 2 + * }, + * + * material: new THREE.MeshLambertMaterial({ + * color: 0xffffff, + * side THREE.DoubleSide + * }), + * + * position: [0, 8, 0], + * + * rotation: { + * x: Math.PI/4 + * } + * }).addTo(app); + */ + + var Ring = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Ring#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     innerRadius: 0,
+	   *     outerRadius: 50,
+	   *     thetaSegments: 8,
+	   *     phiSegments: 8,
+	   *     thetaStart: 0,
+	   *     thetaLength: Math.PI * 2
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Ring#instructions + * @static + * @default
+	   * {
+	   *   geometry: [
+	   *     'innerRadius',
+	   *     'outerRadius',
+	   *     'thetaSegments',
+	   *     'phiSegments',
+	   *     'thetaStart',
+	   *     'thetaLength'
+	   *   ]
+	   * }
+	   * 
+ */ + function Ring() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Ring); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Ring).call(this, params, Ring.defaults, Ring.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Ring.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Ring + */ + + + createClass(Ring, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? RingBufferGeometry : RingGeometry)(params.geometry.innerRadius, params.geometry.outerRadius, params.geometry.thetaSegments, params.geometry.phiSegments, params.geometry.thetaStart, params.geometry.thetaLength); + } + }]); + + inherits(Ring, _MeshComponent); + + return Ring; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Ring, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + innerRadius: 0, + outerRadius: 50, + thetaSegments: 8, + phiSegments: 8, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.defaults, { + geometry: ['innerRadius', 'outerRadius', 'thetaSegments', 'phiSegments', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Shape + * @category components/meshes + * @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.
+ * Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero. + *

+ * `Shape` consists of shapes that are in its shapes parameter. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a plane looking Shape from a THREE.Shape, and adding it to app + * const rectWidth = 10, + * rectLength = 5; + * + * const rectShape = new THREE.Shape(); + * rectShape.moveTo(0,0); + * rectShape.lineTo(0, rectWidth); + * rectShape.lineTo(rectLength, rectWidth); + * rectShape.lineTo(rectLength, 0); + * rectShape.lineTo(0, 0); + * + * const plane = new Shape({ + * geometry: { + * shape: rectShape + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Shape$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Shape#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     shapes: []
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Shape#instructions + * @static + * @default
+	   * {
+	   *   geometry: ['shapes']
+	   * }
+	   * 
+ */ + function Shape$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Shape$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Shape$$1).call(this, params, Shape$$1.defaults, Shape$$1.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Shape$$1.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Shape + */ + + + createClass(Shape$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? ShapeBufferGeometry : ShapeGeometry)(params.geometry.shapes); + } + }]); + + inherits(Shape$$1, _MeshComponent); + + return Shape$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Shape$1, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + shapes: [] + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['shapes'] + })); + + /** + * @class Sphere + * @category components/meshes + * @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality. + *

+ * It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot). + *

+ * Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations. + * This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution). + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Sphere, and adding it to app + * new Sphere({ + * geometry: { + * radius: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * y: 100 + * } + * }).addTo(app); + */ + + var Sphere$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Sphere#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 1,
+	   *     widthSegments: 8,
+	   *     heightSegments: 6
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Sphere#instructions + * @static + * @default
+	   * {
+	   *   geometry: ['radius', 'widthSegments', 'heightSegments']
+	   * }
+	   * 
+ */ + function Sphere$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Sphere$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(Sphere$$1).call(this, params, Sphere$$1.defaults, Sphere$$1.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Sphere + */ + + + createClass(Sphere$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? SphereBufferGeometry : SphereGeometry)(params.geometry.radius, params.geometry.widthSegments, params.geometry.heightSegments); + return geometry; + } + }]); + + inherits(Sphere$$1, _MeshComponent); + + return Sphere$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Sphere$1, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + widthSegments: 8, + heightSegments: 6 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'widthSegments', 'heightSegments'] + })); + + /** + * @class Tetrahedron + * @category components/meshes + * @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners. + * The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces. + *

+ * `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail` + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Tetrahedron, and adding it to app + * new Tetrahedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * x: 0, + * y: 100, + * z: 0 + * } + * }).addTo(app); + */ + + var Tetrahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Tetrahedron#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 1,
+	   *     detail: 0
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Tetrahedron#instructions + * @static + * @default
+	   * {
+	   *   geometry: ['radius', 'detail']
+	   * }
+	   * 
+ */ + function Tetrahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Tetrahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Tetrahedron).call(this, params, Tetrahedron.defaults, Tetrahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Tetrahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Tetrahedron + */ + + + createClass(Tetrahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? TetrahedronBufferGeometry : TetrahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Tetrahedron, _MeshComponent); + + return Tetrahedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Tetrahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'detail'] + })); + + /** + * @class Text + * @category components/meshes + * @description Text class is made for creating 3D text objects. + * @classDesc + * + *

+ * Physics text object can be convex or concave. By default it's convex but you can also switch to concave. + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Text, and adding it to app + * new Text({ + * text: 'Some text', + * parameters: { + * font: 'path/to/font.typeface.js', + * size: 20, + * height: 5, + * curveSegments: 6 + * } + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * x: -40, + * y: 20, + * z: 0 + * } + * }).addTo(app); + */ + + var Text = + /*#__PURE__*/ + function (_MeshComponent) { + createClass(Text, null, [{ + key: "load", + + /** + * Default values for parameters + * @member {Object} module:components/meshes.Text#defaults + * @static + * @default
+	     * {
+	     *   text: 'Hello World!',
+	     *   font: null,
+	     *
+	     *   geometry: {
+	     *     size: 12,
+	     *     height: 50,
+	     *     curveSegments: 12,
+	     *     font: new Font(),
+	     *     bevelEnabled: false,
+	     *     bevelThickness: 10,
+	     *     bevelSize: 8
+	     *   }
+	     * }
+	     * 
+ */ + + /** + * Default FontLoader + * @member {Object} module:components/meshes.Text#loader + * @static + * @default new FontLoader() + */ + + /** + * @method load + * @static + * @description load() preloads a Font object and returns a Promise with it. + * @param {String} path Path to the font + * @return {Promise} A promise resolved with a font + * @memberof module:components/meshes.Text + */ + value: function load(path) { + var loader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Text.loader; + return new Promise(function (resolve) { + loader.load(path, resolve); + }); + } + }]); + + function Text() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Text); + + return possibleConstructorReturn(this, getPrototypeOf$2(Text).call(this, params, Text.defaults, Text.instructions)); + } + /** + * @method build + * @description Build is called as part of the lifecycle to create a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Text + */ + + + createClass(Text, [{ + key: "build", + value: function build() { + var _this = this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + var promise = new Promise(function (resolve) { + (params.font instanceof Promise ? params.font : Promise.resolve(params.font)).then(function (font) { + var _this$applyBridge = _this.applyBridge({ + geometry: new TextGeometry(params.text, Object.assign(params.geometry, { + font: font + })), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + resolve(_this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh); + }); + }); + + get$3(getPrototypeOf$2(Text.prototype), "wait", this).call(this, promise); + + return promise; + } + }]); + + inherits(Text, _MeshComponent); + + return Text; + }(MeshComponent); + + defineProperty$3(defineProperty$3(defineProperty$3(Text, "defaults", objectSpread({}, MeshComponent.defaults, { + text: 'Hello World!', + font: null, + geometry: { + size: 12, + height: 50, + curveSegments: 12, + font: new Font(), + bevelEnabled: false, + bevelThickness: 10, + bevelSize: 8 + } + })), "instructions", objectSpread({}, MeshComponent.instructions)), "loader", new FontLoader()); + + /** + * @class Torus + * @category components/meshes + * @description Torus class makes a torus figure. A donut is a torus. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Torus, and adding it to app + * new Torus({ + * geometry: { + * radius: 5, + * tube: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * y: 35 + * } + * }).addTo(app); + */ + + var Torus = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Torus#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 100,
+	   *     tube: 40,
+	   *     radialSegments: 8,
+	   *     tubularSegments: 6,
+	   *     arc: Math.PI * 2
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Torus#instructions + * @static + * @default
+	   * {
+	   *   geometry: [
+	   *     'radius',
+	   *     'tube',
+	   *     'radialSegments',
+	   *     'tubularSegments',
+	   *     'arc'
+	   *   ]
+	   * }
+	   * 
+ */ + function Torus() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Torus); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Torus).call(this, params, Torus.defaults, Torus.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Torus.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Torus + */ + + + createClass(Torus, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new TorusGeometry(params.geometry.radius, params.geometry.tube, params.geometry.radialSegments, params.geometry.tubularSegments, params.geometry.arc); + } + }]); + + inherits(Torus, _MeshComponent); + + return Torus; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Torus, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 100, + tube: 40, + radialSegments: 8, + tubularSegments: 6, + arc: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'tube', 'radialSegments', 'tubularSegments', 'arc'] + })); + + /** + * @class Torusknot + * @category components/meshes + * @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Torusknot, and adding it to app + * new Torusknot({ + * geometry: { + * radius:5, + * tube: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * pos: { + * y: 100 + * } + * }).addTo(app); + */ + + var Torusknot = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Torusknot#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     radius: 100,
+	   *     tube: 40,
+	   *     radialSegments: 64,
+	   *     tubularSegments: 8,
+	   *     p: 2,
+	   *     q: 3
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Torusknot#instructions + * @static + * @default
+	   * {
+	   *   geometry: [
+	   *     'radius',
+	   *     'tube',
+	   *     'radialSegments',
+	   *     'tubularSegments',
+	   *     'p',
+	   *     'q'
+	   *   ]
+	   * }
+	   * 
+ */ + function Torusknot() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Torusknot); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Torusknot).call(this, params, Torusknot.defaults, Torusknot.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Torusknot.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Torusknot + */ + + + createClass(Torusknot, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var GConstruct = params.buffer ? TorusKnotBufferGeometry : TorusKnotGeometry; + return new GConstruct(params.geometry.radius, params.geometry.tube, params.geometry.radialSegments, params.geometry.tubularSegments, params.geometry.p, params.geometry.q); + } + }]); + + inherits(Torusknot, _MeshComponent); + + return Torusknot; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Torusknot, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 100, + tube: 40, + radialSegments: 64, + tubularSegments: 8, + p: 2, + q: 3 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'tube', 'radialSegments', 'tubularSegments', 'p', 'q'] + })); + + /** + * @class Tube + * @category components/meshes + * @description Tube class makes a tube that extrudes along a 3d curve. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Tube from a three.js Curve, and adding it to app + * const CustomSinCurve = THREE.Curve.create( + * function (scale) { // custom curve constructor + * this.scale = (scale === undefined) ? 1 : scale; + * }, + * + * function (t) { // getPoint: t is between 0-1 + * const tx = t * 3 - 1.5, + * ty = Math.sin( 2 * Math.PI * t ), + * tz = 0; + * + * return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); + * } + * ); + * + * const path = new CustomSinCurve(10); + * + * new Tube({ + * geometry: { + * path: path + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Tube = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Tube#defaults + * @static + * @default
+	   * {
+	   *   geometry: {
+	   *     path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
+	   *     segments: 20,
+	   *     radius: 2,
+	   *     radiusSegments: 8,
+	   *     closed: false
+	   *   }
+	   * }
+	   * 
+ */ + + /** + * Instructions + * @member {Object} module:components/meshes.Tube#instructions + * @static + * @default
+	   * {
+	   *   geometry: [
+	   *     'path',
+	   *     'segments',
+	   *     'radius',
+	   *     'radiusSegments',
+	   *     'closed'
+	   *   ]
+	   * }
+	   * 
+ */ + function Tube() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Tube); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Tube).call(this, params, Tube.defaults, Tube.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Tube.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Tube + */ + + + createClass(Tube, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? TubeBufferGeometry : TubeGeometry)(params.geometry.path, params.geometry.segments, params.geometry.radius, params.geometry.radiusSegments, params.geometry.closed); + return geometry; + } + }]); + + inherits(Tube, _MeshComponent); + + return Tube; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Tube, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + path: new LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)), + segments: 20, + radius: 2, + radiusSegments: 8, + closed: false + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['path', 'segments', 'radius', 'radiusSegments', 'closed'] + })); + + /** + * @class Group + * @category components/meshes + * @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).
+ * In Three.js you make it using `THREE.Object3D` and it's children.

+ * In whs.js we have `Group` + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Approach 2 - Adding objects to an empty group + * const sphere = new Sphere(); + * const box = new Box(); + * const group = new Group(); + * + * sphere.addTo(group); + * box.addTo(group); + * @example Approach 2 - Making a group from objects + * const sphere = new Sphere(); + * const box = new Box(); + * const group = new Group(box, sphere); + * // OR: const group = new Group([box, sphere]); + */ + + var Group$1 = + /*#__PURE__*/ + function (_MeshComponent) { + function Group$$1() { + var _this; + + classCallCheck(this, Group$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Group$$1).call(this, {})); + + for (var i = 0; i < arguments.length; i++) { + var obj = i < 0 || arguments.length <= i ? undefined : arguments[i]; + if (obj instanceof Component) obj.addTo(assertThisInitialized(assertThisInitialized(_this)));else if (obj instanceof Object3D) _this.native.add(obj); + } + + return _this; + } + + createClass(Group$$1, [{ + key: "build", + value: function build() { + return new Object3D(); + } + }]); + + inherits(Group$$1, _MeshComponent); + + return Group$$1; + }(MeshComponent); + + /** @module components/meshes */ + + /** + * @class ElementModule + * @category modules/app + * @param {Object} [container=document.body] container is the DOM object to which application's canvas will be added to. + * @memberof module:modules/app + * @example Creating an element module, passing it to the App + * new App([ + * new ElementModule(document.getElementById('app')) + * ]); + */ + var ElementModule = + /*#__PURE__*/ + function () { + function ElementModule() { + var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.body; + + classCallCheck(this, ElementModule); + + if (container.container) { + console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.'); + this.container = container.container; + } else this.container = container; + + this.createElement(); + } + /** + * @method createElement + * @instance + * @description Creates a canvas element. + * @memberof module:modules/app.ElementModule + */ + + + createClass(ElementModule, [{ + key: "createElement", + value: function createElement() { + this.element = window.document.createElement('div'); + this.element.className = 'whs-app'; + this.element.style.width = 'inherit'; + this.element.style.height = 'inherit'; + this.element.style.position = 'relative'; + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.set('element', this.element); + + _manager.set('container', this.container); + } + }, { + key: "integrate", + value: function integrate(self) { + self.container.appendChild(self.element); + } + }]); + + return ElementModule; + }(); + + /** + * @class RenderingModule + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule({ + * bgColor: 0x162129, + * + * renderer: { + * antialias: true + * } + * }, {shadow: true}) + * ]); + */ + + var RenderingModule = + /*#__PURE__*/ + function () { + /** + * additional + * @description collection of additional scripts + * @static + * @member {Object} module:core.App#additional + * @public + */ + + /** + * enabled + * @static + * @member {Boolean} module:core.App#enabled + * @public + */ + function RenderingModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var additional = arguments.length > 1 ? arguments[1] : undefined; + + classCallCheck(this, RenderingModule); + + defineProperty$3(this, "enabled", true); + + this.params = Object.assign({ + width: window.innerWidth, + height: window.innerHeight, + resolution: new Vector2(1, 1), + pixelRatio: window.devicePixelRatio, + bgColor: 0x000000, + bgOpacity: 1, + renderer: {}, + fix: function fix() {} + }, params); + var _this$params = this.params, + bgColor = _this$params.bgColor, + bgOpacity = _this$params.bgOpacity, + _renderer = _this$params.renderer, + pixelRatio = _this$params.pixelRatio, + width = _this$params.width, + height = _this$params.height, + resolution = _this$params.resolution, + fix = _this$params.fix; + this.renderer = new WebGLRenderer(_renderer); + this.effects = []; + this.renderer.setClearColor(bgColor, bgOpacity); + if (pixelRatio) this.renderer.setPixelRatio(pixelRatio); + this.setSize(Number(width * resolution.x).toFixed(), Number(height * resolution.y).toFixed()); + + for (var key in additional) { + if (additional[key]) this.applyAdditional(key); + } + + fix(this.renderer); + } + /** + * @method applyAdditional + * @description Apply additional script from RenderingModule.additional + * @param {Stirng} name Script name + * @return {this} + * @memberof module:modules/app.RenderingModule + */ + + + createClass(RenderingModule, [{ + key: "applyAdditional", + value: function applyAdditional(name) { + RenderingModule.additional[name].apply(this, [this.renderer]); + } + /** + * @method integrateRenderer + * @description Integrate renderer + * @param {NodeElement} element DOM object + * @param {THREE.Scene} scene used scene + * @param {THREE.Camera} camera used camera + * @return {Loop} renderLoop + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "integrateRenderer", + value: function integrateRenderer(element, scene, camera) { + var _this = this; + + this.scene = scene; + this.camera = camera; + this.attachToCanvas(element); + return new Loop(function () { + return _this.renderer.render(_this.scene, _this.camera); + }); + } + /** + * @method effect + * @description Add three.js effect + * @param {Object} effect three.js effect + * @param {function} effectLoop update function for effect + * @return {this} + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "effect", + value: function effect(_effect) { + var _this2 = this; + + var effectLoop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { + _effect.render(_this2.scene, _this2.camera); + }; + this.renderLoop.stop(); + var size = this.renderer.getSize(); + + _effect.setSize(size.width, size.height); + + var loop = new Loop(effectLoop); + this.effects.push(loop); + if (this.enabled) loop.start(this.app); + return this; + } + /** + * @method setSize + * @description Update render target width and height. + * @param {Number} width + * @param {Number} height + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + if (this.renderer) this.renderer.setSize(width, height); + } + /** + * @method attachToCanvas + * @description Attach renderer.domElement to element + * @param {NodeElement} element DOM object + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "attachToCanvas", + value: function attachToCanvas(element) { + var canvas = this.renderer.domElement; // attach to new parent world dom + + element.appendChild(canvas); + canvas.style.width = '100%'; + canvas.style.height = '100%'; + } + /** + * @method stop + * @description Stops renderLoop and effect loops + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "stop", + value: function stop() { + this.enabled = false; + this.renderLoop.stop(); + this.effects.forEach(function (loop) { + return loop.stop(); + }); + } + /** + * @method play + * @description Resumes renderLoop and effect loops + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "play", + value: function play() { + this.enabled = true; + this.renderLoop.start(); + this.effects.forEach(function (loop) { + return loop.start(); + }); + } + }, { + key: "manager", + value: function manager(_manager) { + var _this3 = this; + + _manager.define('rendering'); + + _manager.set('renderer', this.renderer); + + this.app = _manager.handler; + this.renderLoop = this.integrateRenderer(_manager.get('element'), _manager.get('scene'), _manager.get('camera').native); + + _manager.update({ + element: function element(_element) { + _this3.attachToCanvas(_element); + }, + scene: function scene(_scene) { + _this3.scene = _scene; + }, + camera: function camera(_camera) { + _this3.camera = _camera.native; + } + }); + } + }, { + key: "integrate", + value: function integrate(self) { + var _this4 = this; + + self.renderLoop.start(this); + self.effects.forEach(function (loop) { + return loop.start(_this4); + }); + } + /** + * @method dispose + * @description Dispose rendering context + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "dispose", + value: function dispose() { + this.stop(); + this.renderer.forceContextLoss(); + } + }]); + + return RenderingModule; + }(); + + defineProperty$3(RenderingModule, "additional", { + shadow: function shadow(renderer) { + renderer.shadowMap.enabled = true; + } + }); + + var SYMBOL_CHILDREN_FOR_SCENE = Symbol('SYMBOL_CHILDREN_FOR_SCENE'); + /** + * @class SceneModule + * @category modules/app + * @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one. + * @memberof module:modules/app + */ + + var SceneModule = + /*#__PURE__*/ + function () { + function SceneModule() { + var willSceneBeReplaced = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + classCallCheck(this, SceneModule); + + this.scene = willSceneBeReplaced ? null : new Scene(); + } + + createClass(SceneModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.set('scene', this.scene); + } + }, { + key: "integrate", + value: function integrate(self) { + Object.assign(this, { + add: function () { + var _add = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee(object) { + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!object.parent) { + _context.next = 3; + break; + } + + _context.next = 3; + return object.parent.remove(object); + + case 3: + _context.next = 5; + return object.wait(); + + case 5: + if (object.native) { + _context.next = 7; + break; + } + + throw new CompositionError('SceneModule', 'there is no object.native', this); + + case 7: + object.parent = this; + _context.next = 10; + return this.applyBridge({ + onAdd: object + }).onAdd; + + case 10: + self.scene.add(object.native); + this.children.push(object); + return _context.abrupt("return", object); + + case 13: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + return function add(_x) { + return _add.apply(this, arguments); + }; + }(), + remove: function () { + var _remove = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee2(object) { + return regenerator.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(object.parent !== this)) { + _context2.next = 2; + break; + } + + return _context2.abrupt("return"); + + case 2: + _context2.next = 4; + return object.wait(); + + case 4: + this.applyBridge({ + onRemove: object + }); + object.parent = null; + self.scene.remove(object.native); + this.children.splice(this.children.indexOf(object), 1); + + case 8: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + return function remove(_x2) { + return _remove.apply(this, arguments); + }; + }(), + _setScene: function _setScene(scene) { + this.children = scene[SYMBOL_CHILDREN_FOR_SCENE] = scene[SYMBOL_CHILDREN_FOR_SCENE] || []; + self.scene = scene; + }, + setScene: function setScene(scene) { + this._setScene(scene); + + this.manager.set('scene', scene); + }, + getScene: function getScene() { + return self.scene; + } + }); + if (self.scene) this._setScene(self.scene); + } + }]); + + return SceneModule; + }(); + + // import {addResizeListener} from 'detect-element-resize'; + + /** + * @class ResizeModule + * @category modules/app + * @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes + * @memberof module:modules/app + */ + var ResizeModule = + /*#__PURE__*/ + function () { + function ResizeModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ResizeModule); + + this.params = Object.assign({ + auto: true + }, params); + this.callbacks = [this.setSize.bind(this)]; + } + /** + * @function setSize + * @instance + * @description This function sets the provided width & height to the renderer object. + * @param {Number} [width=1] - The promise that should be added to a queue. + * @param {Number} [height=1] - that is resolved when all promises completed. + * @memberof module:modules/app.ResizeModule + */ + + + createClass(ResizeModule, [{ + key: "setSize", + value: function setSize() { + var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; + var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + this.camera.native.aspect = width / height; + this.camera.native.updateProjectionMatrix(); + if (this.rendering) this.rendering.setSize(width, height); + } + /** + * @method trigger + * @instance + * @description Triggers resize when called. width & height are determined automatically + * This invokes each callbacks with the new width and height as params + * @memberof module:modules/app.ResizeModule + */ + + }, { + key: "trigger", + value: function trigger() { + var _this$container = this.container, + offsetWidth = _this$container.offsetWidth, + offsetHeight = _this$container.offsetHeight, + resolution = this.resolution; + var width = Number(offsetWidth * resolution.x).toFixed(); + var height = Number(offsetHeight * resolution.y).toFixed(); + this.callbacks.forEach(function (cb) { + cb(width, height); + }); + } + /** + * @method addAutoresize + * @instance + * @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize + * @memberof module:modules/app.ResizeModule + */ + + }, { + key: "addAutoresize", + value: function addAutoresize() { + this.container = this.getContainer(); + this.resolution = this.getResolution(); + if (this.params.auto) window.addEventListener('resize', this.trigger.bind(this)); + } + /** + * @method addCallback + * @instance + * @description Adds a call back function to the existing callbacks list. + * @param {Function} func - The callback function to add + * @memberof module:modules/app.ResizeModule + */ + + }, { + key: "addCallback", + value: function addCallback(func) { + this.callbacks.push(func); + } + }, { + key: "manager", + value: function manager(_manager) { + var _this = this; + + _manager.define('resize'); + + this.rendering = _manager.get('renderer'); + this.camera = _manager.get('camera'); + + this.getResolution = function () { + return _manager.use('rendering').params.resolution; + }; + + this.getContainer = function () { + return _manager.get('container'); + }; + + _manager.update({ + container: function container(_container) { + _this.container = _container; + } + }); + + this.addAutoresize(); + } + }]); + + return ResizeModule; + }(); + + var fragment = "uniform sampler2D tPreviousLum;\r\nuniform sampler2D tCurrentLum;\r\nuniform float minLuminance;\r\nuniform float delta;\r\nuniform float tau;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\r\n\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\r\n\r\n\tpreviousLum = max(minLuminance, previousLum);\r\n\tcurrentLum = max(minLuminance, currentLum);\r\n\r\n\t// Adapt the luminance using Pattanaik's technique.\r\n\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\r\n\r\n\tgl_FragColor.r = adaptedLum;\r\n\r\n}\r\n"; + var vertex = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An adaptive luminosity shader material. + */ + + var AdaptiveLuminosityMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new adaptive luminosity material. + */ + function AdaptiveLuminosityMaterial() { + classCallCheck(this, AdaptiveLuminosityMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(AdaptiveLuminosityMaterial).call(this, { + type: "AdaptiveLuminosityMaterial", + defines: { + MIP_LEVEL_1X1: "0.0" + }, + uniforms: { + tPreviousLum: new Uniform(null), + tCurrentLum: new Uniform(null), + minLuminance: new Uniform(0.01), + delta: new Uniform(0.0), + tau: new Uniform(1.0) + }, + fragmentShader: fragment, + vertexShader: vertex, + depthWrite: false, + depthTest: false + })); + } + + inherits(AdaptiveLuminosityMaterial, _ShaderMaterial); + + return AdaptiveLuminosityMaterial; + }(ShaderMaterial); + + var fragment$1 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform float focus;\r\nuniform float dof;\r\nuniform float aspect;\r\nuniform float aperture;\r\nuniform float maxBlur;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tuniform float cameraNear;\r\n\tuniform float cameraFar;\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(1.0, aspect);\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = texture2D(tDepth, vUv).x;\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = readDepth(tDepth, vUv);\r\n\r\n\t#endif\r\n\r\n\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\r\n\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\r\n\r\n\t// Calculate a DoF mask.\r\n\tfloat low = step(depth, focusNear);\r\n\tfloat high = step(focusFar, depth);\r\n\r\n\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\r\n\r\n\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\r\n\r\n\tvec2 dofblur9 = dofBlur * 0.9;\r\n\tvec2 dofblur7 = dofBlur * 0.7;\r\n\tvec2 dofblur4 = dofBlur * 0.4;\r\n\r\n\tvec4 color = vec4(0.0);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\r\n\r\n\tgl_FragColor = color / 41.0;\r\n\r\n}\r\n"; + var vertex$1 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Depth of Field shader (Bokeh). + * + * Original shader code by Martins Upitis: + * http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html + */ + + var BokehMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new bokeh material. + * + * @param {PerspectiveCamera} [camera] - A camera. + * @param {Object} [options] - The options. + * @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth. + * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp. + * @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field. + * @param {Number} [options.maxBlur=1.0] - Maximum blur strength. + */ + function BokehMaterial(camera) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, BokehMaterial); + + var settings = Object.assign({ + focus: 1.0, + dof: 0.02, + aperture: 0.025, + maxBlur: 1.0 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(BokehMaterial).call(this, { + type: "BokehMaterial", + uniforms: { + cameraNear: new Uniform(0.1), + cameraFar: new Uniform(2000), + aspect: new Uniform(1.0), + tDiffuse: new Uniform(null), + tDepth: new Uniform(null), + focus: new Uniform(settings.focus), + dof: new Uniform(settings.dof), + aperture: new Uniform(settings.aperture), + maxBlur: new Uniform(settings.maxBlur) + }, + fragmentShader: fragment$1, + vertexShader: vertex$1, + depthWrite: false, + depthTest: false + })); + + _this.adoptCameraSettings(camera); + + return _this; + } + /** + * Adopts the settings of the given camera. + * + * @param {PerspectiveCamera} [camera=null] - A camera. + */ + + + createClass(BokehMaterial, [{ + key: "adoptCameraSettings", + value: function adoptCameraSettings() { + var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (camera !== null) { + this.uniforms.cameraNear.value = camera.near; + this.uniforms.cameraFar.value = camera.far; + this.uniforms.aspect.value = camera.aspect; + } + } + }]); + + inherits(BokehMaterial, _ShaderMaterial); + + return BokehMaterial; + }(ShaderMaterial); + + var fragment$2 = "uniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\r\n\r\n\t// Calculate color deltas.\r\n\tvec4 delta;\r\n\tvec3 c = texture2D(tDiffuse, vUv).rgb;\r\n\r\n\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\r\n\tvec3 t = abs(c - cLeft);\r\n\tdelta.x = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\r\n\tt = abs(c - cTop);\r\n\tdelta.y = max(max(t.r, t.g), t.b);\r\n\r\n\t// We do the usual threshold.\r\n\tvec2 edges = step(threshold, delta.xy);\r\n\r\n\t// Then discard if there is no edge.\r\n\tif(dot(edges, vec2(1.0)) == 0.0) {\r\n\r\n\t\tdiscard;\r\n\r\n\t}\r\n\r\n\t// Calculate right and bottom deltas.\r\n\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\r\n\tt = abs(c - cRight);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\r\n\tt = abs(c - cBottom);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the maximum delta in the direct neighborhood.\r\n\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\r\n\r\n\t// Calculate left-left and top-top deltas.\r\n\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\r\n\tt = abs(c - cLeftLeft);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\r\n\tt = abs(c - cTopTop);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the final maximum delta.\r\n\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\r\n\r\n\t// Local contrast adaptation in action.\r\n\tedges.xy *= step(0.5 * maxDelta, delta.xy);\r\n\r\n\tgl_FragColor = vec4(edges, 0.0, 0.0);\r\n\r\n}\r\n"; + var vertex$2 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A material that detects edges in a color texture. + * + * Mainly used for Subpixel Morphological Antialiasing. + */ + + var ColorEdgesMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new color edges material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function ColorEdgesMaterial() { + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, ColorEdgesMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(ColorEdgesMaterial).call(this, { + type: "ColorEdgesMaterial", + defines: { + EDGE_THRESHOLD: "0.1" + }, + uniforms: { + tDiffuse: new Uniform(null), + texelSize: new Uniform(texelSize) + }, + fragmentShader: fragment$2, + vertexShader: vertex$2, + depthWrite: false, + depthTest: false + })); + } + /** + * Sets the edge detection sensitivity. + * + * A lower value results in more edges being detected at the expense of + * performance. + * + * 0.1 is a reasonable value, and allows to catch most visible edges. + * 0.05 is a rather overkill value, that allows to catch 'em all. + * + * If temporal supersampling is used, 0.2 could be a reasonable value, + * as low contrast edges are properly filtered by just 2x. + * + * @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5]. + */ + + + createClass(ColorEdgesMaterial, [{ + key: "setEdgeDetectionThreshold", + value: function setEdgeDetectionThreshold(threshold) { + this.defines.EDGE_THRESHOLD = threshold.toFixed("2"); + this.needsUpdate = true; + } + }]); + + inherits(ColorEdgesMaterial, _ShaderMaterial); + + return ColorEdgesMaterial; + }(ShaderMaterial); + + var fragment$3 = "uniform sampler2D texture1;\r\nuniform sampler2D texture2;\r\n\r\nuniform float opacity1;\r\nuniform float opacity2;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\r\n\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\r\n\t\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\r\n\r\n\t\tvec4 color = vec4(\r\n\t\t\tvec3(1.0) - invTexel1 * invTexel2,\r\n\t\t\ttexel1.a + texel2.a\r\n\t\t);\r\n\r\n\t#else\r\n\r\n\t\tvec4 color = texel1 + texel2;\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$3 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A material for combining two textures. + * + * This material supports the two blend modes Add and Screen. + * + * In Screen mode, the two textures are effectively projected on a white screen + * simultaneously. In Add mode, the textures are simply added together which + * often produces undesired, washed out results. + */ + + var CombineMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new combine material. + * + * @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used. + */ + function CombineMaterial() { + var _this; + + var screenMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + classCallCheck(this, CombineMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(CombineMaterial).call(this, { + type: "CombineMaterial", + uniforms: { + texture1: new Uniform(null), + texture2: new Uniform(null), + opacity1: new Uniform(1.0), + opacity2: new Uniform(1.0) + }, + fragmentShader: fragment$3, + vertexShader: vertex$3, + depthWrite: false, + depthTest: false + })); + + _this.setScreenModeEnabled(screenMode); + + return _this; + } + /** + * Enables or disables the Screen blend mode. + * + * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. + */ + + + createClass(CombineMaterial, [{ + key: "setScreenModeEnabled", + value: function setScreenModeEnabled(enabled) { + if (enabled) { + this.defines.SCREEN_MODE = "1"; + } else { + delete this.defines.SCREEN_MODE; + } + + this.needsUpdate = true; + } + }]); + + inherits(CombineMaterial, _ShaderMaterial); + + return CombineMaterial; + }(ShaderMaterial); + + var fragment$4 = "#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\t// Sample top left texel.\r\n\tvec4 sum = texture2D(tDiffuse, vUv0);\r\n\r\n\t// Sample top right texel.\r\n\tsum += texture2D(tDiffuse, vUv1);\r\n\r\n\t// Sample bottom right texel.\r\n\tsum += texture2D(tDiffuse, vUv2);\r\n\r\n\t// Sample bottom left texel.\r\n\tsum += texture2D(tDiffuse, vUv3);\r\n\r\n\t// Compute the average.\r\n\tgl_FragColor = sum * 0.25;\r\n\r\n\t#include \r\n\r\n}\r\n"; + var vertex$4 = "uniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\nuniform float kernel;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\r\n\r\n\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\r\n\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\r\n\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\r\n\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An optimised convolution shader material. + * + * This material supports dithering. + * + * Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games: + * Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless) + * and an article by Filip Strugar, Intel: + * An investigation of fast real-time GPU-based image blur algorithms + * + * Further modified according to Apple's + * [Best Practices for Shaders](https://goo.gl/lmRoM5). + */ + + var ConvolutionMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new convolution material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function ConvolutionMaterial() { + var _this; + + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, ConvolutionMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ConvolutionMaterial).call(this, { + type: "ConvolutionMaterial", + uniforms: { + tDiffuse: new Uniform(null), + texelSize: new Uniform(new Vector2()), + halfTexelSize: new Uniform(new Vector2()), + kernel: new Uniform(0.0) + }, + fragmentShader: fragment$4, + vertexShader: vertex$4, + depthWrite: false, + depthTest: false + })); + + _this.setTexelSize(texelSize.x, texelSize.y); + /** + * The current kernel size. + * + * @type {KernelSize} + * @default KernelSize.LARGE + */ + + + _this.kernelSize = KernelSize.LARGE; + return _this; + } + /** + * Returns the kernel. + * + * @return {Float32Array} The kernel. + */ + + + createClass(ConvolutionMaterial, [{ + key: "getKernel", + value: function getKernel() { + return kernelPresets[this.kernelSize]; + } + /** + * Sets the texel size. + * + * @param {Number} x - The texel width. + * @param {Number} y - The texel height. + */ + + }, { + key: "setTexelSize", + value: function setTexelSize(x, y) { + this.uniforms.texelSize.value.set(x, y); + this.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5); + } + }]); + + inherits(ConvolutionMaterial, _ShaderMaterial); + + return ConvolutionMaterial; + }(ShaderMaterial); + /** + * The Kawase blur kernel presets. + * + * @type {Float32Array[]} + * @private + */ + + var kernelPresets = [new Float32Array([0.0, 0.0]), new Float32Array([0.0, 1.0, 1.0]), new Float32Array([0.0, 1.0, 1.0, 2.0]), new Float32Array([0.0, 1.0, 2.0, 2.0, 3.0]), new Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 4.0, 5.0]), new Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 7.0, 8.0, 9.0, 10.0])]; + /** + * A kernel size enumeration. + * + * @type {Object} + * @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel. + * @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel. + * @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel. + * @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel. + * @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel. + * @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel. + */ + + var KernelSize = { + VERY_SMALL: 0, + SMALL: 1, + MEDIUM: 2, + LARGE: 3, + VERY_LARGE: 4, + HUGE: 5 + }; + + var fragment$5 = "uniform sampler2D tDiffuse;\r\nuniform float opacity;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = opacity * texel;\r\n\r\n}\r\n"; + var vertex$5 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A simple copy shader material. + */ + + var CopyMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new copy material. + */ + function CopyMaterial() { + classCallCheck(this, CopyMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(CopyMaterial).call(this, { + type: "CopyMaterial", + uniforms: { + tDiffuse: new Uniform(null), + opacity: new Uniform(1.0) + }, + fragmentShader: fragment$5, + vertexShader: vertex$5, + depthWrite: false, + depthTest: false + })); + } + + inherits(CopyMaterial, _ShaderMaterial); + + return CopyMaterial; + }(ShaderMaterial); + + var fragment$6 = "#include \r\n#include \r\n\r\nuniform sampler2D tDepth;\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t// Transform into Cartesian coordinate (not mirrored).\r\n\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\r\n\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\r\n\r\n\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\r\n\r\n\t#ifdef PERSPECTIVE_CAMERA\r\n\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#else\r\n\r\n\t\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#endif\r\n\r\n\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\r\n\r\n\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\r\n\r\n}\r\n"; + var vertex$6 = "#include \r\n#include \r\n#include \r\n#include \r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t#include \r\n\t#include \r\n\t#include \r\n\t#include \r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include \r\n\r\n}\r\n"; + /** + * A depth comparison shader material. + */ + + var DepthComparisonMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new depth comparison material. + * + * @param {Texture} [depthTexture=null] - A depth texture. + * @param {PerspectiveCamera} [camera] - A camera. + */ + function DepthComparisonMaterial() { + var _this; + + var depthTexture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var camera = arguments.length > 1 ? arguments[1] : undefined; + + classCallCheck(this, DepthComparisonMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(DepthComparisonMaterial).call(this, { + type: "DepthComparisonMaterial", + uniforms: { + tDepth: new Uniform(depthTexture), + cameraNear: new Uniform(0.1), + cameraFar: new Uniform(2000) + }, + fragmentShader: fragment$6, + vertexShader: vertex$6, + depthWrite: false, + depthTest: false, + morphTargets: true, + skinning: true + })); + + _this.adoptCameraSettings(camera); + + return _this; + } + /** + * Adopts the settings of the given camera. + * + * @param {Camera} [camera=null] - A camera. + */ + + + createClass(DepthComparisonMaterial, [{ + key: "adoptCameraSettings", + value: function adoptCameraSettings() { + var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (camera !== null) { + this.uniforms.cameraNear.value = camera.near; + this.uniforms.cameraFar.value = camera.far; + + if (camera instanceof PerspectiveCamera) { + this.defines.PERSPECTIVE_CAMERA = "1"; + } else { + delete this.defines.PERSPECTIVE_CAMERA; + } + } + } + }]); + + inherits(DepthComparisonMaterial, _ShaderMaterial); + + return DepthComparisonMaterial; + }(ShaderMaterial); + + var fragment$7 = "uniform sampler2D tDiffuse;\r\n\r\nuniform float angle;\r\nuniform float scale;\r\nuniform float intensity;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nfloat pattern() {\r\n\r\n\tfloat s = sin(angle);\r\n\tfloat c = cos(angle);\r\n\r\n\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\r\n\r\n\treturn (sin(point.x) * sin(point.y)) * 4.0;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef AVERAGE\r\n\r\n\t\tcolor = vec3((color.r + color.g + color.b) / 3.0);\r\n\r\n\t#endif\r\n\r\n\tcolor = vec3(color * 10.0 - 5.0 + pattern());\r\n\tcolor = texel.rgb + (color - texel.rgb) * intensity;\r\n\r\n\tgl_FragColor = vec4(color, texel.a);\r\n\r\n}\r\n"; + var vertex$7 = "uniform vec4 offsetRepeat;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A dot screen shader material. + */ + + var DotScreenMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new dot screen material. + * + * @param {Boolean} [options] - The options. + * @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white). + * @param {Boolean} [options.angle=1.57] - The angle of the dot pattern. + * @param {Boolean} [options.scale=1.0] - The scale of the dot pattern. + * @param {Boolean} [options.intensity=1.0] - The intensity of the effect. + */ + function DotScreenMaterial() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DotScreenMaterial); + + var settings = Object.assign({ + average: false, + angle: 1.57, + scale: 1.0, + intensity: 1.0 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(DotScreenMaterial).call(this, { + type: "DotScreenMaterial", + uniforms: { + tDiffuse: new Uniform(null), + angle: new Uniform(settings.angle), + scale: new Uniform(settings.scale), + intensity: new Uniform(settings.intensity), + offsetRepeat: new Uniform(new Vector4(0.5, 0.5, 1.0, 1.0)) + }, + fragmentShader: fragment$7, + vertexShader: vertex$7, + depthWrite: false, + depthTest: false + })); + + _this.setAverageEnabled(settings.average); + + return _this; + } + /** + * Enables or disables the Screen blend mode. + * + * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. + */ + + + createClass(DotScreenMaterial, [{ + key: "setAverageEnabled", + value: function setAverageEnabled(enabled) { + if (enabled) { + this.defines.AVERAGE = "1"; + } else { + delete this.defines.AVERAGE; + } + + this.needsUpdate = true; + } + }]); + + inherits(DotScreenMaterial, _ShaderMaterial); + + return DotScreenMaterial; + }(ShaderMaterial); + + var fragment$8 = "uniform sampler2D tDiffuse;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifdef NOISE\r\n\r\n\tuniform float noiseIntensity;\r\n\r\n#endif\r\n\r\n#ifdef SCANLINES\r\n\r\n\tuniform float scanlineIntensity;\r\n\tuniform float scanlineCount;\r\n\r\n#endif\r\n\r\n#ifdef GRID\r\n\r\n\tuniform float gridIntensity;\r\n\tuniform vec2 gridScale;\r\n\tuniform float gridLineWidth;\r\n\r\n#endif\r\n\r\n#ifdef GREYSCALE\r\n\r\n\t#include \r\n\r\n\tuniform float greyscaleIntensity;\r\n\r\n#elif defined(SEPIA)\r\n\r\n\tuniform float sepiaIntensity;\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tuniform float vignetteOffset;\r\n\tuniform float vignetteDarkness;\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tfloat x = vUv.x * vUv.y * time * 1000.0;\r\n\t\tx = mod(x, 13.0) * mod(x, 123.0);\r\n\t\tx = mod(x, 0.01);\r\n\r\n\t\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invNoise = vec3(1.0) - noise;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invNoise;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += noise;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef SCANLINES\r\n\r\n\t\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\r\n\t\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invScanlines = vec3(1.0) - scanlines;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invScanlines;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += scanlines;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef GRID\r\n\r\n\t\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\r\n\t\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\r\n\r\n\t#endif\r\n\r\n\t#ifdef GREYSCALE\r\n\r\n\t\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\r\n\r\n\t#elif defined(SEPIA)\r\n\r\n\t\tvec3 c = color.rgb;\r\n\r\n\t\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\r\n\t\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\r\n\t\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tconst vec2 center = vec2(0.5);\r\n\r\n\t\t#ifdef ESKIL\r\n\r\n\t\t\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\r\n\t\t\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat dist = distance(vUv, center);\r\n\t\t\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\r\n\r\n\t\t#endif\t\t\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\r\n\r\n}\r\n"; + var vertex$8 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A cinematic shader that provides the following effects: + * - Film Grain + * - Scanlines + * - Vignette + * - Greyscale + * - Sepia + * + * Original scanlines algorithm by Pat "Hawthorne" Shearon. + * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html + * + * Optimised scanlines and noise with intensity scaling by Georg "Leviathan" + * Steinrohder. This version was provided under a Creative Commons Attribution + * 3.0 License: http://creativecommons.org/licenses/by/3.0. + * + * The sepia effect is based on: + * https://github.com/evanw/glfx.js + * + * The vignette code is based on PaintEffect postprocess from ro.me: + * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js + */ + + var FilmMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new film material. + * + * @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance. + * @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive. + * @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive. + * @param {Boolean} [options.vignette=false] - Apply vignette effect. + * @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out. + * @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently. + * @param {Boolean} [options.noise=true] - Show noise-based film grain. + * @param {Boolean} [options.scanlines=true] - Show scanlines. + * @param {Boolean} [options.grid=true] - Show a grid. + * @param {Number} [options.noiseIntensity=0.5] - The noise intensity. + * @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity. + * @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0. + * @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0. + * @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0. + * @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0. + * @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0. + */ + function FilmMaterial() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, FilmMaterial); + + var settings = Object.assign({ + screenMode: true, + noise: true, + scanlines: true, + grid: false, + greyscale: false, + sepia: false, + vignette: false, + eskil: false, + noiseIntensity: 0.5, + scanlineIntensity: 0.05, + gridIntensity: 1.0, + greyscaleIntensity: 1.0, + sepiaIntensity: 1.0, + vignetteOffset: 1.0, + vignetteDarkness: 1.0 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(FilmMaterial).call(this, { + type: "FilmMaterial", + uniforms: { + tDiffuse: new Uniform(null), + time: new Uniform(0.0), + noiseIntensity: new Uniform(settings.noiseIntensity), + scanlineIntensity: new Uniform(settings.scanlineIntensity), + gridIntensity: new Uniform(settings.gridIntensity), + scanlineCount: new Uniform(0.0), + gridScale: new Uniform(new Vector2()), + gridLineWidth: new Uniform(0.0), + greyscaleIntensity: new Uniform(settings.greyscaleIntensity), + sepiaIntensity: new Uniform(settings.sepiaIntensity), + vignetteOffset: new Uniform(settings.vignetteOffset), + vignetteDarkness: new Uniform(settings.vignetteDarkness) + }, + fragmentShader: fragment$8, + vertexShader: vertex$8, + depthWrite: false, + depthTest: false + })); + + _this.setScreenModeEnabled(settings.screenMode); + + _this.setNoiseEnabled(settings.noise); + + _this.setScanlinesEnabled(settings.scanlines); + + _this.setGridEnabled(settings.grid); + + _this.setGreyscaleEnabled(settings.greyscale); + + _this.setSepiaEnabled(settings.sepia); + + _this.setVignetteEnabled(settings.vignette); + + _this.setEskilEnabled(settings.eskil); + + return _this; + } + /** + * Enables or disables the Screen blend mode. + * + * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. + */ + + + createClass(FilmMaterial, [{ + key: "setScreenModeEnabled", + value: function setScreenModeEnabled(enabled) { + if (enabled) { + this.defines.SCREEN_MODE = "1"; + } else { + delete this.defines.SCREEN_MODE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the noise effect. + * + * @param {Boolean} enabled - Whether the noise effect should be enabled. + */ + + }, { + key: "setNoiseEnabled", + value: function setNoiseEnabled(enabled) { + if (enabled) { + this.defines.NOISE = "1"; + } else { + delete this.defines.NOISE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the scanlines effect. + * + * @param {Boolean} enabled - Whether the scanlines effect should be enabled. + */ + + }, { + key: "setScanlinesEnabled", + value: function setScanlinesEnabled(enabled) { + if (enabled) { + this.defines.SCANLINES = "1"; + } else { + delete this.defines.SCANLINES; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the grid effect. + * + * @param {Boolean} enabled - Whether the grid effect should be enabled. + */ + + }, { + key: "setGridEnabled", + value: function setGridEnabled(enabled) { + if (enabled) { + this.defines.GRID = "1"; + } else { + delete this.defines.GRID; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the greyscale effect. + * + * @param {Boolean} enabled - Whether the greyscale effect should be enabled. + */ + + }, { + key: "setGreyscaleEnabled", + value: function setGreyscaleEnabled(enabled) { + if (enabled) { + this.defines.GREYSCALE = "1"; + } else { + delete this.defines.GREYSCALE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the sepia effect. + * + * @param {Boolean} enabled - Whether the sepia effect should be enabled. + */ + + }, { + key: "setSepiaEnabled", + value: function setSepiaEnabled(enabled) { + if (enabled) { + this.defines.SEPIA = "1"; + } else { + delete this.defines.SEPIA; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the Vignette effect. + * + * @param {Boolean} enabled - Whether the Vignette effect should be enabled. + */ + + }, { + key: "setVignetteEnabled", + value: function setVignetteEnabled(enabled) { + if (enabled) { + this.defines.VIGNETTE = "1"; + } else { + delete this.defines.VIGNETTE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the Eskil Vignette effect. + * + * Has no effect if Vignette is disabled. + * + * @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled. + */ + + }, { + key: "setEskilEnabled", + value: function setEskilEnabled(enabled) { + if (enabled) { + this.defines.ESKIL = "1"; + } else { + delete this.defines.ESKIL; + } + + this.needsUpdate = true; + } + }]); + + inherits(FilmMaterial, _ShaderMaterial); + + return FilmMaterial; + }(ShaderMaterial); + + var fragment$9 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tPerturb;\r\n\r\nuniform bool active;\r\n\r\nuniform float amount;\r\nuniform float angle;\r\nuniform float seed;\r\nuniform float seedX;\r\nuniform float seedY;\r\nuniform float distortionX;\r\nuniform float distortionY;\r\nuniform float colS;\r\n\r\nvarying vec2 vUv;\r\n\r\nfloat rand(vec2 tc) {\r\n\r\n\tconst float a = 12.9898;\r\n\tconst float b = 78.233;\r\n\tconst float c = 43758.5453;\r\n\r\n\tfloat dt = dot(tc, vec2(a, b));\r\n\tfloat sn = mod(dt, 3.14);\r\n\r\n\treturn fract(sin(sn) * c);\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec2 coord = vUv;\r\n\r\n\tfloat xs, ys;\r\n\tvec4 normal;\r\n\r\n\tvec2 offset;\r\n\tvec4 cr, cga, cb;\r\n\tvec4 snow, color;\r\n\r\n\tfloat sx, sy;\r\n\r\n\tif(active) {\r\n\r\n\t\txs = floor(gl_FragCoord.x / 0.5);\r\n\t\tys = floor(gl_FragCoord.y / 0.5);\r\n\r\n\t\tnormal = texture2D(tPerturb, coord * seed * seed);\r\n\r\n\t\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\r\n\r\n\t\t\tsx = clamp(ceil(seedX), 0.0, 1.0);\r\n\t\t\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\r\n\r\n\t\t}\r\n\r\n\t\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\r\n\r\n\t\t\tsy = clamp(ceil(seedY), 0.0, 1.0);\r\n\t\t\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\r\n\r\n\t\t}\r\n\r\n\t\tcoord.x += normal.x * seedX * (seed / 5.0);\r\n\t\tcoord.y += normal.y * seedY * (seed / 5.0);\r\n\r\n\t\toffset = amount * vec2(cos(angle), sin(angle));\r\n\r\n\t\tcr = texture2D(tDiffuse, coord + offset);\r\n\t\tcga = texture2D(tDiffuse, coord);\r\n\t\tcb = texture2D(tDiffuse, coord - offset);\r\n\r\n\t\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\r\n\t\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\r\n\t\tcolor += snow;\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$9 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A glitch shader material. + * + * Reference: + * https://github.com/staffantan/unityglitch + */ + + var GlitchMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new glitch material. + */ + function GlitchMaterial() { + classCallCheck(this, GlitchMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(GlitchMaterial).call(this, { + type: "GlitchMaterial", + uniforms: { + tDiffuse: new Uniform(null), + tPerturb: new Uniform(null), + active: new Uniform(1), + amount: new Uniform(0.8), + angle: new Uniform(0.02), + seed: new Uniform(0.02), + seedX: new Uniform(0.02), + seedY: new Uniform(0.02), + distortionX: new Uniform(0.5), + distortionY: new Uniform(0.6), + colS: new Uniform(0.05) + }, + fragmentShader: fragment$9, + vertexShader: vertex$9, + depthWrite: false, + depthTest: false + })); + } + + inherits(GlitchMaterial, _ShaderMaterial); + + return GlitchMaterial; + }(ShaderMaterial); + + var fragment$10 = "#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec3 lightPosition;\r\n\r\nuniform float exposure;\r\nuniform float decay;\r\nuniform float density;\r\nuniform float weight;\r\nuniform float clampMax;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec2 texCoord = vUv;\r\n\r\n\t// Calculate vector from pixel to light source in screen space.\r\n\tvec2 deltaTexCoord = texCoord - lightPosition.st;\r\n\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\r\n\r\n\t// A decreasing illumination factor.\r\n\tfloat illuminationDecay = 1.0;\r\n\r\n\tvec4 sample;\r\n\tvec4 color = vec4(0.0);\r\n\r\n\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\r\n\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\r\n\r\n\t\ttexCoord -= deltaTexCoord;\r\n\t\tsample = texture2D(tDiffuse, texCoord);\r\n\r\n\t\t// Apply sample attenuation scale/decay factors.\r\n\t\tsample *= illuminationDecay * weight;\r\n\r\n\t\tcolor += sample;\r\n\r\n\t\t// Update exponential decay factor.\r\n\t\tilluminationDecay *= decay;\r\n\r\n\t}\r\n\r\n\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\r\n\r\n\t#include \r\n\r\n}\r\n"; + var vertex$10 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A crepuscular rays shader material. + * + * This material supports dithering. + * + * References: + * + * Thibaut Despoulain, 2012: + * [(WebGL) Volumetric Light Approximation in Three.js]( + * http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html) + * + * Nvidia, GPU Gems 3, 2008: + * [Chapter 13. Volumetric Light Scattering as a Post-Process]( + * https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html) + */ + + var GodRaysMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new god rays material. + * + * @param {Object} [options] - The options. + * @param {Number} [options.density=0.96] - The density of the light rays. + * @param {Number} [options.decay=0.93] - An illumination decay factor. + * @param {Number} [options.weight=0.4] - A light ray weight factor. + * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. + * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. + */ + function GodRaysMaterial() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, GodRaysMaterial); + + var settings = Object.assign({ + exposure: 0.6, + density: 0.93, + decay: 0.96, + weight: 0.4, + clampMax: 1.0 + }, options); + return possibleConstructorReturn(this, getPrototypeOf$2(GodRaysMaterial).call(this, { + type: "GodRaysMaterial", + defines: { + NUM_SAMPLES_FLOAT: "60.0", + NUM_SAMPLES_INT: "60" + }, + uniforms: { + tDiffuse: new Uniform(null), + lightPosition: new Uniform(null), + exposure: new Uniform(settings.exposure), + decay: new Uniform(settings.decay), + density: new Uniform(settings.density), + weight: new Uniform(settings.weight), + clampMax: new Uniform(settings.clampMax) + }, + fragmentShader: fragment$10, + vertexShader: vertex$10, + depthWrite: false, + depthTest: false + })); + } + + inherits(GodRaysMaterial, _ShaderMaterial); + + return GodRaysMaterial; + }(ShaderMaterial); + + var fragment$11 = "#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float distinction;\r\nuniform vec2 range;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tfloat l = linearToRelativeLuminance(texel.rgb);\r\n\r\n\t#ifdef RANGE\r\n\r\n\t\tfloat low = step(range.x, l);\r\n\t\tfloat high = step(l, range.y);\r\n\r\n\t\t// Apply the mask.\r\n\t\tl *= low * high;\r\n\r\n\t#endif\r\n\r\n\tl = pow(abs(l), distinction);\r\n\r\n\t#ifdef COLOR\r\n\r\n\t\tgl_FragColor = vec4(texel.rgb * l, texel.a);\r\n\r\n\t#else\r\n\r\n\t\tgl_FragColor = vec4(l, l, l, texel.a);\r\n\r\n\t#endif\r\n\r\n}\r\n"; + var vertex$11 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A luminosity shader material. + * + * This shader produces a greyscale luminance map that describes the absolute + * amount of light emitted by a scene. It can also be configured to output + * colours that are scaled with their respective luminance value. Additionally, + * a range may be provided to mask out undesired texels. + * + * The alpha channel will remain unaffected in all cases. + * + * On luminance coefficients: + * http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9 + * + * Coefficients for different colour spaces: + * https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png + * + * Luminance range reference: + * https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z + */ + + var LuminosityMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new luminosity material. + * + * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value. + * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range. + */ + function LuminosityMaterial() { + var _this; + + var colorOutput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var luminanceRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + classCallCheck(this, LuminosityMaterial); + + var maskLuminance = luminanceRange !== null; + _this = possibleConstructorReturn(this, getPrototypeOf$2(LuminosityMaterial).call(this, { + type: "LuminosityMaterial", + uniforms: { + tDiffuse: new Uniform(null), + distinction: new Uniform(1.0), + range: new Uniform(maskLuminance ? luminanceRange : new Vector2()) + }, + fragmentShader: fragment$11, + vertexShader: vertex$11 + })); + + _this.setColorOutputEnabled(colorOutput); + + _this.setLuminanceRangeEnabled(maskLuminance); + + return _this; + } + /** + * Enables or disables color output. + * + * @param {Boolean} enabled - Whether color output should be enabled. + */ + + + createClass(LuminosityMaterial, [{ + key: "setColorOutputEnabled", + value: function setColorOutputEnabled(enabled) { + if (enabled) { + this.defines.COLOR = "1"; + } else { + delete this.defines.COLOR; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the luminance mask. + * + * @param {Boolean} enabled - Whether the luminance mask should be enabled. + */ + + }, { + key: "setLuminanceRangeEnabled", + value: function setLuminanceRangeEnabled(enabled) { + if (enabled) { + this.defines.RANGE = "1"; + } else { + delete this.defines.RANGE; + } + + this.needsUpdate = true; + } + }]); + + inherits(LuminosityMaterial, _ShaderMaterial); + + return LuminosityMaterial; + }(ShaderMaterial); + + var fragment$12 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tMask;\r\nuniform sampler2D tEdges;\r\n\r\nuniform vec3 visibleEdgeColor;\r\nuniform vec3 hiddenEdgeColor;\r\nuniform float pulse;\r\nuniform float edgeStrength;\r\n\r\n#ifdef USE_PATTERN\r\n\r\n\tuniform sampler2D tPattern;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 color = texture2D(tDiffuse, vUv);\r\n\tvec2 edge = texture2D(tEdges, vUv).rg;\r\n\tvec2 mask = texture2D(tMask, vUv).rg;\r\n\r\n\t#ifndef X_RAY\r\n\r\n\t\tedge.y = 0.0;\r\n\r\n\t#endif\r\n\r\n\tedge *= (edgeStrength * mask.x * pulse);\r\n\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\r\n\r\n\t#ifdef ALPHA_BLENDING\r\n\r\n\t\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\r\n\r\n\t#else\r\n\r\n\t\tcolor.rgb += outlineColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\r\n\r\n\t\t#ifdef X_RAY\r\n\r\n\t\t\tfloat hiddenFactor = 0.5;\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat hiddenFactor = 0.0;\r\n\r\n\t\t#endif\r\n\r\n\t\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\r\n\r\n\t\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$12 = "#ifdef USE_PATTERN\r\n\r\n\tuniform float aspect;\r\n\tuniform float patternScale;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\t\tvPatternCoord = uv * aspectCorrection * patternScale;\r\n\r\n\t#endif\r\n\r\n\tvUv = uv;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An outline blend shader material. + */ + + var OutlineBlendMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new outline blend material. + * + * @param {Object} [options] - The options. + * @param {Number} [options.edgeStrength=1.0] - The edge strength. + * @param {Number} [options.patternScale=1.0] - The scale of the pattern texture. + * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges. + * @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges. + * @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha. + * @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible. + */ + function OutlineBlendMaterial() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, OutlineBlendMaterial); + + var settings = Object.assign({ + edgeStrength: 1.0, + patternScale: 1.0, + visibleEdgeColor: 0xffffff, + hiddenEdgeColor: 0x22090A, + alphaBlending: false, + xRay: true + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(OutlineBlendMaterial).call(this, { + type: "OutlineBlendMaterial", + uniforms: { + pulse: new Uniform(1.0), + aspect: new Uniform(1.0), + tDiffuse: new Uniform(null), + tMask: new Uniform(null), + tEdges: new Uniform(null), + tPattern: new Uniform(null), + edgeStrength: new Uniform(settings.edgeStrength), + patternScale: new Uniform(settings.patternScale), + visibleEdgeColor: new Uniform(new Color(settings.visibleEdgeColor)), + hiddenEdgeColor: new Uniform(new Color(settings.hiddenEdgeColor)) + }, + fragmentShader: fragment$12, + vertexShader: vertex$12, + depthWrite: false, + depthTest: false + })); + + _this.setAlphaBlendingEnabled(settings.alphaBlending); + + _this.setXRayEnabled(settings.xRay); + + return _this; + } + /** + * Enables or disables the alpha blending. + * + * @param {Boolean} enabled - Whether the alpha blending should be enabled. + */ + + + createClass(OutlineBlendMaterial, [{ + key: "setAlphaBlendingEnabled", + value: function setAlphaBlendingEnabled(enabled) { + if (enabled) { + this.defines.ALPHA_BLENDING = "1"; + } else { + delete this.defines.ALPHA_BLENDING; + } + + this.needsUpdate = true; + } + /** + * Defines whether hidden parts of selected objects should be visible. + * + * @param {Boolean} enabled - Whether hidden parts of selected objects should be visible. + */ + + }, { + key: "setXRayEnabled", + value: function setXRayEnabled(enabled) { + if (enabled) { + this.defines.X_RAY = "1"; + } else { + delete this.defines.X_RAY; + } + + this.needsUpdate = true; + } + /** + * Sets a pattern texture to use as overlay. + * + * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. + */ + + }, { + key: "setPatternTexture", + value: function setPatternTexture() { + var texture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (texture !== null) { + this.defines.USE_PATTERN = "1"; + } else { + delete this.defines.USE_PATTERN; + } + + this.uniforms.tPattern.value = texture; + this.needsUpdate = true; + } + }]); + + inherits(OutlineBlendMaterial, _ShaderMaterial); + + return OutlineBlendMaterial; + }(ShaderMaterial); + + var fragment$13 = "uniform sampler2D tMask;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 c0 = texture2D(tMask, vUv0).rg;\r\n\tvec2 c1 = texture2D(tMask, vUv1).rg;\r\n\tvec2 c2 = texture2D(tMask, vUv2).rg;\r\n\tvec2 c3 = texture2D(tMask, vUv3).rg;\r\n\r\n\tfloat d0 = (c0.x - c1.x) * 0.5;\r\n\tfloat d1 = (c2.x - c3.x) * 0.5;\r\n\tfloat d = length(vec2(d0, d1));\r\n\r\n\tfloat a0 = min(c0.y, c1.y);\r\n\tfloat a1 = min(c2.y, c3.y);\r\n\tfloat visibilityFactor = min(a0, a1);\r\n\r\n\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\r\n\r\n}\r\n"; + var vertex$13 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\r\n\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\r\n\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\r\n\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An outline edge detection shader material. + */ + + var OutlineEdgesMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new outline edge detection material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function OutlineEdgesMaterial() { + var _this; + + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, OutlineEdgesMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(OutlineEdgesMaterial).call(this, { + type: "OutlineEdgesMaterial", + uniforms: { + tMask: new Uniform(null), + texelSize: new Uniform(new Vector2()) + }, + fragmentShader: fragment$13, + vertexShader: vertex$13, + depthWrite: false, + depthTest: false + })); + + _this.setTexelSize(texelSize.x, texelSize.y); + + return _this; + } + /** + * Sets the texel size. + * + * @param {Number} x - The texel width. + * @param {Number} y - The texel height. + */ + + + createClass(OutlineEdgesMaterial, [{ + key: "setTexelSize", + value: function setTexelSize(x, y) { + this.uniforms.texelSize.value.set(x, y); + } + }]); + + inherits(OutlineEdgesMaterial, _ShaderMaterial); + + return OutlineEdgesMaterial; + }(ShaderMaterial); + + var fragment$14 = "uniform sampler2D tDiffuse;\r\nuniform float granularity;\r\nuniform float dx;\r\nuniform float dy;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel;\r\n\r\n\tif(granularity > 0.0) {\r\n\r\n\t\tvec2 coord = vec2(\r\n\t\t\tdx * (floor(vUv.x / dx) + 0.5),\r\n\t\t\tdy * (floor(vUv.y / dy) + 0.5)\r\n\t\t);\r\n\r\n\t\ttexel = texture2D(tDiffuse, coord);\r\n\r\n\t} else {\r\n\r\n\t\ttexel = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texel;\r\n\r\n}\r\n"; + var vertex$14 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A pixelation shader material. + * + * Original shader code by Robert Casanova: + * https://github.com/robertcasanova/pixelate-shader + */ + + var PixelationMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new pixelation material. + */ + function PixelationMaterial() { + classCallCheck(this, PixelationMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(PixelationMaterial).call(this, { + type: "PixelationMaterial", + uniforms: { + tDiffuse: new Uniform(null), + granularity: new Uniform(1.0), + resolution: new Uniform(new Vector2(1.0, 1.0)), + dx: new Uniform(1.0), + dy: new Uniform(1.0) + }, + fragmentShader: fragment$14, + vertexShader: vertex$14, + depthWrite: false, + depthTest: false + })); + } + /** + * The pixel granularity. + * + * @type {Number} + */ + + + createClass(PixelationMaterial, [{ + key: "setResolution", + + /** + * Sets the resolution. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + value: function setResolution(width, height) { + this.uniforms.resolution.value.set(width, height); + this.granularity = this.granularity; + } + }, { + key: "granularity", + get: function get() { + return this.uniforms.granularity.value; + } + /** + * A higher value yields coarser visuals. + * + * @type {Number} + */ + , + set: function set(x) { + var uniforms = this.uniforms; + var resolution = uniforms.resolution.value; + uniforms.granularity.value = x; + uniforms.dx.value = x / resolution.x; + uniforms.dy.value = x / resolution.y; + } + }]); + + inherits(PixelationMaterial, _ShaderMaterial); + + return PixelationMaterial; + }(ShaderMaterial); + + var fragment$15 = "#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\n\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nuniform float focalLength;\r\nuniform float focalStop;\r\n\r\nuniform float maxBlur;\r\nuniform float luminanceThreshold;\r\nuniform float luminanceGain;\r\nuniform float bias;\r\nuniform float fringe;\r\nuniform float ditherStrength;\r\n\r\n#ifdef SHADER_FOCUS\r\n\r\n\tuniform vec2 focusCoords;\r\n\r\n#else\r\n\r\n\tuniform float focalDepth;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef PENTAGON\r\n\r\n\tfloat penta(vec2 coords) {\r\n\r\n\t\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\r\n\t\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\r\n\r\n\t\tconst vec4 ONE = vec4(1.0);\r\n\r\n\t\tconst float P_FEATHER = 0.4;\r\n\t\tconst float N_FEATHER = -P_FEATHER;\r\n\r\n\t\tfloat inOrOut = -4.0;\r\n\r\n\t\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\r\n\r\n\t\tvec4 dist = vec4(\r\n\t\t\tdot(P, HS0),\r\n\t\t\tdot(P, HS1),\r\n\t\t\tdot(P, HS2),\r\n\t\t\tdot(P, HS3)\r\n\t\t);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\r\n\t\tinOrOut += dot(dist, ONE);\r\n\r\n\t\tdist.x = dot(P, HS4);\r\n\t\tdist.y = HS5.w - abs(P.z);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\t\tinOrOut += dist.x;\r\n\r\n\t\treturn clamp(inOrOut, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef SHOW_FOCUS\r\n\r\n\tvec3 debugFocus(vec3 c, float blur, float depth) {\r\n\r\n\t\tfloat edge = 0.002 * depth;\r\n\t\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\r\n\t\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\r\n\r\n\t\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\r\n\t\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\r\n\r\n\t\treturn c;\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tfloat vignette() {\r\n\r\n\t\tconst vec2 CENTER = vec2(0.5);\r\n\r\n\t\tconst float VIGNETTE_OUT = 1.3;\r\n\t\tconst float VIGNETTE_IN = 0.0;\r\n\t\tconst float VIGNETTE_FADE = 22.0; \r\n\r\n\t\tfloat d = distance(vUv, CENTER);\r\n\t\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\r\n\r\n\t\treturn clamp(d, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvec2 rand2(vec2 coord) {\r\n\r\n\tvec2 noise;\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tconst float a = 12.9898;\r\n\t\tconst float b = 78.233;\r\n\t\tconst float c = 43758.5453;\r\n\r\n\t\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\t\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\r\n\t#else\r\n\r\n\t\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\r\n\t\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\r\n\r\n\t#endif\r\n\r\n\treturn noise;\r\n\r\n}\r\n\r\nvec3 processTexel(vec2 coords, float blur) {\r\n\r\n\tvec3 c;\r\n\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\r\n\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\r\n\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\r\n\r\n\t// Calculate the luminance of the constructed colour.\r\n\tfloat luminance = linearToRelativeLuminance(c);\r\n\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\r\n\r\n\treturn c + mix(vec3(0.0), c, threshold * blur);\r\n\r\n}\r\n\r\nfloat linearize(float depth) {\r\n\r\n\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\r\n\r\n}\r\n\r\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\r\n\r\n\tconst float TWO_PI = 6.28318531;\r\n\r\n\tfloat step = TWO_PI / ringSamples;\r\n\tfloat pw = cos(j * step) * i;\r\n\tfloat ph = sin(j * step) * i;\r\n\r\n\t#ifdef PENTAGON\r\n\r\n\t\tfloat p = penta(vec2(pw, ph));\r\n\r\n\t#else\r\n\r\n\t\tfloat p = 1.0;\r\n\r\n\t#endif\r\n\r\n\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = linearize(texture2D(tDepth, vUv).x);\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = linearize(readDepth(tDepth, vUv));\r\n\r\n\t#endif\r\n\r\n\t#ifdef SHADER_FOCUS\r\n\r\n\t\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\t\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\r\n\r\n\t\t#endif\r\n\r\n\t#else\r\n\r\n\t\tfloat fDepth = focalDepth;\r\n\r\n\t#endif\r\n\r\n\t#ifdef MANUAL_DOF\r\n\r\n\t\tconst float nDoFStart = 1.0; \r\n\t\tconst float nDoFDist = 2.0;\r\n\t\tconst float fDoFStart = 1.0;\r\n\t\tconst float fDoFDist = 3.0;\r\n\r\n\t\tfloat focalPlane = depth - fDepth;\r\n\t\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\r\n\t\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\r\n\r\n\t\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\r\n\r\n\t#else\r\n\r\n\t\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\r\n\r\n\t\tfloat focalPlaneMM = fDepth * 1000.0;\r\n\t\tfloat depthMM = depth * 1000.0;\r\n\r\n\t\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\r\n\t\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\r\n\t\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\r\n\r\n\t\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\r\n\r\n\t#endif\r\n\r\n\tblur = clamp(blur, 0.0, 1.0);\r\n\r\n\t// Dithering.\r\n\tvec2 noise = rand2(vUv) * ditherStrength * blur;\r\n\r\n\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\r\n\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\r\n\r\n\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\r\n\r\n\t// Calculation of final color.\r\n\tvec4 color;\r\n\r\n\tif(blur < 0.05) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t\tfloat s = 1.0;\r\n\t\tint ringSamples;\r\n\r\n\t\tfor(int i = 1; i <= RINGS_INT; ++i) {\r\n\r\n\t\t\tringSamples = i * SAMPLES_INT;\r\n\r\n\t\t\t// Constant loop.\r\n\t\t\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\r\n\r\n\t\t\t\t// Break earlier.\r\n\t\t\t\tif(j >= ringSamples) { break; }\r\n\r\n\t\t\t\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcolor.rgb /= s; // Divide by sample count.\r\n\r\n\t}\r\n\r\n\t#ifdef SHOW_FOCUS\r\n\r\n\t\tcolor.rgb = debugFocus(color.rgb, blur, depth);\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tcolor.rgb *= vignette();\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$15 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Depth of Field shader v2.4. + * + * Original shader code by Martins Upitis: + * http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update) + */ + + var RealisticBokehMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new bokeh2 material. + * + * @param {PerspectiveCamera} [camera] - The main camera. + * @param {Object} [options] - Additional options. + * @param {Vector2} [options.texelSize] - The absolute screen texel size. + * @param {Boolean} [options.rings=3] - The number of blurring iterations. + * @param {Boolean} [options.samples=2] - The amount of samples taken per ring. + * @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted. + * @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur. + * @param {Boolean} [options.vignette=false] - Enables a vignette effect. + * @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels. + * @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!). + * @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering. + * @param {Number} [options.maxBlur=1.0] - The maximum blur strength. + * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold. + * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor. + * @param {Number} [options.bias=0.5] - A blur bias. + * @param {Number} [options.fringe=0.7] - A blur offset. + * @param {Number} [options.ditherStrength=0.0001] - The dither strength. + */ + function RealisticBokehMaterial() { + var _this; + + var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, RealisticBokehMaterial); + + var settings = Object.assign({ + texelSize: null, + rings: 3, + samples: 2, + showFocus: false, + manualDoF: false, + vignette: false, + pentagon: false, + shaderFocus: true, + noise: true, + maxBlur: 1.0, + luminanceThreshold: 0.5, + luminanceGain: 2.0, + bias: 0.5, + fringe: 0.7, + ditherStrength: 0.0001 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(RealisticBokehMaterial).call(this, { + type: "RealisticBokehMaterial", + defines: { + RINGS_INT: settings.rings.toFixed(0), + RINGS_FLOAT: settings.rings.toFixed(1), + SAMPLES_INT: settings.samples.toFixed(0), + SAMPLES_FLOAT: settings.samples.toFixed(1) + }, + uniforms: { + tDiffuse: new Uniform(null), + tDepth: new Uniform(null), + texelSize: new Uniform(new Vector2()), + halfTexelSize: new Uniform(new Vector2()), + cameraNear: new Uniform(0.1), + cameraFar: new Uniform(2000), + focalLength: new Uniform(24.0), + focalStop: new Uniform(0.9), + maxBlur: new Uniform(settings.maxBlur), + luminanceThreshold: new Uniform(settings.luminanceThreshold), + luminanceGain: new Uniform(settings.luminanceGain), + bias: new Uniform(settings.bias), + fringe: new Uniform(settings.fringe), + ditherStrength: new Uniform(settings.ditherStrength), + focusCoords: new Uniform(new Vector2(0.5, 0.5)), + focalDepth: new Uniform(1.0) + }, + fragmentShader: fragment$15, + vertexShader: vertex$15, + depthWrite: false, + depthTest: false + })); + + _this.setShowFocusEnabled(settings.showFocus); + + _this.setManualDepthOfFieldEnabled(settings.manualDoF); + + _this.setVignetteEnabled(settings.vignette); + + _this.setPentagonEnabled(settings.pentagon); + + _this.setShaderFocusEnabled(settings.shaderFocus); + + _this.setNoiseEnabled(settings.noise); + + if (settings.texelSize !== null) { + _this.setTexelSize(settings.texelSize.x, settings.texelSize.y); + } + + _this.adoptCameraSettings(camera); + + return _this; + } + /** + * Defines whether the focus should be shown. + * + * @param {Boolean} enabled - True if the focus should be shown, false otherwise. + */ + + + createClass(RealisticBokehMaterial, [{ + key: "setShowFocusEnabled", + value: function setShowFocusEnabled(enabled) { + if (enabled) { + this.defines.SHOW_FOCUS = "1"; + } else { + delete this.defines.SHOW_FOCUS; + } + + this.needsUpdate = true; + } + /** + * Defines whether manual Depth of Field should be enabled. + * + * @param {Boolean} enabled - Whether manual DoF should be enabled. + */ + + }, { + key: "setManualDepthOfFieldEnabled", + value: function setManualDepthOfFieldEnabled(enabled) { + if (enabled) { + this.defines.MANUAL_DOF = "1"; + } else { + delete this.defines.MANUAL_DOF; + } + + this.needsUpdate = true; + } + /** + * Defines whether the Vignette effect should be enabled. + * + * @param {Boolean} enabled - Whether the Vignette effect should be enabled. + */ + + }, { + key: "setVignetteEnabled", + value: function setVignetteEnabled(enabled) { + if (enabled) { + this.defines.VIGNETTE = "1"; + } else { + delete this.defines.VIGNETTE; + } + + this.needsUpdate = true; + } + /** + * Defines whether the pentagonal blur effect should be enabled. + * + * @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled. + */ + + }, { + key: "setPentagonEnabled", + value: function setPentagonEnabled(enabled) { + if (enabled) { + this.defines.PENTAGON = "1"; + } else { + delete this.defines.PENTAGON; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the automatic shader focus. + * + * @param {Boolean} enabled - Whether the shader focus should be enabled. + */ + + }, { + key: "setShaderFocusEnabled", + value: function setShaderFocusEnabled(enabled) { + if (enabled) { + this.defines.SHADER_FOCUS = "1"; + } else { + delete this.defines.SHADER_FOCUS; + } + + this.needsUpdate = true; + } + /** + * Defines whether the dithering should compute noise. + * + * @param {Boolean} enabled - Whether noise-based dithering should be enabled. + */ + + }, { + key: "setNoiseEnabled", + value: function setNoiseEnabled(enabled) { + if (enabled) { + this.defines.NOISE = "1"; + } else { + delete this.defines.NOISE; + } + + this.needsUpdate = true; + } + /** + * Sets the texel size. + * + * @param {Number} x - The texel width. + * @param {Number} y - The texel height. + */ + + }, { + key: "setTexelSize", + value: function setTexelSize(x, y) { + this.uniforms.texelSize.value.set(x, y); + this.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5); + } + /** + * Adopts the near and far plane and the focal length of the given camera. + * + * @param {PerspectiveCamera} camera - The main camera. + */ + + }, { + key: "adoptCameraSettings", + value: function adoptCameraSettings(camera) { + if (camera !== null) { + this.uniforms.cameraNear.value = camera.near; + this.uniforms.cameraFar.value = camera.far; + this.uniforms.focalLength.value = camera.getFocalLength(); // unit: mm. + } + } + }]); + + inherits(RealisticBokehMaterial, _ShaderMaterial); + + return RealisticBokehMaterial; + }(ShaderMaterial); + + var fragment$16 = "#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec2 center;\r\nuniform float aspect;\r\nuniform float waveSize;\r\nuniform float radius;\r\nuniform float maxRadius;\r\nuniform float amplitude;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\r\n\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\r\n\tfloat distance = sqrt(dot(difference, difference)) * vSize;\r\n\r\n\tvec2 displacement = vec2(0.0);\r\n\r\n\tif(distance > radius) {\r\n\r\n\t\tif(distance < radius + waveSize) {\r\n\r\n\t\t\tfloat angle = (distance - radius) * PI2 / waveSize;\r\n\t\t\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\r\n\r\n\t\t\tfloat extent = maxRadius + waveSize;\r\n\t\t\tfloat decay = max(extent - distance * distance, 0.0) / extent;\r\n\r\n\t\t\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\r\n\r\n}\r\n"; + var vertex$16 = "uniform float size;\r\nuniform float scale;\r\nuniform float cameraDistance;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvSize = (0.1 * cameraDistance) / size;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A shock wave shader material. + * + * Based on a Gist by Jean-Philippe Sarda: + * https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda + */ + + var ShockWaveMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new shock wave material. + * + * @param {Object} [options] - The options. + * @param {Number} [options.waveSize=0.2] - The wave size. + * @param {Number} [options.amplitude=0.05] - The distortion amplitude. + */ + function ShockWaveMaterial() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ShockWaveMaterial); + + var settings = Object.assign({ + maxRadius: 1.0, + waveSize: 0.2, + amplitude: 0.05 + }, options); + return possibleConstructorReturn(this, getPrototypeOf$2(ShockWaveMaterial).call(this, { + type: "ShockWaveMaterial", + uniforms: { + tDiffuse: new Uniform(null), + center: new Uniform(new Vector2(0.5, 0.5)), + aspect: new Uniform(1.0), + cameraDistance: new Uniform(1.0), + size: new Uniform(1.0), + radius: new Uniform(-settings.waveSize), + maxRadius: new Uniform(settings.maxRadius), + waveSize: new Uniform(settings.waveSize), + amplitude: new Uniform(settings.amplitude) + }, + fragmentShader: fragment$16, + vertexShader: vertex$16, + depthWrite: false, + depthTest: false + })); + } + + inherits(ShockWaveMaterial, _ShaderMaterial); + + return ShockWaveMaterial; + }(ShaderMaterial); + + var fragment$17 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tWeights;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\t// Fetch the blending weights for current pixel.\r\n\tvec4 a;\r\n\ta.xz = texture2D(tWeights, vUv).xz;\r\n\ta.y = texture2D(tWeights, vOffset.zw).g;\r\n\ta.w = texture2D(tWeights, vOffset.xy).a;\r\n\r\n\tvec4 color;\r\n\r\n\t// Check if there is any blending weight with a value greater than 0.0.\r\n\tif(dot(a, vec4(1.0)) < 1e-5) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\r\n\t} else {\r\n\r\n\t\t/* Up to four lines can be crossing a pixel (one through each edge).\r\n\t\t * The line with the maximum weight for each direction is favoured.\r\n\t\t */\r\n\r\n\t\tvec2 offset;\r\n\t\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\r\n\t\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\r\n\r\n\t\t// Go in the direction with the maximum weight (horizontal vs. vertical).\r\n\t\tif(abs(offset.x) > abs(offset.y)) {\r\n\r\n\t\t\toffset.y = 0.0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\toffset.x = 0.0;\r\n\r\n\t\t}\r\n\r\n\t\t// Fetch the opposite color and lerp by hand.\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\t\tvec2 coord = vUv + sign(offset) * texelSize;\r\n\t\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\r\n\t\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\r\n\r\n\t\t// Gamma correction.\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\r\n\t\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\r\n\t\tcolor = mix(color, oppositeColor, s);\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$17 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Subpixel Morphological Antialiasing. + * + * This material is used to render the final antialiasing. + */ + + var SMAABlendMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new SMAA blend material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function SMAABlendMaterial() { + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, SMAABlendMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(SMAABlendMaterial).call(this, { + type: "SMAABlendMaterial", + uniforms: { + tDiffuse: new Uniform(null), + tWeights: new Uniform(null), + texelSize: new Uniform(texelSize) + }, + fragmentShader: fragment$17, + vertexShader: vertex$17, + depthWrite: false, + depthTest: false + })); + } + + inherits(SMAABlendMaterial, _ShaderMaterial); + + return SMAABlendMaterial; + }(ShaderMaterial); + + var fragment$18 = "#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tArea;\r\nuniform sampler2D tSearch;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvec2 round(vec2 x) {\r\n\r\n\treturn sign(x) * floor(abs(x) + 0.5);\r\n\r\n}\r\n\r\nfloat searchLength(vec2 e, float bias, float scale) {\r\n\r\n\t// Not required if tSearch accesses are set to point.\r\n\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\r\n\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\r\n\r\n\te.r = bias + e.r * scale;\r\n\r\n\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\r\n\r\n}\r\n\r\nfloat searchXLeft(vec2 texCoord, float end) {\r\n\r\n\t/* @PSEUDO_GATHER4\r\n\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\r\n\t * sample between edge, thus fetching four edges in a row.\r\n\t * Sampling with different offsets in each direction allows to disambiguate\r\n\t * which edges are active from the four fetched ones.\r\n\t */\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\t// Correct the previously applied offset (-0.25, -0.125).\r\n\ttexCoord.x += 0.25 * texelSize.x;\r\n\r\n\t// The searches are biased by 1, so adjust the coords accordingly.\r\n\ttexCoord.x += texelSize.x;\r\n\r\n\t// Disambiguate the length added by the last step.\r\n\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\r\n\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchXRight(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.x -= 0.25 * texelSize.x;\r\n\ttexCoord.x -= texelSize.x;\r\n\ttexCoord.x -= 2.0 * texelSize.x;\r\n\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchYUp(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y; // Changed sign.\r\n\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nfloat searchYDown(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y; // Changed sign.\r\n\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nvec2 area(vec2 dist, float e1, float e2, float offset) {\r\n\r\n\t// Rounding prevents precision errors of bilinear filtering.\r\n\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\r\n\r\n\t// Scale and bias for texel space translation.\r\n\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\r\n\r\n\t// Move to proper place, according to the subpixel offset.\r\n\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\r\n\r\n\treturn texture2D(tArea, texCoord, 0.0).rg;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 weights = vec4(0.0);\r\n\tvec4 subsampleIndices = vec4(0.0);\r\n\tvec2 e = texture2D(tDiffuse, vUv).rg;\r\n\r\n\tif(e.g > 0.0) {\r\n\r\n\t\t// Edge at north.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the left.\r\n\t\tvec2 coords;\r\n\t\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\r\n\t\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\r\n\t\td.x = coords.x;\r\n\r\n\t\t/* Now fetch the left crossing edges, two at a time using bilinear\r\n\t\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\r\n\t\tvalue each edge has. */\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\r\n\r\n\t\t// Find the distance to the right.\r\n\t\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\r\n\t\td.y = coords.x;\r\n\r\n\t\t/* Translate distances to pixel units for better interleave arithmetic and\r\n\t\tmemory accesses. */\r\n\t\td = d / texelSize.x - vPixCoord.x;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the right crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\r\n\r\n\t\t// Pattern recognised, now get the actual area.\r\n\t\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\r\n\r\n\t}\r\n\r\n\tif(e.r > 0.0) {\r\n\r\n\t\t// Edge at west.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the top.\r\n\t\tvec2 coords;\r\n\t\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\r\n\t\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\r\n\t\td.x = coords.y;\r\n\r\n\t\t// Fetch the top crossing edges.\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\r\n\r\n\t\t// Find the distance to the bottom.\r\n\t\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\r\n\t\td.y = coords.y;\r\n\r\n\t\t// Distances in pixel units.\r\n\t\td = d / texelSize.y - vPixCoord.y;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the bottom crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\r\n\r\n\t\t// Get the area for this direction.\r\n\t\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = weights;\r\n\r\n}\r\n"; + var vertex$18 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvPixCoord = uv / texelSize;\r\n\r\n\t// Offsets for the searches (see @PSEUDO_GATHER4).\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\r\n\r\n\t// This indicates the ends of the loops.\r\n\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Subpixel Morphological Antialiasing. + * + * This material computes weights for detected edges. + */ + + var SMAAWeightsMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new SMAA weights material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function SMAAWeightsMaterial() { + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, SMAAWeightsMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(SMAAWeightsMaterial).call(this, { + type: "SMAAWeightsMaterial", + defines: { + // Configurable settings: + MAX_SEARCH_STEPS_INT: "8", + MAX_SEARCH_STEPS_FLOAT: "8.0", + // Non-configurable settings: + AREATEX_MAX_DISTANCE: "16.0", + AREATEX_PIXEL_SIZE: "(1.0 / vec2(160.0, 560.0))", + AREATEX_SUBTEX_SIZE: "(1.0 / 7.0)", + SEARCHTEX_SIZE: "vec2(66.0, 33.0)", + SEARCHTEX_PACKED_SIZE: "vec2(64.0, 16.0)" + }, + uniforms: { + tDiffuse: new Uniform(null), + tArea: new Uniform(null), + tSearch: new Uniform(null), + texelSize: new Uniform(texelSize) + }, + fragmentShader: fragment$18, + vertexShader: vertex$18, + depthWrite: false, + depthTest: false + })); + } + /** + * Sets the maximum amount of steps performed in the horizontal/vertical + * pattern searches, at each side of the pixel. + * + * In number of pixels, it's actually the double. So the maximum line length + * perfectly handled by, for example 16, is 64 (perfectly means that longer + * lines won't look as good, but are still antialiased). + * + * @param {Number} steps - The search steps. Range: [0, 112]. + */ + + + createClass(SMAAWeightsMaterial, [{ + key: "setOrthogonalSearchSteps", + value: function setOrthogonalSearchSteps(steps) { + this.defines.MAX_SEARCH_STEPS_INT = steps.toFixed("0"); + this.defines.MAX_SEARCH_STEPS_FLOAT = steps.toFixed("1"); + this.needsUpdate = true; + } + }]); + + inherits(SMAAWeightsMaterial, _ShaderMaterial); + + return SMAAWeightsMaterial; + }(ShaderMaterial); + + var fragment$19 = "#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float middleGrey;\r\nuniform float maxLuminance;\r\n\r\n#ifdef ADAPTED_LUMINANCE\r\n\r\n\tuniform sampler2D luminanceMap;\r\n\r\n#else\r\n\r\n\tuniform float averageLuminance;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvec3 toneMap(vec3 c) {\r\n\r\n\t#ifdef ADAPTED_LUMINANCE\r\n\r\n\t\t// Get the calculated average luminance by sampling the center.\r\n\t\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\r\n\r\n\t#else\r\n\r\n\t\tfloat lumAvg = averageLuminance;\r\n\r\n\t#endif\r\n\r\n\t// Calculate the luminance of the current pixel.\r\n\tfloat lumPixel = linearToRelativeLuminance(c);\r\n\r\n\t// Apply the modified operator (Reinhard Eq. 4).\r\n\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\r\n\r\n\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\r\n\r\n\treturn lumCompressed * c;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\r\n\r\n\t#include \r\n\r\n}\r\n"; + var vertex$19 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Full-screen tone-mapping shader material. + * + * This material supports dithering. + * + * Reference: + * http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf + */ + + var ToneMappingMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new tone mapping material. + */ + function ToneMappingMaterial() { + classCallCheck(this, ToneMappingMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(ToneMappingMaterial).call(this, { + type: "ToneMappingMaterial", + uniforms: { + tDiffuse: new Uniform(null), + luminanceMap: new Uniform(null), + averageLuminance: new Uniform(1.0), + maxLuminance: new Uniform(16.0), + middleGrey: new Uniform(0.6) + }, + fragmentShader: fragment$19, + vertexShader: vertex$19, + depthWrite: false, + depthTest: false + })); + } + + inherits(ToneMappingMaterial, _ShaderMaterial); + + return ToneMappingMaterial; + }(ShaderMaterial); + + /** + * A collection of shader materials that are used in the post processing passes. + * + * @module postprocessing/materials + */ + + /** + * An abstract pass. + * + * Passes that do not rely on the depth buffer should explicitly disable the + * depth test and depth write in their respective shader materials. + * + * @implements {Resizable} + * @implements {Disposable} + */ + + var Pass = + /*#__PURE__*/ + function () { + /** + * Constructs a new pass. + * + * @param {String} [name] - The name of this pass. + * @param {Scene} [scene] - The scene to render. + * @param {Camera} [camera] - The camera. + * @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}). + */ + function Pass() { + var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "Pass"; + var scene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Scene(); + var camera = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new OrthographicCamera(-1, 1, 1, -1, 0, 1); + var quad = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Mesh(new PlaneBufferGeometry(2, 2), null); + + classCallCheck(this, Pass); + + /** + * The name of this pass. + * + * @type {String} + */ + this.name = name; + /** + * The scene to render. + * + * @type {Scene} + * @protected + */ + + this.scene = scene; + /** + * The camera. + * + * @type {Camera} + * @protected + */ + + this.camera = camera; + /** + * A quad mesh that fills the screen. + * + * @type {Mesh} + * @private + */ + + this.quad = quad; + + if (this.quad !== null) { + this.quad.frustumCulled = false; + + if (this.scene !== null) { + this.scene.add(this.quad); + } + } + /** + * Indicates whether this pass should render to screen. + * + * @type {Boolean} + */ + + + this.renderToScreen = false; + /** + * Indicates whether this pass should be executed. + * + * @type {Boolean} + */ + + this.enabled = true; + /** + * Indicates whether the {@link EffectComposer} should swap the frame + * buffers after this pass has finished rendering. + * + * Set this to `false` if this pass doesn't render to the output buffer or + * the screen. Otherwise, the contents of the input buffer will be lost. + * + * @type {Boolean} + */ + + this.needsSwap = true; + } + /** + * The fullscreen material. + * + * @type {Material} + */ + + + createClass(Pass, [{ + key: "render", + + /** + * Renders the effect. + * + * This is an abstract method that must be overridden. + * + * @abstract + * @throws {Error} An error is thrown if the method is not overridden. + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + throw new Error("Render method not implemented!"); + } + /** + * Updates this pass with the renderer's size. + * + * You may override this method in case you want to be informed about the main + * render size. + * + * The {@link EffectComposer} calls this method before this pass is + * initialized and every time its own size is updated. + * + * @param {Number} width - The renderer's width. + * @param {Number} height - The renderer's height. + * @example this.myRenderTarget.setSize(width, height); + */ + + }, { + key: "setSize", + value: function setSize(width, height) {} + /** + * Performs initialization tasks. + * + * By overriding this method you gain access to the renderer. You'll also be + * able to configure your custom render targets to use the appropriate format + * (RGB or RGBA). + * + * The provided renderer can be used to warm up special off-screen render + * targets by performing a preliminary render operation. + * + * The {@link EffectComposer} calls this method when this pass is added to its + * queue, but not before its size has been set. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + * @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; } + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) {} + /** + * Performs a shallow search for properties that define a dispose method and + * deletes them. The pass will be inoperative after this method was called! + * + * Disposable objects: + * - render targets + * - materials + * - textures + * + * The {@link EffectComposer} calls this method when it is being destroyed. + * You may, however, use it independently to free memory when you are certain + * that you don't need this pass anymore. + */ + + }, { + key: "dispose", + value: function dispose() { + var key; + + var _arr = Object.keys(this); + + for (var _i = 0; _i < _arr.length; _i++) { + key = _arr[_i]; + + if (this[key] !== null && typeof this[key].dispose === "function") { + this[key].dispose(); + this[key] = null; + } + } + + if (this.material !== null) { + this.material.dispose(); + } + } + }, { + key: "material", + get: function get() { + return this.quad !== null ? this.quad.material : null; + } + /** + * Sets the fullscreen material. + * + * The material will be assigned to the quad mesh that fills the screen. + * + * @type {Material} + */ + , + set: function set(value) { + if (this.quad !== null) { + this.quad.material = value; + } + } + }]); + + return Pass; + }(); + + /** + * An efficient, incremental blur pass. + * + * Note: This pass allows the input and output buffer to be the same. + */ + + var BlurPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new blur pass. + * + * @param {Object} [options] - The options. + * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. + * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. + */ + function BlurPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, BlurPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(BlurPass).call(this, "BlurPass")); + /** + * A render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetX = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetX.texture.name = "Blur.TargetX"; + _this.renderTargetX.texture.generateMipmaps = false; + /** + * A second render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetY = _this.renderTargetX.clone(); + _this.renderTargetY.texture.name = "Blur.TargetY"; + /** + * The resolution scale. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.resolutionScale = options.resolutionScale !== undefined ? options.resolutionScale : 0.5; + /** + * A convolution shader material. + * + * @type {ConvolutionMaterial} + * @private + */ + + _this.convolutionMaterial = new ConvolutionMaterial(); + /** + * A convolution shader material that uses dithering. + * + * @type {ConvolutionMaterial} + * @private + */ + + _this.ditheredConvolutionMaterial = new ConvolutionMaterial(); + _this.ditheredConvolutionMaterial.dithering = true; + /** + * Whether the blurred result should also be dithered using noise. + * + * @type {Boolean} + */ + + _this.dithering = false; + _this.kernelSize = options.kernelSize; + return _this; + } + /** + * The absolute width of the internal render targets. + * + * @type {Number} + */ + + + createClass(BlurPass, [{ + key: "render", + + /** + * Blurs the input buffer and writes the result to the output buffer. The + * input buffer remains intact, unless its also the output buffer. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var renderTargetX = this.renderTargetX; + var renderTargetY = this.renderTargetY; + var material = this.convolutionMaterial; + var uniforms = material.uniforms; + var kernel = material.getKernel(); + var lastRT = inputBuffer; + var destRT; + var i, l; + this.material = material; // Apply the multi-pass blur. + + for (i = 0, l = kernel.length - 1; i < l; ++i) { + // Alternate between targets. + destRT = i % 2 === 0 ? renderTargetX : renderTargetY; + uniforms.kernel.value = kernel[i]; + uniforms.tDiffuse.value = lastRT.texture; + renderer.render(scene, camera, destRT); + lastRT = destRT; + } + + if (this.dithering) { + material = this.ditheredConvolutionMaterial; + uniforms = material.uniforms; + this.material = material; + } + + uniforms.kernel.value = kernel[i]; + uniforms.tDiffuse.value = lastRT.texture; + renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + width = Math.max(1, Math.floor(width * this.resolutionScale)); + height = Math.max(1, Math.floor(height * this.resolutionScale)); + this.renderTargetX.setSize(width, height); + this.renderTargetY.setSize(width, height); + this.convolutionMaterial.setTexelSize(1.0 / width, 1.0 / height); + this.ditheredConvolutionMaterial.setTexelSize(1.0 / width, 1.0 / height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + if (!alpha) { + this.renderTargetX.texture.format = RGBFormat; + this.renderTargetY.texture.format = RGBFormat; + } + } + }, { + key: "width", + get: function get() { + return this.renderTargetX.width; + } + /** + * The absolute height of the internal render targets. + * + * @type {Number} + */ + + }, { + key: "height", + get: function get() { + return this.renderTargetX.height; + } + /** + * The kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.convolutionMaterial.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE; + this.convolutionMaterial.kernelSize = value; + this.ditheredConvolutionMaterial.kernelSize = value; + } + }]); + + inherits(BlurPass, _Pass); + + return BlurPass; + }(Pass); + + /** + * A bloom pass. + * + * This pass renders a scene with superimposed blur by utilizing the fast Kawase + * convolution approach. + */ + + var BloomPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new bloom pass. + * + * @param {Object} [options] - The options. + * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. + * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. + * @param {Number} [options.intensity=1.0] - The strength of the bloom effect. + * @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene. + * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors. + */ + function BloomPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, BloomPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(BloomPass).call(this, "BloomPass")); + /** + * A render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTarget = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTarget.texture.name = "Bloom.Target"; + _this.renderTarget.texture.generateMipmaps = false; + /** + * A blur pass. + * + * @type {BlurPass} + * @private + */ + + _this.blurPass = new BlurPass(options); + /** + * A combine shader material. + * + * @type {CombineMaterial} + * @private + */ + + _this.combineMaterial = new CombineMaterial(options.screenMode !== undefined ? options.screenMode : true); + _this.intensity = options.intensity; + /** + * A luminosity shader material. + * + * @type {LuminosityMaterial} + * @private + */ + + _this.luminosityMaterial = new LuminosityMaterial(true); + _this.distinction = options.distinction; + return _this; + } + /** + * The resolution scale. + * + * @type {Number} + */ + + + createClass(BloomPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var blurPass = this.blurPass; + var luminosityMaterial = this.luminosityMaterial; + var combineMaterial = this.combineMaterial; + var renderTarget = this.renderTarget; // Luminance filter. + + this.material = luminosityMaterial; + luminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(scene, camera, renderTarget); // Convolution phase. + + blurPass.render(renderer, renderTarget, renderTarget); + + if (this.blend) { + // Render the original scene with superimposed blur. + this.material = combineMaterial; + combineMaterial.uniforms.texture1.value = inputBuffer.texture; + combineMaterial.uniforms.texture2.value = renderTarget.texture; + renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer); + } + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.blurPass.setSize(width, height); + width = this.blurPass.width; + height = this.blurPass.height; + this.renderTarget.setSize(width, height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.blurPass.initialize(renderer, alpha); + + if (!alpha) { + this.renderTarget.texture.format = RGBFormat; + } + } + }, { + key: "resolutionScale", + get: function get() { + return this.blurPass.resolutionScale; + } + /** + * You need to call {@link EffectComposer#setSize} after changing this value. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5; + this.blurPass.resolutionScale = value; + } + /** + * The blur kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.blurPass.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE; + this.blurPass.kernelSize = value; + } + /** + * The overall intensity of the effect. + * + * @type {Number} + */ + + }, { + key: "intensity", + get: function get() { + return this.combineMaterial.uniforms.opacity2.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.combineMaterial.uniforms.opacity2.value = value; + } + /** + * The luminance distinction factor. + * + * @type {Number} + */ + + }, { + key: "distinction", + get: function get() { + return this.luminosityMaterial.uniforms.distinction.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.luminosityMaterial.uniforms.distinction.value = value; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.blurPass.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.blurPass.dithering = value; + } + /** + * Indicates whether the effect should be applied to the input buffer. + * + * @type {Boolean} + */ + + }, { + key: "blend", + get: function get() { + return this.needsSwap; + } + /** + * If disabled, the input buffer will remain unaffected. + * + * You may use the {@link BloomPass#overlay} texture to apply the effect to + * your scene. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.needsSwap = value; + } + /** + * The effect overlay texture. + * + * @type {Texture} + */ + + }, { + key: "overlay", + get: function get() { + return this.renderTarget.texture; + } + }]); + + inherits(BloomPass, _Pass); + + return BloomPass; + }(Pass); + + /** + * A Depth of Field (DoF) pass using a bokeh shader. + * + * This pass requires a {@link EffectComposer#depthTexture}. + */ + + var BokehPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new bokeh pass. + * + * @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings. + * @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details. + */ + function BokehPass(camera) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, BokehPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(BokehPass).call(this, "BokehPass")); + _this.material = new BokehMaterial(camera, options); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(BokehPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + this.material.uniforms.tDepth.value = inputBuffer.depthTexture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.material.uniforms.aspect.value = width / height; + } + }]); + + inherits(BokehPass, _Pass); + + return BokehPass; + }(Pass); + + /** + * A pass that disables the stencil test. + */ + + var ClearMaskPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new clear mask pass. + */ + function ClearMaskPass() { + var _this; + + classCallCheck(this, ClearMaskPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ClearMaskPass).call(this, "ClearMaskPass", null, null, null)); + _this.needsSwap = false; + return _this; + } + /** + * Disables the global stencil test. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(ClearMaskPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + renderer.state.buffers.stencil.setTest(false); + } + }]); + + inherits(ClearMaskPass, _Pass); + + return ClearMaskPass; + }(Pass); + + /** + * Used for saving the original clear color of the renderer. + * + * @type {Color} + * @private + */ + + var color = new Color(); + /** + * A pass that clears the input buffer or the screen. + * + * You can prevent specific bits from being cleared by setting either the + * autoClearColor, autoClearStencil or autoClearDepth properties of the renderer + * to false. + */ + + var ClearPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new clear pass. + * + * @param {Object} [options] - Additional options. + * @param {Color} [options.clearColor=null] - An override clear color. + * @param {Number} [options.clearAlpha=0.0] - An override clear alpha. + */ + function ClearPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ClearPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ClearPass).call(this, "ClearPass", null, null, null)); + _this.needsSwap = false; + /** + * The clear color. + * + * @type {Color} + */ + + _this.clearColor = options.clearColor !== undefined ? options.clearColor : null; + /** + * The clear alpha. + * + * @type {Number} + */ + + _this.clearAlpha = options.clearAlpha !== undefined ? options.clearAlpha : 0.0; + return _this; + } + /** + * Clears the input buffer or the screen. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(ClearPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var clearColor = this.clearColor; + var clearAlpha; + + if (clearColor !== null) { + color.copy(renderer.getClearColor()); + clearAlpha = renderer.getClearAlpha(); + renderer.setClearColor(clearColor, this.clearAlpha); + } + + renderer.setRenderTarget(this.renderToScreen ? null : inputBuffer); + renderer.clear(); + + if (clearColor !== null) { + renderer.setClearColor(color, clearAlpha); + } + } + }]); + + inherits(ClearPass, _Pass); + + return ClearPass; + }(Pass); + + /** + * A dot screen pass. + */ + + var DotScreenPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new dot screen pass. + * + * @param {Object} [options] - The options. + * @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white). + * @param {Number} [options.angle=1.57] - The angle of the pattern. + * @param {Number} [options.scale=1.0] - The scale of the overall effect. + * @param {Number} [options.intensity=1.0] - The intensity of the effect. + */ + function DotScreenPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DotScreenPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(DotScreenPass).call(this, "DotScreenPass")); + _this.material = new DotScreenMaterial(options); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(DotScreenPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + width = Math.max(1, width); + height = Math.max(1, height); + this.material.uniforms.offsetRepeat.value.z = width; + this.material.uniforms.offsetRepeat.value.w = height; + } + }]); + + inherits(DotScreenPass, _Pass); + + return DotScreenPass; + }(Pass); + + /** + * A film pass. + * + * Provides various cinematic effects. + */ + + var FilmPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new film pass. + * + * @param {Object} [options] - The options. See {@link FilmMaterial} for more options. + * @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height. + * @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height. + * @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width. + */ + function FilmPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, FilmPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(FilmPass).call(this, "FilmPass")); + _this.material = new FilmMaterial(options); + /** + * The amount of scanlines, relative to the screen height. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.scanlineDensity = options.scanlineDensity === undefined ? 1.25 : options.scanlineDensity; + /** + * The grid scale, relative to the screen height. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.gridScale = options.gridScale === undefined ? 1.0 : Math.max(options.gridScale, 1e-6); + /** + * The grid line width. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.gridLineWidth = options.gridLineWidth === undefined ? 0.0 : Math.max(options.gridLineWidth, 0.0); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(FilmPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + this.material.uniforms.time.value += delta; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + var aspect = width / height; + var gridScale = this.gridScale * (height * 0.125); + this.material.uniforms.scanlineCount.value = Math.round(height * this.scanlineDensity); + this.material.uniforms.gridScale.value.set(aspect * gridScale, gridScale); + this.material.uniforms.gridLineWidth.value = gridScale / height + this.gridLineWidth; + } + }]); + + inherits(FilmPass, _Pass); + + return FilmPass; + }(Pass); + + /** + * Returns a random integer in the specified range. + * + * @private + * @param {Number} low - The lowest possible value. + * @param {Number} high - The highest possible value. + * @return {Number} The random value. + */ + + function randomInt(low, high) { + return low + Math.floor(Math.random() * (high - low + 1)); + } + /** + * Returns a random float in the specified range. + * + * @private + * @param {Number} low - The lowest possible value. + * @param {Number} high - The highest possible value. + * @return {Number} The random value. + */ + + + function randomFloat(low, high) { + return low + Math.random() * (high - low); + } + /** + * A glitch pass. + */ + + + var GlitchPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new glitch pass. + * + * @param {Object} [options] - The options. + * @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created. + * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided. + */ + function GlitchPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, GlitchPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(GlitchPass).call(this, "GlitchPass")); + _this.material = new GlitchMaterial(); + /** + * A perturbation map. + * + * @type {Texture} + * @private + */ + + _this.texture = null; + _this.perturbMap = options.perturbMap !== undefined ? options.perturbMap : _this.generatePerturbMap(options.dtSize); + _this.perturbMap.name = "Glitch.Perturbation"; + _this.perturbMap.generateMipmaps = false; + /** + * The effect mode. + * + * @type {GlitchMode} + */ + + _this.mode = GlitchMode.SPORADIC; + /** + * A counter for the glitch activation and deactivation. + * + * @type {Number} + * @private + */ + + _this.counter = 0; + /** + * A random break point for the sporadic glitch activation. + * + * @type {Number} + * @private + */ + + _this.breakPoint = randomInt(120, 240); + return _this; + } + /** + * The current perturbation map. + * + * @type {Texture} + */ + + + createClass(GlitchPass, [{ + key: "generatePerturbMap", + + /** + * Destroys the current perturbation map and replaces it with a new one. + * + * @param {Number} [size=64] - The texture size. + * @return {DataTexture} The perturbation texture. + */ + value: function generatePerturbMap() { + var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 64; + var pixels = size * size; + var data = new Float32Array(pixels * 3); + var dt = this.perturbMap; + var i, x; + + for (i = 0; i < pixels; ++i) { + x = Math.random(); + data[i * 3] = x; + data[i * 3 + 1] = x; + data[i * 3 + 2] = x; + } + + if (dt !== null) { + dt.dispose(); + } + + dt = new DataTexture(data, size, size, RGBFormat, FloatType); + dt.needsUpdate = true; + this.perturbMap = dt; + return dt; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + }, { + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var mode = this.mode; + var counter = this.counter; + var breakPoint = this.breakPoint; + var uniforms = this.material.uniforms; + uniforms.tDiffuse.value = inputBuffer.texture; + uniforms.seed.value = Math.random(); + uniforms.active.value = true; + + if (counter % breakPoint === 0 || mode === GlitchMode.CONSTANT_WILD) { + uniforms.amount.value = Math.random() / 30.0; + uniforms.angle.value = randomFloat(-Math.PI, Math.PI); + uniforms.seedX.value = randomFloat(-1.0, 1.0); + uniforms.seedY.value = randomFloat(-1.0, 1.0); + uniforms.distortionX.value = randomFloat(0.0, 1.0); + uniforms.distortionY.value = randomFloat(0.0, 1.0); + this.breakPoint = randomInt(120, 240); + this.counter = 0; + } else { + if (counter % breakPoint < breakPoint / 5 || mode === GlitchMode.CONSTANT_MILD) { + uniforms.amount.value = Math.random() / 90.0; + uniforms.angle.value = randomFloat(-Math.PI, Math.PI); + uniforms.distortionX.value = randomFloat(0.0, 1.0); + uniforms.distortionY.value = randomFloat(0.0, 1.0); + uniforms.seedX.value = randomFloat(-0.3, 0.3); + uniforms.seedY.value = randomFloat(-0.3, 0.3); + } else { + // Sporadic. + uniforms.active.value = false; + } + } + + ++this.counter; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + }, { + key: "perturbMap", + get: function get() { + return this.texture; + } + /** + * Assigning a new perturbation map does not destroy the current one! + * + * @type {Texture} + */ + , + set: function set(value) { + this.texture = value; + this.material.uniforms.tPerturb.value = value; + } + }]); + + inherits(GlitchPass, _Pass); + + return GlitchPass; + }(Pass); + /** + * A glitch mode enumeration. + * + * @type {Object} + * @property {Number} SPORADIC - Sporadic glitches. + * @property {Number} CONSTANT_MILD - Constant mild glitches. + * @property {Number} CONSTANT_WILD - Constant wild glitches. + */ + + var GlitchMode = { + SPORADIC: 0, + CONSTANT_MILD: 1, + CONSTANT_WILD: 2 + }; + + /** + * A pass that renders a given scene directly on screen or into the read buffer + * for further processing. + */ + + var RenderPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new render pass. + * + * @param {Scene} scene - The scene to render. + * @param {Camera} camera - The camera to use to render the scene. + * @param {Object} [options] - Additional options. + * @param {Material} [options.overrideMaterial=null] - An override material for the scene. + * @param {Color} [options.clearColor=null] - An override clear color. + * @param {Number} [options.clearAlpha=1.0] - An override clear alpha. + * @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly. + * @param {Boolean} [options.clear=true] - Whether all buffers should be cleared. + */ + function RenderPass(scene, camera) { + var _this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, RenderPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(RenderPass).call(this, "RenderPass", scene, camera, null)); + _this.needsSwap = false; + /** + * A clear pass. + * + * @type {ClearPass} + */ + + _this.clearPass = new ClearPass(options); + /** + * An override material. + * + * @type {Material} + */ + + _this.overrideMaterial = options.overrideMaterial !== undefined ? options.overrideMaterial : null; + /** + * Indicates whether the depth buffer should be cleared explicitly. + * + * @type {Boolean} + */ + + _this.clearDepth = options.clearDepth !== undefined ? options.clearDepth : false; + /** + * Indicates whether the color, depth and stencil buffers should be cleared. + * + * Even with clear set to true you can prevent specific buffers from being + * cleared by setting either the autoClearColor, autoClearStencil or + * autoClearDepth properties of the renderer to false. + * + * @type {Boolean} + */ + + _this.clear = options.clear !== undefined ? options.clear : true; + return _this; + } + /** + * Renders the scene. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(RenderPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var renderTarget = this.renderToScreen ? null : inputBuffer; + var overrideMaterial = scene.overrideMaterial; + + if (this.clear) { + this.clearPass.renderToScreen = this.renderToScreen; + this.clearPass.render(renderer, inputBuffer); + } else if (this.clearDepth) { + renderer.setRenderTarget(renderTarget); + renderer.clearDepth(); + } + + scene.overrideMaterial = this.overrideMaterial; + renderer.render(scene, this.camera, renderTarget); + scene.overrideMaterial = overrideMaterial; + } + }]); + + inherits(RenderPass, _Pass); + + return RenderPass; + }(Pass); + + /** + * Clamps a given value. + * + * @private + * @param {Number} value - The value to clamp. + * @param {Number} min - The lowest possible value. + * @param {Number} max - The highest possible value. + * @return {Number} The clamped value. + */ + + function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); + } + /** + * A crepuscular rays pass. + */ + + + var GodRaysPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new god rays pass. + * + * @param {Scene} scene - The main scene. + * @param {Camera} camera - The main camera. + * @param {Object3D} lightSource - The main light source. + * @param {Object} [options] - The options. + * @param {Number} [options.density=0.96] - The density of the light rays. + * @param {Number} [options.decay=0.93] - An illumination decay factor. + * @param {Number} [options.weight=0.4] - A light ray weight factor. + * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. + * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. + * @param {Number} [options.intensity=1.0] - A constant factor for additive blending. + * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. + * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. + * @param {Number} [options.samples=60] - The number of samples per pixel. + * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors. + */ + function GodRaysPass(scene, camera, lightSource) { + var _this; + + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + classCallCheck(this, GodRaysPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(GodRaysPass).call(this, "GodRaysPass")); + /** + * A scene that only contains the light source. + * + * @type {Scene} + * @private + */ + + _this.lightScene = new Scene(); + /** + * The main scene. + * + * @type {Scene} + * @private + */ + + _this.mainScene = scene; + /** + * The main camera. + * + * @type {Camera} + * @private + */ + + _this.mainCamera = camera; + /** + * A render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetX = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetX.texture.name = "GodRays.TargetX"; + _this.renderTargetX.texture.generateMipmaps = false; + /** + * A second render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetY = _this.renderTargetX.clone(); + _this.renderTargetY.texture.name = "GodRays.TargetY"; + /** + * A render target for the masked light scene. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetMask = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter + }); + _this.renderTargetMask.texture.name = "GodRays.Mask"; + _this.renderTargetMask.texture.generateMipmaps = false; + /** + * A pass that only renders the light source. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassLight = new RenderPass(_this.lightScene, _this.mainCamera, { + clearColor: new Color(0x000000) + }); + /** + * A pass that renders the masked scene over the light. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassMask = new RenderPass(_this.mainScene, _this.mainCamera, { + overrideMaterial: new MeshBasicMaterial({ + color: 0x000000 + }) + }); + _this.renderPassMask.clear = false; + /** + * A blur pass. + * + * @type {BlurPass} + * @private + */ + + _this.blurPass = new BlurPass(options); + /** + * The light source. + * + * @type {Object3D} + */ + + _this.lightSource = lightSource; + /** + * The light position in screen space. + * + * @type {Vector3} + * @private + */ + + _this.screenPosition = new Vector3(); + /** + * A god rays shader material. + * + * @type {GodRaysMaterial} + * @private + */ + + _this.godRaysMaterial = new GodRaysMaterial(options); + _this.godRaysMaterial.uniforms.lightPosition.value = _this.screenPosition; + _this.samples = options.samples; + /** + * A combine shader material. + * + * @type {CombineMaterial} + * @private + */ + + _this.combineMaterial = new CombineMaterial(options.screenMode !== undefined ? options.screenMode : true); + _this.intensity = options.intensity; + return _this; + } + /** + * The resolution scale. + * + * @type {Number} + */ + + + createClass(GodRaysPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var mainScene = this.mainScene; + var lightSource = this.lightSource; + var screenPosition = this.screenPosition; + var godRaysMaterial = this.godRaysMaterial; + var combineMaterial = this.combineMaterial; + var renderTargetMask = this.renderTargetMask; + var renderTargetX = this.renderTargetX; + var renderTargetY = this.renderTargetY; + var background, parent; // Compute the screen light position and translate it to [0.0, 1.0]. + + screenPosition.copy(lightSource.position).project(this.mainCamera); + screenPosition.x = clamp((screenPosition.x + 1.0) * 0.5, 0.0, 1.0); + screenPosition.y = clamp((screenPosition.y + 1.0) * 0.5, 0.0, 1.0); + parent = lightSource.parent; + background = mainScene.background; + mainScene.background = null; + this.lightScene.add(lightSource); + /* First, render the light source. Then render the scene into the same + buffer using a mask override material with depth test enabled. */ + + this.renderPassLight.render(renderer, renderTargetMask); + this.renderPassMask.render(renderer, renderTargetMask); + + if (parent !== null) { + parent.add(lightSource); + } + + mainScene.background = background; // Blur the masked scene to reduce artifacts. + + this.blurPass.render(renderer, this.renderTargetMask, renderTargetX); // Blur the masked scene along radial lines towards the light source. + + this.material = godRaysMaterial; + godRaysMaterial.uniforms.tDiffuse.value = renderTargetX.texture; + renderer.render(scene, camera, renderTargetY); + + if (this.blend) { + // Combine the god rays with the scene colors. + this.material = combineMaterial; + combineMaterial.uniforms.texture1.value = inputBuffer.texture; + combineMaterial.uniforms.texture2.value = renderTargetY.texture; + renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer); + } + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.renderPassLight.setSize(width, height); + this.renderPassMask.setSize(width, height); + this.blurPass.setSize(width, height); + width = this.blurPass.width; + height = this.blurPass.height; + this.renderTargetMask.setSize(width, height); + this.renderTargetX.setSize(width, height); + this.renderTargetY.setSize(width, height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.renderPassLight.initialize(renderer, alpha); + this.renderPassMask.initialize(renderer, alpha); + this.blurPass.initialize(renderer, alpha); + + if (!alpha) { + this.renderTargetMask.texture.format = RGBFormat; + this.renderTargetX.texture.format = RGBFormat; + this.renderTargetY.texture.format = RGBFormat; + } + } + }, { + key: "resolutionScale", + get: function get() { + return this.blurPass.resolutionScale; + } + /** + * You need to call {@link EffectComposer#setSize} after changing this value. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5; + this.blurPass.resolutionScale = value; + } + /** + * The blur kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.blurPass.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE; + this.blurPass.kernelSize = value; + } + /** + * The overall intensity of the effect. + * + * @type {Number} + */ + + }, { + key: "intensity", + get: function get() { + return this.combineMaterial.uniforms.opacity2.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.combineMaterial.uniforms.opacity2.value = value; + } + /** + * The number of samples per pixel. + * + * @type {Number} + */ + + }, { + key: "samples", + get: function get() { + return Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT); + } + /** + * This value must be carefully chosen. A higher value directly increases the + * GPU load. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 60; + value = Math.floor(value); + this.godRaysMaterial.defines.NUM_SAMPLES_FLOAT = value.toFixed(1); + this.godRaysMaterial.defines.NUM_SAMPLES_INT = value.toFixed(0); + this.godRaysMaterial.needsUpdate = true; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.godRaysMaterial.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + if (this.dithering !== value) { + this.godRaysMaterial.dithering = value; + this.godRaysMaterial.needsUpdate = true; + } + } + /** + * Indicates whether the effect should be applied to the input buffer. + * + * @type {Boolean} + */ + + }, { + key: "blend", + get: function get() { + return this.needsSwap; + } + /** + * If disabled, the input buffer will remain unaffected. + * + * You may use the {@link BloomPass#overlay} texture to apply the effect to + * your scene. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.needsSwap = value; + } + /** + * The effect overlay texture. + * + * @type {Texture} + */ + + }, { + key: "overlay", + get: function get() { + return this.renderTargetY.texture; + } + }]); + + inherits(GodRaysPass, _Pass); + + return GodRaysPass; + }(Pass); + + /** + * A mask pass. + */ + + var MaskPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new mask pass. + * + * @param {Scene} scene - The scene to render. + * @param {Camera} camera - The camera to use. + */ + function MaskPass(scene, camera) { + var _this; + + classCallCheck(this, MaskPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(MaskPass).call(this, "MaskPass", scene, camera, null)); + _this.needsSwap = false; + /** + * Inverse flag. + * + * @type {Boolean} + */ + + _this.inverse = false; + /** + * Stencil buffer clear flag. + * + * @type {Boolean} + */ + + _this.clearStencil = true; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(MaskPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var context = renderer.context; + var state = renderer.state; + var scene = this.scene; + var camera = this.camera; + var writeValue = this.inverse ? 0 : 1; + var clearValue = 1 - writeValue; // Don't update color or depth. + + state.buffers.color.setMask(false); + state.buffers.depth.setMask(false); // Lock the buffers. + + state.buffers.color.setLocked(true); + state.buffers.depth.setLocked(true); // Configure the stencil. + + state.buffers.stencil.setTest(true); + state.buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE); + state.buffers.stencil.setFunc(context.ALWAYS, writeValue, 0xffffffff); + state.buffers.stencil.setClear(clearValue); // Clear the stencil. + + if (this.clearStencil) { + if (this.renderToScreen) { + renderer.setRenderTarget(null); + renderer.clearStencil(); + } else { + renderer.setRenderTarget(inputBuffer); + renderer.clearStencil(); + renderer.setRenderTarget(outputBuffer); + renderer.clearStencil(); + } + } // Draw the mask. + + + if (this.renderToScreen) { + renderer.render(scene, camera, null); + } else { + renderer.render(scene, camera, inputBuffer); + renderer.render(scene, camera, outputBuffer); + } // Unlock the buffers. + + + state.buffers.color.setLocked(false); + state.buffers.depth.setLocked(false); // Only render where the stencil is set to 1. + + state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff); + state.buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP); + } + }]); + + inherits(MaskPass, _Pass); + + return MaskPass; + }(Pass); + + /** + * A shader pass. + * + * Used to render any shader material as a 2D filter. + */ + + var ShaderPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new shader pass. + * + * @param {ShaderMaterial} material - The shader material to use. + * @param {String} [textureID="tDiffuse"] - The texture uniform identifier. + */ + function ShaderPass(material) { + var _this; + + var textureID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "tDiffuse"; + + classCallCheck(this, ShaderPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ShaderPass).call(this, "ShaderPass")); + _this.material = material; + /** + * The name of the color sampler uniform of the given material. + * + * @type {String} + */ + + _this.textureID = textureID; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(ShaderPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + if (this.material.uniforms[this.textureID] !== undefined) { + this.material.uniforms[this.textureID].value = inputBuffer.texture; + } + + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + }]); + + inherits(ShaderPass, _Pass); + + return ShaderPass; + }(Pass); + + /** + * An outline pass. + */ + + var OutlinePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new outline pass. + * + * @param {Scene} scene - The main scene. + * @param {Camera} camera - The main camera. + * @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details. + * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect. + * @param {Boolean} [options.blur=true] - Whether the outline should be blurred. + */ + function OutlinePass(scene, camera) { + var _this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, OutlinePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(OutlinePass).call(this, "OutlinePass")); + /** + * The main scene. + * + * @type {Scene} + * @private + */ + + _this.mainScene = scene; + /** + * The main camera. + * + * @type {Camera} + * @private + */ + + _this.mainCamera = camera; + /** + * A render target for depth information. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetDepth = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter + }); + _this.renderTargetDepth.texture.name = "Outline.Depth"; + _this.renderTargetDepth.texture.generateMipmaps = false; + /** + * A render target for the outline mask. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetMask = _this.renderTargetDepth.clone(); + _this.renderTargetMask.texture.format = RGBFormat; + _this.renderTargetMask.texture.name = "Outline.Mask"; + /** + * A render target for the edge detection. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetEdges = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false, + format: RGBFormat + }); + _this.renderTargetEdges.texture.name = "Outline.Edges"; + _this.renderTargetEdges.texture.generateMipmaps = false; + /** + * A render target for the blurred outline overlay. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetBlurredEdges = _this.renderTargetEdges.clone(); + _this.renderTargetBlurredEdges.texture.name = "Outline.BlurredEdges"; + /** + * A depth pass. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassDepth = new RenderPass(_this.mainScene, _this.mainCamera, { + overrideMaterial: new MeshDepthMaterial({ + depthPacking: RGBADepthPacking, + morphTargets: true, + skinning: true + }), + clearColor: new Color(0xffffff), + clearAlpha: 1.0 + }); + /** + * A depth comparison mask pass. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassMask = new RenderPass(_this.mainScene, _this.mainCamera, { + overrideMaterial: new DepthComparisonMaterial(_this.renderTargetDepth.texture, _this.mainCamera), + clearColor: new Color(0xffffff), + clearAlpha: 1.0 + }); + /** + * A blur pass. + * + * @type {BlurPass} + * @private + */ + + _this.blurPass = new BlurPass(options); + _this.kernelSize = options.kernelSize; + /** + * A copy pass that renders the read buffer to screen if needed. + * + * @type {ShaderPass} + * @private + */ + + _this.copyPass = new ShaderPass(new CopyMaterial()); + _this.copyPass.renderToScreen = true; + /** + * An outline edge detection material. + * + * @type {OutlineEdgesMaterial} + * @private + */ + + _this.outlineEdgesMaterial = new OutlineEdgesMaterial(options); + _this.outlineEdgesMaterial.uniforms.tMask.value = _this.renderTargetMask.texture; + /** + * An outline blend material. + * + * @type {OutlineBlendMaterial} + * @private + */ + + _this.outlineBlendMaterial = new OutlineBlendMaterial(options); + _this.outlineBlendMaterial.uniforms.tMask.value = _this.renderTargetMask.texture; + _this.blur = options.blur !== undefined ? options.blur : true; + /** + * A list of objects to outline. + * + * @type {Object3D[]} + * @private + */ + + _this.selection = []; + /** + * The current animation time. + * + * @type {Number} + * @private + */ + + _this.time = 0.0; + /** + * The pulse speed. A value of zero disables the pulse effect. + * + * @type {Number} + */ + + _this.pulseSpeed = options.pulseSpeed !== undefined ? options.pulseSpeed : 0.0; + /** + * A dedicated render layer for selected objects. + * + * This layer is set to 10 by default. If this collides with your own custom + * layers, please change it to a free layer before rendering! + * + * @type {Number} + */ + + _this.selectionLayer = 10; + return _this; + } + /** + * The resolution scale. + * + * @type {Number} + */ + + + createClass(OutlinePass, [{ + key: "setPatternTexture", + + /** + * Sets a pattern texture to use as an overlay for selected objects. + * + * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. + */ + value: function setPatternTexture() { + var texture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + this.outlineBlendMaterial.setPatternTexture(texture); + } + /** + * Clears the current selection and selects a list of objects. + * + * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied. + * @return {OutlinePass} This pass. + */ + + }, { + key: "setSelection", + value: function setSelection(objects) { + var selection = objects.slice(0); + var selectionLayer = this.selectionLayer; + var i, l; + this.clearSelection(); + + for (i = 0, l = selection.length; i < l; ++i) { + selection[i].layers.enable(selectionLayer); + } + + this.selection = selection; + return this; + } + /** + * Clears the list of selected objects. + * + * @return {OutlinePass} This pass. + */ + + }, { + key: "clearSelection", + value: function clearSelection() { + var selection = this.selection; + var selectionLayer = this.selectionLayer; + var i, l; + + for (i = 0, l = selection.length; i < l; ++i) { + selection[i].layers.disable(selectionLayer); + } + + this.selection = []; + this.time = 0.0; + return this; + } + /** + * Selects an object. + * + * @param {Object3D} object - The object that should be outlined. + * @return {OutlinePass} This pass. + */ + + }, { + key: "selectObject", + value: function selectObject(object) { + object.layers.enable(this.selectionLayer); + this.selection.push(object); + return this; + } + /** + * Deselects an object. + * + * @param {Object3D} object - The object that should no longer be outlined. + * @return {OutlinePass} This pass. + */ + + }, { + key: "deselectObject", + value: function deselectObject(object) { + var selection = this.selection; + var index = selection.indexOf(object); + + if (index >= 0) { + selection[index].layers.disable(this.selectionLayer); + selection.splice(index, 1); + + if (selection.length === 0) { + this.time = 0.0; + } + } + + return this; + } + /** + * Sets the visibility of all selected objects. + * + * @private + * @param {Boolean} visible - Whether the selected objects should be visible. + */ + + }, { + key: "setSelectionVisible", + value: function setSelectionVisible(visible) { + var selection = this.selection; + var i, l; + + for (i = 0, l = selection.length; i < l; ++i) { + if (visible) { + selection[i].layers.enable(0); + } else { + selection[i].layers.disable(0); + } + } + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + }, { + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var mainScene = this.mainScene; + var mainCamera = this.mainCamera; + var pulse = this.outlineBlendMaterial.uniforms.pulse; + var background, mask; + + if (this.selection.length > 0) { + background = mainScene.background; + mask = mainCamera.layers.mask; + mainScene.background = null; + pulse.value = 1.0; + + if (this.pulseSpeed > 0.0) { + pulse.value = 0.625 + Math.cos(this.time * this.pulseSpeed * 10.0) * 0.375; + this.time += delta; + } // Render a custom depth texture and ignore selected objects. + + + this.setSelectionVisible(false); + this.renderPassDepth.render(renderer, this.renderTargetDepth); + this.setSelectionVisible(true); // Create a mask for the selected objects using the depth information. + + mainCamera.layers.mask = 1 << this.selectionLayer; + this.renderPassMask.render(renderer, this.renderTargetMask); // Restore the camera layer mask and the scene background. + + mainCamera.layers.mask = mask; + mainScene.background = background; // Detect the outline. + + this.material = this.outlineEdgesMaterial; + renderer.render(this.scene, this.camera, this.renderTargetEdges); + + if (this.blurPass.enabled) { + // Blur the edges. + this.blurPass.render(renderer, this.renderTargetEdges, this.renderTargetBlurredEdges); + } + + if (this.blend) { + // Draw the final overlay onto the scene colours. + this.material = this.outlineBlendMaterial; + this.outlineBlendMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : this.outputBuffer); + } + } else if (this.renderToScreen) { + // Draw the read buffer to screen. + this.copyPass.render(renderer, inputBuffer); + } + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.renderTargetDepth.setSize(width, height); + this.renderTargetMask.setSize(width, height); + this.renderPassDepth.setSize(width, height); + this.renderPassMask.setSize(width, height); + this.blurPass.setSize(width, height); + width = this.blurPass.width; + height = this.blurPass.height; + this.renderTargetEdges.setSize(width, height); + this.renderTargetBlurredEdges.setSize(width, height); + this.outlineBlendMaterial.uniforms.aspect.value = width / height; + this.outlineEdgesMaterial.setTexelSize(1.0 / width, 1.0 / height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.renderPassDepth.initialize(renderer, alpha); + this.renderPassMask.initialize(renderer, alpha); + this.blurPass.initialize(renderer, alpha); + } + }, { + key: "resolutionScale", + get: function get() { + return this.blurPass.resolutionScale; + } + /** + * You need to call {@link EffectComposer#setSize} after changing this value. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5; + this.blurPass.resolutionScale = value; + } + /** + * The blur kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.blurPass.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.VERY_SMALL; + this.blurPass.kernelSize = value; + } + /** + * Indicates whether the outline overlay should be blurred. + * + * @type {Boolean} + */ + + }, { + key: "blur", + get: function get() { + return this.blurPass.enabled; + } + /** + * @type {Boolean} + */ + , + set: function set(value) { + this.blurPass.enabled = value; + this.outlineBlendMaterial.uniforms.tEdges.value = value ? this.renderTargetBlurredEdges.texture : this.renderTargetEdges.texture; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.blurPass.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.blurPass.dithering = value; + } + /** + * Indicates whether the effect should be applied to the input buffer. + * + * @type {Boolean} + */ + + }, { + key: "blend", + get: function get() { + return this.needsSwap; + } + /** + * If disabled, the input buffer will remain unaffected. + * + * You may use the {@link BloomPass#overlay} texture to apply the effect to + * your scene. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.needsSwap = value; + } + /** + * The effect overlay texture. + * + * @type {Texture} + */ + + }, { + key: "overlay", + get: function get() { + return this.outlineBlendMaterial.uniforms.tEdges.value; + } + }]); + + inherits(OutlinePass, _Pass); + + return OutlinePass; + }(Pass); + + /** + * A pixelation pass. + */ + + var PixelationPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new pixelation pass. + * + * @param {Number} [granularity=30.0] - The intensity of the effect. + */ + function PixelationPass() { + var _this; + + var granularity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30.0; + + classCallCheck(this, PixelationPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(PixelationPass).call(this, "PixelationPass")); + _this.material = new PixelationMaterial(); + _this.granularity = granularity; + return _this; + } + /** + * The pixel granularity. + * + * @type {Number} + */ + + + createClass(PixelationPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.material.setResolution(width, height); + } + }, { + key: "granularity", + get: function get() { + return this.material.granularity; + } + /** + * A higher value yields coarser visuals. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30; + value = Math.floor(value); + + if (value % 2 > 0) { + value += 1; + } + + this.material.granularity = value; + } + }]); + + inherits(PixelationPass, _Pass); + + return PixelationPass; + }(Pass); + + /** + * An advanced Depth of Field (DoF) pass. + * + * Yields more realistic results but is also more demanding. + * + * This pass requires a {@link EffectComposer#depthTexture}. + */ + + var RealisticBokehPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new bokeh pass. + * + * @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings. + * @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details. + */ + function RealisticBokehPass(camera) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, RealisticBokehPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(RealisticBokehPass).call(this, "RealisticBokehPass")); + _this.material = new RealisticBokehMaterial(camera, options); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(RealisticBokehPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + this.material.uniforms.tDepth.value = inputBuffer.depthTexture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.material.setTexelSize(1.0 / width, 1.0 / height); + } + }]); + + inherits(RealisticBokehPass, _Pass); + + return RealisticBokehPass; + }(Pass); + + /** + * A pass that renders the result from a previous pass to another render target. + */ + + var SavePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new save pass. + * + * @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer. + * @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer. + */ + function SavePass(renderTarget) { + var _this; + + var resize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + classCallCheck(this, SavePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(SavePass).call(this, "SavePass")); + _this.material = new CopyMaterial(); + _this.needsSwap = false; + /** + * The render target. + * + * @type {WebGLRenderTarget} + */ + + _this.renderTarget = renderTarget !== undefined ? renderTarget : new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTarget.texture.name = "Save.Target"; + _this.renderTarget.texture.generateMipmaps = false; + /** + * Indicates whether the render target should be resized when the size of + * the composer's frame buffer changes. + * + * @type {Boolean} + */ + + _this.resize = resize; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(SavePass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderTarget); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + if (this.resize) { + width = Math.max(1, width); + height = Math.max(1, height); + this.renderTarget.setSize(width, height); + } + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + if (!alpha) { + this.renderTarget.texture.format = RGBFormat; + } + } + }]); + + inherits(SavePass, _Pass); + + return SavePass; + }(Pass); + + /** + * Half PI. + * + * @type {Number} + * @private + */ + + var HALF_PI = Math.PI * 0.5; + /** + * A vector. + * + * @type {Vector3} + * @private + */ + + var v = new Vector3(); + /** + * A vector. + * + * @type {Vector3} + * @private + */ + + var ab = new Vector3(); + /** + * A shock wave pass. + */ + + var ShockWavePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new shock wave pass. + * + * @param {Camera} camera - The main camera. + * @param {Vector3} [epicenter] - The world position of the shock wave epicenter. + * @param {Object} [options] - The options. + * @param {Number} [options.speed=1.0] - The animation speed. + * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave. + * @param {Number} [options.waveSize=0.2] - The wave size. + * @param {Number} [options.amplitude=0.05] - The distortion amplitude. + */ + function ShockWavePass(camera) { + var _this; + + var epicenter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Vector3(); + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, ShockWavePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ShockWavePass).call(this, "ShockWavePass")); + /** + * The main camera. + * + * @type {Object3D} + */ + + _this.mainCamera = camera; + /** + * The epicenter. + * + * @type {Vector3} + * @example shockWavePass.epicenter = myMesh.position; + */ + + _this.epicenter = epicenter; + /** + * The object position in screen space. + * + * @type {Vector3} + * @private + */ + + _this.screenPosition = new Vector3(); + /** + * The speed of the shock wave animation. + * + * @type {Number} + */ + + _this.speed = options.speed !== undefined ? options.speed : 2.0; + /** + * A time accumulator. + * + * @type {Number} + * @private + */ + + _this.time = 0.0; + /** + * Indicates whether the shock wave animation is active. + * + * @type {Boolean} + * @private + */ + + _this.active = false; + /** + * A shock wave shader material. + * + * @type {ShockWaveMaterial} + * @private + */ + + _this.shockWaveMaterial = new ShockWaveMaterial(options); + _this.shockWaveMaterial.uniforms.center.value = _this.screenPosition; + /** + * A copy shader material. + * + * @type {CopyMaterial} + * @private + */ + + _this.copyMaterial = new CopyMaterial(); + return _this; + } + /** + * Emits the shock wave. + */ + + + createClass(ShockWavePass, [{ + key: "explode", + value: function explode() { + this.time = 0.0; + this.active = true; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + }, { + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var epicenter = this.epicenter; + var mainCamera = this.mainCamera; + var screenPosition = this.screenPosition; + var shockWaveMaterial = this.shockWaveMaterial; + var uniforms = shockWaveMaterial.uniforms; + var center = uniforms.center; + var radius = uniforms.radius; + var maxRadius = uniforms.maxRadius; + var waveSize = uniforms.waveSize; + this.copyMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + this.material = this.copyMaterial; + + if (this.active) { + // Calculate direction vectors. + mainCamera.getWorldDirection(v); + ab.copy(mainCamera.position).sub(epicenter); // Don't render the effect if the object is behind the camera. + + if (v.angleTo(ab) > HALF_PI) { + // Scale the effect based on distance to the object. + uniforms.cameraDistance.value = mainCamera.position.distanceTo(epicenter); // Calculate the screen position of the epicenter. + + screenPosition.copy(epicenter).project(mainCamera); + center.value.x = (screenPosition.x + 1.0) * 0.5; + center.value.y = (screenPosition.y + 1.0) * 0.5; + uniforms.tDiffuse.value = inputBuffer.texture; + this.material = shockWaveMaterial; + } // Update the shock wave radius based on time. + + + this.time += delta * this.speed; + radius.value = this.time - waveSize.value; + + if (radius.value >= (maxRadius.value + waveSize.value) * 2) { + this.active = false; + } + } + + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.shockWaveMaterial.uniforms.aspect.value = width / height; + } + }]); + + inherits(ShockWavePass, _Pass); + + return ShockWavePass; + }(Pass); + + // Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range. + var searchImageDataURL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII"; + + // Generated with SMAAAreaImageData.generate().toCanvas().toDataURL(). + var areaImageDataURL = "data:image/png;base64,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"; + + /** + * Subpixel Morphological Antialiasing (SMAA) v2.8. + * + * Preset: SMAA 1x Medium (with color edge detection). + * https://github.com/iryoku/smaa/releases/tag/v2.8 + */ + + var SMAAPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new SMAA pass. + * + * @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}. + * @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}. + */ + function SMAAPass(searchImage, areaImage) { + var _this; + + classCallCheck(this, SMAAPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(SMAAPass).call(this, "SMAAPass")); + /** + * A clear pass for the color edges buffer. + * + * @type {ClearPass} + * @private + */ + + _this.clearPass = new ClearPass({ + clearColor: new Color(0x000000), + clearAlpha: 1.0 + }); + /** + * A render target for the color edge detection. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetColorEdges = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + format: RGBFormat, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetColorEdges.texture.name = "SMAA.ColorEdges"; + _this.renderTargetColorEdges.texture.generateMipmaps = false; + /** + * A render target for the SMAA weights. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetWeights = _this.renderTargetColorEdges.clone(); + _this.renderTargetWeights.texture.name = "SMAA.Weights"; + _this.renderTargetWeights.texture.format = RGBAFormat; + /** + * Color edge detection shader material. + * + * @type {ColorEdgesMaterial} + * @private + */ + + _this.colorEdgesMaterial = new ColorEdgesMaterial(); + /** + * SMAA weights shader material. + * + * @type {SMAAWeightsMaterial} + * @private + */ + + _this.weightsMaterial = new SMAAWeightsMaterial(); + _this.weightsMaterial.uniforms.tDiffuse.value = _this.renderTargetColorEdges.texture; + /** + * The SMAA search texture. + * + * @type {Texture} + * @private + */ + + _this.searchTexture = new Texture(searchImage); + _this.searchTexture.name = "SMAA.Search"; + _this.searchTexture.magFilter = NearestFilter; + _this.searchTexture.minFilter = NearestFilter; + _this.searchTexture.format = RGBAFormat; + _this.searchTexture.generateMipmaps = false; + _this.searchTexture.needsUpdate = true; + _this.searchTexture.flipY = false; + _this.weightsMaterial.uniforms.tSearch.value = _this.searchTexture; + /** + * The SMAA area texture. + * + * @type {Texture} + * @private + */ + + _this.areaTexture = new Texture(areaImage); + _this.areaTexture.name = "SMAA.Area"; + _this.areaTexture.minFilter = LinearFilter; + _this.areaTexture.format = RGBAFormat; + _this.areaTexture.generateMipmaps = false; + _this.areaTexture.needsUpdate = true; + _this.areaTexture.flipY = false; + _this.weightsMaterial.uniforms.tArea.value = _this.areaTexture; + /** + * SMAA blend shader material. + * + * @type {SMAABlendMaterial} + * @private + */ + + _this.blendMaterial = new SMAABlendMaterial(); + _this.blendMaterial.uniforms.tWeights.value = _this.renderTargetWeights.texture; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(SMAAPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + // Detect color edges. + this.material = this.colorEdgesMaterial; + this.colorEdgesMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + this.clearPass.render(renderer, this.renderTargetColorEdges); + renderer.render(this.scene, this.camera, this.renderTargetColorEdges); // Compute edge weights. + + this.material = this.weightsMaterial; + renderer.render(this.scene, this.camera, this.renderTargetWeights); // Apply the antialiasing filter to the colors. + + this.material = this.blendMaterial; + this.blendMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.renderTargetColorEdges.setSize(width, height); + this.renderTargetWeights.setSize(width, height); + this.colorEdgesMaterial.uniforms.texelSize.value.copy(this.weightsMaterial.uniforms.texelSize.value.copy(this.blendMaterial.uniforms.texelSize.value.set(1.0 / width, 1.0 / height))); + } + /** + * The SMAA search image, encoded as a base64 data URL. + * + * Use this image data to create an Image instance and use it together with + * the area image to create an SMAAPass. + * + * @type {String} + * @example + * const searchImage = new Image(); + * searchImage.addEventListener("load", progress); + * searchImage.src = SMAAPass.searchImageDataURL; + */ + + }], [{ + key: "searchImageDataURL", + get: function get() { + return searchImageDataURL; + } + /** + * The SMAA area image, encoded as a base64 data URL. + * + * Use this image data to create an Image instance and use it together with + * the search image to create an SMAAPass. + * + * @type {String} + * @example + * const areaImage = new Image(); + * areaImage.addEventListener("load", progress); + * areaImage.src = SMAAPass.areaImageDataURL; + */ + + }, { + key: "areaImageDataURL", + get: function get() { + return areaImageDataURL; + } + }]); + + inherits(SMAAPass, _Pass); + + return SMAAPass; + }(Pass); + + /** + * A pass that renders a given texture. + */ + + var TexturePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new texture pass. + * + * @param {Texture} texture - The texture. + * @param {Number} [opacity=1.0] - The texture opacity. + * @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors. + */ + function TexturePass(texture) { + var _this; + + var opacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; + var screenMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + classCallCheck(this, TexturePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(TexturePass).call(this, "TexturePass")); + _this.material = new CombineMaterial(screenMode); + _this.texture = texture; + _this.opacitySource = opacity; + return _this; + } + /** + * The texture. + * + * @type {Texture} + */ + + + createClass(TexturePass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.texture1.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + }, { + key: "texture", + get: function get() { + return this.material.uniforms.texture2.value; + } + /** + * @type {Texture} + */ + , + set: function set(value) { + this.material.uniforms.texture2.value = value; + } + /** + * The opacity of the input buffer. + * + * The destination color is the color from the image in the input buffer. + * + * @type {Number} + */ + + }, { + key: "opacityDestination", + get: function get() { + return this.material.uniforms.opacity1.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.material.uniforms.opacity1.value = value; + } + /** + * The opacity of the texture. + * + * The source color is the color from the texture. + * + * @type {Number} + */ + + }, { + key: "opacitySource", + get: function get() { + return this.material.uniforms.opacity2.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.material.uniforms.opacity2.value = value; + } + }]); + + inherits(TexturePass, _Pass); + + return TexturePass; + }(Pass); + + /** + * A tone mapping pass that supports adaptive luminosity. + * + * If adaptivity is enabled, this pass generates a texture that represents the + * luminosity of the current scene and adjusts it over time to simulate the + * optic nerve responding to the amount of light it is receiving. + * + * Reference: + * GDC2007 - Wolfgang Engel, Post-Processing Pipeline + * http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf + */ + + var ToneMappingPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new tone mapping pass. + * + * @param {Object} [options] - The options. + * @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map. + * @param {Number} [options.resolution=256] - The render texture resolution. + * @param {Number} [options.distinction=1.0] - A luminance distinction factor. + */ + function ToneMappingPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ToneMappingPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ToneMappingPass).call(this, "ToneMappingPass")); + /** + * The render target for the current luminosity. + * + * @type {WebGLRenderTarget} + * @private + * @todo Use RED format in WebGL 2.0. + */ + + _this.renderTargetLuminosity = new WebGLRenderTarget(1, 1, { + minFilter: LinearMipMapLinearFilter, + magFilter: LinearFilter, + format: RGBFormat, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetLuminosity.texture.name = "ToneMapping.Luminosity"; + /** + * The render target for adapted luminosity. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetAdapted = _this.renderTargetLuminosity.clone(); + _this.renderTargetAdapted.texture.name = "ToneMapping.AdaptedLuminosity"; + _this.renderTargetAdapted.texture.generateMipmaps = false; + _this.renderTargetAdapted.texture.minFilter = LinearFilter; + /** + * A render target that holds a copy of the adapted limonosity. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetPrevious = _this.renderTargetAdapted.clone(); + _this.renderTargetPrevious.texture.name = "ToneMapping.PreviousLuminosity"; + /** + * Copy shader material used for saving the luminance map. + * + * @type {CopyMaterial} + * @private + */ + + _this.copyMaterial = new CopyMaterial(); + /** + * A luminosity shader material. + * + * @type {LuminosityMaterial} + * @private + */ + + _this.luminosityMaterial = new LuminosityMaterial(); + _this.luminosityMaterial.uniforms.distinction.value = options.distinction !== undefined ? options.distinction : 1.0; + /** + * An adaptive luminance shader material. + * + * @type {AdaptiveLuminosityMaterial} + * @private + */ + + _this.adaptiveLuminosityMaterial = new AdaptiveLuminosityMaterial(); + _this.resolution = options.resolution; + /** + * A tone mapping shader material. + * + * @type {ToneMappingMaterial} + * @private + */ + + _this.toneMappingMaterial = new ToneMappingMaterial(); + _this.adaptive = options.adaptive; + return _this; + } + /** + * The resolution of the render targets. + * + * @type {Number} + */ + + + createClass(ToneMappingPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var adaptiveLuminosityMaterial = this.adaptiveLuminosityMaterial; + var luminosityMaterial = this.luminosityMaterial; + var toneMappingMaterial = this.toneMappingMaterial; + var copyMaterial = this.copyMaterial; + var renderTargetPrevious = this.renderTargetPrevious; + var renderTargetLuminosity = this.renderTargetLuminosity; + var renderTargetAdapted = this.renderTargetAdapted; + + if (this.adaptive) { + // Render the luminance of the current scene into a render target with mipmapping enabled. + this.material = luminosityMaterial; + luminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(scene, camera, renderTargetLuminosity); // Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time. + + this.material = adaptiveLuminosityMaterial; + adaptiveLuminosityMaterial.uniforms.delta.value = delta; + adaptiveLuminosityMaterial.uniforms.tPreviousLum.value = renderTargetPrevious.texture; + adaptiveLuminosityMaterial.uniforms.tCurrentLum.value = renderTargetLuminosity.texture; + renderer.render(scene, camera, renderTargetAdapted); // Copy the new adapted luminance value so that it can be used by the next frame. + + this.material = copyMaterial; + copyMaterial.uniforms.tDiffuse.value = renderTargetAdapted.texture; + renderer.render(scene, camera, renderTargetPrevious); + } // Apply the tone mapping to the colours. + + + this.material = toneMappingMaterial; + toneMappingMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.material = new MeshBasicMaterial({ + color: 0x7fffff + }); + renderer.render(this.scene, this.camera, this.renderTargetPrevious); + this.material.dispose(); + } + }, { + key: "resolution", + get: function get() { + return this.renderTargetLuminosity.width; + } + /** + * The resolution of the render targets. Must be a power of two for mipmaps. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 256; + // Round the given value to the next power of two. + var exponent = Math.max(0, Math.ceil(Math.log2(value))); + value = Math.pow(2, exponent); + this.renderTargetLuminosity.setSize(value, value); + this.renderTargetPrevious.setSize(value, value); + this.renderTargetAdapted.setSize(value, value); + this.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1 = exponent.toFixed(1); + this.adaptiveLuminosityMaterial.needsUpdate = true; + } + /** + * Whether this pass uses adaptive luminosity. + * + * @type {Boolean} + * @default true + */ + + }, { + key: "adaptive", + get: function get() { + return this.toneMappingMaterial.defines.ADAPTED_LUMINANCE !== undefined; + } + /** + * Whether this pass should use adaptive luminosity. + * + * @type {Boolean} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (value) { + this.toneMappingMaterial.defines.ADAPTED_LUMINANCE = "1"; + this.toneMappingMaterial.uniforms.luminanceMap.value = this.renderTargetAdapted.texture; + } else { + delete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE; + this.toneMappingMaterial.uniforms.luminanceMap.value = null; + } + + this.toneMappingMaterial.needsUpdate = true; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.toneMappingMaterial.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + if (this.dithering !== value) { + this.toneMappingMaterial.dithering = value; + this.toneMappingMaterial.needsUpdate = true; + } + } + }]); + + inherits(ToneMappingPass, _Pass); + + return ToneMappingPass; + }(Pass); + + /** + * A compilation of the post processing passes. + * + * @module postprocessing/passes + */ + + /** + * The EffectComposer may be used in place of a normal WebGLRenderer. + * + * The auto clear behaviour of the provided renderer will be disabled to prevent + * unnecessary clear operations. + * + * It is common practice to use a {@link RenderPass} as the first pass to + * automatically clear the screen and render the scene to a texture for further + * processing. + * + * @implements {Resizable} + * @implements {Disposable} + */ + + var EffectComposer = + /*#__PURE__*/ + function () { + /** + * Constructs a new effect composer. + * + * @param {WebGLRenderer} [renderer] - The renderer that should be used. + * @param {Object} [options] - The options. + * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer. + * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer. + * @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture. + */ + function EffectComposer() { + var renderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, EffectComposer); + + /** + * The renderer. + * + * You may replace the renderer at any time by using + * {@link EffectComposer#replaceRenderer}. + * + * @type {WebGLRenderer} + */ + this.renderer = renderer; + /** + * The input buffer. + * + * Reading from and writing to the same render target should be avoided. + * Therefore, two seperate yet identical buffers are used. + * + * @type {WebGLRenderTarget} + * @private + */ + + this.inputBuffer = null; + /** + * The output buffer. + * + * @type {WebGLRenderTarget} + * @private + */ + + this.outputBuffer = null; + + if (this.renderer !== null) { + this.renderer.autoClear = false; + this.inputBuffer = this.createBuffer(options.depthBuffer !== undefined ? options.depthBuffer : true, options.stencilBuffer !== undefined ? options.stencilBuffer : false, options.depthTexture !== undefined ? options.depthTexture : false); + this.outputBuffer = this.inputBuffer.clone(); + } + /** + * A copy pass used for copying masked scenes. + * + * @type {ShaderPass} + * @private + */ + + + this.copyPass = new ShaderPass(new CopyMaterial()); + /** + * The passes. + * + * @type {Pass[]} + * @private + */ + + this.passes = []; + } + /** + * The depth texture of the input and output buffers. + * + * @type {DepthTexture} + */ + + + createClass(EffectComposer, [{ + key: "replaceRenderer", + + /** + * Replaces the current renderer with the given one. The DOM element of the + * current renderer will automatically be removed from its parent node and the + * DOM element of the new renderer will take its place. + * + * The auto clear mechanism of the provided renderer will be disabled. + * + * Switching between renderers allows you to dynamically enable or disable + * antialiasing. + * + * @param {WebGLRenderer} renderer - The new renderer. + * @return {WebGLRenderer} The old renderer. + */ + value: function replaceRenderer(renderer) { + var oldRenderer = this.renderer; + var parent, oldSize, newSize; + + if (oldRenderer !== null && oldRenderer !== renderer) { + this.renderer = renderer; + this.renderer.autoClear = false; + parent = oldRenderer.domElement.parentNode; + oldSize = oldRenderer.getSize(); + newSize = renderer.getSize(); + + if (parent !== null) { + parent.removeChild(oldRenderer.domElement); + parent.appendChild(renderer.domElement); + } + + if (oldSize.width !== newSize.width || oldSize.height !== newSize.height) { + this.setSize(); + } + } + + return oldRenderer; + } + /** + * Creates a new render target by replicating the renderer's canvas. + * + * The created render target uses a linear filter for texel minification and + * magnification. Its render texture format depends on whether the renderer + * uses the alpha channel. Mipmaps are disabled. + * + * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer. + * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer. + * @param {Boolean} depthTexture - Whether the render target should have a depth texture. + * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas. + */ + + }, { + key: "createBuffer", + value: function createBuffer(depthBuffer, stencilBuffer, depthTexture) { + var drawingBufferSize = this.renderer.getDrawingBufferSize(); + var alpha = this.renderer.context.getContextAttributes().alpha; + var renderTarget = new WebGLRenderTarget(drawingBufferSize.width, drawingBufferSize.height, { + minFilter: LinearFilter, + magFilter: LinearFilter, + format: alpha ? RGBAFormat : RGBFormat, + depthBuffer: depthBuffer, + stencilBuffer: stencilBuffer, + depthTexture: depthTexture ? new DepthTexture() : null + }); + + if (depthTexture && stencilBuffer) { + renderTarget.depthTexture.format = DepthStencilFormat; + renderTarget.depthTexture.type = UnsignedInt248Type; + } + + renderTarget.texture.name = "EffectComposer.Buffer"; + renderTarget.texture.generateMipmaps = false; + return renderTarget; + } + /** + * Adds a pass, optionally at a specific index. + * + * @param {Pass} pass - A new pass. + * @param {Number} [index] - An index at which the pass should be inserted. + */ + + }, { + key: "addPass", + value: function addPass(pass, index) { + var renderer = this.renderer; + var drawingBufferSize = renderer.getDrawingBufferSize(); + pass.setSize(drawingBufferSize.width, drawingBufferSize.height); + pass.initialize(renderer, renderer.context.getContextAttributes().alpha); + + if (index !== undefined) { + this.passes.splice(index, 0, pass); + } else { + this.passes.push(pass); + } + } + /** + * Removes a pass. + * + * @param {Pass} pass - The pass. + */ + + }, { + key: "removePass", + value: function removePass(pass) { + this.passes.splice(this.passes.indexOf(pass), 1); + } + /** + * Renders all enabled passes in the order in which they were added. + * + * @param {Number} delta - The time between the last frame and the current one in seconds. + */ + + }, { + key: "render", + value: function render(delta) { + var passes = this.passes; + var copyPass = this.copyPass; + var renderer = this.renderer; + var inputBuffer = this.inputBuffer; + var outputBuffer = this.outputBuffer; + var stencilTest = false; + var pass, context, state, buffer; + var i, l; + + for (i = 0, l = passes.length; i < l; ++i) { + pass = passes[i]; + + if (pass.enabled) { + pass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest); + + if (pass.needsSwap) { + if (stencilTest) { + copyPass.renderToScreen = pass.renderToScreen; + context = renderer.context; + state = renderer.state; // Preserve the unaffected pixels. + + state.buffers.stencil.setFunc(context.NOTEQUAL, 1, 0xffffffff); + copyPass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest); + state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff); + } + + buffer = inputBuffer; + inputBuffer = outputBuffer; + outputBuffer = buffer; + } + + if (pass instanceof MaskPass) { + stencilTest = true; + } else if (pass instanceof ClearMaskPass) { + stencilTest = false; + } + } + } + } + /** + * Sets the size of the buffers and the renderer's output canvas. + * + * Every pass will be informed of the new size. It's up to each pass how that + * information is used. + * + * If no width or height is specified, the render targets and passes will be + * updated with the current size of the renderer. + * + * @param {Number} [width] - The width. + * @param {Number} [height] - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + var passes = this.passes; + var renderer = this.renderer; + var size, drawingBufferSize; + var i, l; + + if (width === undefined || height === undefined) { + size = renderer.getSize(); + width = size.width; + height = size.height; + } // Update the logical render size. + + + renderer.setSize(width, height); // The drawing buffer size takes the device pixel ratio into account. + + drawingBufferSize = renderer.getDrawingBufferSize(); + this.inputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height); + this.outputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height); + + for (i = 0, l = passes.length; i < l; ++i) { + passes[i].setSize(drawingBufferSize.width, drawingBufferSize.height); + } + } + /** + * Resets this composer by deleting all passes and creating new buffers. + */ + + }, { + key: "reset", + value: function reset() { + var renderTarget = this.createBuffer(this.inputBuffer.depthBuffer, this.inputBuffer.stencilBuffer, this.inputBuffer.depthTexture !== null); + this.dispose(); // Reanimate. + + this.inputBuffer = renderTarget; + this.outputBuffer = renderTarget.clone(); + this.copyPass = new ShaderPass(new CopyMaterial()); + } + /** + * Destroys this composer and all passes. + * + * This method deallocates all disposable objects created by the passes. It + * also deletes the main frame buffers of this composer. + */ + + }, { + key: "dispose", + value: function dispose() { + var passes = this.passes; + var i, l; + + for (i = 0, l = passes.length; i < l; ++i) { + passes[i].dispose(); + } + + this.passes = []; + + if (this.inputBuffer !== null) { + this.inputBuffer.dispose(); + this.inputBuffer = null; + } + + if (this.outputBuffer !== null) { + this.outputBuffer.dispose(); + this.outputBuffer = null; + } + + this.copyPass.dispose(); + } + }, { + key: "depthTexture", + get: function get() { + return this.inputBuffer.depthTexture; + } + /** + * The input and output buffers share a single depth texture. Depth will be + * written to this texture when something is rendered into one of the buffers + * and the involved materials have depth write enabled. + * + * You may enable this mechanism during the instantiation of the composer or + * by assigning a DepthTexture instance later on. You may also disable it by + * assigning null. + * + * @type {DepthTexture} + */ + , + set: function set(x) { + this.inputBuffer.depthTexture = x; + this.outputBuffer.depthTexture = x; + } + }]); + + return EffectComposer; + }(); + + var polyfill = function polyfill(object, method) { + var showWarn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + if (object[method]) return; + if (showWarn) console.warn("@PostProcessorModule: pass.".concat(method, "() was not found."), object); + + object[method] = function () {}; + }; + /** + * @class PostProcessorModule + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new WHS.PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule(), + * new PostProcessorModule() + * ]); + * + * const processor = app.use('postprocessor'); + * + * processor + * .render() + * .pass(new GlitchPass()) + * .renderToScreen() + */ + + + var PostProcessorModule = + /*#__PURE__*/ + function () { + function PostProcessorModule() { + var _this = this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : PostProcessorModule.defaults; + + classCallCheck(this, PostProcessorModule); + + defineProperty$3(defineProperty$3(this, "currentPass", null), "defer", new Promise(function (resolve) { + _this.resolve = resolve; + })); + + this.debug = params.debug; + this.params = params; + } + + createClass(PostProcessorModule, [{ + key: "manager", + value: function manager(_manager) { + var _this2 = this; + + _manager.define('postprocessor'); + + this.effects = _manager.use('rendering').effects; + this.renderer = _manager.get('renderer'); + this.scene = _manager.get('scene'); + this.camera = _manager.get('camera'); + this.composer = new EffectComposer(this.renderer, this.params); + + _manager.use('rendering').stop(); + + var composer = this.composer; + this.renderLoop = new Loop(function (clock) { + return composer.render(clock.getDelta()); + }).start(_manager.handler); + + _manager.update({ + renderer: function renderer(_renderer) { + _this2.composer.replaceRenderer(_renderer); + }, + scene: function scene(_scene) { + _this2.scene = _scene; + }, + camera: function camera(_camera) { + _this2.camera = _camera; + } + }); + + this.resolve(); + } + /** + * @method render + * @description Adds RenderPass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "render", + value: function render() { + var _this3 = this; + + this.defer.then(function () { + var pass = new RenderPass(_this3.scene, _this3.camera.native); // TODO: Support for effects. + + _this3.composer.addPass(pass); + + _this3.currentPass = pass; + }); + return this; + } + /** + * @method pass + * @description Adds your custom pass + * @param {Pass} pass A custom pass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "pass", + value: function pass(_pass) { + var _this4 = this; + + this.defer.then(function () { + polyfill(_pass, 'setSize', _this4.debug); + polyfill(_pass, 'initialise', _this4.debug); + + _this4.composer.addPass(_pass); + + _this4.currentPass = _pass; + }); + return this; + } + /** + * @method shader + * @description Adds a pass made from shader material + * @param {Material} material A ShaderMaterial + * @param {String} textureID Name of the readBuffer uniform + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "shader", + value: function shader(material) { + var _this5 = this; + + var textureID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'readBuffer'; + this.defer.then(function () { + if (!material.uniforms[textureID]) material.uniforms[textureID] = { + value: null + }; + var pass = new ShaderPass(material, textureID); + + _this5.composer.addPass(pass); + + _this5.currentPass = pass; + }); + return this; + } + /** + * @method get + * @description Returns a pass by the given name + * @param {String} name The name of the pass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "get", + value: function get(name) { + return name ? this.composer.passes.filter(function (pass) { + return pass.name === name; + })[0] : this.currentPass; + } + /** + * @method renderToScreen + * @description Sets the renderToScreen property of currentPass + * @param {String} [name=true] The name of the pass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "renderToScreen", + value: function renderToScreen() { + var _this6 = this; + + var bool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + this.defer.then(function () { + _this6.currentPass.renderToScreen = bool; + }); + return this; + } + }]); + + return PostProcessorModule; + }(); + + defineProperty$3(PostProcessorModule, "defaults", { + debug: true + }); + + /** + * @class EventsPatchModule + * @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one. + * @category modules/app + * @memberof module:modules/app + */ + var EventsPatchModule = + /*#__PURE__*/ + function () { + function EventsPatchModule() { + classCallCheck(this, EventsPatchModule); + } + + createClass(EventsPatchModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.define('events'); + + this.element = _manager.get('renderer').domElement; + } + /** + * @function patchEvents + * @description This methods patches the list of events on specific object. + * @param {Number} originObject - The object that gives events. + * @param {Number} [destObject=this] - The object that takes events. + * @param {Array[Strings]} [events=[]] - The list of events by names. + * @memberof module:modules/app.EventsPatchModule + */ + + }, { + key: "patchEvents", + value: function patchEvents(originObject) { + var destObject = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this; + var events = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + events.forEach(function (event) { + return originObject.addEventListener(event, function (e) { + return destObject.emit(event, e); + }); + }); + } + }, { + key: "integrate", + value: function integrate(self) { + var element = self.element, + patchEvents = self.patchEvents; + patchEvents(element, this, ['mousemove', 'mouseup', 'contextmenu', 'mousedown', 'click', 'wheel', 'touchstart', 'touchend', 'touchmove', 'keydown', 'keyup', 'keypress']); + } + }]); + + return EventsPatchModule; + }(); + + /** + * @class VirtualMouseModule + * @category modules/app + * @param {Boolean} [globalMovement=false] + * @memberof module:modules/app + * @extends Events + */ + + var VirtualMouseModule = + /*#__PURE__*/ + function (_Events) { + function VirtualMouseModule() { + var _this; + + var globalMovement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + classCallCheck(this, VirtualMouseModule); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(VirtualMouseModule).call(this)); + + defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "mouse", new Vector2()), "raycaster", new Raycaster()), "world", null), "canvas", null), "projectionPlane", new Plane(new Vector3(0, 0, 1), 0)); + + _this.globalMovement = globalMovement; + return _this; + } + + createClass(VirtualMouseModule, [{ + key: "update", + value: function update(e, customX, customY) { + var rect = this.canvas.getBoundingClientRect(); + var x = customX || e.clientX; + var y = customY || e.clientY; + this.mouse.x = (x - rect.left) / (rect.right - rect.left) * 2 - 1; + this.mouse.y = -((y - rect.top) / (rect.bottom - rect.top)) * 2 + 1; + this.projectionPlane.normal.copy(this.camera.getWorldDirection()); + this.raycaster.setFromCamera(this.mouse, this.camera); + this.emit('move'); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.define('mouse'); + + _manager.require('events', function () { + return new EventsPatchModule(); + }); + + this.canvas = _manager.get('renderer').domElement; + this.camera = _manager.get('camera').native; + } + }, { + key: "integrate", + value: function integrate(self) { + var _this2 = this; + + ['click', 'mousedown', 'mouseup', 'mousemove'].forEach(function (ev) { + return _this2.on(ev, function (e) { + return self.emit(ev, e); + }); + }); + self.globalX = 0; + self.globalY = 0; + this.on('mousemove', function (e) { + if (document.pointerLockElement !== null) { + self.globalX += e.movementX; + self.globalY += e.movementY; + self.update(e, self.globalX, self.globalY); + } else self.update(e); + }); + } + /** + * @method track + * @description Starts tracking events on a component + * @param {Component} component A component, that should be tracked by the mouse + * @param {Boolean} nested Whether component's children should be tracked or not + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "track", + value: function track(component) { + var _this3 = this; + + var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var isHovered = false; + this.on('move', function () { + if (_this3.hovers(component, nested)) { + if (isHovered) component.emit('mousemove');else { + component.emit('mouseover'); + isHovered = true; + } + } else if (isHovered) { + component.emit('mouseout'); + isHovered = false; + } + }); + this.on('click', function () { + if (isHovered) component.emit('click');else component.emit('offClick'); + }); + this.on('mousedown', function () { + if (isHovered) component.emit('mousedown'); + }); + this.on('mouseup', function () { + if (isHovered) component.emit('mouseup'); + }); + } + /** + * @method intersection + * @description Returns an intersection data + * @param {Component} component A component that intersects with mouse ray (or doesn't) + * @param {Boolean} nested Whether component's children should be tracked or not + * @return {Array} intersection data. + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "intersection", + value: function intersection(_ref) { + var native = _ref.native; + var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (native.children.length > 0 && nested) { + var objects = []; + native.traverse(function (child) { + return objects.push(child); + }); + return this.raycaster.intersectObjects(objects); + } + + return this.raycaster.intersectObject(native); + } + /** + * @method project + * @description Returns a vector based on mouse ray intersection with plane + * @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used + * @param {Vector3} [target] Optional target + * @return {Vector3} An intersection point. + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "project", + value: function project() { + var plane = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.projectionPlane; + var target = arguments.length > 1 ? arguments[1] : undefined; + return this.raycaster.ray.intersectPlane(plane, target); + } + /** + * @method hovers + * @description Returns a boolean based on intersection data (Whether mouse hovers the component) + * @param {Component} component A component that intersects with mouse ray (or doesn't) + * @param {Boolean} nested Whether component's children should be tracked or not + * @return {Boolean} Whether the component is hovered. + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "hovers", + value: function hovers(component) { + var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return this.intersection(component, nested).length > 0; + } + /** + * Mouse ray + * @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray + * @public + */ + + }, { + key: "ray", + get: function get() { + return this.raycaster.ray; + } + /** + * Mouse x [-1; 1] + * @member {Number} module:modules/app.VirtualMouseModule#x + * @public + */ + + }, { + key: "x", + get: function get() { + return this.mouse.x; + } + /** + * Mouse y [-1; 1] + * @member {Number} module:modules/app.VirtualMouseModule#y + * @public + */ + + }, { + key: "y", + get: function get() { + return this.mouse.y; + } + }]); + + inherits(VirtualMouseModule, _Events); + + return VirtualMouseModule; + }(minivents_commonjs); + + /** + * @class ControlsModule + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new WHS.PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule(), + * new ControlsModule.from(new THREE.TrackballControls()) + * ]); + */ + + var ControlsModule = + /*#__PURE__*/ + function () { + createClass(ControlsModule, null, [{ + key: "from", + value: function from(controls) { + return new ControlsModule({ + controls: controls + }); + } + }]); + + function ControlsModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ControlsModule); + + this.params = Object.assign({ + controls: false, + fix: function fix(controls) { + return controls; + }, + update: function update(c) { + this.controls.update(c.getDelta()); + } + }, params); + this.controls = this.params.controls; + this.update = this.params.update; + } + + createClass(ControlsModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.define('controls'); + + _manager.require('events', function () { + return new EventsPatchModule(); + }); + } + /** + * @method setControls + * @description Set working controls + * @param {Object} controls Working three.js controls object. + * @return {this} + * @memberof module:modules/app.ControlsModule + */ + + }, { + key: "setControls", + value: function setControls(controls) { + this.controls = controls; + return this; + } + /** + * @method setUpdate + * @description Set controls update function + * @param {Function} update Update function + * @return {this} + * @memberof module:modules/app.ControlsModule + */ + + }, { + key: "setUpdate", + value: function setUpdate(update) { + this.update = update; + return this; + } + }, { + key: "integrate", + value: function integrate(self) { + self.updateLoop = new Loop(self.update.bind(self)); + self.updateLoop.start(this); + } + }]); + + return ControlsModule; + }(); + + /** + * @class FogModule + * @category modules/app + * @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object. + * @param {String} [type=exp2] - The type of fog - exp2 or linear + * @memberof module:modules/app + * @example How to create and apply a FogModule + * const fogModule = new FogModule({ + * color: 0xffffff, + * density: 0.03, + * near: 20, + * far: 200 + * }, 'exp2'); + * + * new App([ + * ..., + * fogModule + * ]); + */ + + var FogModule = + /*#__PURE__*/ + function () { + function FogModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var type = arguments.length > 1 ? arguments[1] : undefined; + + classCallCheck(this, FogModule); + + this.params = Object.assign({ + color: 0xefd1b5, + density: 0.020, + near: 10, + far: 1000 + }, params); + if (!type || type === 'exp2') this.fog = new FogExp2(this.params.color, this.params.density);else if (type === 'linear') this.fog = new Fog(this.params.color, this.params.near, this.params.far); + } + + createClass(FogModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.set('fog', this.fog); + + _manager.get('scene').fog = this.fog; + } + }]); + + return FogModule; + }(); + + var isEqualDefault = function isEqualDefault(a, b) { + if (a === b) return true;else if (a && a.equals && a.equals(b)) return true; + return false; + }; + /** + * @class StateModule + * @description `StateModule` is useful for apps, where you need state manipulation. + * This can be: _transitions between screens, games, development moments_. + * You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example. + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a state module + * new App([ + * // ... + * new StateModule().default({ + * sphereColor: 0xff0000 + * }) + * ]); + */ + + + var StateModule = + /*#__PURE__*/ + function () { + createClass(StateModule, null, [{ + key: "actionGenerate", + value: function actionGenerate(isEqual) { + return function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}, '']; + + var _ref = arguments.length > 1 ? arguments[1] : undefined, + key = _ref.key, + data = _ref.data; + + if (isEqual(state[0][key], data)) return state; + state[0][key] = data; + state[1] = key; + return state; + }; + } + }]); + + function StateModule() { + var equalCheck = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : isEqualDefault; + + classCallCheck(this, StateModule); + + this.store = createStore(StateModule.actionGenerate(equalCheck)); + this.configuration = {}; + this.currentConfig = 'default'; + this.prevConfig = 'default'; + } + /** + * @method default + * @description Add default configuration. + * @param {Object} data Configuration setup + * @memberof module:modules/app.StateModule + * @example + * new WHS.StateModule().default({ + * sphereColor: UTILS.$colors.mesh, + * planeColor: 0x447F8B + * }) + */ + + + createClass(StateModule, [{ + key: "default", + value: function _default(data) { + this.config({ + default: data + }); + return this; + } + /** + * @method setEqualCheck + * @description Sets an equalCheck function + * @param {Function} func function to generate equal check + * @memberof module:modules/app.StateModule + */ + + }, { + key: "setEqualCheck", + value: function setEqualCheck(func) { + this.store.replaceReducer(StateModule.actionGenerate(func)); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.define('state'); + } + /** + * @method config + * @description Load configurations from object. + * @param {Object} configs Configuration data + * @memberof module:modules/app.StateModule + * @example Adding `green` configuration + * state.config({ + * green: { + * sphereColor: 0x00ff00, + * planeColor: 0x00ff00 + * } + * }); + */ + + }, { + key: "config", + value: function config(configs) { + for (var key in configs) { + if (key) { + this.configuration[key] = key === 'default' ? configs[key] : Object.assign({}, this.configuration.default, configs[key]); + } + } + } + /** + * @method update + * @description Load updates from object. + * @param {Object} updates Updates data + * @memberof module:modules/app.StateModule + * @example Update callback for `sphereColor` + * state.update({ + * sphereColor: color => sphere.material.color.setHex(color) + * }); + */ + + }, { + key: "update", + value: function update() { + var _this = this; + + var updates = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.store.subscribe(function () { + var _this$store$getState = _this.store.getState(), + _this$store$getState2 = slicedToArray(_this$store$getState, 2), + data = _this$store$getState2[0], + changedKey = _this$store$getState2[1]; + + var callback = updates[changedKey]; + if (callback) callback(data[changedKey]); + }); + } + /** + * @method to + * @description Switch to configuration. + * @param {String} configName Configuration name. + * @memberof module:modules/app.StateModule + * @example Changes configuration to `green` + * state.to('green'); + */ + + }, { + key: "to", + value: function to(configName) { + this.prevConfig = this.currentConfig; + this.currentConfig = configName; + var config = this.configuration[configName] ? this.configuration[configName] : this.configuration.default; + this.set(config); + } + /** + * @method set + * @description Set current parameters. + * @param {Object} data Configuration parameters. + * @memberof module:modules/app.StateModule + * @example + * state.set({ + * sphereColor: 0x00ff00 + * }); + */ + + }, { + key: "set", + value: function set(data) { + for (var key in data) { + if (key) this.store.dispatch({ + type: 'ADD', + key: key, + data: data[key] + }); + } + } + /** + * @method get + * @description Return data of parameter. + * @param {String} key Parameter name. + * @memberof module:modules/app.StateModule + * @example + * state.get('sphereColor'); // 0x00ff00 + */ + + }, { + key: "get", + value: function get(key) { + return this.store.getState()[0][key]; + } + /** + * @method prev + * @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`. + * @param {String} config Configuration name. + * @param {Any} trueVal Value returned if condition is truthy. + * @param {Any} falseVal Value returned if condition is falsy. + * @memberof module:modules/app.StateModule + */ + + }, { + key: "prev", + value: function prev(config, trueVal, falseVal) { + return this.prevConfig === config ? trueVal : falseVal; + } + /** + * @method current + * @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`. + * @param {String} config Configuration name. + * @param {Any} trueVal Value returned if condition is truthy. + * @param {Any} falseVal Value returned if condition is falsy. + * @memberof module:modules/app.StateModule + */ + + }, { + key: "current", + value: function current(config, trueVal, falseVal) { + return this.currentConfig === config ? trueVal : falseVal; + } + }]); + + return StateModule; + }(); + + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finter swipe + + var ThreeOrbitControls = + /*#__PURE__*/ + function (_EventDispatcher) { + function ThreeOrbitControls(object, domElement, eventHandler) { + var _this; + + classCallCheck(this, ThreeOrbitControls); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ThreeOrbitControls).call(this)); + _this.object = object; + _this.domElement = domElement === undefined ? document : domElement; + _this.eventHandler = eventHandler; // Set to false to disable this control + + _this.enabled = true; // "target" sets the location of focus, where the object orbits around + + _this.target = new Vector3(); // How far you can dolly in and out ( PerspectiveCamera only ) + + _this.minDistance = 0; + _this.maxDistance = Infinity; // How far you can zoom in and out ( OrthographicCamera only ) + + _this.minZoom = 0; + _this.maxZoom = Infinity; // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + + _this.minPolarAngle = 0; // radians + + _this.maxPolarAngle = Math.PI; // radians + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + + _this.minAzimuthAngle = -Infinity; // radians + + _this.maxAzimuthAngle = Infinity; // radians + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + + _this.enableDamping = false; + _this.dampingFactor = 0.25; // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + + _this.enableZoom = true; + _this.zoomSpeed = 1.0; // Set to false to disable rotating + + _this.enableRotate = true; + _this.rotateSpeed = 1.0; // Set to false to disable panning + + _this.enablePan = true; + _this.keyPanSpeed = 7.0; // pixels moved per arrow key push + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + + _this.autoRotate = false; + _this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + // Set to false to disable use of the keys + + _this.enableKeys = true; // The four arrow keys + + _this.keys = { + LEFT: 37, + UP: 38, + RIGHT: 39, + BOTTOM: 40 + }; // Mouse buttons + + _this.mouseButtons = { + ORBIT: MOUSE.LEFT, + ZOOM: MOUSE.MIDDLE, + PAN: MOUSE.RIGHT + }; // for reset + + _this.target0 = _this.target.clone(); + _this.position0 = _this.object.position.clone(); + _this.zoom0 = _this.object.zoom; // + // public methods + // + + _this.getPolarAngle = function () { + return spherical.phi; + }; + + _this.getAzimuthalAngle = function () { + return spherical.theta; + }; + + _this.reset = function () { + _this.target.copy(_this.target0); + + _this.object.position.copy(_this.position0); + + _this.object.zoom = _this.zoom0; + + _this.object.updateProjectionMatrix(); + + _this.dispatchEvent(changeEvent); + + _this.update(); + + state = STATE.NONE; + }; // this method is exposed, but perhaps it would be better if we can make it private... + + + _this.update = function () { + var offset = new Vector3(); // so camera.up is the orbit axis + + var quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0)); + var quatInverse = quat.clone().inverse(); + var lastPosition = new Vector3(); + var lastQuaternion = new Quaternion(); + return function () { + var position = _this.object.position; + offset.copy(position).sub(_this.target); // rotate offset to "y-axis-is-up" space + + offset.applyQuaternion(quat); // angle from z-axis around y-axis + + spherical.setFromVector3(offset); + if (_this.autoRotate && state === STATE.NONE) rotateLeft(getAutoRotationAngle()); + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; // restrict theta to be between desired limits + + spherical.theta = Math.max(_this.minAzimuthAngle, Math.min(_this.maxAzimuthAngle, spherical.theta)); // restrict phi to be between desired limits + + spherical.phi = Math.max(_this.minPolarAngle, Math.min(_this.maxPolarAngle, spherical.phi)); + spherical.makeSafe(); + spherical.radius *= scale; // restrict radius to be between desired limits + + spherical.radius = Math.max(_this.minDistance, Math.min(_this.maxDistance, spherical.radius)); // move target to panned location + + _this.target.add(panOffset); + + offset.setFromSpherical(spherical); // rotate offset back to "camera-up-vector-is-up" space + + offset.applyQuaternion(quatInverse); + position.copy(_this.target).add(offset); + + _this.object.lookAt(_this.target); + + if (_this.enableDamping === true) { + sphericalDelta.theta *= 1 - _this.dampingFactor; + sphericalDelta.phi *= 1 - _this.dampingFactor; + } else sphericalDelta.set(0, 0, 0); + + scale = 1; + panOffset.set(0, 0, 0); // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if (zoomChanged || lastPosition.distanceToSquared(_this.object.position) > EPS || 8 * (1 - lastQuaternion.dot(_this.object.quaternion)) > EPS) { + _this.dispatchEvent(changeEvent); + + lastPosition.copy(_this.object.position); + lastQuaternion.copy(_this.object.quaternion); + zoomChanged = false; + return true; + } + + return false; + }(); + }; + + _this.dispose = function () { + _this.domElement.removeEventListener('contextmenu', onContextMenu, false); + + _this.domElement.removeEventListener('mousedown', onMouseDown, false); + + _this.domElement.removeEventListener('wheel', onMouseWheel, false); + + _this.domElement.removeEventListener('touchstart', onTouchStart, false); + + _this.domElement.removeEventListener('touchend', onTouchEnd, false); + + _this.domElement.removeEventListener('touchmove', onTouchMove, false); + + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + window.removeEventListener('keydown', onKeyDown, false); // this.dispatchEvent( { type: 'dispose' } ); // should this be added here? + }; // + // internals + // + + + var changeEvent = { + type: 'change' + }; + var startEvent = { + type: 'start' + }; + var endEvent = { + type: 'end' + }; + var STATE = { + NONE: -1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_DOLLY: 4, + TOUCH_PAN: 5 + }; + var state = STATE.NONE; + var EPS = 0.000001; // current position in spherical coordinates + + var spherical = new Spherical(); + var sphericalDelta = new Spherical(); + var scale = 1; + var panOffset = new Vector3(); + var zoomChanged = false; + var rotateStart = new Vector2(); + var rotateEnd = new Vector2(); + var rotateDelta = new Vector2(); + var panStart = new Vector2(); + var panEnd = new Vector2(); + var panDelta = new Vector2(); + var dollyStart = new Vector2(); + var dollyEnd = new Vector2(); + var dollyDelta = new Vector2(); + + var getAutoRotationAngle = function getAutoRotationAngle() { + return 2 * Math.PI / 60 / 60 * _this.autoRotateSpeed; + }; + + var getZoomScale = function getZoomScale() { + return Math.pow(0.95, _this.zoomSpeed); + }; + + var rotateLeft = function rotateLeft(angle) { + sphericalDelta.theta -= angle; + }; + + var rotateUp = function rotateUp(angle) { + sphericalDelta.phi -= angle; + }; + + var panLeft = function () { + var v = new Vector3(); + return function (distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + + v.multiplyScalar(-distance); + panOffset.add(v); + }; + }(); + + var panUp = function () { + var v = new Vector3(); + return function (distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix + + v.multiplyScalar(distance); + panOffset.add(v); + }; + }(); // deltaX and deltaY are in pixels; right and down are positive + + + var pan = function () { + var offset = new Vector3(); + return function (deltaX, deltaY) { + var element = _this.domElement === document ? _this.domElement.body : _this.domElement; + + if (_this.object instanceof PerspectiveCamera) { + // perspective + var position = _this.object.position; + offset.copy(position).sub(_this.target); + var targetDistance = offset.length(); // half of the fov is center to top of screen + + targetDistance *= Math.tan(_this.object.fov / 2 * Math.PI / 180.0); // we actually don't use screenWidth, since perspective camera is fixed to screen height + + panLeft(2 * deltaX * targetDistance / element.clientHeight, _this.object.matrix); + panUp(2 * deltaY * targetDistance / element.clientHeight, _this.object.matrix); + } else if (_this.object instanceof OrthographicCamera) { + // orthographic + panLeft(deltaX * (_this.object.right - _this.object.left) / _this.object.zoom / element.clientWidth, _this.object.matrix); + panUp(deltaY * (_this.object.top - _this.object.bottom) / _this.object.zoom / element.clientHeight, _this.object.matrix); + } else { + // camera neither orthographic nor perspective + console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.'); + _this.enablePan = false; + } + }; + }(); + + var dollyIn = function dollyIn(dollyScale) { + if (_this.object instanceof PerspectiveCamera) scale /= dollyScale;else if (_this.object instanceof OrthographicCamera) { + _this.object.zoom = Math.max(_this.minZoom, Math.min(_this.maxZoom, _this.object.zoom * dollyScale)); + + _this.object.updateProjectionMatrix(); + + zoomChanged = true; + } else { + console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.'); + _this.enableZoom = false; + } + }; + + var dollyOut = function dollyOut(dollyScale) { + if (_this.object instanceof PerspectiveCamera) scale *= dollyScale;else if (_this.object instanceof OrthographicCamera) { + _this.object.zoom = Math.max(_this.minZoom, Math.min(_this.maxZoom, _this.object.zoom / dollyScale)); + + _this.object.updateProjectionMatrix(); + + zoomChanged = true; + } else { + console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.'); + _this.enableZoom = false; + } + }; // + // event callbacks - update the object state + // + + + var handleMouseDownRotate = function handleMouseDownRotate(event) { + // console.log( 'handleMouseDownRotate' ); + rotateStart.set(event.clientX, event.clientY); + }; + + var handleMouseDownDolly = function handleMouseDownDolly(event) { + // console.log( 'handleMouseDownDolly' ); + dollyStart.set(event.clientX, event.clientY); + }; + + var handleMouseDownPan = function handleMouseDownPan(event) { + // console.log( 'handleMouseDownPan' ); + panStart.set(event.clientX, event.clientY); + }; + + var handleMouseMoveRotate = function handleMouseMoveRotate(event) { + // console.log( 'handleMouseMoveRotate' ); + rotateEnd.set(event.clientX, event.clientY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = _this.domElement === document ? _this.domElement.body : _this.domElement; // rotating across whole screen goes 360 degrees around + + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * _this.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180 + + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * _this.rotateSpeed); + rotateStart.copy(rotateEnd); + + _this.update(); + }; + + var handleMouseMoveDolly = function handleMouseMoveDolly(event) { + // console.log( 'handleMouseMoveDolly' ); + dollyEnd.set(event.clientX, event.clientY); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) dollyIn(getZoomScale());else if (dollyDelta.y < 0) dollyOut(getZoomScale()); + dollyStart.copy(dollyEnd); + + _this.update(); + }; + + var handleMouseMovePan = function handleMouseMovePan(event) { + // console.log( 'handleMouseMovePan' ); + panEnd.set(event.clientX, event.clientY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + + _this.update(); + }; + + var handleMouseWheel = function handleMouseWheel(event) { + // console.log( 'handleMouseWheel' ); + if (event.deltaY < 0) dollyOut(getZoomScale());else if (event.deltaY > 0) dollyIn(getZoomScale()); + + _this.update(); + }; + + var handleKeyDown = function handleKeyDown(event) { + // console.log( 'handleKeyDown' ); + switch (event.keyCode) { + case _this.keys.UP: + pan(0, _this.keyPanSpeed); + + _this.update(); + + break; + + case _this.keys.BOTTOM: + pan(0, -_this.keyPanSpeed); + + _this.update(); + + break; + + case _this.keys.LEFT: + pan(_this.keyPanSpeed, 0); + + _this.update(); + + break; + + case _this.keys.RIGHT: + pan(-_this.keyPanSpeed, 0); + + _this.update(); + + break; + } + }; + + var handleTouchStartRotate = function handleTouchStartRotate(event) { + // console.log( 'handleTouchStartRotate' ); + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + }; + + var handleTouchStartDolly = function handleTouchStartDolly(event) { + // console.log( 'handleTouchStartDolly' ); + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyStart.set(0, distance); + }; + + var handleTouchStartPan = function handleTouchStartPan(event) { + // console.log( 'handleTouchStartPan' ); + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + }; + + var handleTouchMoveRotate = function handleTouchMoveRotate(event) { + // console.log( 'handleTouchMoveRotate' ); + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = _this.domElement === document ? _this.domElement.body : _this.domElement; // rotating across whole screen goes 360 degrees around + + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * _this.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180 + + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * _this.rotateSpeed); + rotateStart.copy(rotateEnd); + + _this.update(); + }; + + var handleTouchMoveDolly = function handleTouchMoveDolly(event) { + // console.log( 'handleTouchMoveDolly' ); + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyEnd.set(0, distance); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) dollyOut(getZoomScale());else if (dollyDelta.y < 0) dollyIn(getZoomScale()); + dollyStart.copy(dollyEnd); + + _this.update(); + }; + + var handleTouchMovePan = function handleTouchMovePan(event) { + // console.log( 'handleTouchMovePan' ); + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + + _this.update(); + }; + // event handlers - FSM: listen for events and reset state + // + + + var onMouseDown = function onMouseDown(event) { + if (_this.enabled === false) return; + event.preventDefault(); + + if (event.button === _this.mouseButtons.ORBIT) { + if (_this.enableRotate === false) return; + handleMouseDownRotate(event); + state = STATE.ROTATE; + } else if (event.button === _this.mouseButtons.ZOOM) { + if (_this.enableZoom === false) return; + handleMouseDownDolly(event); + state = STATE.DOLLY; + } else if (event.button === _this.mouseButtons.PAN) { + if (_this.enablePan === false) return; + handleMouseDownPan(event); + state = STATE.PAN; + } + + if (state !== STATE.NONE) { + _this.eventHandler.on('mousemove', onMouseMove, false); + + _this.eventHandler.on('mouseup', onMouseUp, false); + + _this.dispatchEvent(startEvent); + } + }; + + var onMouseMove = function onMouseMove(event) { + if (_this.enabled === false) return; + event.preventDefault(); + + if (state === STATE.ROTATE) { + if (_this.enableRotate === false) return; + handleMouseMoveRotate(event); + } else if (state === STATE.DOLLY) { + if (_this.enableZoom === false) return; + handleMouseMoveDolly(event); + } else if (state === STATE.PAN) { + if (_this.enablePan === false) return; + handleMouseMovePan(event); + } + }; + + var onMouseUp = function onMouseUp(event) { + if (_this.enabled === false) return; + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + + _this.dispatchEvent(endEvent); + + state = STATE.NONE; + }; + + var onMouseWheel = function onMouseWheel(event) { + if (_this.enabled === false || _this.enableZoom === false || state !== STATE.NONE && state !== STATE.ROTATE) return; + event.preventDefault(); + event.stopPropagation(); + handleMouseWheel(event); + + _this.dispatchEvent(startEvent); // not sure why these are here... + + + _this.dispatchEvent(endEvent); + }; + + var onKeyDown = function onKeyDown(event) { + if (_this.enabled === false || _this.enableKeys === false || _this.enablePan === false) return; + handleKeyDown(event); + }; + + var onTouchStart = function onTouchStart(event) { + if (_this.enabled === false) return; + + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (_this.enableRotate === false) return; + handleTouchStartRotate(event); + state = STATE.TOUCH_ROTATE; + break; + + case 2: + // two-fingered touch: dolly + if (_this.enableZoom === false) return; + handleTouchStartDolly(event); + state = STATE.TOUCH_DOLLY; + break; + + case 3: + // three-fingered touch: pan + if (_this.enablePan === false) return; + handleTouchStartPan(event); + state = STATE.TOUCH_PAN; + break; + + default: + state = STATE.NONE; + } + + if (state !== STATE.NONE) _this.dispatchEvent(startEvent); + }; + + var onTouchMove = function onTouchMove(event) { + if (_this.enabled === false) return; + event.preventDefault(); + event.stopPropagation(); + + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (_this.enableRotate === false) return; + if (state !== STATE.TOUCH_ROTATE) return; // is this needed?... + + handleTouchMoveRotate(event); + break; + + case 2: + // two-fingered touch: dolly + if (_this.enableZoom === false) return; + if (state !== STATE.TOUCH_DOLLY) return; // is this needed?... + + handleTouchMoveDolly(event); + break; + + case 3: + // three-fingered touch: pan + if (_this.enablePan === false) return; + if (state !== STATE.TOUCH_PAN) return; // is this needed?... + + handleTouchMovePan(event); + break; + + default: + state = STATE.NONE; + } + }; + + var onTouchEnd = function onTouchEnd(event) { + if (_this.enabled === false) return; + + _this.dispatchEvent(endEvent); + + state = STATE.NONE; + }; + + var onContextMenu = function onContextMenu(event) { + event.preventDefault(); + }; // + + + _this.eventHandler.on('contextmenu', onContextMenu, false); + + _this.eventHandler.on('mousedown', onMouseDown, false); + + _this.eventHandler.on('wheel', onMouseWheel, false); + + _this.eventHandler.on('touchstart', onTouchStart, false); + + _this.eventHandler.on('touchend', onTouchEnd, false); + + _this.eventHandler.on('touchmove', onTouchMove, false); + + _this.eventHandler.on('keydown', onKeyDown, false); // force an update at start + + + _this.update(); + + return _this; + } + + createClass(ThreeOrbitControls, [{ + key: "center", + get: function get() { + console.warn('OrbitControls: .center has been renamed to .target'); + return this.target; + } + }, { + key: "noZoom", + get: function get() { + console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + return !this.enableZoom; + }, + set: function set(value) { + console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + this.enableZoom = !value; + } + }, { + key: "noRotate", + get: function get() { + console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + return !this.enableRotate; + }, + set: function set(value) { + console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + this.enableRotate = !value; + } + }, { + key: "noPan", + get: function get() { + console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + return !this.enablePan; + }, + set: function set(value) { + console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + this.enablePan = !value; + } + }, { + key: "noKeys", + get: function get() { + console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + return !this.enableKeys; + }, + set: function set(value) { + console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + this.enableKeys = !value; + } + }, { + key: "staticMoving", + get: function get() { + console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + return !this.enableDamping; + }, + set: function set(value) { + console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + this.enableDamping = !value; + } + }, { + key: "dynamicDampingFactor", + get: function get() { + console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + return this.dampingFactor; + }, + set: function set(value) { + console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + this.dampingFactor = value; + } + }]); + + inherits(ThreeOrbitControls, _EventDispatcher); + + return ThreeOrbitControls; + }(EventDispatcher); + + /** + * @class OrbitControlsModule + * @category modules/app + * @param {Object} [params] + * @param {Object} [params.object=camera] Object to which controls are applied. + * @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector. + * @param {Boolean} [params.follow=false] Follow the target + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new WHS.PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule(), + * new OrbitControlsModule() + * ]); + */ + + var OrbitControlsModule = + /*#__PURE__*/ + function (_ControlsModule) { + function OrbitControlsModule() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, OrbitControlsModule); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(OrbitControlsModule).call(this, params)); + _this.params = Object.assign({ + follow: false, + object: null, + target: new Vector3() + }, params); + return _this; + } + + createClass(OrbitControlsModule, [{ + key: "manager", + value: function manager(_manager) { + get$3(getPrototypeOf$2(OrbitControlsModule.prototype), "manager", this).call(this, _manager); + + var _this$params = this.params, + obj = _this$params.object, + follow = _this$params.follow, + target = _this$params.target; + var object = obj ? obj.native : _manager.get('camera').native; + var controls = new ThreeOrbitControls(object, _manager.get('element'), _manager.handler); + var updateProcessor = follow ? function (c) { + controls.update(c.getDelta()); + controls.target.copy(target); + } : function (c) { + controls.update(c.getDelta()); + }; + this.setControls(controls); + this.setUpdate(updateProcessor); + + _manager.update({ + camera: function camera(_camera) { + if (obj) return; + controls.object = _camera.native; + }, + element: function element(_element) { + controls.domElement = _element; + } + }); + + controls.target.copy(target); + } + }]); + + inherits(OrbitControlsModule, _ControlsModule); + + return OrbitControlsModule; + }(ControlsModule); + + /** @module modules/app/controls */ + + /** @module modules/app */ + + /** + * @class DynamicGeometryModule + * @category modules/mesh + * @param {Object} [params={attributes: false}] - params + * @param {Boolean} [patchEvents=true] + * @memberof module:modules/mesh + */ + var DynamicGeometryModule = + /*#__PURE__*/ + function () { + function DynamicGeometryModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DynamicGeometryModule); + + this.params = Object.assign({ + attributes: false + }, params); + } + + createClass(DynamicGeometryModule, [{ + key: "integrate", + value: function integrate(self) { + var _this = this; + + var params = self.params; + + this.g_ = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (this.buildGeometry) { + this.native.geometry = this.buildGeometry(this.updateParams({ + geometry: params + })); + } + }; + + if (params.attributes) { + var _loop = function _loop(key) { + if (key) { + Object.defineProperty(_this, "g_".concat(key), { + get: function get() { + return this.native.geometry.parameters[key]; + }, + set: function set(value) { + this.native.geometry = this.buildGeometry(this.updateParams({ + geometry: defineProperty$3({}, key, value) + })); + }, + configurable: true, + enumerable: true + }); + } + }; + + for (var key in this.params.geometry) { + _loop(key); + } + } + } + }]); + + return DynamicGeometryModule; + }(); + + var loader = new TextureLoader(); + /** + * @class TextureModule + * @category modules/mesh + * @description A TextureModule can be applied to any Mesh or Model. + * @param {Array} [textures] - array of texture objects + * @memberof module:modules/mesh + * @example Creating an instance. url takes a path, or a data object. + * var woodTexture = new TextureModule({ + * url: `${process.assetsPath}/textures/wood.jpg` + * }); + * @example More comprehensive example, wood texture applied to a Box. + * new Box({ + * geometry: { + * width: 2, + * height: 2, + * depth: 2 + * }, + * modules: [ + * new TextureModule({ + * url: `path/to/texture.jpg`, + * repeat: new THREE.Vector2(1, 1) // optional + * }) + * ], + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * position: [50, 60, 70] + * }).addTo(app); + */ + + var TextureModule = + /*#__PURE__*/ + function () { + createClass(TextureModule, null, [{ + key: "load", + value: function load(url) { + return new TextureModule({ + url: url + }).textures[0][1]; + } + }]); + + function TextureModule() { + var _this = this; + + classCallCheck(this, TextureModule); + + defineProperty$3(defineProperty$3(this, "textures", []), "bridge", { + material: function material(_material, self) { + self.textures.forEach(function (texture) { + _material[texture[0]] = texture[1]; + }); + _material.needsUpdate = true; + return _material; + } + }); + + for (var _len = arguments.length, textures = new Array(_len), _key = 0; _key < _len; _key++) { + textures[_key] = arguments[_key]; + } + + textures.forEach(function (_ref) { + var url = _ref.url, + _ref$type = _ref.type, + type = _ref$type === void 0 ? 'map' : _ref$type, + _ref$offset = _ref.offset, + offset = _ref$offset === void 0 ? new Vector2(0, 0) : _ref$offset, + _ref$repeat = _ref.repeat, + repeat = _ref$repeat === void 0 ? new Vector2(1, 1) : _ref$repeat, + _ref$wrap = _ref.wrap, + wrap = _ref$wrap === void 0 ? RepeatWrapping : _ref$wrap, + _ref$mapping = _ref.mapping, + mapping = _ref$mapping === void 0 ? UVMapping : _ref$mapping, + _ref$fix = _ref.fix, + fix = _ref$fix === void 0 ? function (tex) { + return tex; + } : _ref$fix; + var texture = loader.load(url); + + if (wrap.length > 0) { + texture.wrapS = wrap[0]; + texture.wrapT = wrap[1]; + } else texture.wrapS = texture.wrapT = wrap; + + texture.mapping = mapping; + texture.offset.copy(offset); + texture.repeat.copy(repeat); + texture.magFilter = NearestFilter; + texture.minFilter = LinearMipMapLinearFilter; + + _this.textures.push([type, fix(texture)]); + }); + } + + return TextureModule; + }(); + + /** + * @class AnimationModule + * @category modules/mesh + * @description Convenience module that wraps the three.js animation system + * @param {App} app - the app + * @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically + * @param {Object} [params={speed: 1}] - the params + * @memberof module:modules/mesh + * @example Create animation module and play a given clip of an imported model + * const animationModule = new AnimationModule(app, false, { + * speed: 1.2 // speed up animation by 20% + * }); + * + * new Importer({ + * parser(geometry, materials) { + * // Override parse to generate a skinnedMesh, needed for skinned models + * return new THREE.SkinnedMesh(geometry, materials); + * }, + * + * url: `path/to/model.json`, + * useCustomMaterial: true, + * + * material: new THREE.MeshStandardMaterial({ + * skinning: true + * }), + * + * modules: [animationModule] + * }).addTo(app).then(() => { + * // adding model to app returns a promise, so pipe the function to kick off the animation clip + * animationModule.play('clipName'); + * }); + */ + + var AnimationModule = + /*#__PURE__*/ + function () { + function AnimationModule(app, isDeferred) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, AnimationModule); + + defineProperty$3(this, "bridge", { + mesh: function mesh(_mesh, self) { + _mesh.geometry.skeleton = _mesh.skeleton; + self.mixer = new AnimationMixer(_mesh.geometry); + self.clips = _mesh.geometry.animations; + return _mesh; + } + }); + + this.params = Object.assign({ + speed: 1 + }, params); + this.app = app; + this.isDeferred = isDeferred; + } + /** + * @method play + * @instance + * @description Plays the given clip name + * @param {String} clipName - the clip to play + * @return {THREE.AnimationAction} Playing action + * @memberof module:modules/mesh.AnimationModule + */ + + + createClass(AnimationModule, [{ + key: "play", + value: function play(clipName) { + var clip = AnimationClip.findByName(this.clips, clipName); + return this.mixer.clipAction(clip).play(); + } + /** + * @method update + * @instance + * @description Update the mixer (being called on frame animation loop) + * @memberof module:modules/mesh.AnimationModule + */ + + }, { + key: "update", + value: function update(clock) { + if (this.mixer) this.mixer.update(clock.getDelta() * this.params.speed); + } + }, { + key: "integrate", + value: function integrate(self) { + self.loop = new Loop(function (clock) { + return self.update(clock); + }); + if (!self.isDeferred) self.loop.start(self.app); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.define('animation'); + } + }]); + + return AnimationModule; + }(); + + /** @module modules/mesh */ + + /** + * @class DefineModule + * @category modules + * @param {String} name + * @param {Object} data + * @memberof module:modules + * @example Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules + * new App([ + * // ... + * new DefineModule('camera', new PerspectiveCamera()) + * ]); + */ + var DefineModule = + /*#__PURE__*/ + function () { + function DefineModule(name, data) { + classCallCheck(this, DefineModule); + + this.name = name; + this.data = data; + } + + createClass(DefineModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.set(this.name, this.data); + } + }]); + + return DefineModule; + }(); + + /** @module modules */ + + var Model = + /*#__PURE__*/ + function (_Importer) { + function Model(params) { + var _getPrototypeOf2; + + classCallCheck(this, Model); + + console.warn('Model is deprecated. Use Importer instead.'); + + if (params.geometry) { + params.url = params.geometry.path; + params.loader = params.geometry.loader; + } + + for (var _len = arguments.length, additional = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + additional[_key - 1] = arguments[_key]; + } + + return possibleConstructorReturn(this, (_getPrototypeOf2 = getPrototypeOf$2(Model)).call.apply(_getPrototypeOf2, [this, params].concat(additional))); + } + + inherits(Model, _Importer); + + return Model; + }(Importer); + var CameraModule = + /*#__PURE__*/ + function () { + function CameraModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, CameraModule); + + console.warn('CameraModule is deprecated. Use DefineModule instead.'); + this.camera = new PerspectiveCamera$1(params); + } + + createClass(CameraModule, [{ + key: "integrate", + value: function integrate(self) { + this.add(self.camera); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.set('camera', this.camera); + } + }]); + + return CameraModule; + }(); + + /** + * Namespace containing all classes from all modules. Used as global in UMD pattern. + * @namespace WHS + * @example The use of WHS namespace. + * new WHS.App() // core + * new WHS.PerspectiveCamera() // components + * new WHS.ResizeModule() // modules + * WHS.extend() // utils + */ + + exports.Component = Component; + exports.MeshComponent = MeshComponent; + exports.LightComponent = LightComponent; + exports.CameraComponent = CameraComponent; + exports.App = App; + exports.Loop = Loop; + exports.ModuleManager = ModuleManager; + exports.AmbientLight = AmbientLight$1; + exports.DirectionalLight = DirectionalLight$1; + exports.HemisphereLight = HemisphereLight$1; + exports.PointLight = PointLight$1; + exports.SpotLight = SpotLight$1; + exports.AreaLight = AreaLight; + exports.CubeCamera = CubeCamera$1; + exports.OrthographicCamera = OrthographicCamera$1; + exports.PerspectiveCamera = PerspectiveCamera$1; + exports.Box = Box; + exports.Circle = Circle; + exports.Cone = Cone; + exports.Cylinder = Cylinder; + exports.Dodecahedron = Dodecahedron; + exports.Extrude = Extrude; + exports.Icosahedron = Icosahedron; + exports.Lathe = Lathe; + exports.Line = Line$1; + exports.Importer = Importer; + exports.Octahedron = Octahedron; + exports.Parametric = Parametric; + exports.Plane = Plane$1; + exports.Polyhedron = Polyhedron; + exports.Ring = Ring; + exports.Shape = Shape$1; + exports.Sphere = Sphere$1; + exports.Tetrahedron = Tetrahedron; + exports.Text = Text; + exports.Torus = Torus; + exports.Torusknot = Torusknot; + exports.Tube = Tube; + exports.Group = Group$1; + exports.extend = extend; + exports.instruct = instruct; + exports.transformData = transformData; + exports.toArray = toArray; + exports.ElementModule = ElementModule; + exports.RenderingModule = RenderingModule; + exports.SceneModule = SceneModule; + exports.ResizeModule = ResizeModule; + exports.PostProcessorModule = PostProcessorModule; + exports.VirtualMouseModule = VirtualMouseModule; + exports.EventsPatchModule = EventsPatchModule; + exports.ControlsModule = ControlsModule; + exports.FogModule = FogModule; + exports.StateModule = StateModule; + exports.OrbitControlsModule = OrbitControlsModule; + exports.DynamicGeometryModule = DynamicGeometryModule; + exports.TextureModule = TextureModule; + exports.AnimationModule = AnimationModule; + exports.DefineModule = DefineModule; + exports.Model = Model; + exports.CameraModule = CameraModule; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hzLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWludGVnZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvcmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW52b2tlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdGFzay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21pY3JvdGFzay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wZXJmb3JtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1leHQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3ltYm9sLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9zeW1ib2wuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5kLmpzIiwiLi4vc3JjL3V0aWxzL3RyYW5zZm9ybURhdGEuanMiLCIuLi9ub2RlX21vZHVsZXMvdGhyZWUvYnVpbGQvdGhyZWUubW9kdWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbml2ZW50cy9kaXN0L21pbml2ZW50cy5jb21tb25qcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvb2JqZWN0L2NyZWF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktZnJvbS1pdGVyYWJsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5tYXAub2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLmZyb20uanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9tYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9tYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19iaW5kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9yZWZsZWN0L2NvbnN0cnVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL3JlZmxlY3QvY29uc3RydWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY29uc3RydWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcE5hdGl2ZVN1cGVyLmpzIiwiLi4vc3JjL2NvcmUvZXJyb3JzLmpzIiwiLi4vc3JjL2NvcmUvTW9kdWxlU3lzdGVtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2VzL3BvbnlmaWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2VzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlZHV4L2VzL3JlZHV4LmpzIiwiLi4vc3JjL2NvcmUvTW9kdWxlTWFuYWdlci5qcyIsIi4uL3NyYy9jb3JlL0NvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcmVmbGVjdC9nZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9yZWZsZWN0L2dldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3N1cGVyUHJvcEJhc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXQuanMiLCIuLi9zcmMvY29yZS9wcm90b3R5cGUvYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9jb3JlL01lc2hDb21wb25lbnQuanMiLCIuLi9zcmMvY29yZS9MaWdodENvbXBvbmVudC5qcyIsIi4uL3NyYy9jb3JlL0NhbWVyYUNvbXBvbmVudC5qcyIsIi4uL3NyYy9wb2x5ZmlsbC5qcyIsIi4uL3NyYy9jb3JlL0FwcC5qcyIsIi4uL3NyYy9jb3JlL0xvb3AuanMiLCIuLi9zcmMvY29yZS9pbmRleC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9BbWJpZW50TGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9IZW1pc3BoZXJlTGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvUG9pbnRMaWdodC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9TcG90TGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvQXJlYUxpZ2h0LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbGlnaHRzL2luZGV4LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9DdWJlQ2FtZXJhLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMiLCIuLi9zcmMvY29tcG9uZW50cy9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9pbmRleC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9Cb3guanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvQ2lyY2xlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0NvbmUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvQ3lsaW5kZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvRG9kZWNhaGVkcm9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0V4dHJ1ZGUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvSWNvc2FoZWRyb24uanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvTGF0aGUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvTGluZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9JbXBvcnRlci5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9PY3RhaGVkcm9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1BhcmFtZXRyaWMuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvUGxhbmUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvUG9seWhlZHJvbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9SaW5nLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1NoYXBlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1NwaGVyZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UZXRyYWhlZHJvbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UZXh0LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1RvcnVzLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1RvcnVza25vdC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UdWJlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0dyb3VwLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL0VsZW1lbnRNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvUmVuZGVyaW5nTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1NjZW5lTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1Jlc2l6ZU1vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0FkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvQm9rZWhNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbG9yRWRnZXNNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbWJpbmVNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbnZvbHV0aW9uTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9Db3B5TWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9EZXB0aENvbXBhcmlzb25NYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0RvdFNjcmVlbk1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvRmlsbU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvR2xpdGNoTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9Hb2RSYXlzTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9MdW1pbm9zaXR5TWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9PdXRsaW5lQmxlbmRNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL091dGxpbmVFZGdlc01hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvUGl4ZWxhdGlvbk1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvUmVhbGlzdGljQm9rZWhNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL1Nob2NrV2F2ZU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvU01BQUJsZW5kTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9TTUFBV2VpZ2h0c01hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvVG9uZU1hcHBpbmdNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0JsdXJQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQmxvb21QYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQm9rZWhQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQ2xlYXJNYXNrUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0NsZWFyUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0RvdFNjcmVlblBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9GaWxtUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0dsaXRjaFBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9SZW5kZXJQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvR29kUmF5c1Bhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9NYXNrUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1NoYWRlclBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9PdXRsaW5lUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1BpeGVsYXRpb25QYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUmVhbGlzdGljQm9rZWhQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvU2F2ZVBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9TaG9ja1dhdmVQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvaW1hZ2VzL3NtYWEvc2VhcmNoSW1hZ2VEYXRhVVJMLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvaW1hZ2VzL3NtYWEvYXJlYUltYWdlRGF0YVVSTC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1NNQUFQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvVGV4dHVyZVBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9Ub25lTWFwcGluZ1Bhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvY29yZS9FZmZlY3RDb21wb3Nlci5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Qb3N0UHJvY2Vzc29yTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL0V2ZW50c1BhdGNoTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1ZpcnR1YWxNb3VzZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Db250cm9sc01vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Gb2dNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvU3RhdGVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvY29udHJvbHMvbGliL1RocmVlT3JiaXRDb250cm9scy5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9jb250cm9scy9PcmJpdENvbnRyb2xzTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL2NvbnRyb2xzL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvbWVzaC9EeW5hbWljR2VvbWV0cnlNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9tZXNoL1RleHR1cmVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9tZXNoL0FuaW1hdGlvbk1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL21lc2gvaW5kZXguanMiLCIuLi9zcmMvbW9kdWxlcy9EZWZpbmVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9pbmRleC5qcyIsIi4uL3NyYy9kZXByZWNhdGlvbi5qcyIsIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpXG4pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBUaGlzIG1ldGhvZCBvZiBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgbmVlZHMgdG8gYmVcbi8vIGtlcHQgaWRlbnRpY2FsIHRvIHRoZSB3YXkgaXQgaXMgb2J0YWluZWQgaW4gcnVudGltZS5qc1xudmFyIGcgPSAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjYnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVztcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGtleSwgb3duLCBvdXQ7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG93biAmJiBoYXMoZXhwb3J0cywga2V5KSkgY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbiAoQykge1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDKCk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmIChJU19QUk9UTykge1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmICh0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKSBoaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IGdldEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEQpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmICghaGVhZCkge1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAoc2FmZSAmJiB0YXJnZXRba2V5XSkgdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdQcm9taXNlJywgeyAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZih0aGlzKTtcbiAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oY2FsbGJhY2tmbik7XG4gIChyZXN1bHQuZSA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59IH0pO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLlByb21pc2U7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZVwiKTsiLCJ2YXIgX1Byb21pc2UgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9wcm9taXNlXCIpO1xuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IF9Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gc3RlcChrZXksIGFyZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgc3RlcChcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIHN0ZXAoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcbiIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpOyIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbiIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBNRVRBID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWTtcbnZhciAkZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgd2tzRGVmaW5lID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpO1xudmFyIGVudW1LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgX2NyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBnT1BORXh0ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0Jyk7XG52YXIgJEdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BEID0gJEdPUEQuZjtcbnZhciBkUCA9ICREUC5mO1xudmFyIGdPUE4gPSBnT1BORXh0LmY7XG52YXIgJFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgJEpTT04gPSBnbG9iYWwuSlNPTjtcbnZhciBfc3RyaW5naWZ5ID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIEhJRERFTiA9IHdrcygnX2hpZGRlbicpO1xudmFyIFRPX1BSSU1JVElWRSA9IHdrcygndG9QcmltaXRpdmUnKTtcbnZhciBpc0VudW0gPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9QU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgVVNFX05BVElWRSA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbic7XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRQKHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChpdCwga2V5LCBEKSB7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZiAocHJvdG9EZXNjKSBkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmIChwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKSBkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90bykgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFELmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzKGl0LCBISURERU4pKSBkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkgaXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7IGVudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApIHtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsID4gaSkgJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYgKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBnT1BOKHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgdmFyIElTX09QID0gaXQgPT09IE9iamVjdFByb3RvO1xuICB2YXIgbmFtZXMgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvKSAkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKSBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXQgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJykuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmICFyZXF1aXJlKCcuL19saWJyYXJ5JykpIHtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIHdrc0V4dC5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFN5bWJvbDogJFN5bWJvbCB9KTtcblxuZm9yICh2YXIgZXM2U3ltYm9scyA9IChcbiAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBqID0gMDsgZXM2U3ltYm9scy5sZW5ndGggPiBqOyl3a3MoZXM2U3ltYm9sc1tqKytdKTtcblxuZm9yICh2YXIgd2VsbEtub3duU3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGsgPSAwOyB3ZWxsS25vd25TeW1ib2xzLmxlbmd0aCA+IGs7KSB3a3NEZWZpbmUod2VsbEtub3duU3ltYm9sc1trKytdKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihzeW0pIHtcbiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gU3ltYm9sUmVnaXN0cnkpIGlmIChTeW1ib2xSZWdpc3RyeVtrZXldID09PSBzeW0pIHJldHVybiBrZXk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7IGE6IFMgfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7XG4gICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgIHZhciBpID0gMTtcbiAgICB2YXIgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgJHJlcGxhY2VyID0gcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmICghaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKSByZXBsYWNlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9sc1wiKTsiLCIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmtleXM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXNcIik7IiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTsiLCJ2YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHk7IiwidmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcblxudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9sc1wiKTtcblxudmFyIF9PYmplY3Qka2V5cyA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9rZXlzXCIpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi9kZWZpbmVQcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIHZhciBvd25LZXlzID0gX09iamVjdCRrZXlzKHNvdXJjZSk7XG5cbiAgICBpZiAodHlwZW9mIF9PYmplY3QkZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoX09iamVjdCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9vYmplY3RTcHJlYWQ7IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7IiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uICh0ZXN0LCBidWdneSwgc2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSByZXF1aXJlKCcuL19jdHgnKShGdW5jdGlvbi5jYWxsLCByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMik7XG4gICAgICAgIHNldCh0ZXN0LCBbXSk7XG4gICAgICAgIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgICAgICBjaGVjayhPLCBwcm90byk7XG4gICAgICAgIGlmIChidWdneSkgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuIiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgc2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldCB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIik7IiwidmFyIF9PYmplY3Qkc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKTtcblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBfT2JqZWN0JHNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLnByb3RvdHlwZSwgc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzOyIsInZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3JcIik7IiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3ltYm9sO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbFwiKTsiLCJ2YXIgX1N5bWJvbCRpdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9TeW1ib2wgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2xcIik7XG5cbmZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyBpZiAodHlwZW9mIF9TeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX1N5bWJvbCRpdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YyKG9iaik7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBfU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoX1N5bWJvbCRpdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiLCJmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQ7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgPSByZXF1aXJlKFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIik7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm47IiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKTsiLCJ2YXIgX09iamVjdCRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IF9PYmplY3QkZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX187XG4gIH07XG5cbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7IiwiZXhwb3J0IGNvbnN0IGV4dGVuZCA9IChvYmplY3QsIC4uLmV4dGVuc2lvbnMpID0+IHsgLy8gJC5leHRlbmQgYWx0ZXJuYXRpdmUsIC4uLiBpcyB0aGUgc3ByZWFkIG9wZXJhdG9yLlxuICBmb3IgKGNvbnN0IGV4dGVuc2lvbiBvZiBleHRlbnNpb25zKSB7XG4gICAgLy8gY29uc29sZS5sb2coZXh0ZW5zaW9uKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0eXBlb2YgZXh0ZW5zaW9uKTtcblxuICAgIGlmICghZXh0ZW5zaW9uKVxuICAgICAgY29udGludWU7IC8vIElnbm9yZSBudWxsIGFuZCB1bmRlZmluZWQgb2JqZWN0cyBhbmQgcGFyYW1ldGVycy5cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleHRlbnNpb24pKSB7IC8vIERvIG5vdCB0cmF2ZXJzZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICAgICAgaWYgKG9iamVjdFtwcm9wXSAhPT0gdW5kZWZpbmVkICYmIGV4dGVuc2lvbltwcm9wXVxuICAgICAgICAmJiBvYmplY3RbcHJvcF0udG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAgICAgJiYgZXh0ZW5zaW9uW3Byb3BdLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgIC8vIEdvZXMgZGVlcCBvbmx5IGlmIG9iamVjdFtwcm9wXSBhbmQgZXh0ZW5zaW9uW3Byb3BdIGFyZSBib3RoIG9iamVjdHMgIVxuICAgICAgICBpZiAob2JqZWN0W3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIGV4dGVuZChvYmplY3RbcHJvcF0sIGV4dGVuc2lvbltwcm9wXSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgb2JqZWN0W3Byb3BdID0gdHlwZW9mIG9iamVjdFtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgPyBleHRlbnNpb25bcHJvcF0gOiBvYmplY3RbcHJvcF07XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXS5zbGljZSgpOyAvLyBBZGQgdmFsdWVzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3QuXG4gICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsImV4cG9ydCBjb25zdCBpbnN0cnVjdCA9IChhcnJheSwgaW5zdEFycmF5KSA9PiB7XG4gIGNvbnN0IHRlbXBPYmplY3QgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMCwgbWF4ID0gaW5zdEFycmF5Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgY29uc3QgZ3VpZGUgPSBpbnN0QXJyYXlbaV07XG5cbiAgICB0ZW1wT2JqZWN0W2d1aWRlXSA9IGFycmF5W2ldO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBPYmplY3Q7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRGF0YSA9IChvYmplY3QsIGluc3RydWN0aW9ucykgPT4ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0cnVjdGlvbnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpXG4gICAgICBvYmplY3Rba2V5XSA9IGluc3RydWN0KG9iamVjdFtrZXldLCBpbnN0cnVjdGlvbnNba2V5XSk7XG4gICAgZWxzZSBpZiAob2JqZWN0W2tleV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgIShBcnJheS5pc0FycmF5KGluc3RydWN0aW9uc1trZXldKSkpXG4gICAgICBvYmplY3Rba2V5XSA9IHRyYW5zZm9ybURhdGEob2JqZWN0W2tleV0sIGluc3RydWN0aW9uc1trZXldKTtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG5leHBvcnQgY29uc3QgdG9BcnJheSA9IChvYmplY3QsIGluc3RydWN0aW9uKSA9PiB7XG4gIGNvbnN0IHRlbXBBcnJheSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwLCBtYXggPSBpbnN0cnVjdGlvbi5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIGNvbnN0IGd1aWRlID0gaW5zdHJ1Y3Rpb25baV07XG5cbiAgICB0ZW1wQXJyYXlbaV0gPSBvYmplY3RbZ3VpZGVdO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBBcnJheTtcbn07XG4iLCIvLyBQb2x5ZmlsbHNcblxuaWYgKCBOdW1iZXIuRVBTSUxPTiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdE51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTtcblxufVxuXG5pZiAoIE51bWJlci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXJcblxuXHROdW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKCB2YWx1ZSApICYmIE1hdGguZmxvb3IoIHZhbHVlICkgPT09IHZhbHVlO1xuXG5cdH07XG5cbn1cblxuLy9cblxuaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3NpZ25cblxuXHRNYXRoLnNpZ24gPSBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHRyZXR1cm4gKCB4IDwgMCApID8gLSAxIDogKCB4ID4gMCApID8gMSA6ICsgeDtcblxuXHR9O1xuXG59XG5cbmlmICggJ25hbWUnIGluIEZ1bmN0aW9uLnByb3RvdHlwZSA9PT0gZmFsc2UgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9uYW1lXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJywge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goIC9eXFxzKmZ1bmN0aW9uXFxzKihbXlxcKFxcc10qKS8gKVsgMSBdO1xuXG5cdFx0fVxuXG5cdH0gKTtcblxufVxuXG5pZiAoIE9iamVjdC5hc3NpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cblxuXHQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHtcblxuXHRcdFx0XHR2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuXG5cdFx0XHRcdGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0b3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0fTtcblxuXHR9ICkoKTtcblxufVxuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL1xuICovXG5cbmZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9XG5cbk9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSA9PT0gLSAxICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aGFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0cmV0dXJuIGxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSAhPT0gLSAxO1xuXG5cdH0sXG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdHZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyB0eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKCBsaXN0ZW5lciApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0bGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgZXZlbnQudHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGV2ZW50LnRhcmdldCA9IHRoaXM7XG5cblx0XHRcdHZhciBhcnJheSA9IGxpc3RlbmVyQXJyYXkuc2xpY2UoIDAgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheVsgaSBdLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxudmFyIFJFVklTSU9OID0gJzkyJztcbnZhciBNT1VTRSA9IHsgTEVGVDogMCwgTUlERExFOiAxLCBSSUdIVDogMiB9O1xudmFyIEN1bGxGYWNlTm9uZSA9IDA7XG52YXIgQ3VsbEZhY2VCYWNrID0gMTtcbnZhciBDdWxsRmFjZUZyb250ID0gMjtcbnZhciBDdWxsRmFjZUZyb250QmFjayA9IDM7XG52YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ1cgPSAwO1xudmFyIEZyb250RmFjZURpcmVjdGlvbkNDVyA9IDE7XG52YXIgQmFzaWNTaGFkb3dNYXAgPSAwO1xudmFyIFBDRlNoYWRvd01hcCA9IDE7XG52YXIgUENGU29mdFNoYWRvd01hcCA9IDI7XG52YXIgRnJvbnRTaWRlID0gMDtcbnZhciBCYWNrU2lkZSA9IDE7XG52YXIgRG91YmxlU2lkZSA9IDI7XG52YXIgRmxhdFNoYWRpbmcgPSAxO1xudmFyIFNtb290aFNoYWRpbmcgPSAyO1xudmFyIE5vQ29sb3JzID0gMDtcbnZhciBGYWNlQ29sb3JzID0gMTtcbnZhciBWZXJ0ZXhDb2xvcnMgPSAyO1xudmFyIE5vQmxlbmRpbmcgPSAwO1xudmFyIE5vcm1hbEJsZW5kaW5nID0gMTtcbnZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjtcbnZhciBTdWJ0cmFjdGl2ZUJsZW5kaW5nID0gMztcbnZhciBNdWx0aXBseUJsZW5kaW5nID0gNDtcbnZhciBDdXN0b21CbGVuZGluZyA9IDU7XG52YXIgQWRkRXF1YXRpb24gPSAxMDA7XG52YXIgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcbnZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjtcbnZhciBNaW5FcXVhdGlvbiA9IDEwMztcbnZhciBNYXhFcXVhdGlvbiA9IDEwNDtcbnZhciBaZXJvRmFjdG9yID0gMjAwO1xudmFyIE9uZUZhY3RvciA9IDIwMTtcbnZhciBTcmNDb2xvckZhY3RvciA9IDIwMjtcbnZhciBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzO1xudmFyIFNyY0FscGhhRmFjdG9yID0gMjA0O1xudmFyIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XG52YXIgRHN0QWxwaGFGYWN0b3IgPSAyMDY7XG52YXIgT25lTWludXNEc3RBbHBoYUZhY3RvciA9IDIwNztcbnZhciBEc3RDb2xvckZhY3RvciA9IDIwODtcbnZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5O1xudmFyIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSAyMTA7XG52YXIgTmV2ZXJEZXB0aCA9IDA7XG52YXIgQWx3YXlzRGVwdGggPSAxO1xudmFyIExlc3NEZXB0aCA9IDI7XG52YXIgTGVzc0VxdWFsRGVwdGggPSAzO1xudmFyIEVxdWFsRGVwdGggPSA0O1xudmFyIEdyZWF0ZXJFcXVhbERlcHRoID0gNTtcbnZhciBHcmVhdGVyRGVwdGggPSA2O1xudmFyIE5vdEVxdWFsRGVwdGggPSA3O1xudmFyIE11bHRpcGx5T3BlcmF0aW9uID0gMDtcbnZhciBNaXhPcGVyYXRpb24gPSAxO1xudmFyIEFkZE9wZXJhdGlvbiA9IDI7XG52YXIgTm9Ub25lTWFwcGluZyA9IDA7XG52YXIgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xudmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyO1xudmFyIFVuY2hhcnRlZDJUb25lTWFwcGluZyA9IDM7XG52YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0O1xudmFyIFVWTWFwcGluZyA9IDMwMDtcbnZhciBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XG52YXIgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xudmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1O1xudmFyIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2O1xudmFyIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nID0gMzA3O1xudmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcbnZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTtcbnZhciBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMjtcbnZhciBOZWFyZXN0RmlsdGVyID0gMTAwMztcbnZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XG52YXIgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG52YXIgTGluZWFyRmlsdGVyID0gMTAwNjtcbnZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbnZhciBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xudmFyIFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5O1xudmFyIEJ5dGVUeXBlID0gMTAxMDtcbnZhciBTaG9ydFR5cGUgPSAxMDExO1xudmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjtcbnZhciBJbnRUeXBlID0gMTAxMztcbnZhciBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xudmFyIEZsb2F0VHlwZSA9IDEwMTU7XG52YXIgSGFsZkZsb2F0VHlwZSA9IDEwMTY7XG52YXIgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcbnZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4O1xudmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBlID0gMTAxOTtcbnZhciBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xudmFyIEFscGhhRm9ybWF0ID0gMTAyMTtcbnZhciBSR0JGb3JtYXQgPSAxMDIyO1xudmFyIFJHQkFGb3JtYXQgPSAxMDIzO1xudmFyIEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7XG52YXIgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1O1xudmFyIFJHQkVGb3JtYXQgPSBSR0JBRm9ybWF0O1xudmFyIERlcHRoRm9ybWF0ID0gMTAyNjtcbnZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3O1xudmFyIFJHQl9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3NzY7XG52YXIgUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3Nzc7XG52YXIgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XG52YXIgUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gMzM3Nzk7XG52YXIgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MDtcbnZhciBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xudmFyIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQyO1xudmFyIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQzO1xudmFyIFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xudmFyIFJHQkFfQVNUQ180eDRfRm9ybWF0ID0gMzc4MDg7XG52YXIgUkdCQV9BU1RDXzV4NF9Gb3JtYXQgPSAzNzgwOTtcbnZhciBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xudmFyIFJHQkFfQVNUQ182eDVfRm9ybWF0ID0gMzc4MTE7XG52YXIgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgPSAzNzgxMjtcbnZhciBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xudmFyIFJHQkFfQVNUQ184eDZfRm9ybWF0ID0gMzc4MTQ7XG52YXIgUkdCQV9BU1RDXzh4OF9Gb3JtYXQgPSAzNzgxNTtcbnZhciBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbnZhciBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzgxNztcbnZhciBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgPSAzNzgxODtcbnZhciBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG52YXIgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODIwO1xudmFyIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgPSAzNzgyMTtcbnZhciBMb29wT25jZSA9IDIyMDA7XG52YXIgTG9vcFJlcGVhdCA9IDIyMDE7XG52YXIgTG9vcFBpbmdQb25nID0gMjIwMjtcbnZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbnZhciBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7XG52YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyO1xudmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xudmFyIFplcm9TbG9wZUVuZGluZyA9IDI0MDE7XG52YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7XG52YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xudmFyIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG52YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7XG52YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xudmFyIHNSR0JFbmNvZGluZyA9IDMwMDE7XG52YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7XG52YXIgUkdCRUVuY29kaW5nID0gMzAwMjtcbnZhciBMb2dMdXZFbmNvZGluZyA9IDMwMDM7XG52YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7XG52YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1O1xudmFyIFJHQkRFbmNvZGluZyA9IDMwMDY7XG52YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwO1xudmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfTWF0aCA9IHtcblxuXHRERUcyUkFEOiBNYXRoLlBJIC8gMTgwLFxuXHRSQUQyREVHOiAxODAgLyBNYXRoLlBJLFxuXG5cdGdlbmVyYXRlVVVJRDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjE5NjMxMzYjMjE5NjMxMzZcblxuXHRcdHZhciBsdXQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDI1NjsgaSArKyApIHtcblxuXHRcdFx0bHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XG5cblx0XHRcdHZhciBkMCA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMSA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMiA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMyA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciB1dWlkID0gbHV0WyBkMCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQwID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdFx0bHV0WyBkMSAmIDB4ZmYgXSArIGx1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIGx1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArXG5cdFx0XHRcdGx1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgbHV0WyBkMiA+PiA4ICYgMHhmZiBdICsgJy0nICsgbHV0WyBkMiA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xuXHRcdFx0XHRsdXRbIGQzICYgMHhmZiBdICsgbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgbHV0WyBkMyA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gMjQgJiAweGZmIF07XG5cblx0XHRcdC8vIC50b1VwcGVyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cblx0XHRcdHJldHVybiB1dWlkLnRvVXBwZXJDYXNlKCk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHtcblxuXHRcdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XG5cblx0fSxcblxuXHQvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxuXG5cdGV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkge1xuXG5cdFx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcblxuXHR9LFxuXG5cdC8vIExpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgPGExLCBhMj4gdG8gcmFuZ2UgPGIxLCBiMj5cblxuXHRtYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XG5cblx0XHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcblxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0aW9uXG5cblx0bGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkge1xuXG5cdFx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7XG5cblx0fSxcblxuXHRyYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkge1xuXG5cdFx0cmV0dXJuIHJhZGlhbnMgKiBfTWF0aC5SQUQyREVHO1xuXG5cdH0sXG5cblx0aXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7XG5cblx0fSxcblxuXHRjZWlsUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5jZWlsKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdGZsb29yUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5mbG9vciggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdFwid2lkdGhcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLng7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnggPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdFwiaGVpZ2h0XCI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy55ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gY29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXNcblxuXHRcdHZhciBhbmdsZSA9IE1hdGguYXRhbjIoIHRoaXMueSwgdGhpcy54ICk7XG5cblx0XHRpZiAoIGFuZ2xlIDwgMCApIGFuZ2xlICs9IDIgKiBNYXRoLlBJO1xuXG5cdFx0cmV0dXJuIGFuZ2xlO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTtcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXG5cdFx0dmFyIHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHR2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55O1xuXG5cdFx0dGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54O1xuXHRcdHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29mdC5jb21cbiAqIEBhdXRob3IgRDFwbG8xZCAvIGh0dHA6Ly9naXRodWIuY29tL0QxcGxvMWRcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB0aW1rbmlwIC8gaHR0cDovL3d3dy5mbG9vcnBsYW5uZXIuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4NCgpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCwgMCxcblx0XHQwLCAxLCAwLCAwLFxuXHRcdDAsIDAsIDEsIDAsXG5cdFx0MCwgMCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdO1xuXHRcdHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdO1xuXHRcdHRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTtcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAxICk7XG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlQmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0eEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMCxcblx0XHRcdHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsXG5cdFx0XHR4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHRyYWN0Um90YXRpb24oIG0gKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVkgPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDtcblxuXHRcdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNSBdID0gbWVbIDUgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZO1xuXG5cdFx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHRcdHRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaO1xuXHRcdFx0dGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejtcblx0XHR2YXIgYSA9IE1hdGguY29zKCB4ICksIGIgPSBNYXRoLnNpbiggeCApO1xuXHRcdHZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0dmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTtcblxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZDtcblxuXHRcdFx0dGVbIDEgXSA9IGFmICsgYmUgKiBkO1xuXHRcdFx0dGVbIDUgXSA9IGFlIC0gYmYgKiBkO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGM7XG5cblx0XHRcdHRlWyAyIF0gPSBiZiAtIGFlICogZDtcblx0XHRcdHRlWyA2IF0gPSBiZSArIGFmICogZDtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgLSBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gLSBhICogZjtcblx0XHRcdHRlWyA4IF0gPSBkZSArIGNmICogYjtcblxuXHRcdFx0dGVbIDEgXSA9IGNmICsgZGUgKiBiO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGRmIC0gY2UgKiBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBhICogZDtcblx0XHRcdHRlWyA2IF0gPSBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZSAqIGQgLSBhZjtcblx0XHRcdHRlWyA4IF0gPSBhZSAqIGQgKyBiZjtcblxuXHRcdFx0dGVbIDEgXSA9IGMgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGJmICogZCArIGFlO1xuXHRcdFx0dGVbIDkgXSA9IGFmICogZCAtIGJlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBjO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gZjtcblx0XHRcdHRlWyA4IF0gPSBkICogZTtcblxuXHRcdFx0dGVbIDEgXSA9IGFjICogZiArIGJkO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGFkICogZiAtIGJjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGU7XG5cdFx0XHR0ZVsgMTAgXSA9IGJkICogZiArIGFjO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gcS5feCwgeSA9IHEuX3ksIHogPSBxLl96LCB3ID0gcS5fdztcblx0XHR2YXIgeDIgPSB4ICsgeCwgeTIgPSB5ICsgeSwgejIgPSB6ICsgejtcblx0XHR2YXIgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6Mjtcblx0XHR2YXIgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6Mjtcblx0XHR2YXIgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6MjtcblxuXHRcdHRlWyAwIF0gPSAxIC0gKCB5eSArIHp6ICk7XG5cdFx0dGVbIDQgXSA9IHh5IC0gd3o7XG5cdFx0dGVbIDggXSA9IHh6ICsgd3k7XG5cblx0XHR0ZVsgMSBdID0geHkgKyB3ejtcblx0XHR0ZVsgNSBdID0gMSAtICggeHggKyB6eiApO1xuXHRcdHRlWyA5IF0gPSB5eiAtIHd4O1xuXG5cdFx0dGVbIDIgXSA9IHh6IC0gd3k7XG5cdFx0dGVbIDYgXSA9IHl6ICsgd3g7XG5cdFx0dGVbIDEwIF0gPSAxIC0gKCB4eCArIHl5ICk7XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHggPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTtcblxuXHRcdFx0aWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXG5cblx0XHRcdFx0ei56ID0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHR6Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdGlmICggeC5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHVwLnogKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHoueCArPSAwLjAwMDE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHoueiArPSAwLjAwMDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHoubm9ybWFsaXplKCk7XG5cdFx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHgubm9ybWFsaXplKCk7XG5cdFx0XHR5LmNyb3NzVmVjdG9ycyggeiwgeCApO1xuXG5cdFx0XHR0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54OyB0ZVsgOCBdID0gei54O1xuXHRcdFx0dGVbIDEgXSA9IHgueTsgdGVbIDUgXSA9IHkueTsgdGVbIDkgXSA9IHoueTtcblx0XHRcdHRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7XG5cblx0XHRpZiAoIG4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEwIF0sIGEzNCA9IGFlWyAxNCBdO1xuXHRcdHZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07XG5cdFx0dmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDYgXSAqPSBzOyB0ZVsgMTAgXSAqPSBzOyB0ZVsgMTQgXSAqPSBzO1xuXHRcdHRlWyAzIF0gKj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07XG5cdFx0dmFyIG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdO1xuXHRcdHZhciBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0dmFyIG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTtcblxuXHRcdC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50XG5cdFx0Ly8oIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bSApXG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bjQxICogKFxuXHRcdFx0XHQrIG4xNCAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgLSBuMTMgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjE0ICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjEyICogbjIzICogbjM0XG5cdFx0XHQpICtcblx0XHRcdG40MiAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjMgKiBuMzRcblx0XHRcdFx0IC0gbjExICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xNCAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgLSBuMTMgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjEzICogbjI0ICogbjMxXG5cdFx0XHRcdCAtIG4xNCAqIG4yMyAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDMgKiAoXG5cdFx0XHRcdCsgbjExICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTQgKiBuMjEgKiBuMzJcblx0XHRcdFx0ICsgbjEyICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xNCAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTIgKiBuMjQgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQ0ICogKFxuXHRcdFx0XHQtIG4xMyAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTEgKiBuMjMgKiBuMzJcblx0XHRcdFx0ICsgbjExICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgLSBuMTIgKiBuMjEgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjIzICogbjMxXG5cdFx0XHQpXG5cblx0XHQpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMSBdOyB0ZVsgMSBdID0gdGVbIDQgXTsgdGVbIDQgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDtcblxuXHRcdHRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSB2Lng7XG5cdFx0dGVbIDEzIF0gPSB2Lnk7XG5cdFx0dGVbIDE0IF0gPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLFxuXHRcdFx0bWUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsgMyBdLFxuXHRcdFx0bjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0gbWVbIDcgXSxcblx0XHRcdG4xMyA9IG1lWyA4IF0sIG4yMyA9IG1lWyA5IF0sIG4zMyA9IG1lWyAxMCBdLCBuNDMgPSBtZVsgMTEgXSxcblx0XHRcdG4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLFxuXG5cdFx0XHR0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTIgPSBuMTQgKiBuMzMgKiBuNDIgLSBuMTMgKiBuMzQgKiBuNDIgLSBuMTQgKiBuMzIgKiBuNDMgKyBuMTIgKiBuMzQgKiBuNDMgKyBuMTMgKiBuMzIgKiBuNDQgLSBuMTIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsXG5cdFx0XHR0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7XG5cblx0XHR2YXIgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcblxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWF4U2NhbGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XG5cdFx0dmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xuXHRcdHZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH0sXG5cblx0bWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgYywgLSBzLCAwLFxuXHRcdFx0MCwgcywgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0IGMsIDAsIHMsIDAsXG5cdFx0XHQgMCwgMSwgMCwgMCxcblx0XHRcdC0gcywgMCwgYywgMCxcblx0XHRcdCAwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXHRcdHZhciB0ID0gMSAtIGM7XG5cdFx0dmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XG5cdFx0dmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdCByZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUoIHNjYWxlICk7XG5cdFx0dGhpcy5zZXRQb3NpdGlvbiggcG9zaXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdFx0dmFyIHN4ID0gdmVjdG9yLnNldCggdGVbIDAgXSwgdGVbIDEgXSwgdGVbIDIgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN5ID0gdmVjdG9yLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN6ID0gdmVjdG9yLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTtcblxuXHRcdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcblx0XHRcdHZhciBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG5cdFx0XHRpZiAoIGRldCA8IDAgKSBzeCA9IC0gc3g7XG5cblx0XHRcdHBvc2l0aW9uLnggPSB0ZVsgMTIgXTtcblx0XHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcblx0XHRcdHBvc2l0aW9uLnogPSB0ZVsgMTQgXTtcblxuXHRcdFx0Ly8gc2NhbGUgdGhlIHJvdGF0aW9uIHBhcnRcblx0XHRcdG1hdHJpeC5jb3B5KCB0aGlzICk7XG5cblx0XHRcdHZhciBpbnZTWCA9IDEgLyBzeDtcblx0XHRcdHZhciBpbnZTWSA9IDEgLyBzeTtcblx0XHRcdHZhciBpbnZTWiA9IDEgLyBzejtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMiBdICo9IGludlNYO1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDQgXSAqPSBpbnZTWTtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNSBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgOCBdICo9IGludlNaO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA5IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEwIF0gKj0gaW52U1o7XG5cblx0XHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0c2NhbGUueCA9IHN4O1xuXHRcdFx0c2NhbGUueSA9IHN5O1xuXHRcdFx0c2NhbGUueiA9IHN6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1ha2VQZXJzcGVjdGl2ZTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdGlmICggZmFyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xuXG5cdFx0dmFyIGEgPSAoIHJpZ2h0ICsgbGVmdCApIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgYiA9ICggdG9wICsgYm90dG9tICkgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xuXHRcdHZhciBkID0gLSAyICogZmFyICogbmVhciAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dGVbIDAgXSA9IHg7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSBhO1x0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IHk7XHR0ZVsgOSBdID0gYjtcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSBjO1x0dGVbIDE0IF0gPSBkO1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IC0gMTtcdHRlWyAxNSBdID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZU9ydGhvZ3JhcGhpYzogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBoID0gMS4wIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgcCA9IDEuMCAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcblx0XHR2YXIgeSA9ICggdG9wICsgYm90dG9tICkgKiBoO1xuXHRcdHZhciB6ID0gKCBmYXIgKyBuZWFyICkgKiBwO1xuXG5cdFx0dGVbIDAgXSA9IDIgKiB3O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gMDtcdHRlWyAxMiBdID0gLSB4O1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IDIgKiBoO1x0dGVbIDkgXSA9IDA7XHR0ZVsgMTMgXSA9IC0geTtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSAtIDIgKiBwO1x0dGVbIDE0IF0gPSAtIHo7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gMDtcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMCBdID0gdGVbIDEwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDExIF0gPSB0ZVsgMTEgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMiBdID0gdGVbIDEyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEzIF0gPSB0ZVsgMTMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNSBdID0gdGVbIDE1IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX3cgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbiwge1xuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7XG5cblx0XHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxuXHR9LFxuXG5cdHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdHZhciB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF0sXG5cblx0XHRcdHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0LFxuXG5cdFx0XHRcdGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcblxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmFyIHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHREaXIgPSB0ICogZGlyO1xuXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcblxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcblxuXHRcdFx0XHR2YXIgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcblxuXHRcdFx0XHR4MCAqPSBmO1xuXHRcdFx0XHR5MCAqPSBmO1xuXHRcdFx0XHR6MCAqPSBmO1xuXHRcdFx0XHR3MCAqPSBmO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0eToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl95O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHc6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIsIHVwZGF0ZSApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHggPSBldWxlci5feCwgeSA9IGV1bGVyLl95LCB6ID0gZXVsZXIuX3osIG9yZGVyID0gZXVsZXIub3JkZXI7XG5cblx0XHQvLyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvXG5cdFx0Ly8gXHQyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cblx0XHQvL1x0Y29udGVudC9TcGluQ2FsYy5tXG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3M7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luO1xuXG5cdFx0dmFyIGMxID0gY29zKCB4IC8gMiApO1xuXHRcdHZhciBjMiA9IGNvcyggeSAvIDIgKTtcblx0XHR2YXIgYzMgPSBjb3MoIHogLyAyICk7XG5cblx0XHR2YXIgczEgPSBzaW4oIHggLyAyICk7XG5cdFx0dmFyIHMyID0gc2luKCB5IC8gMiApO1xuXHRcdHZhciBzMyA9IHNpbiggeiAvIDIgKTtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcjtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tVW5pdFZlY3RvcnMoIHZGcm9tLCB2VG8gKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0XHRpZiAoIHIgPCBFUFMgKSB7XG5cblx0XHRcdFx0ciA9IDA7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHRcdHYxLnNldCggLSB2RnJvbS55LCB2RnJvbS54LCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHYxLnNldCggMCwgLSB2RnJvbS56LCB2RnJvbS55ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHYxLmNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3ggPSB2MS54O1xuXHRcdFx0dGhpcy5feSA9IHYxLnk7XG5cdFx0XHR0aGlzLl96ID0gdjEuejtcblx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludmVyc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHF1YXRlcm5pb24gaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcblxuXHR9LFxuXG5cdGNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5feCAqPSAtIDE7XG5cdFx0dGhpcy5feSAqPSAtIDE7XG5cdFx0dGhpcy5feiAqPSAtIDE7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIGwgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdHRoaXMuX3cgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bCA9IDEgLyBsO1xuXG5cdFx0XHR0aGlzLl94ID0gdGhpcy5feCAqIGw7XG5cdFx0XHR0aGlzLl95ID0gdGhpcy5feSAqIGw7XG5cdFx0XHR0aGlzLl96ID0gdGhpcy5feiAqIGw7XG5cdFx0XHR0aGlzLl93ID0gdGhpcy5fdyAqIGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggcSwgcCApIHtcblxuXHRcdGlmICggcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCBwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXG5cblx0XHR2YXIgcWF4ID0gYS5feCwgcWF5ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdztcblx0XHR2YXIgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdztcblxuXHRcdHRoaXMuX3ggPSBxYXggKiBxYncgKyBxYXcgKiBxYnggKyBxYXkgKiBxYnogLSBxYXogKiBxYnk7XG5cdFx0dGhpcy5feSA9IHFheSAqIHFidyArIHFhdyAqIHFieSArIHFheiAqIHFieCAtIHFheCAqIHFiejtcblx0XHR0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4O1xuXHRcdHRoaXMuX3cgPSBxYXcgKiBxYncgLSBxYXggKiBxYnggLSBxYXkgKiBxYnkgLSBxYXogKiBxYno7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7XG5cblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cblxuXHRcdHZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xuXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29weSggcWIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHc7XG5cdFx0XHR0aGlzLl94ID0geDtcblx0XHRcdHRoaXMuX3kgPSB5O1xuXHRcdFx0dGhpcy5feiA9IHo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhICk7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBzaW5IYWxmVGhldGEgKSA8IDAuMDAxICkge1xuXG5cdFx0XHR0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApO1xuXHRcdFx0dGhpcy5feCA9IDAuNSAqICggeCArIHRoaXMuX3ggKTtcblx0XHRcdHRoaXMuX3kgPSAwLjUgKiAoIHkgKyB0aGlzLl95ICk7XG5cdFx0XHR0aGlzLl96ID0gMC41ICogKCB6ICsgdGhpcy5feiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApO1xuXHRcdHZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsXG5cdFx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xuXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IzKCB4LCB5LCB6ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlFdWxlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5RXVsZXIoIGV1bGVyICkge1xuXG5cdFx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA4IF0gKiB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHZhciB3ID0gMSAvICggZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKTtcblxuXHRcdHRoaXMueCA9ICggZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSApICogdztcblx0XHR0aGlzLnkgPSAoIGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKSAqIHc7XG5cdFx0dGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSApICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7XG5cblx0XHQvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvclxuXG5cdFx0dmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuXHRcdHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHR2YXIgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7XG5cdFx0dmFyIGl3ID0gLSBxeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cblx0XHQvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cblx0XHR0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5O1xuXHRcdHRoaXMueSA9IGl5ICogcXcgKyBpdyAqIC0gcXkgKyBpeiAqIC0gcXggLSBpeCAqIC0gcXo7XG5cdFx0dGhpcy56ID0gaXogKiBxdyArIGl3ICogLSBxeiArIGl4ICogLSBxeSAtIGl5ICogLSBxeDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHVucHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdW5wcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGQsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4XG5cdFx0Ly8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uXG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXHRcdHRoaXMueiAvPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH0sXG5cblx0Ly8gVE9ETyBsZW5ndGhTcXVhcmVkP1xuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHRoaXMsIHYgKTtcblxuXHR9LFxuXG5cdGNyb3NzVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0dmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7XG5cblx0XHR0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcblx0XHR0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcblx0XHR0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHZhciBzY2FsYXIgPSB2ZWN0b3IuZG90KCB0aGlzICkgLyB2ZWN0b3IubGVuZ3RoU3EoKTtcblxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHZlY3RvciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdHByb2plY3RPblBsYW5lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHByb2plY3RPblBsYW5lKCBwbGFuZU5vcm1hbCApIHtcblxuXHRcdFx0djEuY29weSggdGhpcyApLnByb2plY3RPblZlY3RvciggcGxhbmVOb3JtYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cmVmbGVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9ydGhvZ29uYWwgdG8gbm9ybWFsXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWZsZWN0KCBub3JtYWwgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvICggTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKSApO1xuXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcblxuXHRcdHJldHVybiBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2LnksIGR6ID0gdGhpcy56IC0gdi56O1xuXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56ICk7XG5cblx0fSxcblxuXHRzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHMucGhpICkgKiBzLnJhZGl1cztcblxuXHRcdHRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCBzLnRoZXRhICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jb3MoIHMucGhpICkgKiBzLnJhZGl1cztcblx0XHR0aGlzLnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyggcy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ3lsaW5kcmljYWw6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHRoaXMueCA9IGMucmFkaXVzICogTWF0aC5zaW4oIGMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBjLnk7XG5cdFx0dGhpcy56ID0gYy5yYWRpdXMgKiBNYXRoLmNvcyggYy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDEyIF07XG5cdFx0dGhpcy55ID0gZVsgMTMgXTtcblx0XHR0aGlzLnogPSBlWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4U2NhbGU6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdHZhciBzeSA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdHZhciBzeiA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xuXG5cdFx0dGhpcy54ID0gc3g7XG5cdFx0dGhpcy55ID0gc3k7XG5cdFx0dGhpcy56ID0gc3o7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggbSwgaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogNCApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4MygpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCxcblx0XHQwLCAxLCAwLFxuXHRcdDAsIDAsIDFcblxuXHRdO1xuXG5cdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0aXNNYXRyaXgzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7XG5cdFx0dGVbIDMgXSA9IG4xMjsgdGVbIDQgXSA9IG4yMjsgdGVbIDUgXSA9IG4zMjtcblx0XHR0ZVsgNiBdID0gbjEzOyB0ZVsgNyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdG1lWyAwIF0sIG1lWyA0IF0sIG1lWyA4IF0sXG5cdFx0XHRtZVsgMSBdLCBtZVsgNSBdLCBtZVsgOSBdLFxuXHRcdFx0bWVbIDIgXSwgbWVbIDYgXSwgbWVbIDEwIF1cblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0XHR2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdFx0djEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdFx0djEuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0XHRcdFx0YXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA0IF0sIGEyMyA9IGFlWyA3IF07XG5cdFx0dmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDQgXSwgYjIzID0gYmVbIDcgXTtcblx0XHR2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7XG5cdFx0dGVbIDMgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjtcblx0XHR0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzO1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTtcblx0XHR0ZVsgNCBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyO1xuXHRcdHRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxO1xuXHRcdHRlWyA1IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzI7XG5cdFx0dGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYSA9IHRlWyAwIF0sIGIgPSB0ZVsgMSBdLCBjID0gdGVbIDIgXSxcblx0XHRcdGQgPSB0ZVsgMyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sXG5cdFx0XHRnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0sIGkgPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIgKiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbWF0cml4LCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdGlmICggbWF0cml4ICYmIG1hdHJpeC5pc01hdHJpeDQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LlwiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMsXG5cdFx0XHR0ZSA9IHRoaXMuZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sXG5cdFx0XHRuMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLFxuXHRcdFx0bjEzID0gbWVbIDYgXSwgbjIzID0gbWVbIDcgXSwgbjMzID0gbWVbIDggXSxcblxuXHRcdFx0dDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLFxuXHRcdFx0dDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLFxuXHRcdFx0dDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLFxuXG5cdFx0XHRkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHtcblxuXHRcdFx0dmFyIG1zZyA9IFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwXCI7XG5cblx0XHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIG1zZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5KCk7XG5cblx0XHR9XG5cblx0XHR2YXIgZGV0SW52ID0gMSAvIGRldDtcblxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XG5cdFx0dGVbIDEgXSA9ICggbjMxICogbjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7XG5cdFx0dGVbIDIgXSA9ICggbjMyICogbjIxIC0gbjMxICogbjIyICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgMyBdID0gdDEyICogZGV0SW52O1xuXHRcdHRlWyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52O1xuXHRcdHRlWyA1IF0gPSAoIG4zMSAqIG4xMiAtIG4zMiAqIG4xMSApICogZGV0SW52O1xuXG5cdFx0dGVbIDYgXSA9IHQxMyAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMjEgKiBuMTMgLSBuMjMgKiBuMTEgKSAqIGRldEludjtcblx0XHR0ZVsgOCBdID0gKCBuMjIgKiBuMTEgLSBuMjEgKiBuMTIgKSAqIGRldEludjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdG1wLCBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRtcCA9IG1bIDEgXTsgbVsgMSBdID0gbVsgMyBdOyBtWyAzIF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1bIDYgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXROb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuZ2V0SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlSW50b0FycmF5OiBmdW5jdGlvbiAoIHIgKSB7XG5cblx0XHR2YXIgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRyWyAwIF0gPSBtWyAwIF07XG5cdFx0clsgMSBdID0gbVsgMyBdO1xuXHRcdHJbIDIgXSA9IG1bIDYgXTtcblx0XHRyWyAzIF0gPSBtWyAxIF07XG5cdFx0clsgNCBdID0gbVsgNCBdO1xuXHRcdHJbIDUgXSA9IG1bIDcgXTtcblx0XHRyWyA2IF0gPSBtWyAyIF07XG5cdFx0clsgNyBdID0gbVsgNSBdO1xuXHRcdHJbIDggXSA9IG1bIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VXZUcmFuc2Zvcm06IGZ1bmN0aW9uICggdHgsIHR5LCBzeCwgc3ksIHJvdGF0aW9uLCBjeCwgY3kgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCByb3RhdGlvbiApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsXG5cdFx0XHQtIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSxcblx0XHRcdDAsIDAsIDFcblx0XHQpO1xuXG5cdH0sXG5cblx0c2NhbGU6IGZ1bmN0aW9uICggc3gsIHN5ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gc3g7IHRlWyAzIF0gKj0gc3g7IHRlWyA2IF0gKj0gc3g7XG5cdFx0dGVbIDEgXSAqPSBzeTsgdGVbIDQgXSAqPSBzeTsgdGVbIDcgXSAqPSBzeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSB0ZVsgMCBdLCBhMTIgPSB0ZVsgMyBdLCBhMTMgPSB0ZVsgNiBdO1xuXHRcdHZhciBhMjEgPSB0ZVsgMSBdLCBhMjIgPSB0ZVsgNCBdLCBhMjMgPSB0ZVsgNyBdO1xuXG5cdFx0dGVbIDAgXSA9IGMgKiBhMTEgKyBzICogYTIxO1xuXHRcdHRlWyAzIF0gPSBjICogYTEyICsgcyAqIGEyMjtcblx0XHR0ZVsgNiBdID0gYyAqIGExMyArIHMgKiBhMjM7XG5cblx0XHR0ZVsgMSBdID0gLSBzICogYTExICsgYyAqIGEyMTtcblx0XHR0ZVsgNCBdID0gLSBzICogYTEyICsgYyAqIGEyMjtcblx0XHR0ZVsgNyBdID0gLSBzICogYTEzICsgYyAqIGEyMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIHR4LCB0eSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICs9IHR4ICogdGVbIDIgXTsgdGVbIDMgXSArPSB0eCAqIHRlWyA1IF07IHRlWyA2IF0gKz0gdHggKiB0ZVsgOCBdO1xuXHRcdHRlWyAxIF0gKz0gdHkgKiB0ZVsgMiBdOyB0ZVsgNCBdICs9IHR5ICogdGVbIDUgXTsgdGVbIDcgXSArPSB0eSAqIHRlWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKi9cblxudmFyIHRleHR1cmVJZCA9IDA7XG5cbmZ1bmN0aW9uIFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmltYWdlID0gaW1hZ2UgIT09IHVuZGVmaW5lZCA/IGltYWdlIDogVGV4dHVyZS5ERUZBVUxUX0lNQUdFO1xuXHR0aGlzLm1pcG1hcHMgPSBbXTtcblxuXHR0aGlzLm1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogVGV4dHVyZS5ERUZBVUxUX01BUFBJTkc7XG5cblx0dGhpcy53cmFwUyA9IHdyYXBTICE9PSB1bmRlZmluZWQgPyB3cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdHRoaXMud3JhcFQgPSB3cmFwVCAhPT0gdW5kZWZpbmVkID8gd3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gYW5pc290cm9weSA6IDE7XG5cblx0dGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdHRoaXMudHlwZSA9IHR5cGUgIT09IHVuZGVmaW5lZCA/IHR5cGUgOiBVbnNpZ25lZEJ5dGVUeXBlO1xuXG5cdHRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcblx0dGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdHRoaXMucm90YXRpb24gPSAwO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XG5cdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlO1xuXHR0aGlzLmZsaXBZID0gdHJ1ZTtcblx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0O1x0Ly8gdmFsaWQgdmFsdWVzOiAxLCAyLCA0LCA4IChzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xQaXhlbFN0b3JlaS54bWwpXG5cblx0Ly8gVmFsdWVzIG9mIGVuY29kaW5nICE9PSBUSFJFRS5MaW5lYXJFbmNvZGluZyBvbmx5IHN1cHBvcnRlZCBvbiBtYXAsIGVudk1hcCBhbmQgZW1pc3NpdmVNYXAuXG5cdC8vXG5cdC8vIEFsc28gY2hhbmdpbmcgdGhlIGVuY29kaW5nIGFmdGVyIGFscmVhZHkgdXNlZCBieSBhIE1hdGVyaWFsIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUgTWF0ZXJpYWxcblx0Ly8gdXBkYXRlLiAgWW91IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIE1hdGVyaWFsLm5lZWRzVXBkYXRlIHRvIHRyaWdnZXIgaXQgdG8gcmVjb21waWxlLlxuXHR0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IGVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XG5cbn1cblxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkO1xuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XG5cblRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFRleHR1cmUsXG5cblx0aXNUZXh0dXJlOiB0cnVlLFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0oIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnksIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnksIHRoaXMucm90YXRpb24sIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHNvdXJjZS5pbWFnZTtcblx0XHR0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApO1xuXG5cdFx0dGhpcy5tYXBwaW5nID0gc291cmNlLm1hcHBpbmc7XG5cblx0XHR0aGlzLndyYXBTID0gc291cmNlLndyYXBTO1xuXHRcdHRoaXMud3JhcFQgPSBzb3VyY2Uud3JhcFQ7XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBzb3VyY2UubWluRmlsdGVyO1xuXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7XG5cblx0XHR0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXREYXRhVVJMKCBpbWFnZSApIHtcblxuXHRcdFx0dmFyIGNhbnZhcztcblxuXHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGltYWdlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0XHRjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cblx0XHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSApIHtcblxuXHRcdFx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZSwgMCwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjYW52YXMud2lkdGggPiAyMDQ4IHx8IGNhbnZhcy5oZWlnaHQgPiAyMDQ4ICkge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgb3V0cHV0ID0ge1xuXG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdUZXh0dXJlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nXG5cdFx0XHR9LFxuXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cblx0XHRcdG1hcHBpbmc6IHRoaXMubWFwcGluZyxcblxuXHRcdFx0cmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSxcblx0XHRcdG9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sXG5cdFx0XHRjZW50ZXI6IFsgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSBdLFxuXHRcdFx0cm90YXRpb246IHRoaXMucm90YXRpb24sXG5cblx0XHRcdHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLFxuXG5cdFx0XHRmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuXHRcdFx0bWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlcixcblx0XHRcdG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsXG5cdFx0XHRhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksXG5cblx0XHRcdGZsaXBZOiB0aGlzLmZsaXBZXG5cblx0XHR9O1xuXG5cdFx0aWYgKCB0aGlzLmltYWdlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2VcblxuXHRcdFx0dmFyIGltYWdlID0gdGhpcy5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZS51dWlkID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aW1hZ2UudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOyAvLyBVR0hcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID0ge1xuXHRcdFx0XHRcdHV1aWQ6IGltYWdlLnV1aWQsXG5cdFx0XHRcdFx0dXJsOiBnZXREYXRhVVJMKCBpbWFnZSApXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7XG5cblx0XHRpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuO1xuXG5cdFx0dXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0aWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwUyApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueCApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmxpcFkgKSB7XG5cblx0XHRcdHV2LnkgPSAxIC0gdXYueTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBUZXh0dXJlLnByb3RvdHlwZSwgXCJuZWVkc1VwZGF0ZVwiLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yNCggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXHR0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cdFx0dGhpcy53ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIHcgKSB7XG5cblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMzogdGhpcy53ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGNhc2UgMzogcmV0dXJuIHRoaXMudztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXHRcdHRoaXMudyA9ICggdi53ICE9PSB1bmRlZmluZWQgKSA/IHYudyA6IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblx0XHR0aGlzLncgKz0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXHRcdHRoaXMudyArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblx0XHR0aGlzLncgPSBhLncgKyBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cdFx0dGhpcy53ICs9IHYudyAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblx0XHR0aGlzLncgLT0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXHRcdHRoaXMudyAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblx0XHR0aGlzLncgPSBhLncgLSBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXHRcdHRoaXMudyAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLnosIHcgPSB0aGlzLnc7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBxLncgKTtcblxuXHRcdGlmICggcyA8IDAuMDAwMSApIHtcblxuXHRcdFx0dGhpcy54ID0gMTtcblx0XHRcdHRoaXMueSA9IDA7XG5cdFx0XHR0aGlzLnogPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy54ID0gcS54IC8gcztcblx0XHRcdHRoaXMueSA9IHEueSAvIHM7XG5cdFx0XHR0aGlzLnogPSBxLnogLyBzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciBhbmdsZSwgeCwgeSwgeixcdFx0Ly8gdmFyaWFibGVzIGZvciByZXN1bHRcblx0XHRcdGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHR2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeXkgPSAoIG0yMiArIDEgKSAvIDI7XG5cdFx0XHR2YXIgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeHkgPSAoIG0xMiArIG0yMSApIC8gNDtcblx0XHRcdHZhciB4eiA9ICggbTEzICsgbTMxICkgLyA0O1xuXHRcdFx0dmFyIHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0xMyAtIG0zMSApICogKCBtMTMgLSBtMzEgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplXG5cblx0XHRpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxO1xuXG5cdFx0Ly8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZVxuXHRcdC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZVxuXG5cdFx0dGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0dGhpcy55ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0dGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0dGhpcy53ID0gTWF0aC5hY29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIG1pbi53LCBNYXRoLm1pbiggbWF4LncsIHRoaXMudyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluLCBtYXg7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRpZiAoIG1pbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1pbiA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0XHRcdG1heCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguY2VpbCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLnJvdW5kKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9ICggdGhpcy53IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLncgKSA6IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXHRcdHRoaXMudyA9IC0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICkgKyBNYXRoLmFicyggdGhpcy53ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXHRcdHRoaXMudyArPSAoIHYudyAtIHRoaXMudyApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICYmICggdi53ID09PSB0aGlzLncgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMudztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXHRcdHRoaXMudyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTWFyaXVzIEtpbnRlbCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9raW50ZWxcbiAqL1xuXG4vKlxuIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OlxuICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZVxuICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnNcbiovXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdHRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdHRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTtcblxuXHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRpZiAoIG9wdGlvbnMubWluRmlsdGVyID09PSB1bmRlZmluZWQgKSBvcHRpb25zLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHR0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZSggdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMud3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3JtYXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmVuY29kaW5nICk7XG5cblx0dGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVsbDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogV2ViR0xSZW5kZXJUYXJnZXQsXG5cblx0aXNXZWJHTFJlbmRlclRhcmdldDogdHJ1ZSxcblxuXHRzZXRTaXplOiBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7XG5cblx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmlld3BvcnQuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0dGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHR0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApO1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gc291cmNlLnRleHR1cmUuY2xvbmUoKTtcblxuXHRcdHRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7XG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gc291cmNlLnN0ZW5jaWxCdWZmZXI7XG5cdFx0dGhpcy5kZXB0aFRleHR1cmUgPSBzb3VyY2UuZGVwdGhUZXh0dXJlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcblxuXHR0aGlzLmFjdGl2ZUN1YmVGYWNlID0gMDsgLy8gUFggMCwgTlggMSwgUFkgMiwgTlkgMywgUFogNCwgTlogNVxuXHR0aGlzLmFjdGl2ZU1pcE1hcExldmVsID0gMDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7XG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2ViR0xSZW5kZXJUYXJnZXRDdWJlO1xuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlO1xuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQm94MyggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRpc0JveDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdHZhciB4ID0gYXJyYXlbIGkgXTtcblx0XHRcdHZhciB5ID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHR2YXIgeiA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgeCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHR2YXIgeSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHR2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xuXHRcdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIENvbXB1dGVzIHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9mIGFuIG9iamVjdCAoaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiksXG5cdFx0Ly8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zXG5cblx0XHR2YXIgc2NvcGUsIGksIGw7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdHJhdmVyc2UoIG5vZGUgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG5vZGUuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0djEuY29weSggdmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRcdFx0djEuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHYxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHBhbmRCeU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHRzY29wZSA9IHRoaXM7XG5cblx0XHRcdG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHRvYmplY3QudHJhdmVyc2UoIHRyYXZlcnNlICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdHBvaW50LnogPCB0aGlzLm1pbi56IHx8IHBvaW50LnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJlxuXHRcdFx0dGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7XG5cblx0fSxcblxuXHRnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRQYXJhbWV0ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KFxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApLFxuXHRcdFx0KCBwb2ludC56IC0gdGhpcy5taW4ueiApIC8gKCB0aGlzLm1heC56IC0gdGhpcy5taW4ueiApXG5cdFx0KTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Ly8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRib3gubWF4LnogPCB0aGlzLm1pbi56IHx8IGJveC5taW4ueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcblxuXHRcdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cblx0XHRcdHRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdC8vIElmIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHRoZSBBQUJCIGFuZCBzcGhlcmUgaW50ZXJzZWN0LlxuXHRcdFx0cmV0dXJuIGNsb3Nlc3RQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlc1xuXHRcdC8vIGFyZSBvbiB0aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueCA+IDAgKSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnkgPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gKCBtaW4gPD0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IHBsYW5lLmNvbnN0YW50ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzVHJpYW5nbGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJpYW5nbGUgY2VudGVyZWQgdmVydGljZXNcblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIHRyaWFuZ2xlIGVkZ2UgdmVjdG9yc1xuXHRcdHZhciBmMCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRlc3RBeGlzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBleHRlbnRzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0cmlhbmdsZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiBzYXRGb3JBeGVzKCBheGVzICkge1xuXG5cdFx0XHR2YXIgaSwgajtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkge1xuXG5cdFx0XHRcdHRlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApO1xuXHRcdFx0XHQvLyBwcm9qZWN0IHRoZSBhYWJiIG9udG8gdGhlIHNlcGVyYXRpbmcgYXhpc1xuXHRcdFx0XHR2YXIgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCB0ZXN0QXhpcy54ICkgKyBleHRlbnRzLnkgKiBNYXRoLmFicyggdGVzdEF4aXMueSApICsgZXh0ZW50cy56ICogTWF0aC5hYnMoIHRlc3RBeGlzLnogKTtcblx0XHRcdFx0Ly8gcHJvamVjdCBhbGwgMyB2ZXJ0aWNlcyBvZiB0aGUgdHJpYW5nbGUgb250byB0aGUgc2VwZXJhdGluZyBheGlzXG5cdFx0XHRcdHZhciBwMCA9IHYwLmRvdCggdGVzdEF4aXMgKTtcblx0XHRcdFx0dmFyIHAxID0gdjEuZG90KCB0ZXN0QXhpcyApO1xuXHRcdFx0XHR2YXIgcDIgPSB2Mi5kb3QoIHRlc3RBeGlzICk7XG5cdFx0XHRcdC8vIGFjdHVhbCB0ZXN0LCBiYXNpY2FsbHkgc2VlIGlmIGVpdGhlciBvZiB0aGUgbW9zdCBleHRyZW1lIG9mIHRoZSB0cmlhbmdsZSBwb2ludHMgaW50ZXJzZWN0cyByXG5cdFx0XHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcblxuXHRcdFx0XHRcdC8vIHBvaW50cyBvZiB0aGUgcHJvamVjdGVkIHRyaWFuZ2xlIGFyZSBvdXRzaWRlIHRoZSBwcm9qZWN0ZWQgaGFsZi1sZW5ndGggb2YgdGhlIGFhYmJcblx0XHRcdFx0XHQvLyB0aGUgYXhpcyBpcyBzZXBlcmF0aW5nIGFuZCB3ZSBjYW4gZXhpdFxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1RyaWFuZ2xlKCB0cmlhbmdsZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY29tcHV0ZSBib3ggY2VudGVyIGFuZCBleHRlbnRzXG5cdFx0XHR0aGlzLmdldENlbnRlciggY2VudGVyICk7XG5cdFx0XHRleHRlbnRzLnN1YlZlY3RvcnMoIHRoaXMubWF4LCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gdHJhbnNsYXRlIHRyaWFuZ2xlIHRvIGFhYmIgb3JpZ2luXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCB0cmlhbmdsZS5hLCBjZW50ZXIgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmIsIGNlbnRlciApO1xuXHRcdFx0djIuc3ViVmVjdG9ycyggdHJpYW5nbGUuYywgY2VudGVyICk7XG5cblx0XHRcdC8vIGNvbXB1dGUgZWRnZSB2ZWN0b3JzIGZvciB0cmlhbmdsZVxuXHRcdFx0ZjAuc3ViVmVjdG9ycyggdjEsIHYwICk7XG5cdFx0XHRmMS5zdWJWZWN0b3JzKCB2MiwgdjEgKTtcblx0XHRcdGYyLnN1YlZlY3RvcnMoIHYwLCB2MiApO1xuXG5cdFx0XHQvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmJcblx0XHRcdC8vIG1ha2UgYW4gYXhpcyB0ZXN0aW5nIG9mIGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIGFhYmIgYWdhaW5zdCBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSB0cmlhbmdsZSA9IDkgYXhpcyBvZiBzZXBhcmF0aW9uXG5cdFx0XHQvLyBheGlzX2lqID0gdV9pIHggZl9qICh1MCwgdTEsIHUyID0gZmFjZSBub3JtYWxzIG9mIGFhYmIgPSB4LHkseiBheGVzIHZlY3RvcnMgc2luY2UgYWFiYiBpcyBheGlzIGFsaWduZWQpXG5cdFx0XHR2YXIgYXhlcyA9IFtcblx0XHRcdFx0MCwgLSBmMC56LCBmMC55LCAwLCAtIGYxLnosIGYxLnksIDAsIC0gZjIueiwgZjIueSxcblx0XHRcdFx0ZjAueiwgMCwgLSBmMC54LCBmMS56LCAwLCAtIGYxLngsIGYyLnosIDAsIC0gZjIueCxcblx0XHRcdFx0LSBmMC55LCBmMC54LCAwLCAtIGYxLnksIGYxLngsIDAsIC0gZjIueSwgZjIueCwgMFxuXHRcdFx0XTtcblx0XHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYlxuXHRcdFx0YXhlcyA9IFsgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSBdO1xuXHRcdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMgKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcblx0XHRcdC8vIHVzZSBhbHJlYWR5IGV4aXN0aW5nIHRyaWFuZ2xlIGVkZ2UgdmVjdG9ycyBoZXJlXG5cdFx0XHR0cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIGYwLCBmMSApO1xuXHRcdFx0YXhlcyA9IFsgdHJpYW5nbGVOb3JtYWwueCwgdHJpYW5nbGVOb3JtYWwueSwgdHJpYW5nbGVOb3JtYWwueiBdO1xuXHRcdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCb3VuZGluZ1NwaGVyZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldENlbnRlciggdGFyZ2V0LmNlbnRlciApO1xuXG5cdFx0XHR0YXJnZXQucmFkaXVzID0gdGhpcy5nZXRTaXplKCB2MSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xuXG5cdFx0Ly8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLlxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9pbnRzID0gW1xuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKClcblx0XHRdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xuXG5cdFx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpcztcblxuXHRcdFx0Ly8gTk9URTogSSBhbSB1c2luZyBhIGJpbmFyeSBwYXR0ZXJuIHRvIHNwZWNpZnkgYWxsIDJeMyBjb21iaW5hdGlvbnMgYmVsb3dcblx0XHRcdHBvaW50c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMFxuXHRcdFx0cG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0XHRwb2ludHNbIDIgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTBcblx0XHRcdHBvaW50c1sgMyBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMVxuXHRcdFx0cG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0XHRwb2ludHNbIDUgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDFcblx0XHRcdHBvaW50c1sgNiBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMFxuXHRcdFx0cG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcdC8vIDExMVxuXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmUoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdHRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVuZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcblxuXHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0XHRpZiAoIG9wdGlvbmFsQ2VudGVyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2VudGVyLmNvcHkoIG9wdGlvbmFsQ2VudGVyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ym94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludHNbIGkgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggc3BoZXJlLmNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDw9IDAgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHZhciByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyArIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHJhZGl1c1N1bSAqIHJhZGl1c1N1bSApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLmNlbnRlciApICkgPD0gdGhpcy5yYWRpdXM7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmNvcHkoIHBvaW50ICk7XG5cblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcblxuXHRcdFx0dGFyZ2V0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcblx0XHRcdHRhcmdldC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH0sXG5cblx0Z2V0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApO1xuXHRcdHRhcmdldC5leHBhbmRCeVNjYWxhciggdGhpcy5yYWRpdXMgKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZXF1YWxzKCB0aGlzLmNlbnRlciApICYmICggc3BoZXJlLnJhZGl1cyA9PT0gdGhpcy5yYWRpdXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUGxhbmUoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblx0dGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnRzOiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNvcGxhbmFyUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCBhLCBiLCBjICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gdjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCB2Mi5zdWJWZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cblxuXHRcdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHR2YXIgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpO1xuXHRcdHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7XG5cdFx0dGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgKj0gLSAxO1xuXHRcdHRoaXMubm9ybWFsLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0cHJvamVjdFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLnByb2plY3RQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBwb2ludCApICkuYWRkKCBwb2ludCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKCBsaW5lLCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggdjEgKTtcblxuXHRcdFx0dmFyIGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxuXG5cdFx0dmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXgzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgbTEuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0dmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdHRoaXMucGxhbmVzID0gW1xuXG5cdFx0KCBwMCAhPT0gdW5kZWZpbmVkICkgPyBwMCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMyAhPT0gdW5kZWZpbmVkICkgPyBwMyA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBsYW5lKClcblxuXHRdO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZydXN0dW0ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRwbGFuZXNbIDAgXS5jb3B5KCBwMCApO1xuXHRcdHBsYW5lc1sgMSBdLmNvcHkoIHAxICk7XG5cdFx0cGxhbmVzWyAyIF0uY29weSggcDIgKTtcblx0XHRwbGFuZXNbIDMgXS5jb3B5KCBwMyApO1xuXHRcdHBsYW5lc1sgNCBdLmNvcHkoIHA0ICk7XG5cdFx0cGxhbmVzWyA1IF0uY29weSggcDUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZnJ1c3R1bSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG1lMCA9IG1lWyAwIF0sIG1lMSA9IG1lWyAxIF0sIG1lMiA9IG1lWyAyIF0sIG1lMyA9IG1lWyAzIF07XG5cdFx0dmFyIG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XG5cdFx0dmFyIG1lOCA9IG1lWyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdO1xuXHRcdHZhciBtZTEyID0gbWVbIDEyIF0sIG1lMTMgPSBtZVsgMTMgXSwgbWUxNCA9IG1lWyAxNCBdLCBtZTE1ID0gbWVbIDE1IF07XG5cblx0XHRwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDEgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSArIG1lOCwgbWUxNSArIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDIgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTEsIG1lNyArIG1lNSwgbWUxMSArIG1lOSwgbWUxNSArIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDQgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTAsIG1lMTUgLSBtZTE0ICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUyLCBtZTcgKyBtZTYsIG1lMTEgKyBtZTEwLCBtZTE1ICsgbWUxNCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzT2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApXG5cdFx0XHRcdC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcHJpdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xuXG5cdFx0XHRzcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBjZW50ZXIgPSBzcGhlcmUuY2VudGVyO1xuXHRcdHZhciBuZWdSYWRpdXMgPSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcDEgPSBuZXcgVmVjdG9yMygpLFxuXHRcdFx0cDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBwbGFuZSA9IHBsYW5lc1sgaSBdO1xuXG5cdFx0XHRcdHAxLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWluLnggOiBib3gubWF4Lng7XG5cdFx0XHRcdHAyLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7XG5cdFx0XHRcdHAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWluLnkgOiBib3gubWF4Lnk7XG5cdFx0XHRcdHAyLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWF4LnkgOiBib3gubWluLnk7XG5cdFx0XHRcdHAxLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWluLnogOiBib3gubWF4Lno7XG5cdFx0XHRcdHAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XG5cblx0XHRcdFx0dmFyIGQxID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMSApO1xuXHRcdFx0XHR2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAyICk7XG5cblx0XHRcdFx0Ly8gaWYgYm90aCBvdXRzaWRlIHBsYW5lLCBubyBpbnRlcnNlY3Rpb25cblxuXHRcdFx0XHRpZiAoIGQxIDwgMCAmJiBkMiA8IDAgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxufSApO1xuXG52YXIgYWxwaGFtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGFtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGF0ZXN0X2ZyYWdtZW50ID0gXCIjaWZkZWYgQUxQSEFURVNUXFxuXFx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2NhcmQ7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhb21hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHRcXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgYW9tYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBiZWdpbl92ZXJ0ZXggPSBcIlxcbnZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApO1xcblwiO1xuXG52YXIgYmVnaW5ub3JtYWxfdmVydGV4ID0gXCJcXG52ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xcblwiO1xuXG52YXIgYnNkZnMgPSBcImZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xcblxcdGlmKCBkZWNheUV4cG9uZW50ID4gMC4wICkge1xcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xcblxcdFxcdGZsb2F0IG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yID0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcXG5cXHRcXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmICogbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3I7XFxuI2Vsc2VcXG5cXHRcXHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XFxuI2VuZGlmXFxuXFx0fVxcblxcdHJldHVybiAxLjA7XFxufVxcbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xcbn1cXG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBkb3RMSCApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcXG5cXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgID0gMC41IC8gTFVUX1NJWkU7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcXG5cXHR2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7XFxuXFx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xcblxcdHJldHVybiB1djtcXG59XFxuZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7XFxuXFx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xcblxcdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcXG59XFxudmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7XFxuXFx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XFxuXFx0ZmxvYXQgeSA9IGFicyggeCApO1xcblxcdGZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7XFxuXFx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcXG5cXHRmbG9hdCB2ID0gYSAvIGI7XFxuXFx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2O1xcblxcdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcXG59XFxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XFxuXFx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XFxuXFx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIFQxLCBUMjtcXG5cXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xcblxcdFQyID0gLSBjcm9zcyggTiwgVDEgKTtcXG5cXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xcblxcdHZlYzMgY29vcmRzWyA0IF07XFxuXFx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcXG5cXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcXG5cXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTtcXG5cXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XFxuXFx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XFxuXFx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XFxuXFx0Y29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XFxuXFx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcXG5cXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcXG5cXHR2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcdHJldHVybiBzcGVjdWxhckNvbG9yICogQUIueCArIEFCLnk7XFxufVxcbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XFxuXFx0cmV0dXJuIDAuMjU7XFxufVxcbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XFxuXFx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xcbn1cXG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XFxuXFx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XFxufVxcblwiO1xuXG52YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0JVTVBNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xcblxcdHZlYzIgZEhkeHlfZndkKCkge1xcblxcdFxcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcXG5cXHRcXHR2ZWMyIGRTVGR5ID0gZEZkeSggdlV2ICk7XFxuXFx0XFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xcblxcdFxcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xcblxcdFxcdGZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xcblxcdFxcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xcblxcdH1cXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xcblxcdFxcdHZlYzMgdlNpZ21hWCA9IHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMzIHZTaWdtYVkgPSB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2TiA9IHN1cmZfbm9ybTtcXG5cXHRcXHR2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7XFxuXFx0XFx0dmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApO1xcblxcdFxcdGZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICk7XFxuXFx0XFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0dmVjNCBwbGFuZTtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xcblxcdFxcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcXG5cXHR9XFxuXFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcXG5cXHRcXHRib29sIGNsaXBwZWQgPSB0cnVlO1xcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdFxcdGNsaXBwZWQgPSAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcXG5cXHRcXHR9XFxuXFx0XFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZDb2xvci54eXogPSBjb2xvci54eXo7XFxuI2VuZGlmXCI7XG5cbnZhciBjb21tb24gPSBcIiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1OVxcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcXG4jZGVmaW5lIExPRzIgMS40NDI2OTVcXG4jZGVmaW5lIEVQU0lMT04gMWUtNlxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG59O1xcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XFxufVxcbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xcbn1cXG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdGZsb2F0IGRpc3RhbmNlID0gZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcXG5cXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XFxufVxcbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xcbn1cXG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XFxufVxcbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xcblxcdG1hdDMgdG1wO1xcblxcdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xcblxcdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xcblxcdHRtcFsgMiBdID0gdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xcblxcdHJldHVybiB0bXA7XFxufVxcbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XFxuXFx0dmVjMyB3ZWlnaHRzID0gdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xcblxcdHJldHVybiBkb3QoIHdlaWdodHMsIGNvbG9yLnJnYiApO1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9IFwiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xcblxcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKGRpcmVjdGlvbik7XFxuXFx0aW50IGZhY2UgPSAtMTtcXG5cXHRpZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcXG5cXHRcXHRpZihhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwIDogMztcXG5cXHRcXHRlbHNlXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XFxuXFx0fVxcblxcdGVsc2Uge1xcblxcdFxcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIgOiA1O1xcblxcdFxcdGVsc2VcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcXG5cXHR9XFxuXFx0cmV0dXJuIGZhY2U7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXFxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXFxudmVjMiBNaXBMZXZlbEluZm8oIHZlYzMgdmVjLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XFxuXFx0ZmxvYXQgZHhSb3VnaG5lc3MgPSBkRmR4KHJvdWdobmVzcyk7XFxuXFx0ZmxvYXQgZHlSb3VnaG5lc3MgPSBkRmR5KHJvdWdobmVzcyk7XFxuXFx0dmVjMyBkeCA9IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGR5ID0gZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xcblxcdGZsb2F0IGQgPSBtYXgoIGRvdCggZHgsIGR4ICksIGRvdCggZHksIGR5ICkgKTtcXG5cXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XFxuXFx0ZmxvYXQgbWlwTGV2ZWwgPSAwLjUgKiBsb2cyKGQpO1xcblxcdHJldHVybiB2ZWMyKGZsb29yKG1pcExldmVsKSwgZnJhY3QobWlwTGV2ZWwpKTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxcbiNkZWZpbmUgY3ViZVVWX3JjcFRleHR1cmVTaXplICgxLjAgLyBjdWJlVVZfdGV4dHVyZVNpemUpXFxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xcblxcdG1pcExldmVsID0gcm91Z2huZXNzTGV2ZWwgPiBjdWJlVVZfbWF4TG9kczIgLSAzLjAgPyAwLjAgOiBtaXBMZXZlbDtcXG5cXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcXG5cXHR2ZWMyIGV4cDJfcGFja2VkID0gZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcXG5cXHR2ZWMyIHJjcF9leHAyX3BhY2tlZCA9IHZlYzIoIDEuMCApIC8gZXhwMl9wYWNrZWQ7XFxuXFx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcXG5cXHRmbG9hdCBzY2FsZSA9IHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xcblxcdGZsb2F0IG1pcE9mZnNldCA9IDAuNzUqKDEuMCAtIHJjcF9leHAyX3BhY2tlZC55KSAqIHJjcF9leHAyX3BhY2tlZC54O1xcblxcdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcXG5cXHRzY2FsZSA9ICBiUmVzICYmIChzY2FsZSA8IGEpID8gYSA6IHNjYWxlO1xcblxcdHZlYzMgcjtcXG5cXHR2ZWMyIG9mZnNldDtcXG5cXHRpbnQgZmFjZSA9IGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XFxuXFx0ZmxvYXQgcmNwUG93U2NhbGUgPSAxLjAgLyBwb3dTY2FsZTtcXG5cXHRpZiggZmFjZSA9PSAwKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMSkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMikge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSA0KSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRyID0gbm9ybWFsaXplKHIpO1xcblxcdGZsb2F0IHRleGVsT2Zmc2V0ID0gMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xcblxcdHZlYzIgcyA9ICggci55eiAvIGFicyggci54ICkgKyB2ZWMyKCAxLjAgKSApICogMC41O1xcblxcdHZlYzIgYmFzZSA9IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XFxuXFx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMzIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDMuMClcXG52ZWM0IHRleHR1cmVDdWJlVVYodmVjMyByZWZsZWN0ZWREaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCByb3VnaG5lc3NWYWwgPSByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcXG5cXHRmbG9hdCByMSA9IGZsb29yKHJvdWdobmVzc1ZhbCk7XFxuXFx0ZmxvYXQgcjIgPSByMSArIDEuMDtcXG5cXHRmbG9hdCB0ID0gZnJhY3Qocm91Z2huZXNzVmFsKTtcXG5cXHR2ZWMyIG1pcEluZm8gPSBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcXG5cXHRmbG9hdCBzID0gbWlwSW5mby55O1xcblxcdGZsb2F0IGxldmVsMCA9IG1pcEluZm8ueDtcXG5cXHRmbG9hdCBsZXZlbDEgPSBsZXZlbDAgKyAxLjA7XFxuXFx0bGV2ZWwxID0gbGV2ZWwxID4gNS4wID8gNS4wIDogbGV2ZWwxO1xcblxcdGxldmVsMCArPSBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xcblxcdHZlYzIgdXZfMTAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcXG5cXHR2ZWM0IGNvbG9yMTAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzEwKSk7XFxuXFx0dmVjMiB1dl8yMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xcblxcdHZlYzQgY29sb3IyMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcXG5cXHR2ZWM0IHJlc3VsdCA9IG1peChjb2xvcjEwLCBjb2xvcjIwLCB0KTtcXG5cXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xcbn1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogb2JqZWN0Tm9ybWFsO1xcbiNpZmRlZiBGTElQX1NJREVEXFxuXFx0dHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhcztcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW1pc3NpdmVtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcXG5cXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcXG5cXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSBcIiAgZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9IFwiXFxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmFsdWU7XFxufVxcbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XFxuXFx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XFxufVxcbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUueHl6ICogdmFsdWUudyAqIG1heFJhbmdlLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBNICAgICAgPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XFxuXFx0TSAgICAgICAgICAgID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xcbn1cXG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IEQgICAgICA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xcblxcdEQgICAgICAgICAgICA9IG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xcblxcdHZlYzMgWHBfWV9YWVpwID0gdmFsdWUucmdiICogY0xvZ0x1dk07XFxuXFx0WHBfWV9YWVpwID0gbWF4KFhwX1lfWFlacCwgdmVjMygxZS02LCAxZS02LCAxZS02KSk7XFxuXFx0dmVjNCB2UmVzdWx0O1xcblxcdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcXG5cXHRmbG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XFxuXFx0dlJlc3VsdC53ID0gZnJhY3QoTGUpO1xcblxcdHZSZXN1bHQueiA9IChMZSAtIChmbG9vcih2UmVzdWx0LncqMjU1LjApKS8yNTUuMCkvMjU1LjA7XFxuXFx0cmV0dXJuIHZSZXN1bHQ7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XFxudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XFxuXFx0dmVjMyBYcF9ZX1hZWnA7XFxuXFx0WHBfWV9YWVpwLnkgPSBleHAyKChMZSAtIDEyNy4wKSAvIDIuMCk7XFxuXFx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XFxuXFx0WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XFxuXFx0dmVjMyB2UkdCID0gWHBfWV9YWVpwLnJnYiAqIGNMb2dMdXZJbnZlcnNlTTtcXG5cXHRyZXR1cm4gdmVjNCggbWF4KHZSR0IsIDAuMCksIDEuMCApO1xcbn1cXG5cIjtcblxudmFyIGVudm1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcXG5cXHRcXHR2ZWMyIHNhbXBsZVVWO1xcblxcdFxcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcXG5cXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXFxuXFx0XFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xcblxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcXG5cXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcXG5cXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgKCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XFxuXFx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX3ZlcnRleCA9IFwiXFxuI2lmZGVmIFVTRV9GT0dcXG5mb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuICB2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHdoaXRlQ29tcGxpbWVudCggZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICkgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XFxuXFx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVE9PTlxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xcblxcdHZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9HUkFESUVOVE1BUFxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCA9IFwidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcXG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcXG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcXG5iYWNrR2VvbWV0cnkudmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuZmxvYXQgZG90Tkw7XFxudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGFyc19iZWdpbiA9IFwidW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdHN0cnVjdCBQb2ludExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcXG5cXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gKCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdHN0cnVjdCBTcG90TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHRcXHRmbG9hdCBjb25lQ29zO1xcblxcdFxcdGZsb2F0IHBlbnVtYnJhQ29zO1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCAgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodDtcXG5cXHR9O1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1xcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xcblxcdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgc2t5Q29sb3I7XFxuXFx0XFx0dmVjMyBncm91bmRDb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xcblxcdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGlycmFkaWFuY2U7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BhcnNfbWFwcyA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBxdWVyeVZlYywgMS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciArIDAuNzkyNDggLSAwLjUgKiBsb2cyKCBwb3cyKCBibGlublNoaW5pbmVzc0V4cG9uZW50ICkgKyAxLjAgKTtcXG5cXHRcXHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xcblxcdH1cXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xcblxcdFxcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVVihxdWVyeVJlZmxlY3RWZWMsIEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyhibGlublNoaW5pbmVzc0V4cG9uZW50KSk7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXFxuXFx0XFx0XFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRcXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLDAuMCwxLjAgKSApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfZnJhZ21lbnQgPSBcIkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcXG5cIjtcblxudmFyIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU2hpbmluZXNzO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmZGVmIFRPT05cXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9CbGlublBob25nXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVxcdCgwKVxcblwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50ID0gXCJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gY2xhbXAoIHJvdWdobmVzc0ZhY3RvciwgMC4wNCwgMS4wICk7XFxuI2lmZGVmIFNUQU5EQVJEXFxuXFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG5cXHRtYXRlcmlhbC5jbGVhckNvYXQgPSBzYXR1cmF0ZSggY2xlYXJDb2F0ICk7XFx0bWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0gY2xhbXAoIGNsZWFyQ29hdFJvdWdobmVzcywgMC4wNCwgMS4wICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9IFwic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xcblxcdHZlYzNcXHRkaWZmdXNlQ29sb3I7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclJvdWdobmVzcztcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0O1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG5cXHQjZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhckNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XFxuXFx0XFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXFxuXFx0XFx0XFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxcblxcdFxcdCk7XFxuXFx0XFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhckNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdE5WO1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIHJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyQ29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuI2RlZmluZSBNYXRlcmlhbF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApXFxuI2RlZmluZSBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcXG59XFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfYmVnaW4gPSBcIlxcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XFxuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsO1xcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0U3BvdExpZ2h0IHNwb3RMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0XFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRsaWdodE1hcElycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0aXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XFxuXFx0I2VuZGlmXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHRyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGNsZWFyQ29hdFJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfZW5kID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGNsZWFyQ29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IGxvZzIoIHZGcmFnRGVwdGggKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xcblxcdFxcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWM0IHRleGVsQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlV2ICk7XFxuXFx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJ0aWNsZV9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcXG5cXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDIgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xcblxcdCNlbHNlXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIG1vcnBodGFyZ2V0X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9iZWdpbiA9IFwiI2lmZGVmIEZMQVRfU0hBREVEXFxuXFx0dmVjMyBmZHggPSB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBmZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XFxuI2Vsc2VcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRub3JtYWwgPSBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZ21lbnRfbWFwcyA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCApO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTk9STUFMTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xcblxcdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtICkge1xcblxcdFxcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XFxuXFx0XFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xcblxcdFxcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XFxuXFx0XFx0ZmxvYXQgc2NhbGUgPSBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xcdFxcdHNjYWxlICo9IGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wO1xcblxcdFxcdHZlYzMgUyA9IG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIFQgPSBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIE4gPSBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xcblxcdFxcdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XFxuXFx0XFx0bWFwTi54eSA9IG5vcm1hbFNjYWxlICogbWFwTi54eTtcXG5cXHRcXHRtYXQzIHRzbiA9IG1hdDMoIFMsIFQsIE4gKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgcGFja2luZyA9IFwidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xcblxcdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xcbn1cXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcXG5cXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcXG59XFxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcXG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcXG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnMgPSBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywgMS4gKTtcXG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcXG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcXG5cXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcXG5cXHRyLnl6dyAtPSByLnh5eiAqIFNoaWZ0UmlnaHQ4O1xcdHJldHVybiByICogUGFja1Vwc2NhbGU7XFxufVxcbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xcbn1cXG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcXG59XFxuZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBsaW5lYXJDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcXG59XFxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICgoIG5lYXIgKyB2aWV3WiApICogZmFyICkgLyAoKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApO1xcbn1cXG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcXG59XFxuXCI7XG5cbnZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gXCIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBwcm9qZWN0X3ZlcnRleCA9IFwidmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXCI7XG5cbnZhciBkaXRoZXJpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcblxcdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdFxcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcXG5cXHRcXHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xcblxcdFxcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XFxuXFx0XFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcXG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxcblxcdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2ICk7XFxuXFx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcXG5cXHRcXHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xcblxcdFxcdGNvbnN0IHZlYzIgb2Zmc2V0ID0gdmVjMiggMC4wLCAxLjAgKTtcXG5cXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2l6ZTtcXG5cXHRcXHR2ZWMyIGNlbnRyb2lkVVYgPSBmbG9vciggdXYgKiBzaXplICsgMC41ICkgLyBzaXplO1xcblxcdFxcdGZsb2F0IGxiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgbHQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCByYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IHJ0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XFxuXFx0XFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xcblxcdFxcdGZsb2F0IGEgPSBtaXgoIGxiLCBsdCwgZi55ICk7XFxuXFx0XFx0ZmxvYXQgYiA9IG1peCggcmIsIHJ0LCBmLnkgKTtcXG5cXHRcXHRmbG9hdCBjID0gbWl4KCBhLCBiLCBmLnggKTtcXG5cXHRcXHRyZXR1cm4gYztcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcXG5cXHRcXHRmbG9hdCBzaGFkb3cgPSAxLjA7XFxuXFx0XFx0c2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7XFxuXFx0XFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xcblxcdFxcdGJ2ZWM0IGluRnJ1c3R1bVZlYyA9IGJ2ZWM0ICggc2hhZG93Q29vcmQueCA+PSAwLjAsIHNoYWRvd0Nvb3JkLnggPD0gMS4wLCBzaGFkb3dDb29yZC55ID49IDAuMCwgc2hhZG93Q29vcmQueSA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGluRnJ1c3R1bSA9IGFsbCggaW5GcnVzdHVtVmVjICk7XFxuXFx0XFx0YnZlYzIgZnJ1c3R1bVRlc3RWZWMgPSBidmVjMiggaW5GcnVzdHVtLCBzaGFkb3dDb29yZC56IDw9IDEuMCApO1xcblxcdFxcdGJvb2wgZnJ1c3R1bVRlc3QgPSBhbGwoIGZydXN0dW1UZXN0VmVjICk7XFxuXFx0XFx0aWYgKCBmcnVzdHVtVGVzdCApIHtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcXG5cXHRcXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHNoYWRvdyA9IChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBzaGFkb3c7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1xcdFxcdGRwICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gPSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG5cXHRyZXR1cm4gc2hhZG93O1xcbn1cXG5cIjtcblxudmFyIHNraW5iYXNlX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xcblxcdG1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xcblxcdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xcblxcdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xcbiNlbmRpZlwiO1xuXG52YXIgc2tpbm5pbmdfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XFxuXFx0I2lmZGVmIEJPTkVfVEVYVFVSRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xcblxcdFxcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcXG5cXHRcXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgaiA9IGkgKiA0LjA7XFxuXFx0XFx0XFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XFxuXFx0XFx0XFx0dmVjNCB2MSA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2NCA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5pbmdfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5cXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcXG5cXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xcblxcdHNraW5NYXRyaXggID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcXG5cXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNwZWN1bGFybWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xcbiNlbHNlXFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcXG4jZW5kaWZcIjtcblxudmFyIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcXG4jZW5kaWZcIjtcblxudmFyIHRvbmVtYXBwaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmbmRlZiBzYXR1cmF0ZVxcblxcdCNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ1doaXRlUG9pbnQ7XFxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xcbn1cXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcXG59XFxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxcbnZlYzMgVW5jaGFydGVkMlRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xcbn1cXG52ZWMzIE9wdGltaXplZENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XFxuXFx0cmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcXG59XFxuXCI7XG5cbnZhciB1dl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuXFx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdXZfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHRhdHRyaWJ1dGUgdmVjMiB1djI7XFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2VXYyID0gdXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgd29ybGRwb3NfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxcblxcdHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY3ViZV9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xcbnVuaWZvcm0gZmxvYXQgdEZsaXA7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZFBvc2l0aW9uLngsIHZXb3JsZFBvc2l0aW9uLnl6ICkgKTtcXG5cXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udztcXG59XFxuXCI7XG5cbnZhciBkZXB0aF9mcmFnID0gXCIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGdsX0ZyYWdDb29yZC56ICksIG9wYWNpdHkgKTtcXG5cXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XFxuXFx0I2VuZGlmXFxufVxcblwiO1xuXG52YXIgZGVwdGhfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4gKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcXG5cXHRkaXN0ID0gKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XFxuXFx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XFxufVxcblwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSBcIiNkZWZpbmUgRElTVEFOQ0VcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdFxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcXG59XFxuXCI7XG5cbnZhciBlcXVpcmVjdF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiApO1xcblxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdHNhbXBsZVVWLnggPSBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xcbn1cXG5cIjtcblxudmFyIGVxdWlyZWN0X3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbGluZWRhc2hlZF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcXG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIGxpbmVkYXNoZWRfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzY2FsZTtcXG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hiYXNpY19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0I2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNoYmFzaWNfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19tYXBzPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaG9uZ19mcmFnID0gXCIjZGVmaW5lIFBIT05HXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX21hcHM+XFxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGhvbmdfdmVydCA9IFwiI2RlZmluZSBQSE9OR1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX2ZyYWcgPSBcIiNkZWZpbmUgUEhZU0lDQUxcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XFxudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgU1RBTkRBUkRcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdDtcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG4jZW5kaWZcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaHlzaWNhbF92ZXJ0ID0gXCIjZGVmaW5lIFBIWVNJQ0FMXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWcgPSBcIiNkZWZpbmUgTk9STUFMXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cXG5cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG59XFxuXCI7XG5cbnZhciBwb2ludHNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBwb2ludHNfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZSAqICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgc2hhZG93X2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBjb2xvcjtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBzaGFkb3dfdmVydCA9IFwiI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc19mcmFnbWVudDogZW52bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX3ZlcnRleDogZW52bWFwX3BhcnNfdmVydGV4LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxuXHRsaWdodHNfcGFyc19tYXBzOiBsaWdodHNfcGFyc19tYXBzLFxuXHRsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCxcblx0bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfZnJhZ21lbnRfYmVnaW46IGxpZ2h0c19mcmFnbWVudF9iZWdpbixcblx0bGlnaHRzX2ZyYWdtZW50X21hcHM6IGxpZ2h0c19mcmFnbWVudF9tYXBzLFxuXHRsaWdodHNfZnJhZ21lbnRfZW5kOiBsaWdodHNfZnJhZ21lbnRfZW5kLFxuXHRsb2dkZXB0aGJ1Zl9mcmFnbWVudDogbG9nZGVwdGhidWZfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCxcblx0bG9nZGVwdGhidWZfdmVydGV4OiBsb2dkZXB0aGJ1Zl92ZXJ0ZXgsXG5cdG1hcF9mcmFnbWVudDogbWFwX2ZyYWdtZW50LFxuXHRtYXBfcGFyc19mcmFnbWVudDogbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9mcmFnbWVudDogbWFwX3BhcnRpY2xlX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDogbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDogbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1vcnBobm9ybWFsX3ZlcnRleDogbW9ycGhub3JtYWxfdmVydGV4LFxuXHRtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDogbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LFxuXHRub3JtYWxfZnJhZ21lbnRfYmVnaW46IG5vcm1hbF9mcmFnbWVudF9iZWdpbixcblx0bm9ybWFsX2ZyYWdtZW50X21hcHM6IG5vcm1hbF9mcmFnbWVudF9tYXBzLFxuXHRub3JtYWxtYXBfcGFyc19mcmFnbWVudDogbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHBhY2tpbmc6IHBhY2tpbmcsXG5cdHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQsXG5cdHByb2plY3RfdmVydGV4OiBwcm9qZWN0X3ZlcnRleCxcblx0ZGl0aGVyaW5nX2ZyYWdtZW50OiBkaXRoZXJpbmdfZnJhZ21lbnQsXG5cdGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IHNoYWRvd21hcF9wYXJzX3ZlcnRleCxcblx0c2hhZG93bWFwX3ZlcnRleDogc2hhZG93bWFwX3ZlcnRleCxcblx0c2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsXG5cdHNraW5iYXNlX3ZlcnRleDogc2tpbmJhc2VfdmVydGV4LFxuXHRza2lubmluZ19wYXJzX3ZlcnRleDogc2tpbm5pbmdfcGFyc192ZXJ0ZXgsXG5cdHNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LFxuXHRza2lubm9ybWFsX3ZlcnRleDogc2tpbm5vcm1hbF92ZXJ0ZXgsXG5cdHNwZWN1bGFybWFwX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9mcmFnbWVudCxcblx0c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX2ZyYWdtZW50OiB1dl9wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX3ZlcnRleDogdXZfcGFyc192ZXJ0ZXgsXG5cdHV2X3ZlcnRleDogdXZfdmVydGV4LFxuXHR1djJfcGFyc19mcmFnbWVudDogdXYyX3BhcnNfZnJhZ21lbnQsXG5cdHV2Ml9wYXJzX3ZlcnRleDogdXYyX3BhcnNfdmVydGV4LFxuXHR1djJfdmVydGV4OiB1djJfdmVydGV4LFxuXHR3b3JsZHBvc192ZXJ0ZXg6IHdvcmxkcG9zX3ZlcnRleCxcblxuXHRjdWJlX2ZyYWc6IGN1YmVfZnJhZyxcblx0Y3ViZV92ZXJ0OiBjdWJlX3ZlcnQsXG5cdGRlcHRoX2ZyYWc6IGRlcHRoX2ZyYWcsXG5cdGRlcHRoX3ZlcnQ6IGRlcHRoX3ZlcnQsXG5cdGRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkFfZnJhZyxcblx0ZGlzdGFuY2VSR0JBX3ZlcnQ6IGRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRlcXVpcmVjdF9mcmFnOiBlcXVpcmVjdF9mcmFnLFxuXHRlcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdF92ZXJ0LFxuXHRsaW5lZGFzaGVkX2ZyYWc6IGxpbmVkYXNoZWRfZnJhZyxcblx0bGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFzaGVkX3ZlcnQsXG5cdG1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWNfZnJhZyxcblx0bWVzaGJhc2ljX3ZlcnQ6IG1lc2hiYXNpY192ZXJ0LFxuXHRtZXNobGFtYmVydF9mcmFnOiBtZXNobGFtYmVydF9mcmFnLFxuXHRtZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydF92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnRcbn07XG5cbi8qKlxuICogVW5pZm9ybSBVdGlsaXRpZXNcbiAqL1xuXG52YXIgVW5pZm9ybXNVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCB1bmlmb3JtcyApIHtcblxuXHRcdHZhciBtZXJnZWQgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcblxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuY2xvbmUoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdG1wICkge1xuXG5cdFx0XHRcdG1lcmdlZFsgcCBdID0gdG1wWyBwIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtZXJnZWQ7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHR2YXIgdW5pZm9ybXNfZHN0ID0ge307XG5cblx0XHRmb3IgKCB2YXIgdSBpbiB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdID0ge307XG5cblx0XHRcdGZvciAoIHZhciBwIGluIHVuaWZvcm1zX3NyY1sgdSBdICkge1xuXG5cdFx0XHRcdHZhciBwYXJhbWV0ZXJfc3JjID0gdW5pZm9ybXNfc3JjWyB1IF1bIHAgXTtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcl9zcmMgJiYgKCBwYXJhbWV0ZXJfc3JjLmlzQ29sb3IgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzTWF0cml4MyB8fCBwYXJhbWV0ZXJfc3JjLmlzTWF0cml4NCB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IyIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IzIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3I0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1RleHR1cmUgKSApIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1ldGVyX3NyYyApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuc2xpY2UoKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5pZm9ybXNfZHN0O1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDb2xvcktleXdvcmRzID0geyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEnOiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsXG5cdCdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMixcblx0J2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29sYXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLFxuXHQnY29ybmZsb3dlcmJsdWUnOiAweDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFuJzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4Qixcblx0J2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsXG5cdCdkYXJrb2xpdmVncmVlbic6IDB4NTU2QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFya3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzogMHg4RkJDOEYsXG5cdCdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5JzogMHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgwMENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsXG5cdCdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLFxuXHQnZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNoc2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCxcblx0J2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdncmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0LFxuXHQnaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLFxuXHQnbGVtb25jaGlmZm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYwODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZBRkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLFxuXHQnbGlnaHRncmVlbic6IDB4OTBFRTkwLCAnbGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9uJzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAweDg3Q0VGQSxcblx0J2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMixcblx0J2xpbmVuJzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21lZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1bW9yY2hpZCc6IDB4QkE1NUQzLFxuXHQnbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1zZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1zcHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsXG5cdCdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELFxuXHQnbmF2eSc6IDB4MDAwMDgwLCAnb2xkbGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIzLCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4REE3MEQ2LFxuXHQncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZCOTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMsICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSxcblx0J3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4Rixcblx0J3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24nOiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAnc2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsXG5cdCdzaWVubmEnOiAweEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVibHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4MDkwLCAnc25vdyc6IDB4RkZGQUZBLFxuXHQnc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLFxuXHQndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZGRkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93Z3JlZW4nOiAweDlBQ0QzMiB9O1xuXG5mdW5jdGlvbiBDb2xvciggciwgZywgYiApIHtcblxuXHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHQvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCByICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbG9yLnByb3RvdHlwZSwge1xuXG5cdGlzQ29sb3I6IHRydWUsXG5cblx0cjogMSwgZzogMSwgYjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSR0I6IGZ1bmN0aW9uICggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIU0w6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIHQgKSB7XG5cblx0XHRcdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdFx0XHRpZiAoIHQgPiAxICkgdCAtPSAxO1xuXHRcdFx0aWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0O1xuXHRcdFx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0XHRcdGlmICggdCA8IDIgLyAzICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTtcblx0XHRcdHJldHVybiBwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblx0XHRcdGggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRcdHMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApO1xuXHRcdFx0bCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7XG5cblx0XHRcdGlmICggcyA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XG5cdFx0XHRcdHZhciBxID0gKCAyICogbCApIC0gcDtcblxuXHRcdFx0XHR0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTtcblx0XHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0XHR0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldFN0eWxlOiBmdW5jdGlvbiAoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKFxccyooW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIHJnYiAvIGhzbFxuXG5cdFx0XHR2YXIgY29sb3I7XG5cdFx0XHR2YXIgbmFtZSA9IG1bIDEgXTtcblx0XHRcdHZhciBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnaHNsJzpcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oWzAtOV0qXFwuP1swLTldKylcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxuXHRcdFx0XHRcdFx0dmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7XG5cdFx0XHRcdFx0XHR2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWYwLTldKykkLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyBoZXggY29sb3JcblxuXHRcdFx0dmFyIGhleCA9IG1bIDEgXTtcblx0XHRcdHZhciBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gY29sb3Iga2V5d29yZHNcblx0XHRcdHZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0XHRpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHJlZFxuXHRcdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBjb2xvclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3Iucjtcblx0XHR0aGlzLmcgPSBjb2xvci5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIGdhbW1hRmFjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZhY3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBzYWZlSW52ZXJzZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR0aGlzLnIgPSByICogcjtcblx0XHR0aGlzLmcgPSBnICogZztcblx0XHR0aGlzLmIgPSBiICogYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydExpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuciA9IE1hdGguc3FydCggdGhpcy5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5zcXJ0KCB0aGlzLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnNxcnQoIHRoaXMuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRIZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH0sXG5cblx0Z2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fSxcblxuXHRnZXRIU0w6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcblx0XHR2YXIgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdHZhciBodWUsIHNhdHVyYXRpb247XG5cdFx0dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XG5cblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xuXG5cdFx0XHRodWUgPSAwO1xuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcblxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xuXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGh1ZSAvPSA2O1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmggPSBodWU7XG5cdFx0dGFyZ2V0LnMgPSBzYXR1cmF0aW9uO1xuXHRcdHRhcmdldC5sID0gbGlnaHRuZXNzO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFN0eWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknO1xuXG5cdH0sXG5cblx0b2Zmc2V0SFNMOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaHNsID0ge307XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBoLCBzLCBsICkge1xuXG5cdFx0XHR0aGlzLmdldEhTTCggaHNsICk7XG5cblx0XHRcdGhzbC5oICs9IGg7IGhzbC5zICs9IHM7IGhzbC5sICs9IGw7XG5cblx0XHRcdHRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMsIGhzbC5sICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YWRkOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZENvbG9yczogZnVuY3Rpb24gKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnNcbiAqL1xuXG52YXIgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0c3BlY3VsYXJtYXA6IHtcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRlbnZtYXA6IHtcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sXG5cdFx0bWF4TWlwTGV2ZWw6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGRpcmVjdGlvbmFsTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGNvbG9yOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRzcG90TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblx0XHRcdGNvbmVDb3M6IHt9LFxuXHRcdFx0cGVudW1icmFDb3M6IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRzcG90U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHNwb3RTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICovXG5cbnZhciBTaGFkZXJMaWIgPSB7XG5cblx0YmFzaWM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZ1xuXG5cdH0sXG5cblx0bGFtYmVydDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWdcblxuXHR9LFxuXG5cdHBob25nOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0c3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LFxuXHRcdFx0XHRzaGluaW5lc3M6IHsgdmFsdWU6IDMwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZ1xuXG5cdH0sXG5cblx0c3RhbmRhcmQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHJvdWdobmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdG1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdGVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHQvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vXHRDdWJlIG1hcCBzaGFkZXJcblx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHRjdWJlOiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEN1YmU6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdHRGbGlwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWdcblxuXHR9LFxuXG5cdGVxdWlyZWN0OiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZ1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VSR0JBOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRyZWZlcmVuY2VQb3NpdGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjMoKSB9LFxuXHRcdFx0XHRuZWFyRGlzdGFuY2U6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0ZmFyRGlzdGFuY2U6IHsgdmFsdWU6IDEwMDAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV9mcmFnXG5cblx0fSxcblxuXHRzaGFkb3c6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHR7XG5cdFx0XHRcdGNvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAgKSB9LFxuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fSxcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfZnJhZ1xuXG5cdH1cblxufTtcblxuU2hhZGVyTGliLnBoeXNpY2FsID0ge1xuXG5cdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0U2hhZGVyTGliLnN0YW5kYXJkLnVuaWZvcm1zLFxuXHRcdHtcblx0XHRcdGNsZWFyQ29hdDogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJDb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH1cblx0XHR9XG5cdF0gKSxcblxuXHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7XG5cblx0dmFyIGJ1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1c2FnZSA9IGF0dHJpYnV0ZS5keW5hbWljID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVc7XG5cblx0XHR2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcblxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XG5cblx0XHR2YXIgdHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuJyApO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRidWZmZXI6IGJ1ZmZlcixcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb25cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVCdWZmZXIoIGJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1cGRhdGVSYW5nZSA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuZHluYW1pYyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0Ly8gTm90IHVzaW5nIHVwZGF0ZSByYW5nZXNcblxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwgYXJyYXkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xPYmplY3RzLnVwZGF0ZUJ1ZmZlcjogZHluYW1pYyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUgbWFya2VkIGFzIG5lZWRzVXBkYXRlIGJ1dCB1cGRhdGVSYW5nZS5jb3VudCBpcyAwLCBlbnN1cmUgeW91IGFyZSB1c2luZyBzZXQgbWV0aG9kcyBvciB1cGRhdGluZyBtYW51YWxseS4nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCB1cGRhdGVSYW5nZS5vZmZzZXQgKiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR1cGRhdGVSYW5nZS5jb3VudCA9IC0gMTsgLy8gcmVzZXQgcmFuZ2VcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBnZXQoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHJldHVybiBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRpZiAoIGRhdGEgKSB7XG5cblx0XHRcdGdsLmRlbGV0ZUJ1ZmZlciggZGF0YS5idWZmZXIgKTtcblxuXHRcdFx0YnVmZmVycy5kZWxldGUoIGF0dHJpYnV0ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHZhciBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gRXVsZXIoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgRXVsZXIuRGVmYXVsdE9yZGVyO1xuXG59XG5cbkV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcsICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07XG5cbkV1bGVyLkRlZmF1bHRPcmRlciA9ICdYWVonO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0eDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl94O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b3JkZXI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fb3JkZXI7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl9vcmRlciA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdGlzRXVsZXI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMuX3ggPSBldWxlci5feDtcblx0XHR0aGlzLl95ID0gZXVsZXIuX3k7XG5cdFx0dGhpcy5feiA9IGV1bGVyLl96O1xuXHRcdHRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0dmFyIGNsYW1wID0gX01hdGguY2xhbXA7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIHRlID0gbS5lbGVtZW50cztcblx0XHR2YXIgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcblx0XHR2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTtcblx0XHR2YXIgbTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRvcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0XHRtYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHYsIG9yZGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciB8fCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0cmVvcmRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0dmFyIHEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlb3JkZXIoIG5ld09yZGVyICkge1xuXG5cdFx0XHRxLnNldEZyb21FdWxlciggdGhpcyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggcSwgbmV3T3JkZXIgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgMCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgMiBdO1xuXHRcdGlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvVmVjdG9yMzogZnVuY3Rpb24gKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdGlmICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRcdHJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGF5ZXJzKCkge1xuXG5cdHRoaXMubWFzayA9IDEgfCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0dG9nZ2xlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgXj0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayAmPSB+ICggMSA8PCBjaGFubmVsIHwgMCApO1xuXG5cdH0sXG5cblx0dGVzdDogZnVuY3Rpb24gKCBsYXllcnMgKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLm1hc2sgJiBsYXllcnMubWFzayApICE9PSAwO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBlbGVwaGFudGF0d29yayAvIHd3dy5lbGVwaGFudGF0d29yay5jaFxuICovXG5cbnZhciBvYmplY3QzRElkID0gMDtcblxuZnVuY3Rpb24gT2JqZWN0M0QoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBvYmplY3QzRElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ09iamVjdDNEJztcblxuXHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdHRoaXMuY2hpbGRyZW4gPSBbXTtcblxuXHR0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNsb25lKCk7XG5cblx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XG5cdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcblxuXHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xuXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XG5cblx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xuXG5cdH1cblxuXHRyb3RhdGlvbi5vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApO1xuXHRxdWF0ZXJuaW9uLm9uQ2hhbmdlKCBvblF1YXRlcm5pb25DaGFuZ2UgKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHBvc2l0aW9uXG5cdFx0fSxcblx0XHRyb3RhdGlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiByb3RhdGlvblxuXHRcdH0sXG5cdFx0cXVhdGVybmlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBxdWF0ZXJuaW9uXG5cdFx0fSxcblx0XHRzY2FsZToge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBzY2FsZVxuXHRcdH0sXG5cdFx0bW9kZWxWaWV3TWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDQoKVxuXHRcdH0sXG5cdFx0bm9ybWFsTWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDMoKVxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5tYXRyaXhXb3JsZCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7XG5cdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXHR0aGlzLnZpc2libGUgPSB0cnVlO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IGZhbHNlO1xuXHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcblxuXHR0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlO1xuXHR0aGlzLnJlbmRlck9yZGVyID0gMDtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cbn1cblxuT2JqZWN0M0QuRGVmYXVsdFVwID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcbk9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblxuT2JqZWN0M0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9iamVjdDNELFxuXG5cdGlzT2JqZWN0M0Q6IHRydWUsXG5cblx0b25CZWZvcmVSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXHRvbkFmdGVyUmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIHRoaXMubWF0cml4ICk7XG5cblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XG5cblx0fSxcblxuXHRyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVPbkF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlT25Xb3JsZEF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cdFx0Ly8gbWV0aG9kIGFzc3VtZXMgbm8gcm90YXRlZCBwYXJlbnRcblxuXHRcdHZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlT25Xb3JsZEF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgb2JqZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHtcblxuXHRcdFx0djEuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XG5cblx0XHRcdHRoaXMucG9zaXRpb24uYWRkKCB2MS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVkoIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvY2FsVG9Xb3JsZDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0d29ybGRUb0xvY2FsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHdvcmxkVG9Mb2NhbCggdmVjdG9yICkge1xuXG5cdFx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggbTEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyB3aXRoIHJvdGF0ZWQgYW5kL29yIHRyYW5zbGF0ZWQgcGFyZW50KHMpXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggeCwgeSwgeiApIHtcblxuXHRcdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0XHR2ZWN0b3IuY29weSggeCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgKSB7XG5cblx0XHRcdFx0bTEubG9va0F0KCB0aGlzLnBvc2l0aW9uLCB2ZWN0b3IsIHRoaXMudXAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHZlY3RvciwgdGhpcy5wb3NpdGlvbiwgdGhpcy51cCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0xICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmFkZCggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0ID09PSB0aGlzICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLlwiLCBvYmplY3QgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5wYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0b2JqZWN0LnBhcmVudC5yZW1vdmUoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2FkZGVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC5cIiwgb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTtcblxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IG51bGw7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdyZW1vdmVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeUlkOiBmdW5jdGlvbiAoIGlkICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdHZhciBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBvYmplY3Q7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRRdWF0ZXJuaW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgdGFyZ2V0LCBzY2FsZSApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRTY2FsZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRTY2FsZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHRhcmdldCApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoKSB7fSxcblxuXHR0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRjYWxsYmFjayggcGFyZW50ICk7XG5cblx0XHRcdHBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Zm9yY2UgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGNoaWxkcmVuXG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Ly8gbWV0YSBpcyBhIHN0cmluZyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0dmFyIG91dHB1dCA9IHt9O1xuXG5cdFx0Ly8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy5cblx0XHQvLyBub3QgcHJvdmlkaW5nIGl0IGltcGxpZXMgdGhhdCB0aGlzIGlzIHRoZSByb290IG9iamVjdFxuXHRcdC8vIGJlaW5nIHNlcmlhbGl6ZWQuXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdC8vIGluaXRpYWxpemUgbWV0YSBvYmpcblx0XHRcdG1ldGEgPSB7XG5cdFx0XHRcdGdlb21ldHJpZXM6IHt9LFxuXHRcdFx0XHRtYXRlcmlhbHM6IHt9LFxuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge30sXG5cdFx0XHRcdHNoYXBlczoge31cblx0XHRcdH07XG5cblx0XHRcdG91dHB1dC5tZXRhZGF0YSA9IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnT2JqZWN0Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJ1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdC8vIHN0YW5kYXJkIE9iamVjdDNEIHNlcmlhbGl6YXRpb25cblxuXHRcdHZhciBvYmplY3QgPSB7fTtcblxuXHRcdG9iamVjdC51dWlkID0gdGhpcy51dWlkO1xuXHRcdG9iamVjdC50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0aWYgKCB0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUgKSBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnJlY2VpdmVTaGFkb3cgPT09IHRydWUgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMuZnJ1c3R1bUN1bGxlZCA9PT0gZmFsc2UgKSBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuXHRcdGlmICggdGhpcy5yZW5kZXJPcmRlciAhPT0gMCApIG9iamVjdC5yZW5kZXJPcmRlciA9IHRoaXMucmVuZGVyT3JkZXI7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdG9iamVjdC5tYXRyaXggPSB0aGlzLm1hdHJpeC50b0FycmF5KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0Ly9cblxuXHRcdGZ1bmN0aW9uIHNlcmlhbGl6ZSggbGlicmFyeSwgZWxlbWVudCApIHtcblxuXHRcdFx0aWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbWVudC51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnNoYXBlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHR2YXIgdXVpZHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR1dWlkcy5wdXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSB1dWlkcztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0b2JqZWN0LmNoaWxkcmVuID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApO1xuXHRcdFx0dmFyIG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7XG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblx0XHRcdHZhciBzaGFwZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNoYXBlcyApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcblx0XHRcdGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0LmltYWdlcyA9IGltYWdlcztcblx0XHRcdGlmICggc2hhcGVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuc2hhcGVzID0gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMudXAuY29weSggc291cmNlLnVwICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdO1xuXHRcdFx0XHR0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gQ2FtZXJhKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcblxuXHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENhbWVyYSxcblxuXHRpc0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBhcm9zZSAvIGh0dHA6Ly9naXRodWIuY29tL2Fyb3NlXG4gKi9cblxuZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdHRoaXMuem9vbSA9IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5sZWZ0ID0gbGVmdDtcblx0dGhpcy5yaWdodCA9IHJpZ2h0O1xuXHR0aGlzLnRvcCA9IHRvcDtcblx0dGhpcy5ib3R0b20gPSBib3R0b207XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAwLjE7XG5cdHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDtcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5PcnRob2dyYXBoaWNDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9ydGhvZ3JhcGhpY0NhbWVyYSxcblxuXHRpc09ydGhvZ3JhcGhpY0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDtcblx0XHR0aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0O1xuXHRcdHRoaXMudG9wID0gc291cmNlLnRvcDtcblx0XHR0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207XG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcblx0XHR2YXIgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBjeCA9ICggdGhpcy5yaWdodCArIHRoaXMubGVmdCApIC8gMjtcblx0XHR2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7XG5cblx0XHR2YXIgbGVmdCA9IGN4IC0gZHg7XG5cdFx0dmFyIHJpZ2h0ID0gY3ggKyBkeDtcblx0XHR2YXIgdG9wID0gY3kgKyBkeTtcblx0XHR2YXIgYm90dG9tID0gY3kgLSBkeTtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHR2YXIgem9vbVcgPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy53aWR0aCAvIHRoaXMudmlldy5mdWxsV2lkdGggKTtcblx0XHRcdHZhciB6b29tSCA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LmhlaWdodCAvIHRoaXMudmlldy5mdWxsSGVpZ2h0ICk7XG5cdFx0XHR2YXIgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcud2lkdGg7XG5cdFx0XHR2YXIgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuaGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9mZnNldFggLyB6b29tVyApO1xuXHRcdFx0cmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogKCB0aGlzLnZpZXcud2lkdGggLyB6b29tVyApO1xuXHRcdFx0dG9wIC09IHNjYWxlSCAqICggdGhpcy52aWV3Lm9mZnNldFkgLyB6b29tSCApO1xuXHRcdFx0Ym90dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8gem9vbUggKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cdFx0ZGF0YS5vYmplY3QubGVmdCA9IHRoaXMubGVmdDtcblx0XHRkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7XG5cdFx0ZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7XG5cdFx0ZGF0YS5vYmplY3QuYm90dG9tID0gdGhpcy5ib3R0b207XG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdHRoaXMuYSA9IGE7XG5cdHRoaXMuYiA9IGI7XG5cdHRoaXMuYyA9IGM7XG5cblx0dGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNWZWN0b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnZlcnRleE5vcm1hbHMgPSBBcnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdO1xuXG5cdHRoaXMuY29sb3IgPSAoIGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENvbG9yKCk7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3IgKSA/IGNvbG9yIDogW107XG5cblx0dGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRmFjZTMucHJvdG90eXBlLCB7XG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hID0gc291cmNlLmE7XG5cdFx0dGhpcy5iID0gc291cmNlLmI7XG5cdFx0dGhpcy5jID0gc291cmNlLmM7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBzb3VyY2Uubm9ybWFsICk7XG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWxJbmRleCA9IHNvdXJjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleE5vcm1hbHNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Q29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleENvbG9yc1sgaSBdID0gc291cmNlLnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxudmFyIGdlb21ldHJ5SWQgPSAwOyAvLyBHZW9tZXRyeSB1c2VzIGV2ZW4gbnVtYmVycyBhcyBJZFxuXG5mdW5jdGlvbiBHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IGdlb21ldHJ5SWQgKz0gMiB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdHZW9tZXRyeSc7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLmZhY2VzID0gW107XG5cdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdlb21ldHJ5LFxuXG5cdGlzR2VvbWV0cnk6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGV4LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cdFx0XHRmYWNlLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRvYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdFx0b2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmcm9tQnVmZmVyR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGluZGljZXMgPSBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCA/IGdlb21ldHJ5LmluZGV4LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXHRcdHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBjb2xvcnMgPSBhdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLmNvbG9yLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMyID0gYXR0cmlidXRlcy51djIgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYyLmFycmF5IDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IFtdO1xuXG5cdFx0dmFyIHRlbXBOb3JtYWxzID0gW107XG5cdFx0dmFyIHRlbXBVVnMgPSBbXTtcblx0XHR2YXIgdGVtcFVWczIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDMsIGogKz0gMiApIHtcblxuXHRcdFx0c2NvcGUudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSApICk7XG5cblx0XHRcdGlmICggbm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBOb3JtYWxzLnB1c2goIG5ldyBWZWN0b3IzKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAxIF0sIG5vcm1hbHNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY29sb3JzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuY29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBpIF0sIGNvbG9yc1sgaSArIDEgXSwgY29sb3JzWyBpICsgMiBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMucHVzaCggbmV3IFZlY3RvcjIoIHV2c1sgaiBdLCB1dnNbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMyLnB1c2goIG5ldyBWZWN0b3IyKCB1dnMyWyBqIF0sIHV2czJbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRGYWNlKCBhLCBiLCBjLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gY29sb3JzICE9PSB1bmRlZmluZWQgPyBbIHNjb3BlLmNvbG9yc1sgYSBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYiBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYyBdLmNsb25lKCkgXSA6IFtdO1xuXG5cdFx0XHR2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgdmVydGV4Tm9ybWFscywgdmVydGV4Q29sb3JzLCBtYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdHNjb3BlLmZhY2VzLnB1c2goIGZhY2UgKTtcblxuXHRcdFx0aWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAwIF0ucHVzaCggWyB0ZW1wVVZzWyBhIF0uY2xvbmUoKSwgdGVtcFVWc1sgYiBdLmNsb25lKCksIHRlbXBVVnNbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRlbXBVVnMyWyBiIF0uY2xvbmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdHZhciBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaiBdLCBpbmRpY2VzWyBqICsgMSBdLCBpbmRpY2VzWyBqICsgMiBdLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBqLCBqICsgMSwgaiArIDIsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBpIF0sIGluZGljZXNbIGkgKyAxIF0sIGluZGljZXNbIGkgKyAyIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGksIGkgKyAxLCBpICsgMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2VudGVyKCkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggb2Zmc2V0ICkubmVnYXRlKCk7XG5cblx0XHRcdHRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXHRcdHZhciByYWRpdXMgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztcblxuXHRcdHZhciBzID0gcmFkaXVzID09PSAwID8gMSA6IDEuMCAvIHJhZGl1cztcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdG1hdHJpeC5zZXQoXG5cdFx0XHRzLCAwLCAwLCAtIHMgKiBjZW50ZXIueCxcblx0XHRcdDAsIHMsIDAsIC0gcyAqIGNlbnRlci55LFxuXHRcdFx0MCwgMCwgcywgLSBzICogY2VudGVyLnosXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHR2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdHZhciB2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdGNiLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmYWNlLm5vcm1hbC5jb3B5KCBjYiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgPT09IHVuZGVmaW5lZCApIGFyZWFXZWlnaHRlZCA9IHRydWU7XG5cblx0XHR2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNlcztcblxuXHRcdHZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCApO1xuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHMgd2VpZ2h0ZWQgYnkgdHJpYW5nbGUgYXJlYXNcblx0XHRcdC8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG1cblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHR2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHR2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggdmVydGljZXNbIGZhY2UuYSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGYsIGZsLCBmYWNlO1xuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGksIGlsLCBmLCBmbCwgZmFjZTtcblxuXHRcdC8vIHNhdmUgb3JpZ2luYWwgbm9ybWFsc1xuXHRcdC8vIC0gY3JlYXRlIHRlbXAgdmFyaWFibGVzIG9uIGZpcnN0IGFjY2Vzc1xuXHRcdC8vICAgb3RoZXJ3aXNlIGp1c3QgY29weSAoZm9yIGZhc3RlciByZXBlYXRlZCBjYWxscylcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0uY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGhcblxuXHRcdHZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTtcblx0XHR0bXBHZW8uZmFjZXMgPSB0aGlzLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNyZWF0ZSBvbiBmaXJzdCBhY2Nlc3NcblxuXHRcdFx0aWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXSA9IHt9O1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHM7XG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzVmVydGV4ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0geyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9yMygpIH07XG5cblx0XHRcdFx0XHRkc3ROb3JtYWxzRmFjZS5wdXNoKCBmYWNlTm9ybWFsICk7XG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc1ZlcnRleC5wdXNoKCB2ZXJ0ZXhOb3JtYWxzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdO1xuXG5cdFx0XHQvLyBzZXQgdmVydGljZXMgdG8gbW9ycGggdGFyZ2V0XG5cblx0XHRcdHRtcEdlby52ZXJ0aWNlcyA9IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdC8vIGNvbXB1dGUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR0bXBHZW8uY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHR0bXBHZW8uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdFx0Ly8gc3RvcmUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1hbHNbIGYgXTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IG1vcnBoTm9ybWFscy52ZXJ0ZXhOb3JtYWxzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5jLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgb3JpZ2luYWwgbm9ybWFsc1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwgPSBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsO1xuXHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWxNYXRyaXgsXG5cdFx0XHR2ZXJ0ZXhPZmZzZXQgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdHZlcnRpY2VzMSA9IHRoaXMudmVydGljZXMsXG5cdFx0XHR2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcyxcblx0XHRcdGZhY2VzMSA9IHRoaXMuZmFjZXMsXG5cdFx0XHRmYWNlczIgPSBnZW9tZXRyeS5mYWNlcyxcblx0XHRcdHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdHV2czIgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF0sXG5cdFx0XHRjb2xvcnMxID0gdGhpcy5jb2xvcnMsXG5cdFx0XHRjb2xvcnMyID0gZ2VvbWV0cnkuY29sb3JzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbEluZGV4T2Zmc2V0ID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbEluZGV4T2Zmc2V0ID0gMDtcblxuXHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXMyWyBpIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb3B5ID0gdmVydGV4LmNsb25lKCk7XG5cblx0XHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB2ZXJ0ZXhDb3B5LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZlcnRpY2VzMS5wdXNoKCB2ZXJ0ZXhDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb2xvcnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb2xvcnMxLnB1c2goIGNvbG9yczJbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzMlsgaSBdLCBmYWNlQ29weSwgbm9ybWFsLCBjb2xvcixcblx0XHRcdFx0ZmFjZVZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHMsXG5cdFx0XHRcdGZhY2VWZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0ZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2UuYSArIHZlcnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhPZmZzZXQgKTtcblx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRub3JtYWwgPSBmYWNlVmVydGV4Tm9ybWFsc1sgaiBdLmNsb25lKCk7XG5cblx0XHRcdFx0aWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmYWNlQ29weS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZhY2VDb3B5LmNvbG9yLmNvcHkoIGZhY2UuY29sb3IgKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhDb2xvcnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0Y29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07XG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleENvbG9ycy5wdXNoKCBjb2xvci5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkubWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleCArIG1hdGVyaWFsSW5kZXhPZmZzZXQ7XG5cblx0XHRcdGZhY2VzMS5wdXNoKCBmYWNlQ29weSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB1dnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdXYgPSB1dnMyWyBpIF0sIHV2Q29weSA9IFtdO1xuXG5cdFx0XHRpZiAoIHV2ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHV2Lmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHV2Q29weS5wdXNoKCB1dlsgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnMxLnB1c2goIHV2Q29weSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bWVyZ2VNZXNoOiBmdW5jdGlvbiAoIG1lc2ggKSB7XG5cblx0XHRpZiAoICEgKCBtZXNoICYmIG1lc2guaXNNZXNoICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4nLCBtZXNoICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG1lc2gubWF0cml4QXV0b1VwZGF0ZSApIG1lc2gudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLm1lcmdlKCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApO1xuXG5cdH0sXG5cblx0Lypcblx0ICogQ2hlY2tzIGZvciBkdXBsaWNhdGUgdmVydGljZXMgd2l0aCBoYXNobWFwLlxuXHQgKiBEdXBsaWNhdGVkIHZlcnRpY2VzIGFyZSByZW1vdmVkXG5cdCAqIGFuZCBmYWNlcycgdmVydGljZXMgYXJlIHVwZGF0ZWQuXG5cdCAqL1xuXG5cdG1lcmdlVmVydGljZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlc01hcCA9IHt9OyAvLyBIYXNobWFwIGZvciBsb29raW5nIHVwIHZlcnRpY2VzIGJ5IHBvc2l0aW9uIGNvb3JkaW5hdGVzIChhbmQgbWFraW5nIHN1cmUgdGhleSBhcmUgdW5pcXVlKVxuXHRcdHZhciB1bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdO1xuXG5cdFx0dmFyIHYsIGtleTtcblx0XHR2YXIgcHJlY2lzaW9uUG9pbnRzID0gNDsgLy8gbnVtYmVyIG9mIGRlY2ltYWwgcG9pbnRzLCBlLmcuIDQgZm9yIGVwc2lsb24gb2YgMC4wMDAxXG5cdFx0dmFyIHByZWNpc2lvbiA9IE1hdGgucG93KCAxMCwgcHJlY2lzaW9uUG9pbnRzICk7XG5cdFx0dmFyIGksIGlsLCBmYWNlO1xuXHRcdHZhciBpbmRpY2VzLCBqLCBqbDtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHYgPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHRrZXkgPSBNYXRoLnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggdmVydGljZXNNYXBbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmVydGljZXNNYXBbIGtleSBdID0gaTtcblx0XHRcdFx0dW5pcXVlLnB1c2goIHRoaXMudmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSB1bmlxdWUubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdEdXBsaWNhdGUgdmVydGV4IGZvdW5kLiAnLCBpLCAnIGNvdWxkIGJlIHVzaW5nICcsIHZlcnRpY2VzTWFwW2tleV0pO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSBjaGFuZ2VzWyB2ZXJ0aWNlc01hcFsga2V5IF0gXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHQvLyBpZiBmYWNlcyBhcmUgY29tcGxldGVseSBkZWdlbmVyYXRlIGFmdGVyIG1lcmdpbmcgdmVydGljZXMsIHdlXG5cdFx0Ly8gaGF2ZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZSBnZW9tZXRyeS5cblx0XHR2YXIgZmFjZUluZGljZXNUb1JlbW92ZSA9IFtdO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0ZmFjZS5hID0gY2hhbmdlc1sgZmFjZS5hIF07XG5cdFx0XHRmYWNlLmIgPSBjaGFuZ2VzWyBmYWNlLmIgXTtcblx0XHRcdGZhY2UuYyA9IGNoYW5nZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRpbmRpY2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07XG5cblx0XHRcdC8vIGlmIGFueSBkdXBsaWNhdGUgdmVydGljZXMgYXJlIGZvdW5kIGluIGEgRmFjZTNcblx0XHRcdC8vIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmYWNlIGFzIG5vdGhpbmcgY2FuIGJlIHNhdmVkXG5cdFx0XHRmb3IgKCB2YXIgbiA9IDA7IG4gPCAzOyBuICsrICkge1xuXG5cdFx0XHRcdGlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAoIG4gKyAxICkgJSAzIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlSW5kaWNlc1RvUmVtb3ZlLnB1c2goIGkgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIGkgPSBmYWNlSW5kaWNlc1RvUmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtLSApIHtcblxuXHRcdFx0dmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0dGhpcy5mYWNlcy5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHRmb3IgKCBqID0gMCwgamwgPSB0aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBqIF0uc3BsaWNlKCBpZHgsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHVuaXF1ZSBzZXQgb2YgdmVydGljZXNcblxuXHRcdHZhciBkaWZmID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSB1bmlxdWUubGVuZ3RoO1xuXHRcdHRoaXMudmVydGljZXMgPSB1bmlxdWU7XG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGZhY2VzID0gdGhpcy5mYWNlcztcblx0XHR2YXIgbGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0Ly8gdGFnIGZhY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGZhY2VzWyBpIF0uX2lkID0gaTtcblxuXHRcdH1cblxuXHRcdC8vIHNvcnQgZmFjZXNcblxuXHRcdGZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkge1xuXG5cdFx0XHRyZXR1cm4gYS5tYXRlcmlhbEluZGV4IC0gYi5tYXRlcmlhbEluZGV4O1xuXG5cdFx0fVxuXG5cdFx0ZmFjZXMuc29ydCggbWF0ZXJpYWxJbmRleFNvcnQgKTtcblxuXHRcdC8vIHNvcnQgdXZzXG5cblx0XHR2YXIgdXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdO1xuXHRcdHZhciB1dnMyID0gdGhpcy5mYWNlVmVydGV4VXZzWyAxIF07XG5cblx0XHR2YXIgbmV3VXZzMSwgbmV3VXZzMjtcblxuXHRcdGlmICggdXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdO1xuXHRcdGlmICggdXZzMiAmJiB1dnMyLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaWQgPSBmYWNlc1sgaSBdLl9pZDtcblxuXHRcdFx0aWYgKCBuZXdVdnMxICkgbmV3VXZzMS5wdXNoKCB1dnMxWyBpZCBdICk7XG5cdFx0XHRpZiAoIG5ld1V2czIgKSBuZXdVdnMyLnB1c2goIHV2czJbIGlkIF0gKTtcblxuXHRcdH1cblxuXHRcdGlmICggbmV3VXZzMSApIHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdID0gbmV3VXZzMTtcblx0XHRpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnR2VvbWV0cnknLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdHZW9tZXRyeS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb25cblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHRcdHZhciBmYWNlcyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIG5vcm1hbHNIYXNoID0ge307XG5cdFx0dmFyIGNvbG9ycyA9IFtdO1xuXHRcdHZhciBjb2xvcnNIYXNoID0ge307XG5cdFx0dmFyIHV2cyA9IFtdO1xuXHRcdHZhciB1dnNIYXNoID0ge307XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBoYXNNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHR2YXIgaGFzRmFjZVV2ID0gZmFsc2U7IC8vIGRlcHJlY2F0ZWRcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4VXYgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR2YXIgaGFzRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmxlbmd0aCgpID4gMDtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Tm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA+IDA7XG5cdFx0XHR2YXIgaGFzRmFjZUNvbG9yID0gZmFjZS5jb2xvci5yICE9PSAxIHx8IGZhY2UuY29sb3IuZyAhPT0gMSB8fCBmYWNlLmNvbG9yLmIgIT09IDE7XG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleENvbG9yID0gZmFjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoID4gMDtcblxuXHRcdFx0dmFyIGZhY2VUeXBlID0gMDtcblxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZFxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAyLCBoYXNGYWNlVXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNSwgaGFzRmFjZVZlcnRleE5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA2LCBoYXNGYWNlQ29sb3IgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFzRmFjZVZlcnRleENvbG9yICk7XG5cblx0XHRcdGZhY2VzLnB1c2goIGZhY2VUeXBlICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Tm9ybWFsSW5kZXgoIGZhY2Uubm9ybWFsICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goIGdldENvbG9ySW5kZXgoIGZhY2UuY29sb3IgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkge1xuXG5cdFx0XHRyZXR1cm4gZW5hYmxlZCA/IHZhbHVlIHwgKCAxIDw8IHBvc2l0aW9uICkgOiB2YWx1ZSAmICggfiAoIDEgPDwgcG9zaXRpb24gKSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Tm9ybWFsSW5kZXgoIG5vcm1hbCApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBub3JtYWwueC50b1N0cmluZygpICsgbm9ybWFsLnkudG9TdHJpbmcoKSArIG5vcm1hbC56LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdG5vcm1hbHNIYXNoWyBoYXNoIF0gPSBub3JtYWxzLmxlbmd0aCAvIDM7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRDb2xvckluZGV4KCBjb2xvciApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggY29sb3JzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb2xvcnNIYXNoWyBoYXNoIF0gPSBjb2xvcnMubGVuZ3RoO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLmdldEhleCgpICk7XG5cblx0XHRcdHJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRVdkluZGV4KCB1diApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSB1di54LnRvU3RyaW5nKCkgKyB1di55LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggdXZzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnNIYXNoWyBoYXNoIF0gPSB1dnMubGVuZ3RoIC8gMjtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdHJldHVybiB1dnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRkYXRhLmRhdGEgPSB7fTtcblxuXHRcdGRhdGEuZGF0YS52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xuXHRcdGRhdGEuZGF0YS5ub3JtYWxzID0gbm9ybWFscztcblx0XHRpZiAoIGNvbG9ycy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLmNvbG9ycyA9IGNvbG9ycztcblx0XHRpZiAoIHV2cy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLnV2cyA9IFsgdXZzIF07IC8vIHRlbXBvcmFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0XHRkYXRhLmRhdGEuZmFjZXMgPSBmYWNlcztcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHQgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHQgdmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0IGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTtcblx0XHQgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApO1xuXHRcdCByZXR1cm4gZ2VvbWV0cnk7XG5cblx0XHQgfVxuXG5cdFx0IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblx0XHQgKi9cblxuXHRcdHJldHVybiBuZXcgR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBpLCBpbCwgaiwgamwsIGssIGtsO1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblx0XHR0aGlzLmNvbG9ycyA9IFtdO1xuXHRcdHRoaXMuZmFjZXMgPSBbXTtcblx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gW107XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblx0XHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdFx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXHRcdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gc291cmNlLnZlcnRpY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdHZhciBjb2xvcnMgPSBzb3VyY2UuY29sb3JzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gY29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCBjb2xvcnNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0dmFyIGZhY2VzID0gc291cmNlLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHZlcnRleCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHNvdXJjZS5mYWNlVmVydGV4VXZzWyBpIF07XG5cblx0XHRcdGlmICggdGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHV2cyA9IGZhY2VWZXJ0ZXhVdnNbIGogXSwgdXZzQ29weSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGsgPSAwLCBrbCA9IHV2cy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdHZhciB1diA9IHV2c1sgayBdO1xuXG5cdFx0XHRcdFx0dXZzQ29weS5wdXNoKCB1di5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdLnB1c2goIHV2c0NvcHkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IHt9O1xuXHRcdFx0bW9ycGhUYXJnZXQubmFtZSA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cblx0XHRcdC8vIHZlcnRpY2VzXG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhUYXJnZXQudmVydGljZXMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXQubm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBub3JtYWxzXG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFsID0ge307XG5cblx0XHRcdC8vIHZlcnRleCBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTtcblx0XHRcdFx0XHR2YXIgZGVzdFZlcnRleE5vcm1hbCA9IHt9O1xuXG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5hID0gc3JjVmVydGV4Tm9ybWFsLmEuY2xvbmUoKTtcblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmIgPSBzcmNWZXJ0ZXhOb3JtYWwuYi5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNyY1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzLnB1c2goIGRlc3RWZXJ0ZXhOb3JtYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmFjZSBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIHdlaWdodHNcblxuXHRcdHZhciBza2luV2VpZ2h0cyA9IHNvdXJjZS5za2luV2VpZ2h0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbiBpbmRpY2VzXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBzb3VyY2Uuc2tpbkluZGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBza2luSW5kaWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGxpbmUgZGlzdGFuY2VzXG5cblx0XHR2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbGluZURpc3RhbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lRGlzdGFuY2VzLnB1c2goIGxpbmVEaXN0YW5jZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgZmxhZ3NcblxuXHRcdHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHNvdXJjZS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy51dnNOZWVkVXBkYXRlID0gc291cmNlLnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBzb3VyY2UuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gc291cmNlLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHR9XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAwO1xuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLml0ZW1TaXplIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xuXG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuaXRlbVNpemU7XG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaXRlbVNpemU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIGFycmF5ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlDb2xvcnNBcnJheTogZnVuY3Rpb24gKCBjb2xvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjb2xvciA9IGNvbG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdGNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3Iucjtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmc7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5iO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yMnNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yM3NBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3I0c0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yNHNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3Iuejtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci53O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmZ1bmN0aW9uIEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDE2QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQ2NEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0R2VvbWV0cnkoKSB7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLm5vcm1hbHMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy51dnMgPSBbXTtcblx0dGhpcy51dnMyID0gW107XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdC8vIHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGlyZWN0R2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZUdyb3VwczogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBncm91cDtcblx0XHR2YXIgZ3JvdXBzID0gW107XG5cdFx0dmFyIG1hdGVyaWFsSW5kZXggPSB1bmRlZmluZWQ7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHQvLyBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRncm91cCA9IHtcblx0XHRcdFx0XHRzdGFydDogaSAqIDMsXG5cdFx0XHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzO1xuXG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IGZhY2VWZXJ0ZXhVdnNbIDAgXSAmJiBmYWNlVmVydGV4VXZzWyAwIF0ubGVuZ3RoID4gMDtcblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2MiA9IGZhY2VWZXJ0ZXhVdnNbIDEgXSAmJiBmYWNlVmVydGV4VXZzWyAxIF0ubGVuZ3RoID4gMDtcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHR2YXIgbW9ycGhUYXJnZXRzTGVuZ3RoID0gbW9ycGhUYXJnZXRzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbiA9IG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoTm9ybWFscztcblx0XHR2YXIgbW9ycGhOb3JtYWxzTGVuZ3RoID0gbW9ycGhOb3JtYWxzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHRpZiAoIG1vcnBoTm9ybWFsc0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbCA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHR9XG5cblx0XHQvLyBza2luc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnkuc2tpbkluZGljZXM7XG5cdFx0dmFyIHNraW5XZWlnaHRzID0gZ2VvbWV0cnkuc2tpbldlaWdodHM7XG5cblx0XHR2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblx0XHR2YXIgaGFzU2tpbldlaWdodHMgPSBza2luV2VpZ2h0cy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIgXSwgdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCB2ZXJ0ZXhOb3JtYWxzWyAwIF0sIHZlcnRleE5vcm1hbHNbIDEgXSwgdmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCBub3JtYWwsIG5vcm1hbCwgbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENvbG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9IGZhY2UuY29sb3I7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3IsIGNvbG9yLCBjb2xvciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYyID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAxIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbW9ycGhzXG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGogXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaiBdLnB1c2goIG1vcnBoVGFyZ2V0WyBmYWNlLmEgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYiBdLCBtb3JwaFRhcmdldFsgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdO1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbFsgaiBdLnB1c2goIG1vcnBoTm9ybWFsLmEsIG1vcnBoTm9ybWFsLmIsIG1vcnBoTm9ybWFsLmMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBza2luc1xuXG5cdFx0XHRpZiAoIGhhc1NraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbkluZGljZXMucHVzaCggc2tpbkluZGljZXNbIGZhY2UuYSBdLCBza2luSW5kaWNlc1sgZmFjZS5iIF0sIHNraW5JbmRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0dGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgZmFjZS5hIF0sIHNraW5XZWlnaHRzWyBmYWNlLmIgXSwgc2tpbldlaWdodHNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUdyb3VwcyggZ2VvbWV0cnkgKTtcblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkge1xuXG5cdGlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7XG5cblx0dmFyIG1heCA9IGFycmF5WyAwIF07XG5cblx0Zm9yICggdmFyIGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHtcblxuXHRcdGlmICggYXJyYXlbIGkgXSA+IG1heCApIG1heCA9IGFycmF5WyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBtYXg7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgYnVmZmVyR2VvbWV0cnlJZCA9IDE7IC8vIEJ1ZmZlckdlb21ldHJ5IHVzZXMgb2RkIG51bWJlcnMgYXMgSWRcblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBidWZmZXJHZW9tZXRyeUlkICs9IDIgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMuaW5kZXggPSBudWxsO1xuXHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdHRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07XG5cbn1cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Z2V0SW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xuXG5cdH0sXG5cblx0c2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSwgYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZSApICYmICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbmFtZSA9PT0gJ2luZGV4JyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7XG5cdFx0XHR0aGlzLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcblxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0Y291bnQ6IGNvdW50LFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDBcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTtcblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjZW50ZXIoKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBvZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0aW5nJywgb2JqZWN0LCB0aGlzICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTtcblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucy5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0ZGlyZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Z2VvbWV0cnkgPSBkaXJlY3Q7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5jb2xvcjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVHcm91cHMoIG9iamVjdC5nZW9tZXRyeSApO1xuXHRcdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSApO1xuXG5cdH0sXG5cblx0ZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYyJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzMiwgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMyICkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggbW9ycGhUYXJnZXQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luSW5kaWNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luSW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xuXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0XHRib3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0XHQvLyBob3BpbmcgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0XHQvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlXG5cblx0XHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlY3Rvci54ID0gcG9zaXRpb24uZ2V0WCggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci55ID0gcG9zaXRpb24uZ2V0WSggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci56ID0gcG9zaXRpb24uZ2V0WiggaSApO1xuXHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheVsgaSBdID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5hZGRHcm91cCggMCwgaW5kaWNlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaiBdO1xuXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBpbCA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkIgPSBpbmRpY2VzWyBpICsgMSBdICogMztcblx0XHRcdFx0XHRcdHZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7XG5cblx0XHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCB2QSApO1xuXHRcdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7XG5cdFx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkMgKTtcblxuXHRcdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5jb25uZWN0ZWQgdHJpYW5nbGUgc291cClcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApO1xuXHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApO1xuXHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgNiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAxIF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAyIF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDMgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDUgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNiBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNyBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgOCBdID0gY2IuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gJ1xuXHRcdFx0XHQrICdVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuJ1xuXHRcdFx0KTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MiA9IGF0dHJpYnV0ZTIuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gYXR0cmlidXRlU2l6ZSAqIG9mZnNldDsgaSA8IGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGg7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBub3JtYWxpemVOb3JtYWxzKCkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjdG9yLnggPSBub3JtYWxzLmdldFgoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnkgPSBub3JtYWxzLmdldFkoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnogPSBub3JtYWxzLmdldFooIGkgKTtcblxuXHRcdFx0XHR2ZWN0b3Iubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0bm9ybWFscy5zZXRYWVooIGksIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dG9Ob25JbmRleGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdFx0dmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHR2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdHZhciBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5Mi5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnkyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogYXJyYXlcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGRhdGEuZGF0YS5hdHRyaWJ1dGVzWyBrZXkgXSA9IHtcblx0XHRcdFx0aXRlbVNpemU6IGF0dHJpYnV0ZS5pdGVtU2l6ZSxcblx0XHRcdFx0dHlwZTogYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcblx0XHRcdFx0bm9ybWFsaXplZDogYXR0cmlidXRlLm5vcm1hbGl6ZWRcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIGdyb3VwcyApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmJvdW5kaW5nU3BoZXJlID0ge1xuXHRcdFx0XHRjZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksXG5cdFx0XHRcdHJhZGl1czogYm91bmRpbmdTcGhlcmUucmFkaXVzXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIG5hbWUsIGksIGw7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy5pbmRleCA9IG51bGw7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyBpbmRleFxuXG5cdFx0dmFyIGluZGV4ID0gc291cmNlLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXR0cmlidXRlc1xuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IHNvdXJjZS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XG5cblx0XHR9XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZHJhdyByYW5nZVxuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQm94R2VvbWV0cnlcblxuZnVuY3Rpb24gQm94R2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQm94R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hHZW9tZXRyeTtcblxuLy8gQm94QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXHRkZXB0aCA9IGRlcHRoIHx8IDE7XG5cblx0Ly8gc2VnbWVudHNcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXHRkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyApIHx8IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5XG5cblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIC0gd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIDEsIHdpZHRoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAyICk7IC8vIHB5XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNCApOyAvLyBwelxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAtIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgLSBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUgKTsgLy8gbnpcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHZhciBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHRcdHZhciBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHR2YXIgd2lkdGhIYWxmID0gd2lkdGggLyAyO1xuXHRcdHZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcblx0XHR2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0XHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0dmFyIHZlcnRleENvdW50ZXIgPSAwO1xuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciBpeCwgaXk7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0XHR2YXIgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IHggKiB1ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXJcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlclxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdHZlcnRleENvdW50ZXIgKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaW5kaWNlc1xuXG5cdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2Vcblx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdC8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMgcGVyIHNlZ21lbnRcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0dmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgYyA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XG5cblx0fVxuXG59XG5cbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUGxhbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVHZW9tZXRyeTtcblxuLy8gUGxhbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyO1xuXHR2YXIgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyO1xuXG5cdHZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHR2YXIgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHR2YXIgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdHZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0dmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGQgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBtYXRlcmlhbElkID0gMDtcblxuZnVuY3Rpb24gTWF0ZXJpYWwoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ01hdGVyaWFsJztcblxuXHR0aGlzLmZvZyA9IHRydWU7XG5cdHRoaXMubGlnaHRzID0gdHJ1ZTtcblxuXHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcblx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xuXHR0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUuVmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzXG5cblx0dGhpcy5vcGFjaXR5ID0gMTtcblx0dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xuXG5cdHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cblx0dGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDtcblx0dGhpcy5kZXB0aFRlc3QgPSB0cnVlO1xuXHR0aGlzLmRlcHRoV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBudWxsO1xuXHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTtcblx0dGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2hhZG93U2lkZSA9IG51bGw7XG5cblx0dGhpcy5jb2xvcldyaXRlID0gdHJ1ZTtcblxuXHR0aGlzLnByZWNpc2lvbiA9IG51bGw7IC8vIG92ZXJyaWRlIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgcHJlY2lzaW9uIGZvciB0aGlzIG1hdGVyaWFsXG5cblx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7XG5cdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7XG5cdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gMDtcblxuXHR0aGlzLmRpdGhlcmluZyA9IGZhbHNlO1xuXG5cdHRoaXMuYWxwaGFUZXN0ID0gMDtcblx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTtcblxuXHR0aGlzLm92ZXJkcmF3ID0gMDsgLy8gT3ZlcmRyYXduIHBpeGVscyAodHlwaWNhbGx5IGJldHdlZW4gMCBhbmQgMSkgZm9yIGZpeGluZyBhbnRpYWxpYXNpbmcgZ2FwcyBpbiBDYW52YXNSZW5kZXJlclxuXG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNYXRlcmlhbCxcblxuXHRpc01hdGVyaWFsOiB0cnVlLFxuXG5cdG9uQmVmb3JlQ29tcGlsZTogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0VmFsdWVzOiBmdW5jdGlvbiAoIHZhbHVlcyApIHtcblxuXHRcdGlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIHZhbHVlcyApIHtcblxuXHRcdFx0dmFyIG5ld1ZhbHVlID0gdmFsdWVzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRlcmlhbDogJ1wiICsga2V5ICsgXCInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgaWYgc2hhZGluZyBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yXG5cdFx0XHRpZiAoIGtleSA9PT0gJ3NoYWRpbmcnICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCBuZXdWYWx1ZSA9PT0gRmxhdFNoYWRpbmcgKSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGN1cnJlbnRWYWx1ZSA9IHRoaXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5cIiArIHRoaXMudHlwZSArIFwiOiAnXCIgKyBrZXkgKyBcIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNDb2xvciApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuc2V0KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuY29weSggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnb3ZlcmRyYXcnICkge1xuXG5cdFx0XHRcdC8vIGVuc3VyZSBvdmVyZHJhdyBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIGxlZ2FjeSBib29sZWFuIHR5cGVcblx0XHRcdFx0dGhpc1sga2V5IF0gPSBOdW1iZXIoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpc1sga2V5IF0gPSBuZXdWYWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgaXNSb290ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdNYXRlcmlhbCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSAxICkgZGF0YS5lbWlzc2l2ZUludGVuc2l0eSA9IHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXIuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcztcblx0XHRpZiAoIHRoaXMuY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdCA9IHRoaXMuY2xlYXJDb2F0O1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgKSBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0aGlzLnZlcnRleENvbG9ycztcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cblx0XHQvLyByb3RhdGlvbiAoU3ByaXRlTWF0ZXJpYWwpXG5cdFx0aWYgKCB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5za2lubmluZyA9PT0gdHJ1ZSApIGRhdGEuc2tpbm5pbmcgPSB0cnVlO1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgZGF0YS52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cdFx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXG5cdFx0dGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZztcblx0XHR0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTtcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xuXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xuXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xuXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdHRoaXMub3ZlcmRyYXcgPSBzb3VyY2Uub3ZlcmRyYXc7XG5cblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0dmFyIHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcyxcblx0XHRcdGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIG4gPSBzcmNQbGFuZXMubGVuZ3RoO1xuXHRcdFx0ZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7XG5cblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIGRlcHRoVGVzdDogPGJvb2w+LFxuICogIGRlcHRoV3JpdGU6IDxib29sPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaEJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZW1pc3NpdmVcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaEJhc2ljTWF0ZXJpYWw7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGRlZmluZXM6IHsgXCJsYWJlbFwiIDogXCJ2YWx1ZVwiIH0sXG4gKiAgdW5pZm9ybXM6IHsgXCJwYXJhbWV0ZXIxXCI6IHsgdmFsdWU6IDEuMCB9LCBcInBhcmFtZXRlcjJcIjogeyB2YWx1ZTI6IDIgfSB9LFxuICpcbiAqICBmcmFnbWVudFNoYWRlcjogPHN0cmluZz4sXG4gKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5nPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBsaWdodHM6IDxib29sPixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZGVyTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHt9O1xuXHR0aGlzLnVuaWZvcm1zID0ge307XG5cblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcXG59Jztcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XFxufSc7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZvZ1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGxpZ2h0c1xuXHR0aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lc1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBza2lubmluZyBhdHRyaWJ1dGUgc3RyZWFtc1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIHRhcmdldHNcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCBub3JtYWxzXG5cblx0dGhpcy5leHRlbnNpb25zID0ge1xuXHRcdGRlcml2YXRpdmVzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkZXJpdmF0aXZlc1xuXHRcdGZyYWdEZXB0aDogZmFsc2UsIC8vIHNldCB0byB1c2UgZnJhZ21lbnQgZGVwdGggdmFsdWVzXG5cdFx0ZHJhd0J1ZmZlcnM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVyc1xuXHRcdHNoYWRlclRleHR1cmVMT0Q6IGZhbHNlIC8vIHNldCB0byB1c2Ugc2hhZGVyIHRleHR1cmUgTE9EXG5cdH07XG5cblx0Ly8gV2hlbiByZW5kZXJlZCBnZW9tZXRyeSBkb2Vzbid0IGluY2x1ZGUgdGhlc2UgYXR0cmlidXRlcyBidXQgdGhlIG1hdGVyaWFsIGRvZXMsXG5cdC8vIHVzZSB0aGVzZSBkZWZhdWx0IHZhbHVlcyBpbiBXZWJHTC4gVGhpcyBhdm9pZHMgZXJyb3JzIHdoZW4gYnVmZmVyIGRhdGEgaXMgbWlzc2luZy5cblx0dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuXHRcdCdjb2xvcic6IFsgMSwgMSwgMSBdLFxuXHRcdCd1dic6IFsgMCwgMCBdLFxuXHRcdCd1djInOiBbIDAsIDAgXVxuXHR9O1xuXG5cdHRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZSA9IHVuZGVmaW5lZDtcblx0dGhpcy51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggcGFyYW1ldGVycy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxufVxuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRlck1hdGVyaWFsO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHNvdXJjZS5mcmFnbWVudFNoYWRlcjtcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBzb3VyY2UudmVydGV4U2hhZGVyO1xuXG5cdHRoaXMudW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzb3VyY2UudW5pZm9ybXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLmRlZmluZXMgKTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XG5cdHRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSBzb3VyY2UuZXh0ZW5zaW9ucztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHR2YXIgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdGRhdGEudW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zO1xuXHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xuXHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHR0aGlzLm9yaWdpbiA9ICggb3JpZ2luICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZGlyZWN0aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCApID8gZGlyZWN0aW9uIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHYgKS5zdWIoIHRoaXMub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlY2FzdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWNhc3QoIHQgKSB7XG5cblx0XHRcdHRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIHYxICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XG5cblx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB0YXJnZXQuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5vcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHYxLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0XHRyZXR1cm4gdjEuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRkaXN0YW5jZVNxVG9TZWdtZW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2VnQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2VnRGlyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvU2VnbWVudCggdjAsIHYxLCBvcHRpb25hbFBvaW50T25SYXksIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0XHQvLyBJdCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVudFxuXHRcdFx0Ly8gZGVmaW5lZCBieSB2MCBhbmQgdjFcblx0XHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXlcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHNlZ21lbnRcblxuXHRcdFx0c2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRcdGRpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR2YXIgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcblx0XHRcdHZhciBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYjAgPSBkaWZmLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBiMSA9IC0gZGlmZi5kb3QoIHNlZ0RpciApO1xuXHRcdFx0dmFyIGMgPSBkaWZmLmxlbmd0aFNxKCk7XG5cdFx0XHR2YXIgZGV0ID0gTWF0aC5hYnMoIDEgLSBhMDEgKiBhMDEgKTtcblx0XHRcdHZhciBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdFx0aWYgKCBkZXQgPiAwICkge1xuXG5cdFx0XHRcdC8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5vdCBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRcdHMxID0gYTAxICogYjAgLSBiMTtcblx0XHRcdFx0ZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0O1xuXG5cdFx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRcdGlmICggczEgPj0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHRcdC8vIE1pbmltdW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJheSBhbmQgc2VnbWVudC5cblxuXHRcdFx0XHRcdFx0XHR2YXIgaW52RGV0ID0gMSAvIGRldDtcblx0XHRcdFx0XHRcdFx0czAgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBzMSArIDIgKiBiMCApICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcblxuXHRcdFx0XHRcdFx0XHRzMSA9IHNlZ0V4dGVudDtcblx0XHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNVxuXG5cdFx0XHRcdFx0XHRzMSA9IC0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDRcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDNcblxuXHRcdFx0XHRcdFx0czAgPSAwO1xuXHRcdFx0XHRcdFx0czEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAyXG5cblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMSA9ICggYTAxID4gMCApID8gLSBzZWdFeHRlbnQgOiBzZWdFeHRlbnQ7XG5cdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHtcblxuXHRcdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggc2VnRGlyICkubXVsdGlwbHlTY2FsYXIoIHMxICkuYWRkKCBzZWdDZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3FyRGlzdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdFNwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RTcGhlcmUoIHNwaGVyZSwgdGFyZ2V0ICkge1xuXG5cdFx0XHR2MS5zdWJWZWN0b3JzKCBzcGhlcmUuY2VudGVyLCB0aGlzLm9yaWdpbiApO1xuXHRcdFx0dmFyIHRjYSA9IHYxLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBkMiA9IHYxLmRvdCggdjEgKSAtIHRjYSAqIHRjYTtcblx0XHRcdHZhciByYWRpdXMyID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRcdGlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHZhciB0aGMgPSBNYXRoLnNxcnQoIHJhZGl1czIgLSBkMiApO1xuXG5cdFx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxuXHRcdFx0dmFyIHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0XHQvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDEgPSB0Y2EgKyB0aGM7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIGJvdGggdDAgYW5kIHQxIGFyZSBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCByZXR1cm4gbnVsbFxuXHRcdFx0aWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIHQwIGlzIGJlaGluZCB0aGUgcmF5OlxuXHRcdFx0Ly8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLFxuXHRcdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxuXHRcdFx0aWYgKCB0MCA8IDAgKSByZXR1cm4gdGhpcy5hdCggdDEsIHRhcmdldCApO1xuXG5cdFx0XHQvLyBlbHNlIHQwIGlzIGluIGZyb250IG9mIHRoZSByYXksIHNvIHJldHVybiB0aGUgZmlyc3QgY29sbGlzaW9uIHBvaW50IHNjYWxlZCBieSB0MFxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCB0YXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gc3BoZXJlLnJhZGl1cztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdC8vIFJldHVybiBpZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lXG5cblx0XHRyZXR1cm4gdCA+PSAwID8gdCA6IG51bGw7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTtcblxuXHRcdGlmICggdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0XG5cblx0XHR2YXIgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yICogZGlzdFRvUG9pbnQgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHJheSBvcmlnaW4gaXMgYmVoaW5kIHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50aW5nIGJlaGluZCBpdClcblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdEJveDogZnVuY3Rpb24gKCBib3gsIHRhcmdldCApIHtcblxuXHRcdHZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcblxuXHRcdHZhciBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsXG5cdFx0XHRpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksXG5cdFx0XHRpbnZkaXJ6ID0gMSAvIHRoaXMuZGlyZWN0aW9uLno7XG5cblx0XHR2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47XG5cblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU5cblx0XHQvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOXG5cblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluO1xuXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDtcblxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcblxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XG5cblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXG5cblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgdiApICE9PSBudWxsO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRpbnRlcnNlY3RUcmlhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuXG5cdFx0dmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlZGdlMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RUcmlhbmdsZSggYSwgYiwgYywgYmFja2ZhY2VDdWxsaW5nLCB0YXJnZXQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVJbnRyUmF5M1RyaWFuZ2xlMy5oXG5cblx0XHRcdGVkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdGVkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHQvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRpcmVjdGlvbixcblx0XHRcdC8vIEUxID0ga0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkgYnlcblx0XHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoRTEsUSkpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWduKERvdChELE4pKSpEb3QoUSxOKVxuXHRcdFx0dmFyIERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggbm9ybWFsICk7XG5cdFx0XHR2YXIgc2lnbjtcblxuXHRcdFx0aWYgKCBEZE4gPiAwICkge1xuXG5cdFx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHNpZ24gPSAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBEZE4gPCAwICkge1xuXG5cdFx0XHRcdHNpZ24gPSAtIDE7XG5cdFx0XHRcdERkTiA9IC0gRGROO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcblx0XHRcdHZhciBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMi5jcm9zc1ZlY3RvcnMoIGRpZmYsIGVkZ2UyICkgKTtcblxuXHRcdFx0Ly8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTEuY3Jvc3MoIGRpZmYgKSApO1xuXG5cdFx0XHQvLyBiMiA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZEUxeFEgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGIxK2IyID4gMSwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdFx0dmFyIFFkTiA9IC0gc2lnbiAqIGRpZmYuZG90KCBub3JtYWwgKTtcblxuXHRcdFx0Ly8gdCA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBRZE4gPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgdGFyZ2V0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4NCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0cmV0dXJuIHJheS5vcmlnaW4uZXF1YWxzKCB0aGlzLm9yaWdpbiApICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lMyggc3RhcnQsIGVuZCApIHtcblxuXHR0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZW5kID0gKCBlbmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggc3RhcnQsIGVuZCApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBlbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGRlbHRhOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydFAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzdGFydEVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRzdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcblx0XHRcdHN0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0XHRcdHZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7XG5cdFx0XHR2YXIgc3RhcnRFbmRfc3RhcnRQID0gc3RhcnRFbmQuZG90KCBzdGFydFAgKTtcblxuXHRcdFx0dmFyIHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRcdGlmICggY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdFx0dCA9IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHRyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUcmlhbmdsZSggYSwgYiwgYyApIHtcblxuXHR0aGlzLmEgPSAoIGEgIT09IHVuZGVmaW5lZCApID8gYSA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuYiA9ICggYiAhPT0gdW5kZWZpbmVkICkgPyBiIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLCB7XG5cblx0Z2V0Tm9ybWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0YXJnZXQuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdFx0djAuc3ViVmVjdG9ycyggYSwgYiApO1xuXHRcdFx0dGFyZ2V0LmNyb3NzKCB2MCApO1xuXG5cdFx0XHR2YXIgdGFyZ2V0TGVuZ3RoU3EgPSB0YXJnZXQubGVuZ3RoU3EoKTtcblx0XHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiB0YXJnZXQubXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHRhcmdldExlbmd0aFNxICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Ly8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXNcblx0Ly8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWxcblx0Z2V0QmFyeWNvb3JkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdHYyLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7XG5cblx0XHRcdHZhciBkb3QwMCA9IHYwLmRvdCggdjAgKTtcblx0XHRcdHZhciBkb3QwMSA9IHYwLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QwMiA9IHYwLmRvdCggdjIgKTtcblx0XHRcdHZhciBkb3QxMSA9IHYxLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QxMiA9IHYxLmRvdCggdjIgKTtcblxuXHRcdFx0dmFyIGRlbm9tID0gKCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMSApO1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0QmFyeWNvb3JkKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcblx0XHRcdGlmICggZGVub20gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gYXJiaXRyYXJ5IGxvY2F0aW9uIG91dHNpZGUgb2YgdHJpYW5nbGU/XG5cdFx0XHRcdC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRlYSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWRcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIC0gMiwgLSAxLCAtIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW52RGVub20gPSAxIC8gZGVub207XG5cdFx0XHR2YXIgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAqIGludkRlbm9tO1xuXHRcdFx0dmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5vbTtcblxuXHRcdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29udGFpbnNQb2ludCggcG9pbnQsIGEsIGIsIGMgKSB7XG5cblx0XHRcdFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHYxICk7XG5cblx0XHRcdHJldHVybiAoIHYxLnggPj0gMCApICYmICggdjEueSA+PSAwICkgJiYgKCAoIHYxLnggKyB2MS55ICkgPD0gMSApO1xuXG5cdFx0fTtcblxuXHR9KClcblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcblx0XHR0aGlzLmMuY29weSggYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczogZnVuY3Rpb24gKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XG5cblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7XG5cblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEFyZWEoKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIHRoaXMuYywgdGhpcy5iICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xuXG5cdFx0XHRyZXR1cm4gdjAuY3Jvc3MoIHYxICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRNaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE1pZHBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTtcblxuXHR9LFxuXG5cdGdldE5vcm1hbDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGdldFBsYW5lOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0UGxhbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRnZXRCYXJ5Y29vcmQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuY29udGFpbnNQb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzVHJpYW5nbGUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpO1xuXHRcdHZhciBlZGdlTGlzdCA9IFsgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpLCBuZXcgTGluZTMoKSBdO1xuXHRcdHZhciBwcm9qZWN0ZWRQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuXG5cdFx0XHQvLyBwcm9qZWN0IHRoZSBwb2ludCBvbnRvIHRoZSBwbGFuZSBvZiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0cGxhbmUuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cdFx0XHRwbGFuZS5wcm9qZWN0UG9pbnQoIHBvaW50LCBwcm9qZWN0ZWRQb2ludCApO1xuXG5cdFx0XHQvLyBjaGVjayBpZiB0aGUgcHJvamVjdGlvbiBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0aWYgKCB0aGlzLmNvbnRhaW5zUG9pbnQoIHByb2plY3RlZFBvaW50ICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gaWYgc28sIHRoaXMgaXMgdGhlIGNsb3Nlc3QgcG9pbnRcblxuXHRcdFx0XHR0YXJnZXQuY29weSggcHJvamVjdGVkUG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBpZiBub3QsIHRoZSBwb2ludCBmYWxscyBvdXRzaWRlIHRoZSB0cmlhbmdsZS4gdGhlIHRhcmdldCBpcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUgdHJpYW5nbGUncyBlZGdlcyBvciB2ZXJ0aWNlc1xuXG5cdFx0XHRcdGVkZ2VMaXN0WyAwIF0uc2V0KCB0aGlzLmEsIHRoaXMuYiApO1xuXHRcdFx0XHRlZGdlTGlzdFsgMSBdLnNldCggdGhpcy5iLCB0aGlzLmMgKTtcblx0XHRcdFx0ZWRnZUxpc3RbIDIgXS5zZXQoIHRoaXMuYywgdGhpcy5hICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZWRnZUxpc3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZWRnZUxpc3RbIGkgXS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwcm9qZWN0ZWRQb2ludCwgdHJ1ZSwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSBwcm9qZWN0ZWRQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgbWluRGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0XHRcdHRhcmdldC5jb3B5KCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaCc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG5cdHRoaXMuZHJhd01vZGUgPSBUcmlhbmdsZXNEcmF3TW9kZTtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cbk1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWVzaCxcblxuXHRpc01lc2g6IHRydWUsXG5cblx0c2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmRyYXdNb2RlID0gdmFsdWU7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHNvdXJjZS5kcmF3TW9kZTtcblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgbSwgbWwsIG5hbWU7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cdFx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcblxuXHRcdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcblxuXHRcdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0bmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdFx0bmFtZSA9IG1vcnBoVGFyZ2V0c1sgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR2YXIgdkEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0ZW1wQSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBCID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdGVtcEMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR2YXIgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGludGVyc2VjdGlvblBvaW50V29ybGQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdXZJbnRlcnNlY3Rpb24oIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzICkge1xuXG5cdFx0XHRUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBwMSwgcDIsIHAzLCBiYXJ5Y29vcmQgKTtcblxuXHRcdFx0dXYxLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueCApO1xuXHRcdFx0dXYyLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueSApO1xuXHRcdFx0dXYzLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueiApO1xuXG5cdFx0XHR1djEuYWRkKCB1djIgKS5hZGQoIHV2MyApO1xuXG5cdFx0XHRyZXR1cm4gdXYxLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0O1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xuXG5cdFx0XHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEMsIHBCLCBwQSwgdHJ1ZSwgcG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsIG1hdGVyaWFsLnNpZGUgIT09IERvdWJsZVNpZGUsIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLFxuXHRcdFx0XHRvYmplY3Q6IG9iamVjdFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApIHtcblxuXHRcdFx0dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGEgKTtcblx0XHRcdHZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7XG5cdFx0XHR2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYyApO1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgb2JqZWN0Lm1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgdkEsIHZCLCB2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0aWYgKCB1diApIHtcblxuXHRcdFx0XHRcdHV2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYSApO1xuXHRcdFx0XHRcdHV2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0XHRcdHV2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYyApO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCB2QSwgdkIsIHZDLCB1dkEsIHV2QiwgdXZDICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjICk7XG5cdFx0XHRcdFRyaWFuZ2xlLmdldE5vcm1hbCggdkEsIHZCLCB2QywgZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpbnRlcnNlY3Rpb247XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHQvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZ1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb247XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgYSwgYiwgYztcblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7XG5cdFx0XHRcdHZhciBpLCBsO1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHQvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBpbmRleC5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRcdGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRcdFx0YyA9IGluZGV4LmdldFgoIGkgKyAyICk7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRpY2VzIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gcG9zaXRpb24uY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdGEgPSBpO1xuXHRcdFx0XHRcdFx0YiA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0YyA9IGkgKyAyO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkgaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGZ2QSwgZnZCLCBmdkM7XG5cdFx0XHRcdHZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIHV2cztcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHRcdFx0aWYgKCBmYWNlVmVydGV4VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4VXZzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGYgXTtcblx0XHRcdFx0XHR2YXIgZmFjZU1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID8gbWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdIDogbWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRmdkEgPSB2ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdFx0ZnZCID0gdmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHRcdGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHRcdFx0XHRcdHZhciBtb3JwaEluZmx1ZW5jZXMgPSB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdFx0XHRcdFx0dkEuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qi5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIHQgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdHZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRcdFx0dkEuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQS5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmEgXSwgZnZBICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qi5hZGRTY2FsZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZDLmFkZFNjYWxlZFZlY3RvciggdGVtcEMuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5jIF0sIGZ2QyApLCBpbmZsdWVuY2UgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2QS5hZGQoIGZ2QSApO1xuXHRcdFx0XHRcdFx0dkIuYWRkKCBmdkIgKTtcblx0XHRcdFx0XHRcdHZDLmFkZCggZnZDICk7XG5cblx0XHRcdFx0XHRcdGZ2QSA9IHZBO1xuXHRcdFx0XHRcdFx0ZnZCID0gdkI7XG5cdFx0XHRcdFx0XHRmdkMgPSB2QztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCBmYWNlTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBmdkEsIGZ2QiwgZnZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdXZzICYmIHV2c1sgZiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciB1dnNfZiA9IHV2c1sgZiBdO1xuXHRcdFx0XHRcdFx0XHR1dkEuY29weSggdXZzX2ZbIDAgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkIuY29weSggdXZzX2ZbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkMuY29weSggdXZzX2ZbIDIgXSApO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBmO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVyZXIsIHN0YXRlLCBnZW9tZXRyaWVzLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0dmFyIGNsZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHZhciBjbGVhckFscGhhID0gMDtcblxuXHR2YXIgcGxhbmVDYW1lcmEsIHBsYW5lTWVzaDtcblx0dmFyIGJveE1lc2g7XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICkge1xuXG5cdFx0dmFyIGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgKSB7XG5cblx0XHRcdGlmICggYm94TWVzaCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJveE1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgQm94QnVmZmVyR2VvbWV0cnkoIDEsIDEsIDEgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBTaGFkZXJMaWIuY3ViZS51bmlmb3Jtcyxcblx0XHRcdFx0XHRcdHZlcnRleFNoYWRlcjogU2hhZGVyTGliLmN1YmUudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLFxuXHRcdFx0XHRcdFx0c2lkZTogQmFja1NpZGUsXG5cdFx0XHRcdFx0XHRkZXB0aFRlc3Q6IHRydWUsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICd1dicgKTtcblxuXHRcdFx0XHRib3hNZXNoLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBib3hNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50Q3ViZS52YWx1ZSA9IGJhY2tncm91bmQ7XG5cblx0XHRcdHJlbmRlckxpc3QucHVzaCggYm94TWVzaCwgYm94TWVzaC5nZW9tZXRyeSwgYm94TWVzaC5tYXRlcmlhbCwgMCwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBwbGFuZUNhbWVyYSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHBsYW5lQ2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTtcblxuXHRcdFx0XHRwbGFuZU1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggMiwgMiApLFxuXHRcdFx0XHRcdG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgZm9nOiBmYWxzZSB9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggcGxhbmVNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLm1hcCA9IGJhY2tncm91bmQ7XG5cblx0XHRcdC8vIFRPRE8gUHVzaCB0aGlzIHRvIHJlbmRlckxpc3RcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBwbGFuZUNhbWVyYSwgbnVsbCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIHBsYW5lTWVzaCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDbGVhciggY29sb3IsIGFscGhhICkge1xuXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJDb2xvcjtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRcdGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhICE9PSB1bmRlZmluZWQgPyBhbHBoYSA6IDE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRnZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckFscGhhO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoIGFscGhhICkge1xuXG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRyZW5kZXI6IHJlbmRlclxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvICkge1xuXG5cdHZhciBtb2RlO1xuXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xuXG5cdFx0bW9kZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGNvdW50ID0gcG9zaXRpb24uZGF0YS5jb3VudDtcblxuXHRcdFx0ZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgMCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBzdGFydCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIG1heEFuaXNvdHJvcHk7XG5cblx0ZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHtcblxuXHRcdGlmICggbWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IGdsLmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ2hpZ2hwJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmVjaXNpb24gPSAnbWVkaXVtcCc7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ21lZGl1bXAnO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gJ2xvd3AnO1xuXG5cdH1cblxuXHR2YXIgcHJlY2lzaW9uID0gcGFyYW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDogJ2hpZ2hwJztcblx0dmFyIG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7XG5cblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XG5cblx0fVxuXG5cdHZhciBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09PSB0cnVlO1xuXG5cdHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9TSVpFICk7XG5cdHZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSApO1xuXG5cdHZhciBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTtcblx0dmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyApO1xuXHR2YXIgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WQVJZSU5HX1ZFQ1RPUlMgKTtcblx0dmFyIG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgKTtcblxuXHR2YXIgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+IDA7XG5cdHZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSAhISBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHR2YXIgZmxvYXRWZXJ0ZXhUZXh0dXJlcyA9IHZlcnRleFRleHR1cmVzICYmIGZsb2F0RnJhZ21lbnRUZXh0dXJlcztcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcblxuXHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxuXHRcdG1heFRleHR1cmVTaXplOiBtYXhUZXh0dXJlU2l6ZSxcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXG5cblx0XHRtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLFxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3Jtcyxcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXG5cdFx0bWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcyxcblxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyxcblx0XHRmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENsaXBwaW5nKCkge1xuXG5cdHZhciBzY29wZSA9IHRoaXMsXG5cblx0XHRnbG9iYWxTdGF0ZSA9IG51bGwsXG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gMCxcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZSxcblxuXHRcdHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdHZhciBlbmFibGVkID1cblx0XHRcdHBsYW5lcy5sZW5ndGggIT09IDAgfHxcblx0XHRcdGVuYWJsZUxvY2FsQ2xpcHBpbmcgfHxcblx0XHRcdC8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0b1xuXHRcdFx0Ly8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOlxuXHRcdFx0bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8XG5cdFx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZDtcblxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZztcblxuXHRcdGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTtcblx0XHRudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIGVuYWJsZWQ7XG5cblx0fTtcblxuXHR0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlO1xuXHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHR9O1xuXG5cdHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcblx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7XG5cblx0XHRpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgcGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwgcmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkge1xuXG5cdFx0XHQvLyB0aGVyZSdzIG5vIGxvY2FsIGNsaXBwaW5nXG5cblx0XHRcdGlmICggcmVuZGVyaW5nU2hhZG93cyApIHtcblxuXHRcdFx0XHQvLyB0aGVyZSdzIG5vIGdsb2JhbCBjbGlwcGluZ1xuXG5cdFx0XHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsXG5cdFx0XHRcdGxHbG9iYWwgPSBuR2xvYmFsICogNCxcblxuXHRcdFx0XHRkc3RBcnJheSA9IGNhY2hlLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlXG5cblx0XHRcdGRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIGZyb21DYWNoZSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5O1xuXHRcdFx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwO1xuXHRcdFx0dGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDtcblxuXHRcdH1cblxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcblxuXHRcdGlmICggdW5pZm9ybS52YWx1ZSAhPT0gZ2xvYmFsU3RhdGUgKSB7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7XG5cblx0XHR2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLFxuXHRcdFx0ZHN0QXJyYXkgPSBudWxsO1xuXG5cdFx0aWYgKCBuUGxhbmVzICE9PSAwICkge1xuXG5cdFx0XHRkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdGlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCxcblx0XHRcdFx0XHR2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdFx0XHR2aWV3Tm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdGlmICggZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7XG5cblx0XHRcdFx0XHRkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIGZsYXRTaXplICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7IGkgIT09IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7XG5cblx0XHRcdFx0XHRwbGFuZS5jb3B5KCBwbGFuZXNbIGkgXSApLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCwgdmlld05vcm1hbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0cGxhbmUubm9ybWFsLnRvQXJyYXkoIGRzdEFycmF5LCBpNCApO1xuXHRcdFx0XHRcdGRzdEFycmF5WyBpNCArIDMgXSA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7XG5cblx0XHRyZXR1cm4gZHN0QXJyYXk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEV4dGVuc2lvbnMoIGdsICkge1xuXG5cdHZhciBleHRlbnNpb25zID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb25zWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUgKyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247XG5cblx0XHRcdHJldHVybiBleHRlbnNpb247XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mbyApIHtcblxuXHR2YXIgZ2VvbWV0cmllcyA9IHt9O1xuXHR2YXIgd2lyZWZyYW1lQXR0cmlidXRlcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBidWZmZXJnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdC8vIFRPRE8gUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlXG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYXR0cmlidXRlICk7XG5cdFx0XHRkZWxldGUgd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdH1cblxuXHRcdGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9IGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkgcmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdHZhciBpbmRpY2VzID0gW107XG5cblx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gY29uc29sZS50aW1lKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0dmFyIGIgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdFx0dmFyIGMgPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlBdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBpICsgMDtcblx0XHRcdFx0dmFyIGIgPSBpICsgMTtcblx0XHRcdFx0dmFyIGMgPSBpICsgMjtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0YXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcblxuXHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXG5cdFx0Z2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8gKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdHZhciB0eXBlLCBieXRlc1BlckVsZW1lbnQ7XG5cblx0ZnVuY3Rpb24gc2V0SW5kZXgoIHZhbHVlICkge1xuXG5cdFx0dHlwZSA9IHZhbHVlLnR5cGU7XG5cdFx0Ynl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdFbGVtZW50cyggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbi5kcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZm8oIGdsICkge1xuXG5cdHZhciBtZW1vcnkgPSB7XG5cdFx0Z2VvbWV0cmllczogMCxcblx0XHR0ZXh0dXJlczogMFxuXHR9O1xuXG5cdHZhciByZW5kZXIgPSB7XG5cdFx0ZnJhbWU6IDAsXG5cdFx0Y2FsbHM6IDAsXG5cdFx0dHJpYW5nbGVzOiAwLFxuXHRcdHBvaW50czogMCxcblx0XHRsaW5lczogMFxuXHR9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggY291bnQsIG1vZGUsIGluc3RhbmNlQ291bnQgKSB7XG5cblx0XHRpbnN0YW5jZUNvdW50ID0gaW5zdGFuY2VDb3VudCB8fCAxO1xuXG5cdFx0cmVuZGVyLmNhbGxzICsrO1xuXG5cdFx0c3dpdGNoICggbW9kZSApIHtcblxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRVM6XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLlRSSUFOR0xFX1NUUklQOlxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRV9GQU46XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVTOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVfU1RSSVA6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuTElORV9MT09QOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5QT0lOVFM6XG5cdFx0XHRcdHJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6JywgbW9kZSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cblx0XHRyZW5kZXIuZnJhbWUgKys7XG5cdFx0cmVuZGVyLmNhbGxzID0gMDtcblx0XHRyZW5kZXIudHJpYW5nbGVzID0gMDtcblx0XHRyZW5kZXIucG9pbnRzID0gMDtcblx0XHRyZW5kZXIubGluZXMgPSAwO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1lbW9yeTogbWVtb3J5LFxuXHRcdHJlbmRlcjogcmVuZGVyLFxuXHRcdHByb2dyYW1zOiBudWxsLFxuXHRcdGF1dG9SZXNldDogdHJ1ZSxcblx0XHRyZXNldDogcmVzZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGVcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWJzTnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gTWF0aC5hYnMoIGJbIDEgXSApIC0gTWF0aC5hYnMoIGFbIDEgXSApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMTW9ycGh0YXJnZXRzKCBnbCApIHtcblxuXHR2YXIgaW5mbHVlbmNlc0xpc3QgPSB7fTtcblx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICkge1xuXG5cdFx0dmFyIG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0dmFyIGxlbmd0aCA9IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoO1xuXG5cdFx0dmFyIGluZmx1ZW5jZXMgPSBpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggaW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXNlIGxpc3RcblxuXHRcdFx0aW5mbHVlbmNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0aW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF0gPSBpbmZsdWVuY2VzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IG1hdGVyaWFsLm1vcnBoTm9ybWFscyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0Ly8gUmVtb3ZlIGN1cnJlbnQgbW9ycGhBdHRyaWJ1dGVzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlWyAxIF0gIT09IDAgKSB7XG5cblx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpICk7XG5cdFx0XHRcdGlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBDb2xsZWN0IGluZmx1ZW5jZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aW5mbHVlbmNlWyAwIF0gPSBpO1xuXHRcdFx0aW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07XG5cblx0XHR9XG5cblx0XHRpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTtcblxuXHRcdC8vIEFkZCBtb3JwaEF0dHJpYnV0ZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGluZmx1ZW5jZVsgMCBdO1xuXHRcdFx0XHR2YXIgdmFsdWUgPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaFRhcmdldHNbIGluZGV4IF0gKTtcblx0XHRcdFx0XHRpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoTm9ybWFsc1sgaW5kZXggXSApO1xuXG5cdFx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKSB7XG5cblx0dmFyIHVwZGF0ZUxpc3QgPSB7fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdHZhciBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7XG5cblx0XHQvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWVcblxuXHRcdGlmICggdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggYnVmZmVyZ2VvbWV0cnkgKTtcblxuXHRcdFx0dXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0dXBkYXRlTGlzdCA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVUZXh0dXJlKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0aW1hZ2VzID0gaW1hZ2VzICE9PSB1bmRlZmluZWQgPyBpbWFnZXMgOiBbXTtcblx0bWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cbn1cblxuQ3ViZVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVUZXh0dXJlO1xuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZSA9IHRydWU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3ViZVRleHR1cmUucHJvdG90eXBlLCAnaW1hZ2VzJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW1hZ2U7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmltYWdlID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICpcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcbiAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApJy5cbiAqXG4gKlxuICogUHJvcGVydGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNlcSAtIGFycmF5IG9mIG5lc3RlZCB1bmlmb3Jtc1xuICogLm1hcCAtIG5lc3RlZCB1bmlmb3JtcyBieSBuYW1lXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgW3JlbmRlcmVyXSApXG4gKlxuICogXHRcdHVwbG9hZHMgYSB1bmlmb3JtIHZhbHVlKHMpXG4gKiAgXHR0aGUgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIgaXMgbmVlZGVkIGZvciBzYW1wbGVyIHVuaWZvcm1zXG4gKlxuICpcbiAqIFN0YXRpYyBtZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0udmFsdWUnXG4gKlxuICogLnNlcVdpdGhWYWx1ZSggc2VxLCB2YWx1ZXMgKSA6IGZpbHRlcmVkU2VxXG4gKlxuICogXHRcdGZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXG4gKlxuICogLnNldCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSBmcm9tIG9iamVjdCBhbmQgcHJvcGVydHkgd2l0aCBzYW1lIG5hbWUgdGhhbiB1bmlmb3JtXG4gKlxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0bGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKlxuICovXG5cbnZhciBlbXB0eVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xudmFyIGVtcHR5Q3ViZVRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuLy8gLS0tIEJhc2UgZm9yIGlubmVyIG5vZGVzIChpbmNsdWRpbmcgdGhlIHJvb3QpIC0tLVxuXG5mdW5jdGlvbiBVbmlmb3JtQ29udGFpbmVyKCkge1xuXG5cdHRoaXMuc2VxID0gW107XG5cdHRoaXMubWFwID0ge307XG5cbn1cblxuLy8gLS0tIFV0aWxpdGllcyAtLS1cblxuLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpXG5cbnZhciBhcnJheUNhY2hlRjMyID0gW107XG52YXIgYXJyYXlDYWNoZUkzMiA9IFtdO1xuXG4vLyBGbG9hdDMyQXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXNcblxudmFyIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7XG52YXIgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApO1xuXG4vLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXNcblxuZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2NrU2l6ZSApIHtcblxuXHR2YXIgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHR2YXIgbiA9IG5CbG9ja3MgKiBibG9ja1NpemUsXG5cdFx0ciA9IGFycmF5Q2FjaGVGMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUYzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0aWYgKCBuQmxvY2tzICE9PSAwICkge1xuXG5cdFx0Zmlyc3RFbGVtLnRvQXJyYXkoIHIsIDAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0gbkJsb2NrczsgKysgaSApIHtcblxuXHRcdFx0b2Zmc2V0ICs9IGJsb2NrU2l6ZTtcblx0XHRcdGFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59XG5cbi8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uXG5cbmZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICkge1xuXG5cdHZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBJbnQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUkzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRyWyBpIF0gPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gU2luZ2xlIGZsb2F0IHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZ2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XG5cblx0fSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0ZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0IGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIG1hdHJpeCAoZnJvbSBmbGF0IGFycmF5IG9yIE1hdHJpeE4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZtKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2LmVsZW1lbnRzIHx8IHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmbSggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdG1hdDNhcnJheS5zZXQoIHYuZWxlbWVudHMgKTtcblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0Zm0oIGdsLCB2ICkge1xuXG5cdGlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRtYXQ0YXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7XG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0NGFycmF5ICk7XG5cblx0fVxuXG59XG5cbi8vIFNpbmdsZSB0ZXh0dXJlICgyRCAvIEN1YmUpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHYgfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbi8vIEludGVnZXIgLyBCb29sZWFuIHZlY3RvcnMgb3IgYXJyYXlzIHRoZXJlb2YgKGFsd2F5cyBmbGF0IGFycmF5cylcblxuZnVuY3Rpb24gc2V0VmFsdWUyaXYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2l2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2VcblxuZnVuY3Rpb24gZ2V0U2luZ3VsYXJTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZjsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlMmZ2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWUzZnY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZTRmdjsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWUyZm07IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZTNmbTsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlNGZtOyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDhiNWU6IGNhc2UgMHg4ZDY2OiByZXR1cm4gc2V0VmFsdWVUMTsgLy8gU0FNUExFUl8yRCwgU0FNUExFUl9FWFRFUk5BTF9PRVNcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDY7IC8vIFNBTVBMRVJfQ1VCRVxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIEFycmF5IG9mIHNjYWxhcnNcblxuZnVuY3Rpb24gc2V0VmFsdWUxZnYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xZnYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5mdW5jdGlvbiBzZXRWYWx1ZTFpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM2EoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAzICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApO1xuXG59XG5cbi8vIEFycmF5IG9mIG1hdHJpY2VzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0zYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU00YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAxNiApICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMWEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoLFxuXHRcdHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2WyBpIF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDZhKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aCxcblx0XHR1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciBhIHB1cmUgKGJvdHRvbS1sZXZlbCkgYXJyYXlcblxuZnVuY3Rpb24gZ2V0UHVyZUFycmF5U2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWZ2OyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmE7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzYTsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRhOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yYTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTNhOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNGE7IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogcmV0dXJuIHNldFZhbHVlVDFhOyAvLyBTQU1QTEVSXzJEXG5cdFx0Y2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2YTsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpdjsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5zZXRWYWx1ZSA9IGdldFNpbmd1bGFyU2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuZnVuY3Rpb24gUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXG5cdFVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOyAvLyBtaXgtaW5cblxufVxuXG5TdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSApIHtcblxuXHQvLyBOb3RlOiBEb24ndCBuZWVkIGFuIGV4dHJhICdyZW5kZXJlcicgcGFyYW1ldGVyLCBzaW5jZSBzYW1wbGVyc1xuXHQvLyBhcmUgbm90IGFsbG93ZWQgaW4gc3RydWN0dXJlZCB1bmlmb3Jtcy5cblxuXHR2YXIgc2VxID0gdGhpcy5zZXE7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF07XG5cdFx0dS5zZXRWYWx1ZSggZ2wsIHZhbHVlWyB1LmlkIF0gKTtcblxuXHR9XG5cbn07XG5cbi8vIC0tLSBUb3AtbGV2ZWwgLS0tXG5cbi8vIFBhcnNlciAtIGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3NcblxudmFyIFJlUGF0aFBhcnQgPSAvKFtcXHdcXGRfXSspKFxcXSk/KFxcW3xcXC4pPy9nO1xuXG4vLyBleHRyYWN0c1xuLy8gXHQtIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdClcbi8vXG4vLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZFxuLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXNcbi8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLlxuXG5mdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7XG5cblx0Y29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7XG5cdGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRyLCBjb250YWluZXIgKSB7XG5cblx0dmFyIHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdGZvciAoIDsgOyApIHtcblxuXHRcdHZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhlYyggcGF0aCApLFxuXHRcdFx0bWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCxcblxuXHRcdFx0aWQgPSBtYXRjaFsgMSBdLFxuXHRcdFx0aWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLFxuXHRcdFx0c3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTtcblxuXHRcdGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlclxuXG5cdFx0aWYgKCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5ndGggKSB7XG5cblx0XHRcdC8vIGJhcmUgbmFtZSBvciBcInB1cmVcIiBib3R0b20tbGV2ZWwgYXJyYXkgXCJbMF1cIiBzdWZmaXhcblxuXHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdG5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIDpcblx0XHRcdFx0bmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgKTtcblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBzdGVwIGludG8gaW5uZXIgbm9kZSAvIGNyZWF0ZSBpdCBpbiBjYXNlIGl0IGRvZXNuJ3QgZXhpc3RcblxuXHRcdFx0dmFyIG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApIHtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlICkge1xuXG5cdHZhciB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGhpcy5yZW5kZXJlciApO1xuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHtcblxuXHR2YXIgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdLFxuXHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xuXG5cdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7XG5cblx0dmFyIHIgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHR2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0bGluZXNbIGkgXSA9ICggaSArIDEgKSArICc6ICcgKyBsaW5lc1sgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbGluZXMuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHR2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0eXBlICk7XG5cblx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApO1xuXHRnbC5jb21waWxlU2hhZGVyKCBzaGFkZXIgKTtcblxuXHRpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFNoYWRlcjogU2hhZGVyIGNvdWxkblxcJ3QgY29tcGlsZS4nICk7XG5cblx0fVxuXG5cdGlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2coKScsIHR5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcsIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLCBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkgKTtcblxuXHR9XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coIHR5cGUsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTtcblxuXHRyZXR1cm4gc2hhZGVyO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgcHJvZ3JhbUlkQ291bnQgPSAwO1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkge1xuXG5cdHN3aXRjaCAoIGVuY29kaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdMaW5lYXInLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2Ugc1JHQkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ3NSR0InLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCRUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkUnLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCTTdFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDcuMCApJyBdO1xuXHRcdGNhc2UgUkdCTTE2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCAxNi4wICknIF07XG5cdFx0Y2FzZSBSR0JERW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRCcsICcoIHZhbHVlLCAyNTYuMCApJyBdO1xuXHRcdGNhc2UgR2FtbWFFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdHYW1tYScsICcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gJ3ZlYzQgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUbycgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAxIF0gKyAnOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xuXG5cdHZhciB0b25lTWFwcGluZ05hbWU7XG5cblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdSZWluaGFyZCc7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1VuY2hhcnRlZDInO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ09wdGltaXplZENpbmVvbic7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCB0b25lTWFwcGluZzogJyArIHRvbmVNYXBwaW5nICk7XG5cblx0fVxuXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXJFeHRlbnNpb25zICkge1xuXG5cdGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IHt9O1xuXG5cdHZhciBjaHVua3MgPSBbXG5cdFx0KCBleHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLm5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nICkgPyAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLmZyYWdEZXB0aCB8fCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZHJhd19idWZmZXJzJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLnNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUnIDogJydcblx0XTtcblxuXHRyZXR1cm4gY2h1bmtzLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKSB7XG5cblx0dmFyIGNodW5rcyA9IFtdO1xuXG5cdGZvciAoIHZhciBuYW1lIGluIGRlZmluZXMgKSB7XG5cblx0XHR2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07XG5cblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0Y2h1bmtzLnB1c2goICcjZGVmaW5lICcgKyBuYW1lICsgJyAnICsgdmFsdWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGNodW5rcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApIHtcblxuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXG5cdHZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIoIHByb2dyYW0sIGkgKTtcblx0XHR2YXIgbmFtZSA9IGluZm8ubmFtZTtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURTonLCBuYW1lLCBpICk7XG5cblx0XHRhdHRyaWJ1dGVzWyBuYW1lIF0gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgbmFtZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYXR0cmlidXRlcztcblxufVxuXG5mdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmluZyApIHtcblxuXHRyZXR1cm4gc3RyaW5nICE9PSAnJztcblxufVxuXG5mdW5jdGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0RJUl9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9QT0lOVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIClcblx0XHQucmVwbGFjZSggL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLCAoIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgLSBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24gKSApO1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5jbHVkZXMoIHN0cmluZyApIHtcblxuXHR2YXIgcGF0dGVybiA9IC9eWyBcXHRdKiNpbmNsdWRlICs8KFtcXHdcXGQuXSspPi9nbTtcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRcdHZhciByZXBsYWNlID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTtcblxuXHRcdGlmICggcmVwbGFjZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VJbmNsdWRlcyggcmVwbGFjZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gLyNwcmFnbWEgdW5yb2xsX2xvb3BbXFxzXSs/Zm9yIFxcKCBpbnQgaSBcXD0gKFxcZCspXFw7IGkgPCAoXFxkKylcXDsgaSBcXCtcXCsgXFwpIFxceyhbXFxzXFxTXSs/KSg/PVxcfSlcXH0vZztcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRcdHZhciB1bnJvbGwgPSAnJztcblxuXHRcdGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XG5cblx0XHRcdHVucm9sbCArPSBzbmlwcGV0LnJlcGxhY2UoIC9cXFsgaSBcXF0vZywgJ1sgJyArIGkgKyAnIF0nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5yb2xsO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjb2RlLCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7XG5cblx0dmFyIGRlZmluZXMgPSBtYXRlcmlhbC5kZWZpbmVzO1xuXG5cdHZhciB2ZXJ0ZXhTaGFkZXIgPSBzaGFkZXIudmVydGV4U2hhZGVyO1xuXHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXI7XG5cblx0dmFyIHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfQkFTSUMnO1xuXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XG5cblx0fVxuXG5cdHZhciBlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHR2YXIgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJztcblx0dmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9FUVVJUkVDJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfU1BIRVJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRlJBQ1RJT04nO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmNvbWJpbmUgKSB7XG5cblx0XHRcdGNhc2UgTXVsdGlwbHlPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIE1peE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFkZE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2FtbWFGYWN0b3JEZWZpbmUgPSAoIHJlbmRlcmVyLmdhbW1hRmFjdG9yID4gMCApID8gcmVuZGVyZXIuZ2FtbWFGYWN0b3IgOiAxLjA7XG5cblx0Ly8gY29uc29sZS5sb2coICdidWlsZGluZyBuZXcgcHJvZ3JhbSAnICk7XG5cblx0Ly9cblxuXHR2YXIgY3VzdG9tRXh0ZW5zaW9ucyA9IGdlbmVyYXRlRXh0ZW5zaW9ucyggbWF0ZXJpYWwuZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgZXh0ZW5zaW9ucyApO1xuXG5cdHZhciBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XG5cblx0Ly9cblxuXHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHR2YXIgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblxuXHRpZiAoIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhWZXJ0ZXgubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4VmVydGV4ICs9ICdcXG4nO1xuXG5cdFx0fVxuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cdFx0XHRjdXN0b21EZWZpbmVzXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdGlmICggcHJlZml4RnJhZ21lbnQubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4RnJhZ21lbnQgKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTJyA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQnI2RlZmluZSBNQVhfQk9ORVMgJyArIHBhcmFtZXRlcnMubWF4Qm9uZXMsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCcjaWZkZWYgVVNFX0NPTE9SJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgY29sb3I7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX01PUlBIVEFSR0VUUycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsnLFxuXG5cdFx0XHQnXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUycsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDI7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOycsXG5cblx0XHRcdCdcdCNlbHNlJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ1OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7JyxcblxuXHRcdFx0J1x0I2VuZGlmJyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX1NLSU5OSU5HJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBIQVRFU1QgJyArIHBhcmFtZXRlcnMuYWxwaGFUZXN0IDogJycsXG5cblx0XHRcdCcjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsXG5cblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRpbmdEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5ncmFkaWVudE1hcCA/ICcjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVEZWZpbmUgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyAnI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID8gJyNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUycgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2RlZmluZSBURVhUVVJFX0xPRF9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/ICcjZGVmaW5lIFRPTkVfTUFQUElORycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gU2hhZGVyQ2h1bmtbICd0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50JyBdIDogJycsIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdG9uZU1hcHBpbmcoKSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oICd0b25lTWFwcGluZycsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRpdGhlcmluZyA/ICcjZGVmaW5lIERJVEhFUklORycgOiAnJyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA/IFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzIGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5tYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW52TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oICdsaW5lYXJUb091dHB1dFRleGVsJywgcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nID8gJyNkZWZpbmUgREVQVEhfUEFDS0lORyAnICsgbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogJycsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHR9XG5cblx0dmVydGV4U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGZyYWdtZW50U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggZnJhZ21lbnRTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblxuXHR2ZXJ0ZXhTaGFkZXIgPSB1bnJvbGxMb29wcyggdmVydGV4U2hhZGVyICk7XG5cdGZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMoIGZyYWdtZW50U2hhZGVyICk7XG5cblx0dmFyIHZlcnRleEdsc2wgPSBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudEdsc2wgPSBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKlZFUlRFWConLCB2ZXJ0ZXhHbHNsICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xuXG5cdHZhciBnbFZlcnRleFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4R2xzbCApO1xuXHR2YXIgZ2xGcmFnbWVudFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudEdsc2wgKTtcblxuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIEZvcmNlIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgdG8gaW5kZXggMC5cblxuXHRpZiAoIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0Ly8gcHJvZ3JhbXMgd2l0aCBtb3JwaFRhcmdldHMgZGlzcGxhY2UgcG9zaXRpb24gb3V0IG9mIGF0dHJpYnV0ZSAwXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCAncG9zaXRpb24nICk7XG5cblx0fVxuXG5cdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0dmFyIHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApLnRyaW0oKTtcblx0dmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICkudHJpbSgpO1xuXHR2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICkudHJpbSgpO1xuXG5cdHZhciBydW5uYWJsZSA9IHRydWU7XG5cdHZhciBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKipWRVJURVgqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xWZXJ0ZXhTaGFkZXIgKSApO1xuXHQvLyBjb25zb2xlLmxvZyggJyoqRlJBR01FTlQqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xGcmFnbWVudFNoYWRlciApICk7XG5cblx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdHJ1bm5hYmxlID0gZmFsc2U7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICcsIGdsLmdldEVycm9yKCksICdnbC5WQUxJREFURV9TVEFUVVMnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMgKSwgJ2dsLmdldFByb2dyYW1JbmZvTG9nJywgcHJvZ3JhbUxvZywgdmVydGV4TG9nLCBmcmFnbWVudExvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHByb2dyYW1Mb2cgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHZlcnRleExvZyA9PT0gJycgfHwgZnJhZ21lbnRMb2cgPT09ICcnICkge1xuXG5cdFx0aGF2ZURpYWdub3N0aWNzID0gZmFsc2U7XG5cblx0fVxuXG5cdGlmICggaGF2ZURpYWdub3N0aWNzICkge1xuXG5cdFx0dGhpcy5kaWFnbm9zdGljcyA9IHtcblxuXHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXG5cdFx0XHRwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLFxuXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0cHJlZml4OiBwcmVmaXhWZXJ0ZXhcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IGZyYWdtZW50TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeEZyYWdtZW50XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vIGNsZWFuIHVwXG5cblx0Z2wuZGVsZXRlU2hhZGVyKCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5kZWxldGVTaGFkZXIoIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgdW5pZm9ybSBsb2NhdGlvbnNcblxuXHR2YXIgY2FjaGVkVW5pZm9ybXM7XG5cblx0dGhpcy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkVW5pZm9ybXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkVW5pZm9ybXMgPSBuZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkVW5pZm9ybXM7XG5cblx0fTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRlIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkQXR0cmlidXRlcztcblxuXHR9O1xuXG5cdC8vIGZyZWUgcmVzb3VyY2VcblxuXHR0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly8gREVQUkVDQVRFRFxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAudW5pZm9ybXMgaXMgbm93IC5nZXRVbmlmb3JtcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0VW5pZm9ybXMoKTtcblxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRhdHRyaWJ1dGVzOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC5hdHRyaWJ1dGVzIGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gKTtcblxuXG5cdC8vXG5cblx0dGhpcy5uYW1lID0gc2hhZGVyLm5hbWU7XG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jb2RlID0gY29kZTtcblx0dGhpcy51c2VkVGltZXMgPSAxO1xuXHR0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IGdsVmVydGV4U2hhZGVyO1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtcyggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgcHJvZ3JhbXMgPSBbXTtcblxuXHR2YXIgc2hhZGVySURzID0ge1xuXHRcdE1lc2hEZXB0aE1hdGVyaWFsOiAnZGVwdGgnLFxuXHRcdE1lc2hEaXN0YW5jZU1hdGVyaWFsOiAnZGlzdGFuY2VSR0JBJyxcblx0XHRNZXNoTm9ybWFsTWF0ZXJpYWw6ICdub3JtYWwnLFxuXHRcdE1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ICdsYW1iZXJ0Jyxcblx0XHRNZXNoUGhvbmdNYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdExpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdExpbmVEYXNoZWRNYXRlcmlhbDogJ2Rhc2hlZCcsXG5cdFx0UG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnLFxuXHRcdFNoYWRvd01hdGVyaWFsOiAnc2hhZG93J1xuXHR9O1xuXG5cdHZhciBwYXJhbWV0ZXJOYW1lcyA9IFtcblx0XHRcInByZWNpc2lvblwiLCBcInN1cHBvcnRzVmVydGV4VGV4dHVyZXNcIiwgXCJtYXBcIiwgXCJtYXBFbmNvZGluZ1wiLCBcImVudk1hcFwiLCBcImVudk1hcE1vZGVcIiwgXCJlbnZNYXBFbmNvZGluZ1wiLFxuXHRcdFwibGlnaHRNYXBcIiwgXCJhb01hcFwiLCBcImVtaXNzaXZlTWFwXCIsIFwiZW1pc3NpdmVNYXBFbmNvZGluZ1wiLCBcImJ1bXBNYXBcIiwgXCJub3JtYWxNYXBcIiwgXCJkaXNwbGFjZW1lbnRNYXBcIiwgXCJzcGVjdWxhck1hcFwiLFxuXHRcdFwicm91Z2huZXNzTWFwXCIsIFwibWV0YWxuZXNzTWFwXCIsIFwiZ3JhZGllbnRNYXBcIixcblx0XHRcImFscGhhTWFwXCIsIFwiY29tYmluZVwiLCBcInZlcnRleENvbG9yc1wiLCBcImZvZ1wiLCBcInVzZUZvZ1wiLCBcImZvZ0V4cFwiLFxuXHRcdFwiZmxhdFNoYWRpbmdcIiwgXCJzaXplQXR0ZW51YXRpb25cIiwgXCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyXCIsIFwic2tpbm5pbmdcIixcblx0XHRcIm1heEJvbmVzXCIsIFwidXNlVmVydGV4VGV4dHVyZVwiLCBcIm1vcnBoVGFyZ2V0c1wiLCBcIm1vcnBoTm9ybWFsc1wiLFxuXHRcdFwibWF4TW9ycGhUYXJnZXRzXCIsIFwibWF4TW9ycGhOb3JtYWxzXCIsIFwicHJlbXVsdGlwbGllZEFscGhhXCIsXG5cdFx0XCJudW1EaXJMaWdodHNcIiwgXCJudW1Qb2ludExpZ2h0c1wiLCBcIm51bVNwb3RMaWdodHNcIiwgXCJudW1IZW1pTGlnaHRzXCIsIFwibnVtUmVjdEFyZWFMaWdodHNcIixcblx0XHRcInNoYWRvd01hcEVuYWJsZWRcIiwgXCJzaGFkb3dNYXBUeXBlXCIsIFwidG9uZU1hcHBpbmdcIiwgJ3BoeXNpY2FsbHlDb3JyZWN0TGlnaHRzJyxcblx0XHRcImFscGhhVGVzdFwiLCBcImRvdWJsZVNpZGVkXCIsIFwiZmxpcFNpZGVkXCIsIFwibnVtQ2xpcHBpbmdQbGFuZXNcIiwgXCJudW1DbGlwSW50ZXJzZWN0aW9uXCIsIFwiZGVwdGhQYWNraW5nXCIsIFwiZGl0aGVyaW5nXCJcblx0XTtcblxuXG5cdGZ1bmN0aW9uIGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIHtcblxuXHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7XG5cblx0XHRcdHJldHVybiAxMDI0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gZGVmYXVsdCBmb3Igd2hlbiBvYmplY3QgaXMgbm90IHNwZWNpZmllZFxuXHRcdFx0Ly8gKCBmb3IgZXhhbXBsZSB3aGVuIHByZWJ1aWxkaW5nIHNoYWRlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb2JqZWN0cyApXG5cdFx0XHQvL1xuXHRcdFx0Ly8gIC0gbGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3Igb3RoZXIgdW5pZm9ybXNcblx0XHRcdC8vICAtIGxpbWl0IGhlcmUgaXMgQU5HTEUncyAyNTQgbWF4IHVuaWZvcm0gdmVjdG9yc1xuXHRcdFx0Ly8gICAgKHVwIHRvIDU0IHNob3VsZCBiZSBzYWZlKVxuXG5cdFx0XHR2YXIgblZlcnRleFVuaWZvcm1zID0gY2FwYWJpbGl0aWVzLm1heFZlcnRleFVuaWZvcm1zO1xuXHRcdFx0dmFyIG5WZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxvb3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQgKTtcblxuXHRcdFx0dmFyIG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7XG5cblx0XHRcdGlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTtcblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heEJvbmVzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAsIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7XG5cblx0XHR2YXIgZW5jb2Rpbmc7XG5cblx0XHRpZiAoICEgbWFwICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBtYXAuZW5jb2Rpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUHJvZ3JhbXMuZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0ZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgV2ViR0xSZW5kZXJlci5nYW1tYUlucHV0L2dhbW1hT3V0cHV0IHBhcmFtZXRlciwgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC5cblx0XHRpZiAoIGVuY29kaW5nID09PSBMaW5lYXJFbmNvZGluZyAmJiBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IEdhbW1hRW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdHRoaXMuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgc2hhZG93cywgZm9nLCBuQ2xpcFBsYW5lcywgbkNsaXBJbnRlcnNlY3Rpb24sIG9iamVjdCApIHtcblxuXHRcdHZhciBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXG5cdFx0Ly8gaGV1cmlzdGljcyB0byBjcmVhdGUgc2hhZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGxpZ2h0cyBpbiB0aGUgc2NlbmVcblx0XHQvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KVxuXG5cdFx0dmFyIG1heEJvbmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7XG5cdFx0dmFyIHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5wcmVjaXNpb247XG5cblx0XHRpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0cHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0ge1xuXG5cdFx0XHRzaGFkZXJJRDogc2hhZGVySUQsXG5cblx0XHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdFx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLFxuXHRcdFx0b3V0cHV0RW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoICggISBjdXJyZW50UmVuZGVyVGFyZ2V0ICkgPyBudWxsIDogY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJlci5nYW1tYU91dHB1dCApLFxuXHRcdFx0bWFwOiAhISBtYXRlcmlhbC5tYXAsXG5cdFx0XHRtYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXA6ICEhIG1hdGVyaWFsLmVudk1hcCxcblx0XHRcdGVudk1hcE1vZGU6IG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyxcblx0XHRcdGVudk1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbnZNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGVudk1hcEN1YmVVVjogKCAhISBtYXRlcmlhbC5lbnZNYXAgKSAmJiAoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgfHwgKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgKSApLFxuXHRcdFx0bGlnaHRNYXA6ICEhIG1hdGVyaWFsLmxpZ2h0TWFwLFxuXHRcdFx0YW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsXG5cdFx0XHRub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCxcblx0XHRcdGRpc3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXHRcdFx0cm91Z2huZXNzTWFwOiAhISBtYXRlcmlhbC5yb3VnaG5lc3NNYXAsXG5cdFx0XHRtZXRhbG5lc3NNYXA6ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCxcblx0XHRcdHNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5zcGVjdWxhck1hcCxcblx0XHRcdGFscGhhTWFwOiAhISBtYXRlcmlhbC5hbHBoYU1hcCxcblxuXHRcdFx0Z3JhZGllbnRNYXA6ICEhIG1hdGVyaWFsLmdyYWRpZW50TWFwLFxuXG5cdFx0XHRjb21iaW5lOiBtYXRlcmlhbC5jb21iaW5lLFxuXG5cdFx0XHR2ZXJ0ZXhDb2xvcnM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyxcblxuXHRcdFx0Zm9nOiAhISBmb2csXG5cdFx0XHR1c2VGb2c6IG1hdGVyaWFsLmZvZyxcblx0XHRcdGZvZ0V4cDogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRcdHNraW5uaW5nOiBtYXRlcmlhbC5za2lubmluZyAmJiBtYXhCb25lcyA+IDAsXG5cdFx0XHRtYXhCb25lczogbWF4Qm9uZXMsXG5cdFx0XHR1c2VWZXJ0ZXhUZXh0dXJlOiBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxcblxuXHRcdFx0bW9ycGhUYXJnZXRzOiBtYXRlcmlhbC5tb3JwaFRhcmdldHMsXG5cdFx0XHRtb3JwaE5vcm1hbHM6IG1hdGVyaWFsLm1vcnBoTm9ybWFscyxcblx0XHRcdG1heE1vcnBoVGFyZ2V0czogcmVuZGVyZXIubWF4TW9ycGhUYXJnZXRzLFxuXHRcdFx0bWF4TW9ycGhOb3JtYWxzOiByZW5kZXJlci5tYXhNb3JwaE5vcm1hbHMsXG5cblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXG5cblx0XHRcdG51bUNsaXBwaW5nUGxhbmVzOiBuQ2xpcFBsYW5lcyxcblx0XHRcdG51bUNsaXBJbnRlcnNlY3Rpb246IG5DbGlwSW50ZXJzZWN0aW9uLFxuXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcblxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgc2hhZG93cy5sZW5ndGggPiAwLFxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXG5cblx0XHRcdHRvbmVNYXBwaW5nOiByZW5kZXJlci50b25lTWFwcGluZyxcblx0XHRcdHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5kZXJlci5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxcblxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEsXG5cblx0XHRcdGFscGhhVGVzdDogbWF0ZXJpYWwuYWxwaGFUZXN0LFxuXHRcdFx0ZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUsXG5cdFx0XHRmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLFxuXG5cdFx0XHRkZXB0aFBhY2tpbmc6ICggbWF0ZXJpYWwuZGVwdGhQYWNraW5nICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsLmRlcHRoUGFja2luZyA6IGZhbHNlXG5cblx0XHR9O1xuXG5cdFx0cmV0dXJuIHBhcmFtZXRlcnM7XG5cblx0fTtcblxuXHR0aGlzLmdldFByb2dyYW1Db2RlID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciApO1xuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hhZGVyICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIG5hbWUgaW4gbWF0ZXJpYWwuZGVmaW5lcyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBuYW1lICk7XG5cdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLmRlZmluZXNbIG5hbWUgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnNbIHBhcmFtZXRlck5hbWVzWyBpIF0gXSApO1xuXG5cdFx0fVxuXG5cdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkgKTtcblxuXHRcdGFycmF5LnB1c2goIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICk7XG5cblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xuXG5cdH07XG5cblx0dGhpcy5hY3F1aXJlUHJvZ3JhbSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycywgY29kZSApIHtcblxuXHRcdHZhciBwcm9ncmFtO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBpbGVkXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHByb2dyYW1zLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUluZm8gPSBwcm9ncmFtc1sgcCBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7XG5cblx0XHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1JbmZvO1xuXHRcdFx0XHQrKyBwcm9ncmFtLnVzZWRUaW1lcztcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fTtcblxuXHR0aGlzLnJlbGVhc2VQcm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0dmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcblx0XHRcdHByb2dyYW1zLnBvcCgpO1xuXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xuXHRcdFx0cHJvZ3JhbS5kZXN0cm95KCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XG5cdHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkge1xuXG5cdHZhciBwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCApIHtcblxuXHRcdHZhciBtYXAgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXAgPSB7fTtcblx0XHRcdHByb3BlcnRpZXMuc2V0KCBvYmplY3QsIG1hcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmRlbGV0ZSggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBrZXksIHZhbHVlICkge1xuXG5cdFx0cHJvcGVydGllcy5nZXQoIG9iamVjdCApWyBrZXkgXSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHtcblxuXHR2YXIgcmVuZGVySXRlbXMgPSBbXTtcblx0dmFyIHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdHZhciBvcGFxdWUgPSBbXTtcblx0dmFyIHRyYW5zcGFyZW50ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdFx0b3BhcXVlLmxlbmd0aCA9IDA7XG5cdFx0dHJhbnNwYXJlbnQubGVuZ3RoID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHosIGdyb3VwICkge1xuXG5cdFx0dmFyIHJlbmRlckl0ZW0gPSByZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdO1xuXG5cdFx0aWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlckl0ZW0gPSB7XG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0LFxuXHRcdFx0XHRnZW9tZXRyeTogZ2VvbWV0cnksXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcblx0XHRcdFx0cHJvZ3JhbTogbWF0ZXJpYWwucHJvZ3JhbSxcblx0XHRcdFx0cmVuZGVyT3JkZXI6IG9iamVjdC5yZW5kZXJPcmRlcixcblx0XHRcdFx0ejogeixcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXG5cdFx0XHR9O1xuXG5cdFx0XHRyZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7XG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW07XG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xuXHRcdFx0cmVuZGVySXRlbS56ID0gejtcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDtcblxuXHRcdH1cblxuXHRcdCggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgPyB0cmFuc3BhcmVudCA6IG9wYXF1ZSApLnB1c2goIHJlbmRlckl0ZW0gKTtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggKys7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNvcnQoKSB7XG5cblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cdFx0aWYgKCB0cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdHJhbnNwYXJlbnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3BhcXVlOiBvcGFxdWUsXG5cdFx0dHJhbnNwYXJlbnQ6IHRyYW5zcGFyZW50LFxuXG5cdFx0aW5pdDogaW5pdCxcblx0XHRwdXNoOiBwdXNoLFxuXG5cdFx0c29ydDogc29ydFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoKSB7XG5cblx0dmFyIGxpc3RzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblx0XHR2YXIgbGlzdCA9IGxpc3RzWyBoYXNoIF07XG5cblx0XHRpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlckxpc3RzOicsIGhhc2ggKTtcblxuXHRcdFx0bGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoKTtcblx0XHRcdGxpc3RzWyBoYXNoIF0gPSBsaXN0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRsaXN0cyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHtcblxuXHR2YXIgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhRmFyOiAxMDAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNldCBSZWN0QXJlYUxpZ2h0IHNoYWRvdyB1bmlmb3Jtc1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbnZhciBjb3VudCA9IDA7XG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkge1xuXG5cdHZhciBjYWNoZSA9IG5ldyBVbmlmb3Jtc0NhY2hlKCk7XG5cblx0dmFyIHN0YXRlID0ge1xuXG5cdFx0aWQ6IGNvdW50ICsrLFxuXG5cdFx0aGFzaDogJycsXG5cblx0XHRhbWJpZW50OiBbIDAsIDAsIDAgXSxcblx0XHRkaXJlY3Rpb25hbDogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRzcG90OiBbXSxcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRyZWN0QXJlYTogW10sXG5cdFx0cG9pbnQ6IFtdLFxuXHRcdHBvaW50U2hhZG93TWFwOiBbXSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXG5cdFx0aGVtaTogW11cblxuXHR9O1xuXG5cdHZhciB2ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGZ1bmN0aW9uIHNldHVwKCBsaWdodHMsIHNoYWRvd3MsIGNhbWVyYSApIHtcblxuXHRcdHZhciByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG5cdFx0dmFyIGRpcmVjdGlvbmFsTGVuZ3RoID0gMDtcblx0XHR2YXIgcG9pbnRMZW5ndGggPSAwO1xuXHRcdHZhciBzcG90TGVuZ3RoID0gMDtcblx0XHR2YXIgcmVjdEFyZWFMZW5ndGggPSAwO1xuXHRcdHZhciBoZW1pTGVuZ3RoID0gMDtcblxuXHRcdHZhciB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTtcblxuXHRcdFx0dmFyIGNvbG9yID0gbGlnaHQuY29sb3I7XG5cdFx0XHR2YXIgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0dmFyIGRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0XHRcdHZhciBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsO1xuXG5cdFx0XHRpZiAoIGxpZ2h0LmlzQW1iaWVudExpZ2h0ICkge1xuXG5cdFx0XHRcdHIgKz0gY29sb3IuciAqIGludGVuc2l0eTtcblx0XHRcdFx0ZyArPSBjb2xvci5nICogaW50ZW5zaXR5O1xuXHRcdFx0XHRiICs9IGNvbG9yLmIgKiBpbnRlbnNpdHk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTtcblx0XHRcdFx0dW5pZm9ybXMucGVudW1icmFDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKiAoIDEgLSBsaWdodC5wZW51bWJyYSApICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0Ly8gKGEpIGludGVuc2l0eSBpcyB0aGUgdG90YWwgdmlzaWJsZSBsaWdodCBlbWl0dGVkXG5cdFx0XHRcdC8vdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5IC8gKCBsaWdodC53aWR0aCAqIGxpZ2h0LmhlaWdodCAqIE1hdGguUEkgKSApO1xuXG5cdFx0XHRcdC8vIChiKSBpbnRlbnNpdHkgaXMgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGxpZ2h0XG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRtYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cblx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/XG5cdFx0XHRcdC8vIHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dDYW1lcmFOZWFyID0gc2hhZG93LmNhbWVyYS5uZWFyO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXRyaXhbIHBvaW50TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHBvaW50TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2t5Q29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHN0YXRlLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFtYmllbnRbIDAgXSA9IHI7XG5cdFx0c3RhdGUuYW1iaWVudFsgMSBdID0gZztcblx0XHRzdGF0ZS5hbWJpZW50WyAyIF0gPSBiO1xuXG5cdFx0c3RhdGUuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdHN0YXRlLnJlY3RBcmVhLmxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdHN0YXRlLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoO1xuXHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdHN0YXRlLmhhc2ggPSBzdGF0ZS5pZCArICcsJyArIGRpcmVjdGlvbmFsTGVuZ3RoICsgJywnICsgcG9pbnRMZW5ndGggKyAnLCcgKyBzcG90TGVuZ3RoICsgJywnICsgcmVjdEFyZWFMZW5ndGggKyAnLCcgKyBoZW1pTGVuZ3RoICsgJywnICsgc2hhZG93cy5sZW5ndGg7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0c2V0dXA6IHNldHVwLFxuXHRcdHN0YXRlOiBzdGF0ZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlKCkge1xuXG5cdHZhciBsaWdodHMgPSBuZXcgV2ViR0xMaWdodHMoKTtcblxuXHR2YXIgbGlnaHRzQXJyYXkgPSBbXTtcblx0dmFyIHNoYWRvd3NBcnJheSA9IFtdO1xuXHR2YXIgc3ByaXRlc0FycmF5ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdGxpZ2h0c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c3ByaXRlc0FycmF5Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hMaWdodCggbGlnaHQgKSB7XG5cblx0XHRsaWdodHNBcnJheS5wdXNoKCBsaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU3ByaXRlKCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNwcml0ZXNBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cyggY2FtZXJhICkge1xuXG5cdFx0bGlnaHRzLnNldHVwKCBsaWdodHNBcnJheSwgc2hhZG93c0FycmF5LCBjYW1lcmEgKTtcblxuXHR9XG5cblx0dmFyIHN0YXRlID0ge1xuXHRcdGxpZ2h0c0FycmF5OiBsaWdodHNBcnJheSxcblx0XHRzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSxcblx0XHRzcHJpdGVzQXJyYXk6IHNwcml0ZXNBcnJheSxcblxuXHRcdGxpZ2h0czogbGlnaHRzXG5cdH07XG5cblx0cmV0dXJuIHtcblx0XHRpbml0OiBpbml0LFxuXHRcdHN0YXRlOiBzdGF0ZSxcblx0XHRzZXR1cExpZ2h0czogc2V0dXBMaWdodHMsXG5cblx0XHRwdXNoTGlnaHQ6IHB1c2hMaWdodCxcblx0XHRwdXNoU2hhZG93OiBwdXNoU2hhZG93LFxuXHRcdHB1c2hTcHJpdGU6IHB1c2hTcHJpdGVcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlcygpIHtcblxuXHR2YXIgcmVuZGVyU3RhdGVzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblxuXHRcdHZhciByZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlc1sgaGFzaCBdO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCk7XG5cdFx0XHRyZW5kZXJTdGF0ZXNbIGhhc2ggXSA9IHJlbmRlclN0YXRlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbmRlclN0YXRlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cmVuZGVyU3RhdGVzID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cHM6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERlcHRoTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICByZWZlcmVuY2VQb3NpdGlvbjogPGZsb2F0PixcbiAqICBuZWFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKiAgZmFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+XG4gKlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEaXN0YW5jZU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERpc3RhbmNlTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLm5lYXJEaXN0YW5jZSA9IDE7XG5cdHRoaXMuZmFyRGlzdGFuY2UgPSAxMDAwO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGlzdGFuY2VNYXRlcmlhbDtcblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdHRoaXMubmVhckRpc3RhbmNlID0gc291cmNlLm5lYXJEaXN0YW5jZTtcblx0dGhpcy5mYXJEaXN0YW5jZSA9IHNvdXJjZS5mYXJEaXN0YW5jZTtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0dmFyIF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksXG5cdFx0X21heFNoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMiggbWF4VGV4dHVyZVNpemUsIG1heFRleHR1cmVTaXplICksXG5cblx0XHRfbG9va1RhcmdldCA9IG5ldyBWZWN0b3IzKCksXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCksXG5cblx0XHRfTW9ycGhpbmdGbGFnID0gMSxcblx0XHRfU2tpbm5pbmdGbGFnID0gMixcblxuXHRcdF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLFxuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cblx0XHRfbWF0ZXJpYWxDYWNoZSA9IHt9O1xuXG5cdHZhciBzaGFkb3dTaWRlID0geyAwOiBCYWNrU2lkZSwgMTogRnJvbnRTaWRlLCAyOiBEb3VibGVTaWRlIH07XG5cblx0dmFyIGN1YmVEaXJlY3Rpb25zID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxuXHRdO1xuXG5cdHZhciBjdWJlVXBzID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKVxuXHRdO1xuXG5cdHZhciBjdWJlMkRWaWV3UG9ydHMgPSBbXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSxcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpXG5cdF07XG5cblx0Ly8gaW5pdFxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gX051bWJlck9mTWF0ZXJpYWxWYXJpYW50czsgKysgaSApIHtcblxuXHRcdHZhciB1c2VNb3JwaGluZyA9ICggaSAmIF9Nb3JwaGluZ0ZsYWcgKSAhPT0gMDtcblx0XHR2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7XG5cblx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRkZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdH0gKTtcblxuXHRcdF9kZXB0aE1hdGVyaWFsc1sgaSBdID0gZGVwdGhNYXRlcmlhbDtcblxuXHRcdC8vXG5cblx0XHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCgge1xuXG5cdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHR9ICk7XG5cblx0XHRfZGlzdGFuY2VNYXRlcmlhbHNbIGkgXSA9IGRpc3RhbmNlTWF0ZXJpYWw7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBsaWdodHMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gVE9ETyBDbGVhbiB1cCAobmVlZGVkIGluIGNhc2Ugb2YgY29udGV4dGxvc3QpXG5cdFx0dmFyIF9nbCA9IF9yZW5kZXJlci5jb250ZXh0O1xuXHRcdHZhciBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuZGlzYWJsZSggX2dsLkJMRU5EICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0X3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGRlcHRoIG1hcFxuXG5cdFx0dmFyIGZhY2VDb3VudDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBsaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblx0XHRcdHZhciBpc1BvaW50TGlnaHQgPSBsaWdodCAmJiBsaWdodC5pc1BvaW50TGlnaHQ7XG5cblx0XHRcdGlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd0NhbWVyYSA9IHNoYWRvdy5jYW1lcmE7XG5cblx0XHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNpemUueDtcblx0XHRcdFx0dmFyIHZwSGVpZ2h0ID0gX3NoYWRvd01hcFNpemUueTtcblxuXHRcdFx0XHQvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGVcblx0XHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyAgeHpYWlxuXHRcdFx0XHQvLyAgIHkgWVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxuXG5cdFx0XHRcdC8vIHBvc2l0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAwIF0uc2V0KCB2cFdpZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnggKj0gNC4wO1xuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArIFwiLnNoYWRvd01hcFwiO1xuXG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cuaXNTcG90TGlnaHRTaGFkb3cgKSB7XG5cblx0XHRcdFx0c2hhZG93LnVwZGF0ZSggbGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93TWFwID0gc2hhZG93Lm1hcDtcblx0XHRcdHZhciBzaGFkb3dNYXRyaXggPSBzaGFkb3cubWF0cml4O1xuXG5cdFx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDY7XG5cblx0XHRcdFx0Ly8gZm9yIHBvaW50IGxpZ2h0cyB3ZSBzZXQgdGhlIHNoYWRvdyBtYXRyaXggdG8gYmUgYSB0cmFuc2xhdGlvbi1vbmx5IG1hdHJpeFxuXHRcdFx0XHQvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9uXG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldvcmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDE7XG5cblx0XHRcdFx0X2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSBzaGFkb3cgbWF0cml4XG5cblx0XHRcdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjUsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xuXHRcdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cblx0XHRcdC8vIHJlbmRlciBzaGFkb3cgbWFwIGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21uaS1kaXJlY3Rpb25hbCkgb3Jcblx0XHRcdC8vIHJ1biBhIHNpbmdsZSBwYXNzIGlmIG5vdFxuXG5cdFx0XHRmb3IgKCB2YXIgZmFjZSA9IDA7IGZhY2UgPCBmYWNlQ291bnQ7IGZhY2UgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0XHRfbG9va1RhcmdldC5jb3B5KCBzaGFkb3dDYW1lcmEucG9zaXRpb24gKTtcblx0XHRcdFx0XHRfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXAuY29weSggY3ViZVVwc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdFx0XHRcdHZhciB2cERpbWVuc2lvbnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTtcblx0XHRcdFx0XHRfc3RhdGUudmlld3BvcnQoIHZwRGltZW5zaW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRcdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBzZXQgb2JqZWN0IG1hdHJpY2VzICYgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBsaWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYU5lYXIsIHNoYWRvd0NhbWVyYUZhciApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciByZXN1bHQgPSBudWxsO1xuXG5cdFx0dmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7XG5cdFx0dmFyIGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0bWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFscztcblx0XHRcdGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciB1c2VNb3JwaGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVzZVNraW5uaW5nID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmc7XG5cblx0XHRcdHZhciB2YXJpYW50SW5kZXggPSAwO1xuXG5cdFx0XHRpZiAoIHVzZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7XG5cdFx0XHRpZiAoIHVzZVNraW5uaW5nICkgdmFyaWFudEluZGV4IHw9IF9Ta2lubmluZ0ZsYWc7XG5cblx0XHRcdHJlc3VsdCA9IG1hdGVyaWFsVmFyaWFudHNbIHZhcmlhbnRJbmRleCBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlXG5cdFx0XHQvLyBhcHByb3ByaWF0ZSBzdGF0ZVxuXG5cdFx0XHR2YXIga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDtcblxuXHRcdFx0dmFyIG1hdGVyaWFsc0ZvclZhcmlhbnQgPSBfbWF0ZXJpYWxDYWNoZVsga2V5QSBdO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50ID0ge307XG5cdFx0XHRcdF9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7XG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52aXNpYmxlO1xuXHRcdHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7XG5cblx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cdFx0cmVzdWx0LmNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlc3VsdC5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTtcblx0XHRcdHJlc3VsdC5uZWFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdFx0cmVzdWx0LmZhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhRmFyO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgayBdO1xuXHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyICk7XG5cdFx0XHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIgKTtcblx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbkNhbnZhc1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNhbnZhc1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVyZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNwcml0ZVJlbmRlcmVyKCByZW5kZXJlciwgZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7XG5cdHZhciBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcztcblxuXHR2YXIgdGV4dHVyZTtcblxuXHQvLyBkZWNvbXBvc2UgbWF0cml4V29ybGRcblxuXHR2YXIgc3ByaXRlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc3ByaXRlU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDAuNSwgLSAwLjUsIDAsIDAsXG5cdFx0XHQgIDAuNSwgLSAwLjUsIDEsIDAsXG5cdFx0XHQgIDAuNSwgMC41LCAxLCAxLFxuXHRcdFx0LSAwLjUsIDAuNSwgMCwgMVxuXHRcdF0gKTtcblxuXHRcdHZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggW1xuXHRcdFx0MCwgMSwgMixcblx0XHRcdDAsIDIsIDNcblx0XHRdICk7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRlbGVtZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBmYWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKCk7XG5cblx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0cG9zaXRpb246IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAncG9zaXRpb24nICksXG5cdFx0XHR1djogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sICd1dicgKVxuXHRcdH07XG5cblx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdHV2T2Zmc2V0OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dk9mZnNldCcgKSxcblx0XHRcdHV2U2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2U2NhbGUnICksXG5cblx0XHRcdHJvdGF0aW9uOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdyb3RhdGlvbicgKSxcblx0XHRcdGNlbnRlcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY2VudGVyJyApLFxuXHRcdFx0c2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3NjYWxlJyApLFxuXG5cdFx0XHRjb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY29sb3InICksXG5cdFx0XHRtYXA6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21hcCcgKSxcblx0XHRcdG9wYWNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ29wYWNpdHknICksXG5cblx0XHRcdG1vZGVsVmlld01hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbW9kZWxWaWV3TWF0cml4JyApLFxuXHRcdFx0cHJvamVjdGlvbk1hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncHJvamVjdGlvbk1hdHJpeCcgKSxcblxuXHRcdFx0Zm9nVHlwZTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nVHlwZScgKSxcblx0XHRcdGZvZ0RlbnNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksXG5cdFx0XHRmb2dOZWFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dOZWFyJyApLFxuXHRcdFx0Zm9nRmFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dGYXInICksXG5cdFx0XHRmb2dDb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29sb3InICksXG5cdFx0XHRmb2dEZXB0aDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRGVwdGgnICksXG5cblx0XHRcdGFscGhhVGVzdDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnYWxwaGFUZXN0JyApXG5cdFx0fTtcblxuXHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRjYW52YXMud2lkdGggPSA4O1xuXHRcdGNhbnZhcy5oZWlnaHQgPSA4O1xuXG5cdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdGNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJztcblx0XHRjb250ZXh0LmZpbGxSZWN0KCAwLCAwLCA4LCA4ICk7XG5cblx0XHR0ZXh0dXJlID0gbmV3IENhbnZhc1RleHR1cmUoIGNhbnZhcyApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc3ByaXRlcywgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGlmICggc3ByaXRlcy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHQvLyBzZXR1cCBnbFxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGluaXQoKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnV2ICk7XG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdHN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy5wb3NpdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4LCBmYWxzZSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgKTtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XG5cdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5tYXAsIDAgKTtcblxuXHRcdHZhciBvbGRGb2dUeXBlID0gMDtcblx0XHR2YXIgc2NlbmVGb2dUeXBlID0gMDtcblx0XHR2YXIgZm9nID0gc2NlbmUuZm9nO1xuXG5cdFx0aWYgKCBmb2cgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuZm9nQ29sb3IsIGZvZy5jb2xvci5yLCBmb2cuY29sb3IuZywgZm9nLmNvbG9yLmIgKTtcblxuXHRcdFx0aWYgKCBmb2cuaXNGb2cgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dOZWFyLCBmb2cubmVhciApO1xuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApO1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gMTtcblx0XHRcdFx0c2NlbmVGb2dUeXBlID0gMTtcblxuXHRcdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0RlbnNpdHksIGZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAyICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSAyO1xuXHRcdFx0XHRzY2VuZUZvZ1R5cGUgPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDAgKTtcblx0XHRcdG9sZEZvZ1R5cGUgPSAwO1xuXHRcdFx0c2NlbmVGb2dUeXBlID0gMDtcblxuXHRcdH1cblxuXG5cdFx0Ly8gdXBkYXRlIHBvc2l0aW9ucyBhbmQgc29ydFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdO1xuXG5cdFx0XHRzcHJpdGUubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0c3ByaXRlLnogPSAtIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHNbIDE0IF07XG5cblx0XHR9XG5cblx0XHRzcHJpdGVzLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0XHQvLyByZW5kZXIgYWxsIHNwcml0ZXNcblxuXHRcdHZhciBzY2FsZSA9IFtdO1xuXHRcdHZhciBjZW50ZXIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IHNwcml0ZS5tYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC52aXNpYmxlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0XHRzcHJpdGUub25CZWZvcmVSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApO1xuXHRcdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4LCBmYWxzZSwgc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50cyApO1xuXG5cdFx0XHRzcHJpdGUubWF0cml4V29ybGQuZGVjb21wb3NlKCBzcHJpdGVQb3NpdGlvbiwgc3ByaXRlUm90YXRpb24sIHNwcml0ZVNjYWxlICk7XG5cblx0XHRcdHNjYWxlWyAwIF0gPSBzcHJpdGVTY2FsZS54O1xuXHRcdFx0c2NhbGVbIDEgXSA9IHNwcml0ZVNjYWxlLnk7XG5cblx0XHRcdGNlbnRlclsgMCBdID0gc3ByaXRlLmNlbnRlci54IC0gMC41O1xuXHRcdFx0Y2VudGVyWyAxIF0gPSBzcHJpdGUuY2VudGVyLnkgLSAwLjU7XG5cblx0XHRcdHZhciBmb2dUeXBlID0gMDtcblxuXHRcdFx0aWYgKCBzY2VuZS5mb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdGZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvbGRGb2dUeXBlICE9PSBmb2dUeXBlICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgZm9nVHlwZSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gZm9nVHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCBtYXRlcmlhbC5tYXAub2Zmc2V0LngsIG1hdGVyaWFsLm1hcC5vZmZzZXQueSApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIG1hdGVyaWFsLm1hcC5yZXBlYXQueCwgbWF0ZXJpYWwubWFwLnJlcGVhdC55ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgMCwgMCApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIDEsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLm9wYWNpdHksIG1hdGVyaWFsLm9wYWNpdHkgKTtcblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuY29sb3IsIG1hdGVyaWFsLmNvbG9yLnIsIG1hdGVyaWFsLmNvbG9yLmcsIG1hdGVyaWFsLmNvbG9yLmIgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgbWF0ZXJpYWwucm90YXRpb24gKTtcblx0XHRcdGdsLnVuaWZvcm0yZnYoIHVuaWZvcm1zLmNlbnRlciwgY2VudGVyICk7XG5cdFx0XHRnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTtcblxuXHRcdFx0c3RhdGUuc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCBtYXRlcmlhbC5tYXAgfHwgdGV4dHVyZSwgMCApO1xuXG5cdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXHRcdFx0c3ByaXRlLm9uQWZ0ZXJSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgZ2xcblxuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRzdGF0ZS5yZXNldCgpO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbSgpIHtcblxuXHRcdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0dmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApO1xuXHRcdHZhciBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVSICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBjYXBhYmlsaXRpZXMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgJ1Nwcml0ZU1hdGVyaWFsJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgcm90YXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgY2VudGVyOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHNjYWxlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2T2Zmc2V0OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2U2NhbGU7JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0J3ZhcnlpbmcgdmVjMiB2VVY7Jyxcblx0XHRcdCd2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoOycsXG5cblx0XHRcdCd2b2lkIG1haW4oKSB7JyxcblxuXHRcdFx0J1x0dlVWID0gdXZPZmZzZXQgKyB1diAqIHV2U2NhbGU7JyxcblxuXHRcdFx0J1x0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uIC0gY2VudGVyICkgKiBzY2FsZTsnLFxuXG5cdFx0XHQnXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLFxuXHRcdFx0J1x0cm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsXG5cdFx0XHQnXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7JyxcblxuXHRcdFx0J1x0dmVjNCBtdlBvc2l0aW9uOycsXG5cblx0XHRcdCdcdG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsnLFxuXHRcdFx0J1x0bXZQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247JyxcblxuXHRcdFx0J1x0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsnLFxuXG5cdFx0XHQnXHRmb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OycsXG5cblx0XHRcdCd9J1xuXG5cdFx0XS5qb2luKCAnXFxuJyApICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIGZyYWdtZW50U2hhZGVyLCBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIGNhcGFiaWxpdGllcy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLFxuXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBzYW1wbGVyMkQgbWFwOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBvcGFjaXR5OycsXG5cblx0XHRcdCd1bmlmb3JtIGludCBmb2dUeXBlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dOZWFyOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dGYXI7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsnLFxuXG5cdFx0XHQndmFyeWluZyB2ZWMyIHZVVjsnLFxuXHRcdFx0J3ZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7JyxcblxuXHRcdFx0J3ZvaWQgbWFpbigpIHsnLFxuXG5cdFx0XHQnXHR2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7JyxcblxuXHRcdFx0J1x0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IgKiB0ZXh0dXJlLnh5eiwgdGV4dHVyZS5hICogb3BhY2l0eSApOycsXG5cblx0XHRcdCdcdGlmICggZ2xfRnJhZ0NvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkOycsXG5cblx0XHRcdCdcdGlmICggZm9nVHlwZSA+IDAgKSB7JyxcblxuXHRcdFx0J1x0XHRmbG9hdCBmb2dGYWN0b3IgPSAwLjA7JyxcblxuXHRcdFx0J1x0XHRpZiAoIGZvZ1R5cGUgPT0gMSApIHsnLFxuXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApOycsXG5cblx0XHRcdCdcdFx0fSBlbHNlIHsnLFxuXG5cdFx0XHQnXHRcdFx0Y29uc3QgZmxvYXQgTE9HMiA9IDEuNDQyNjk1OycsXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICk7Jyxcblx0XHRcdCdcdFx0XHRmb2dGYWN0b3IgPSAxLjAgLSBjbGFtcCggZm9nRmFjdG9yLCAwLjAsIDEuMCApOycsXG5cblx0XHRcdCdcdFx0fScsXG5cblx0XHRcdCdcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOycsXG5cblx0XHRcdCdcdH0nLFxuXG5cdFx0XHQnfSdcblxuXHRcdF0uam9pbiggJ1xcbicgKSApO1xuXG5cdFx0Z2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApO1xuXG5cdFx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRcdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdFx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gYi5pZCAtIGEuaWQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgdXRpbHMgKSB7XG5cblx0ZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRcdHZhciBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCggMCwgMCwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBjb2xvck1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBjb2xvck1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCByLCBnLCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRyICo9IGE7IGcgKj0gYTsgYiAqPSBhO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2xvci5zZXQoIHIsIGcsIGIsIGEgKTtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvckNsZWFyLmVxdWFscyggY29sb3IgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhckNvbG9yKCByLCBnLCBiLCBhICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuY29weSggY29sb3IgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLnNldCggLSAxLCAwLCAwLCAwICk7IC8vIHNldCB0byBpbnZhbGlkIHN0YXRlXG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcblx0XHR2YXIgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0aWYgKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0XHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBkZXB0aE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5kZXB0aE1hc2soIGRlcHRoTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdGlmICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5ORVZFUiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HUkVBVEVSICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIHN0ZW5jaWxUZXN0ICkge1xuXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgXHQhPT0gc3RlbmNpbFJlZiBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGYWlsXHQgIT09IHN0ZW5jaWxGYWlsIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhclN0ZW5jaWwoIHN0ZW5jaWwgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0dmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XG5cdHZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTtcblxuXHR2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XG5cdHZhciBuZXdBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGF0dHJpYnV0ZURpdmlzb3JzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblxuXHR2YXIgY2FwYWJpbGl0aWVzID0ge307XG5cblx0dmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcblxuXHR2YXIgY3VycmVudEJsZW5kaW5nID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcblxuXHR2YXIgY3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdHZhciBjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50TGluZVdpZHRoID0gbnVsbDtcblxuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXG5cdHZhciBsaW5lV2lkdGhBdmFpbGFibGUgPSBmYWxzZTtcblx0dmFyIHZlcnNpb24gPSAwO1xuXHR2YXIgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5WRVJTSU9OICk7XG5cblx0aWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7XG5cblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTFxcIChbMC05XSkvLmV4ZWMoIGdsVmVyc2lvbiApWyAxIF0gKTtcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMS4wICk7XG5cblx0fSBlbHNlIGlmICggZ2xWZXJzaW9uLmluZGV4T2YoICdPcGVuR0wgRVMnICkgIT09IC0gMSApIHtcblxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXk9wZW5HTFxcIEVTXFwgKFswLTldKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAyLjAgKTtcblxuXHR9XG5cblx0dmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdHZhciBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xuXG5cdHZhciBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCk7XG5cdHZhciBjdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoIHR5cGUsIHRhcmdldCwgY291bnQgKSB7XG5cblx0XHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVsdCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuXG5cdFx0dmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHR2YXIgZW1wdHlUZXh0dXJlcyA9IHt9O1xuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFXzJELCAxICk7XG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfQ1VCRV9NQVAgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiApO1xuXG5cdC8vIGluaXRcblxuXHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xuXHRkZXB0aEJ1ZmZlci5zZXRDbGVhciggMSApO1xuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XG5cblx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XG5cblx0c2V0RmxpcFNpZGVkKCBmYWxzZSApO1xuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XG5cdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXHRzZXRCbGVuZGluZyggTm9ybWFsQmxlbmRpbmcgKTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IDAgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgMCApO1xuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdFx0ZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2wuZW5hYmxlKCBpZCApO1xuXHRcdFx0Y2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmRpc2FibGUoIGlkICk7XG5cdFx0XHRjYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkge1xuXG5cdFx0aWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IFtdO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApICkge1xuXG5cdFx0XHRcdHZhciBmb3JtYXRzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLnB1c2goIGZvcm1hdHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cztcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXNlUHJvZ3JhbSggcHJvZ3JhbSApIHtcblxuXHRcdGlmICggY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0gKSB7XG5cblx0XHRcdGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdFx0Y3VycmVudFByb2dyYW0gPSBwcm9ncmFtO1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVuZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRTcmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gTm9CbGVuZGluZyApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nICkge1xuXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7XG5cblx0XHRcdFx0c3dpdGNoICggYmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XG5cblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XG5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcblxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiwgZ2wuWkVSTywgZ2wuU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IgKTtcblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XG5cdFx0XHRibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNyYztcblx0XHRcdGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0O1xuXG5cdFx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcblxuXHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kRXF1YXRpb24gKSwgdXRpbHMuY29udmVydCggYmxlbmRFcXVhdGlvbkFscGhhICkgKTtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XG5cblx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRHN0ICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjQWxwaGEgKSwgdXRpbHMuY29udmVydCggYmxlbmREc3RBbHBoYSApICk7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICkge1xuXG5cdFx0bWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZVxuXHRcdFx0PyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKVxuXHRcdFx0OiBlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0dmFyIGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XG5cblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xuXG5cdFx0bWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWVcblx0XHRcdD8gc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhIClcblx0XHRcdDogc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcblxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xuXHRcdGRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRzZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApIHtcblxuXHRcdGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkge1xuXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIGdsLkNXICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2UgKSB7XG5cblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRcdGlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSApIHtcblxuXHRcdFx0XHRpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuQkFDSyApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUZyb250ICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVF9BTkRfQkFDSyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHR9XG5cblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHtcblxuXHRcdGlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7XG5cblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xuXG5cdFx0XHRjdXJyZW50TGluZVdpZHRoID0gd2lkdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XG5cblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5pdHMgKSB7XG5cblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xuXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyB0ZXh0dXJlXG5cblx0ZnVuY3Rpb24gYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICkge1xuXG5cdFx0aWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcblxuXHRcdFx0Z2wuYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICk7XG5cdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ID09PSBudWxsICkge1xuXG5cdFx0XHRhY3RpdmVUZXh0dXJlKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdO1xuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0Y3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdID0gYm91bmRUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzWyB3ZWJnbFR5cGUgXSApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0XHRjdXJyZW50UHJvZ3JhbSA9IG51bGw7XG5cblx0XHRjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yLFxuXHRcdGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcyxcblx0XHRlbmFibGU6IGVuYWJsZSxcblx0XHRkaXNhYmxlOiBkaXNhYmxlLFxuXHRcdGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czogZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLFxuXG5cdFx0dXNlUHJvZ3JhbTogdXNlUHJvZ3JhbSxcblxuXHRcdHNldEJsZW5kaW5nOiBzZXRCbGVuZGluZyxcblx0XHRzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsXG5cblx0XHRzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCxcblx0XHRzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsXG5cblx0XHRzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCxcblx0XHRzZXRQb2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LFxuXG5cdFx0c2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LFxuXG5cdFx0YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSxcblx0XHRiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsXG5cdFx0Y29tcHJlc3NlZFRleEltYWdlMkQ6IGNvbXByZXNzZWRUZXhJbWFnZTJELFxuXHRcdHRleEltYWdlMkQ6IHRleEltYWdlMkQsXG5cblx0XHRzY2lzc29yOiBzY2lzc29yLFxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcblxuXHRcdHJlc2V0OiByZXNldFxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKSB7XG5cblx0dmFyIF9pc1dlYkdMMiA9ICggdHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgIT09ICd1bmRlZmluZWQnICYmIF9nbCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKTsgLyogZ2xvYmFsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKi9cblx0dmFyIF92aWRlb1RleHR1cmVzID0ge307XG5cdHZhciBfY2FudmFzO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gY2xhbXBUb01heFNpemUoIGltYWdlLCBtYXhTaXplICkge1xuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2lsbCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2Vcblx0XHRcdC8vIHByZW11bHRpcGxpZWQgYWxwaGEuXG5cblx0XHRcdHZhciBzY2FsZSA9IG1heFNpemUgLyBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogc2NhbGUgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7XG5cblx0XHRyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG1ha2VQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApIHtcblxuXHRcdFx0aWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSBfY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cblx0XHRcdF9jYW52YXMud2lkdGggPSBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIGltYWdlLndpZHRoICk7XG5cdFx0XHRfY2FudmFzLmhlaWdodCA9IF9NYXRoLmZsb29yUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIF9jYW52YXMud2lkdGgsIF9jYW52YXMuaGVpZ2h0ICk7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIG5vdCBwb3dlciBvZiB0d28gKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBfY2FudmFzLndpZHRoICsgJ3gnICsgX2NhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBfY2FudmFzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkge1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3byApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd28gJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdC8vIE5vdGU6IE1hdGgubG9nKCB4ICkgKiBNYXRoLkxPRzJFIHVzZWQgaW5zdGVhZCBvZiBNYXRoLmxvZzIoIHggKSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFMTFcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gTWF0aC5sb2coIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSAqIE1hdGguTE9HMkU7XG5cblx0fVxuXG5cdC8vIEZhbGxiYWNrIGZpbHRlcnMgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG5cblx0ZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7XG5cblx0XHRpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0cmV0dXJuIF9nbC5ORUFSRVNUO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9nbC5MSU5FQVI7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkge1xuXG5cdFx0XHRkZWxldGUgX3ZpZGVvVGV4dHVyZXNbIHRleHR1cmUuaWQgXTtcblxuXHRcdH1cblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblJlbmRlclRhcmdldERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0Ly8gY3ViZSB0ZXh0dXJlXG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAyRCB0ZXh0dXJlXG5cblx0XHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgYWxsIHdlYmdsIHByb3BlcnRpZXNcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdGlmICggISByZW5kZXJUYXJnZXQgKSByZXR1cm47XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTtcblxuXHRcdH1cblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTtcblxuXHR9XG5cblx0Ly9cblxuXG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xuXG5cdFx0XHRpZiAoIGltYWdlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5kZWZpbmVkJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbWFnZS5jb21wbGV0ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZScsIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0XHRpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblxuXHRcdFx0XHR2YXIgaXNDb21wcmVzc2VkID0gKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApO1xuXHRcdFx0XHR2YXIgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XG5cblx0XHRcdFx0dmFyIGN1YmVJbWFnZSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZVsgaSBdLCBjYXBhYmlsaXRpZXMubWF4Q3ViZW1hcFNpemUgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gaXNEYXRhVGV4dHVyZSA/IHRleHR1cmUuaW1hZ2VbIGkgXS5pbWFnZSA6IHRleHR1cmUuaW1hZ2VbIGkgXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0sXG5cdFx0XHRcdFx0aXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0XHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IGN1YmVJbWFnZVsgaSBdLm1pcG1hcHM7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBtaXBtYXBzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpJyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIHtcblxuXHRcdFx0XHRcdC8vIFdlIGFzc3VtZSBpbWFnZXMgZm9yIGN1YmUgbWFwIGhhdmUgdGhlIHNhbWUgc2l6ZS5cblx0XHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwUyApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwVCApICk7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdXRpbHMuY29udmVydCggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicsIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7XG5cdFx0XHRcdHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPSB0cnVlO1xuXG5cdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cblx0XHR2YXIgaW1hZ2UgPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bvd2VyT2ZUd28oIGltYWdlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpbWFnZSA9IG1ha2VQb3dlck9mVHdvKCBpbWFnZSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHQvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YVxuXG5cdFx0XHR2YXIgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdGlmICggISBfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoICdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyApO1xuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQzMkY7XG5cblx0XHRcdH0gZWxzZSBpZiAoIF9pc1dlYkdMMiApIHtcblxuXHRcdFx0XHQvLyBXZWJHTCAyLjAgcmVxdWlyZXMgc2lnbmVkIGludGVybmFsZm9ybWF0IGZvciBnbFRleEltYWdlMkRcblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMTY7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5ERVBUSF9DT01QT05FTlQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX0NPTVBPTkVOVCBhbmQgdHlwZSBpcyBub3QgVU5TSUdORURfU0hPUlQgb3IgVU5TSUdORURfSU5UXG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRTaG9ydFR5cGUgJiYgdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhfU1RFTkNJTCBpbnRlcm5hbCBmb3JtYXRcblx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLlxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHJlZ3VsYXIgVGV4dHVyZSAoaW1hZ2UsIHZpZGVvLCBjYW52YXMpXG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApICkge1xuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHRzdGF0ZS50ZXhJbWFnZTJEKCB0ZXh0dXJlVGFyZ2V0LCAwLCBnbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9DT01QT05FTlQxNiwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRoICFzdGVuY2lsXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLlJHQkE0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTtcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggISBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR2YXIgd2ViZ2xEZXB0aFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQnICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFNldHVwIEdMIHJlc291cmNlcyBmb3IgYSBub24tdGV4dHVyZSBkZXB0aCBidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycgKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldFxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cdFx0dmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvLyBTZXR1cCBmcmFtZWJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJEICk7XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHR2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIHtcblxuXHRcdFx0dmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7XG5cdFx0XHR2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0dmFyIGlkID0gdGV4dHVyZS5pZDtcblx0XHR2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxuXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlc1sgaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdF92aWRlb1RleHR1cmVzWyBpZCBdID0gZnJhbWU7XG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYztcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdGhlc3BpdGUgLyBodHRwOi8vd3d3LnR3aXR0ZXIuY29tL3RoZXNwaXRlXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xVdGlscyggZ2wsIGV4dGVuc2lvbnMgKSB7XG5cblx0ZnVuY3Rpb24gY29udmVydCggcCApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIGdsLlJFUEVBVDtcblx0XHRpZiAoIHAgPT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gZ2wuQ0xBTVBfVE9fRURHRTtcblx0XHRpZiAoIHAgPT09IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gZ2wuTUlSUk9SRURfUkVQRUFUO1xuXG5cdFx0aWYgKCBwID09PSBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVI7XG5cblx0XHRpZiAoIHAgPT09IExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVI7XG5cdFx0aWYgKCBwID09PSBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9CWVRFO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTU1MVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiBnbC5CWVRFO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIGdsLlNIT1JUO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBJbnRUeXBlICkgcmV0dXJuIGdsLklOVDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9JTlQ7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVybiBnbC5BTFBIQTtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7XG5cdFx0aWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIGdsLlJHQkE7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFO1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfQ09NUE9ORU5UO1xuXHRcdGlmICggcCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgcmV0dXJuIGdsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRpZiAoIHAgPT09IEFkZEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfQUREO1xuXHRcdGlmICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX1NVQlRSQUNUO1xuXHRcdGlmICggcCA9PT0gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19SRVZFUlNFX1NVQlRSQUNUO1xuXG5cdFx0aWYgKCBwID09PSBaZXJvRmFjdG9yICkgcmV0dXJuIGdsLlpFUk87XG5cdFx0aWYgKCBwID09PSBPbmVGYWN0b3IgKSByZXR1cm4gZ2wuT05FO1xuXHRcdGlmICggcCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNDb2xvckZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuRFNUX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNEc3RBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfRFNUX0FMUEhBO1xuXG5cdFx0aWYgKCBwID09PSBEc3RDb2xvckZhY3RvciApIHJldHVybiBnbC5EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIGdsLlNSQ19BTFBIQV9TQVRVUkFURTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtcblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfOHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBNaW5FcXVhdGlvbiB8fCBwID09PSBNYXhFcXVhdGlvbiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NSU5fRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NQVhfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uVU5TSUdORURfSU5UXzI0XzhfV0VCR0w7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gMDtcblxuXHR9XG5cblx0cmV0dXJuIHsgY29udmVydDogY29udmVydCB9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgZ3JlZ2dtYW4gLyBodHRwOi8vZ2FtZXMuZ3JlZ2dtYW4uY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuXHR0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVkID8gZm92IDogNTA7XG5cdHRoaXMuem9vbSA9IDE7XG5cblx0dGhpcy5uZWFyID0gbmVhciAhPT0gdW5kZWZpbmVkID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSBmYXIgIT09IHVuZGVmaW5lZCA/IGZhciA6IDIwMDA7XG5cdHRoaXMuZm9jdXMgPSAxMDtcblxuXHR0aGlzLmFzcGVjdCA9IGFzcGVjdCAhPT0gdW5kZWZpbmVkID8gYXNwZWN0IDogMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmZpbG1HYXVnZSA9IDM1O1x0Ly8gd2lkdGggb2YgdGhlIGZpbG0gKGRlZmF1bHQgaW4gbWlsbGltZXRlcnMpXG5cdHRoaXMuZmlsbU9mZnNldCA9IDA7XHQvLyBob3Jpem9udGFsIGZpbG0gb2Zmc2V0IChzYW1lIHVuaXQgYXMgZ2F1Z2UpXG5cblx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbn1cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLFxuXG5cdGlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdENhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5mb3YgPSBzb3VyY2UuZm92O1xuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xuXG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXHRcdHRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7XG5cblx0XHR0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHR0aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7XG5cdFx0dGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBGT1YgYnkgZm9jYWwgbGVuZ3RoIGluIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgLmZpbG1HYXVnZS5cblx0ICpcblx0ICogVGhlIGRlZmF1bHQgZmlsbSBnYXVnZSBpcyAzNSwgc28gdGhhdCB0aGUgZm9jYWwgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZm9yXG5cdCAqIGEgMzVtbSAoZnVsbCBmcmFtZSkgY2FtZXJhLlxuXHQgKlxuXHQgKiBWYWx1ZXMgZm9yIGZvY2FsIGxlbmd0aCBhbmQgZmlsbSBnYXVnZSBtdXN0IGhhdmUgdGhlIHNhbWUgdW5pdC5cblx0ICovXG5cdHNldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoICkge1xuXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XG5cblx0XHR0aGlzLmZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLlxuXHQgKi9cblx0Z2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7XG5cblx0XHRyZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7XG5cblx0fSxcblxuXHRnZXRFZmZlY3RpdmVGT1Y6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbihcblx0XHRcdE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIHZhciB3ID0gMTkyMDtcblx0ICogICB2YXIgaCA9IDEwODA7XG5cdCAqICAgdmFyIGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIHZhciBmdWxsSGVpZ2h0ID0gaCAqIDI7XG5cdCAqXG5cdCAqICAgLS1BLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUMtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1ELS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRS0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUYtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7XG5cdCAqXG5cdCAqICAgTm90ZSB0aGVyZSBpcyBubyByZWFzb24gbW9uaXRvcnMgaGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIG9yIGluIGEgZ3JpZC5cblx0ICovXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG5lYXIgPSB0aGlzLm5lYXIsXG5cdFx0XHR0b3AgPSBuZWFyICogTWF0aC50YW4oXG5cdFx0XHRcdF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLFxuXHRcdFx0aGVpZ2h0ID0gMiAqIHRvcCxcblx0XHRcdHdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsXG5cdFx0XHRsZWZ0ID0gLSAwLjUgKiB3aWR0aCxcblx0XHRcdHZpZXcgPSB0aGlzLnZpZXc7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcblxuXHRcdFx0dmFyIGZ1bGxXaWR0aCA9IHZpZXcuZnVsbFdpZHRoLFxuXHRcdFx0XHRmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0dG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cdFx0XHR3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0aGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDtcblxuXHRcdH1cblxuXHRcdHZhciBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcblxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXJyYXlDYW1lcmEoIGFycmF5ICkge1xuXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTtcblxufVxuXG5BcnJheUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBcnJheUNhbWVyYSxcblxuXHRpc0FycmF5Q2FtZXJhOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYlZSTWFuYWdlciggcmVuZGVyZXIgKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgZGV2aWNlID0gbnVsbDtcblx0dmFyIGZyYW1lRGF0YSA9IG51bGw7XG5cblx0dmFyIHBvc2VUYXJnZXQgPSBudWxsO1xuXG5cdHZhciBzdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBzdGFuZGluZ01hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1ZSRnJhbWVEYXRhJyBpbiB3aW5kb3cgKSB7XG5cblx0XHRmcmFtZURhdGEgPSBuZXcgd2luZG93LlZSRnJhbWVEYXRhKCk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlLCBmYWxzZSApO1xuXG5cdH1cblxuXHR2YXIgbWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIHRlbXBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5ib3VuZHMgPSBuZXcgVmVjdG9yNCggMC4wLCAwLjAsIDAuNSwgMS4wICk7XG5cdGNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXG5cdHZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYVIuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuNSwgMC4wLCAwLjUsIDEuMCApO1xuXHRjYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHR2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJhTCwgY2FtZXJhUiBdICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaXNQcmVzZW50aW5nKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZSAhPT0gbnVsbCAmJiBkZXZpY2UuaXNQcmVzZW50aW5nID09PSB0cnVlO1xuXG5cdH1cblxuXHR2YXIgY3VycmVudFNpemUsIGN1cnJlbnRQaXhlbFJhdGlvO1xuXG5cdGZ1bmN0aW9uIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSgpIHtcblxuXHRcdGlmICggaXNQcmVzZW50aW5nKCkgKSB7XG5cblx0XHRcdHZhciBleWVQYXJhbWV0ZXJzID0gZGV2aWNlLmdldEV5ZVBhcmFtZXRlcnMoICdsZWZ0JyApO1xuXHRcdFx0dmFyIHJlbmRlcldpZHRoID0gZXllUGFyYW1ldGVycy5yZW5kZXJXaWR0aDtcblx0XHRcdHZhciByZW5kZXJIZWlnaHQgPSBleWVQYXJhbWV0ZXJzLnJlbmRlckhlaWdodDtcblxuXHRcdFx0Y3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XG5cdFx0XHRjdXJyZW50U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcblxuXHRcdFx0cmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIHJlbmRlcldpZHRoICogMiwgcmVuZGVySGVpZ2h0LCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBzY29wZS5lbmFibGVkICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggY3VycmVudFNpemUud2lkdGgsIGN1cnJlbnRTaXplLmhlaWdodCwgY3VycmVudFBpeGVsUmF0aW8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblx0dGhpcy51c2VySGVpZ2h0ID0gMS42O1xuXG5cdHRoaXMuZ2V0RGV2aWNlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RGV2aWNlID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIGRldmljZSA9IHZhbHVlO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQb3NlVGFyZ2V0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgcG9zZVRhcmdldCA9IG9iamVjdDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIGRldmljZSA9PT0gbnVsbCApIHJldHVybiBjYW1lcmE7XG5cblx0XHRkZXZpY2UuZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0ZGV2aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGRldmljZS5nZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBzdGFnZVBhcmFtZXRlcnMgPSBkZXZpY2Uuc3RhZ2VQYXJhbWV0ZXJzO1xuXG5cdFx0aWYgKCBzdGFnZVBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdHN0YW5kaW5nTWF0cml4LmZyb21BcnJheSggc3RhZ2VQYXJhbWV0ZXJzLnNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGFuZGluZ01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIDAsIHNjb3BlLnVzZXJIZWlnaHQsIDAgKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIHBvc2UgPSBmcmFtZURhdGEucG9zZTtcblx0XHR2YXIgcG9zZU9iamVjdCA9IHBvc2VUYXJnZXQgIT09IG51bGwgPyBwb3NlVGFyZ2V0IDogY2FtZXJhO1xuXG5cdFx0Ly8gV2Ugd2FudCB0byBtYW5pcHVsYXRlIHBvc2VPYmplY3QgYnkgaXRzIHBvc2l0aW9uIGFuZCBxdWF0ZXJuaW9uIGNvbXBvbmVudHMgc2luY2UgdXNlcnMgbWF5IHJlbHkgb24gdGhlbS5cblx0XHRwb3NlT2JqZWN0Lm1hdHJpeC5jb3B5KCBzdGFuZGluZ01hdHJpeCApO1xuXHRcdHBvc2VPYmplY3QubWF0cml4LmRlY29tcG9zZSggcG9zZU9iamVjdC5wb3NpdGlvbiwgcG9zZU9iamVjdC5xdWF0ZXJuaW9uLCBwb3NlT2JqZWN0LnNjYWxlICk7XG5cblx0XHRpZiAoIHBvc2Uub3JpZW50YXRpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRlbXBRdWF0ZXJuaW9uLmZyb21BcnJheSggcG9zZS5vcmllbnRhdGlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5xdWF0ZXJuaW9uLm11bHRpcGx5KCB0ZW1wUXVhdGVybmlvbiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0ZW1wUXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIHN0YW5kaW5nTWF0cml4ICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uZnJvbUFycmF5KCBwb3NlLnBvc2l0aW9uICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uYXBwbHlRdWF0ZXJuaW9uKCB0ZW1wUXVhdGVybmlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5wb3NpdGlvbi5hZGQoIHRlbXBQb3NpdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cG9zZU9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCBkZXZpY2UuaXNQcmVzZW50aW5nID09PSBmYWxzZSApIHJldHVybiBjYW1lcmE7XG5cblx0XHQvL1xuXG5cdFx0Y2FtZXJhTC5uZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0Y2FtZXJhUi5uZWFyID0gY2FtZXJhLm5lYXI7XG5cblx0XHRjYW1lcmFMLmZhciA9IGNhbWVyYS5mYXI7XG5cdFx0Y2FtZXJhUi5mYXIgPSBjYW1lcmEuZmFyO1xuXG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLmxlZnRWaWV3TWF0cml4ICk7XG5cdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7XG5cblx0XHQvLyBUT0RPIChtcmRvb2IpIERvdWJsZSBjaGVjayB0aGlzIGNvZGVcblxuXHRcdHN0YW5kaW5nTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBzdGFuZGluZ01hdHJpeCApO1xuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFuZGluZ01hdHJpeEludmVyc2UgKTtcblxuXHRcdHZhciBwYXJlbnQgPSBwb3NlT2JqZWN0LnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRtYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdH1cblxuXHRcdC8vIGVudk1hcCBhbmQgTWlycm9yIG5lZWRzIGNhbWVyYS5tYXRyaXhXb3JsZFxuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0UHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIEhBQ0sgKG1yZG9vYilcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL3dlYnZyL2lzc3Vlcy8yMDNcblxuXHRcdGNhbWVyYVZSLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGxheWVycyA9IGRldmljZS5nZXRMYXllcnMoKTtcblxuXHRcdGlmICggbGF5ZXJzLmxlbmd0aCApIHtcblxuXHRcdFx0dmFyIGxheWVyID0gbGF5ZXJzWyAwIF07XG5cblx0XHRcdGlmICggbGF5ZXIubGVmdEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5sZWZ0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFMLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLmxlZnRCb3VuZHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGxheWVyLnJpZ2h0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLnJpZ2h0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFSLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLnJpZ2h0Qm91bmRzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBjYW1lcmFWUjtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U3RhbmRpbmdNYXRyaXggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gc3RhbmRpbmdNYXRyaXg7XG5cblx0fTtcblxuXHR0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBpc1ByZXNlbnRpbmcoKSApIGRldmljZS5zdWJtaXRGcmFtZSgpO1xuXG5cdH07XG5cblx0dGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlICk7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlcmVyKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcicsIFJFVklTSU9OICk7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0dmFyIF9jYW52YXMgPSBwYXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jYW52YXMgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKSxcblx0XHRfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCxcblxuXHRcdF9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSxcblx0XHRfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSxcblx0XHRfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSxcblx0XHRfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsXG5cdFx0X3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsXG5cdFx0X3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlLFxuXHRcdF9wb3dlclByZWZlcmVuY2UgPSBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgOiAnZGVmYXVsdCc7XG5cblx0dmFyIGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0Ly8gcHVibGljIHByb3BlcnRpZXNcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBfY2FudmFzO1xuXHR0aGlzLmNvbnRleHQgPSBudWxsO1xuXG5cdC8vIGNsZWFyaW5nXG5cblx0dGhpcy5hdXRvQ2xlYXIgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJEZXB0aCA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XG5cblx0Ly8gc2NlbmUgZ3JhcGhcblxuXHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcblxuXHQvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmdcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gW107XG5cdHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHQvLyBwaHlzaWNhbGx5IGJhc2VkIHNoYWRpbmdcblxuXHR0aGlzLmdhbW1hRmFjdG9yID0gMi4wO1x0Ly8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdHRoaXMuZ2FtbWFJbnB1dCA9IGZhbHNlO1xuXHR0aGlzLmdhbW1hT3V0cHV0ID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWwgbGlnaHRzXG5cblx0dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA9IGZhbHNlO1xuXG5cdC8vIHRvbmUgbWFwcGluZ1xuXG5cdHRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXHR0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCA9IDEuMDtcblxuXHQvLyBtb3JwaHNcblxuXHR0aGlzLm1heE1vcnBoVGFyZ2V0cyA9IDg7XG5cdHRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDtcblxuXHQvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzXG5cblx0dmFyIF90aGlzID0gdGhpcyxcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gZmFsc2UsXG5cblx0XHQvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZVxuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsLFxuXHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsLFxuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMSxcblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnLFxuXG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsLFxuXHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsLFxuXG5cdFx0X2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSxcblx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbCxcblxuXHRcdC8vXG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDAsXG5cblx0XHQvL1xuXG5cdFx0X3dpZHRoID0gX2NhbnZhcy53aWR0aCxcblx0XHRfaGVpZ2h0ID0gX2NhbnZhcy5oZWlnaHQsXG5cblx0XHRfcGl4ZWxSYXRpbyA9IDEsXG5cblx0XHRfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3JUZXN0ID0gZmFsc2UsXG5cblx0XHQvLyBmcnVzdHVtXG5cblx0XHRfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cblx0XHQvLyBjbGlwcGluZ1xuXG5cdFx0X2NsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSxcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cblx0XHQvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGVcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxO1xuXG5cdH1cblxuXHQvLyBpbml0aWFsaXplXG5cblx0dmFyIF9nbDtcblxuXHR0cnkge1xuXG5cdFx0dmFyIGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuXHRcdFx0YWxwaGE6IF9hbHBoYSxcblx0XHRcdGRlcHRoOiBfZGVwdGgsXG5cdFx0XHRzdGVuY2lsOiBfc3RlbmNpbCxcblx0XHRcdGFudGlhbGlhczogX2FudGlhbGlhcyxcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogX3ByZW11bHRpcGxpZWRBbHBoYSxcblx0XHRcdHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcixcblx0XHRcdHBvd2VyUHJlZmVyZW5jZTogX3Bvd2VyUHJlZmVyZW5jZVxuXHRcdH07XG5cblx0XHQvLyBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBXZWJHTCBjb250ZXh0IGlzIGNyZWF0ZWQsIHNlZSAjMTI3NTNcblxuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdF9nbCA9IF9jb250ZXh0IHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKSB8fCBfY2FudmFzLmdldENvbnRleHQoICdleHBlcmltZW50YWwtd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApO1xuXG5cdFx0aWYgKCBfZ2wgPT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnICkgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFNvbWUgZXhwZXJpbWVudGFsLXdlYmdsIGltcGxlbWVudGF0aW9ucyBkbyBub3QgaGF2ZSBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXRcblxuXHRcdGlmICggX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB7ICdyYW5nZU1pbic6IDEsICdyYW5nZU1heCc6IDEsICdwcmVjaXNpb24nOiAxIH07XG5cblx0XHRcdH07XG5cblx0XHR9XG5cblx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBlcnJvci5tZXNzYWdlICk7XG5cblx0fVxuXG5cdHZhciBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMsIHN0YXRlLCBpbmZvO1xuXHR2YXIgcHJvcGVydGllcywgdGV4dHVyZXMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7XG5cdHZhciBwcm9ncmFtQ2FjaGUsIHJlbmRlckxpc3RzLCByZW5kZXJTdGF0ZXM7XG5cblx0dmFyIGJhY2tncm91bmQsIG1vcnBodGFyZ2V0cywgYnVmZmVyUmVuZGVyZXIsIGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcblx0dmFyIHNwcml0ZVJlbmRlcmVyO1xuXG5cdHZhciB1dGlscztcblxuXHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xuXG5cdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHR1dGlscyA9IG5ldyBXZWJHTFV0aWxzKCBfZ2wsIGV4dGVuc2lvbnMgKTtcblxuXHRcdGNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggX2dsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICk7XG5cblx0XHRzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCBfZ2wsIGV4dGVuc2lvbnMsIHV0aWxzICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0aW5mbyA9IG5ldyBXZWJHTEluZm8oIF9nbCApO1xuXHRcdHByb3BlcnRpZXMgPSBuZXcgV2ViR0xQcm9wZXJ0aWVzKCk7XG5cdFx0dGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApO1xuXHRcdGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wgKTtcblx0XHRnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2dsLCBhdHRyaWJ1dGVzLCBpbmZvICk7XG5cdFx0b2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKTtcblx0XHRtb3JwaHRhcmdldHMgPSBuZXcgV2ViR0xNb3JwaHRhcmdldHMoIF9nbCApO1xuXHRcdHByb2dyYW1DYWNoZSA9IG5ldyBXZWJHTFByb2dyYW1zKCBfdGhpcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cdFx0cmVuZGVyTGlzdHMgPSBuZXcgV2ViR0xSZW5kZXJMaXN0cygpO1xuXHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWJHTFJlbmRlclN0YXRlcygpO1xuXG5cdFx0YmFja2dyb3VuZCA9IG5ldyBXZWJHTEJhY2tncm91bmQoIF90aGlzLCBzdGF0ZSwgZ2VvbWV0cmllcywgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdFx0YnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvICk7XG5cdFx0aW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8gKTtcblxuXHRcdHNwcml0ZVJlbmRlcmVyID0gbmV3IFdlYkdMU3ByaXRlUmVuZGVyZXIoIF90aGlzLCBfZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICk7XG5cblx0XHRpbmZvLnByb2dyYW1zID0gcHJvZ3JhbUNhY2hlLnByb2dyYW1zO1xuXG5cdFx0X3RoaXMuY29udGV4dCA9IF9nbDtcblx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdFx0X3RoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcblx0XHRfdGhpcy5zdGF0ZSA9IHN0YXRlO1xuXHRcdF90aGlzLmluZm8gPSBpbmZvO1xuXG5cdH1cblxuXHRpbml0R0xDb250ZXh0KCk7XG5cblx0Ly8gdnJcblxuXHR2YXIgdnIgPSBuZXcgV2ViVlJNYW5hZ2VyKCBfdGhpcyApO1xuXG5cdHRoaXMudnIgPSB2cjtcblxuXHQvLyBzaGFkb3cgbWFwXG5cblx0dmFyIHNoYWRvd01hcCA9IG5ldyBXZWJHTFNoYWRvd01hcCggX3RoaXMsIG9iamVjdHMsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xuXG5cdHRoaXMuc2hhZG93TWFwID0gc2hhZG93TWFwO1xuXG5cdC8vIEFQSVxuXG5cdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2w7XG5cblx0fTtcblxuXHR0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ucmVzdG9yZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfcGl4ZWxSYXRpbztcblxuXHR9O1xuXG5cdHRoaXMuc2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5zZXRTaXplKCBfd2lkdGgsIF9oZWlnaHQsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IF93aWR0aCxcblx0XHRcdGhlaWdodDogX2hlaWdodFxuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkge1xuXG5cdFx0dmFyIGRldmljZSA9IHZyLmdldERldmljZSgpO1xuXG5cdFx0aWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuXFwndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBfcGl4ZWxSYXRpbztcblxuXHRcdGlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHRfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuXHRcdFx0X2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogX3dpZHRoICogX3BpeGVsUmF0aW8sXG5cdFx0XHRoZWlnaHQ6IF9oZWlnaHQgKiBfcGl4ZWxSYXRpb1xuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkge1xuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9waXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcblxuXHRcdF9jYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRWaWV3cG9ydDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfdmlld3BvcnQuc2V0KCB4LCBfaGVpZ2h0IC0geSAtIGhlaWdodCwgd2lkdGgsIGhlaWdodCApO1xuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfc2Npc3Nvci5zZXQoIHgsIF9oZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApO1xuXG5cdH07XG5cblx0Ly8gQ2xlYXJpbmdcblxuXHR0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckFscGhhLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSBfZ2wuREVQVEhfQlVGRkVSX0JJVDtcblx0XHRpZiAoIHN0ZW5jaWwgPT09IHVuZGVmaW5lZCB8fCBzdGVuY2lsICkgYml0cyB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuXG5cdFx0X2dsLmNsZWFyKCBiaXRzICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCB0cnVlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgZmFsc2UsIHRydWUgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHRoaXMuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG5cdH07XG5cblx0Ly9cblxuXHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7XG5cblx0XHRyZW5kZXJMaXN0cy5kaXNwb3NlKCk7XG5cdFx0cmVuZGVyU3RhdGVzLmRpc3Bvc2UoKTtcblx0XHRwcm9wZXJ0aWVzLmRpc3Bvc2UoKTtcblx0XHRvYmplY3RzLmRpc3Bvc2UoKTtcblxuXHRcdHZyLmRpc3Bvc2UoKTtcblxuXHRcdHN0b3BBbmltYXRpb24oKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcblxuXHRcdGluaXRHTENvbnRleHQoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0bWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHQvLyBCdWZmZXIgZGVhbGxvY2F0aW9uXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcblxuXHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHtcblxuXHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW07XG5cblx0XHRtYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCBwcm9ncmFtSW5mbyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciByZW5kZXJpbmdcblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRvYmplY3QucmVuZGVyKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkge1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24sIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoICEgbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCAmJlxuXHRcdFx0XHQhIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgJiZcblx0XHRcdFx0ISBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3QuY291bnQgKiAzOyBpIDwgbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gb2JqZWN0Lm5vcm1hbEFycmF5O1xuXG5cdFx0XHRcdFx0dmFyIG54ID0gKCBhcnJheVsgaSArIDAgXSArIGFycmF5WyBpICsgMyBdICsgYXJyYXlbIGkgKyA2IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG55ID0gKCBhcnJheVsgaSArIDEgXSArIGFycmF5WyBpICsgNCBdICsgYXJyYXlbIGkgKyA3IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG56ID0gKCBhcnJheVsgaSArIDIgXSArIGFycmF5WyBpICsgNSBdICsgYXJyYXlbIGkgKyA4IF0gKSAvIDM7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDAgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgMSBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAyIF0gPSBuejtcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgMyBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA0IF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDUgXSA9IG56O1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA2IF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDcgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgOCBdID0gbno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3Qubm9ybWFsQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMudXYgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QudXZBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmIG1hdGVyaWFsLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLmNvbG9yICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LmNvbG9yQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRfZ2wuZHJhd0FycmF5cyggX2dsLlRSSUFOR0xFUywgMCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHRvYmplY3QuY291bnQgPSAwO1xuXG5cdH07XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cdFx0dmFyIGdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5LmlkICsgJ18nICsgcHJvZ3JhbS5pZCArICdfJyArICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHR2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeVByb2dyYW0gIT09IF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtICkge1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5UHJvZ3JhbTtcblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzICkge1xuXG5cdFx0XHRtb3JwaHRhcmdldHMudXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApO1xuXG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciByYW5nZUZhY3RvciA9IDE7XG5cblx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0aW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcblx0XHRcdHJhbmdlRmFjdG9yID0gMjtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGU7XG5cdFx0dmFyIHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSB7XG5cblx0XHRcdHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXR0cmlidXRlLmJ1ZmZlciApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGRhdGFDb3VudCA9IEluZmluaXR5O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YUNvdW50ID0gaW5kZXguY291bnQ7XG5cblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBwb3NpdGlvbi5jb3VudDtcblxuXHRcdH1cblxuXHRcdHZhciByYW5nZVN0YXJ0ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7XG5cdFx0dmFyIHJhbmdlQ291bnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2UuY291bnQgKiByYW5nZUZhY3RvcjtcblxuXHRcdHZhciBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yIDogMDtcblx0XHR2YXIgZ3JvdXBDb3VudCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuY291bnQgKiByYW5nZUZhY3RvciA6IEluZmluaXR5O1xuXG5cdFx0dmFyIGRyYXdTdGFydCA9IE1hdGgubWF4KCByYW5nZVN0YXJ0LCBncm91cFN0YXJ0ICk7XG5cdFx0dmFyIGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7XG5cblx0XHR2YXIgZHJhd0NvdW50ID0gTWF0aC5tYXgoIDAsIGRyYXdFbmQgLSBkcmF3U3RhcnQgKyAxICk7XG5cblx0XHRpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN3aXRjaCAoIG9iamVjdC5kcmF3TW9kZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVzRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX1NUUklQICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVGYW5EcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9GQU4gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgbGluZVdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExpbmUqTWF0ZXJpYWxcblxuXHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVMb29wICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX0xPT1AgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9TVFJJUCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA+IDAgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBkcmF3U3RhcnQsIGRyYXdDb3VudCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKSB7XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7XG5cdFx0XHRcdFx0dmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZS5idWZmZXI7XG5cdFx0XHRcdFx0dmFyIHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblx0XHRcdFx0XHR2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlLmJ5dGVzUGVyRWxlbWVudDtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhO1xuXHRcdFx0XHRcdFx0dmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0dmFyIG9mZnNldCA9IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldDtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIG9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHR9XG5cblx0Ly8gQ29tcGlsZVxuXG5cdHRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHQvLyBBbmltYXRpb24gTG9vcFxuXG5cdHZhciBpc0FuaW1hdGluZyA9IGZhbHNlO1xuXHR2YXIgb25BbmltYXRpb25GcmFtZSA9IG51bGw7XG5cblx0ZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oKSB7XG5cblx0XHRpZiAoIGlzQW5pbWF0aW5nICkgcmV0dXJuO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdFx0aXNBbmltYXRpbmcgPSB0cnVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzdG9wQW5pbWF0aW9uKCkge1xuXG5cdFx0aXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpIHtcblxuXHRcdHZhciBkZXZpY2UgPSB2ci5nZXREZXZpY2UoKTtcblxuXHRcdGlmICggZGV2aWNlICYmIGRldmljZS5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdGRldmljZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYW5pbWF0aW9uTG9vcCggdGltZSApIHtcblxuXHRcdGlmICggaXNBbmltYXRpbmcgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSggdGltZSApO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdH1cblxuXHR0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSA9IGNhbGxiYWNrO1xuXHRcdG9uQW5pbWF0aW9uRnJhbWUgIT09IG51bGwgPyBzdGFydEFuaW1hdGlvbigpIDogc3RvcEFuaW1hdGlvbigpO1xuXG5cdH07XG5cblx0Ly8gUmVuZGVyaW5nXG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHtcblxuXHRcdGlmICggISAoIGNhbWVyYSAmJiBjYW1lcmEuaXNDYW1lcmEgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIF9pc0NvbnRleHRMb3N0ICkgcmV0dXJuO1xuXG5cdFx0Ly8gcmVzZXQgY2FjaGluZyBmb3IgdGhpcyBmcmFtZVxuXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7XG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRpZiAoIHNjZW5lLmF1dG9VcGRhdGUgPT09IHRydWUgKSBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Ly8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1bVxuXG5cdFx0aWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRpZiAoIHZyLmVuYWJsZWQgKSB7XG5cblx0XHRcdGNhbWVyYSA9IHZyLmdldENhbWVyYSggY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCk7XG5cblx0XHRzY2VuZS5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDtcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gX2NsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTtcblxuXHRcdHByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIF90aGlzLnNvcnRPYmplY3RzICk7XG5cblx0XHRpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkge1xuXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5zb3J0KCk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHRzaGFkb3dNYXAucmVuZGVyKCBzaGFkb3dzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cyggY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuZW5kU2hhZG93cygpO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCApIHRoaXMuaW5mby5yZXNldCgpO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdC8vXG5cblx0XHRiYWNrZ3JvdW5kLnJlbmRlciggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKTtcblxuXHRcdC8vIHJlbmRlciBzY2VuZVxuXG5cdFx0dmFyIG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XG5cdFx0dmFyIHRyYW5zcGFyZW50T2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zcGFyZW50O1xuXG5cdFx0aWYgKCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsICkge1xuXG5cdFx0XHR2YXIgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7XG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9wYXF1ZSBwYXNzIChmcm9udC10by1iYWNrIG9yZGVyKVxuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0XHQvLyB0cmFuc3BhcmVudCBwYXNzIChiYWNrLXRvLWZyb250IG9yZGVyKVxuXG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSByZW5kZXJlcnNcblxuXHRcdHZhciBzcHJpdGVzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc3ByaXRlc0FycmF5O1xuXG5cdFx0c3ByaXRlUmVuZGVyZXIucmVuZGVyKCBzcHJpdGVzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdC8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAgZmlsdGVyaW5nXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSBkZXB0aCBidWZmZXIgd3JpdGluZyBpcyBlbmFibGVkIHNvIGl0IGNhbiBiZSBjbGVhcmVkIG9uIG5leHQgcmVuZGVyXG5cblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTtcblxuXHRcdHN0YXRlLnNldFBvbHlnb25PZmZzZXQoIGZhbHNlICk7XG5cblx0XHRzY2VuZS5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0aWYgKCB2ci5lbmFibGVkICkge1xuXG5cdFx0XHR2ci5zdWJtaXRGcmFtZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gX2dsLmZpbmlzaCgpO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0fTtcblxuXHQvKlxuXHQvLyBUT0RPIER1cGxpY2F0ZWQgY29kZSAoRnJ1c3R1bSlcblxuXHR2YXIgX3NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRmdW5jdGlvbiBpc09iamVjdFZpZXdhYmxlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLlxuXHRcdGFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Nwcml0ZVZpZXdhYmxlKCBzcHJpdGUgKSB7XG5cblx0XHRfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRfc3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1NwaGVyZVZpZXdhYmxlKCBzcGhlcmUgKSB7XG5cblx0XHRpZiAoICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbnVtUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblxuXHRcdGlmICggbnVtUGxhbmVzID09PSAwICkgcmV0dXJuIHRydWU7XG5cblx0XHR2YXIgcGxhbmVzID0gX3RoaXMuY2xpcHBpbmdQbGFuZXMsXG5cblx0XHRcdGNlbnRlciA9IHNwaGVyZS5jZW50ZXIsXG5cdFx0XHRuZWdSYWQgPSAtIHNwaGVyZS5yYWRpdXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gb3V0IHdoZW4gZGVlcGVyIHRoYW4gcmFkaXVzIGluIHRoZSBuZWdhdGl2ZSBoYWxmc3BhY2Vcblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKSA8IG5lZ1JhZCApIHJldHVybiBmYWxzZTtcblxuXHRcdH0gd2hpbGUgKCArKyBpICE9PSBudW1QbGFuZXMgKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblx0Ki9cblxuXHRmdW5jdGlvbiBwcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc29ydE9iamVjdHMgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNwcml0ZSggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwgb2JqZWN0Lm1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwcm9qZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNvcnRPYmplY3RzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdO1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHR2YXIgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwO1xuXG5cdFx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkge1xuXG5cdFx0XHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0dmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYW1lcmEyID0gY2FtZXJhc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYTIubGF5ZXJzICkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kcztcblxuXHRcdFx0XHRcdFx0dmFyIHggPSBib3VuZHMueCAqIF93aWR0aDtcblx0XHRcdFx0XHRcdHZhciB5ID0gYm91bmRzLnkgKiBfaGVpZ2h0O1xuXHRcdFx0XHRcdFx0dmFyIHdpZHRoID0gYm91bmRzLnogKiBfd2lkdGg7XG5cdFx0XHRcdFx0XHR2YXIgaGVpZ2h0ID0gYm91bmRzLncgKiBfaGVpZ2h0O1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGw7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLmZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZS5mb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHByb2dyYW1DYWNoZS5nZXRQYXJhbWV0ZXJzKFxuXHRcdFx0bWF0ZXJpYWwsIGxpZ2h0cy5zdGF0ZSwgc2hhZG93c0FycmF5LCBmb2csIF9jbGlwcGluZy5udW1QbGFuZXMsIF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sIG9iamVjdCApO1xuXG5cdFx0dmFyIGNvZGUgPSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNvZGUoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtO1xuXHRcdHZhciBwcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHByb2dyYW0uY29kZSAhPT0gY29kZSApIHtcblxuXHRcdFx0Ly8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnNcblx0XHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdHByb3BlcnRpZXMudXBkYXRlKCBtYXRlcmlhbCwgJ2xpZ2h0c0hhc2gnLCBsaWdodHMuc3RhdGUuaGFzaCApO1xuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBzYW1lIGdsc2wgYW5kIHVuaWZvcm0gbGlzdFxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdFxuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtQ2hhbmdlICkge1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XG5cblx0XHRcdFx0dmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1ldGVycy5zaGFkZXJJRCBdO1xuXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIgPSB7XG5cdFx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBzaGFkZXIudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogbWF0ZXJpYWwudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlclxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZSggbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciwgX3RoaXMgKTtcblxuXHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbSggbWF0ZXJpYWwsIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKTtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHRcdFx0bWF0ZXJpYWwucHJvZ3JhbSA9IHByb2dyYW07XG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoVGFyZ2V0JyArIGkgXSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoTm9ybWFsczsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhOb3JtYWwnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiZcblx0XHRcdCEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbjtcblx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLnVuaWZvcm07XG5cblx0XHR9XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZm9nID0gZm9nO1xuXG5cdFx0Ly8gc3RvcmUgdGhlIGxpZ2h0IHNldHVwIGl0IHdhcyBjcmVhdGVkIGZvclxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggPSBsaWdodHMuc3RhdGUuaGFzaDtcblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsO1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDtcblx0XHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuaGVtaTtcblxuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXRyaXg7XG5cdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogYWRkIGFyZWEgbGlnaHRzIHNoYWRvdyBpbmZvIHRvIHVuaWZvcm1zXG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ1VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdHVuaWZvcm1zTGlzdCA9XG5cdFx0XHRcdFdlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlKCBwcm9nVW5pZm9ybXMuc2VxLCB1bmlmb3JtcyApO1xuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKSB7XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDA7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0dmFyIHVzZUNhY2hlID1cblx0XHRcdFx0XHRjYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYmXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDtcblxuXHRcdFx0XHQvLyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdHcm91cFxuXHRcdFx0XHQvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZVxuXHRcdFx0XHQvLyAoIzg0NjUsICM4Mzc5KVxuXHRcdFx0XHRfY2xpcHBpbmcuc2V0U3RhdGUoXG5cdFx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsIG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sIG1hdGVyaWFsLmNsaXBTaGFkb3dzLFxuXHRcdFx0XHRcdGNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHQoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gX2NsaXBwaW5nLm51bVBsYW5lcyB8fFxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uICkgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApO1xuXHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTWF0ZXJpYWwgPSBmYWxzZTtcblx0XHR2YXIgcmVmcmVzaExpZ2h0cyA9IGZhbHNlO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSxcblx0XHRcdHBfdW5pZm9ybXMgPSBwcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHRtX3VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlci51bmlmb3JtcztcblxuXHRcdGlmICggc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICkgKSB7XG5cblx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJpYWxJZCApIHtcblxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7XG5cblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hQcm9ncmFtIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLFxuXHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdm9pZCB1bm5lZWRlZCB1bmlmb3JtIHVwZGF0ZXMgcGVyIEFycmF5Q2FtZXJhJ3Mgc3ViLWNhbWVyYVxuXG5cdFx0XHRpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICkgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRDYW1lcmEgPSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0XHRcdFx0Ly8gbGlnaHRpbmcgdW5pZm9ybXMgZGVwZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGVcblx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cblx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxuXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxuXHRcdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcdFx0Ly8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmVcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cdFx0XHQvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0XHR2YXIgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLFxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3ZpZXdNYXRyaXgnLCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nIHVuaWZvcm1zIG11c3QgYmUgc2V0IGV2ZW4gaWYgbWF0ZXJpYWwgZGlkbid0IGNoYW5nZVxuXHRcdC8vIGF1dG8tc2V0dGluZyBvZiB0ZXh0dXJlIHVuaXQgZm9yIGJvbmUgdGV4dHVyZSBtdXN0IGdvIGJlZm9yZSBvdGhlciB0ZXh0dXJlc1xuXHRcdC8vIG5vdCBzdXJlIHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0aGluZ3MgaGFwcGVuXG5cblx0XHRpZiAoIG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXgnICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXhJbnZlcnNlJyApO1xuXG5cdFx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cblx0XHRcdGlmICggc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKVxuXHRcdFx0XHRcdFx0Ly8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KVxuXHRcdFx0XHRcdFx0Ly8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBib25lcyAqIDQgcGl4ZWxzID0gICg4ICogOClcblx0XHRcdFx0XHRcdC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpXG5cdFx0XHRcdFx0XHQvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IGJvbmVzICogNCBwaXhlbHMgPSAoNjQgKiA2NClcblxuXG5cdFx0XHRcdFx0XHR2YXIgc2l6ZSA9IE1hdGguc3FydCggYm9uZXMubGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4XG5cdFx0XHRcdFx0XHRzaXplID0gX01hdGguY2VpbFBvd2VyT2ZUd28oIHNpemUgKTtcblx0XHRcdFx0XHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXG5cdFx0XHRcdFx0XHRib25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlc1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cdFx0XHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSApO1xuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlU2l6ZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIHNrZWxldG9uLCAnYm9uZU1hdHJpY2VzJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ1doaXRlUG9pbnQnLCBfdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5saWdodHMgKSB7XG5cblx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWlyZXMgbGlnaHRpbmcgaW5mb1xuXG5cdFx0XHRcdC8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHlcblx0XHRcdFx0Ly8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRoZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpclxuXHRcdFx0XHQvLyB2YWx1ZXNcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNldFxuXHRcdFx0XHQvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZFxuXG5cdFx0XHRcdG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCBtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0ZvZyggbV91bmlmb3JtcywgZm9nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEZXB0aCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNMaW5lQmFzaWNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0bV91bmlmb3Jtcy5jb2xvci52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdFx0XHRtX3VuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZVxuXHRcdFx0Ly8gVE9ETyAobXJkb29iKTogRmluZCBhIG5pY2VyIGltcGxlbWVudGF0aW9uXG5cblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNfMSAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMS52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18xO1xuXHRcdFx0aWYgKCBtX3VuaWZvcm1zLmx0Y18yICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y18yLnZhbHVlID0gVW5pZm9ybXNMaWIuTFRDXzI7XG5cblx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgbWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApO1xuXHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBVbmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDtcblxuXHRcdFx0Ly8gZG9uJ3QgZmxpcCBDdWJlVGV4dHVyZSBlbnZNYXBzLCBmbGlwIGV2ZXJ5dGhpbmcgZWxzZTpcblx0XHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUgd2lsbCBiZSBmbGlwcGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIHdpbGwgYmUgZmxpcHBlZCBiZWNhdXNlIGl0J3MgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdFx0Ly8gdGhpcyBjaGVjayBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIG9yIHJlbW92ZWQgZW50aXJlbHksIGlmIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB1c2VzIGEgQ3ViZVRleHR1cmUgaW4gdGhlIGZ1dHVyZVxuXHRcdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggISAoIG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSApICkgPyAxIDogLSAxO1xuXG5cdFx0XHR1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0aXZpdHk7XG5cdFx0XHR1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHRcdHVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsLmVudk1hcCApLl9fbWF4TWlwTGV2ZWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYW9NYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFvTWFwLnZhbHVlID0gbWF0ZXJpYWwuYW9NYXA7XG5cdFx0XHR1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gc3BlY3VsYXIgbWFwXG5cdFx0Ly8gMy4gbm9ybWFsIG1hcFxuXHRcdC8vIDQuIGJ1bXAgbWFwXG5cdFx0Ly8gNS4gYWxwaGEgbWFwXG5cdFx0Ly8gNi4gZW1pc3NpdmUgbWFwXG5cblx0XHR2YXIgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5idW1wTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdGlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41O1xuXG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXI7XG5cdFx0dW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5yb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3M7XG5cdFx0dW5pZm9ybXMubWV0YWxuZXNzLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLnJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHQvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblx0XHRcdHVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdDtcblx0XHR1bmlmb3Jtcy5jbGVhckNvYXRSb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdFx0dW5pZm9ybXMubmVhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwubmVhckRpc3RhbmNlO1xuXHRcdHVuaWZvcm1zLmZhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwuZmFyRGlzdGFuY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLlxuXG5cdGZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3JtcywgdmFsdWUgKSB7XG5cblx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0Ly8gVGV4dHVyZXNcblxuXHRmdW5jdGlvbiBhbGxvY1RleHR1cmVVbml0KCkge1xuXG5cdFx0dmFyIHRleHR1cmVVbml0ID0gX3VzZWRUZXh0dXJlVW5pdHM7XG5cblx0XHRpZiAoIHRleHR1cmVVbml0ID49IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICk7XG5cblx0XHR9XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyArPSAxO1xuXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xuXG5cdH1cblxuXHR0aGlzLmFsbG9jVGV4dHVyZVVuaXQgPSBhbGxvY1RleHR1cmVVbml0O1xuXG5cdC8vIHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNldFRleHR1cmUyRCA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUgaXMgZGVwcmVjYXRlZCwgdXNlIHNldFRleHR1cmUyRCBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3VycmVudGx5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSBpcyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0XHQvLyBUT0RPOiB1bmlmeSB0aGVzZSBjb2RlIHBhdGhzXG5cdFx0XHRpZiAoICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB8fFxuXHRcdFx0XHQoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApICkge1xuXG5cdFx0XHRcdC8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZlIEFycmF5IGluIGltYWdlIDovXG5cblx0XHRcdFx0Ly8gdGhpcyBmdW5jdGlvbiBhbG9uZSBzaG91bGQgdGFrZSBjYXJlIG9mIGN1YmUgdGV4dHVyZXNcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBhc3N1bWVkOiB0ZXh0dXJlIHByb3BlcnR5IG9mIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZVxuXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuZ2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgJiYgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBudWxsO1xuXHRcdHZhciBpc0N1YmUgPSBmYWxzZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgX193ZWJnbEZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSBdO1xuXHRcdFx0XHRpc0N1YmUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfY3VycmVudEZyYW1lYnVmZmVyICE9PSBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQgKTtcblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IgKTtcblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApO1xuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHJlbmRlclRhcmdldC5hY3RpdmVNaXBNYXBMZXZlbCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciApIHtcblxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgcmVzdG9yZSA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIGZyYW1lYnVmZmVyICE9PSBfY3VycmVudEZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHRyZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cdFx0XHRcdHZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7XG5cdFx0XHRcdHZhciB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKVxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gRmxvYXRUeXBlICYmICggZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKSB8fCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSApICkgJiYgLy8gQ2hyb21lIE1hYyA+PSA1MiBhbmQgRmlyZWZveFxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBfZ2wuRlJBTUVCVUZGRVIgKSA9PT0gX2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxuXG5cdFx0XHRcdFx0aWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHtcblxuXHRcdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSwgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSwgYnVmZmVyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhlbHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBmaW5hbGx5IHtcblxuXHRcdFx0XHRpZiAoIHJlc3RvcmUgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9jdXJyZW50RnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgdGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSB0ZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSB0ZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0dGhpcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTtcblxuXHRcdF9nbC5jb3B5VGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIGdsRm9ybWF0LCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCAwICk7XG5cblx0fTtcblxuXHR0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSBzcmNUZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLmZvcm1hdCApO1xuXHRcdHZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcblx0XHR2YXIgcGl4ZWxzID0gc3JjVGV4dHVyZS5pc0RhdGFUZXh0dXJlID8gc3JjVGV4dHVyZS5pbWFnZS5kYXRhIDogc3JjVGV4dHVyZS5pbWFnZTtcblxuXHRcdHRoaXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7XG5cblx0XHRfZ2wudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIHBpeGVscyApO1xuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb2dFeHAyKCBjb2xvciwgZGVuc2l0eSApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHR0aGlzLmRlbnNpdHkgPSAoIGRlbnNpdHkgIT09IHVuZGVmaW5lZCApID8gZGVuc2l0eSA6IDAuMDAwMjU7XG5cbn1cblxuRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTtcblxuRm9nRXhwMi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLmRlbnNpdHkgKTtcblxufTtcblxuRm9nRXhwMi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZ0V4cDInLFxuXHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdGRlbnNpdHk6IHRoaXMuZGVuc2l0eVxuXHR9O1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZyggY29sb3IsIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwO1xuXG59XG5cbkZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlO1xuXG5Gb2cucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cbn07XG5cbkZvZy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZycsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0bmVhcjogdGhpcy5uZWFyLFxuXHRcdGZhcjogdGhpcy5mYXJcblx0fTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNjZW5lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2NlbmUnO1xuXG5cdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cdHRoaXMuZm9nID0gbnVsbDtcblx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlOyAvLyBjaGVja2VkIGJ5IHRoZSByZW5kZXJlclxuXG59XG5cblNjZW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNjZW5lLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuYmFja2dyb3VuZCAhPT0gbnVsbCApIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cgPSBzb3VyY2UuZm9nLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0aWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICpcdHV2T2Zmc2V0OiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuICpcdHV2U2NhbGU6IG5ldyBUSFJFRS5WZWN0b3IyKClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ByaXRlTWF0ZXJpYWw7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZSc7XG5cblx0dGhpcy5tYXRlcmlhbCA9ICggbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwgOiBuZXcgU3ByaXRlTWF0ZXJpYWwoKTtcblxuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApO1xuXG59XG5cblNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcHJpdGUsXG5cblx0aXNTcHJpdGU6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB3b3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgd29ybGRTY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR3b3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5Y2FzdGVyLnJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCB3b3JsZFBvc2l0aW9uLCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHR3b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dmFyIGd1ZXNzU2l6ZVNxID0gd29ybGRTY2FsZS54ICogd29ybGRTY2FsZS55IC8gNDtcblxuXHRcdFx0aWYgKCB3b3JsZFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1cm47XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMT0QoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMT0QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0bGV2ZWxzOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IFtdXG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuTE9ELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExPRCxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHtcblxuXHRcdGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0O1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0bWF0cml4UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7XG5cblx0XHRcdHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGRpc3RhbmNlID0gdjEuZGlzdGFuY2VUbyggdjIgKTtcblxuXHRcdFx0XHRsZXZlbHNbIDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgLSAxIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmxldmVscyA9IFtdO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHRkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgge1xuXHRcdFx0XHRvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLFxuXHRcdFx0XHRkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2Vcblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIFNrZWxldG9uKCBib25lcywgYm9uZUludmVyc2VzICkge1xuXG5cdC8vIGNvcHkgdGhlIGJvbmUgYXJyYXlcblxuXHRib25lcyA9IGJvbmVzIHx8IFtdO1xuXG5cdHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApO1xuXHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuYm9uZXMubGVuZ3RoICogMTYgKTtcblxuXHQvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBpbnZlcnNlc1xuXG5cdGlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggdGhpcy5ib25lcy5sZW5ndGggPT09IGJvbmVJbnZlcnNlcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBTa2VsZXRvbi5wcm90b3R5cGUsIHtcblxuXHRjYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRcdGlmICggdGhpcy5ib25lc1sgaSBdICkge1xuXG5cdFx0XHRcdGludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmUsIGksIGlsO1xuXG5cdFx0Ly8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvZmZzZXRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBpZGVudGl0eU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdFx0dmFyIGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xuXHRcdFx0dmFyIGJvbmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzO1xuXHRcdFx0dmFyIGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTtcblxuXHRcdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHQvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybVxuXG5cdFx0XHRcdHZhciBtYXRyaXggPSBib25lc1sgaSBdID8gYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IGlkZW50aXR5TWF0cml4O1xuXG5cdFx0XHRcdG9mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7XG5cdFx0XHRcdG9mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYm9uZVRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgU2tlbGV0b24oIHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzICk7XG5cblx0fSxcblxuXHRnZXRCb25lQnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gQm9uZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JvbmUnO1xuXG59XG5cbkJvbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQm9uZSxcblxuXHRpc0JvbmU6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdTa2lubmVkTWVzaCc7XG5cblx0dGhpcy5iaW5kTW9kZSA9ICdhdHRhY2hlZCc7XG5cdHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHZhciBib25lcyA9IHRoaXMuaW5pdEJvbmVzKCk7XG5cdHZhciBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbiggYm9uZXMgKTtcblxuXHR0aGlzLmJpbmQoIHNrZWxldG9uLCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0dGhpcy5ub3JtYWxpemVTa2luV2VpZ2h0cygpO1xuXG59XG5cblNraW5uZWRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2tpbm5lZE1lc2gsXG5cblx0aXNTa2lubmVkTWVzaDogdHJ1ZSxcblxuXHRpbml0Qm9uZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lcyA9IFtdLCBib25lLCBnYm9uZTtcblx0XHR2YXIgaSwgaWw7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBmaXJzdCwgY3JlYXRlIGFycmF5IG9mICdCb25lJyBvYmplY3RzIGZyb20gZ2VvbWV0cnkgZGF0YVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdC8vIGNyZWF0ZSBuZXcgJ0JvbmUnIG9iamVjdFxuXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXHRcdFx0XHRib25lcy5wdXNoKCBib25lICk7XG5cblx0XHRcdFx0Ly8gYXBwbHkgdmFsdWVzXG5cblx0XHRcdFx0Ym9uZS5uYW1lID0gZ2JvbmUubmFtZTtcblx0XHRcdFx0Ym9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBvcyApO1xuXHRcdFx0XHRib25lLnF1YXRlcm5pb24uZnJvbUFycmF5KCBnYm9uZS5yb3RxICk7XG5cdFx0XHRcdGlmICggZ2JvbmUuc2NsICE9PSB1bmRlZmluZWQgKSBib25lLnNjYWxlLmZyb21BcnJheSggZ2JvbmUuc2NsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2Vjb25kLCBjcmVhdGUgYm9uZSBoaWVyYXJjaHlcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAhPT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgYm9uZXMgaW4gdGhlIGhpZXJhcmNoeVxuXG5cdFx0XHRcdFx0Ym9uZXNbIGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB0b3Btb3N0IGJvbmUsIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgc2tpbm5lZCBtZXNoXG5cblx0XHRcdFx0XHR0aGlzLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbm93IHRoZSBib25lcyBhcmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5kIGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1lc2guXG5cdFx0Ly8gbGV0J3MgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpY2VzXG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gYm9uZXM7XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkge1xuXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNrZWxldG9uO1xuXG5cdFx0aWYgKCBiaW5kTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdFx0XHRiaW5kTWF0cml4ID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdH1cblxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBiaW5kTWF0cml4ICk7XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBvc2UoKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2NhbGUsIGk7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHN3Lm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0c3cubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdFx0dmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTtcblx0XHRcdFx0dmVjLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTtcblx0XHRcdFx0dmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHZlYy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dmVjLnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlYy54LCB2ZWMueSwgdmVjLnosIHZlYy53ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2F0dGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICogIGxpbmVjYXA6IFwicm91bmRcIixcbiAqICBsaW5lam9pbjogXCJyb3VuZFwiXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cdHRoaXMubGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XG5cdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHR0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsLCBtb2RlICkge1xuXG5cdGlmICggbW9kZSA9PT0gMSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmU6IHBhcmFtZXRlciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0ZWQgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuTGluZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lLFxuXG5cdGlzTGluZTogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBbIDAgXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcblxuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBzdGFydC5kaXN0YW5jZVRvKCBlbmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIDAgXSA9IDA7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IHZlcnRpY2VzWyBpIC0gMSBdLmRpc3RhbmNlVG8oIHZlcnRpY2VzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNpc2lvbjtcblx0XHRcdHZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAqIHByZWNpc2lvbjtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIHZTdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclJheSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgc3RlcCA9ICggdGhpcyAmJiB0aGlzLmlzTGluZVNlZ21lbnRzICkgPyAyIDogMTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblx0XHRcdFx0XHRcdHZhciBiID0gaW5kaWNlc1sgaSArIDEgXTtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYiAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSArIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzWyBpICsgMSBdLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7XG5cbn1cblxuTGluZVNlZ21lbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZVNlZ21lbnRzLFxuXG5cdGlzTGluZVNlZ21lbnRzOiB0cnVlLFxuXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XG5cblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdHN0YXJ0LmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRlbmQuY29weSggdmVydGljZXNbIGkgKyAxIF0gKTtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIHN0YXJ0LmRpc3RhbmNlVG8oIGVuZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpIClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXJcbiAqL1xuXG5mdW5jdGlvbiBMaW5lTG9vcCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVMb29wJztcblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVMb29wLFxuXG5cdGlzTGluZUxvb3A6IHRydWUsXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PixcbiAqICBzaXplQXR0ZW51YXRpb246IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuc2l6ZSA9IDE7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xuXHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50cyc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IFBvaW50c01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG59XG5cblBvaW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludHMsXG5cblx0aXNQb2ludHM6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IHRoaXM7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRcdHZhciB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblx0XHRcdHNwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7XG5cblx0XHRcdFx0dmFyIHJheVBvaW50RGlzdGFuY2VTcSA9IHJheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTtcblxuXHRcdFx0XHRpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EgKSB7XG5cblx0XHRcdFx0XHRyYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XG5cdFx0XHRcdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSxcblx0XHRcdFx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdG9iamVjdDogb2JqZWN0XG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXHRcdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7XG5cblx0XHRcdFx0XHRcdHRlc3RQb2ludCggcG9zaXRpb24sIGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgaSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCB2ZXJ0aWNlc1sgaSBdLCBpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcm91cCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0dyb3VwJztcblxufVxuXG5Hcm91cC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBHcm91cCxcblxuXHRpc0dyb3VwOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFZpZGVvVGV4dHVyZSggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFZpZGVvVGV4dHVyZSxcblxuXHRpc1ZpZGVvVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2aWRlbyA9IHRoaXMuaW1hZ2U7XG5cblx0XHRpZiAoIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7XG5cblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdC8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzXG5cdC8vIChhbHNvIGZsaXBwaW5nIGRvZXNuJ3Qgd29yayBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyApXG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdC8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXNcblx0Ly8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlc1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbXByZXNzZWRUZXh0dXJlO1xuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBNYXR0IERlc0xhdXJpZXJzIC8gQG1hdHRkZXNsXG4gKiBAYXV0aG9yIGF0aXggLyBhcnRodXJzaWxiZXIuZGVcbiAqL1xuXG5mdW5jdGlvbiBEZXB0aFRleHR1cmUoIHdpZHRoLCBoZWlnaHQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGZvcm1hdCApIHtcblxuXHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0O1xuXG5cdGlmICggZm9ybWF0ICE9PSBEZXB0aEZvcm1hdCAmJiBmb3JtYXQgIT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHNcdD0gZmFsc2U7XG5cbn1cblxuRGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGVwdGhUZXh0dXJlO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2lyZWZyYW1lR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgaiwgbCwgbywgb2w7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGUsIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXHR2YXIgdmVydGV4O1xuXG5cdC8vIGRpZmZlcmVudCBsb2dpYyBmb3IgR2VvbWV0cnkgYW5kIEJ1ZmZlckdlb21ldHJ5XG5cblx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uLCBpbmRpY2VzLCBncm91cHM7XG5cdFx0dmFyIGdyb3VwLCBzdGFydCwgY291bnQ7XG5cdFx0dmFyIGluZGV4MSwgaW5kZXgyO1xuXG5cdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0aW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Z3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkge1xuXG5cdFx0XHRcdGdyb3VwID0gZ3JvdXBzWyBvIF07XG5cblx0XHRcdFx0c3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0Y291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCBpID0gc3RhcnQsIGwgPSAoIHN0YXJ0ICsgY291bnQgKTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4Milcblx0XHRcdFx0XHQvLyBlLmcuIHRoZSBmaXJzdCB0cmlhbmdsZSBoYXMgdGhlIGZvbGxvd2luZyBlZGdlczogKDAsMSksKDEsMiksKDIsMClcblxuXHRcdFx0XHRcdGluZGV4MSA9IDMgKiBpICsgajtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHRcdGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXaXJlZnJhbWVHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHA6Ly9wcmlkZW91dC5uZXQvYmxvZy8/cD00NFxuICovXG5cbi8vIFBhcmFtZXRyaWNHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbi8vIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdHZhciBFUFMgPSAwLjAwMDAxO1xuXG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHB1ID0gbmV3IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHR2YXIgc2xpY2VDb3VudCA9IHNsaWNlcyArIDE7XG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc3RhY2tzOyBpICsrICkge1xuXG5cdFx0dmFyIHYgPSBpIC8gc3RhY2tzO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGogLyBzbGljZXM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRmdW5jKCB1LCB2LCBwMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggcDAueCwgcDAueSwgcDAueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Ly8gYXBwcm94aW1hdGUgdGFuZ2VudCB2ZWN0b3JzIHZpYSBmaW5pdGUgZGlmZmVyZW5jZXNcblxuXHRcdFx0aWYgKCB1IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSAtIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSArIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiAtIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiArIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuY3Jvc3NWZWN0b3JzKCBwdSwgcHYgKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgdiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpICogc2xpY2VDb3VudCArIGo7XG5cdFx0XHR2YXIgYiA9IGkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBkID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGo7XG5cblx0XHRcdC8vIGZhY2VzIG9uZSBhbmQgdHdvXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgY2xvY2t3b3JrZ2VlayAvIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9ja3dvcmtnZWVrXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUG9seWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25HZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25HZW9tZXRyeTtcblxuLy8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0ZGV0YWlsID0gZGV0YWlsIHx8IDA7XG5cblx0Ly8gZGVmYXVsdCBidWZmZXIgZGF0YVxuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIgPSBbXTtcblx0dmFyIHV2QnVmZmVyID0gW107XG5cblx0Ly8gdGhlIHN1YmRpdmlzaW9uIGNyZWF0ZXMgdGhlIHZlcnRleCBidWZmZXIgZGF0YVxuXG5cdHN1YmRpdmlkZSggZGV0YWlsICk7XG5cblx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXG5cblx0YXBwcGx5UmFkaXVzKCByYWRpdXMgKTtcblxuXHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRnZW5lcmF0ZVVWcygpO1xuXG5cdC8vIGJ1aWxkIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIuc2xpY2UoKSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApO1xuXG5cdGlmICggZGV0YWlsID09PSAwICkge1xuXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOyAvLyBmbGF0IG5vcm1hbHNcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXG5cblx0fVxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBmYWNlcyBhbmQgYXBwbHkgYSBzdWJkaXZpc29uIHdpdGggdGhlIGdpdmVuIGRldGFpbCB2YWx1ZVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdC8vIHBlcmZvcm0gc3ViZGl2aXNpb25cblxuXHRcdFx0c3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHtcblxuXHRcdHZhciBjb2xzID0gTWF0aC5wb3coIDIsIGRldGFpbCApO1xuXG5cdFx0Ly8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb25cblxuXHRcdHZhciB2ID0gW107XG5cblx0XHR2YXIgaSwgajtcblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHR2WyBpIF0gPSBbXTtcblxuXHRcdFx0dmFyIGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHR2YXIgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblxuXHRcdFx0dmFyIHJvd3MgPSBjb2xzIC0gaTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcm93czsgaiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIGsgPSBNYXRoLmZsb29yKCBqIC8gMiApO1xuXG5cdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcHBseVJhZGl1cyggcmFkaXVzICkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBidWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXhcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xuXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDtcblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDEgXSA9IHZlcnRleC55O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0dmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dmFyIHYgPSBpbmNsaW5hdGlvbiggdmVydGV4ICkgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdH1cblxuXHRcdGNvcnJlY3RVVnMoKTtcblxuXHRcdGNvcnJlY3RTZWFtKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkge1xuXG5cdFx0Ly8gaGFuZGxlIGNhc2Ugd2hlbiBmYWNlIHN0cmFkZGxlcyB0aGUgc2VhbSwgc2VlICMzMjY5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcblxuXHRcdFx0Ly8gdXYgZGF0YSBvZiBhIHNpbmdsZSBmYWNlXG5cblx0XHRcdHZhciB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmFyIHgxID0gdXZCdWZmZXJbIGkgKyAyIF07XG5cdFx0XHR2YXIgeDIgPSB1dkJ1ZmZlclsgaSArIDQgXTtcblxuXHRcdFx0dmFyIG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XG5cdFx0XHR2YXIgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIgKTtcblxuXHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxuXG5cdFx0XHRpZiAoIG1heCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7XG5cblx0XHRcdFx0aWYgKCB4MCA8IDAuMiApIHV2QnVmZmVyWyBpICsgMCBdICs9IDE7XG5cdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xuXHRcdFx0XHRpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRleCwgdmVydGV4ICkge1xuXG5cdFx0dmFyIHN0cmlkZSA9IGluZGV4ICogMztcblxuXHRcdHZlcnRleC54ID0gdmVydGljZXNbIHN0cmlkZSArIDAgXTtcblx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XG5cdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgY2VudHJvaWQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XG5cblx0XHRcdGEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZlclsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7XG5cdFx0XHRiLnNldCggdmVydGV4QnVmZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSApO1xuXHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcblxuXHRcdFx0dXZBLnNldCggdXZCdWZmZXJbIGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7XG5cdFx0XHR1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAzIF0gKTtcblx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xuXG5cdFx0XHRjZW50cm9pZC5jb3B5KCBhICkuYWRkKCBiICkuYWRkKCBjICkuZGl2aWRlU2NhbGFyKCAzICk7XG5cblx0XHRcdHZhciBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xuXG5cdFx0XHRjb3JyZWN0VVYoIHV2QSwgaiArIDAsIGEsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTtcblx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xuXG5cdFx0aWYgKCAoIGF6aW11dGggPCAwICkgJiYgKCB1di54ID09PSAxICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCApICkge1xuXG5cdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSBhemltdXRoIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3VudGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tpbmcgZnJvbSBhYm92ZS5cblxuXHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0gdmVjdG9yLnggKTtcblxuXHR9XG5cblxuXHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXG5cblx0ZnVuY3Rpb24gaW5jbGluYXRpb24oIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCAtIHZlY3Rvci55LCBNYXRoLnNxcnQoICggdmVjdG9yLnggKiB2ZWN0b3IueCApICsgKCB2ZWN0b3IueiAqIHZlY3Rvci56ICkgKSApO1xuXG5cdH1cblxufVxuXG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVGV0cmFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXRyYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAxLCAxLCBcdC0gMSwgLSAxLCAxLCBcdC0gMSwgMSwgLSAxLCBcdDEsIC0gMSwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MiwgMSwgMCwgXHQwLCAzLCAyLFx0MSwgMywgMCxcdDIsIDMsIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cblRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gT2N0YWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAwLCAwLCBcdC0gMSwgMCwgMCxcdDAsIDEsIDAsXG5cdFx0MCwgLSAxLCAwLCBcdDAsIDAsIDEsXHQwLCAwLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQwLCAyLCA0LFx0MCwgNCwgMyxcdDAsIDMsIDUsXG5cdFx0MCwgNSwgMixcdDEsIDIsIDUsXHQxLCA1LCAzLFxuXHRcdDEsIDMsIDQsXHQxLCA0LCAyXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gSWNvc2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdC0gMSwgdCwgMCwgXHQxLCB0LCAwLCBcdC0gMSwgLSB0LCAwLCBcdDEsIC0gdCwgMCxcblx0XHQgMCwgLSAxLCB0LCBcdDAsIDEsIHQsXHQwLCAtIDEsIC0gdCwgXHQwLCAxLCAtIHQsXG5cdFx0IHQsIDAsIC0gMSwgXHR0LCAwLCAxLCBcdC0gdCwgMCwgLSAxLCBcdC0gdCwgMCwgMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdCAwLCAxMSwgNSwgXHQwLCA1LCAxLCBcdDAsIDEsIDcsIFx0MCwgNywgMTAsIFx0MCwgMTAsIDExLFxuXHRcdCAxLCA1LCA5LCBcdDUsIDExLCA0LFx0MTEsIDEwLCAyLFx0MTAsIDcsIDYsXHQ3LCAxLCA4LFxuXHRcdCAzLCA5LCA0LCBcdDMsIDQsIDIsXHQzLCAyLCA2LFx0MywgNiwgOCxcdDMsIDgsIDksXG5cdFx0IDQsIDksIDUsIFx0MiwgNCwgMTEsXHQ2LCAyLCAxMCxcdDgsIDYsIDcsXHQ5LCA4LCAxXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEFiZSBQYXpvcyAvIGh0dHBzOi8vaGFtb2lkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBEb2RlY2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblx0dmFyIHIgPSAxIC8gdDtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cblx0XHQvLyAowrExLCDCsTEsIMKxMSlcblx0XHQtIDEsIC0gMSwgLSAxLFx0LSAxLCAtIDEsIDEsXG5cdFx0LSAxLCAxLCAtIDEsIC0gMSwgMSwgMSxcblx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxuXHRcdDEsIDEsIC0gMSwgMSwgMSwgMSxcblxuXHRcdC8vICgwLCDCsTEvz4YsIMKxz4YpXG5cdFx0IDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXG5cdFx0IDAsIHIsIC0gdCwgMCwgciwgdCxcblxuXHRcdC8vICjCsTEvz4YsIMKxz4YsIDApXG5cdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcblx0XHQgciwgLSB0LCAwLCByLCB0LCAwLFxuXG5cdFx0Ly8gKMKxz4YsIDAsIMKxMS/Philcblx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxuXHRcdC0gdCwgMCwgciwgdCwgMCwgclxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDMsIDExLCA3LCBcdDMsIDcsIDE1LCBcdDMsIDE1LCAxMyxcblx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXG5cdFx0MTcsIDQsIDgsIFx0MTcsIDgsIDEwLCBcdDE3LCAxMCwgNixcblx0XHQ4LCAwLCAxNiwgXHQ4LCAxNiwgMiwgXHQ4LCAyLCAxMCxcblx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXG5cdFx0NiwgMTAsIDIsIFx0NiwgMiwgMTMsIFx0NiwgMTMsIDE1LFxuXHRcdDIsIDE2LCAxOCwgXHQyLCAxOCwgMywgXHQyLCAzLCAxMyxcblx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxuXHRcdDQsIDE0LCAxMiwgXHQ0LCAxMiwgMCwgXHQ0LCAwLCA4LFxuXHRcdDExLCA5LCA1LCBcdDExLCA1LCAxOSwgXHQxMSwgMTksIDcsXG5cdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXG5cdFx0MSwgMTIsIDE0LCBcdDEsIDE0LCA1LCBcdDEsIDUsIDlcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9vb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIG1pbmluZ29sZCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9taW5pbmdvbGRcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25vYnIxXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqL1xuXG4vLyBUdWJlR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCwgdGFwZXIgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdGlmICggdGFwZXIgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0dmFyIGJ1ZmZlckdlb21ldHJ5ID0gbmV3IFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGJ1ZmZlckdlb21ldHJ5LnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5LmJpbm9ybWFscztcblxuXHQvLyBjcmVhdGUgZ2VvbWV0cnlcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggYnVmZmVyR2VvbWV0cnkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVHViZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVHZW9tZXRyeTtcblxuLy8gVHViZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdHR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cyB8fCA2NDtcblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHJhZGlhbFNlZ21lbnRzID0gcmFkaWFsU2VnbWVudHMgfHwgODtcblx0Y2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlO1xuXG5cdHZhciBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1hbHM7XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIFAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cdHZhciBpbmRpY2VzID0gW107XG5cblx0Ly8gY3JlYXRlIGJ1ZmZlciBkYXRhXG5cblx0Z2VuZXJhdGVCdWZmZXJEYXRhKCk7XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRnZW5lcmF0ZVNlZ21lbnQoIGkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcblx0XHQvLyBhdCB0aGUgcmVndWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aFxuXHRcdC8vXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcblxuXHRcdGdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQgPT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7XG5cblx0XHQvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLlxuXHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xuXG5cdFx0Z2VuZXJhdGVVVnMoKTtcblxuXHRcdC8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzXG5cblx0XHRnZW5lcmF0ZUluZGljZXMoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkge1xuXG5cdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxuXG5cdFx0UCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1YnVsYXJTZWdtZW50cywgUCApO1xuXG5cdFx0Ly8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5kIGJpbm9ybWFsXG5cblx0XHR2YXIgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07XG5cdFx0dmFyIEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XG5cblx0XHQvLyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudFxuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdHZhciBzaW4gPSBNYXRoLnNpbiggdiApO1xuXHRcdFx0dmFyIGNvcyA9IC0gTWF0aC5jb3MoIHYgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcblx0XHRcdG5vcm1hbC55ID0gKCBjb3MgKiBOLnkgKyBzaW4gKiBCLnkgKTtcblx0XHRcdG5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTtcblx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xuXHRcdFx0dmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBub3JtYWwueTtcblx0XHRcdHZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xuXG5cdFx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHR1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50cztcblx0XHRcdFx0dXYueSA9IGogLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogYmFzZWQgb24gaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BxdG9ydXMvXG4gKi9cblxuLy8gVG9ydXNLbm90R2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90R2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSwgaGVpZ2h0U2NhbGUgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0tub3RHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHA6IHAsXG5cdFx0cTogcVxuXHR9O1xuXG5cdGlmICggaGVpZ2h0U2NhbGUgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlRvcnVzS25vdEdlb21ldHJ5OiBoZWlnaHRTY2FsZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNjYWxlKCB4LCB5LCB6ICkgaW5zdGVhZC4nICk7XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RHZW9tZXRyeTtcblxuLy8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjQ7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRwID0gcCB8fCAyO1xuXHRxID0gcSB8fCAzO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgajtcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIFAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgQiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBUID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIE4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7ICsrIGkgKSB7XG5cblx0XHQvLyB0aGUgcmFkaWFuIFwidVwiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdlbWVudFxuXG5cdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyO1xuXG5cdFx0Ly8gbm93IHdlIGNhbGN1bGF0ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAyIGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuXG5cdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xuXG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIFAxICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXG5cblx0XHRULnN1YlZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdE4uYWRkVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcblx0XHROLmNyb3NzVmVjdG9ycyggQiwgVCApO1xuXG5cdFx0Ly8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdFxuXG5cdFx0Qi5ub3JtYWxpemUoKTtcblx0XHROLm5vcm1hbGl6ZSgpO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3RoaW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLlxuXHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cdFx0XHR2YXIgY3ggPSAtIHR1YmUgKiBNYXRoLmNvcyggdiApO1xuXHRcdFx0dmFyIGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi5cblx0XHRcdC8vIGZpcnN0IHdlIG9yaWVudCB0aGUgZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlXG5cblx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xuXHRcdFx0dmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnogKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpXG5cblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmVcblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XG5cblx0XHR2YXIgY3UgPSBNYXRoLmNvcyggdSApO1xuXHRcdHZhciBzdSA9IE1hdGguc2luKCB1ICk7XG5cdFx0dmFyIHF1T3ZlclAgPSBxIC8gcCAqIHU7XG5cdFx0dmFyIGNzID0gTWF0aC5jb3MoIHF1T3ZlclAgKTtcblxuXHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XG5cdFx0cG9zaXRpb24ueSA9IHJhZGl1cyAqICggMiArIGNzICkgKiBzdSAqIDAuNTtcblx0XHRwb3NpdGlvbi56ID0gcmFkaXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTtcblxuXHR9XG5cbn1cblxuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVG9ydXNHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0dlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0dlb21ldHJ5O1xuXG4vLyBUb3J1c0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY7XG5cdGFyYyA9IGFyYyB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaiwgaTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYztcblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRjZW50ZXIueCA9IHJhZGl1cyAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBjZW50ZXIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxO1xuXHRcdFx0dmFyIGIgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxO1xuXHRcdFx0dmFyIGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cdFx0XHR2YXIgZCA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBQb3J0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXQgKHYyLjEuMilcbiAqL1xuXG52YXIgRWFyY3V0ID0ge1xuXG5cdHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7XG5cblx0XHRkaW0gPSBkaW0gfHwgMjtcblxuXHRcdHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcblx0XHRcdG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGgsXG5cdFx0XHRvdXRlck5vZGUgPSBsaW5rZWRMaXN0KCBkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlICksXG5cdFx0XHR0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGlmICggISBvdXRlck5vZGUgKSByZXR1cm4gdHJpYW5nbGVzO1xuXG5cdFx0dmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cblx0XHRpZiAoIGhhc0hvbGVzICkgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApO1xuXG5cdFx0Ly8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG5cblx0XHRpZiAoIGRhdGEubGVuZ3RoID4gODAgKiBkaW0gKSB7XG5cblx0XHRcdG1pblggPSBtYXhYID0gZGF0YVsgMCBdO1xuXHRcdFx0bWluWSA9IG1heFkgPSBkYXRhWyAxIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltICkge1xuXG5cdFx0XHRcdHggPSBkYXRhWyBpIF07XG5cdFx0XHRcdHkgPSBkYXRhWyBpICsgMSBdO1xuXHRcdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cblxuXHRcdFx0aW52U2l6ZSA9IE1hdGgubWF4KCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkgKTtcblx0XHRcdGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuXG5cdFx0fVxuXG5cdFx0ZWFyY3V0TGlua2VkKCBvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXG5cdH1cblxufTtcblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5cbmZ1bmN0aW9uIGxpbmtlZExpc3QoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlICkge1xuXG5cdHZhciBpLCBsYXN0O1xuXG5cdGlmICggY2xvY2t3aXNlID09PSAoIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApID4gMCApICkge1xuXG5cdFx0Zm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fVxuXG5cdGlmICggbGFzdCAmJiBlcXVhbHMoIGxhc3QsIGxhc3QubmV4dCApICkge1xuXG5cdFx0cmVtb3ZlTm9kZSggbGFzdCApO1xuXHRcdGxhc3QgPSBsYXN0Lm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBsYXN0O1xuXG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5cbmZ1bmN0aW9uIGZpbHRlclBvaW50cyggc3RhcnQsIGVuZCApIHtcblxuXHRpZiAoICEgc3RhcnQgKSByZXR1cm4gc3RhcnQ7XG5cdGlmICggISBlbmQgKSBlbmQgPSBzdGFydDtcblxuXHR2YXIgcCA9IHN0YXJ0LCBhZ2FpbjtcblxuXHRkbyB7XG5cblx0XHRhZ2FpbiA9IGZhbHNlO1xuXG5cdFx0aWYgKCAhIHAuc3RlaW5lciAmJiAoIGVxdWFscyggcCwgcC5uZXh0ICkgfHwgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA9PT0gMCApICkge1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBwICk7XG5cdFx0XHRwID0gZW5kID0gcC5wcmV2O1xuXHRcdFx0aWYgKCBwID09PSBwLm5leHQgKSBicmVhaztcblx0XHRcdGFnYWluID0gdHJ1ZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHAgPSBwLm5leHQ7XG5cblx0XHR9XG5cblx0fSB3aGlsZSAoIGFnYWluIHx8IHAgIT09IGVuZCApO1xuXG5cdHJldHVybiBlbmQ7XG5cbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5cbmZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHtcblxuXHRpZiAoICEgZWFyICkgcmV0dXJuO1xuXG5cdC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuXHRpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0dmFyIHN0b3AgPSBlYXIsIHByZXYsIG5leHQ7XG5cblx0Ly8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG5cblx0d2hpbGUgKCBlYXIucHJldiAhPT0gZWFyLm5leHQgKSB7XG5cblx0XHRwcmV2ID0gZWFyLnByZXY7XG5cdFx0bmV4dCA9IGVhci5uZXh0O1xuXG5cdFx0aWYgKCBpbnZTaXplID8gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIDogaXNFYXIoIGVhciApICkge1xuXG5cdFx0XHQvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHByZXYuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGVhci5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggbmV4dC5pIC8gZGltICk7XG5cblx0XHRcdHJlbW92ZU5vZGUoIGVhciApO1xuXG5cdFx0XHQvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuXHRcdFx0ZWFyID0gbmV4dC5uZXh0O1xuXHRcdFx0c3RvcCA9IG5leHQubmV4dDtcblxuXHRcdFx0Y29udGludWU7XG5cblx0XHR9XG5cblx0XHRlYXIgPSBuZXh0O1xuXG5cdFx0Ly8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcblxuXHRcdGlmICggZWFyID09PSBzdG9wICkge1xuXG5cdFx0XHQvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuXG5cdFx0XHRpZiAoICEgcGFzcyApIHtcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxICk7XG5cblx0XHRcdFx0Ly8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcblxuXHRcdFx0fSBlbHNlIGlmICggcGFzcyA9PT0gMSApIHtcblxuXHRcdFx0XHRlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBlYXIsIHRyaWFuZ2xlcywgZGltICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApO1xuXG5cdFx0XHQvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAyICkge1xuXG5cdFx0XHRcdHNwbGl0RWFyY3V0KCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuXG5mdW5jdGlvbiBpc0VhciggZWFyICkge1xuXG5cdHZhciBhID0gZWFyLnByZXYsXG5cdFx0YiA9IGVhcixcblx0XHRjID0gZWFyLm5leHQ7XG5cblx0aWYgKCBhcmVhKCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuXHQvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuXHR2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBlYXIucHJldiApIHtcblxuXHRcdGlmICggcG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmIGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHR2YXIgYSA9IGVhci5wcmV2LFxuXHRcdGIgPSBlYXIsXG5cdFx0YyA9IGVhci5uZXh0O1xuXG5cdGlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cblx0Ly8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcblxuXHR2YXIgbWluVFggPSBhLnggPCBiLnggPyAoIGEueCA8IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPCBjLnggPyBiLnggOiBjLnggKSxcblx0XHRtaW5UWSA9IGEueSA8IGIueSA/ICggYS55IDwgYy55ID8gYS55IDogYy55ICkgOiAoIGIueSA8IGMueSA/IGIueSA6IGMueSApLFxuXHRcdG1heFRYID0gYS54ID4gYi54ID8gKCBhLnggPiBjLnggPyBhLnggOiBjLnggKSA6ICggYi54ID4gYy54ID8gYi54IDogYy54ICksXG5cdFx0bWF4VFkgPSBhLnkgPiBiLnkgPyAoIGEueSA+IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPiBjLnkgPyBiLnkgOiBjLnkgKTtcblxuXHQvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuXG5cdHZhciBtaW5aID0gek9yZGVyKCBtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUgKSxcblx0XHRtYXhaID0gek9yZGVyKCBtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHQvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcblxuXHR2YXIgcCA9IGVhci5uZXh0WjtcblxuXHR3aGlsZSAoIHAgJiYgcC56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0XHRhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0cCA9IHAubmV4dFo7XG5cblx0fVxuXG5cdC8vIHRoZW4gbG9vayBmb3IgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuXG5cdHAgPSBlYXIucHJldlo7XG5cblx0d2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICkge1xuXG5cdFx0aWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cCA9IHAucHJldlo7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5cbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSApIHtcblxuXHR2YXIgcCA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdHZhciBhID0gcC5wcmV2LCBiID0gcC5uZXh0Lm5leHQ7XG5cblx0XHRpZiAoICEgZXF1YWxzKCBhLCBiICkgJiYgaW50ZXJzZWN0cyggYSwgcCwgcC5uZXh0LCBiICkgJiYgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSApIHtcblxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGEuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHAuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGIuaSAvIGRpbSApO1xuXG5cdFx0XHQvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gcDtcblxufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuXG5mdW5jdGlvbiBzcGxpdEVhcmN1dCggc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG5cblx0dmFyIGEgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHR2YXIgYiA9IGEubmV4dC5uZXh0O1xuXG5cdFx0d2hpbGUgKCBiICE9PSBhLnByZXYgKSB7XG5cblx0XHRcdGlmICggYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKCBhLCBiICkgKSB7XG5cblx0XHRcdFx0Ly8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuXG5cdFx0XHRcdHZhciBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7XG5cblx0XHRcdFx0Ly8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcblxuXHRcdFx0XHRhID0gZmlsdGVyUG9pbnRzKCBhLCBhLm5leHQgKTtcblx0XHRcdFx0YyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7XG5cblx0XHRcdFx0Ly8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGIgPSBiLm5leHQ7XG5cblx0XHR9XG5cblx0XHRhID0gYS5uZXh0O1xuXG5cdH0gd2hpbGUgKCBhICE9PSBzdGFydCApO1xuXG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHtcblxuXHR2YXIgcXVldWUgPSBbXSwgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG5cdGZvciAoIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XG5cblx0XHRzdGFydCA9IGhvbGVJbmRpY2VzWyBpIF0gKiBkaW07XG5cdFx0ZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXHRcdGxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7XG5cdFx0aWYgKCBsaXN0ID09PSBsaXN0Lm5leHQgKSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuXHRcdHF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTtcblxuXHR9XG5cblx0cXVldWUuc29ydCggY29tcGFyZVggKTtcblxuXHQvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuXG5cdGZvciAoIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0ZWxpbWluYXRlSG9sZSggcXVldWVbIGkgXSwgb3V0ZXJOb2RlICk7XG5cdFx0b3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKCBvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0ICk7XG5cblx0fVxuXG5cdHJldHVybiBvdXRlck5vZGU7XG5cbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEueCAtIGIueDtcblxufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZSggaG9sZSwgb3V0ZXJOb2RlICkge1xuXG5cdG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKTtcblxuXHRpZiAoIG91dGVyTm9kZSApIHtcblxuXHRcdHZhciBiID0gc3BsaXRQb2x5Z29uKCBvdXRlck5vZGUsIGhvbGUgKTtcblxuXHRcdGZpbHRlclBvaW50cyggYiwgYi5uZXh0ICk7XG5cblx0fVxuXG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHR2YXIgcCA9IG91dGVyTm9kZSxcblx0XHRoeCA9IGhvbGUueCxcblx0XHRoeSA9IGhvbGUueSxcblx0XHRxeCA9IC0gSW5maW5pdHksXG5cdFx0bTtcblxuXHQvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG5cdC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcblxuXHRkbyB7XG5cblx0XHRpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkge1xuXG5cdFx0XHR2YXIgeCA9IHAueCArICggaHkgLSBwLnkgKSAqICggcC5uZXh0LnggLSBwLnggKSAvICggcC5uZXh0LnkgLSBwLnkgKTtcblxuXHRcdFx0aWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHtcblxuXHRcdFx0XHRxeCA9IHg7XG5cblx0XHRcdFx0aWYgKCB4ID09PSBoeCApIHtcblxuXHRcdFx0XHRcdGlmICggaHkgPT09IHAueSApIHJldHVybiBwO1xuXHRcdFx0XHRcdGlmICggaHkgPT09IHAubmV4dC55ICkgcmV0dXJuIHAubmV4dDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gb3V0ZXJOb2RlICk7XG5cblx0aWYgKCAhIG0gKSByZXR1cm4gbnVsbDtcblxuXHRpZiAoIGh4ID09PSBxeCApIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cblx0Ly8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuXHQvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcblx0Ly8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuXHR2YXIgc3RvcCA9IG0sXG5cdFx0bXggPSBtLngsXG5cdFx0bXkgPSBtLnksXG5cdFx0dGFuTWluID0gSW5maW5pdHksXG5cdFx0dGFuO1xuXG5cdHAgPSBtLm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBzdG9wICkge1xuXG5cdFx0aWYgKCBoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcblx0XHRcdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkgKSApIHtcblxuXHRcdFx0dGFuID0gTWF0aC5hYnMoIGh5IC0gcC55ICkgLyAoIGh4IC0gcC54ICk7IC8vIHRhbmdlbnRpYWxcblxuXHRcdFx0aWYgKCAoIHRhbiA8IHRhbk1pbiB8fCAoIHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCApICkgJiYgbG9jYWxseUluc2lkZSggcCwgaG9sZSApICkge1xuXG5cdFx0XHRcdG0gPSBwO1xuXHRcdFx0XHR0YW5NaW4gPSB0YW47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBtO1xuXG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuZnVuY3Rpb24gaW5kZXhDdXJ2ZSggc3RhcnQsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIHAgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueiA9PT0gbnVsbCApIHAueiA9IHpPcmRlciggcC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRwLnByZXZaID0gcC5wcmV2O1xuXHRcdHAubmV4dFogPSBwLm5leHQ7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRwLnByZXZaLm5leHRaID0gbnVsbDtcblx0cC5wcmV2WiA9IG51bGw7XG5cblx0c29ydExpbmtlZCggcCApO1xuXG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuXG5mdW5jdGlvbiBzb3J0TGlua2VkKCBsaXN0ICkge1xuXG5cdHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSwgaW5TaXplID0gMTtcblxuXHRkbyB7XG5cblx0XHRwID0gbGlzdDtcblx0XHRsaXN0ID0gbnVsbDtcblx0XHR0YWlsID0gbnVsbDtcblx0XHRudW1NZXJnZXMgPSAwO1xuXG5cdFx0d2hpbGUgKCBwICkge1xuXG5cdFx0XHRudW1NZXJnZXMgKys7XG5cdFx0XHRxID0gcDtcblx0XHRcdHBTaXplID0gMDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7XG5cblx0XHRcdFx0cFNpemUgKys7XG5cdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRpZiAoICEgcSApIGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHFTaXplID0gaW5TaXplO1xuXG5cdFx0XHR3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7XG5cblx0XHRcdFx0aWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7XG5cblx0XHRcdFx0XHRlID0gcDtcblx0XHRcdFx0XHRwID0gcC5uZXh0Wjtcblx0XHRcdFx0XHRwU2l6ZSAtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZSA9IHE7XG5cdFx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdFx0cVNpemUgLS07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFpbCApIHRhaWwubmV4dFogPSBlO1xuXHRcdFx0XHRlbHNlIGxpc3QgPSBlO1xuXG5cdFx0XHRcdGUucHJldlogPSB0YWlsO1xuXHRcdFx0XHR0YWlsID0gZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwID0gcTtcblxuXHRcdH1cblxuXHRcdHRhaWwubmV4dFogPSBudWxsO1xuXHRcdGluU2l6ZSAqPSAyO1xuXG5cdH0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7XG5cblx0cmV0dXJuIGxpc3Q7XG5cbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5cbmZ1bmN0aW9uIHpPcmRlciggeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG5cblx0eCA9IDMyNzY3ICogKCB4IC0gbWluWCApICogaW52U2l6ZTtcblx0eSA9IDMyNzY3ICogKCB5IC0gbWluWSApICogaW52U2l6ZTtcblxuXHR4ID0gKCB4IHwgKCB4IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eCA9ICggeCB8ICggeCA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHggPSAoIHggfCAoIHggPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHR5ID0gKCB5IHwgKCB5IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eSA9ICggeSB8ICggeSA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHRyZXR1cm4geCB8ICggeSA8PCAxICk7XG5cbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7XG5cblx0dmFyIHAgPSBzdGFydCwgbGVmdG1vc3QgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueCA8IGxlZnRtb3N0LnggKSBsZWZ0bW9zdCA9IHA7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gbGVmdG1vc3Q7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoIGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSApIHtcblxuXHRyZXR1cm4gKCBjeCAtIHB4ICkgKiAoIGF5IC0gcHkgKSAtICggYXggLSBweCApICogKCBjeSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBheCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSAtICggYnggLSBweCApICogKCBheSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBieCAtIHB4ICkgKiAoIGN5IC0gcHkgKSAtICggY3ggLSBweCApICogKCBieSAtIHB5ICkgPj0gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcblxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKCBhLCBiICkge1xuXG5cdHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgISBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApICYmXG5cdFx0bG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSAmJiBtaWRkbGVJbnNpZGUoIGEsIGIgKTtcblxufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5cbmZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7XG5cblx0cmV0dXJuICggcS55IC0gcC55ICkgKiAoIHIueCAtIHEueCApIC0gKCBxLnggLSBwLnggKSAqICggci55IC0gcS55ICk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcblxuZnVuY3Rpb24gZXF1YWxzKCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoIHAxLCBxMSwgcDIsIHEyICkge1xuXG5cdGlmICggKCBlcXVhbHMoIHAxLCBxMSApICYmIGVxdWFscyggcDIsIHEyICkgKSB8fFxuXHRcdFx0KCBlcXVhbHMoIHAxLCBxMiApICYmIGVxdWFscyggcDIsIHExICkgKSApIHJldHVybiB0cnVlO1xuXG5cdHJldHVybiBhcmVhKCBwMSwgcTEsIHAyICkgPiAwICE9PSBhcmVhKCBwMSwgcTEsIHEyICkgPiAwICYmXG5cdFx0XHRcdCBhcmVhKCBwMiwgcTIsIHAxICkgPiAwICE9PSBhcmVhKCBwMiwgcTIsIHExICkgPiAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5cbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkge1xuXG5cdHZhciBwID0gYTtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cyggcCwgcC5uZXh0LCBhLCBiICkgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZSggYSwgYiApIHtcblxuXHRyZXR1cm4gYXJlYSggYS5wcmV2LCBhLCBhLm5leHQgKSA8IDAgP1xuXHRcdGFyZWEoIGEsIGIsIGEubmV4dCApID49IDAgJiYgYXJlYSggYSwgYS5wcmV2LCBiICkgPj0gMCA6XG5cdFx0YXJlYSggYSwgYiwgYS5wcmV2ICkgPCAwIHx8IGFyZWEoIGEsIGEubmV4dCwgYiApIDwgMDtcblxufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkge1xuXG5cdHZhciBwID0gYSxcblx0XHRpbnNpZGUgPSBmYWxzZSxcblx0XHRweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCAoICggcC55ID4gcHkgKSAhPT0gKCBwLm5leHQueSA+IHB5ICkgKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG5cdFx0XHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKSB7XG5cblx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5cbmZ1bmN0aW9uIHNwbGl0UG9seWdvbiggYSwgYiApIHtcblxuXHR2YXIgYTIgPSBuZXcgTm9kZSggYS5pLCBhLngsIGEueSApLFxuXHRcdGIyID0gbmV3IE5vZGUoIGIuaSwgYi54LCBiLnkgKSxcblx0XHRhbiA9IGEubmV4dCxcblx0XHRicCA9IGIucHJldjtcblxuXHRhLm5leHQgPSBiO1xuXHRiLnByZXYgPSBhO1xuXG5cdGEyLm5leHQgPSBhbjtcblx0YW4ucHJldiA9IGEyO1xuXG5cdGIyLm5leHQgPSBhMjtcblx0YTIucHJldiA9IGIyO1xuXG5cdGJwLm5leHQgPSBiMjtcblx0YjIucHJldiA9IGJwO1xuXG5cdHJldHVybiBiMjtcblxufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuXG5mdW5jdGlvbiBpbnNlcnROb2RlKCBpLCB4LCB5LCBsYXN0ICkge1xuXG5cdHZhciBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTtcblxuXHRpZiAoICEgbGFzdCApIHtcblxuXHRcdHAucHJldiA9IHA7XG5cdFx0cC5uZXh0ID0gcDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cC5uZXh0ID0gbGFzdC5uZXh0O1xuXHRcdHAucHJldiA9IGxhc3Q7XG5cdFx0bGFzdC5uZXh0LnByZXYgPSBwO1xuXHRcdGxhc3QubmV4dCA9IHA7XG5cblx0fVxuXG5cdHJldHVybiBwO1xuXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7XG5cblx0cC5uZXh0LnByZXYgPSBwLnByZXY7XG5cdHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG5cdGlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuXHRpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcblxufVxuXG5mdW5jdGlvbiBOb2RlKCBpLCB4LCB5ICkge1xuXG5cdC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcblx0dGhpcy5pID0gaTtcblxuXHQvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcblx0dGhpcy54ID0geDtcblx0dGhpcy55ID0geTtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0aWNlIG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG5cdHRoaXMucHJldiA9IG51bGw7XG5cdHRoaXMubmV4dCA9IG51bGw7XG5cblx0Ly8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuXHR0aGlzLnogPSBudWxsO1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcblx0dGhpcy5wcmV2WiA9IG51bGw7XG5cdHRoaXMubmV4dFogPSBudWxsO1xuXG5cdC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG5cdHRoaXMuc3RlaW5lciA9IGZhbHNlO1xuXG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApIHtcblxuXHR2YXIgc3VtID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSApIHtcblxuXHRcdHN1bSArPSAoIGRhdGFbIGogXSAtIGRhdGFbIGkgXSApICogKCBkYXRhWyBpICsgMSBdICsgZGF0YVsgaiArIDEgXSApO1xuXHRcdGogPSBpO1xuXG5cdH1cblxuXHRyZXR1cm4gc3VtO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbnZhciBTaGFwZVV0aWxzID0ge1xuXG5cdC8vIGNhbGN1bGF0ZSBhcmVhIG9mIHRoZSBjb250b3VyIHBvbHlnb25cblxuXHRhcmVhOiBmdW5jdGlvbiAoIGNvbnRvdXIgKSB7XG5cblx0XHR2YXIgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXHRcdHZhciBhID0gMC4wO1xuXG5cdFx0Zm9yICggdmFyIHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcblxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhICogMC41O1xuXG5cdH0sXG5cblx0aXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xuXG5cdH0sXG5cblx0dHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24gKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IFtdOyAvLyBmbGF0IGFycmF5IG9mIHZlcnRpY2VzIGxpa2UgWyB4MCx5MCwgeDEseTEsIHgyLHkyLCAuLi4gXVxuXHRcdHZhciBob2xlSW5kaWNlcyA9IFtdOyAvLyBhcnJheSBvZiBob2xlIGluZGljZXNcblx0XHR2YXIgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF1cblxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xuXHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVJbmRpY2VzLnB1c2goIGhvbGVJbmRleCApO1xuXHRcdFx0aG9sZUluZGV4ICs9IGhvbGVzWyBpIF0ubGVuZ3RoO1xuXHRcdFx0YWRkQ29udG91ciggdmVydGljZXMsIGhvbGVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgdHJpYW5nbGVzID0gRWFyY3V0LnRyaWFuZ3VsYXRlKCB2ZXJ0aWNlcywgaG9sZUluZGljZXMgKTtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdGZhY2VzLnB1c2goIHRyaWFuZ2xlcy5zbGljZSggaSwgaSArIDMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhY2VzO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gcmVtb3ZlRHVwRW5kUHRzKCBwb2ludHMgKSB7XG5cblx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdGlmICggbCA+IDIgJiYgcG9pbnRzWyBsIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdHBvaW50cy5wb3AoKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKSB7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29udG91ci5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueCApO1xuXHRcdHZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS55ICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICogIHN0ZXBzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBmb3Igei1zaWRlIGV4dHJ1c2lvbnMgLyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBvZiBleHRydWRlIHNwbGluZSB0b29cbiAqICBhbW91bnQ6IDxpbnQ+LCAvLyBEZXB0aCB0byBleHRydWRlIHRoZSBzaGFwZVxuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5hbCBzaGFwZSBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+LCAvLyBob3cgZmFyIGZyb20gc2hhcGUgb3V0bGluZSBpcyBiZXZlbFxuICogIGJldmVsU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgYmV2ZWwgbGF5ZXJzXG4gKlxuICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmdcbiAqXG4gKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnNcbiAqXG4gKiB9XG4gKi9cblxuLy8gRXh0cnVkZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUdlb21ldHJ5O1xuXG4vLyBFeHRydWRlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRvcHRpb25zOiBvcHRpb25zXG5cdH07XG5cblx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIHZlcnRpY2VzQXJyYXkgPSBbXTtcblx0dmFyIHV2QXJyYXkgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXHRcdGFkZFNoYXBlKCBzaGFwZSwgb3B0aW9ucyApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7XG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBwbGFjZWhvbGRlciA9IFtdO1xuXG5cdFx0Ly8gb3B0aW9uc1xuXG5cdFx0dmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyO1xuXHRcdHZhciBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXHRcdHZhciBhbW91bnQgPSBvcHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5hbW91bnQgOiAxMDA7XG5cblx0XHR2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTtcblx0XHR2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjtcblx0XHR2YXIgYmV2ZWxTaXplID0gb3B0aW9ucy5iZXZlbFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTaXplIDogYmV2ZWxUaGlja25lc3MgLSAyO1xuXHRcdHZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdFx0dmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDtcblxuXHRcdHZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBXb3JsZFVWR2VuZXJhdG9yO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7XG5cdFx0dmFyIHNwbGluZVR1YmUsIGJpbm9ybWFsLCBub3JtYWwsIHBvc2l0aW9uMjtcblxuXHRcdGlmICggZXh0cnVkZVBhdGggKSB7XG5cblx0XHRcdGV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7XG5cblx0XHRcdGV4dHJ1ZGVCeVBhdGggPSB0cnVlO1xuXHRcdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxuXG5cdFx0XHQvLyBTRVRVUCBUTkIgdmFyaWFibGVzXG5cblx0XHRcdC8vIFRPRE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/XG5cblx0XHRcdHNwbGluZVR1YmUgPSBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coc3BsaW5lVHViZSwgJ3NwbGluZVR1YmUnLCBzcGxpbmVUdWJlLm5vcm1hbHMubGVuZ3RoLCAnc3RlcHMnLCBzdGVwcywgJ2V4dHJ1ZGVQdHMnLCBleHRydWRlUHRzLmxlbmd0aCk7XG5cblx0XHRcdGJpbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXG5cblx0XHRpZiAoICEgYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRiZXZlbFNlZ21lbnRzID0gMDtcblx0XHRcdGJldmVsVGhpY2tuZXNzID0gMDtcblx0XHRcdGJldmVsU2l6ZSA9IDA7XG5cblx0XHR9XG5cblx0XHQvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb25cblxuXHRcdHZhciBhaG9sZSwgaCwgaGw7IC8vIGxvb3Bpbmcgb2YgaG9sZXNcblxuXHRcdHZhciBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlO1xuXHRcdHZhciBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xuXG5cdFx0dmFyIHJldmVyc2UgPSAhIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHZlcnRpY2VzICk7XG5cblx0XHRpZiAoIHJldmVyc2UgKSB7XG5cblx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHQvLyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLlxuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBhaG9sZSApICkge1xuXG5cdFx0XHRcdFx0aG9sZXNbIGggXSA9IGFob2xlLnJldmVyc2UoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTtcblxuXHRcdC8qIFZlcnRpY2VzICovXG5cblx0XHR2YXIgY29udG91ciA9IHZlcnRpY2VzOyAvLyB2ZXJ0aWNlcyBoYXMgYWxsIHBvaW50cyBidXQgY29udG91ciBoYXMgb25seSBwb2ludHMgb2YgY2lyY3VtZmVyZW5jZVxuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIHNjYWxlUHQyKCBwdCwgdmVjLCBzaXplICkge1xuXG5cdFx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggXCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdFwiICk7XG5cblx0XHRcdHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTtcblxuXHRcdH1cblxuXHRcdHZhciBiLCBicywgdCwgeixcblx0XHRcdHZlcnQsIHZsZW4gPSB2ZXJ0aWNlcy5sZW5ndGgsXG5cdFx0XHRmYWNlLCBmbGVuID0gZmFjZXMubGVuZ3RoO1xuXG5cblx0XHQvLyBGaW5kIGRpcmVjdGlvbnMgZm9yIHBvaW50IG1vdmVtZW50XG5cblxuXHRcdGZ1bmN0aW9uIGdldEJldmVsVmVjKCBpblB0LCBpblByZXYsIGluTmV4dCApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxuXHRcdFx0Ly8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdFxuXHRcdFx0Ly8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lXG5cdFx0XHQvL1xuXHRcdFx0Ly8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d29cblx0XHRcdC8vICBhZGphY2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNpZGUuXG5cblx0XHRcdHZhciB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XG5cblx0XHRcdC8vIGdvb2QgcmVhZGluZyBmb3IgZ2VvbWV0cnkgYWxnb3JpdGhtcyAoaGVyZTogbGluZS1saW5lIGludGVyc2VjdGlvbilcblx0XHRcdC8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sXG5cblx0XHRcdHZhciB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LFxuXHRcdFx0XHR2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55O1xuXHRcdFx0dmFyIHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsXG5cdFx0XHRcdHZfbmV4dF95ID0gaW5OZXh0LnkgLSBpblB0Lnk7XG5cblx0XHRcdHZhciB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7XG5cblx0XHRcdC8vIGNoZWNrIGZvciBjb2xsaW5lYXIgZWRnZXNcblx0XHRcdHZhciBjb2xsaW5lYXIwID0gKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBjb2xsaW5lYXIwICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHQvLyBub3QgY29sbGluZWFyXG5cblx0XHRcdFx0Ly8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nXG5cblx0XHRcdFx0dmFyIHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXHRcdFx0XHR2YXIgdl9uZXh0X2xlbiA9IE1hdGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTtcblxuXHRcdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XG5cblx0XHRcdFx0dmFyIHB0UHJldlNoaWZ0X3ggPSAoIGluUHJldi54IC0gdl9wcmV2X3kgLyB2X3ByZXZfbGVuICk7XG5cdFx0XHRcdHZhciBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8gdl9wcmV2X2xlbiApO1xuXG5cdFx0XHRcdHZhciBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xuXHRcdFx0XHR2YXIgcHROZXh0U2hpZnRfeSA9ICggaW5OZXh0LnkgKyB2X25leHRfeCAvIHZfbmV4dF9sZW4gKTtcblxuXHRcdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdHZhciBzZiA9ICggKCBwdE5leHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLVxuXHRcdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXG5cdFx0XHRcdFx0KCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRcdC8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xuXHRcdFx0XHR2X3RyYW5zX3kgPSAoIHB0UHJldlNoaWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHlcblx0XHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xuXHRcdFx0XHR2YXIgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7XG5cdFx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXG5cblx0XHRcdFx0dmFyIGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZVxuXHRcdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggdl9wcmV2X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE1hdGguc2lnbiggdl9wcmV2X3kgKSA9PT0gTWF0aC5zaWduKCB2X25leHRfeSApICkge1xuXG5cdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlXCIpO1xuXHRcdFx0XHRcdHZfdHJhbnNfeCA9IC0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcblx0XHRcdFx0XHR2X3RyYW5zX3ggPSB2X3ByZXZfeDtcblx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeTtcblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xuXG5cdFx0fVxuXG5cblx0XHR2YXIgY29udG91ck1vdmVtZW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0XHQvLyBjb25zb2xlLmxvZygnaSxqLGsnLCBpLCBqICwgaylcblxuXHRcdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcblxuXHRcdH1cblxuXHRcdHZhciBob2xlc01vdmVtZW50cyA9IFtdLFxuXHRcdFx0b25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpO1xuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdFx0b25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFob2xlWyBqIF0sIGFob2xlWyBrIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRob2xlc01vdmVtZW50cy5wdXNoKCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cdFx0XHR2ZXJ0aWNlc01vdmVtZW50cyA9IHZlcnRpY2VzTW92ZW1lbnRzLmNvbmNhdCggb25lSG9sZU1vdmVtZW50cyApO1xuXG5cdFx0fVxuXG5cblx0XHQvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2tcblxuXHRcdGZvciAoIGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblxuXHRcdFx0Ly9mb3IgKCBiID0gYmV2ZWxTZWdtZW50czsgYiA+IDA7IGIgLS0gKSB7XG5cblx0XHRcdHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHRcdHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRcdGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApO1xuXG5cdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRicyA9IGJldmVsU2l6ZTtcblxuXHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyAwIF0ueSwgZXh0cnVkZVB0c1sgMCBdLnggKTtcblxuXHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0XHQvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHR2YXIgcztcblxuXHRcdGZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgLyBzdGVwcyAqIHMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXNcblxuXHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0XHRmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvKiBGYWNlcyAqL1xuXG5cdFx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcblxuXHRcdGJ1aWxkTGlkRmFjZXMoKTtcblxuXHRcdC8vIFNpZGVzIGZhY2VzXG5cblx0XHRidWlsZFNpZGVGYWNlcygpO1xuXG5cblx0XHQvLy8vLyAgSW50ZXJuYWwgZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBidWlsZExpZEZhY2VzKCkge1xuXG5cdFx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cblx0XHRcdGlmICggYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRcdHZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxuXHRcdFx0XHR2YXIgb2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMCBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblx0XHRcdFx0b2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDAgKTtcblxuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXG5cblx0XHRmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHtcblxuXHRcdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIGxheWVyb2Zmc2V0ID0gMDtcblx0XHRcdHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTtcblx0XHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdHNpZGV3YWxscyggYWhvbGUsIGxheWVyb2Zmc2V0ICk7XG5cblx0XHRcdFx0Ly8sIHRydWVcblx0XHRcdFx0bGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMSApO1xuXG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkge1xuXG5cdFx0XHR2YXIgaiwgaztcblx0XHRcdGkgPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCAtLSBpID49IDAgKSB7XG5cblx0XHRcdFx0aiA9IGk7XG5cdFx0XHRcdGsgPSBpIC0gMTtcblx0XHRcdFx0aWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAtIDE7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnYicsIGksaiwgaS0xLCBrLHZlcnRpY2VzLmxlbmd0aCk7XG5cblx0XHRcdFx0dmFyIHMgPSAwLFxuXHRcdFx0XHRcdHNsID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblxuXHRcdFx0XHRmb3IgKCBzID0gMDsgcyA8IHNsOyBzICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNsZW4xID0gdmxlbiAqIHM7XG5cdFx0XHRcdFx0dmFyIHNsZW4yID0gdmxlbiAqICggcyArIDEgKTtcblxuXHRcdFx0XHRcdHZhciBhID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRiID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXG5cdFx0XHRcdFx0XHRkID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjI7XG5cblx0XHRcdFx0XHRmNCggYSwgYiwgYywgZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcblxuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeCApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeSApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBmMyggYSwgYiwgYyApIHtcblxuXHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggYyApO1xuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGY0KCBhLCBiLCBjLCBkICkge1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBjICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkge1xuXG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDEgXSApO1xuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMiBdICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIGFkZFVWKCB2ZWN0b3IyICkge1xuXG5cdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueCApO1xuXHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTtcblxudmFyIFdvcmxkVVZHZW5lcmF0b3IgPSB7XG5cblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcblx0XHRdO1xuXG5cdH0sXG5cblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblx0XHR2YXIgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XG5cdFx0dmFyIGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07XG5cdFx0dmFyIGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdO1xuXHRcdHZhciBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fVxuXG5cdH1cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBUZXh0ID0gM0QgVGV4dFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZm9udDogPFRIUkVFLkZvbnQ+LCAvLyBmb250XG4gKlxuICogIHNpemU6IDxmbG9hdD4sIC8vIHNpemUgb2YgdGhlIHRleHRcbiAqICBoZWlnaHQ6IDxmbG9hdD4sIC8vIHRoaWNrbmVzcyB0byBleHRydWRlIHRleHRcbiAqICBjdXJ2ZVNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGV4dCBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+IC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgaXMgYmV2ZWxcbiAqIH1cbiAqL1xuXG4vLyBUZXh0R2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGV4dDogdGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXh0R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEdlb21ldHJ5O1xuXG4vLyBUZXh0QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBmb250ID0gcGFyYW1ldGVycy5mb250O1xuXG5cdGlmICggISAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCk7XG5cblx0fVxuXG5cdHZhciBzaGFwZXMgPSBmb250LmdlbmVyYXRlU2hhcGVzKCB0ZXh0LCBwYXJhbWV0ZXJzLnNpemUsIHBhcmFtZXRlcnMuY3VydmVTZWdtZW50cyApO1xuXG5cdC8vIHRyYW5zbGF0ZSBwYXJhbWV0ZXJzIHRvIEV4dHJ1ZGVHZW9tZXRyeSBBUElcblxuXHRwYXJhbWV0ZXJzLmFtb3VudCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdC8vIGRlZmF1bHRzXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID0gMTA7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPSBmYWxzZTtcblxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgc2hhcGVzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRCdWZmZXJHZW9tZXRyeSc7XG5cbn1cblxuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTcGhlcmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVHZW9tZXRyeTtcblxuLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApO1xuXG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSTtcblxuXHR2YXIgdGhldGFFbmQgPSB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGg7XG5cblx0dmFyIGl4LCBpeTtcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgZ3JpZCA9IFtdO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHR2YXIgdmVydGljZXNSb3cgPSBbXTtcblxuXHRcdHZhciB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaXggLyB3aWR0aFNlZ21lbnRzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAtIHJhZGl1cyAqIE1hdGguY29zKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguY29zKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5zZXQoIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdH1cblxuXHRcdGdyaWQucHVzaCggdmVydGljZXNSb3cgKTtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XG5cdFx0XHR2YXIgYiA9IGdyaWRbIGl5IF1bIGl4IF07XG5cdFx0XHR2YXIgYyA9IGdyaWRbIGl5ICsgMSBdWyBpeCBdO1xuXHRcdFx0dmFyIGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XG5cblx0XHRcdGlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGlmICggaXkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBLYWxlYiBNdXJwaHlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUmluZ0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUmluZ0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTtcblxuLy8gUmluZ0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0aW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyB8fCAwLjU7XG5cdG91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgfHwgMTtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTZWdtZW50cyA9IHRoZXRhU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICkgOiA4O1xuXHRwaGlTZWdtZW50cyA9IHBoaVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMSwgcGhpU2VnbWVudHMgKSA6IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHNlZ21lbnQ7XG5cdHZhciByYWRpdXMgPSBpbm5lclJhZGl1cztcblx0dmFyIHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIHZhbHVlcyBhcmUgZ2VuZXJhdGUgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSByaW5nIHRvIHRoZSBvdXRzaWRlXG5cblx0XHRcdHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0cmFkaXVzICs9IHJhZGl1c1N0ZXA7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0dmFyIHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0c2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0dmFyIGEgPSBzZWdtZW50O1xuXHRcdFx0dmFyIGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7XG5cdFx0XHR2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdHZhciBkID0gc2VnbWVudCArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYXN0cm9kdWQgLyBodHRwOi8vYXN0cm9kdWQuaXNncmVhdC5vcmcvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBMYXRoZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlR2VvbWV0cnk7XG5cbi8vIExhdGhlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0c2VnbWVudHMgPSBNYXRoLmZsb29yKCBzZWdtZW50cyApIHx8IDEyO1xuXHRwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0cGhpTGVuZ3RoID0gX01hdGguY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgYmFzZTtcblx0dmFyIGludmVyc2VTZWdtZW50cyA9IDEuMCAvIHNlZ21lbnRzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0dmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7XG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCBwaGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdHZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTtcblx0XHRcdHZlcnRleC56ID0gcG9pbnRzWyBqIF0ueCAqIGNvcztcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gaSAvIHNlZ21lbnRzO1xuXHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0YmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDtcblxuXHRcdFx0dmFyIGEgPSBiYXNlO1xuXHRcdFx0dmFyIGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdHZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxO1xuXHRcdFx0dmFyIGQgPSBiYXNlICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZ2VuZXJhdGUgbm9ybWFsc1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uXG5cdC8vIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50aWNhbCAoYnV0IHN0aWxsIGhhdmUgZGlmZmVyZW50IFVWcykuXG5cblx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdHZhciBuMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRiYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMztcblxuXHRcdGZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZVxuXG5cdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdG4xLnkgPSBub3JtYWxzWyBqICsgMSBdO1xuXHRcdFx0bjEueiA9IG5vcm1hbHNbIGogKyAyIF07XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRuMi54ID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF07XG5cdFx0XHRuMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF07XG5cdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdC8vIGF2ZXJhZ2Ugbm9ybWFsc1xuXG5cdFx0XHRuLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdG5vcm1hbHNbIGogKyAwIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXSA9IG4ueDtcblx0XHRcdG5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXSA9IG4ueTtcblx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gU2hhcGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcblxuXHRpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09PSAnb2JqZWN0JyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50cztcblxuXHR9XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlR2VvbWV0cnk7XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdHZhciBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXG5cdHJldHVybiB0b0pTT04oIHNoYXBlcywgZGF0YSApO1xuXG59O1xuXG4vLyBTaGFwZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXG5cdH07XG5cblx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMgfHwgMTI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdC8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFsdWVzIGZvciBcInNoYXBlc1wiIHBhcmFtZXRlclxuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPT09IGZhbHNlICkge1xuXG5cdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcblxuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSApOyAvLyBlbmFibGVzIE11bHRpTWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cdFx0XHRncm91cENvdW50ID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBpLCBsLCBzaGFwZUhvbGU7XG5cblx0XHR2YXIgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xuXHRcdHZhciBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0XHR2YXIgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcblx0XHR2YXIgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlcztcblxuXHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xuXG5cdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZVZlcnRpY2VzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdC8vIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVIb2xlICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XG5cblx0XHQvLyBqb2luIHZlcnRpY2VzIG9mIGlubmVyIGFuZCBvdXRlciBwYXRocyB0byBhIHNpbmdsZSBhcnJheVxuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XG5cblx0XHR9XG5cblx0XHQvLyB2ZXJ0aWNlcywgbm9ybWFscywgdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCAwICk7XG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0XHRcdHV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsgLy8gd29ybGQgdXZzXG5cblx0XHR9XG5cblx0XHQvLyBpbmNpZGVzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHR2YXIgYyA9IGZhY2VbIDIgXSArIGluZGV4T2Zmc2V0O1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVCdWZmZXJHZW9tZXRyeTtcblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIHRvSlNPTiggc2hhcGVzLCBkYXRhICkge1xuXG5cdGRhdGEuc2hhcGVzID0gW107XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdH07XG5cblx0dGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBfTWF0aC5ERUcyUkFEICogdGhyZXNob2xkQW5nbGUgKTtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0Ly8gcHJlcGFyZSBzb3VyY2UgZ2VvbWV0cnlcblxuXHR2YXIgZ2VvbWV0cnkyO1xuXG5cdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5LmNsb25lKCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5Mi5tZXJnZVZlcnRpY2VzKCk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHR2YXIgc291cmNlVmVydGljZXMgPSBnZW9tZXRyeTIudmVydGljZXM7XG5cdHZhciBmYWNlcyA9IGdlb21ldHJ5Mi5mYWNlcztcblxuXHQvLyBub3cgY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIGFuIGVkZ2Ugd2l0aCBpdHMgYWRqb2luaW5nIGZhY2VzXG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdGZvciAoIHZhciBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApO1xuXHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjogdW5kZWZpbmVkIH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdLmZhY2UyID0gaTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdHZhciBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0Ly8gYW4gZWRnZSBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBhbmdsZSAoaW4gZGVncmVlcykgYmV0d2VlbiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBhZGpvaW5pbmcgZmFjZXMgZXhjZWVkcyB0aGlzIHZhbHVlLiBkZWZhdWx0ID0gMSBkZWdyZWUuXG5cblx0XHRpZiAoIGUuZmFjZTIgPT09IHVuZGVmaW5lZCB8fCBmYWNlc1sgZS5mYWNlMSBdLm5vcm1hbC5kb3QoIGZhY2VzWyBlLmZhY2UyIF0ubm9ybWFsICkgPD0gdGhyZXNob2xkRG90ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVkZ2VzR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQ3lsaW5kZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJHZW9tZXRyeTtcblxuLy8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0cmFkaXVzVG9wID0gcmFkaXVzVG9wICE9PSB1bmRlZmluZWQgPyByYWRpdXNUb3AgOiAxO1xuXHRyYWRpdXNCb3R0b20gPSByYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblxuXHRvcGVuRW5kZWQgPSBvcGVuRW5kZWQgIT09IHVuZGVmaW5lZCA/IG9wZW5FbmRlZCA6IGZhbHNlO1xuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDAuMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGluZGV4ID0gMDtcblx0dmFyIGluZGV4QXJyYXkgPSBbXTtcblx0dmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnlcblxuXHRnZW5lcmF0ZVRvcnNvKCk7XG5cblx0aWYgKCBvcGVuRW5kZWQgPT09IGZhbHNlICkge1xuXG5cdFx0aWYgKCByYWRpdXNUb3AgPiAwICkgZ2VuZXJhdGVDYXAoIHRydWUgKTtcblx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7XG5cblx0XHR2YXIgeCwgeTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsXG5cdFx0dmFyIHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHkgPSAwOyB5IDw9IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHR2YXIgaW5kZXhSb3cgPSBbXTtcblxuXHRcdFx0dmFyIHYgPSB5IC8gaGVpZ2h0U2VnbWVudHM7XG5cblx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xuXG5cdFx0XHR2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgKyByYWRpdXNUb3A7XG5cblx0XHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cdFx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHRcdHZlcnRleC55ID0gLSB2ICogaGVpZ2h0ICsgaGFsZkhlaWdodDtcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC5zZXQoIHNpblRoZXRhLCBzbG9wZSwgY29zVGhldGEgKS5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xuXG5cdFx0XHRcdGluZGV4Um93LnB1c2goIGluZGV4ICsrICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcblxuXHRcdFx0aW5kZXhBcnJheS5wdXNoKCBpbmRleFJvdyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Zm9yICggeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0XHQvLyB3ZSB1c2UgdGhlIGluZGV4IGFycmF5IHRvIGFjY2VzcyB0aGUgY29ycmVjdCBpbmRpY2VzXG5cblx0XHRcdFx0dmFyIGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcblx0XHRcdFx0dmFyIGIgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4IF07XG5cdFx0XHRcdHZhciBjID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCArIDEgXTtcblx0XHRcdFx0dmFyIGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0Ly8gdXBkYXRlIGdyb3VwIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQ2FwKCB0b3AgKSB7XG5cblx0XHR2YXIgeCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhFbmQ7XG5cblx0XHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0dmFyIHJhZGl1cyA9ICggdG9wID09PSB0cnVlICkgPyByYWRpdXNUb3AgOiByYWRpdXNCb3R0b207XG5cdFx0dmFyIHNpZ24gPSAoIHRvcCA9PT0gdHJ1ZSApID8gMSA6IC0gMTtcblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4XG5cdFx0Y2VudGVySW5kZXhTdGFydCA9IGluZGV4O1xuXG5cdFx0Ly8gZmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLlxuXHRcdC8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNlLFxuXHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcblxuXHRcdGZvciAoIHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjZW50ZXIgdmVydGV4XG5cblx0XHRjZW50ZXJJbmRleEVuZCA9IGluZGV4O1xuXG5cdFx0Ly8gbm93IHdlIGdlbmVyYXRlIHRoZSBzdXJyb3VuZGluZyB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdHZlcnRleC55ID0gaGFsZkhlaWdodCAqIHNpZ247XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIGNvc1RoZXRhICogMC41ICkgKyAwLjU7XG5cdFx0XHR1di55ID0gKCBzaW5UaGV0YSAqIDAuNSAqIHNpZ24gKSArIDAuNTtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcblx0XHRcdHZhciBpID0gY2VudGVySW5kZXhFbmQgKyB4O1xuXG5cdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBmYWNlIHRvcFxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBmYWNlIGJvdHRvbVxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSArIDEsIGksIGMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRncm91cENvdW50ICs9IDM7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cbn1cblxuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuLy8gQ29uZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVHZW9tZXRyeTtcblxuLy8gQ29uZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIGh1Z2hlc1xuICovXG5cbi8vIENpcmNsZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENpcmNsZUdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUdlb21ldHJ5O1xuXG4vLyBDaXJjbGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRzZWdtZW50cyA9IHNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgc2VnbWVudHMgKSA6IDg7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgcztcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0Ly8gY2VudGVyIHBvaW50XG5cblx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0Zm9yICggcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XG5cblx0XHR2YXIgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdC8vIHZlcnRleFxuXG5cdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdC8vIG5vcm1hbFxuXG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHQvLyB1dnNcblxuXHRcdHV2LnggPSAoIHZlcnRpY2VzWyBpIF0gLyByYWRpdXMgKyAxICkgLyAyO1xuXHRcdHV2LnkgPSAoIHZlcnRpY2VzWyBpICsgMSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblxuXHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7XG5cblxuXG52YXIgR2VvbWV0cmllcyA9IE9iamVjdC5mcmVlemUoe1xuXHRXaXJlZnJhbWVHZW9tZXRyeTogV2lyZWZyYW1lR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LFxuXHRQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSxcblx0VGV0cmFoZWRyb25HZW9tZXRyeTogVGV0cmFoZWRyb25HZW9tZXRyeSxcblx0VGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTogVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0T2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksXG5cdE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkdlb21ldHJ5OiBJY29zYWhlZHJvbkdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25HZW9tZXRyeTogRG9kZWNhaGVkcm9uR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0UG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTogUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRUdWJlR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSxcblx0VHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksXG5cdFRvcnVzS25vdEdlb21ldHJ5OiBUb3J1c0tub3RHZW9tZXRyeSxcblx0VG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LFxuXHRUb3J1c0J1ZmZlckdlb21ldHJ5OiBUb3J1c0J1ZmZlckdlb21ldHJ5LFxuXHRUZXh0R2VvbWV0cnk6IFRleHRHZW9tZXRyeSxcblx0VGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksXG5cdFNwaGVyZUdlb21ldHJ5OiBTcGhlcmVHZW9tZXRyeSxcblx0U3BoZXJlQnVmZmVyR2VvbWV0cnk6IFNwaGVyZUJ1ZmZlckdlb21ldHJ5LFxuXHRSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSxcblx0UmluZ0J1ZmZlckdlb21ldHJ5OiBSaW5nQnVmZmVyR2VvbWV0cnksXG5cdFBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnksXG5cdFBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksXG5cdExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdExhdGhlQnVmZmVyR2VvbWV0cnk6IExhdGhlQnVmZmVyR2VvbWV0cnksXG5cdFNoYXBlR2VvbWV0cnk6IFNoYXBlR2VvbWV0cnksXG5cdFNoYXBlQnVmZmVyR2VvbWV0cnk6IFNoYXBlQnVmZmVyR2VvbWV0cnksXG5cdEV4dHJ1ZGVHZW9tZXRyeTogRXh0cnVkZUdlb21ldHJ5LFxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSxcblx0RWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSxcblx0Q29uZUdlb21ldHJ5OiBDb25lR2VvbWV0cnksXG5cdENvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LFxuXHRDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5LFxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LFxuXHRDaXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksXG5cdENpcmNsZUJ1ZmZlckdlb21ldHJ5OiBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcblx0Qm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LFxuXHRCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnlcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPFRIUkVFLkNvbG9yPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRvd01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZG93TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkb3dNYXRlcmlhbDtcblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBSYXdTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1Jhd1NoYWRlck1hdGVyaWFsJztcblxufVxuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTtcblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJhd1NoYWRlck1hdGVyaWFsO1xuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICByb3VnaG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1ldGFsbmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBlbnZNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnJvdWdobmVzcyA9IDAuNTtcblx0dGhpcy5tZXRhbG5lc3MgPSAwLjU7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzO1xuXHR0aGlzLm1ldGFsbmVzcyA9IHNvdXJjZS5tZXRhbG5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGh5c2ljYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnUEhZU0lDQUwnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAwLjU7IC8vIG1hcHMgdG8gRjAgPSAwLjA0XG5cblx0dGhpcy5jbGVhckNvYXQgPSAwLjA7XG5cdHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzID0gMC4wO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cblx0dGhpcy5jbGVhckNvYXQgPSBzb3VyY2UuY2xlYXJDb2F0O1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgc3BlY3VsYXI6IDxoZXg+LFxuICogIHNoaW5pbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGhvbmdNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XG5cdHRoaXMuc2hpbmluZXNzID0gMzA7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaG9uZ01hdGVyaWFsO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcblx0dGhpcy5zaGluaW5lc3MgPSBzb3VyY2Uuc2hpbmluZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3hcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFRvb25NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBudWxsO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFRvb25NYXRlcmlhbDtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTm9ybWFsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hOb3JtYWxNYXRlcmlhbDtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFtYmVydE1hdGVyaWFsO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2NhbGU6IDxmbG9hdD4sXG4gKiAgZGFzaFNpemU6IDxmbG9hdD4sXG4gKiAgZ2FwU2l6ZTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRMaW5lQmFzaWNNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7XG5cblx0dGhpcy5zY2FsZSA9IDE7XG5cdHRoaXMuZGFzaFNpemUgPSAzO1xuXHR0aGlzLmdhcFNpemUgPSAxO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7XG5cdHRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7XG5cdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cblxudmFyIE1hdGVyaWFscyA9IE9iamVjdC5mcmVlemUoe1xuXHRTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsXG5cdFNwcml0ZU1hdGVyaWFsOiBTcHJpdGVNYXRlcmlhbCxcblx0UmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLFxuXHRTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsXG5cdFBvaW50c01hdGVyaWFsOiBQb2ludHNNYXRlcmlhbCxcblx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXG5cdE1lc2hQaG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCxcblx0TWVzaFRvb25NYXRlcmlhbDogTWVzaFRvb25NYXRlcmlhbCxcblx0TWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWwsXG5cdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6IE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXG5cdE1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCxcblx0TWVzaERpc3RhbmNlTWF0ZXJpYWw6IE1lc2hEaXN0YW5jZU1hdGVyaWFsLFxuXHRNZXNoQmFzaWNNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwsXG5cdExpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLFxuXHRMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1hdGVyaWFsOiBNYXRlcmlhbFxufSk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkaW5nTWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIGlzTG9hZGluZyA9IGZhbHNlO1xuXHR2YXIgaXRlbXNMb2FkZWQgPSAwO1xuXHR2YXIgaXRlbXNUb3RhbCA9IDA7XG5cdHZhciB1cmxNb2RpZmllciA9IHVuZGVmaW5lZDtcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xuXG5cdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcblxuXHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH07XG5cbn1cblxudmFyIERlZmF1bHRMb2FkaW5nTWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlcigpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGxvYWRpbmcgPSB7fTtcblxuZnVuY3Rpb24gRmlsZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGaWxlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHJlcXVlc3QgaXMgZHVwbGljYXRlXG5cblx0XHRpZiAoIGxvYWRpbmdbIHVybCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBkYXRhOiBVUklcblx0XHR2YXIgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87XG5cdFx0dmFyIGRhdGFVcmlSZWdleFJlc3VsdCA9IHVybC5tYXRjaCggZGF0YVVyaVJlZ2V4ICk7XG5cblx0XHQvLyBTYWZhcmkgY2FuIG5vdCBoYW5kbGUgRGF0YSBVUklzIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Qgc28gcHJvY2VzcyBtYW51YWxseVxuXHRcdGlmICggZGF0YVVyaVJlZ2V4UmVzdWx0ICkge1xuXG5cdFx0XHR2YXIgbWltZVR5cGUgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDEgXTtcblx0XHRcdHZhciBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdO1xuXHRcdFx0dmFyIGRhdGEgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDMgXTtcblxuXHRcdFx0ZGF0YSA9IHdpbmRvdy5kZWNvZGVVUklDb21wb25lbnQoIGRhdGEgKTtcblxuXHRcdFx0aWYgKCBpc0Jhc2U2NCApIGRhdGEgPSB3aW5kb3cuYXRvYiggZGF0YSApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZTtcblx0XHRcdFx0dmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDhBcnJheSggZGF0YS5sZW5ndGggKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmlld1sgaSBdID0gZGF0YS5jaGFyQ29kZUF0KCBpICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCByZXNwb25zZVR5cGUgPT09ICdibG9iJyApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHZpZXcuYnVmZmVyIF0sIHsgdHlwZTogbWltZVR5cGUgfSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gdmlldy5idWZmZXI7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdkb2N1bWVudCc6XG5cblx0XHRcdFx0XHRcdHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnanNvbic6XG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlclxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGRhdGE7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEluaXRpYWxpc2UgYXJyYXkgZm9yIGR1cGxpY2F0ZSByZXF1ZXN0c1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXSA9IFtdO1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XG5cblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcblxuXHRcdFx0fSApO1xuXG5cdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG5cdFx0XHRyZXF1ZXN0Lm9wZW4oICdHRVQnLCB1cmwsIHRydWUgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTtcblxuXHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgcmVzcG9uc2UgKTtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDIwMCApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkxvYWQgKSBjYWxsYmFjay5vbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdGlmICggdGhpcy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCApIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cdFx0XHRpZiAoIHRoaXMud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRpZiAoIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSApIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSggdGhpcy5taW1lVHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5taW1lVHlwZSA6ICd0ZXh0L3BsYWluJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMucmVxdWVzdEhlYWRlciApIHtcblxuXHRcdFx0XHRyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRlciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3Quc2VuZCggbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbWFnZXMgPSBbXTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxIClcblx0XHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGYgXSA9IHsgbWlwbWFwczogW10gfTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTmlrb3MgTS4gLyBodHRwczovL2dpdGh1Yi5jb20vZm9vMTIzL1xuICpcbiAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gbG9hZCBnZW5lcmljIGJpbmFyeSB0ZXh0dXJlcyBmb3JtYXRzIChyZ2JlLCBoZHIsIC4uLilcbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHQvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3Nlc1xuXHR0aGlzLl9wYXJzZXIgPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIERhdGFUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdHZhciB0ZXhEYXRhID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5pbWFnZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmRhdGEgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBTID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBUID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1hZ0ZpbHRlciA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWluRmlsdGVyID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5hbmlzb3Ryb3B5ID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZm9ybWF0ICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pcG1hcHMgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggMSA9PT0gdGV4RGF0YS5taXBtYXBDb3VudCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogJ0Fub255bW91cycsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cblx0XHQvKlxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdGlmICggb25Qcm9ncmVzcyApIG9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXHRcdCovXG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdBbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlO1xuXG5cdFx0XHRcdGxvYWRlZCArKztcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlO1xuXG5cdFx0XHQvLyBKUEVHcyBjYW4ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG1lbW9yeSBjYW4gYmUgc2F2ZWQgYnkgc3RvcmluZyB0aGVtIGFzIFJHQi5cblx0XHRcdHZhciBpc0pQRUcgPSB1cmwuc2VhcmNoKCAvXFwuKGpwZ3xqcGVnKSQvICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVxcOmltYWdlXFwvanBlZy8gKSA9PT0gMDtcblxuXHRcdFx0dGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3RcbiAqXG4gKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOlxuICogLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApLCAuZ2V0VGFuZ2VudCggdCApXG4gKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSApXG4gKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKVxuICogLmdldExlbmd0aCgpXG4gKiAudXBkYXRlQXJjTGVuZ3RocygpXG4gKlxuICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJFRS5DdXJ2ZTpcbiAqXG4gKiAtLSAyRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkFyY0N1cnZlXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlXG4gKiBUSFJFRS5FbGxpcHNlQ3VydmVcbiAqIFRIUkVFLkxpbmVDdXJ2ZVxuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLlNwbGluZUN1cnZlXG4gKlxuICogLS0gM0QgY3VydmVzIC0tXG4gKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlM1xuICogVEhSRUUuTGluZUN1cnZlM1xuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzXG4gKlxuICogQSBzZXJpZXMgb2YgY3VydmVzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFRIUkVFLkN1cnZlUGF0aC5cbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEFic3RyYWN0IEN1cnZlIGJhc2UgY2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmUoKSB7XG5cblx0dGhpcy50eXBlID0gJ0N1cnZlJztcblxuXHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHtcblxuXHQvLyBWaXJ0dWFsIGJhc2UgY2xhc3MgbWV0aG9kIHRvIG92ZXJ3cml0ZSBhbmQgaW1wbGVtZW50IGluIHN1YmNsYXNzZXNcblx0Ly9cdC0gdCBbMCAuLiAxXVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIC8qIHQsIG9wdGlvbmFsVGFyZ2V0ICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7XG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBHZXQgcG9pbnQgYXQgcmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGhcblx0Ly8gLSB1IFswIC4uIDFdXG5cblx0Z2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludCggdCApXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHNcblxuXHRnZXRMZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdGlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiZcblx0XHRcdCggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiZcblx0XHRcdCEgdGhpcy5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dmFyIGNhY2hlID0gW107XG5cdFx0dmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIHAsIHN1bSA9IDA7XG5cblx0XHRjYWNoZS5wdXNoKCAwICk7XG5cblx0XHRmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7XG5cblx0XHRcdGN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7XG5cdFx0XHRzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7XG5cdFx0XHRjYWNoZS5wdXNoKCBzdW0gKTtcblx0XHRcdGxhc3QgPSBjdXJyZW50O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTtcblxuXHRcdHJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXG5cblx0fSxcblxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmdldExlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAuIFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnRcblxuXHRnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0XHR2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHR2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdHZhciBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHR2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdO1xuXHRcdHZhciBsZW5ndGhBZnRlciA9IGFyY0xlbmd0aHNbIGkgKyAxIF07XG5cblx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdHZhciBzZWdtZW50RnJhY3Rpb24gPSAoIHRhcmdldEFyY0xlbmd0aCAtIGxlbmd0aEJlZm9yZSApIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHRcblxuXHRcdHZhciB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApO1xuXG5cdFx0cmV0dXJuIHQ7XG5cblx0fSxcblxuXHQvLyBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCB0XG5cdC8vIEluIGNhc2UgYW55IHN1YiBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbixcblx0Ly8gMiBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcblx0Ly8gd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvblxuXG5cdGdldFRhbmdlbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkZWx0YSA9IDAuMDAwMTtcblx0XHR2YXIgdDEgPSB0IC0gZGVsdGE7XG5cdFx0dmFyIHQyID0gdCArIGRlbHRhO1xuXG5cdFx0Ly8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlclxuXG5cdFx0aWYgKCB0MSA8IDAgKSB0MSA9IDA7XG5cdFx0aWYgKCB0MiA+IDEgKSB0MiA9IDE7XG5cblx0XHR2YXIgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHR2YXIgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTtcblxuXHRcdHZhciB2ZWMgPSBwdDIuY2xvbmUoKS5zdWIoIHB0MSApO1xuXHRcdHJldHVybiB2ZWMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVGcmVuZXRGcmFtZXM6IGZ1bmN0aW9uICggc2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGZcblxuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRhbmdlbnRzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgYmlub3JtYWxzID0gW107XG5cblx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHZhciBpLCB1LCB0aGV0YTtcblxuXHRcdC8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHUgPSBpIC8gc2VnbWVudHM7XG5cblx0XHRcdHRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSApO1xuXHRcdFx0dGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsXG5cdFx0Ly8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50XG5cblx0XHRub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblx0XHR2YXIgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS54ICk7XG5cdFx0dmFyIHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdHZhciB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTtcblxuXHRcdGlmICggdHggPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eDtcblx0XHRcdG5vcm1hbC5zZXQoIDEsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHkgPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eTtcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHogPD0gbWluICkge1xuXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTtcblxuXHRcdG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApO1xuXHRcdGJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7XG5cblxuXHRcdC8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0YW5nZW50c1sgaSAtIDEgXS5kb3QoIHRhbmdlbnRzWyBpIF0gKSwgLSAxLCAxICkgKTsgLy8gY2xhbXAgZm9yIGZsb2F0aW5nIHB0IGVycm9yc1xuXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB2ZWMsIHRoZXRhICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCwgcG9zdHByb2Nlc3MgdGhlIHZlY3RvcnMgc28gdGhlIGZpcnN0IGFuZCBsYXN0IG5vcm1hbCB2ZWN0b3JzIGFyZSB0aGUgc2FtZVxuXG5cdFx0aWYgKCBjbG9zZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XG5cblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xuXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHQvLyB0d2lzdCBhIGxpdHRsZS4uLlxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTtcblx0XHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhbmdlbnRzOiB0YW5nZW50cyxcblx0XHRcdG5vcm1hbHM6IG5vcm1hbHMsXG5cdFx0XHRiaW5vcm1hbHM6IGJpbm9ybWFsc1xuXHRcdH07XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHNvdXJjZS5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdDdXJ2ZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0ZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFbGxpcHNlQ3VydmUnO1xuXG5cdHRoaXMuYVggPSBhWCB8fCAwO1xuXHR0aGlzLmFZID0gYVkgfHwgMDtcblxuXHR0aGlzLnhSYWRpdXMgPSB4UmFkaXVzIHx8IDE7XG5cdHRoaXMueVJhZGl1cyA9IHlSYWRpdXMgfHwgMTtcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGUgfHwgMDtcblx0dGhpcy5hRW5kQW5nbGUgPSBhRW5kQW5nbGUgfHwgMiAqIE1hdGguUEk7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gYUNsb2Nrd2lzZSB8fCBmYWxzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbiB8fCAwO1xuXG59XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbGxpcHNlQ3VydmU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB0d29QaSA9IE1hdGguUEkgKiAyO1xuXHR2YXIgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcblx0dmFyIHNhbWVQb2ludHMgPSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047XG5cblx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXG5cdHdoaWxlICggZGVsdGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpO1xuXHR3aGlsZSAoIGRlbHRhQW5nbGUgPiB0d29QaSApIGRlbHRhQW5nbGUgLT0gdHdvUGk7XG5cblx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRpZiAoIHNhbWVQb2ludHMgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IHR3b1BpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRpZiAoIHRoaXMuYUNsb2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7XG5cblx0XHRpZiAoIGRlbHRhQW5nbGUgPT09IHR3b1BpICkge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcblx0dmFyIHggPSB0aGlzLmFYICsgdGhpcy54UmFkaXVzICogTWF0aC5jb3MoIGFuZ2xlICk7XG5cdHZhciB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApO1xuXG5cdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHRoaXMuYVJvdGF0aW9uICk7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApO1xuXG5cdFx0dmFyIHR4ID0geCAtIHRoaXMuYVg7XG5cdFx0dmFyIHR5ID0geSAtIHRoaXMuYVk7XG5cblx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG5cdFx0eCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYO1xuXHRcdHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50LnNldCggeCwgeSApO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmFYID0gc291cmNlLmFYO1xuXHR0aGlzLmFZID0gc291cmNlLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IHNvdXJjZS54UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSBzb3VyY2UueVJhZGl1cztcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gc291cmNlLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IHNvdXJjZS5hRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gc291cmNlLmFDbG9ja3dpc2U7XG5cblx0dGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5hWCA9IHRoaXMuYVg7XG5cdGRhdGEuYVkgPSB0aGlzLmFZO1xuXG5cdGRhdGEueFJhZGl1cyA9IHRoaXMueFJhZGl1cztcblx0ZGF0YS55UmFkaXVzID0gdGhpcy55UmFkaXVzO1xuXG5cdGRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlO1xuXHRkYXRhLmFFbmRBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlO1xuXG5cdGRhdGEuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZTtcblxuXHRkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5hWCA9IGpzb24uYVg7XG5cdHRoaXMuYVkgPSBqc29uLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IGpzb24ueFJhZGl1cztcblx0dGhpcy55UmFkaXVzID0ganNvbi55UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBqc29uLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGpzb24uYUVuZEFuZ2xlO1xuXG5cdHRoaXMuYUNsb2Nrd2lzZSA9IGpzb24uYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBBcmNDdXJ2ZSggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdEVsbGlwc2VDdXJ2ZS5jYWxsKCB0aGlzLCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXJjQ3VydmUnO1xuXG59XG5cbkFyY0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgKTtcbkFyY0N1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFyY0N1cnZlO1xuXG5BcmNDdXJ2ZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKlxuICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmdcbiAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLlxuICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGZcbiAqXG4gKiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb21cbiAqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjVcbiAqL1xuXG5cbi8qXG5CYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluXG4gLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zL1xuIC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNXG5cblRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucyxcbmJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbFxud2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLlxuKi9cblxuZnVuY3Rpb24gQ3ViaWNQb2x5KCkge1xuXG5cdHZhciBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7XG5cblx0Lypcblx0ICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbFxuXHQgKiAgIHAocykgPSBjMCArIGMxKnMgKyBjMipzXjIgKyBjMypzXjNcblx0ICogc3VjaCB0aGF0XG5cdCAqICAgcCgwKSA9IHgwLCBwKDEpID0geDFcblx0ICogIGFuZFxuXHQgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0KCB4MCwgeDEsIHQwLCB0MSApIHtcblxuXHRcdGMwID0geDA7XG5cdFx0YzEgPSB0MDtcblx0XHRjMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7XG5cdFx0YzMgPSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0aW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTtcblxuXHRcdH0sXG5cblx0XHRpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGFuZ2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml1cblx0XHRcdHZhciB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7XG5cdFx0XHR2YXIgdDIgPSAoIHgyIC0geDEgKSAvIGR0MSAtICggeDMgLSB4MSApIC8gKCBkdDEgKyBkdDIgKSArICggeDMgLSB4MiApIC8gZHQyO1xuXG5cdFx0XHQvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV1cblx0XHRcdHQxICo9IGR0MTtcblx0XHRcdHQyICo9IGR0MTtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0MSwgdDIgKTtcblxuXHRcdH0sXG5cblx0XHRjYWxjOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHRcdHZhciB0MiA9IHQgKiB0O1xuXHRcdFx0dmFyIHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG52YXIgdG1wID0gbmV3IFZlY3RvcjMoKTtcbnZhciBweCA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweSA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweiA9IG5ldyBDdWJpY1BvbHkoKTtcblxuZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcG9pbnRzLCBjbG9zZWQsIGN1cnZlVHlwZSwgdGVuc2lvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NhdG11bGxSb21DdXJ2ZTMnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXHR0aGlzLmNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBjdXJ2ZVR5cGUgfHwgJ2NlbnRyaXBldGFsJztcblx0dGhpcy50ZW5zaW9uID0gdGVuc2lvbiB8fCAwLjU7XG5cbn1cblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2F0bXVsbFJvbUN1cnZlMztcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuaXNDYXRtdWxsUm9tQ3VydmUzID0gdHJ1ZTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0dmFyIHAgPSAoIGwgLSAoIHRoaXMuY2xvc2VkID8gMCA6IDEgKSApICogdDtcblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHR2YXIgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xuXG5cdGlmICggdGhpcy5jbG9zZWQgKSB7XG5cblx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7XG5cblx0fSBlbHNlIGlmICggd2VpZ2h0ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHtcblxuXHRcdGludFBvaW50ID0gbCAtIDI7XG5cdFx0d2VpZ2h0ID0gMTtcblxuXHR9XG5cblx0dmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBvaW50c1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkge1xuXG5cdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGZpcnN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcblx0XHRwMCA9IHRtcDtcblxuXHR9XG5cblx0cDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xuXHRwMiA9IHBvaW50c1sgKCBpbnRQb2ludCArIDEgKSAlIGwgXTtcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7XG5cblx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgbGFzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XG5cdFx0cDMgPSB0bXA7XG5cblx0fVxuXG5cdGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHtcblxuXHRcdC8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tXG5cdFx0dmFyIHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xuXHRcdHZhciBkdDAgPSBNYXRoLnBvdyggcDAuZGlzdGFuY2VUb1NxdWFyZWQoIHAxICksIHBvdyApO1xuXHRcdHZhciBkdDEgPSBNYXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApO1xuXHRcdHZhciBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xuXG5cdFx0Ly8gc2FmZXR5IGNoZWNrIGZvciByZXBlYXRlZCBwb2ludHNcblx0XHRpZiAoIGR0MSA8IDFlLTQgKSBkdDEgPSAxLjA7XG5cdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xuXHRcdGlmICggZHQyIDwgMWUtNCApIGR0MiA9IGR0MTtcblxuXHRcdHB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB6LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgZHQwLCBkdDEsIGR0MiApO1xuXG5cdH0gZWxzZSBpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2F0bXVsbHJvbScgKSB7XG5cblx0XHRweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7XG5cdFx0cHkuaW5pdENhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIHRoaXMudGVuc2lvbiApO1xuXHRcdHB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCB0aGlzLnRlbnNpb24gKTtcblxuXHR9XG5cblx0cG9pbnQuc2V0KFxuXHRcdHB4LmNhbGMoIHdlaWdodCApLFxuXHRcdHB5LmNhbGMoIHdlaWdodCApLFxuXHRcdHB6LmNhbGMoIHdlaWdodCApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XG5cblx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0fVxuXG5cdHRoaXMuY2xvc2VkID0gc291cmNlLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlO1xuXHR0aGlzLnRlbnNpb24gPSBzb3VyY2UudGVuc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHR9XG5cblx0ZGF0YS5jbG9zZWQgPSB0aGlzLmNsb3NlZDtcblx0ZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTtcblx0ZGF0YS50ZW5zaW9uID0gdGhpcy50ZW5zaW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0dGhpcy5jbG9zZWQgPSBqc29uLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBqc29uLmN1cnZlVHlwZTtcblx0dGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBCZXppZXIgQ3VydmVzIGZvcm11bGFzIG9idGFpbmVkIGZyb21cbiAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZVxuICovXG5cbmZ1bmN0aW9uIENhdG11bGxSb20oIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHZhciB2MCA9ICggcDIgLSBwMCApICogMC41O1xuXHR2YXIgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcblx0dmFyIHQyID0gdCAqIHQ7XG5cdHZhciB0MyA9IHQgKiB0Mjtcblx0cmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xuXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIGsgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIDMgKiBrICogayAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDMgKiAoIDEgLSB0ICkgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMyggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0cmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAxKCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArXG5cdFx0Q3ViaWNCZXppZXJQMyggdCwgcDMgKTtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZSA9IHRydWU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlMyc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MyA9IHYzIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlMztcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcblxuXHRwb2ludC5zZXQoXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56LCB2My56IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUnO1xuXG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5MaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmlzTGluZUN1cnZlID0gdHJ1ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKS5zdWIoIHRoaXMudjEgKTtcblx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbi8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFRhbmdlbnQgPSBmdW5jdGlvbiAoIC8qIHQgKi8gKSB7XG5cblx0dmFyIHRhbmdlbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlzLnYxICk7XG5cblx0cmV0dXJuIHRhbmdlbnQubm9ybWFsaXplKCk7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUzJztcblxuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuTGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlMztcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuaXNMaW5lQ3VydmUzID0gdHJ1ZTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG4vLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc1F1YWRyYXRpY0JlemllckN1cnZlID0gdHJ1ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUzJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTM7XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gU3BsaW5lQ3VydmUoIHBvaW50cyAvKiBhcnJheSBvZiBWZWN0b3IyICovICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BsaW5lQ3VydmUnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXG59XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BsaW5lQ3VydmU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIHAgPSAoIHBvaW50cy5sZW5ndGggLSAxICkgKiB0O1xuXG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcblx0dmFyIHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHR2YXIgcDAgPSBwb2ludHNbIGludFBvaW50ID09PSAwID8gaW50UG9pbnQgOiBpbnRQb2ludCAtIDEgXTtcblx0dmFyIHAxID0gcG9pbnRzWyBpbnRQb2ludCBdO1xuXHR2YXIgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xuXHR2YXIgcDMgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDMgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMiBdO1xuXG5cdHBvaW50LnNldChcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLnggKSxcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLnksIHAxLnksIHAyLnksIHAzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcblxuXHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xuXHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5cbnZhciBDdXJ2ZXMgPSBPYmplY3QuZnJlZXplKHtcblx0QXJjQ3VydmU6IEFyY0N1cnZlLFxuXHRDYXRtdWxsUm9tQ3VydmUzOiBDYXRtdWxsUm9tQ3VydmUzLFxuXHRDdWJpY0JlemllckN1cnZlOiBDdWJpY0JlemllckN1cnZlLFxuXHRDdWJpY0JlemllckN1cnZlMzogQ3ViaWNCZXppZXJDdXJ2ZTMsXG5cdEVsbGlwc2VDdXJ2ZTogRWxsaXBzZUN1cnZlLFxuXHRMaW5lQ3VydmU6IExpbmVDdXJ2ZSxcblx0TGluZUN1cnZlMzogTGluZUN1cnZlMyxcblx0UXVhZHJhdGljQmV6aWVyQ3VydmU6IFF1YWRyYXRpY0JlemllckN1cnZlLFxuXHRRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6IFF1YWRyYXRpY0JlemllckN1cnZlMyxcblx0U3BsaW5lQ3VydmU6IFNwbGluZUN1cnZlXG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJheSBvZiBjb25uZWN0ZWRcbiAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2YgYSBjdXJ2ZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdXJ2ZVBhdGgnO1xuXG5cdHRoaXMuY3VydmVzID0gW107XG5cdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoXG5cbn1cblxuQ3VydmVQYXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1cnZlUGF0aCxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY3VydmUgKSB7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdH0sXG5cblx0Y2xvc2VQYXRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcblx0XHR2YXIgc3RhcnRQb2ludCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTtcblx0XHR2YXIgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7XG5cblx0XHRpZiAoICEgc3RhcnRQb2ludC5lcXVhbHMoIGVuZFBvaW50ICkgKSB7XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xuXHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXG5cdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcblxuXHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXG5cdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxuXHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXG5cdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xuXHRcdHZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdC8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9pbnRzLlxuXG5cdFx0d2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHtcblxuXHRcdFx0aWYgKCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkge1xuXG5cdFx0XHRcdHZhciBkaWZmID0gY3VydmVMZW5ndGhzWyBpIF0gLSBkO1xuXHRcdFx0XHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7XG5cdFx0XHRcdHZhciB1ID0gc2VnbWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHRcdFx0cmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpICsrO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0XHQvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGRcblxuXHR9LFxuXG5cdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cblx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXG5cdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtXG5cdC8vIFdlIGNhbm5vdCBvdmVyd3JpdGUgZ2V0TGVuZ3RocygpIGJlY2F1c2UgVXRvVCBtYXBwaW5nIHVzZXMgaXQuXG5cblx0Z2V0Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXG5cblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XG5cblx0XHR9XG5cblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxuXG5cdFx0dmFyIGxlbmd0aHMgPSBbXSwgc3VtcyA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzdW1zICs9IHRoaXMuY3VydmVzWyBpIF0uZ2V0TGVuZ3RoKCk7XG5cdFx0XHRsZW5ndGhzLnB1c2goIHN1bXMgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RocztcblxuXHRcdHJldHVybiBsZW5ndGhzO1xuXG5cdH0sXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0MDtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTI7XG5cblx0XHR2YXIgcG9pbnRzID0gW10sIGxhc3Q7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gY3VydmVzWyBpIF07XG5cdFx0XHR2YXIgcmVzb2x1dGlvbiA9ICggY3VydmUgJiYgY3VydmUuaXNFbGxpcHNlQ3VydmUgKSA/IGRpdmlzaW9ucyAqIDJcblx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzTGluZUN1cnZlICkgPyAxXG5cdFx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzU3BsaW5lQ3VydmUgKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGhcblx0XHRcdFx0XHRcdDogZGl2aXNpb25zO1xuXG5cdFx0XHR2YXIgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHBvaW50ID0gcHRzWyBqIF07XG5cblx0XHRcdFx0aWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzXG5cblx0XHRcdFx0cG9pbnRzLnB1c2goIHBvaW50ICk7XG5cdFx0XHRcdGxhc3QgPSBwb2ludDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhIHBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBzb3VyY2UuY3VydmVzWyBpIF07XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXV0b0Nsb3NlID0gc291cmNlLmF1dG9DbG9zZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblx0XHRcdGRhdGEuY3VydmVzLnB1c2goIGN1cnZlLnRvSlNPTigpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTtcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0ganNvbi5jdXJ2ZXNbIGkgXTtcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGN1cnZlLnR5cGUgXSgpLmZyb21KU09OKCBjdXJ2ZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBDcmVhdGVzIGZyZWUgZm9ybSAyZCBwYXRoIHVzaW5nIHNlcmllcyBvZiBwb2ludHMsIGxpbmVzIG9yIGN1cnZlcy5cbiAqKi9cblxuZnVuY3Rpb24gUGF0aCggcG9pbnRzICkge1xuXG5cdEN1cnZlUGF0aC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhdGgnO1xuXG5cdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59XG5cblBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBhdGgsXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5aW5nP1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBDdWJpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQMnkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzIC8qQXJyYXkgb2YgVmVjdG9yKi8gKSB7XG5cblx0XHR2YXIgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggcHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7XG5cblx0fSxcblxuXHRhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsXG5cdFx0XHRhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0fSxcblxuXHRhYnNhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGVsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xuXG5cdH0sXG5cblx0YWJzZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0XHRpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luXG5cdFx0XHR2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7XG5cblx0XHRcdGlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHtcblxuXHRcdFx0XHR0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRDdXJ2ZVBhdGgucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBzb3VyY2UuY3VycmVudFBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBDdXJ2ZVBhdGgucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLmN1cnJlbnRQb2ludCA9IHRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdEN1cnZlUGF0aC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KCBqc29uLmN1cnJlbnRQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRGVmaW5lcyBhIDJkIHNoYXBlIHBsYW5lIHVzaW5nIHBhdGhzLlxuICoqL1xuXG4vLyBTVEVQIDEgQ3JlYXRlIGEgcGF0aC5cbi8vIFNURVAgMiBUdXJuIHBhdGggaW50byBzaGFwZS5cbi8vIFNURVAgMyBFeHRydWRlR2VvbWV0cnkgdGFrZXMgaW4gU2hhcGUvU2hhcGVzXG4vLyBTVEVQIDNhIC0gRXh0cmFjdCBwb2ludHMgZnJvbSBlYWNoIHNoYXBlLCB0dXJuIHRvIHZlcnRpY2VzXG4vLyBTVEVQIDNiIC0gVHJpYW5ndWxhdGUgZWFjaCBzaGFwZSwgYWRkIGZhY2VzLlxuXG5mdW5jdGlvbiBTaGFwZSggcG9pbnRzICkge1xuXG5cdFBhdGguY2FsbCggdGhpcywgcG9pbnRzICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlJztcblxuXHR0aGlzLmhvbGVzID0gW107XG5cbn1cblxuU2hhcGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGF0aC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTaGFwZSxcblxuXHRnZXRQb2ludHNIb2xlczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IHBvaW50cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0ZXIpXG5cblx0ZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRQYXRoLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XG5cblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBQYXRoLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSB0aGlzLmhvbGVzWyBpIF07XG5cdFx0XHRkYXRhLmhvbGVzLnB1c2goIGhvbGUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0ganNvbi5ob2xlc1sgaSBdO1xuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBuZXcgUGF0aCgpLmZyb21KU09OKCBob2xlICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxO1xuXG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5MaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaWdodCxcblxuXHRpc0xpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcblxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHQsXG5cblx0aXNIZW1pc3BoZXJlTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0dGhpcy5iaWFzID0gMDtcblx0dGhpcy5yYWRpdXMgPSAxO1xuXG5cdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwge1xuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XG5cblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XG5cblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodFNoYWRvdygpIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuU3BvdExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdyxcblxuXHRpc1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHR2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cblx0XHR2YXIgZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBsaWdodC5hbmdsZTtcblx0XHR2YXIgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDtcblx0XHR2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XG5cblx0XHRcdGNhbWVyYS5mb3YgPSBmb3Y7XG5cdFx0XHRjYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuYW5nbGUgPSAoIGFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IGFuZ2xlIDogTWF0aC5QSSAvIDM7XG5cdHRoaXMucGVudW1icmEgPSAoIHBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSA/IHBlbnVtYnJhIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpO1xuXG59XG5cblNwb3RMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHQsXG5cblx0aXNTcG90TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTtcblx0XHR0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5Qb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50TGlnaHQsXG5cblx0aXNQb2ludExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyggKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3dcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCxcblxuXHRpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsXG5cblx0aXNBbWJpZW50TGlnaHQ6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmVjdEFyZWFMaWdodCc7XG5cblx0dGhpcy53aWR0aCA9ICggd2lkdGggIT09IHVuZGVmaW5lZCApID8gd2lkdGggOiAxMDtcblx0dGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQgOiAxMDtcblxufVxuXG5SZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsXG5cblx0aXNSZWN0QXJlYUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgdGhhdCBpbnRlcnBvbGF0ZXMgU3RyaW5nc1xuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gU3RyaW5nS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnc3RyaW5nJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBCb29sZWFuS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcblxufVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdib29sJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxuXHQvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkXG5cdC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0XG5cdC8vIGNvbXB1dGVzIFwiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApXCIuXG5cbn0gKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGludGVycG9sYW50cyBvdmVyIHBhcmFtZXRyaWMgc2FtcGxlcy5cbiAqXG4gKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBpcyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGhcbiAqIGFsb25nIGEgY3VydmUgZGVmaW5lZCBieSB0aGUgZGF0YS5cbiAqXG4gKiBUaGUgc2FtcGxlIHZhbHVlcyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXlcbiAqIGFwcGx5IHNwZWNpYWwgaW50ZXJwcmV0YXRpb25zIHRvIHRoZSBkYXRhLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2QsIGRlZmVycmluZ1xuICogdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIHRvIGRlcml2ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBjcm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHNcbiAqIGFuZCBPKGxvZyBOKSBmb3IgcmFuZG9tIGFjY2Vzcywgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucy5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICpcbiAqIFx0XHRodHRwOi8vd3d3Lm9vZGVzaWduLmNvbS90ZW1wbGF0ZS1tZXRob2QtcGF0dGVybi5odG1sXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdHRoaXMucGFyYW1ldGVyUG9zaXRpb25zID0gcGFyYW1ldGVyUG9zaXRpb25zO1xuXHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cblx0dGhpcy5yZXN1bHRCdWZmZXIgPSByZXN1bHRCdWZmZXIgIT09IHVuZGVmaW5lZCA/XG5cdFx0cmVzdWx0QnVmZmVyIDogbmV3IHNhbXBsZVZhbHVlcy5jb25zdHJ1Y3Rvciggc2FtcGxlU2l6ZSApO1xuXHR0aGlzLnNhbXBsZVZhbHVlcyA9IHNhbXBsZVZhbHVlcztcblx0dGhpcy52YWx1ZVNpemUgPSBzYW1wbGVTaXplO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwge1xuXG5cdGV2YWx1YXRlOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXG5cblx0XHRcdHQxID0gcHBbIGkxIF0sXG5cdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdHZhbGlkYXRlX2ludGVydmFsOiB7XG5cblx0XHRcdHNlZWs6IHtcblxuXHRcdFx0XHR2YXIgcmlnaHQ7XG5cblx0XHRcdFx0bGluZWFyX3NjYW46IHtcblxuXHRcdFx0XHRcdC8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmluZWQvM1xuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cblx0XHRcdFx0XHQvLy0gXHRcdFx0XHRpZiAoIHQgPj0gdDEgfHwgdDEgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRmb3J3YXJkX3NjYW46IGlmICggISAoIHQgPCB0MSApICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSArIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBhZnRlciBlbmRcblxuXHRcdFx0XHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQsIHQwICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQwID0gdDE7XG5cdFx0XHRcdFx0XHRcdHQxID0gcHBbICsrIGkxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXHRcdFx0XHRcdGlmICggdCA8IHQwIHx8IHQwID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aWYgKCAhICggdCA+PSB0MCApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsb29waW5nP1xuXG5cdFx0XHRcdFx0XHR2YXIgdDFnbG9iYWwgPSBwcFsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcblxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSAtIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XG5cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcblx0XHRcdFx0XHRcdGkxID0gMDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXG5cblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcblxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXG5cblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcblxuXHRcdFx0XHRcdHZhciBtaWQgPSAoIGkxICsgcmlnaHQgKSA+Pj4gMTtcblxuXHRcdFx0XHRcdGlmICggdCA8IHBwWyBtaWQgXSApIHtcblxuXHRcdFx0XHRcdFx0cmlnaHQgPSBtaWQ7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpMSA9IG1pZCArIDE7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHQxID0gcHBbIGkxIF07XG5cdFx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0XHRcdC8vIGNoZWNrIGJvdW5kYXJ5IGNhc2VzLCBhZ2FpblxuXG5cdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IC8vIHNlZWtcblxuXHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblxuXHRcdFx0dGhpcy5pbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICk7XG5cblx0XHR9IC8vIHZhbGlkYXRlX2ludGVydmFsXG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTtcblxuXHR9LFxuXG5cdHNldHRpbmdzOiBudWxsLCAvLyBvcHRpb25hbCwgc3ViY2xhc3Mtc3BlY2lmaWMgc2V0dGluZ3Mgc3RydWN0dXJlXG5cdC8vIE5vdGU6IFRoZSBpbmRpcmVjdGlvbiBhbGxvd3MgY2VudHJhbCBjb250cm9sIG9mIG1hbnkgaW50ZXJwb2xhbnRzLlxuXG5cdC8vIC0tLSBQcm90ZWN0ZWQgaW50ZXJmYWNlXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge30sXG5cblx0Z2V0U2V0dGluZ3NfOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187XG5cblx0fSxcblxuXHRjb3B5U2FtcGxlVmFsdWVfOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Ly8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyXG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPSB2YWx1ZXNbIG9mZnNldCArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBUZW1wbGF0ZSBtZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6XG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdCwgdDEgKi8gKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCcgKTtcblx0XHQvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVzdWx0QnVmZmVyXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdDEgKi8gKSB7XG5cblx0XHQvLyBlbXB0eVxuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0Ly8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YmVmb3JlU3RhcnRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxuXHQvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YWZ0ZXJFbmRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxufSApO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQgPSBpMSAqIHN0cmlkZSxcblxuXHRcdFx0YWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7XG5cblx0XHRmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0ICs9IDQgKSB7XG5cblx0XHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3F1YXRlcm5pb24nLFxuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ29sb3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdjb2xvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cblx0Ly8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC5cblx0Ly8gSG93ZXZlciwgdGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTnVtYmVyS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5OdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTnVtYmVyS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnbnVtYmVyJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuXG4gKlxuICogSXQgd2FzIGRlcml2ZWQgZnJvbSBhIEhlcm1pdGlhbiBjb25zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgZmlyc3QgZGVyaXZhdGl2ZVxuICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9uc1xuICogb3ZlciB0aGVpciBwYXJhbWV0ZXIgaW50ZXJ2YWwuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEN1YmljSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG5cdHRoaXMuX3dlaWdodFByZXYgPSAtIDA7XG5cdHRoaXMuX29mZnNldFByZXYgPSAtIDA7XG5cdHRoaXMuX3dlaWdodE5leHQgPSAtIDA7XG5cdHRoaXMuX29mZnNldE5leHQgPSAtIDA7XG5cbn1cblxuQ3ViaWNJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdWJpY0ludGVycG9sYW50LFxuXG5cdERlZmF1bHRTZXR0aW5nc186IHtcblxuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQxICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpUHJldiA9IGkxIC0gMixcblx0XHRcdGlOZXh0ID0gaTEgKyAxLFxuXG5cdFx0XHR0UHJldiA9IHBwWyBpUHJldiBdLFxuXHRcdFx0dE5leHQgPSBwcFsgaU5leHQgXTtcblxuXHRcdGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHQwKSA9IDBcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gMiAqIHQwIC0gdDE7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpUHJldiA9IHBwLmxlbmd0aCAtIDI7XG5cdFx0XHRcdFx0dFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IHQxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodE4pID0gMFxuXHRcdFx0XHRcdGlOZXh0ID0gaTE7XG5cdFx0XHRcdFx0dE5leHQgPSAyICogdDEgLSB0MDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlOZXh0ID0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQxICsgcHBbIDEgXSAtIHBwWyAwIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aU5leHQgPSBpMSAtIDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZEdCA9ICggdDEgLSB0MCApICogMC41LFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemU7XG5cblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKCB0MCAtIHRQcmV2ICk7XG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQgLSB0MSApO1xuXHRcdHRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTtcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gaU5leHQgKiBzdHJpZGU7XG5cblx0fSxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHR2YXIgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7XG5cdFx0dmFyIHMwID0gKCAxICsgd1AgKSAqIHBwcCArICggLSAxLjUgLSAyICogd1AgKSAqIHBwICsgKCAtIDAuNSArIHdQICkgKiBwICsgMTtcblx0XHR2YXIgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XG5cdFx0dmFyIHNOID0gd04gKiBwcHAgLSB3TiAqIHBwO1xuXG5cdFx0Ly8gY29tYmluZSBkYXRhIGxpbmVhcmx5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHNQICogdmFsdWVzWyBvUCArIGkgXSArXG5cdFx0XHRcdFx0czAgKiB2YWx1ZXNbIG8wICsgaSBdICtcblx0XHRcdFx0XHRzMSAqIHZhbHVlc1sgbzEgKyBpIF0gK1xuXHRcdFx0XHRcdHNOICogdmFsdWVzWyBvTiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIExpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldDEgPSBpMSAqIHN0cmlkZSxcblx0XHRcdG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0d2VpZ2h0MCA9IDEgLSB3ZWlnaHQxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICtcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VlZGluZ1xuICogdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gRGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbnZhciBBbmltYXRpb25VdGlscyA9IHtcblxuXHQvLyBzYW1lIGFzIEFycmF5LnByb3RvdHlwZS5zbGljZSwgYnV0IGFsc28gd29ya3Mgb24gdHlwZWQgYXJyYXlzXG5cdGFycmF5U2xpY2U6IGZ1bmN0aW9uICggYXJyYXksIGZyb20sIHRvICkge1xuXG5cdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdC8vIGluIGlvczkgYXJyYXkuc3ViYXJyYXkoZnJvbSwgdW5kZWZpbmVkKSB3aWxsIHJldHVybiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gYnV0IGFycmF5LnN1YmFycmF5KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdFxuXHRcdFx0cmV0dXJuIG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYXJyYXkuc3ViYXJyYXkoIGZyb20sIHRvICE9PSB1bmRlZmluZWQgPyB0byA6IGFycmF5Lmxlbmd0aCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoIGZyb20sIHRvICk7XG5cblx0fSxcblxuXHQvLyBjb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGVcblx0Y29udmVydEFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCB0eXBlLCBmb3JjZUNsb25lICkge1xuXG5cdFx0aWYgKCAhIGFycmF5IHx8IC8vIGxldCAndW5kZWZpbmVkJyBhbmQgJ251bGwnIHBhc3Ncblx0XHRcdFx0ISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxuXG5cdH0sXG5cblx0aXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmXG5cdFx0XHRcdCEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWRcblx0Z2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1lcyApIHtcblxuXHRcdGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkge1xuXG5cdFx0XHRyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpO1xuXG5cdFx0cmVzdWx0LnNvcnQoIGNvbXBhcmVUaW1lICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gdXNlcyB0aGUgYXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBkYXRhXG5cdHNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcblxuXHRcdHZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBmdW5jdGlvbiBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0c1xuXHRmbGF0dGVuSlNPTjogZnVuY3Rpb24gKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XG5cblx0XHR2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07XG5cblx0XHR3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0dmFyIHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaC5hcHBseSggdmFsdWVzLCB2YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50c1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gLi4uYXNzdW1lIFRIUkVFLk1hdGgtaXNoXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG90aGVyd2lzZSBwdXNoIGFzLWlzXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICpcbiAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkJyApO1xuXHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICcgKyBuYW1lICk7XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblxuXHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApO1xuXHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xuXG5cdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0dGhpcy52YWxpZGF0ZSgpO1xuXHR0aGlzLm9wdGltaXplKCk7XG5cbn1cblxuLy8gU3RhdGljIG1ldGhvZHM6XG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2ssIHtcblxuXHQvLyBTZXJpYWxpemF0aW9uIChpbiBzdGF0aWMgY29udGV4dCwgYmVjYXVzZSBvZiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uXG5cdC8vIGFuZCBhdXRvbWF0aWMgaW52b2NhdGlvbiBvZiAudG9KU09OKTpcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0aWYgKCBqc29uLnR5cGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UnICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gS2V5ZnJhbWVUcmFjay5fZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XG5cblx0XHRpZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTigganNvbi5rZXlzLCB0aW1lcywgdmFsdWVzLCAndmFsdWUnICk7XG5cblx0XHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRcdGpzb24udmFsdWVzID0gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIHRyYWNrVHlwZS5wYXJzZSgganNvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlXG5cdFx0XHRyZXR1cm4gbmV3IHRyYWNrVHlwZSgganNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggdHJhY2sgKSB7XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7XG5cblx0XHR2YXIganNvbjtcblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0anNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXNcblx0XHRcdGpzb24gPSB7XG5cblx0XHRcdFx0J25hbWUnOiB0cmFjay5uYW1lLFxuXHRcdFx0XHQndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLFxuXHRcdFx0XHQndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5IClcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdF9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lOiBmdW5jdGlvbiAoIHR5cGVOYW1lICkge1xuXG5cdFx0c3dpdGNoICggdHlwZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcblxuXHRcdFx0Y2FzZSAnc2NhbGFyJzpcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdmbG9hdCc6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAnaW50ZWdlcic6XG5cblx0XHRcdFx0cmV0dXJuIE51bWJlcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ3ZlY3Rvcic6XG5cdFx0XHRjYXNlICd2ZWN0b3IyJzpcblx0XHRcdGNhc2UgJ3ZlY3RvcjMnOlxuXHRcdFx0Y2FzZSAndmVjdG9yNCc6XG5cblx0XHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2NvbG9yJzpcblxuXHRcdFx0XHRyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblxuXHRcdFx0XHRyZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0Y2FzZSAnYm9vbGVhbic6XG5cblx0XHRcdFx0cmV0dXJuIEJvb2xlYW5LZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdzdHJpbmcnOlxuXG5cdFx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICcgKyB0eXBlTmFtZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSwge1xuXG5cdGNvbnN0cnVjdG9yOiBLZXlmcmFtZVRyYWNrLFxuXG5cdFRpbWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0VmFsdWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdHNldEludGVycG9sYXRpb246IGZ1bmN0aW9uICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdHZhciBmYWN0b3J5TWV0aG9kO1xuXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG1lc3NhZ2UgPSBcInVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yIFwiICtcblx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgXCIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgXCIgKyB0aGlzLm5hbWU7XG5cblx0XHRcdGlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cFxuXHRcdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnNldEludGVycG9sYXRpb24oIHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2VcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazonLCBtZXNzYWdlICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHR9LFxuXG5cdGdldEludGVycG9sYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlU21vb3RoO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0VmFsdWVTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7XG5cblx0fSxcblxuXHQvLyBtb3ZlIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcyBpbiB0aW1lXG5cdHNoaWZ0OiBmdW5jdGlvbiAoIHRpbWVPZmZzZXQgKSB7XG5cblx0XHRpZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHtcblxuXHRcdGlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbc3RhcnRUaW1lLCBlbmRUaW1lXS5cblx0Ly8gSU1QT1JUQU5UOiBXZSBkbyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWQga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlc1xuXHR0cmltOiBmdW5jdGlvbiAoIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aCxcblx0XHRcdGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XG5cblx0XHRcdCsrIGZyb207XG5cblx0XHR9XG5cblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xuXG5cdFx0XHQtLSB0bztcblxuXHRcdH1cblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHRvID0gTWF0aC5tYXgoIHRvLCAxICksIGZyb20gPSB0byAtIDE7XG5cblx0XHRcdHZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aGlzLnZhbHVlcywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gZW5zdXJlIHdlIGRvIG5vdCBnZXQgYSBHYXJiYWdlSW5HYXJiYWdlT3V0IHNpdHVhdGlvbiwgbWFrZSBzdXJlIHRyYWNrcyBhcmUgYXQgbGVhc3QgbWluaW1hbGx5IHZpYWJsZVxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbGlkID0gdHJ1ZTtcblxuXHRcdHZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdGlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIGN1cnJUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBpc05hTiggdmFsdWUgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSxcblxuXHRcdFx0c21vb3RoSW50ZXJwb2xhdGlvbiA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpID09PSBJbnRlcnBvbGF0ZVNtb290aCxcblxuXHRcdFx0d3JpdGVJbmRleCA9IDEsXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xuXG5cdFx0XHR2YXIga2VlcCA9IGZhbHNlO1xuXG5cdFx0XHR2YXIgdGltZSA9IHRpbWVzWyBpIF07XG5cdFx0XHR2YXIgdGltZU5leHQgPSB0aW1lc1sgaSArIDEgXTtcblxuXHRcdFx0Ly8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZVxuXG5cdFx0XHRpZiAoIHRpbWUgIT09IHRpbWVOZXh0ICYmICggaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lWyAwIF0gKSApIHtcblxuXHRcdFx0XHRpZiAoICEgc21vb3RoSW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMgc2FtZSBhcyB0aGVpciBuZWlnaGJvcnNcblxuXHRcdFx0XHRcdHZhciBvZmZzZXQgPSBpICogc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxuXHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxuXG5cdFx0XHRpZiAoIGtlZXAgKSB7XG5cblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xuXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdFx0XHR2YXIgcmVhZE9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHR3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZmx1c2ggbGFzdCBrZXlmcmFtZSAoY29tcGFjdGlvbiBsb29rcyBhaGVhZClcblxuXHRcdGlmICggbGFzdEluZGV4ID4gMCApIHtcblxuXHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0Zm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdCsrIHdyaXRlSW5kZXg7XG5cblx0XHR9XG5cblx0XHRpZiAoIHdyaXRlSW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCAwLCB3cml0ZUluZGV4ICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHZhbHVlcywgMCwgd3JpdGVJbmRleCAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5WZWN0b3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmVjdG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAndmVjdG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBSZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVzZW50IGFuIGFuaW1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQ2xpcCggbmFtZSwgZHVyYXRpb24sIHRyYWNrcyApIHtcblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXHR0aGlzLnRyYWNrcyA9IHRyYWNrcztcblx0dGhpcy5kdXJhdGlvbiA9ICggZHVyYXRpb24gIT09IHVuZGVmaW5lZCApID8gZHVyYXRpb24gOiAtIDE7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkge1xuXG5cdFx0dGhpcy5yZXNldER1cmF0aW9uKCk7XG5cblx0fVxuXG5cdHRoaXMub3B0aW1pemUoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7XG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGpzb25UcmFja3MgPSBqc29uLnRyYWNrcyxcblx0XHRcdGZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sucGFyc2UoIGpzb25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRjbGlwVHJhY2tzID0gY2xpcC50cmFja3M7XG5cblx0XHR2YXIganNvbiA9IHtcblxuXHRcdFx0J25hbWUnOiBjbGlwLm5hbWUsXG5cdFx0XHQnZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLFxuXHRcdFx0J3RyYWNrcyc6IHRyYWNrc1xuXG5cdFx0fTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOiBmdW5jdGlvbiAoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG51bU1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdHRpbWVzLnB1c2goXG5cdFx0XHRcdCggaSArIG51bU1vcnBoVGFyZ2V0cyAtIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyxcblx0XHRcdFx0aSxcblx0XHRcdFx0KCBpICsgMSApICUgbnVtTW9ycGhUYXJnZXRzICk7XG5cblx0XHRcdHZhbHVlcy5wdXNoKCAwLCAxLCAwICk7XG5cblx0XHRcdHZhciBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7XG5cdFx0XHR0aW1lcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTtcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB2YWx1ZXMsIDEsIG9yZGVyICk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZVxuXHRcdFx0Ly8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuXG5cdFx0XHRpZiAoICEgbm9Mb29wICYmIHRpbWVzWyAwIF0gPT09IDAgKSB7XG5cblx0XHRcdFx0dGltZXMucHVzaCggbnVtTW9ycGhUYXJnZXRzICk7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZXNbIDAgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRyYWNrcy5wdXNoKFxuXHRcdFx0XHRuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayhcblx0XHRcdFx0XHQnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1snICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVsgaSBdLm5hbWUgKyAnXScsXG5cdFx0XHRcdFx0dGltZXMsIHZhbHVlc1xuXHRcdFx0XHQpLnNjYWxlKCAxLjAgLyBmcHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBuYW1lLCAtIDEsIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0ZmluZEJ5TmFtZTogZnVuY3Rpb24gKCBvYmplY3RPckNsaXBBcnJheSwgbmFtZSApIHtcblxuXHRcdHZhciBjbGlwQXJyYXkgPSBvYmplY3RPckNsaXBBcnJheTtcblxuXHRcdGlmICggISBBcnJheS5pc0FycmF5KCBvYmplY3RPckNsaXBBcnJheSApICkge1xuXG5cdFx0XHR2YXIgbyA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXHRcdFx0Y2xpcEFycmF5ID0gby5nZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2xpcEFycmF5Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBjbGlwQXJyYXlbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHRDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczogZnVuY3Rpb24gKCBtb3JwaFRhcmdldHMsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307XG5cblx0XHQvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzXG5cdFx0Ly8gc3VjaCBmbGFtaW5nb19mbHlBXzAwMywgZmxhbWluZ29fcnVuMV8wMDMsIGNyZGVhdGgwMDU5XG5cdFx0dmFyIHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xuXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcblx0XHRcdHZhciBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTtcblxuXHRcdFx0aWYgKCBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRcdHZhciBuYW1lID0gcGFydHNbIDEgXTtcblxuXHRcdFx0XHR2YXIgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcblx0XHRcdFx0aWYgKCAhIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjbGlwcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdGNsaXBzLnB1c2goIEFuaW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjbGlwcztcblxuXHR9LFxuXG5cdC8vIHBhcnNlIHRoZSBhbmltYXRpb24uaGllcmFyY2h5IGZvcm1hdFxuXHRwYXJzZUFuaW1hdGlvbjogZnVuY3Rpb24gKCBhbmltYXRpb24sIGJvbmVzICkge1xuXG5cdFx0aWYgKCAhIGFuaW1hdGlvbiApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuJyApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcblxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGFuaW1hdGlvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHByb3BlcnR5TmFtZSApO1xuXG5cdFx0XHRcdC8vIGVtcHR5IGtleXMgYXJlIGZpbHRlcmVkIG91dCwgc28gY2hlY2sgYWdhaW5cblx0XHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0XHRkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0dmFyIGNsaXBOYW1lID0gYW5pbWF0aW9uLm5hbWUgfHwgJ2RlZmF1bHQnO1xuXHRcdC8vIGF1dG9tYXRpYyBsZW5ndGggZGV0ZXJtaW5hdGlvbiBpbiBBbmltYXRpb25DbGlwLlxuXHRcdHZhciBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLSAxO1xuXHRcdHZhciBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwO1xuXG5cdFx0dmFyIGhpZXJhcmNoeVRyYWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107XG5cblx0XHRmb3IgKCB2YXIgaCA9IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkge1xuXG5cdFx0XHR2YXIgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XG5cblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHNcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXROYW1lcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoIHZhciBrID0gMDsgayA8IGFuaW1hdGlvbktleXMubGVuZ3RoOyBrICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gPCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRtb3JwaFRhcmdldE5hbWVzWyBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzWyBtIF0gXSA9IC0gMTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBtb3JwaCB0YXJnZXQgd2l0aCBhbGwgemVyb1xuXHRcdFx0XHQvLyBtb3JwaFRhcmdldEluZmx1ZW5jZXMgZXhjZXB0IGZvciB0aGUga2V5cyBpbiB3aGljaFxuXHRcdFx0XHQvLyB0aGUgbW9ycGhUYXJnZXQgaXMgbmFtZWQuXG5cdFx0XHRcdGZvciAoIHZhciBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcblxuXHRcdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSAhPT0gYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsrIG0gKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XG5cblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cblxuXHRcdFx0XHR2YXIgYm9uZU5hbWUgPSAnLmJvbmVzWycgKyBib25lc1sgaCBdLm5hbWUgKyAnXSc7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucG9zaXRpb24nLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdwb3MnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3JvdCcsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAnc2NsJywgdHJhY2tzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcCA9IG5ldyBBbmltYXRpb25DbGlwKCBjbGlwTmFtZSwgZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAucHJvdG90eXBlLCB7XG5cblx0cmVzZXREdXJhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IHRoaXMudHJhY2tzLCBkdXJhdGlvbiA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xuXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG5cdH0sXG5cblx0dHJpbTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNYXRlcmlhbExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlcyA9IHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdGVyaWFsTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZXM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHRleHR1cmVzID0gdGhpcy50ZXh0dXJlcztcblxuXHRcdGZ1bmN0aW9uIGdldFRleHR1cmUoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbHNbIGpzb24udHlwZSBdKCk7XG5cblx0XHRpZiAoIGpzb24udXVpZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDtcblx0XHRpZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24uY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTtcblx0XHRpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzcztcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXQgPSBqc29uLmNsZWFyQ29hdDtcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyQ29hdFJvdWdobmVzcztcblx0XHRpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlmb3Jtcztcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9ycztcblx0XHRpZiAoIGpzb24uZm9nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb2cgPSBqc29uLmZvZztcblx0XHRpZiAoIGpzb24uZmxhdFNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZztcblx0XHRpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZztcblx0XHRpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTtcblx0XHRpZiAoIGpzb24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0eTtcblx0XHRpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDtcblx0XHRpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29uLmRlcHRoVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTtcblx0XHRpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGlmICgganNvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm90YXRpb24gPSBqc29uLnJvdGF0aW9uO1xuXG5cdFx0aWYgKCBqc29uLmxpbmV3aWR0aCAhPT0gMSApIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoO1xuXHRcdGlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplO1xuXHRcdGlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplO1xuXHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQgPSBqc29uLnBvbHlnb25PZmZzZXQ7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZztcblx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPSBqc29uLm1vcnBoVGFyZ2V0cztcblx0XHRpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZztcblxuXHRcdGlmICgganNvbi52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52aXNpYmxlID0ganNvbi52aXNpYmxlO1xuXHRcdGlmICgganNvbi51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhO1xuXG5cdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0aWYgKCBqc29uLnNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5zaGFkaW5nID09PSAxOyAvLyBUSFJFRS5GbGF0U2hhZGluZ1xuXG5cdFx0Ly8gZm9yIFBvaW50c01hdGVyaWFsXG5cblx0XHRpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTtcblx0XHRpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdC8vIG1hcHNcblxuXHRcdGlmICgganNvbi5tYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hcCA9IGdldFRleHR1cmUoIGpzb24ubWFwICk7XG5cblx0XHRpZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFwICk7XG5cdFx0XHRtYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApO1xuXHRcdGlmICgganNvbi5idW1wU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBTY2FsZSA9IGpzb24uYnVtcFNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLm5vcm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgganNvbi5ub3JtYWxNYXAgKTtcblx0XHRpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBub3JtYWxTY2FsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBCbGVuZGVyIGV4cG9ydGVyIHVzZWQgdG8gZXhwb3J0IGEgc2NhbGFyLiBTZWUgIzc0NTlcblxuXHRcdFx0XHRub3JtYWxTY2FsZSA9IFsgbm9ybWFsU2NhbGUsIG5vcm1hbFNjYWxlIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZGlzcGxhY2VtZW50TWFwICk7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHRpZiAoIGpzb24ucm91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ubWV0YWxuZXNzTWFwICk7XG5cblx0XHRpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2ZU1hcCApO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBqc29uLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7XG5cblx0XHRpZiAoIGpzb24ucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yZWZsZWN0aXZpdHkgPSBqc29uLnJlZmxlY3Rpdml0eTtcblxuXHRcdGlmICgganNvbi5saWdodE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmxpZ2h0TWFwICk7XG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uYW9NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hb01hcCApO1xuXHRcdGlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGV4ID0ganNvbi5kYXRhLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXguYXJyYXkgKTtcblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgga2V5LCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7XG5cblx0XHRpZiAoIGdyb3VwcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdGdlb21ldHJ5LmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0aWYgKCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoIGNlbnRlciwgYm91bmRpbmdTcGhlcmUucmFkaXVzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBUWVBFRF9BUlJBWVMgPSB7XG5cdEludDhBcnJheTogSW50OEFycmF5LFxuXHRVaW50OEFycmF5OiBVaW50OEFycmF5LFxuXHQvLyBXb3JrYXJvdW5kIGZvciBJRTExIHByZSBLQjI5Mjk0MzcuIFNlZSAjMTE0NDBcblx0VWludDhDbGFtcGVkQXJyYXk6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OENsYW1wZWRBcnJheSA6IFVpbnQ4QXJyYXksXG5cdEludDE2QXJyYXk6IEludDE2QXJyYXksXG5cdFVpbnQxNkFycmF5OiBVaW50MTZBcnJheSxcblx0SW50MzJBcnJheTogSW50MzJBcnJheSxcblx0VWludDMyQXJyYXk6IFVpbnQzMkFycmF5LFxuXHRGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcblx0RmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXlcbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkZXIoKSB7fVxuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0aGFuZGxlcnM6IFtdLFxuXG5cdGFkZDogZnVuY3Rpb24gKCByZWdleCwgbG9hZGVyICkge1xuXG5cdFx0dGhpcy5oYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRcdHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdHZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHR2YXIgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07XG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufTtcblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiB1bmRlZmluZWQsXG5cblx0b25Mb2FkU3RhcnQ6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdG9uTG9hZFByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRvbkxvYWRDb21wbGV0ZTogZnVuY3Rpb24gKCkge30sXG5cblx0aW5pdE1hdGVyaWFsczogZnVuY3Rpb24gKCBtYXRlcmlhbHMsIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbWF0ZXJpYWxzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0YXJyYXlbIGkgXSA9IHRoaXMuY3JlYXRlTWF0ZXJpYWwoIG1hdGVyaWFsc1sgaSBdLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGNyZWF0ZU1hdGVyaWFsOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBCbGVuZGluZ01vZGUgPSB7XG5cdFx0XHROb0JsZW5kaW5nOiBOb0JsZW5kaW5nLFxuXHRcdFx0Tm9ybWFsQmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLFxuXHRcdFx0QWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcblx0XHRcdFN1YnRyYWN0aXZlQmxlbmRpbmc6IFN1YnRyYWN0aXZlQmxlbmRpbmcsXG5cdFx0XHRNdWx0aXBseUJsZW5kaW5nOiBNdWx0aXBseUJsZW5kaW5nLFxuXHRcdFx0Q3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nXG5cdFx0fTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciB0ZXh0dXJlTG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0XHR2YXIgbWF0ZXJpYWxMb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbCggbSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0XHQvLyBjb252ZXJ0IGZyb20gb2xkIG1hdGVyaWFsIGZvcm1hdFxuXG5cdFx0XHR2YXIgdGV4dHVyZXMgPSB7fTtcblxuXHRcdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIHBhdGgsIHJlcGVhdCwgb2Zmc2V0LCB3cmFwLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdHZhciBmdWxsUGF0aCA9IHRleHR1cmVQYXRoICsgcGF0aDtcblx0XHRcdFx0dmFyIGxvYWRlciA9IExvYWRlci5IYW5kbGVycy5nZXQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0dmFyIHRleHR1cmU7XG5cblx0XHRcdFx0aWYgKCBsb2FkZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIGNyb3NzT3JpZ2luICk7XG5cdFx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmVMb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCByZXBlYXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggcmVwZWF0ICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlcGVhdFsgMCBdICE9PSAxICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAxIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHdyYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDAgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBTID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDEgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBUID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdFx0XHRcdHRleHR1cmVzWyB1dWlkIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHRcdHJldHVybiB1dWlkO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdHZhciBqc29uID0ge1xuXHRcdFx0XHR1dWlkOiBfTWF0aC5nZW5lcmF0ZVVVSUQoKSxcblx0XHRcdFx0dHlwZTogJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnXG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtICkge1xuXG5cdFx0XHRcdHZhciB2YWx1ZSA9IG1bIG5hbWUgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnRGJnQ29sb3InOlxuXHRcdFx0XHRcdGNhc2UgJ0RiZ0luZGV4Jzpcblx0XHRcdFx0XHRjYXNlICdvcHRpY2FsRGVuc2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAnaWxsdW1pbmF0aW9uJzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ0RiZ05hbWUnOlxuXHRcdFx0XHRcdFx0anNvbi5uYW1lID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdibGVuZGluZyc6XG5cdFx0XHRcdFx0XHRqc29uLmJsZW5kaW5nID0gQmxlbmRpbmdNb2RlWyB2YWx1ZSBdO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JBbWJpZW50Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbWJpZW50Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDonLCBuYW1lLCAnaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4nICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckRpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5jb2xvciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZSA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NwZWN1bGFyQ29lZic6XG5cdFx0XHRcdFx0XHRqc29uLnNoaW5pbmVzcyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hhZGluZyc6XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNpYycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAncGhvbmcnICkganNvbi50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N0YW5kYXJkJyApIGpzb24udHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlJzpcblx0XHRcdFx0XHRcdGpzb24ubWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcERpZmZ1c2VSZXBlYXQsIG0ubWFwRGlmZnVzZU9mZnNldCwgbS5tYXBEaWZmdXNlV3JhcCwgbS5tYXBEaWZmdXNlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlJzpcblx0XHRcdFx0XHRcdGpzb24uZW1pc3NpdmVNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRW1pc3NpdmVSZXBlYXQsIG0ubWFwRW1pc3NpdmVPZmZzZXQsIG0ubWFwRW1pc3NpdmVXcmFwLCBtLm1hcEVtaXNzaXZlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodCc6XG5cdFx0XHRcdFx0XHRqc29uLmxpZ2h0TWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcExpZ2h0UmVwZWF0LCBtLm1hcExpZ2h0T2Zmc2V0LCBtLm1hcExpZ2h0V3JhcCwgbS5tYXBMaWdodEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0UmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU8nOlxuXHRcdFx0XHRcdFx0anNvbi5hb01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBT1JlcGVhdCwgbS5tYXBBT09mZnNldCwgbS5tYXBBT1dyYXAsIG0ubWFwQU9Bbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBT1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9PZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9Bbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXAnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEJ1bXBSZXBlYXQsIG0ubWFwQnVtcE9mZnNldCwgbS5tYXBCdW1wV3JhcCwgbS5tYXBCdW1wQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFNjYWxlJzpcblx0XHRcdFx0XHRcdGpzb24uYnVtcFNjYWxlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsJzpcblx0XHRcdFx0XHRcdGpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1hbFJlcGVhdCwgbS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxGYWN0b3InOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxTY2FsZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhck1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBTcGVjdWxhclJlcGVhdCwgbS5tYXBTcGVjdWxhck9mZnNldCwgbS5tYXBTcGVjdWxhcldyYXAsIG0ubWFwU3BlY3VsYXJBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhclJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzcyc6XG5cdFx0XHRcdFx0XHRqc29uLm1ldGFsbmVzc01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBNZXRhbG5lc3NSZXBlYXQsIG0ubWFwTWV0YWxuZXNzT2Zmc2V0LCBtLm1hcE1ldGFsbmVzc1dyYXAsIG0ubWFwTWV0YWxuZXNzQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ucm91Z2huZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBSb3VnaG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYSc6XG5cdFx0XHRcdFx0XHRqc29uLmFscGhhTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFscGhhUmVwZWF0LCBtLm1hcEFscGhhT2Zmc2V0LCBtLm1hcEFscGhhV3JhcCwgbS5tYXBBbHBoYUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmxpcFNpZGVkJzpcblx0XHRcdFx0XHRcdGpzb24uc2lkZSA9IEJhY2tTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG91YmxlU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gRG91YmxlU2lkZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW5jeSc6XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHknICk7XG5cdFx0XHRcdFx0XHRqc29uLm9wYWNpdHkgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RlcHRoVGVzdCc6XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnb3BhY2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAncmVmbGVjdGl2aXR5Jzpcblx0XHRcdFx0XHRjYXNlICd0cmFuc3BhcmVudCc6XG5cdFx0XHRcdFx0Y2FzZSAndmlzaWJsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnd2lyZWZyYW1lJzpcblx0XHRcdFx0XHRcdGpzb25bIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVydGV4Q29sb3JzJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9ycztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09ICdmYWNlJyApIGpzb24udmVydGV4Q29sb3JzID0gRmFjZUNvbG9ycztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiBVbnN1cHBvcnRlZCcsIG5hbWUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnR5cGUgPT09ICdNZXNoQmFzaWNNYXRlcmlhbCcgKSBkZWxldGUganNvbi5lbWlzc2l2ZTtcblx0XHRcdGlmICgganNvbi50eXBlICE9PSAnTWVzaFBob25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7XG5cblx0XHRcdGlmICgganNvbi5vcGFjaXR5IDwgMSApIGpzb24udHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdFx0XHRtYXRlcmlhbExvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsTG9hZGVyLnBhcnNlKCBqc29uICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIERvbiBNY0N1cmR5IC8gaHR0cHM6Ly93d3cuZG9ubWNjdXJkeS5jb21cbiAqL1xuXG52YXIgTG9hZGVyVXRpbHMgPSB7XG5cblx0ZGVjb2RlVGV4dDogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSggYXJyYXkgKTtcblxuXHRcdH1cblxuXHRcdC8vIEF2b2lkIHRoZSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBzaG9ydGN1dCwgd2hpY2hcblx0XHQvLyB0aHJvd3MgYSBcIm1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIgZXJyb3IgZm9yIGxhcmdlIGFycmF5cy5cblxuXHRcdHZhciBzID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIEltcGxpY2l0bHkgYXNzdW1lcyBsaXR0bGUtZW5kaWFuLlxuXHRcdFx0cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJheVsgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBNZXJnZXMgbXVsdGktYnl0ZSB1dGYtOCBjaGFyYWN0ZXJzLlxuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoIGVzY2FwZSggcyApICk7XG5cblx0fSxcblxuXHRleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHR2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEpTT05Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0aWYgKCB0eXBlb2YgbWFuYWdlciA9PT0gJ2Jvb2xlYW4nICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogc2hvd1N0YXR1cyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGNvbnN0cnVjdG9yLicgKTtcblx0XHRtYW5hZ2VyID0gdW5kZWZpbmVkO1xuXG5cdH1cblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEpTT05Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZVBhdGggPSB0aGlzLnRleHR1cmVQYXRoICYmICggdHlwZW9mIHRoaXMudGV4dHVyZVBhdGggPT09ICdzdHJpbmcnICkgPyB0aGlzLnRleHR1cmVQYXRoIDogTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG5cdFx0XHRcdGlmICggdHlwZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLk9iamVjdExvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG9iamVjdCA9IHNjb3BlLnBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApO1xuXHRcdFx0b25Mb2FkKCBvYmplY3QuZ2VvbWV0cnksIG9iamVjdC5tYXRlcmlhbHMgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdGZ1bmN0aW9uIGlzQml0U2V0KCB2YWx1ZSwgcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlICYgKCAxIDw8IHBvc2l0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGksIGosIGZpLFxuXG5cdFx0XHRcdG9mZnNldCwgekxlbmd0aCxcblxuXHRcdFx0XHRjb2xvckluZGV4LCBub3JtYWxJbmRleCwgdXZJbmRleCwgbWF0ZXJpYWxJbmRleCxcblxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRpc1F1YWQsXG5cdFx0XHRcdGhhc01hdGVyaWFsLFxuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYsXG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsXG5cdFx0XHRcdGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yLFxuXG5cdFx0XHRcdHZlcnRleCwgZmFjZSwgZmFjZUEsIGZhY2VCLCBoZXgsIG5vcm1hbCxcblxuXHRcdFx0XHR1dkxheWVyLCB1diwgdSwgdixcblxuXHRcdFx0XHRmYWNlcyA9IGpzb24uZmFjZXMsXG5cdFx0XHRcdHZlcnRpY2VzID0ganNvbi52ZXJ0aWNlcyxcblx0XHRcdFx0bm9ybWFscyA9IGpzb24ubm9ybWFscyxcblx0XHRcdFx0Y29sb3JzID0ganNvbi5jb2xvcnMsXG5cblx0XHRcdFx0c2NhbGUgPSBqc29uLnNjYWxlLFxuXG5cdFx0XHRcdG5VdkxheWVycyA9IDA7XG5cblxuXHRcdFx0aWYgKCBqc29uLnV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGRpc3JlZ2FyZCBlbXB0eSBhcnJheXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICgganNvbi51dnNbIGkgXS5sZW5ndGggKSBuVXZMYXllcnMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIHZlcnRleCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dHlwZSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRpc1F1YWQgPSBpc0JpdFNldCggdHlwZSwgMCApO1xuXHRcdFx0XHRoYXNNYXRlcmlhbCA9IGlzQml0U2V0KCB0eXBlLCAxICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhVdiA9IGlzQml0U2V0KCB0eXBlLCAzICk7XG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4Tm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDUgKTtcblx0XHRcdFx0aGFzRmFjZUNvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDYgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSwgXCJiaXRzXCIsIGlzUXVhZCwgaGFzTWF0ZXJpYWwsIGhhc0ZhY2VWZXJ0ZXhVdiwgaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwgaGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IpO1xuXG5cdFx0XHRcdGlmICggaXNRdWFkICkge1xuXG5cdFx0XHRcdFx0ZmFjZUEgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQS5hID0gZmFjZXNbIG9mZnNldCBdO1xuXHRcdFx0XHRcdGZhY2VBLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdO1xuXHRcdFx0XHRcdGZhY2VBLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0XHRcdFx0ZmFjZUIgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQi5hID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQi5iID0gZmFjZXNbIG9mZnNldCArIDIgXTtcblx0XHRcdFx0XHRmYWNlQi5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdG9mZnNldCArPSA0O1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2VBLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0ZmFjZUIubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCA0OyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMiApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMCApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlQS5ub3JtYWwuc2V0KFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRmYWNlQi5ub3JtYWwuY29weSggZmFjZUEubm9ybWFsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTtcblxuXHRcdFx0XHRcdFx0ZmFjZUEuY29sb3Iuc2V0SGV4KCBoZXggKTtcblx0XHRcdFx0XHRcdGZhY2VCLmNvbG9yLnNldEhleCggaGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUEgKTtcblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZS5hID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdGZhY2UuYiA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmMgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRpZiAoIGhhc01hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvIGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZVxuXG5cdFx0XHRcdFx0ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dXZMYXllciA9IGpzb24udXZzWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdGZhY2Uubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMyhcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UuY29sb3Iuc2V0SGV4KCBjb2xvcnNbIGNvbG9ySW5kZXggXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBjb2xvckluZGV4IF0gKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlc1BlclZlcnRleCA9ICgganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4ICE9PSB1bmRlZmluZWQgKSA/IGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCA6IDI7XG5cblx0XHRcdGlmICgganNvbi5za2luV2VpZ2h0cyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHtcblxuXHRcdFx0XHRcdHZhciB4ID0ganNvbi5za2luV2VpZ2h0c1sgaSBdO1xuXHRcdFx0XHRcdHZhciB5ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDEgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHogPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMiBdIDogMDtcblx0XHRcdFx0XHR2YXIgdyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAzIF0gOiAwO1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbldlaWdodHMucHVzaCggbmV3IFZlY3RvcjQoIHgsIHksIHosIHcgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uc2tpbkluZGljZXMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luSW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGpzb24uc2tpbkluZGljZXNbIGkgXTtcblx0XHRcdFx0XHR2YXIgYiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBjID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIGQgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLnB1c2goIG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuYm9uZXMgPSBqc29uLmJvbmVzO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgJiYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggIT09IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCB8fCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggIT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1doZW4gc2tpbm5pbmcsIG51bWJlciBvZiB2ZXJ0aWNlcyAoJyArIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCArICcpLCBza2luSW5kaWNlcyAoJyArXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICsgJyksIGFuZCBza2luV2VpZ2h0cyAoJyArIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCArICcpIHNob3VsZCBtYXRjaC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdID0ge307XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0dmFyIGRzdFZlcnRpY2VzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRpY2VzID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciB2ID0gMCwgdmwgPSBzcmNWZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHRcdHZlcnRleC54ID0gc3JjVmVydGljZXNbIHYgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnogPSBzcmNWZXJ0aWNlc1sgdiArIDIgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdFx0XHRkc3RWZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoQ29sb3JzICE9PSB1bmRlZmluZWQgJiYganNvbi5tb3JwaENvbG9ycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IFwibW9ycGhDb2xvcnNcIiBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2luZyB0aGVtIGFzIGZhY2UgY29sb3JzLicgKTtcblxuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIG1vcnBoQ29sb3JzID0ganNvbi5tb3JwaENvbG9yc1sgMCBdLmNvbG9ycztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZXNbIGkgXS5jb2xvci5mcm9tQXJyYXkoIG1vcnBoQ29sb3JzLCBpICogMyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG91dHB1dEFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0Ly8gcGFyc2Ugb2xkIHN0eWxlIEJvbmUvSGllcmFyY2h5IGFuaW1hdGlvbnNcblx0XHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucy5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zID0gYW5pbWF0aW9ucy5jb25jYXQoIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhbmltYXRpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2VBbmltYXRpb24oIGFuaW1hdGlvbnNbIGkgXSwgZ2VvbWV0cnkuYm9uZXMgKTtcblx0XHRcdFx0aWYgKCBjbGlwICkgb3V0cHV0QW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcGFyc2UgaW1wbGljaXQgbW9ycGggYW5pbWF0aW9uc1xuXHRcdFx0aWYgKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gVE9ETzogRmlndXJlIG91dCB3aGF0IGFuIGFwcHJvcHJhaXRlIEZQUyBpcyBmb3IgbW9ycGggdGFyZ2V0IGFuaW1hdGlvbnMgLS0gZGVmYXVsdGluZyB0byAxMCwgYnV0IHJlYWxseSBpdCBpcyBjb21wbGV0ZWx5IGFyYml0cmFyeS5cblx0XHRcdFx0dmFyIG1vcnBoQW5pbWF0aW9uQ2xpcHMgPSBBbmltYXRpb25DbGlwLkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMsIDEwICk7XG5cdFx0XHRcdG91dHB1dEFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zLmNvbmNhdCggbW9ycGhBbmltYXRpb25DbGlwcyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3V0cHV0QW5pbWF0aW9ucy5sZW5ndGggPiAwICkgZ2VvbWV0cnkuYW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcGFyc2UoIGpzb24sIHRleHR1cmVQYXRoICkge1xuXG5cdFx0XHRpZiAoIGpzb24uZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEdlb21ldHJ5IDQuMCBzcGVjXG5cdFx0XHRcdGpzb24gPSBqc29uLmRhdGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMCAvIGpzb24uc2NhbGU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdFx0cGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlU2tpbigganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdGlmICgganNvbi5tYXRlcmlhbHMgPT09IHVuZGVmaW5lZCB8fCBqc29uLm1hdGVyaWFscy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5IH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG1hdGVyaWFscyA9IExvYWRlci5wcm90b3R5cGUuaW5pdE1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVQYXRoLCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5LCBtYXRlcmlhbHM6IG1hdGVyaWFscyB9O1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE9iamVjdExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlUGF0aCA9ICcnO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB0aGlzLnRleHR1cmVQYXRoID09PSAnJyApIHtcblxuXHRcdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHVybC5zdWJzdHJpbmcoIDAsIHVybC5sYXN0SW5kZXhPZiggJy8nICkgKyAxICk7XG5cblx0XHR9XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbiA9IG51bGw7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW5cXCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlKCBqc29uLnNoYXBlcyApO1xuXHRcdHZhciBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XG5cblx0XHR2YXIgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9ICk7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xuXHRcdHZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdHZhciBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICk7XG5cblx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyApIHtcblxuXHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fSxcblxuXHRwYXJzZVNoYXBlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgc2hhcGVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH0sXG5cblx0cGFyc2VHZW9tZXRyaWVzOiBmdW5jdGlvbiAoIGpzb24sIHNoYXBlcyApIHtcblxuXHRcdHZhciBnZW9tZXRyaWVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5TG9hZGVyID0gbmV3IEpTT05Mb2FkZXIoKTtcblx0XHRcdHZhciBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcigpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5O1xuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdQbGFuZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQm94R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0JveEJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDdWJlR2VvbWV0cnknOiAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGVwdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNUb3AsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzQm90dG9tLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDb25lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3BlbkVuZGVkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdPY3RhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUmluZ0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdSaW5nQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbm5lclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vdXRlclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJlLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5hcmNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnAsXG5cdFx0XHRcdFx0XHRcdGRhdGEucVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdMYXRoZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdMYXRoZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucG9pbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnZlcnRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmluZGljZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdHZhciBnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMucHVzaCggc2hhcGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuY3VydmVTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gYnVmZmVyR2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEsIHRoaXMudGV4dHVyZVBhdGggKS5nZW9tZXRyeTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCInICsgZGF0YS50eXBlICsgJ1wiJyApO1xuXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcblxuXHR9LFxuXG5cdHBhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVzICkge1xuXG5cdFx0dmFyIG1hdGVyaWFscyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblx0XHRcdGxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7XG5cblx0XHRcdFx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0YXJyYXkucHVzaCggbG9hZGVyLnBhcnNlKCBkYXRhLm1hdGVyaWFsc1sgaiBdICkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBhcnJheTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcblxuXHR9LFxuXG5cdHBhcnNlQW5pbWF0aW9uczogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGpzb25bIGkgXSApO1xuXG5cdFx0XHRhbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH0sXG5cblx0cGFyc2VJbWFnZXM6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblx0XHR2YXIgaW1hZ2VzID0ge307XG5cblx0XHRmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTtcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHR2YXIgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBpbWFnZS51cmwgOiBzY29wZS50ZXh0dXJlUGF0aCArIGltYWdlLnVybDtcblxuXHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2VzO1xuXG5cdH0sXG5cblx0cGFyc2VUZXh0dXJlczogZnVuY3Rpb24gKCBqc29uLCBpbWFnZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRleHR1cmVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS5pbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBcImltYWdlXCIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGltYWdlc1sgZGF0YS5pbWFnZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZScsIGRhdGEuaW1hZ2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdHRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlcztcblxuXHR9LFxuXG5cdHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHtcblxuXHRcdHZhciBvYmplY3Q7XG5cblx0XHRmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdGNhc2UgJ1NjZW5lJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2NlbmUoKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7XG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlO1xuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdBbWJpZW50TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTtcblxuXHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lTG9vcCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludENsb3VkJzpcblx0XHRcdGNhc2UgJ1BvaW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcHJpdGUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnR3JvdXAnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5tYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0XHRpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcblx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XG5cdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcblxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcblx0XHRpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7XG5cdFx0aWYgKCBkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVuZGVyT3JkZXIgPSBkYXRhLnJlbmRlck9yZGVyO1xuXHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblxuXHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gZGF0YS5sZXZlbHM7XG5cblx0XHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdHZhciBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxufSApO1xuXG52YXIgVEVYVFVSRV9NQVBQSU5HID0ge1xuXHRVVk1hcHBpbmc6IFVWTWFwcGluZyxcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcblx0U3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7XG5cdFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZyxcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfRklMVEVSID0ge1xuXHROZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlclxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHRoZXNwaXRlIC8gaHR0cDovL2NsaWNrdG9yZWxlYXNlLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUJpdG1hcExvYWRlciggbWFuYWdlciApIHtcblxuXHRpZiAoIHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCA9PT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHR9XG5cblx0aWYgKCB0eXBlb2YgZmV0Y2ggPT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4nICk7XG5cblx0fVxuXG5cdHRoaXMubWFuYWdlciA9IG1hbmFnZXIgIT09IHVuZGVmaW5lZCA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcblxufVxuXG5JbWFnZUJpdG1hcExvYWRlci5wcm90b3R5cGUgPSB7XG5cblx0Y29uc3RydWN0b3I6IEltYWdlQml0bWFwTG9hZGVyLFxuXG5cdHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsb2FkOiBmdW5jdGlvbiBsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0ZmV0Y2goIHVybCApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkge1xuXG5cdFx0XHRyZXR1cm4gcmVzLmJsb2IoKTtcblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGJsb2IgKSB7XG5cblx0XHRcdHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcCggYmxvYiwgc2NvcGUub3B0aW9ucyApO1xuXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggaW1hZ2VCaXRtYXAgKSB7XG5cblx0XHRcdENhY2hlLmFkZCggdXJsLCBpbWFnZUJpdG1hcCApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0gKS5jYXRjaCggZnVuY3Rpb24gKCBlICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBtaW5pbWFsIGNsYXNzIGZvciBwcm94aW5nIGZ1bmN0aW9ucyB0byBQYXRoLiBSZXBsYWNlcyBvbGQgXCJleHRyYWN0U3VicGF0aHMoKVwiXG4gKiovXG5cbmZ1bmN0aW9uIFNoYXBlUGF0aCgpIHtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVQYXRoJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0dGhpcy5zdWJQYXRocyA9IFtdO1xuXHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTaGFwZVBhdGgucHJvdG90eXBlLCB7XG5cblx0bW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTtcblx0XHR0aGlzLnN1YlBhdGhzLnB1c2goIHRoaXMuY3VycmVudFBhdGggKTtcblx0XHR0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XG5cblx0fSxcblxuXHR0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHtcblxuXHRcdFx0dmFyIHNoYXBlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpblN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0dmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkge1xuXG5cdFx0XHR2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7XG5cblx0XHRcdC8vIGluUHQgb24gcG9seWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yXG5cdFx0XHQvLyB0b2dnbGluZyBvZiBpbnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBlZGdlXG5cdFx0XHQvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5QdCwgbGVmdCBvZiBpblB0XG5cdFx0XHQvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRnZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZVxuXHRcdFx0dmFyIGluc2lkZSA9IGZhbHNlO1xuXHRcdFx0Zm9yICggdmFyIHAgPSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHtcblxuXHRcdFx0XHR2YXIgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07XG5cdFx0XHRcdHZhciBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07XG5cblx0XHRcdFx0dmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54O1xuXHRcdFx0XHR2YXIgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0gZWRnZUxvd1B0Lnk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxuXHRcdFx0XHRcdGlmICggZWRnZUR5IDwgMCApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4O1xuXHRcdFx0XHRcdFx0ZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTtcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPT09IDAgKVx0XHRcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA8IDAgKSBcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XHRcdC8vIHRydWUgaW50ZXJzZWN0aW9uIGxlZnQgb2YgaW5QdFxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcblx0XHRcdFx0XHRpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSBcdFx0Y29udGludWU7XHRcdFx0Ly8gcGFyYWxsZWxcblx0XHRcdFx0XHQvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHRcblx0XHRcdFx0XHRpZiAoICggKCBlZGdlSGlnaFB0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUxvd1B0LnggKSApIHx8XG5cdFx0XHRcdFx0XHQgKCAoIGVkZ2VMb3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKVx0XHRyZXR1cm5cdHRydWU7XHQvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICFcblx0XHRcdFx0XHQvLyBjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuXHRpbnNpZGU7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlO1xuXG5cdFx0dmFyIHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0dmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107XG5cblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyAwIF07XG5cdFx0XHR0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNGaXJzdCA9ICEgaXNDbG9ja1dpc2UoIHN1YlBhdGhzWyAwIF0uZ2V0UG9pbnRzKCkgKTtcblx0XHRob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0O1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJIb2xlcyBmaXJzdFwiLCBob2xlc0ZpcnN0KTtcblxuXHRcdHZhciBiZXR0ZXJTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG1haW5JZHggPSAwO1xuXHRcdHZhciB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0dmFyIGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0dmFyIHRvQ2hhbmdlID0gW107XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdHZhciBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImFtYmlndW91czogXCIsIGFtYmlndW91cyk7XG5cdFx0XHRpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0byBjaGFuZ2U6IFwiLCB0b0NoYW5nZSk7XG5cdFx0XHRcdGlmICggISBhbWJpZ3VvdXMgKVx0bmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB0bXBIb2xlcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFNoYXBlID0gbmV3U2hhcGVzWyBpIF0ucztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0dG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0bXBTaGFwZS5ob2xlcy5wdXNoKCB0bXBIb2xlc1sgaiBdLmggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9jb25zb2xlLmxvZyhcInNoYXBlXCIsIHNoYXBlcyk7XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9udCggZGF0YSApIHtcblxuXHR0aGlzLnR5cGUgPSAnRm9udCc7XG5cblx0dGhpcy5kYXRhID0gZGF0YTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGb250LnByb3RvdHlwZSwge1xuXG5cdGlzRm9udDogdHJ1ZSxcblxuXHRnZW5lcmF0ZVNoYXBlczogZnVuY3Rpb24gKCB0ZXh0LCBzaXplLCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7XG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQ7XG5cblx0XHR2YXIgc2hhcGVzID0gW107XG5cdFx0dmFyIHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgdGhpcy5kYXRhICk7XG5cblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcGF0aHMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgZGF0YSApIHtcblxuXHR2YXIgY2hhcnMgPSBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTtcblx0dmFyIHNjYWxlID0gc2l6ZSAvIGRhdGEucmVzb2x1dGlvbjtcblx0dmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7XG5cblx0dmFyIHBhdGhzID0gW107XG5cblx0dmFyIG9mZnNldFggPSAwLCBvZmZzZXRZID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2YXIgY2hhciA9IGNoYXJzWyBpIF07XG5cblx0XHRpZiAoIGNoYXIgPT09ICdcXG4nICkge1xuXG5cdFx0XHRvZmZzZXRYID0gMDtcblx0XHRcdG9mZnNldFkgLT0gbGluZV9oZWlnaHQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgZGl2aXNpb25zLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSwgZGF0YSApO1xuXHRcdFx0b2Zmc2V0WCArPSByZXQub2Zmc2V0WDtcblx0XHRcdHBhdGhzLnB1c2goIHJldC5wYXRoICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBwYXRocztcblxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRoKCBjaGFyLCBkaXZpc2lvbnMsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZLCBkYXRhICkge1xuXG5cdHZhciBnbHlwaCA9IGRhdGEuZ2x5cGhzWyBjaGFyIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdO1xuXG5cdGlmICggISBnbHlwaCApIHJldHVybjtcblxuXHR2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHR2YXIgeCwgeSwgY3B4LCBjcHksIGNweDEsIGNweTEsIGNweDIsIGNweTI7XG5cblx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0dmFyIG91dGxpbmUgPSBnbHlwaC5fY2FjaGVkT3V0bGluZSB8fCAoIGdseXBoLl9jYWNoZWRPdXRsaW5lID0gZ2x5cGguby5zcGxpdCggJyAnICkgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBvdXRsaW5lWyBpICsrIF07XG5cblx0XHRcdHN3aXRjaCAoIGFjdGlvbiApIHtcblxuXHRcdFx0XHRjYXNlICdtJzogLy8gbW92ZVRvXG5cblx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnbCc6IC8vIGxpbmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ3EnOiAvLyBxdWFkcmF0aWNDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4geyBvZmZzZXRYOiBnbHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb247XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLicgKTtcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQuc3Vic3RyaW5nKCA2NSwgdGV4dC5sZW5ndGggLSAyICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgY29udGV4dDtcblxudmFyIEF1ZGlvQ29udGV4dCA9IHtcblxuXHRnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGV4dDtcblxuXHR9LFxuXG5cdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb250ZXh0ID0gdmFsdWU7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdFx0XHRjb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyLCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0XHRcdG9uTG9hZCggYXVkaW9CdWZmZXIgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3RlcmVvQ2FtZXJhKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnO1xuXG5cdHRoaXMuYXNwZWN0ID0gMTtcblxuXHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xuXG5cdHRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHtcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGluc3RhbmNlLCBmb2N1cywgZm92LCBhc3BlY3QsIG5lYXIsIGZhciwgem9vbSwgZXllU2VwO1xuXG5cdFx0dmFyIGV5ZVJpZ2h0ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgZXllTGVmdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRcdHZhciBuZWVkc1VwZGF0ZSA9IGluc3RhbmNlICE9PSB0aGlzIHx8IGZvY3VzICE9PSBjYW1lcmEuZm9jdXMgfHwgZm92ICE9PSBjYW1lcmEuZm92IHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBuZWFyICE9PSBjYW1lcmEubmVhciB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFyICE9PSBjYW1lcmEuZmFyIHx8IHpvb20gIT09IGNhbWVyYS56b29tIHx8IGV5ZVNlcCAhPT0gdGhpcy5leWVTZXA7XG5cblx0XHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdFx0aW5zdGFuY2UgPSB0aGlzO1xuXHRcdFx0XHRmb2N1cyA9IGNhbWVyYS5mb2N1cztcblx0XHRcdFx0Zm92ID0gY2FtZXJhLmZvdjtcblx0XHRcdFx0YXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0XHRuZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0XHRcdGZhciA9IGNhbWVyYS5mYXI7XG5cdFx0XHRcdHpvb20gPSBjYW1lcmEuem9vbTtcblxuXHRcdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHRcdC8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIvXG5cblx0XHRcdFx0dmFyIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpO1xuXHRcdFx0XHRleWVTZXAgPSB0aGlzLmV5ZVNlcCAvIDI7XG5cdFx0XHRcdHZhciBleWVTZXBPblByb2plY3Rpb24gPSBleWVTZXAgKiBuZWFyIC8gZm9jdXM7XG5cdFx0XHRcdHZhciB5bWF4ID0gKCBuZWFyICogTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiBmb3YgKiAwLjUgKSApIC8gem9vbTtcblx0XHRcdFx0dmFyIHhtaW4sIHhtYXg7XG5cblx0XHRcdFx0Ly8gdHJhbnNsYXRlIHhPZmZzZXRcblxuXHRcdFx0XHRleWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXA7XG5cdFx0XHRcdGV5ZVJpZ2h0LmVsZW1lbnRzWyAxMiBdID0gZXllU2VwO1xuXG5cdFx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGZvciByaWdodCBleWVcblxuXHRcdFx0XHR4bWluID0gLSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0XHR4bWF4ID0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHRcdHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZUxlZnQgKTtcblx0XHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllUmlnaHQgKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIENhbWVyYSBmb3IgcmVuZGVyaW5nIGN1YmUgbWFwc1xuICpcdC0gcmVuZGVycyBzY2VuZSBpbnRvIGF4aXMtYWxpZ25lZCBjdWJlXG4gKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9uICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViZUNhbWVyYSc7XG5cblx0dmFyIGZvdiA9IDkwLCBhc3BlY3QgPSAxO1xuXG5cdHZhciBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBYICk7XG5cblx0dmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5YLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5YLmxvb2tBdCggbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdHZhciBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0Y2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWSApO1xuXG5cdHZhciBjYW1lcmFOWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApO1xuXHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlkgKTtcblxuXHR2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFoubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdHZhciBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlogKTtcblxuXHR2YXIgb3B0aW9ucyA9IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9O1xuXG5cdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICk7XG5cdHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiQ3ViZUNhbWVyYVwiO1xuXG5cdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXHRcdHZhciBnZW5lcmF0ZU1pcG1hcHMgPSByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDA7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFgsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMTtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAyO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDM7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWiwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA1O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IGk7XG5cdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcblxuXHR9O1xuXG59XG5cbkN1YmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5DdWJlQ2FtZXJhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVDYW1lcmE7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0xpc3RlbmVyKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW9MaXN0ZW5lcic7XG5cblx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG59XG5cbkF1ZGlvTGlzdGVuZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW9MaXN0ZW5lcixcblxuXHRnZXRJbnB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmZpbHRlciA9IG51bGw7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdH0sXG5cblx0Z2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHZhciBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjtcblx0XHRcdHZhciB1cCA9IHRoaXMudXA7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKTtcblxuXHRcdFx0b3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0aWYgKCBsaXN0ZW5lci5wb3NpdGlvblggKSB7XG5cblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFguc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWS5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBYLnNldFZhbHVlQXRUaW1lKCB1cC54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBZLnNldFZhbHVlQXRUaW1lKCB1cC55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBaLnNldFZhbHVlQXRUaW1lKCB1cC56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXHRcdFx0XHRsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggb3JpZW50YXRpb24ueCwgb3JpZW50YXRpb24ueSwgb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW8nO1xuXG5cdHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHR0aGlzLmF1dG9wbGF5ID0gZmFsc2U7XG5cblx0dGhpcy5idWZmZXIgPSBudWxsO1xuXHR0aGlzLmxvb3AgPSBmYWxzZTtcblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLm9mZnNldCA9IDA7XG5cdHRoaXMucGxheWJhY2tSYXRlID0gMTtcblx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xuXHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xuXG5cdHRoaXMuZmlsdGVycyA9IFtdO1xuXG59XG5cbkF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QnVmZmVyOiBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0dGhpcy5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcblxuXHRcdGlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxheSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwbGF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuXG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5vbmVuZGVkID0gdGhpcy5vbkVuZGVkLmJpbmQoIHRoaXMgKTtcblx0XHRzb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5zdGFydFRpbWUgKTtcblx0XHR0aGlzLnN0YXJ0VGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZTtcblx0XHRzb3VyY2Uuc3RhcnQoIHRoaXMuc3RhcnRUaW1lLCB0aGlzLm9mZnNldCApO1xuXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fSxcblxuXHRwYXVzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHRcdHRoaXMub2Zmc2V0ICs9ICggdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gdGhpcy5zdGFydFRpbWUgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xuXHRcdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHR0aGlzLm9mZnNldCA9IDA7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzY29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyczogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcblxuXHR9LFxuXG5cdHNldEZpbHRlcnM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fSxcblxuXHRzZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTtcblxuXHR9LFxuXG5cdG9uRW5kZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRMb29wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubG9vcDtcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5sb29wID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldFZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb3NpdGlvbmFsQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdEF1ZGlvLmNhbGwoIHRoaXMsIGxpc3RlbmVyICk7XG5cblx0dGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7XG5cdHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApO1xuXG59XG5cblBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb3NpdGlvbmFsQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXI7XG5cblx0fSxcblxuXHRnZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlO1xuXG5cdH0sXG5cblx0c2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XG5cblx0fSxcblxuXHRzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XG5cblx0fSxcblxuXHRzZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0cG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHRoaXMucGFubmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9BbmFseXNlciggYXVkaW8sIGZmdFNpemUgKSB7XG5cblx0dGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcblx0dGhpcy5hbmFseXNlci5mZnRTaXplID0gZmZ0U2l6ZSAhPT0gdW5kZWZpbmVkID8gZmZ0U2l6ZSA6IDIwNDg7XG5cblx0dGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQgKTtcblxuXHRhdWRpby5nZXRPdXRwdXQoKS5jb25uZWN0KCB0aGlzLmFuYWx5c2VyICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9BbmFseXNlci5wcm90b3R5cGUsIHtcblxuXHRnZXRGcmVxdWVuY3lEYXRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcblxuXHRcdHJldHVybiB0aGlzLmRhdGE7XG5cblx0fSxcblxuXHRnZXRBdmVyYWdlRnJlcXVlbmN5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsdWUgPSAwLCBkYXRhID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFsdWUgKz0gZGF0YVsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlIC8gZGF0YS5sZW5ndGg7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbi5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0dGhpcy5iaW5kaW5nID0gYmluZGluZztcblx0dGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7XG5cblx0dmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksXG5cdFx0bWl4RnVuY3Rpb247XG5cblx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRidWZmZXJUeXBlID0gQXJyYXk7XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblxuXHR9XG5cblx0dGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXplICogNCApO1xuXHQvLyBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyBdXG5cdC8vXG5cdC8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHRcblx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0Ly9cblx0Ly8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3Jcblx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdC8vIGNoYW5nZXNcblx0Ly9cblx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cblx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247XG5cblx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR0aGlzLnVzZUNvdW50ID0gMDtcblx0dGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlNaXhlci5wcm90b3R5cGUsIHtcblxuXHQvLyBhY2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nXG5cdGFjY3VtdWxhdGU6IGZ1bmN0aW9uICggYWNjdUluZGV4LCB3ZWlnaHQgKSB7XG5cblx0XHQvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4gd2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93c1xuXHRcdC8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlXG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdHZhciBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0O1xuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgb2YgJ2FjY3U8aT4nIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyXG5cdGFwcGx5OiBmdW5jdGlvbiAoIGFjY3VJbmRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsXG5cblx0XHRcdGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKFxuXHRcdFx0XHRidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbWVtYmVyIHRoZSBzdGF0ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1c1xuXHRzYXZlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgcHJldmlvdXNseSB0YWtlbiB2aWEgJ3NhdmVPcmlnaW5hbFN0YXRlJyB0byB0aGUgYmluZGluZ1xuXHRyZXN0b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7XG5cdFx0dGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdH0sXG5cblxuXHQvLyBtaXggZnVuY3Rpb25zXG5cblx0X3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHRpZiAoIHQgPj0gMC41ICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCApIHtcblxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7XG5cblx0fSxcblxuXHRfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHR2YXIgcyA9IDEgLSB0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGguXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG4vLyBDaGFyYWN0ZXJzIFtdLjovIGFyZSByZXNlcnZlZCBmb3IgdHJhY2sgYmluZGluZyBzeW50YXguXG52YXIgUkVTRVJWRURfQ0hBUlNfUkUgPSAnXFxcXFtcXFxcXVxcXFwuOlxcXFwvJztcblxuZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xuXG5cdHZhciBwYXJzZWRQYXRoID0gb3B0aW9uYWxQYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3JvdXA7XG5cdHRoaXMuX2JpbmRpbmdzID0gdGFyZ2V0R3JvdXAuc3Vic2NyaWJlXyggcGF0aCwgcGFyc2VkUGF0aCApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbXBvc2l0ZS5wcm90b3R5cGUsIHtcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmdcblxuXHRcdHZhciBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5fYmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdO1xuXG5cdFx0Ly8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFsdWUgb24gdGhlIGZpcnN0XG5cdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSBiaW5kaW5nLmdldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHRzZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYmluZCgpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udW5iaW5kKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZnVuY3Rpb24gUHJvcGVydHlCaW5kaW5nKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHR0aGlzLnBhdGggPSBwYXRoO1xuXHR0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHJvb3ROb2RlO1xuXG5cdHRoaXMucm9vdE5vZGUgPSByb290Tm9kZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcsIHtcblxuXHRDb21wb3NpdGU6IENvbXBvc2l0ZSxcblxuXHRjcmVhdGU6IGZ1bmN0aW9uICggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHRcdGlmICggISAoIHJvb3QgJiYgcm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwICkgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlcyBhbmQgcmVtb3ZlcyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGZyb21cblx0ICogbm9kZSBuYW1lcywgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJzZVRyYWNrTmFtZSgpLlxuXHQgKlxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c2FuaXRpemVOb2RlTmFtZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoICdbJyArIFJFU0VSVkVEX0NIQVJTX1JFICsgJ10nLCAnZycgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzYW5pdGl6ZU5vZGVOYW1lKCBuYW1lICkge1xuXG5cdFx0XHRyZXR1cm4gbmFtZS5yZXBsYWNlKCAvXFxzL2csICdfJyApLnJlcGxhY2UoIHJlc2VydmVkUmUsICcnICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBdHRlbXB0cyB0byBhbGxvdyBub2RlIG5hbWVzIGZyb20gYW55IGxhbmd1YWdlLiBFUzUncyBgXFx3YCByZWdleHAgbWF0Y2hlc1xuXHRcdC8vIG9ubHkgbGF0aW4gY2hhcmFjdGVycywgYW5kIHRoZSB1bmljb2RlIFxccHtMfSBpcyBub3QgeWV0IHN1cHBvcnRlZC4gU29cblx0XHQvLyBpbnN0ZWFkLCB3ZSBleGNsdWRlIHJlc2VydmVkIGNoYXJhY3RlcnMgYW5kIG1hdGNoIGV2ZXJ5dGhpbmcgZWxzZS5cblx0XHR2YXIgd29yZENoYXIgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XG5cdFx0dmFyIHdvcmRDaGFyT3JEb3QgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUucmVwbGFjZSggJ1xcXFwuJywgJycgKSArICddJztcblxuXHRcdC8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0XG5cdFx0Ly8gYmUgbWF0Y2hlZCB0byBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgdHJhY2sgbmFtZS5cblx0XHR2YXIgZGlyZWN0b3J5UmUgPSAvKCg/OldDK1tcXC86XSkqKS8uc291cmNlLnJlcGxhY2UoICdXQycsIHdvcmRDaGFyICk7XG5cblx0XHQvLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cblx0XHR2YXIgbm9kZVJlID0gLyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDT0QnLCB3b3JkQ2hhck9yRG90ICk7XG5cblx0XHQvLyBPYmplY3Qgb24gdGFyZ2V0IG5vZGUsIGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkXG5cdFx0Ly8gY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQgY2xvc2luZyBicmFja2V0LlxuXHRcdHZhciBvYmplY3RSZSA9IC8oPzpcXC4oV0MrKSg/OlxcWyguKylcXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgd29yZENoYXIgKTtcblxuXHRcdC8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxuXHRcdC8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0IGNoYXJhY3RlcnMuXG5cdFx0dmFyIHByb3BlcnR5UmUgPSAvXFwuKFdDKykoPzpcXFsoLispXFxdKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCB3b3JkQ2hhciApO1xuXG5cdFx0dmFyIHRyYWNrUmUgPSBuZXcgUmVnRXhwKCAnJ1xuXHRcdFx0KyAnXidcblx0XHRcdCsgZGlyZWN0b3J5UmVcblx0XHRcdCsgbm9kZVJlXG5cdFx0XHQrIG9iamVjdFJlXG5cdFx0XHQrIHByb3BlcnR5UmVcblx0XHRcdCsgJyQnXG5cdFx0KTtcblxuXHRcdHZhciBzdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycgXTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwYXJzZVRyYWNrTmFtZSggdHJhY2tOYW1lICkge1xuXG5cdFx0XHR2YXIgbWF0Y2hlcyA9IHRyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7XG5cblx0XHRcdGlmICggISBtYXRjaGVzICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciByZXN1bHRzID0ge1xuXHRcdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxuXHRcdFx0XHRub2RlTmFtZTogbWF0Y2hlc1sgMiBdLFxuXHRcdFx0XHRvYmplY3ROYW1lOiBtYXRjaGVzWyAzIF0sXG5cdFx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXG5cdFx0XHRcdHByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAvLyByZXF1aXJlZFxuXHRcdFx0XHRwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF1cblx0XHRcdH07XG5cblx0XHRcdHZhciBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdFx0aWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdHZhciBvYmplY3ROYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIGxhc3REb3QgKyAxICk7XG5cblx0XHRcdFx0Ly8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgd2hpdGVsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHRcdC8vIGlzIG5vIHdheSB0byBwYXJzZSAnZm9vLmJhci5iYXonOiAnYmF6JyBtdXN0IGJlIGEgcHJvcGVydHksIGJ1dFxuXHRcdFx0XHQvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW5cblx0XHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRcdGlmICggc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZiggb2JqZWN0TmFtZSApICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0XHRyZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHJlc3VsdHMucHJvcGVydHlOYW1lID09PSBudWxsIHx8IHJlc3VsdHMucHJvcGVydHlOYW1lLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmaW5kTm9kZTogZnVuY3Rpb24gKCByb290LCBub2RlTmFtZSApIHtcblxuXHRcdGlmICggISBub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gXCJcIiB8fCBub2RlTmFtZSA9PT0gXCJyb290XCIgfHwgbm9kZU5hbWUgPT09IFwiLlwiIHx8IG5vZGVOYW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkICkge1xuXG5cdFx0XHRyZXR1cm4gcm9vdDtcblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIHNrZWxldG9uIGJvbmVzLlxuXHRcdGlmICggcm9vdC5za2VsZXRvbiApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSByb290LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoIG5vZGVOYW1lICk7XG5cblx0XHRcdGlmICggYm9uZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuXG5cdFx0aWYgKCByb290LmNoaWxkcmVuICkge1xuXG5cdFx0XHR2YXIgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2hpbGROb2RlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTtcblxuXHRcdFx0XHRcdGlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfdG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdF0sXG5cblx0U2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFtcblxuXHRcdFtcblx0XHRcdC8vIERpcmVjdFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gRW50aXJlQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBBcnJheUVsZW1lbnRcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEhhc1RvRnJvbUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XVxuXG5cdF0sXG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7XG5cblx0XHQvLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJuIG9uIGEgcGVyLW1ldGhvZCBiYXNpczpcblx0XHQvLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZVxuXHRcdC8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzXG5cdFx0Ly8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQsIHRoZSBtZXRob2RzXG5cdFx0Ly8gYmVjb21lIG5vLW9wcy5cblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0Ly8gY3JlYXRlIGdldHRlciAvIHNldHRlciBwYWlyIGZvciBhIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaFxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlLFxuXHRcdFx0cGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCxcblxuXHRcdFx0b2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSxcblx0XHRcdHByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLFxuXHRcdFx0cHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDtcblxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdHRhcmdldE9iamVjdCA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggdGhpcy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHRoaXMucm9vdE5vZGU7XG5cblx0XHRcdHRoaXMubm9kZSA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtcblxuXHRcdC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGVcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAnICsgdGhpcy5wYXRoICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4O1xuXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uXG5cdFx0XHRzd2l0Y2ggKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ21hdGVyaWFscyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdib25lcyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlclxuXHRcdFx0XHRcdC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdEluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHByb3BlcnR5XG5cdFx0dmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lO1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogJyArIG5vZGVOYW1lICtcblx0XHRcdFx0Jy4nICsgcHJvcGVydHlOYW1lICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWVcblx0XHR2YXIgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lO1xuXG5cdFx0aWYgKCB0YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbWF0ZXJpYWxcblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTtcblx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbm9kZSB0cmFuc2Zvcm1cblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXG5cdFx0dmFyIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XG5cblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXG5cblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSBcIm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1wiICkge1xuXG5cdFx0XHRcdC8vIHBvdGVudGlhbCBvcHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4nLCB0aGlzICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvblsgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblx0XHRcdHRoaXMucHJvcGVydHlJbmRleCA9IHByb3BlcnR5SW5kZXg7XG5cblx0XHR9IGVsc2UgaWYgKCBub2RlUHJvcGVydHkuZnJvbUFycmF5ICE9PSB1bmRlZmluZWQgJiYgbm9kZVByb3BlcnR5LnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlvblxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIG5vZGVQcm9wZXJ0eSApICkge1xuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGdldHRlciAvIHNldHRlclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdUeXBlIF07XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcgXTtcblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcblxuXHRcdC8vIGJhY2sgdG8gdGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWVcblx0XHQvLyBub3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZSdcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDtcblxuXHR9XG5cbn0gKTtcblxuLy8hXFwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICFcbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHtcblxuXHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcblx0X2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsXG5cdF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBcdC1cdEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXG4gKiBcdFx0Y29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiBcdC1cdEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXG4gKlxuICogXHQtXHRZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1vdmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlclxuICogXHRcdGlzIHJ1bm5pbmcuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgXHRPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxuICogIFx0c28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZVxuICogIFx0b24gdGhlIGdyb3VwLlxuICpcbiAqIExpbWl0YXRpb246XG4gKlxuICogXHQtIFx0VGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZVxuICogXHRcdGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLVx0QSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91Z2ggYVxuICogIFx0dGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk9iamVjdEdyb3VwKCkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lc1xuXHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdHRoaXMubkNhY2hlZE9iamVjdHNfID0gMDtcdFx0XHQvLyB0aHJlc2hvbGRcblx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXG5cblx0dmFyIGluZGljZXMgPSB7fTtcblx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7XHRcdC8vIGZvciBib29ra2VlcGluZ1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdH1cblxuXHR0aGlzLl9wYXRocyA9IFtdO1x0XHRcdFx0XHQvLyBpbnNpZGU6IHN0cmluZ1xuXHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdO1x0XHRcdFx0Ly8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfVxuXHR0aGlzLl9iaW5kaW5ncyA9IFtdOyBcdFx0XHRcdC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XG5cdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyBcdC8vIGluc2lkZTogaW5kaWNlcyBpbiB0aGVzZSBhcnJheXNcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRvYmplY3RzOiB7XG5cdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9vYmplY3RzLmxlbmd0aDtcblxuXHRcdFx0fSxcblx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkge1xuXG5cdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwge1xuXG5cdGlzQW5pbWF0aW9uT2JqZWN0R3JvdXA6IHRydWUsXG5cblx0YWRkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0cGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoLFxuXHRcdFx0a25vd25PYmplY3QgPSB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXlcblx0XHRcdFx0XHRcdC8vIG9yIG1heSBub3QgZXhpc3RcblxuXHRcdFx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArXG5cdFx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHR2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssXG5cdFx0XHRcdFx0Zmlyc3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RDYWNoZWRJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlICYgZm9yZ2V0XG5cdHVuY2FjaGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGVsZXRlIGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHQvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZVxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0XHQvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9wXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdHZhciBsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSAvLyBjYWNoZWQgb3IgYWN0aXZlXG5cblx0XHRcdH0gLy8gaWYgb2JqZWN0IGlzIGtub3duXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSBiZWZyaWVuZGVkIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGU6XG5cblx0c3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0Ly8gcmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBjaGFuZ2VkXG5cdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXBcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdO1xuXG5cdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gb2JqZWN0c1sgaSBdO1xuXHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBiaW5kaW5nc0ZvclBhdGg7XG5cblx0fSxcblxuXHR1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXJcblx0XHQvLyB1cGRhdGUgdGhlIGFycmF5IHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aCAnc3Vic2NyaWJlXydcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBY3Rpb24gcHJvdmlkZWQgYnkgQW5pbWF0aW9uTWl4ZXIgZm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZpY1xuICogb2JqZWN0cy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkFjdGlvbiggbWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCApIHtcblxuXHR0aGlzLl9taXhlciA9IG1peGVyO1xuXHR0aGlzLl9jbGlwID0gY2xpcDtcblx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7XG5cblx0dmFyIHRyYWNrcyA9IGNsaXAudHJhY2tzLFxuXHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHZhciBpbnRlcnBvbGFudFNldHRpbmdzID0ge1xuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXHR9O1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7XG5cdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRpbnRlcnBvbGFudC5zZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0fVxuXG5cdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdHRoaXMuX2ludGVycG9sYW50cyA9IGludGVycG9sYW50cztcdC8vIGJvdW5kIGJ5IHRoZSBtaXhlclxuXG5cdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR0aGlzLl9jYWNoZUluZGV4ID0gbnVsbDtcdFx0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdHRoaXMuX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1x0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cblx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cblx0dGhpcy5sb29wID0gTG9vcFJlcGVhdDtcblx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xuXG5cdC8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkXG5cdC8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvblxuXHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdC8vIHNjYWxlZCBsb2NhbCB0aW1lIG9mIHRoZSBhY3Rpb25cblx0Ly8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4uY2xpcC5kdXJhdGlvbiBhY2NvcmRpbmcgdG8gbG9vcFxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTtcblxuXHR0aGlzLndlaWdodCA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7XG5cblx0dGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OyBcdFx0Ly8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdHRoaXMucGF1c2VkID0gZmFsc2U7XHRcdFx0XHQvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGVcblx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcdFx0XHRcdC8vIGZhbHNlIC0+IHplcm8gZWZmZWN0aXZlIHdlaWdodFxuXG5cdHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgXHQ9IGZhbHNlO1x0Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdHRoaXMuemVyb1Nsb3BlQXRTdGFydCBcdD0gdHJ1ZTtcdFx0Ly8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZVxuXHR0aGlzLnplcm9TbG9wZUF0RW5kXHRcdD0gdHJ1ZTtcdFx0Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25BY3Rpb24ucHJvdG90eXBlLCB7XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXG5cdH0sXG5cblx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdHRoaXMudGltZSA9IDA7XHRcdFx0Ly8gcmVzdGFydCBjbGlwXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1x0Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcdC8vIGZvcmdldCBzY2hlZHVsaW5nXG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGlzUnVubmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWRcblx0aXNTY2hlZHVsZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdHN0YXJ0QXQ6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggbW9kZSwgcmVwZXRpdGlvbnMgKSB7XG5cblx0XHR0aGlzLmxvb3AgPSBtb2RlO1xuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gV2VpZ2h0XG5cblx0Ly8gc2V0IHRoZSB3ZWlnaHQgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCBmYWRpbmdcblx0Ly8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAuZW5hYmxlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbiAoIHdlaWdodCApIHtcblxuXHRcdHRoaXMud2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0Ly8gbm90ZTogc2FtZSBsb2dpYyBhcyB3aGVuIHVwZGF0ZWQgYXQgcnVudGltZVxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHdlaWdodCBjb25zaWRlcmluZyBmYWRpbmcgYW5kIC5lbmFibGVkXG5cdGdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDtcblxuXHR9LFxuXG5cdGZhZGVJbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDAsIDEgKTtcblxuXHR9LFxuXG5cdGZhZGVPdXQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAxLCAwICk7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiAoIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApO1xuXHRcdHRoaXMuZmFkZUluKCBkdXJhdGlvbiApO1xuXG5cdFx0aWYgKCB3YXJwICkge1xuXG5cdFx0XHR2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXHRcdFx0XHRmYWRlT3V0RHVyYXRpb24gPSBmYWRlT3V0QWN0aW9uLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRcdHN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbixcblx0XHRcdFx0ZW5kU3RhcnRSYXRpbyA9IGZhZGVJbkR1cmF0aW9uIC8gZmFkZU91dER1cmF0aW9uO1xuXG5cdFx0XHRmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24gKTtcblx0XHRcdHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVUbzogZnVuY3Rpb24gKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0cmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApO1xuXG5cdH0sXG5cblx0c3RvcEZhZGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFRpbWUgU2NhbGUgQ29udHJvbFxuXG5cdC8vIHNldCB0aGUgdGltZSBzY2FsZSBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIHdhcnBpbmdcblx0Ly8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5wYXVzZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5kIC5wYXVzZWRcblx0Z2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH0sXG5cblx0c2V0RHVyYXRpb246IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRzeW5jV2l0aDogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aGFsdDogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9LFxuXG5cdHdhcnA6IGZ1bmN0aW9uICggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsXG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xuXG5cdFx0dmFsdWVzWyAwIF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblx0XHR2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcFdhcnBpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBPYmplY3QgQWNjZXNzb3JzXG5cblx0Z2V0TWl4ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9LFxuXG5cdGdldENsaXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH0sXG5cblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIEludGVybmFcblxuXHRfdXBkYXRlOiBmdW5jdGlvbiAoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7XG5cblx0XHRpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb25cblxuXHRcdFx0dmFyIHRpbWVSdW5uaW5nID0gKCB0aW1lIC0gc3RhcnRUaW1lICkgKiB0aW1lRGlyZWN0aW9uO1xuXHRcdFx0aWYgKCB0aW1lUnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm47IC8vIHlldCB0byBjb21lIC8gZG9uJ3QgZGVjaWRlIHdoZW4gZGVsdGEgPSAwXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc3RhcnRcblxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZVxuXHRcdFx0ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXBwbHkgdGltZSBzY2FsZSBhbmQgYWR2YW5jZSB0aW1lXG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7XG5cdFx0dmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0dmFyIHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPiAwICkge1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzO1xuXHRcdFx0dmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR2YXIgd2VpZ2h0ID0gMDtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLndlaWdodDtcblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVycG9sYW50VmFsdWUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGZhZGVkIG91dCwgZGlzYWJsZVxuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0cmV0dXJuIHdlaWdodDtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHZhciB0aW1lU2NhbGUgPSAwO1xuXG5cdFx0aWYgKCAhIHRoaXMucGF1c2VkICkge1xuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0dmFyIHRpbWUgPSB0aGlzLnRpbWUgKyBkZWx0YVRpbWU7XG5cblx0XHRpZiAoIGRlbHRhVGltZSA9PT0gMCApIHJldHVybiB0aW1lO1xuXG5cdFx0dmFyIGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0bG9vcCA9IHRoaXMubG9vcCxcblx0XHRcdGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDtcblxuXHRcdGlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gMDtcblx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVfc3RvcDoge1xuXG5cdFx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSBkdXJhdGlvbjtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSBicmVhayBoYW5kbGVfc3RvcDtcblxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA8IDAgPyAtIDEgOiAxXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHsgLy8gcmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmdcblxuXHRcdFx0dmFyIHBpbmdQb25nID0gKCBsb29wID09PSBMb29wUGluZ1BvbmcgKTtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHRpZiAoIGRlbHRhVGltZSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bG9vcENvdW50ID0gMDtcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGluaXRpYWxcblx0XHRcdFx0XHQvLyB0cmFuc2l0aW9uIHRocm91Z2ggemVybyBjb3VudHMgYXMgYSByZXBldGl0aW9uLFxuXHRcdFx0XHRcdC8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMVxuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgdHJ1ZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwICkge1xuXG5cdFx0XHRcdC8vIHdyYXAgYXJvdW5kXG5cblx0XHRcdFx0dmFyIGxvb3BEZWx0YSA9IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWRcblx0XHRcdFx0dGltZSAtPSBkdXJhdGlvbiAqIGxvb3BEZWx0YTtcblxuXHRcdFx0XHRsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BEZWx0YSApO1xuXG5cdFx0XHRcdHZhciBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcblxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPD0gMCApIHtcblxuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lID4gMCA/IDEgOiAtIDFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGtlZXAgcnVubmluZ1xuXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHQvLyBlbnRlcmluZyB0aGUgbGFzdCByb3VuZFxuXG5cdFx0XHRcdFx0XHR2YXIgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxuXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0cmV0dXJuIHRpbWU7XG5cblx0fSxcblxuXHRfc2V0RW5kaW5nczogZnVuY3Rpb24gKCBhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcgKSB7XG5cblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgXHQ9IFplcm9TbG9wZUVuZGluZztcblx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZFx0XHQ9IFplcm9TbG9wZUVuZGluZztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWVcblxuXHRcdFx0aWYgKCBhdFN0YXJ0ICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhdEVuZCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSB0aGlzLnplcm9TbG9wZUF0RW5kID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgXHQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2NoZWR1bGVGYWRpbmc6IGZ1bmN0aW9uICggZHVyYXRpb24sIHdlaWdodE5vdywgd2VpZ2h0VGhlbiApIHtcblxuXHRcdHZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93OyBcdFx0XHRcdHZhbHVlc1sgMCBdID0gd2VpZ2h0Tm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcdHZhbHVlc1sgMSBdID0gd2VpZ2h0VGhlbjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBQbGF5ZXIgZm9yIEFuaW1hdGlvbkNsaXBzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7XG5cblx0dGhpcy5fcm9vdCA9IHJvb3Q7XG5cdHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7XG5cdHRoaXMuX2FjY3VJbmRleCA9IDA7XG5cblx0dGhpcy50aW1lID0gMDtcblxuXHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcblxufVxuXG5BbmltYXRpb25NaXhlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQW5pbWF0aW9uTWl4ZXIsXG5cblx0X2JpbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKSB7XG5cblx0XHR2YXIgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdzQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdzQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdzQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0cmFja3NbIGkgXSxcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZSxcblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBleGlzdGluZyBiaW5kaW5nLCBtYWtlIHN1cmUgdGhlIGNhY2hlIGtub3dzXG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXG5cdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XG5cblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XG5cblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXG5cblx0XHRcdFx0dmFyIHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZCxcblx0XHRcdFx0XHRjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdFx0XHR0aGlzLl9iaW5kQWN0aW9uKCBhY3Rpb24sXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTtcblxuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdC8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2RlYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIC0tIGJpbmRpbmcudXNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXG5cblx0X2luaXRNZW1vcnlNYW5hZ2VyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9ucycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblxuXHRcdHRoaXMuX2FjdGlvbnNCeUNsaXAgPSB7fTtcblx0XHQvLyBpbnNpZGU6XG5cdFx0Ly8ge1xuXHRcdC8vIFx0XHRrbm93bkFjdGlvbnM6IEFycmF5PCBBbmltYXRpb25BY3Rpb24gPlx0LSB1c2VkIGFzIHByb3RvdHlwZXNcblx0XHQvLyBcdFx0YWN0aW9uQnlSb290OiBBbmltYXRpb25BY3Rpb25cdFx0XHQtIGxvb2t1cFxuXHRcdC8vIH1cblxuXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxuXG5cblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYWN0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQWN0aW9ucztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YmluZGluZ3M6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2xJbnRlcnBvbGFudHM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHNcblxuXHRfaXNBY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXHRcdHJldHVybiBpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA8IHRoaXMuX25BY3RpdmVBY3Rpb25zO1xuXG5cdH0sXG5cblx0X2FkZEluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0ge1xuXG5cdFx0XHRcdGtub3duQWN0aW9uczogWyBhY3Rpb24gXSxcblx0XHRcdFx0YWN0aW9uQnlSb290OiB7fVxuXG5cdFx0XHR9O1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSAwO1xuXG5cdFx0XHRhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdID0gYWN0aW9uc0ZvckNsaXA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcblx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsXG5cblx0XHRcdGxhc3RLbm93bkFjdGlvbiA9XG5cdFx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoIC0gMSBdLFxuXG5cdFx0XHRieUNsaXBDYWNoZUluZGV4ID0gYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4O1xuXG5cdFx0bGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4IF0gPSBsYXN0S25vd25BY3Rpb247XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTtcblxuXHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XG5cblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHRfdGFrZUJhY2tBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgIHwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8PCBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gICAgICAgIGEgICAgICAgIHNcblx0XHQvLyAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgIHMgICAgICAgIGFcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdGxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xuXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApIHtcblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXSA9IGJpbmRpbmc7XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcsXG5cdFx0XHRyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsXG5cdFx0XHR0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLFxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgYmluZGluZ3MubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRiaW5kaW5nc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZztcblx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdGRlbGV0ZSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdHJlbW92ZV9lbXB0eV9tYXA6IHtcblxuXHRcdFx0Zm9yICggdmFyIF8gaW4gYmluZGluZ0J5TmFtZSApIGJyZWFrIHJlbW92ZV9lbXB0eV9tYXA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXHRcdFx0ZGVsZXRlIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRmaXJzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZztcblxuXHR9LFxuXG5cdF90YWtlQmFja0JpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxuXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZVxuXG5cdF9sZW5kQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzICsrLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXG5cdFx0XHRcdDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcblxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoIGludGVycG9sYW50ICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXG5cdFx0XHRwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLFxuXG5cdFx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcblxuXHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVJbnRlcnBvbGFudDtcblxuXHR9LFxuXG5cdF9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyOiBuZXcgRmxvYXQzMkFycmF5KCAxICksXG5cblx0Ly8gcmV0dXJuIGFuIGFjdGlvbiBmb3IgYSBjbGlwIG9wdGlvbmFsbHkgdXNpbmcgYSBjdXN0b20gcm9vdCB0YXJnZXRcblx0Ly8gb2JqZWN0ICh0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgYSBsb3Qgb2YgZHluYW1pYyBtZW1vcnkgaW4gY2FzZSBhXG5cdC8vIHByZXZpb3VzbHkgdW5rbm93biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKVxuXHRjbGlwQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gbnVsbDtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGV4aXN0aW5nQWN0aW9uID1cblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRcdGlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdBY3Rpb247XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gd2Uga25vdyB0aGUgY2xpcCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXJzZSBhbGxcblx0XHRcdC8vIHRoZSBiaW5kaW5ncyBhZ2FpbiBidXQgY2FuIGp1c3QgY29weVxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07XG5cblx0XHRcdC8vIGFsc28sIHRha2UgdGhlIGNsaXAgZnJvbSB0aGUgcHJvdG90eXBlIGFjdGlvblxuXHRcdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsIClcblx0XHRcdFx0Y2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDtcblxuXHRcdH1cblxuXHRcdC8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nXG5cdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHJ1biBpdFxuXHRcdHZhciBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdHRoaXMuX2JpbmRBY3Rpb24oIG5ld0FjdGlvbiwgcHJvdG90eXBlQWN0aW9uICk7XG5cblx0XHQvLyBhbmQgbWFrZSB0aGUgYWN0aW9uIGtub3duIHRvIHRoZSBtZW1vcnkgbWFuYWdlclxuXHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0cmV0dXJuIG5ld0FjdGlvbjtcblxuXHR9LFxuXG5cdC8vIGdldCBhbiBleGlzdGluZyBhY3Rpb25cblx0ZXhpc3RpbmdBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gfHwgbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnNcblx0c3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdGFjdGlvbnNbIGkgXS5yZXNldCgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udXNlQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBhZHZhbmNlIHRoZSB0aW1lIGFuZCB1cGRhdGUgYXBwbHkgdGhlIGFuaW1hdGlvblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0dGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsXG5cdFx0XHR0aW1lRGlyZWN0aW9uID0gTWF0aC5zaWduKCBkZWx0YVRpbWUgKSxcblxuXHRcdFx0YWNjdUluZGV4ID0gdGhpcy5fYWNjdUluZGV4IF49IDE7XG5cblx0XHQvLyBydW4gYWN0aXZlIGFjdGlvbnNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XG5cblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1SW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3Rcblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNsaXBcblx0dW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGNsaXBVdWlkID0gY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGp1c3QgY2FsbGluZyBfcmVtb3ZlSW5hY3RpdmVBY3Rpb24gd291bGQgbWVzcyB1cCB0aGVcblx0XHRcdC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyByZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW5cblx0XHRcdC8vIGp1c3QgdGhyb3cgYXdheVxuXG5cdFx0XHR2YXIgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHR2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblx0XHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXHRcdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0XHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRcdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdHVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcblxuXHRcdGZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXS5hY3Rpb25CeVJvb3QsXG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbW92ZSBhIHRhcmdldGVkIGNsaXAgZnJvbSB0aGUgY2FjaGVcblx0dW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHRpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHtcblxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLicgKTtcblx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdH1cblxuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cbn1cblxuVW5pZm9ybS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc7XG5cdHRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB1bmRlZmluZWQ7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tYXhJbnN0YW5jZWRDb3VudCA9IHNvdXJjZS5tYXhJbnN0YW5jZWRDb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQsIG5vcm1hbGl6ZWQgKSB7XG5cblx0dGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG5cblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0Y291bnQ6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmNvdW50O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YXJyYXk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApIHtcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuc3RyaWRlID0gc3RyaWRlO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdG9uVXBsb2FkQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuc3RyaWRlIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcblx0XHR0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7XG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0SW50ZXJsZWF2ZWRCdWZmZXIuY2FsbCggdGhpcywgYXJyYXksIHN0cmlkZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcixcblxuXHRpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0SW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBhcnJheSwgaXRlbVNpemUgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBzdGVwaG9taSAvIGh0dHA6Ly9zdGVwaGFuZWdpbmllci5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMucmF5ID0gbmV3IFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHR0aGlzLm5lYXIgPSBuZWFyIHx8IDA7XG5cdHRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5O1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHt9LFxuXHRcdExPRDoge30sXG5cdFx0UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LFxuXHRcdFNwcml0ZToge31cblx0fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcy5wYXJhbXMsIHtcblx0XHRQb2ludENsb3VkOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLlBvaW50cztcblxuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xuXG59XG5cbmZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdE9iamVjdCggb2JqZWN0LCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApIHtcblxuXHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0bGluZVByZWNpc2lvbjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdFx0dGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNhbWVyYTogZnVuY3Rpb24gKCBjb29yZHMsIGNhbWVyYSApIHtcblxuXHRcdGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdH0gZWxzZSBpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwgY29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFuZSBvZiBjYW1lcmFcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBvcHRpb25hbFRhcmdldCB8fCBbXTtcblxuXHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3RzOiBmdW5jdGlvbiAoIG9iamVjdHMsIHJlY3Vyc2l2ZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IG9wdGlvbmFsVGFyZ2V0IHx8IFtdO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3RzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdH1cblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDbG9jayggYXV0b1N0YXJ0ICkge1xuXG5cdHRoaXMuYXV0b1N0YXJ0ID0gKCBhdXRvU3RhcnQgIT09IHVuZGVmaW5lZCApID8gYXV0b1N0YXJ0IDogdHJ1ZTtcblxuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMub2xkVGltZSA9IDA7XG5cdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXG5cdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENsb2NrLnByb3RvdHlwZSwge1xuXG5cdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEwNzMyXG5cblx0XHR0aGlzLm9sZFRpbWUgPSB0aGlzLnN0YXJ0VGltZTtcblx0XHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblx0XHR0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXRFbGFwc2VkVGltZSgpO1xuXHRcdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRFbGFwc2VkVGltZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXREZWx0YSgpO1xuXHRcdHJldHVybiB0aGlzLmVsYXBzZWRUaW1lO1xuXG5cdH0sXG5cblx0Z2V0RGVsdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkaWZmID0gMDtcblxuXHRcdGlmICggdGhpcy5hdXRvU3RhcnQgJiYgISB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHRoaXMuc3RhcnQoKTtcblx0XHRcdHJldHVybiAwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHZhciBuZXdUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7XG5cblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xuXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqIFRoZSBwb2xlcyAocGhpKSBhcmUgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuXG4gKiBUaGUgZXF1YXRvciBzdGFydHMgYXQgcG9zaXRpdmUgei5cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmljYWwoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDtcblx0dGhpcy5waGkgPSAoIHBoaSAhPT0gdW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyB1cCAvIGRvd24gdG93YXJkcyB0b3AgYW5kIGJvdHRvbSBwb2xlXG5cdHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gYXJvdW5kIHRoZSBlcXVhdG9yIG9mIHRoZSBzcGhlcmVcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG5PYmplY3QuYXNzaWduKCBTcGhlcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMucGhpID0gcGhpO1xuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWUgRVBTIGFuZCBQSS1FUFNcblx0bWFrZVNhZmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblx0XHR0aGlzLnBoaSA9IE1hdGgubWF4KCBFUFMsIE1hdGgubWluKCBNYXRoLlBJIC0gRVBTLCB0aGlzLnBoaSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHZlYzMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIHRoaXMucmFkaXVzID09PSAwICkge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gMDtcblx0XHRcdHRoaXMucGhpID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApOyAvLyBlcXVhdG9yIGFuZ2xlIGFyb3VuZCB5LXVwIGF4aXNcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdmVjMy55IC8gdGhpcy5yYWRpdXMsIC0gMSwgMSApICk7IC8vIHBvbGFyIGFuZ2xlXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3lsaW5kcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKi9cblxuZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7IC8vIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmVcblx0dGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXNcblx0dGhpcy55ID0gKCB5ICE9PSB1bmRlZmluZWQgKSA/IHkgOiAwOyAvLyBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN5bGluZHJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXHRcdHRoaXMueSA9IG90aGVyLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggdmVjMy54ICogdmVjMy54ICsgdmVjMy56ICogdmVjMy56ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7XG5cdFx0dGhpcy55ID0gdmVjMy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEJveDIoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueTtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9uc1xuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSW1tZWRpYXRlUmVuZGVyT2JqZWN0KCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTtcblxufVxuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW1tZWRpYXRlUmVuZGVyT2JqZWN0O1xuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVydGV4Tm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZjAwMDA7XG5cblx0dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTtcblxuXHQvL1xuXG5cdHZhciBuTm9ybWFscyA9IDA7XG5cblx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGggKiAzO1xuXG5cdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50O1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBsaW5ld2lkdGg6IHdpZHRoIH0gKSApO1xuXG5cdC8vXG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVydGV4Tm9ybWFsc0hlbHBlcjtcblxuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0dmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHZlcnRleCA9IHZlcnRpY2VzWyBmYWNlWyBrZXlzWyBqIF0gXSBdO1xuXG5cdFx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdO1xuXG5cdFx0XHRcdFx0djEuY29weSggdmVydGV4ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0djIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHR2YXIgb2JqTm9ybSA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdFx0Ly8gZm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQgZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2ZXJ5IG5vcm1hbFxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gb2JqUG9zLmNvdW50OyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0djEuc2V0KCBvYmpQb3MuZ2V0WCggaiApLCBvYmpQb3MuZ2V0WSggaiApLCBvYmpQb3MuZ2V0WiggaiApICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHYyLnNldCggb2JqTm9ybS5nZXRYKCBqICksIG9iak5vcm0uZ2V0WSggaiApLCBvYmpOb3JtLmdldFooIGogKSApO1xuXG5cdFx0XHRcdHYyLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbXG5cdFx0MCwgMCwgMCwgXHQwLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MSwgMCwgMSxcblx0XHQwLCAwLCAwLFx0LSAxLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MCwgMSwgMSxcblx0XHQwLCAwLCAwLCBcdDAsIC0gMSwgMVxuXHRdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XG5cblx0XHR2YXIgcDEgPSAoIGkgLyBsICkgKiBNYXRoLlBJICogMjtcblx0XHR2YXIgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjtcblxuXHRcdHBvc2l0aW9ucy5wdXNoKFxuXHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxuXHRcdFx0TWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxXG5cdFx0KTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcG90TGlnaHRIZWxwZXI7XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlY3RvcjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHR2YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0XHR2YXIgY29uZVdpZHRoID0gY29uZUxlbmd0aCAqIE1hdGgudGFuKCB0aGlzLmxpZ2h0LmFuZ2xlICk7XG5cblx0XHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBjb25lV2lkdGgsIGNvbmVXaWR0aCwgY29uZUxlbmd0aCApO1xuXG5cdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHZlY3RvcjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggdmVjdG9yMi5zdWIoIHZlY3RvciApICk7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWZcbiAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIGdldEJvbmVMaXN0KCBvYmplY3QgKSB7XG5cblx0dmFyIGJvbmVMaXN0ID0gW107XG5cblx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XG5cblx0fVxuXG5cdHJldHVybiBib25lTGlzdDtcblxufVxuXG5mdW5jdGlvbiBTa2VsZXRvbkhlbHBlciggb2JqZWN0ICkge1xuXG5cdHZhciBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoIDAsIDAsIDEgKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvciggMCwgMSwgMCApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBib25lID0gYm9uZXNbIGkgXTtcblxuXHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5yb290ID0gb2JqZWN0O1xuXHR0aGlzLmJvbmVzID0gYm9uZXM7XG5cblx0dGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyO1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGJvbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdG1hdHJpeFdvcmxkSW52LmdldEludmVyc2UoIHRoaXMucm9vdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ym9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0aiArPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRMaWdodEhlbHBlciggbGlnaHQsIHNwaGVyZVNpemUsIGNvbG9yICkge1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHNwaGVyZVNpemUsIDQsIDIgKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cblxuXHQvKlxuXHR2YXIgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxLCAyICk7XG5cdHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHR0aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRyeSwgYnVsYk1hdGVyaWFsICk7XG5cdHRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7XG5cblx0dmFyIGQgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cblx0dGhpcy5hZGQoIHRoaXMubGlnaHREaXN0YW5jZSApO1xuXHQqL1xuXG59XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTtcblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRMaWdodEhlbHBlcjtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxuXHQvKlxuXHR2YXIgZCA9IHRoaXMubGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IHRydWU7XG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblx0Ki9cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0SGVscGVyKCBsaWdodCwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCA1ICogMyApLCAzICkgKTtcblxuXHR0aGlzLmxpbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmxpbmUgKTtcblxuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjdEFyZWFMaWdodEhlbHBlcjtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Ly8gY2FsY3VsYXRlIG5ldyBkaW1lbnNpb25zIG9mIHRoZSBoZWxwZXJcblxuXHR2YXIgaHggPSB0aGlzLmxpZ2h0LndpZHRoICogMC41O1xuXHR2YXIgaHkgPSB0aGlzLmxpZ2h0LmhlaWdodCAqIDAuNTtcblxuXHR2YXIgcG9zaXRpb24gPSB0aGlzLmxpbmUuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0Ly8gdXBkYXRlIHZlcnRpY2VzXG5cblx0YXJyYXlbIDAgXSA9IGh4OyBhcnJheVsgMSBdID0gLSBoeTsgYXJyYXlbIDIgXSA9IDA7XG5cdGFycmF5WyAzIF0gPSBoeDsgYXJyYXlbIDQgXSA9IGh5OyBhcnJheVsgNSBdID0gMDtcblx0YXJyYXlbIDYgXSA9IC0gaHg7IGFycmF5WyA3IF0gPSBoeTsgYXJyYXlbIDggXSA9IDA7XG5cdGFycmF5WyA5IF0gPSAtIGh4OyBhcnJheVsgMTAgXSA9IC0gaHk7IGFycmF5WyAxMSBdID0gMDtcblx0YXJyYXlbIDEyIF0gPSBoeDsgYXJyYXlbIDEzIF0gPSAtIGh5OyBhcnJheVsgMTQgXSA9IDA7XG5cblx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCBzaXplICk7XG5cdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcblxuXHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cdGlmICggdGhpcy5jb2xvciA9PT0gdW5kZWZpbmVkICkgdGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7XG5cblx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAqIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxpZ2h0SGVscGVyO1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvcigpO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcblxuXHRcdFx0Y29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRcdGNvbG9yMi5jb3B5KCB0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRcdFx0Y29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRtZXNoLmxvb2tBdCggdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxMDtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEwO1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdHZhciBzdGVwID0gc2l6ZSAvIGRpdmlzaW9ucztcblx0dmFyIGhhbGZTaXplID0gc2l6ZSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0dmFyIGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBIZWN0YXRlIC8gaHR0cDovL3d3dy5naXRodWIuY29tL0hlY3RhdGVcbiAqL1xuXG5mdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFkaWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTA7XG5cdHJhZGlhbHMgPSByYWRpYWxzIHx8IDE2O1xuXHRjaXJjbGVzID0gY2lyY2xlcyB8fCA4O1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgNjQ7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciB4LCB6O1xuXHR2YXIgdiwgaSwgaiwgciwgY29sb3I7XG5cblx0Ly8gY3JlYXRlIHRoZSByYWRpYWxzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHtcblxuXHRcdHYgPSAoIGkgLyByYWRpYWxzICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHJhZGl1cztcblx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHR9XG5cblx0Ly8gY3JlYXRlIHRoZSBjaXJjbGVzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gY2lyY2xlczsgaSArKyApIHtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0ciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xuXG5cdFx0XHQvLyBmaXJzdCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdC8vIHNlY29uZCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gRmFjZU5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0Ly8gRmFjZU5vcm1hbHNIZWxwZXIgb25seSBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeVxuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGYWNlTm9ybWFsc0hlbHBlcjtcblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdHZhciBpZHggPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmMgXSApXG5cdFx0XHRcdC5kaXZpZGVTY2FsYXIoIDMgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0LSBzaXplLCBzaXplLCAwLFxuXHRcdHNpemUsIHNpemUsIDAsXG5cdFx0c2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgc2l6ZSwgMFxuXHRdLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5saWdodFBsYW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XG5cblx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAwLCAxIF0sIDMgKSApO1xuXG5cdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMudGFyZ2V0TGluZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGlyZWN0aW9uYWxMaWdodEhlbHBlcjtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdHYzLnN1YlZlY3RvcnMoIHYyLCB2MSApO1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLmxvb2tBdCggdjMgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIHYzICk7XG5cdFx0dGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSB2My5sZW5ndGgoKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICpcdC0gc2hvd3MgZnJ1c3R1bSwgbGluZSBvZiBzaWdodCBhbmQgdXAgb2YgdGhlIGNhbWVyYVxuICpcdC0gc3VpdGFibGUgZm9yIGZhc3QgdXBkYXRlc1xuICogXHQtIGJhc2VkIG9uIGZydXN0dW0gdmlzdWFsaXphdGlvbiBpbiBsaWdodGdsLmpzIHNoYWRvd21hcCBleGFtcGxlXG4gKlx0XHRodHRwOi8vZXZhbncuZ2l0aHViLmNvbS9saWdodGdsLmpzL3Rlc3RzL3NoYWRvd21hcC5odG1sXG4gKi9cblxuZnVuY3Rpb24gQ2FtZXJhSGVscGVyKCBjYW1lcmEgKSB7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRleENvbG9yczogRmFjZUNvbG9ycyB9ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgcG9pbnRNYXAgPSB7fTtcblxuXHQvLyBjb2xvcnNcblxuXHR2YXIgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yKCAweGZmYWEwMCApO1xuXHR2YXIgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xuXHR2YXIgY29sb3JVcCA9IG5ldyBDb2xvciggMHgwMGFhZmYgKTtcblx0dmFyIGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR2YXIgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcblxuXHQvLyBuZWFyXG5cblx0YWRkTGluZSggJ24xJywgJ24yJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMicsICduNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnbjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24zJywgJ24xJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gZmFyXG5cblx0YWRkTGluZSggJ2YxJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmMicsICdmNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjQnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2YzJywgJ2YxJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gc2lkZXNcblxuXHRhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24yJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMycsICdmMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBjb25lXG5cblx0YWRkTGluZSggJ3AnLCAnbjEnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjInLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjMnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjQnLCBjb2xvckNvbmUgKTtcblxuXHQvLyB1cFxuXG5cdGFkZExpbmUoICd1MScsICd1MicsIGNvbG9yVXAgKTtcblx0YWRkTGluZSggJ3UyJywgJ3UzJywgY29sb3JVcCApO1xuXHRhZGRMaW5lKCAndTMnLCAndTEnLCBjb2xvclVwICk7XG5cblx0Ly8gdGFyZ2V0XG5cblx0YWRkTGluZSggJ2MnLCAndCcsIGNvbG9yVGFyZ2V0ICk7XG5cdGFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7XG5cblx0Ly8gY3Jvc3NcblxuXHRhZGRMaW5lKCAnY24xJywgJ2NuMicsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggJ2NuMycsICdjbjQnLCBjb2xvckNyb3NzICk7XG5cblx0YWRkTGluZSggJ2NmMScsICdjZjInLCBjb2xvckNyb3NzICk7XG5cdGFkZExpbmUoICdjZjMnLCAnY2Y0JywgY29sb3JDcm9zcyApO1xuXG5cdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNvbG9yICkge1xuXG5cdFx0YWRkUG9pbnQoIGEsIGNvbG9yICk7XG5cdFx0YWRkUG9pbnQoIGIsIGNvbG9yICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFBvaW50KCBpZCwgY29sb3IgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdGlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cG9pbnRNYXBbIGlkIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdHBvaW50TWFwWyBpZCBdLnB1c2goICggdmVydGljZXMubGVuZ3RoIC8gMyApIC0gMSApO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXHRpZiAoIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXggKSB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMucG9pbnRNYXAgPSBwb2ludE1hcDtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FtZXJhSGVscGVyO1xuXG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZ2VvbWV0cnksIHBvaW50TWFwO1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgY2FtZXJhID0gbmV3IENhbWVyYSgpO1xuXG5cdGZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgeCwgeSwgeiApIHtcblxuXHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKS51bnByb2plY3QoIGNhbWVyYSApO1xuXG5cdFx0dmFyIHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdO1xuXG5cdFx0aWYgKCBwb2ludHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggcG9pbnRzWyBpIF0sIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0Z2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDtcblxuXHRcdHZhciB3ID0gMSwgaCA9IDE7XG5cblx0XHQvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxuXG5cdFx0c2V0UG9pbnQoICdjJywgMCwgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd0JywgMCwgMCwgMSApO1xuXG5cdFx0Ly8gbmVhclxuXG5cdFx0c2V0UG9pbnQoICduMScsIC0gdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24yJywgdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24zJywgLSB3LCBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ240JywgdywgaCwgLSAxICk7XG5cblx0XHQvLyBmYXJcblxuXHRcdHNldFBvaW50KCAnZjEnLCAtIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCAnZjInLCB3LCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2YzJywgLSB3LCBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmNCcsIHcsIGgsIDEgKTtcblxuXHRcdC8vIHVwXG5cblx0XHRzZXRQb2ludCggJ3UxJywgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MicsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MycsIDAsIGggKiAyLCAtIDEgKTtcblxuXHRcdC8vIGNyb3NzXG5cblx0XHRzZXRQb2ludCggJ2NmMScsIC0gdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YyJywgdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YzJywgMCwgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjQnLCAwLCBoLCAxICk7XG5cblx0XHRzZXRQb2ludCggJ2NuMScsIC0gdywgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjInLCB3LCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuMycsIDAsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjQnLCAwLCBoLCAtIDEgKTtcblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblxuXHR2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKiAzICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3hIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94SGVscGVyO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBib3ggPSBuZXcgQm94MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLicgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym94LnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0XHR2YXIgbWluID0gYm94Lm1pbjtcblx0XHR2YXIgbWF4ID0gYm94Lm1heDtcblxuXHRcdC8qXG5cdFx0ICA1X19fXzRcblx0XHQxL19fXzAvfFxuXHRcdHwgNl9ffF83XG5cdFx0Mi9fX18zL1xuXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4Lnpcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcblx0XHQqL1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdFx0YXJyYXlbIDAgXSA9IG1heC54OyBhcnJheVsgMSBdID0gbWF4Lnk7IGFycmF5WyAyIF0gPSBtYXguejtcblx0XHRhcnJheVsgMyBdID0gbWluLng7IGFycmF5WyA0IF0gPSBtYXgueTsgYXJyYXlbIDUgXSA9IG1heC56O1xuXHRcdGFycmF5WyA2IF0gPSBtaW4ueDsgYXJyYXlbIDcgXSA9IG1pbi55OyBhcnJheVsgOCBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56O1xuXHRcdGFycmF5WyAxMiBdID0gbWF4Lng7IGFycmF5WyAxMyBdID0gbWF4Lnk7IGFycmF5WyAxNCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE1IF0gPSBtaW4ueDsgYXJyYXlbIDE2IF0gPSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAyMSBdID0gbWF4Lng7IGFycmF5WyAyMiBdID0gbWluLnk7IGFycmF5WyAyMyBdID0gbWluLno7XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdH07XG5cbn0gKSgpO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnNldEZyb21PYmplY3QgPSBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0dGhpcy51cGRhdGUoKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBCb3gzSGVscGVyKCBib3gsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnQm94M0hlbHBlcic7XG5cblx0dGhpcy5ib3ggPSBib3g7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSBdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG59XG5cbkJveDNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQm94M0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3gzSGVscGVyO1xuXG5Cb3gzSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIGJveCA9IHRoaXMuYm94O1xuXG5cdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRib3guZ2V0Q2VudGVyKCB0aGlzLnBvc2l0aW9uICk7XG5cblx0Ym94LmdldFNpemUoIHRoaXMuc2NhbGUgKTtcblxuXHR0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBQbGFuZUhlbHBlciggcGxhbmUsIHNpemUsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVIZWxwZXInO1xuXG5cdHRoaXMucGxhbmUgPSBwbGFuZTtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgPT09IHVuZGVmaW5lZCApID8gMSA6IHNpemU7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgLSAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAgXTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHQvL1xuXG5cdHZhciBwb3NpdGlvbnMyID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxIF07XG5cblx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5MiwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgb3BhY2l0eTogMC4yLCB0cmFuc3BhcmVudDogdHJ1ZSwgZGVwdGhXcml0ZTogZmFsc2UgfSApICkgKTtcblxufVxuXG5QbGFuZUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApO1xuUGxhbmVIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVIZWxwZXI7XG5cblBsYW5lSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIHNjYWxlID0gLSB0aGlzLnBsYW5lLmNvbnN0YW50O1xuXG5cdGlmICggTWF0aC5hYnMoIHNjYWxlICkgPCAxZS04ICkgc2NhbGUgPSAxZS04OyAvLyBzaWduIGRvZXMgbm90IG1hdHRlclxuXG5cdHRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgc2NhbGUgKTtcblxuXHR0aGlzLmxvb2tBdCggdGhpcy5wbGFuZS5ub3JtYWwgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqXG4gKiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zXG4gKlxuICogUGFyYW1ldGVyczpcbiAqICBkaXIgLSBWZWN0b3IzXG4gKiAgb3JpZ2luIC0gVmVjdG9yM1xuICogIGxlbmd0aCAtIE51bWJlclxuICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlXG4gKiAgaGVhZExlbmd0aCAtIE51bWJlclxuICogIGhlYWRXaWR0aCAtIE51bWJlclxuICovXG5cbnZhciBsaW5lR2VvbWV0cnk7XG52YXIgY29uZUdlb21ldHJ5O1xuXG5mdW5jdGlvbiBBcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cdGlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSBsZW5ndGggPSAxO1xuXHRpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7XG5cdGlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoO1xuXG5cdGlmICggbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRsaW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRsaW5lR2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xuXG5cdFx0Y29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdGNvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XG5cblx0fVxuXG5cdHRoaXMucG9zaXRpb24uY29weSggb3JpZ2luICk7XG5cblx0dGhpcy5saW5lID0gbmV3IExpbmUoIGxpbmVHZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBNZXNoKCBjb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnNldERpcmVjdGlvbiggZGlyICk7XG5cdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXG59XG5cbkFycm93SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQXJyb3dIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyb3dIZWxwZXI7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgYXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByYWRpYW5zO1xuXG5cdHJldHVybiBmdW5jdGlvbiBzZXREaXJlY3Rpb24oIGRpciApIHtcblxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXhpcy5zZXQoIGRpci56LCAwLCAtIGRpci54ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdHJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCByYWRpYW5zICk7XG5cblx0XHR9XG5cblx0fTtcblxufSgpICk7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRMZW5ndGggPSBmdW5jdGlvbiAoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0dGhpcy5saW5lLnNjYWxlLnNldCggMSwgTWF0aC5tYXgoIDAsIGxlbmd0aCAtIGhlYWRMZW5ndGggKSwgMSApO1xuXHR0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy5jb25lLnNjYWxlLnNldCggaGVhZFdpZHRoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcblx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XG5cdHRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTtcblxufTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldENvbG9yID0gZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBzcm91Y2hlcmF5IC8gaHR0cDovL3Nyb3VjaGVyYXkub3JnL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBeGVzSGVscGVyKCBzaXplICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDE7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDAsIDAsIDAsXHRzaXplLCAwLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCBzaXplLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCAwLCBzaXplXG5cdF07XG5cblx0dmFyIGNvbG9ycyA9IFtcblx0XHQxLCAwLCAwLFx0MSwgMC42LCAwLFxuXHRcdDAsIDEsIDAsXHQwLjYsIDEsIDAsXG5cdFx0MCwgMCwgMSxcdDAsIDAuNiwgMVxuXHRdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuQXhlc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5BeGVzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4ZXNIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGYWNlNCggYSwgYiwgYywgZCwgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApO1xuXG59XG5cbnZhciBMaW5lU3RyaXAgPSAwO1xuXG52YXIgTGluZVBpZWNlcyA9IDE7XG5cbmZ1bmN0aW9uIE1lc2hGYWNlTWF0ZXJpYWwoIG1hdGVyaWFscyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoRmFjZU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG1hdGVyaWFscztcblxufVxuXG5mdW5jdGlvbiBNdWx0aU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0aWYgKCBtYXRlcmlhbHMgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFscyA9IFtdO1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApO1xuXHRtYXRlcmlhbHMuaXNNdWx0aU1hdGVyaWFsID0gdHJ1ZTtcblx0bWF0ZXJpYWxzLm1hdGVyaWFscyA9IG1hdGVyaWFscztcblx0bWF0ZXJpYWxzLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFscy5zbGljZSgpO1xuXG5cdH07XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZnVuY3Rpb24gUG9pbnRDbG91ZCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGUoIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLicgKTtcblx0cmV0dXJuIG5ldyBTcHJpdGUoIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVTeXN0ZW0oIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQb2ludENsb3VkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZE1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW1NYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFZlcnRleCggeCwgeSwgeiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZXJ0ZXggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLlZlY3RvcjMgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVmVjdG9yMyggeCwgeSwgeiApO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkuc2V0RHluYW1pYyggdHJ1ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50OENsYW1wZWRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0NjRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbi8vXG5cbkN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQnICk7XG5cblx0Y29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0O1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7XG5cblx0cmV0dXJuIGNvbnN0cnVjdDtcblxufTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggQ3VydmVQYXRoLnByb3RvdHlwZSwge1xuXG5cdGNyZWF0ZVBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBwYXRoIHBvaW50cyAoZm9yIExpbmUgb3IgUG9pbnRzIG9iamVjdHMpXG5cblx0XHR2YXIgcHRzID0gdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTtcblxuXHR9LFxuXG5cdGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBlcXVpZGlzdGFudCBzYW1wbGluZyBhbG9uZyB0aGUgcGF0aFxuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVHZW9tZXRyeTogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0Z2VvbWV0cnkudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIFBhdGgucHJvdG90eXBlLCB7XG5cblx0ZnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXRoOiAuZnJvbVBvaW50cygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qb2ludHMoKS4nICk7XG5cdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gQ2xvc2VkU3BsaW5lQ3VydmUzKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblx0dGhpcy5jbG9zZWQgPSB0cnVlO1xuXG59XG5cbkNsb3NlZFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmUoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG5PYmplY3QuYXNzaWduKCBTcGxpbmUucHJvdG90eXBlLCB7XG5cblx0aW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRnZXRDb250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggLyogb3B0aW9uYWxUYXJnZXQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOiBmdW5jdGlvbiAoIC8qIHNhbXBsaW5nQ29lZiAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gQXhpc0hlbHBlciggc2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BeGlzSGVscGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuQXhlc0hlbHBlci4nICk7XG5cdHJldHVybiBuZXcgQXhlc0hlbHBlciggc2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEJvdW5kaW5nQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApO1xuXG59XG5cbmZ1bmN0aW9uIEVkZ2VzSGVscGVyKCBvYmplY3QsIGhleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBFZGdlc0dlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlLnNldENvbG9ycyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLicgKTtcblxufTtcblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuJyApO1xuXG59O1xuXG5mdW5jdGlvbiBXaXJlZnJhbWVIZWxwZXIoIG9iamVjdCwgaGV4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgV2lyZWZyYW1lR2VvbWV0cnkoIG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleCAhPT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSApICk7XG5cbn1cblxuLy9cblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5mdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5MaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBfTWF0aCwge1xuXG5cdHJhbmRvbTE2OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAucmFuZG9tMTYoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgTWF0aC5yYW5kb20oKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gTWF0aC5yYW5kb20oKTtcblxuXHR9LFxuXG5cdG5lYXJlc3RQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fSxcblxuXHRuZXh0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZXh0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNlaWxQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5jZWlsUG93ZXJPZlR3byggdmFsdWUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGFycmF5LCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdH0sXG5cdG11bHRpcGx5VG9BcnJheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VG9BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3I0OiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHR2LnRyYW5zZm9ybURpcmVjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cdGNyb3NzVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVCeUF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24gKCBidWZmZXIgLyosIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApO1xuXG5cdH0sXG5cdGFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYXJyYXksIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bWFrZUZydXN0dW06IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICk7XG5cblx0fVxuXG59ICk7XG5cblBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTtcblxufTtcblxuUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZSggcGxhbmUgKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdGFyZWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXJlYSgpO1xuXG5cdH0sXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgdGFyZ2V0ICk7XG5cblx0fSxcblx0bWlkcG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE1pZHBvaW50KCB0YXJnZXQgKTtcblxuXHR9LFxuXHRub3JtYWw6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKCB0YXJnZXQgKTtcblxuXHR9LFxuXHRwbGFuZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLnBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0UGxhbmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGxhbmUoIHRhcmdldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZSwge1xuXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApO1xuXG5cdH0sXG5cdG5vcm1hbDogZnVuY3Rpb24gKCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLicgKTtcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggU2hhcGUucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdEFsbFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRyYWN0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblxuXHR9LFxuXHRleHRydWRlOiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9LFxuXHRtYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IFNoYXBlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRzZXRFdWxlckZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRnZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0Z2V0U2NhbGVGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZSggbSApO1xuXG5cdH0sXG5cdGdldENvbHVtbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtYXRyaXgsIGluZGV4ICk7XG5cblx0fSxcblx0YXBwbHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHR9LFxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0Z2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7XG5cblx0fSxcblx0cmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIGRpc3RhbmNlLCBheGlzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblx0Z2V0V29ybGRSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRSb3RhdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5PYmplY3QzRC5nZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIGluc3RlYWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0ZXVsZXJPcmRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHVzZVF1YXRlcm5pb246IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHtcblxuXHRvYmplY3RzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxPRDogLm9iamVjdHMgaGFzIGJlZW4gcmVuYW1lZCB0byAubGV2ZWxzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmxldmVscztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggU2tlbGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3VydmUucHJvdG90eXBlLCAnX19hcmNMZW5ndGhEaXZpc2lvbnMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0fSxcblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlLnNldExlbnMgPSBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoLCBmaWxtR2F1Z2UgKSB7XG5cblx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gXCIgK1xuXHRcdFx0XCJVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC5cIiApO1xuXG5cdGlmICggZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSB0aGlzLmZpbG1HYXVnZSA9IGZpbG1HYXVnZTtcblx0dGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwge1xuXHRvbmx5U2hhZG93OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRm92OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTGVmdDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5sZWZ0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVJpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVG9wOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhQm90dG9tOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTmVhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVZpc2libGU6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0JpYXM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93RGFya25lc3M6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwV2lkdGg6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEhlaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGxlbmd0aDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcblxuXHRcdH1cblx0fSxcblx0Y29weUluZGljZXNBcnJheTogZnVuY3Rpb24gKCAvKiBpbmRpY2VzICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0YWRkSW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7XG5cdFx0dGhpcy5zZXRJbmRleCggaW5kZXggKTtcblxuXHR9LFxuXHRhZGREcmF3Q2FsbDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBpbmRleE9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIGluZGV4T2Zmc2V0LicgKTtcblxuXHRcdH1cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTtcblx0XHR0aGlzLmFkZEdyb3VwKCBzdGFydCwgY291bnQgKTtcblxuXHR9LFxuXHRjbGVhckRyYXdDYWxsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4nICk7XG5cdFx0dGhpcy5jbGVhckdyb3VwcygpO1xuXG5cdH0sXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRjb21wdXRlT2Zmc2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGdldEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmdldEFycmF5cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cblx0YWRkU2hhcGVMaXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblxuXHRhZGRTaGFwZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBVbmlmb3JtLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLmR5bmFtaWMgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRvblVwZGF0ZToge1xuXHRcdHZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHdyYXBBcm91bmQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwUkdCOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLicgKTtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoKTtcblxuXHRcdH1cblx0fSxcblxuXHRzaGFkaW5nOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIHZhbHVlID09PSBGbGF0U2hhZGluZyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdG1ldGFsOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCcgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRkZXJpdmF0aXZlczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0fSxcblxuXHRnZXRNYXhBbmlzb3Ryb3B5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcblxuXHR9LFxuXG5cdGdldFByZWNpc2lvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxuXHR9LFxuXG5cdHJlc2V0R0xTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKTtcblxuXHR9LFxuXG5cdHN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQmxlbmRNaW5NYXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnRVhUX2JsZW5kX21pbm1heFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0fSxcblx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdH0sXG5cdHN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHR9LFxuXHRlbmFibGVTY2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLicgKTtcblx0XHR0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XG5cblx0fSxcblx0aW5pdE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUHJlUGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUG9zdFBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHR1cGRhdGVTaGFkb3dNYXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXRGYWNlQ3VsbGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldEZhY2VDdWxsaW5nKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdHNoYWRvd01hcEVuYWJsZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC5lbmFibGVkID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFR5cGU6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFNoYWRvd01hcC5wcm90b3R5cGUsIHtcblxuXHRjdWxsRmFjZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIGN1bGxGYWNlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRyZW5kZXJSZXZlcnNlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclNpbmdsZVNpZGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHtcblxuXHR3cmFwUzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwVDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwVCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtYWdGaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWluRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGFuaXNvdHJvcHk6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUub2Zmc2V0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHJlcGVhdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRmb3JtYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRnZW5lcmF0ZU1pcG1hcHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJWUk1hbmFnZXIucHJvdG90eXBlLCB7XG5cblx0c3RhbmRpbmc6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuQXVkaW8ucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoIGZpbGUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLicgKTtcblx0dmFyIHNjb3BlID0gdGhpcztcblx0dmFyIGF1ZGlvTG9hZGVyID0gbmV3IEF1ZGlvTG9hZGVyKCk7XG5cdGF1ZGlvTG9hZGVyLmxvYWQoIGZpbGUsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0c2NvcGUuc2V0QnVmZmVyKCBidWZmZXIgKTtcblxuXHR9ICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5BdWRpb0FuYWx5c2VyLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cbn07XG5cbi8vXG5cbkN1YmVDYW1lcmEucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXAgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy51cGRhdGUoIHJlbmRlcmVyLCBzY2VuZSApO1xuXG59O1xuXG4vL1xuXG52YXIgR2VvbWV0cnlVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeTEsIGdlb21ldHJ5MiwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4nICk7XG5cdFx0dmFyIG1hdHJpeDtcblxuXHRcdGlmICggZ2VvbWV0cnkyLmlzTWVzaCApIHtcblxuXHRcdFx0Z2VvbWV0cnkyLm1hdHJpeEF1dG9VcGRhdGUgJiYgZ2VvbWV0cnkyLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHRtYXRyaXggPSBnZW9tZXRyeTIubWF0cml4O1xuXHRcdFx0Z2VvbWV0cnkyID0gZ2VvbWV0cnkyLmdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkxLm1lcmdlKCBnZW9tZXRyeTIsIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIGdlb21ldHJ5LmNlbnRlcigpO1xuXG5cdH1cblxufTtcblxudmFyIEltYWdlVXRpbHMgPSB7XG5cblx0Y3Jvc3NPcmlnaW46IHVuZGVmaW5lZCxcblxuXHRsb2FkVGV4dHVyZTogZnVuY3Rpb24gKCB1cmwsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJsLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0bG9hZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoIHVybHMsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmVDdWJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DdWJlVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBDdWJlVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJscywgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdGxvYWRDb21wcmVzc2VkVGV4dHVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fSxcblxuXHRsb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBQcm9qZWN0b3IoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5qcy4nICk7XG5cblx0dGhpcy5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVyYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnByb2plY3QoIGNhbWVyYSApO1xuXG5cdH07XG5cblx0dGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAudW5wcm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci51bnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0fTtcblxuXHR0aGlzLnBpY2tpbmdSYXkgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9yOiAucGlja2luZ1JheSgpIGlzIG5vdyByYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSgpLicgKTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL0NhbnZhc1JlbmRlcmVyLmpzJyApO1xuXG5cdHRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoKSB7fTtcblxufVxuXG4vL1xuXG52YXIgU2NlbmVVdGlscyA9IHtcblxuXHRjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OiBmdW5jdGlvbiAoIC8qIGdlb21ldHJ5LCBtYXRlcmlhbHMgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcycgKTtcblxuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24gKCAvKiBjaGlsZCwgcGFyZW50LCBzY2VuZSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0YXR0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBzY2VuZSwgcGFyZW50ICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMnICk7XG5cblx0fVxuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBMZW5zRmxhcmUoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMnICk7XG5cbn1cblxuZXhwb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLCBXZWJHTFJlbmRlclRhcmdldCwgV2ViR0xSZW5kZXJlciwgU2hhZGVyTGliLCBVbmlmb3Jtc0xpYiwgVW5pZm9ybXNVdGlscywgU2hhZGVyQ2h1bmssIEZvZ0V4cDIsIEZvZywgU2NlbmUsIFNwcml0ZSwgTE9ELCBTa2lubmVkTWVzaCwgU2tlbGV0b24sIEJvbmUsIE1lc2gsIExpbmVTZWdtZW50cywgTGluZUxvb3AsIExpbmUsIFBvaW50cywgR3JvdXAsIFZpZGVvVGV4dHVyZSwgRGF0YVRleHR1cmUsIENvbXByZXNzZWRUZXh0dXJlLCBDdWJlVGV4dHVyZSwgQ2FudmFzVGV4dHVyZSwgRGVwdGhUZXh0dXJlLCBUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciwgRGF0YVRleHR1cmVMb2FkZXIsIEN1YmVUZXh0dXJlTG9hZGVyLCBUZXh0dXJlTG9hZGVyLCBPYmplY3RMb2FkZXIsIE1hdGVyaWFsTG9hZGVyLCBCdWZmZXJHZW9tZXRyeUxvYWRlciwgRGVmYXVsdExvYWRpbmdNYW5hZ2VyLCBMb2FkaW5nTWFuYWdlciwgSlNPTkxvYWRlciwgSW1hZ2VMb2FkZXIsIEltYWdlQml0bWFwTG9hZGVyLCBGb250TG9hZGVyLCBGaWxlTG9hZGVyLCBMb2FkZXIsIExvYWRlclV0aWxzLCBDYWNoZSwgQXVkaW9Mb2FkZXIsIFNwb3RMaWdodFNoYWRvdywgU3BvdExpZ2h0LCBQb2ludExpZ2h0LCBSZWN0QXJlYUxpZ2h0LCBIZW1pc3BoZXJlTGlnaHQsIERpcmVjdGlvbmFsTGlnaHRTaGFkb3csIERpcmVjdGlvbmFsTGlnaHQsIEFtYmllbnRMaWdodCwgTGlnaHRTaGFkb3csIExpZ2h0LCBTdGVyZW9DYW1lcmEsIFBlcnNwZWN0aXZlQ2FtZXJhLCBPcnRob2dyYXBoaWNDYW1lcmEsIEN1YmVDYW1lcmEsIEFycmF5Q2FtZXJhLCBDYW1lcmEsIEF1ZGlvTGlzdGVuZXIsIFBvc2l0aW9uYWxBdWRpbywgQXVkaW9Db250ZXh0LCBBdWRpb0FuYWx5c2VyLCBBdWRpbywgVmVjdG9yS2V5ZnJhbWVUcmFjaywgU3RyaW5nS2V5ZnJhbWVUcmFjaywgUXVhdGVybmlvbktleWZyYW1lVHJhY2ssIE51bWJlcktleWZyYW1lVHJhY2ssIENvbG9yS2V5ZnJhbWVUcmFjaywgQm9vbGVhbktleWZyYW1lVHJhY2ssIFByb3BlcnR5TWl4ZXIsIFByb3BlcnR5QmluZGluZywgS2V5ZnJhbWVUcmFjaywgQW5pbWF0aW9uVXRpbHMsIEFuaW1hdGlvbk9iamVjdEdyb3VwLCBBbmltYXRpb25NaXhlciwgQW5pbWF0aW9uQ2xpcCwgVW5pZm9ybSwgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksIEJ1ZmZlckdlb21ldHJ5LCBHZW9tZXRyeSwgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUsIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLCBJbnRlcmxlYXZlZEJ1ZmZlciwgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLCBGYWNlMywgT2JqZWN0M0QsIFJheWNhc3RlciwgTGF5ZXJzLCBFdmVudERpc3BhdGNoZXIsIENsb2NrLCBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsIExpbmVhckludGVycG9sYW50LCBEaXNjcmV0ZUludGVycG9sYW50LCBDdWJpY0ludGVycG9sYW50LCBJbnRlcnBvbGFudCwgVHJpYW5nbGUsIF9NYXRoIGFzIE1hdGgsIFNwaGVyaWNhbCwgQ3lsaW5kcmljYWwsIFBsYW5lLCBGcnVzdHVtLCBTcGhlcmUsIFJheSwgTWF0cml4NCwgTWF0cml4MywgQm94MywgQm94MiwgTGluZTMsIEV1bGVyLCBWZWN0b3I0LCBWZWN0b3IzLCBWZWN0b3IyLCBRdWF0ZXJuaW9uLCBDb2xvciwgSW1tZWRpYXRlUmVuZGVyT2JqZWN0LCBWZXJ0ZXhOb3JtYWxzSGVscGVyLCBTcG90TGlnaHRIZWxwZXIsIFNrZWxldG9uSGVscGVyLCBQb2ludExpZ2h0SGVscGVyLCBSZWN0QXJlYUxpZ2h0SGVscGVyLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXIsIEdyaWRIZWxwZXIsIFBvbGFyR3JpZEhlbHBlciwgRmFjZU5vcm1hbHNIZWxwZXIsIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIsIENhbWVyYUhlbHBlciwgQm94SGVscGVyLCBCb3gzSGVscGVyLCBQbGFuZUhlbHBlciwgQXJyb3dIZWxwZXIsIEF4ZXNIZWxwZXIsIFNoYXBlLCBQYXRoLCBTaGFwZVBhdGgsIEZvbnQsIEN1cnZlUGF0aCwgQ3VydmUsIFNoYXBlVXRpbHMsIFdlYkdMVXRpbHMsIFdpcmVmcmFtZUdlb21ldHJ5LCBQYXJhbWV0cmljR2VvbWV0cnksIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwgVGV0cmFoZWRyb25HZW9tZXRyeSwgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSwgT2N0YWhlZHJvbkdlb21ldHJ5LCBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksIEljb3NhaGVkcm9uR2VvbWV0cnksIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksIERvZGVjYWhlZHJvbkdlb21ldHJ5LCBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSwgUG9seWhlZHJvbkdlb21ldHJ5LCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksIFR1YmVHZW9tZXRyeSwgVHViZUJ1ZmZlckdlb21ldHJ5LCBUb3J1c0tub3RHZW9tZXRyeSwgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksIFRvcnVzR2VvbWV0cnksIFRvcnVzQnVmZmVyR2VvbWV0cnksIFRleHRHZW9tZXRyeSwgVGV4dEJ1ZmZlckdlb21ldHJ5LCBTcGhlcmVHZW9tZXRyeSwgU3BoZXJlQnVmZmVyR2VvbWV0cnksIFJpbmdHZW9tZXRyeSwgUmluZ0J1ZmZlckdlb21ldHJ5LCBQbGFuZUdlb21ldHJ5LCBQbGFuZUJ1ZmZlckdlb21ldHJ5LCBMYXRoZUdlb21ldHJ5LCBMYXRoZUJ1ZmZlckdlb21ldHJ5LCBTaGFwZUdlb21ldHJ5LCBTaGFwZUJ1ZmZlckdlb21ldHJ5LCBFeHRydWRlR2VvbWV0cnksIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwgRWRnZXNHZW9tZXRyeSwgQ29uZUdlb21ldHJ5LCBDb25lQnVmZmVyR2VvbWV0cnksIEN5bGluZGVyR2VvbWV0cnksIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksIENpcmNsZUdlb21ldHJ5LCBDaXJjbGVCdWZmZXJHZW9tZXRyeSwgQm94R2VvbWV0cnksIEJveEJ1ZmZlckdlb21ldHJ5LCBTaGFkb3dNYXRlcmlhbCwgU3ByaXRlTWF0ZXJpYWwsIFJhd1NoYWRlck1hdGVyaWFsLCBTaGFkZXJNYXRlcmlhbCwgUG9pbnRzTWF0ZXJpYWwsIE1lc2hQaHlzaWNhbE1hdGVyaWFsLCBNZXNoU3RhbmRhcmRNYXRlcmlhbCwgTWVzaFBob25nTWF0ZXJpYWwsIE1lc2hUb29uTWF0ZXJpYWwsIE1lc2hOb3JtYWxNYXRlcmlhbCwgTWVzaExhbWJlcnRNYXRlcmlhbCwgTWVzaERlcHRoTWF0ZXJpYWwsIE1lc2hEaXN0YW5jZU1hdGVyaWFsLCBNZXNoQmFzaWNNYXRlcmlhbCwgTGluZURhc2hlZE1hdGVyaWFsLCBMaW5lQmFzaWNNYXRlcmlhbCwgTWF0ZXJpYWwsIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgSW50MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgSW50MTZCdWZmZXJBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSwgVWludDhCdWZmZXJBdHRyaWJ1dGUsIEludDhCdWZmZXJBdHRyaWJ1dGUsIEJ1ZmZlckF0dHJpYnV0ZSwgQXJjQ3VydmUsIENhdG11bGxSb21DdXJ2ZTMsIEN1YmljQmV6aWVyQ3VydmUsIEN1YmljQmV6aWVyQ3VydmUzLCBFbGxpcHNlQ3VydmUsIExpbmVDdXJ2ZSwgTGluZUN1cnZlMywgUXVhZHJhdGljQmV6aWVyQ3VydmUsIFF1YWRyYXRpY0JlemllckN1cnZlMywgU3BsaW5lQ3VydmUsIFJFVklTSU9OLCBNT1VTRSwgQ3VsbEZhY2VOb25lLCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIEN1bGxGYWNlRnJvbnRCYWNrLCBGcm9udEZhY2VEaXJlY3Rpb25DVywgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXLCBCYXNpY1NoYWRvd01hcCwgUENGU2hhZG93TWFwLCBQQ0ZTb2Z0U2hhZG93TWFwLCBGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLCBGbGF0U2hhZGluZywgU21vb3RoU2hhZGluZywgTm9Db2xvcnMsIEZhY2VDb2xvcnMsIFZlcnRleENvbG9ycywgTm9CbGVuZGluZywgTm9ybWFsQmxlbmRpbmcsIEFkZGl0aXZlQmxlbmRpbmcsIFN1YnRyYWN0aXZlQmxlbmRpbmcsIE11bHRpcGx5QmxlbmRpbmcsIEN1c3RvbUJsZW5kaW5nLCBBZGRFcXVhdGlvbiwgU3VidHJhY3RFcXVhdGlvbiwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sIE1pbkVxdWF0aW9uLCBNYXhFcXVhdGlvbiwgWmVyb0ZhY3RvciwgT25lRmFjdG9yLCBTcmNDb2xvckZhY3RvciwgT25lTWludXNTcmNDb2xvckZhY3RvciwgU3JjQWxwaGFGYWN0b3IsIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IsIERzdEFscGhhRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLCBEc3RDb2xvckZhY3RvciwgT25lTWludXNEc3RDb2xvckZhY3RvciwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgTmV2ZXJEZXB0aCwgQWx3YXlzRGVwdGgsIExlc3NEZXB0aCwgTGVzc0VxdWFsRGVwdGgsIEVxdWFsRGVwdGgsIEdyZWF0ZXJFcXVhbERlcHRoLCBHcmVhdGVyRGVwdGgsIE5vdEVxdWFsRGVwdGgsIE11bHRpcGx5T3BlcmF0aW9uLCBNaXhPcGVyYXRpb24sIEFkZE9wZXJhdGlvbiwgTm9Ub25lTWFwcGluZywgTGluZWFyVG9uZU1hcHBpbmcsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIFVuY2hhcnRlZDJUb25lTWFwcGluZywgQ2luZW9uVG9uZU1hcHBpbmcsIFVWTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZywgUmVwZWF0V3JhcHBpbmcsIENsYW1wVG9FZGdlV3JhcHBpbmcsIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsIE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLCBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLCBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgVW5zaWduZWRCeXRlVHlwZSwgQnl0ZVR5cGUsIFNob3J0VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIEludFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgRmxvYXRUeXBlLCBIYWxmRmxvYXRUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDU2NVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgQWxwaGFGb3JtYXQsIFJHQkZvcm1hdCwgUkdCQUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgUkdCRUZvcm1hdCwgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCwgUkdCX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9FVEMxX0Zvcm1hdCwgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LCBMb29wT25jZSwgTG9vcFJlcGVhdCwgTG9vcFBpbmdQb25nLCBJbnRlcnBvbGF0ZURpc2NyZXRlLCBJbnRlcnBvbGF0ZUxpbmVhciwgSW50ZXJwb2xhdGVTbW9vdGgsIFplcm9DdXJ2YXR1cmVFbmRpbmcsIFplcm9TbG9wZUVuZGluZywgV3JhcEFyb3VuZEVuZGluZywgVHJpYW5nbGVzRHJhd01vZGUsIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSwgVHJpYW5nbGVGYW5EcmF3TW9kZSwgTGluZWFyRW5jb2RpbmcsIHNSR0JFbmNvZGluZywgR2FtbWFFbmNvZGluZywgUkdCRUVuY29kaW5nLCBMb2dMdXZFbmNvZGluZywgUkdCTTdFbmNvZGluZywgUkdCTTE2RW5jb2RpbmcsIFJHQkRFbmNvZGluZywgQmFzaWNEZXB0aFBhY2tpbmcsIFJHQkFEZXB0aFBhY2tpbmcsIEJveEdlb21ldHJ5IGFzIEN1YmVHZW9tZXRyeSwgRmFjZTQsIExpbmVTdHJpcCwgTGluZVBpZWNlcywgTWVzaEZhY2VNYXRlcmlhbCwgTXVsdGlNYXRlcmlhbCwgUG9pbnRDbG91ZCwgUGFydGljbGUsIFBhcnRpY2xlU3lzdGVtLCBQb2ludENsb3VkTWF0ZXJpYWwsIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCwgUGFydGljbGVTeXN0ZW1NYXRlcmlhbCwgVmVydGV4LCBEeW5hbWljQnVmZmVyQXR0cmlidXRlLCBJbnQ4QXR0cmlidXRlLCBVaW50OEF0dHJpYnV0ZSwgVWludDhDbGFtcGVkQXR0cmlidXRlLCBJbnQxNkF0dHJpYnV0ZSwgVWludDE2QXR0cmlidXRlLCBJbnQzMkF0dHJpYnV0ZSwgVWludDMyQXR0cmlidXRlLCBGbG9hdDMyQXR0cmlidXRlLCBGbG9hdDY0QXR0cmlidXRlLCBDbG9zZWRTcGxpbmVDdXJ2ZTMsIFNwbGluZUN1cnZlMywgU3BsaW5lLCBBeGlzSGVscGVyLCBCb3VuZGluZ0JveEhlbHBlciwgRWRnZXNIZWxwZXIsIFdpcmVmcmFtZUhlbHBlciwgWEhSTG9hZGVyLCBCaW5hcnlUZXh0dXJlTG9hZGVyLCBHZW9tZXRyeVV0aWxzLCBJbWFnZVV0aWxzLCBQcm9qZWN0b3IsIENhbnZhc1JlbmRlcmVyLCBTY2VuZVV0aWxzLCBMZW5zRmxhcmUgfTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gRXZlbnRzKHRhcmdldCl7XG4gIHZhciBldmVudHMgPSB7fSwgZW1wdHkgPSBbXTtcbiAgdGFyZ2V0ID0gdGFyZ2V0IHx8IHRoaXNcbiAgLyoqXG4gICAqICBPbjogbGlzdGVuIHRvIGV2ZW50c1xuICAgKi9cbiAgdGFyZ2V0Lm9uID0gZnVuY3Rpb24odHlwZSwgZnVuYywgY3R4KXtcbiAgICAoZXZlbnRzW3R5cGVdID0gZXZlbnRzW3R5cGVdIHx8IFtdKS5wdXNoKFtmdW5jLCBjdHhdKVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKipcbiAgICogIE9mZjogc3RvcCBsaXN0ZW5pbmcgdG8gZXZlbnQgLyBzcGVjaWZpYyBjYWxsYmFja1xuICAgKi9cbiAgdGFyZ2V0Lm9mZiA9IGZ1bmN0aW9uKHR5cGUsIGZ1bmMpe1xuICAgIHR5cGUgfHwgKGV2ZW50cyA9IHt9KVxuICAgIHZhciBsaXN0ID0gZXZlbnRzW3R5cGVdIHx8IGVtcHR5LFxuICAgICAgICBpID0gbGlzdC5sZW5ndGggPSBmdW5jID8gbGlzdC5sZW5ndGggOiAwO1xuICAgIHdoaWxlKGktLSkgZnVuYyA9PSBsaXN0W2ldWzBdICYmIGxpc3Quc3BsaWNlKGksMSlcbiAgICByZXR1cm4gdGFyZ2V0XG4gIH1cbiAgLyoqIFxuICAgKiBFbWl0OiBzZW5kIGV2ZW50LCBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWRcbiAgICovXG4gIHRhcmdldC5lbWl0ID0gZnVuY3Rpb24odHlwZSl7XG4gICAgdmFyIGUgPSBldmVudHNbdHlwZV0gfHwgZW1wdHksIGxpc3QgPSBlLmxlbmd0aCA+IDAgPyBlLnNsaWNlKDAsIGUubGVuZ3RoKSA6IGUsIGk9MCwgajtcbiAgICB3aGlsZShqPWxpc3RbaSsrXSkgalswXS5hcHBseShqWzFdLCBlbXB0eS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG4gICAgcmV0dXJuIHRhcmdldFxuICB9O1xufTsiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgY3JlYXRlOiByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykgfSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiAkT2JqZWN0LmNyZWF0ZShQLCBEKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZVwiKTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUWVBFKSB7XG4gIGlmICghaXNPYmplY3QoaXQpIHx8IGl0Ll90ICE9PSBUWVBFKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuL19tZXRhJykuZmFzdEtleTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBTSVpFID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gIHZhciBlbnRyeTtcbiAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvciAoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgaWYgKGVudHJ5LmsgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5fdCA9IE5BTUU7ICAgICAgICAgLy8gY29sbGVjdGlvbiB0eXBlXG4gICAgICB0aGF0Ll9pID0gY3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgZm9yICh2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnApIGVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uO1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZiAodGhhdC5fZiA9PSBlbnRyeSkgdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYgKHRoYXQuX2wgPT0gZW50cnkpIHRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2YpIHtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUodGhpcywgTkFNRSlbU0laRV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgIHZhciBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmICghdGhhdC5fZikgdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYgKHByZXYpIHByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIE5BTUUsIElTX01BUCkge1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHRoaXMuX3QgPSB2YWxpZGF0ZShpdGVyYXRlZCwgTkFNRSk7IC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIga2luZCA9IHRoYXQuX2s7XG4gICAgICB2YXIgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbCkpIHtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG4iLCIvLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuIiwiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBlYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgaWYgKCFERVNDUklQVE9SUyB8fCB0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRhcmdldCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FLCAnX2MnKTtcbiAgICAgIHRhcmdldC5fYyA9IG5ldyBCYXNlKCk7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0YXJnZXRbQURERVJdLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIGVhY2goJ2FkZCxjbGVhcixkZWxldGUsZm9yRWFjaCxnZXQsaGFzLHNldCxrZXlzLHZhbHVlcyxlbnRyaWVzLHRvSlNPTicuc3BsaXQoJywnKSwgZnVuY3Rpb24gKEtFWSkge1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09ICdhZGQnIHx8IEtFWSA9PSAnc2V0JztcbiAgICAgIGlmIChLRVkgaW4gcHJvdG8gJiYgIShJU19XRUFLICYmIEtFWSA9PSAnY2xlYXInKSkgaGlkZShDLnByb3RvdHlwZSwgS0VZLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBhbkluc3RhbmNlKHRoaXMsIEMsIEtFWSk7XG4gICAgICAgIGlmICghSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkpIHJldHVybiBLRVkgPT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NbS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgSVNfV0VBSyB8fCBkUChDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiwgTyk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKEMsIE5BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIEM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICBpZiAoY2xhc3NvZih0aGlzKSAhPSBOQU1FKSB0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBBID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSBBW2xlbmd0aF0gPSBhcmd1bWVudHNbbGVuZ3RoXTtcbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdNYXAnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgZnJvbTogZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXTtcbiAgICB2YXIgbWFwcGluZywgQSwgbiwgY2I7XG4gICAgYUZ1bmN0aW9uKHRoaXMpO1xuICAgIG1hcHBpbmcgPSBtYXBGbiAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYXBwaW5nKSBhRnVuY3Rpb24obWFwRm4pO1xuICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgICBBID0gW107XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIG4gPSAwO1xuICAgICAgY2IgPSBjdHgobWFwRm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbiAobmV4dEl0ZW0pIHtcbiAgICAgICAgQS5wdXNoKGNiKG5leHRJdGVtLCBuKyspKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBBLnB1c2gsIEEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnTWFwJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5tYXAudG8tanNvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcubWFwLm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5tYXAuZnJvbScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuTWFwO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL21hcFwiKTsiLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEYsIGxlbiwgYXJncykge1xuICBpZiAoIShsZW4gaW4gZmFjdG9yaWVzKSkge1xuICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKykgbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgZm4gPSBhRnVuY3Rpb24odGhpcyk7XG4gIHZhciBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xuICBpZiAoaXNPYmplY3QoZm4ucHJvdG90eXBlKSkgYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuIiwiLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vX2JpbmQnKTtcbnZhciByQ29uc3RydWN0ID0gKHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3QgfHwge30pLmNvbnN0cnVjdDtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzIGFuZCBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG52YXIgTkVXX1RBUkdFVF9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEockNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIFtdLCBGKSBpbnN0YW5jZW9mIEYpO1xufSk7XG52YXIgQVJHU19CVUcgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTkVXX1RBUkdFVF9CVUcgfHwgQVJHU19CVUcpLCAnUmVmbGVjdCcsIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qICwgbmV3VGFyZ2V0ICovKSB7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgYW5PYmplY3QoYXJncyk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYgKEFSR1NfQlVHICYmICFORVdfVEFSR0VUX0JVRykgcmV0dXJuIHJDb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpO1xuICAgIGlmIChUYXJnZXQgPT0gbmV3VGFyZ2V0KSB7XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIG9wdGltaXphdGlvbiBmb3IgMC00IGFyZ3VtZW50c1xuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0KCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKSgpO1xuICAgIH1cbiAgICAvLyB3aXRoIGFsdGVyZWQgbmV3VGFyZ2V0LCBub3Qgc3VwcG9ydCBidWlsdC1pbiBjb25zdHJ1Y3RvcnNcbiAgICB2YXIgcHJvdG8gPSBuZXdUYXJnZXQucHJvdG90eXBlO1xuICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZShpc09iamVjdChwcm90bykgPyBwcm90byA6IE9iamVjdC5wcm90b3R5cGUpO1xuICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpO1xuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogaW5zdGFuY2U7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlJlZmxlY3QuY29uc3RydWN0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3JlZmxlY3QvY29uc3RydWN0XCIpOyIsInZhciBfUmVmbGVjdCRjb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9yZWZsZWN0L2NvbnN0cnVjdFwiKTtcblxudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgX1JlZmxlY3QkY29uc3RydWN0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gX1JlZmxlY3QkY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBQYXJlbnQuYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIHNldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3Q7IiwidmFyIF9PYmplY3QkY3JlYXRlID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2NyZWF0ZVwiKTtcblxudmFyIF9NYXAgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9tYXBcIik7XG5cbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL2dldFByb3RvdHlwZU9mXCIpO1xuXG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZlwiKTtcblxudmFyIGNvbnN0cnVjdCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdFwiKTtcblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIF9NYXAgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBfTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHt9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IF9PYmplY3QkY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNldFByb3RvdHlwZU9mKFdyYXBwZXIsIHNldFByb3RvdHlwZU9mKGZ1bmN0aW9uIFN1cGVyKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBnZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfSwgQ2xhc3MpKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3dyYXBOYXRpdmVTdXBlcjsiLCJleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoY2xhc3NJbnN0YW5jZSwgbWVzc2FnZSwgY29tcG9uZW50KSB7XG4gICAgc3VwZXIoYEAke2NsYXNzSW5zdGFuY2V9OiAke21lc3NhZ2V9YCk7XG5cbiAgICBjb25zdCBzdGFja0FycmF5ID0gdGhpcy5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgc3RhY2tBcnJheS5zcGxpY2UoMSwgMik7XG5cbiAgICB0aGlzLnN0YWNrID0gc3RhY2tBcnJheS5qb2luKCdcXG4nKTtcblxuICAgIGlmIChjb25zb2xlKSBjb25zb2xlLmVycm9yKCdDb21wb25lbnQ6JywgY29tcG9uZW50KTtcblxuICAgIHRoaXMubmFtZSA9ICdDb21wb3NpdGlvbkVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihjbGFzc0luc3RhbmNlLCBtZXNzYWdlLCBhY3RpdmVNb2R1bGUsIGRlcGVuZGVuY3lNb2R1bGUgPSBmYWxzZSkge1xuICAgIHN1cGVyKGBAJHtjbGFzc0luc3RhbmNlfTogJHttZXNzYWdlfWApO1xuXG4gICAgY29uc3Qgc3RhY2tBcnJheSA9IHRoaXMuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgIHN0YWNrQXJyYXkuc3BsaWNlKDEsIDIpO1xuXG4gICAgdGhpcy5zdGFjayA9IHN0YWNrQXJyYXkuam9pbignXFxuJyk7XG5cbiAgICBpZiAoY29uc29sZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuICAgIGlmIChjb25zb2xlICYmIGRlcGVuZGVuY3lNb2R1bGUpIGNvbnNvbGUuZXJyb3IoJ0RlcGVuZGVuY3kgcHVibGlzaGVkIGJ5IG1vZHVsZTonLCBkZXBlbmRlbmN5TW9kdWxlKTtcblxuICAgIHRoaXMubmFtZSA9ICdEZXBlbmRlbmN5RXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGNsYXNzSW5zdGFuY2UsIG1lc3NhZ2UsIGNvbXBvbmVudCwgYWN0aXZlTW9kdWxlID0gZmFsc2UpIHtcbiAgICBzdXBlcihgQCR7Y2xhc3NJbnN0YW5jZX06ICR7bWVzc2FnZX1gKTtcblxuICAgIGNvbnN0IHN0YWNrQXJyYXkgPSB0aGlzLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICBzdGFja0FycmF5LnNwbGljZSgxLCAyKTtcblxuICAgIHRoaXMuc3RhY2sgPSBzdGFja0FycmF5LmpvaW4oJ1xcbicpO1xuXG4gICAgaWYgKGNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ0NvbXBvbmVudDonLCBjb21wb25lbnQpO1xuICAgIGlmIChjb25zb2xlICYmIGFjdGl2ZU1vZHVsZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuXG4gICAgdGhpcy5uYW1lID0gJ01hbmFnZXJFcnJvcic7XG4gIH1cbn1cbiIsImltcG9ydCB7UkVWSVNJT059IGZyb20gJ3RocmVlJztcbmltcG9ydCBFdmVudHMgZnJvbSAnbWluaXZlbnRzJztcbmltcG9ydCB7TWFuYWdlckVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIENoZWNrIGZvciBUaHJlZS5qc1xuY29uc3Qgd2FybkRlcHMgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcignV2hpdGVzdG9ybUpTIEZyYW1ld29yayByZXF1IGlyZXMgVGhyZWUuanMgcjkyLiBodHRwczovL3RocmVlanMub3JnLycpO1xufTtcblxudHJ5IHtcbiAgaWYgKCFSRVZJU0lPTikgd2FybkRlcHMoKTtcbn0gY2F0Y2ggKGVycikge1xuICB3YXJuRGVwcygpO1xufVxuXG4vKipcbiAqIEBjbGFzcyBNb2R1bGVTeXN0ZW1cbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gIFByb3ZpZGVzIEFQSSBmb3IgY2xhc3NlcyB0aGF0IHdpbGwgdXNlIE1vZHVsZXMuPGJyLz5cbiAqIFRoaXMgY2xhc3MgaW5jbHVkZXMgYmFzaWMgZXZlbnQgc3lzdGVtIHdpdGggdGhvc2Ugc3VwcG9ydGVkIG1ldGhvZHM6XG4gKiA8cHJlPi5vbigpPC9wcmU+PHByZT4ub2ZmKCk8L3ByZT48cHJlPi5lbWl0KCk8L3ByZT5cbiAqIEBleHRlbmRzIEV2ZW50c1xuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2R1bGVTeXN0ZW0gZXh0ZW5kcyBFdmVudHMge1xuICAvLyBJTlRFR1JBVElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGludGVncmF0ZU1vZHVsZXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBhcHBsaWVzIGFsbCBtb2R1bGVzIGZyb20gLm1vZHVsZXMgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtzb3VyY2VdIElmIHNvdXJjZSAoc2hvdWxkIGJlIGEgY29tcG9uZW50KSBpcyBwcm92aWRlZCwgd2lsbCByZXBsYWNlIC5tb2R1bGVzIHdpdGggc291cmNlJ3Mgb25lIGJlZm9yZSBleGVjdXRpbmcgbW9kdWxlcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgaW50ZWdyYXRlTW9kdWxlcyhzb3VyY2UpIHtcbiAgICBpZiAoIXRoaXMubW9kdWxlcyAmJiAhc291cmNlKSByZXR1cm47XG4gICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UubW9kdWxlcykgdGhpcy5tb2R1bGVzID0gc291cmNlLm1vZHVsZXMuc2xpY2UoMCk7XG5cbiAgICBpZiAodGhpcy5tb2R1bGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbWF4ID0gdGhpcy5tb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKVxuICAgICAgICB0aGlzLmFwcGx5TW9kdWxlKHRoaXMubW9kdWxlc1tpXSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UpIHRoaXMuYXBwbHlCcmlkZ2Uoe29uQ29weTogc291cmNlfSk7XG4gIH1cblxuICAvLyBBUFBMWUlORyBNT0RVTEUgKC4uLmFuZCBhIFwiYnJpZGdlXCIgZm9yIG1vZHVsZSlcblxuICAvKipcbiAgICogQG1ldGhvZCBhcHBseUJyaWRnZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE1ha2VzIGNvbXBvbmVudC1zcGVjaWZpYyBBUEkgdG8gd29yayB3aXRoIG1vZHVsZXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBicmlkZ2VNYXBcbiAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIG9iamVjdCB3aXRoIG1vZGlmaWVkIHZhbHVlcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlCcmlkZ2UoYnJpZGdlTWFwID0ge30pIHtcbiAgICBjb25zdCB7bW9kdWxlc30gPSB0aGlzO1xuICAgIGlmICghbW9kdWxlcykgcmV0dXJuIGJyaWRnZU1hcDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBicmlkZ2VNYXApIHtcbiAgICAgICAgaWYgKGJyaWRnZU1hcFtrZXldKSB7XG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gbW9kdWxlc1tpXTtcblxuICAgICAgICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLmJyaWRnZSAmJiBtb2R1bGUuYnJpZGdlW2tleV0pXG4gICAgICAgICAgICBicmlkZ2VNYXBba2V5XSA9IG1vZHVsZS5icmlkZ2Vba2V5XS5hcHBseSh0aGlzLCBbYnJpZGdlTWFwW2tleV0sIG1vZHVsZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJyaWRnZU1hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGFwcGx5Q29tbWFuZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIC5hcHBseUNvbW1hbmQgcnVucyBhIG1ldGhvZCBjYWxsZWQgYG5hbWVgIG9uIGFsbCBtb2R1bGVzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYj0oZnVuYywgbW9kdWxlU2NvcGUpID0+IGZ1bmMuYXBwbHkodGhpcywgW21vZHVsZVNjb3BlXSldIEhvdyB0aGUgZnVuY3Rpb24gaXMgd3JhcHBlZC9cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlDb21tYW5kKG5hbWUsIGNiID0gKGZ1bmMsIG1vZHVsZVNjb3BlKSA9PiBmdW5jLmFwcGx5KHRoaXMsIFttb2R1bGVTY29wZV0pKSB7XG4gICAgY29uc3Qge21vZHVsZXN9ID0gdGhpcztcbiAgICBpZiAoIW1vZHVsZXMpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgICAgaWYgKG5hbWUgaW4gbW9kdWxlKSBjYihtb2R1bGVbbmFtZV0sIG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlNb2R1bGVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiAuYXBwbHlNb2R1bGUgaXMgYWxzbyB1c2VkIGluIC5pbnRlZ3JhdGVNb2R1bGVzKCkgZnVuY3Rpb24uXG4gICAqIEl0IGRvZXMgZXhhY3RseSB3aGF0IGl0cyBuYW1lIHNheXMgKGFwcGxpZXMgbW9kdWxlIHRvIGNvbXBvbmVudCBvciBhcHApLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcHVzaD10cnVlXVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIGFwcGxpZWQuXG4gICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlNb2R1bGUobW9kdWxlLCBwdXNoID0gdHJ1ZSkge1xuICAgIGlmICghbW9kdWxlKSByZXR1cm47XG4gICAgaWYgKHB1c2ggJiYgdGhpcy5tb2R1bGVzKSB0aGlzLm1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgIGVsc2UgaWYgKHB1c2gpIHRoaXMubW9kdWxlcyA9IFttb2R1bGVdO1xuXG4gICAgaWYgKHRoaXMubWFuYWdlcikgdGhpcy5tYW5hZ2VyLmFjdGl2ZShtb2R1bGUpO1xuXG4gICAgaWYgKG1vZHVsZS5tYW5hZ2VyICYmIHRoaXMubWFuYWdlcikgbW9kdWxlLm1hbmFnZXIodGhpcy5tYW5hZ2VyKTtcbiAgICBlbHNlIGlmIChtb2R1bGUubWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IE1hbmFnZXJFcnJvcihcbiAgICAgICAgJ0NvbXBvbmVudCcsXG4gICAgICAgIGBNb2R1bGUgcmVxdWlyZXMgTW9kdWxlTWFuYWdlciB0aGF0IGlzIHR1cm5lZCBvZmYgZm9yIHRoaXMgY29tcG9uZW50YCxcbiAgICAgICAgdGhpcywgbW9kdWxlXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtb2R1bGUuaW50ZWdyYXRlKSBtb2R1bGUuaW50ZWdyYXRlLmJpbmQodGhpcykobW9kdWxlKTtcblxuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlc1xuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2VzIG9mIGFsbCBtb2R1bGVzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICovXG4gIGRpc3Bvc2VNb2R1bGVzKCkge1xuICAgIHdoaWxlICh0aGlzLm1vZHVsZXMubGVuZ3RoKVxuICAgICAgdGhpcy5kaXNwb3NlTW9kdWxlKHRoaXMubW9kdWxlc1swXSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gRGlzcG9zZXMgb2YgdGhlIGdpdmVuIG1vZHVsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gZGlzcG9zZVxuICAgKiBAcmV0dXJuIHtNb2R1bGV9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICovXG4gIGRpc3Bvc2VNb2R1bGUobW9kdWxlKSB7XG4gICAgaWYgKCFtb2R1bGUpIHJldHVybjtcblxuICAgIHRoaXMubW9kdWxlcy5zcGxpY2UodGhpcy5tb2R1bGVzLmluZGV4T2YobW9kdWxlKSwgMSk7XG5cbiAgICBpZiAobW9kdWxlLmRpc3Bvc2UpIG1vZHVsZS5kaXNwb3NlLmJpbmQodGhpcykobW9kdWxlKTtcblxuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvLyBQSVBFRCBNRVRIT0RcblxuICAvKipcbiAgICogQG1ldGhvZCBtb2R1bGVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBwaXBlZCB2ZXJzaW9uIG9mIC5hcHBseU1vZHVsZSgpLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICogQHJldHVybiB7dGhpc30gcmV0dXJucyB0aGlzIC0gYXBwL2NvbXBvbmVudFxuICAgKiBAdGhyb3dzIHtNYW5hZ2VyRXJyb3J9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICogQGV4YW1wbGUgPGNhcHRpb24+UGlwZWQgbW9kdWxlczwvY2FwdGlvbj5cbiAgICogY29tcG9uZW50XG4gICAqICAgLm1vZHVsZShuZXcgTW9kdWxlMSgpKVxuICAgKiAgIC5tb2R1bGUobmV3IE1vZHVsZTIoKSlcbiAgICogICAubW9kdWxlKG5ldyBNb2R1bGUzKCkpXG4gICAqL1xuICBtb2R1bGUobW9kdWxlKSB7XG4gICAgdGhpcy5hcHBseU1vZHVsZShtb2R1bGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzOyIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldCA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlckZuID0gZ2V0KGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBhbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3JcIik7IiwidmFyIF9nZXRJdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2dldC1pdGVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBfZ2V0SXRlcmF0b3IoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0OyIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdFwiKTtcblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdFwiKTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKFN5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2wub2JzZXJ2YWJsZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRTeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmltcG9ydCBwb255ZmlsbCBmcm9tICcuL3BvbnlmaWxsLmpzJztcblxudmFyIHJvb3Q7XG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9IHBvbnlmaWxsKHJvb3QpO1xuZXhwb3J0IGRlZmF1bHQgcmVzdWx0O1xuIiwiaW1wb3J0ICQkb2JzZXJ2YWJsZSBmcm9tICdzeW1ib2wtb2JzZXJ2YWJsZSc7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6ICdAQHJlZHV4L0lOSVQnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyksXG4gIFJFUExBQ0U6ICdAQHJlZHV4L1JFUExBQ0UnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJylcbn07XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAoKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iaikpICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgcHJvdG8gPSBvYmo7XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiAnICsgJ1Bhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgJyArICdjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpLXJlZmVyZW5jZS9zdG9yZSNzdWJzY3JpYmUobGlzdGVuZXIpIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG5cbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGktcmVmZXJlbmNlL3N0b3JlI3N1YnNjcmliZShsaXN0ZW5lcikgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gJyArICdVc2UgY3VzdG9tIG1pZGRsZXdhcmUgZm9yIGFzeW5jIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiAnICsgJ0hhdmUgeW91IG1pc3NwZWxsZWQgYSBjb25zdGFudD8nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHJlZHVjZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0b3JlIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBhcHAgaW1wbGVtZW50cyBjb2RlIHNwbGl0dGluZyBhbmQgeW91IHdhbnQgdG9cbiAgICogbG9hZCBzb21lIG9mIHRoZSByZWR1Y2VycyBkeW5hbWljYWxseS4gWW91IG1pZ2h0IGFsc28gbmVlZCB0aGlzIGlmIHlvdVxuICAgKiBpbXBsZW1lbnQgYSBob3QgcmVsb2FkaW5nIG1lY2hhbmlzbSBmb3IgUmVkdXguXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZWR1Y2VyIFRoZSByZWR1Y2VyIGZvciB0aGUgc3RvcmUgdG8gdXNlIGluc3RlYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5SRVBMQUNFIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAoKHR5cGVvZiBvYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JzZXJ2ZXIpKSAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4geyB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmUgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmWyQkb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9XG5cbiAgLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG4gIGRpc3BhdGNoKHsgdHlwZTogQWN0aW9uVHlwZXMuSU5JVCB9KTtcblxuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuXG4vKipcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuZnVuY3Rpb24gZ2V0VW5kZWZpbmVkU3RhdGVFcnJvck1lc3NhZ2Uoa2V5LCBhY3Rpb24pIHtcbiAgdmFyIGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gIHZhciBhY3Rpb25EZXNjcmlwdGlvbiA9IGFjdGlvblR5cGUgJiYgJ2FjdGlvbiBcIicgKyBTdHJpbmcoYWN0aW9uVHlwZSkgKyAnXCInIHx8ICdhbiBhY3Rpb24nO1xuXG4gIHJldHVybiAnR2l2ZW4gJyArIGFjdGlvbkRlc2NyaXB0aW9uICsgJywgcmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiAnICsgJ1RvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gJyArICdJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC4nO1xufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gJ1RoZSAnICsgYXJndW1lbnROYW1lICsgJyBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJyArIHt9LnRvU3RyaW5nLmNhbGwoaW5wdXRTdGF0ZSkubWF0Y2goL1xccyhbYS16fEEtWl0rKS8pWzFdICsgJ1wiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nICcgKyAoJ2tleXM6IFwiJyArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgJ1wiJyk7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuXG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuUkVQTEFDRSkgcmV0dXJuO1xuXG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuICdVbmV4cGVjdGVkICcgKyAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/ICdrZXlzJyA6ICdrZXknKSArICcgJyArICgnXCInICsgdW5leHBlY3RlZEtleXMuam9pbignXCIsIFwiJykgKyAnXCIgZm91bmQgaW4gJyArIGFyZ3VtZW50TmFtZSArICcuICcpICsgJ0V4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogJyArICgnXCInICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyAnXCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IEFjdGlvblR5cGVzLklOSVQgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gJyArICdJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgJyArICdleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5ICcgKyAnbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvblxcJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCAnICsgJ3lvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSAnQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTl8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiB0eXBlIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIFwiJyArIGtleSArICdcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiAnICsgKCdEb25cXCd0IHRyeSB0byBoYW5kbGUgJyArIEFjdGlvblR5cGVzLklOSVQgKyAnIG9yIG90aGVyIGFjdGlvbnMgaW4gXCJyZWR1eC8qXCIgJykgKyAnbmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgJyArICdjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCAnICsgJ2luIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSAnICsgJ2FjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCwgYnV0IGNhbiBiZSBudWxsLicpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGZpbmFsUmVkdWNlcnMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoJ05vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIicgKyBrZXkgKyAnXCInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHZhciBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHZvaWQgMDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGUgPSB7fTtcbiAgfVxuXG4gIHZhciBzaGFwZUFzc2VydGlvbkVycm9yID0gdm9pZCAwO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKCkge1xuICAgIHZhciBzdGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50c1sxXTtcblxuICAgIGlmIChzaGFwZUFzc2VydGlvbkVycm9yKSB7XG4gICAgICB0aHJvdyBzaGFwZUFzc2VydGlvbkVycm9yO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IGZpbmFsUmVkdWNlcktleXNbX2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW19rZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtfa2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IGdldFVuZGVmaW5lZFN0YXRlRXJyb3JNZXNzYWdlKF9rZXksIGFjdGlvbik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBmdW5jdGlvbiBpbiByZXR1cm4uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IGFjdGlvbkNyZWF0b3JzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvblxuICogY3JlYXRvciBmdW5jdGlvbnMuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzYFxuICogc3ludGF4LiBZb3UgbWF5IGFsc28gcGFzcyBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwYXRjaCBUaGUgYGRpc3BhdGNoYCBmdW5jdGlvbiBhdmFpbGFibGUgb24geW91ciBSZWR1eFxuICogc3RvcmUuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gVGhlIG9iamVjdCBtaW1pY2tpbmcgdGhlIG9yaWdpbmFsIG9iamVjdCwgYnV0IHdpdGhcbiAqIGV2ZXJ5IGFjdGlvbiBjcmVhdG9yIHdyYXBwZWQgaW50byB0aGUgYGRpc3BhdGNoYCBjYWxsLiBJZiB5b3UgcGFzc2VkIGFcbiAqIGZ1bmN0aW9uIGFzIGBhY3Rpb25DcmVhdG9yc2AsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHNvIGJlIGEgc2luZ2xlXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAoKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoYWN0aW9uQ3JlYXRvcnMpKSAhPT0gJ29iamVjdCcgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCAnICsgKGFjdGlvbkNyZWF0b3JzID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihhY3Rpb25DcmVhdG9ycykpICsgJy4gJyArICdEaWQgeW91IHdyaXRlIFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cIiBpbnN0ZWFkIG9mIFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiPycpO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhY3Rpb25DcmVhdG9ycyk7XG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cblxuZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhKGIuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RvcmUgZW5oYW5jZXIgdGhhdCBhcHBsaWVzIG1pZGRsZXdhcmUgdG8gdGhlIGRpc3BhdGNoIG1ldGhvZFxuICogb2YgdGhlIFJlZHV4IHN0b3JlLiBUaGlzIGlzIGhhbmR5IGZvciBhIHZhcmlldHkgb2YgdGFza3MsIHN1Y2ggYXMgZXhwcmVzc2luZ1xuICogYXN5bmNocm9ub3VzIGFjdGlvbnMgaW4gYSBjb25jaXNlIG1hbm5lciwgb3IgbG9nZ2luZyBldmVyeSBhY3Rpb24gcGF5bG9hZC5cbiAqXG4gKiBTZWUgYHJlZHV4LXRodW5rYCBwYWNrYWdlIGFzIGFuIGV4YW1wbGUgb2YgdGhlIFJlZHV4IG1pZGRsZXdhcmUuXG4gKlxuICogQmVjYXVzZSBtaWRkbGV3YXJlIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cywgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0XG4gKiBzdG9yZSBlbmhhbmNlciBpbiB0aGUgY29tcG9zaXRpb24gY2hhaW4uXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggbWlkZGxld2FyZSB3aWxsIGJlIGdpdmVuIHRoZSBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIGZ1bmN0aW9uc1xuICogYXMgbmFtZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG1pZGRsZXdhcmVzIFRoZSBtaWRkbGV3YXJlIGNoYWluIHRvIGJlIGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgc3RvcmUgZW5oYW5jZXIgYXBwbHlpbmcgdGhlIG1pZGRsZXdhcmUuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TWlkZGxld2FyZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1pZGRsZXdhcmVzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWlkZGxld2FyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIHZhciBfZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh1bmRlZmluZWQsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RvcmUsIHtcbiAgICAgICAgZGlzcGF0Y2g6IF9kaXNwYXRjaFxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbn1cblxuLypcbiAqIFRoaXMgaXMgYSBkdW1teSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgZnVuY3Rpb24gbmFtZSBoYXMgYmVlbiBhbHRlcmVkIGJ5IG1pbmlmaWNhdGlvbi5cbiAqIElmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBtaW5pZmllZCBhbmQgTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJywgd2FybiB0aGUgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNDcnVzaGVkKCkge31cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGlzQ3J1c2hlZC5uYW1lID09PSAnc3RyaW5nJyAmJiBpc0NydXNoZWQubmFtZSAhPT0gJ2lzQ3J1c2hlZCcpIHtcbiAgd2FybmluZyhcIllvdSBhcmUgY3VycmVudGx5IHVzaW5nIG1pbmlmaWVkIGNvZGUgb3V0c2lkZSBvZiBOT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nLiBcIiArICdUaGlzIG1lYW5zIHRoYXQgeW91IGFyZSBydW5uaW5nIGEgc2xvd2VyIGRldmVsb3BtZW50IGJ1aWxkIG9mIFJlZHV4LiAnICsgJ1lvdSBjYW4gdXNlIGxvb3NlLWVudmlmeSAoaHR0cHM6Ly9naXRodWIuY29tL3plcnRvc2gvbG9vc2UtZW52aWZ5KSBmb3IgYnJvd3NlcmlmeSAnICsgJ29yIERlZmluZVBsdWdpbiBmb3Igd2VicGFjayAoaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDAzMDAzMSkgJyArICd0byBlbnN1cmUgeW91IGhhdmUgdGhlIGNvcnJlY3QgY29kZSBmb3IgeW91ciBwcm9kdWN0aW9uIGJ1aWxkLicpO1xufVxuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgY29tYmluZVJlZHVjZXJzLCBiaW5kQWN0aW9uQ3JlYXRvcnMsIGFwcGx5TWlkZGxld2FyZSwgY29tcG9zZSwgQWN0aW9uVHlwZXMgYXMgX19ET19OT1RfVVNFX19BY3Rpb25UeXBlcyB9O1xuIiwiaW1wb3J0IHtjcmVhdGVTdG9yZX0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHtEZXBlbmRlbmN5RXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBAY2xhc3MgTW9kdWxlTWFuYWdlclxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgaGFuZGxlclxuICogQGRlc2NyaXB0aW9uICBTb2x2ZXMgbW9kdWxlcyBkZXBlbmRlbmNpZXNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY2xhc3MgTW9kdWxlTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKG9iamVjdCkge1xuICAgIHRoaXMuaGFuZGxlciA9IG9iamVjdDtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuXG4gICAgdGhpcy5zdG9yZSA9IGNyZWF0ZVN0b3JlKChzdGF0ZSA9IFt7fSwgJyddLCBhY3Rpb24pID0+IHtcbiAgICAgIHN0YXRlWzBdW2FjdGlvbi5rZXldID0gYWN0aW9uLmRhdGE7XG4gICAgICBzdGF0ZVsxXSA9IGFjdGlvbi5rZXk7XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9KTtcblxuICAgIHRoaXMubW9kdWxlcyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWN0aXZlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyAuY3VycmVudE1vZHVsZSB0byBwcm92aWRlZCBtb2R1bGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIG1vZHVsZSB0byBtYWtlIGN1cnJlbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIGFjdGl2ZShtb2R1bGUpIHtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNldCdzIC5jdXJyZW50TW9kdWxlIHRvIG51bGwuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmaW5lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lIHRoZSBtb2R1bGUgaW4gbWFuYWdlclxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbW9kdWxlIG5hbWVcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIGRlZmluZShuYW1lKSB7XG4gICAgdGhpcy5tb2R1bGVzW25hbWVdID0gdGhpcy5jdXJyZW50TW9kdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXNlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBkZWZpbmVkIG1vZHVsZSBmcm9tIG1hbmFnZXJcbiAgICogQHBhcmFtIG5hbWUgVGhlIG1vZHVsZSBuYW1lXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICB1c2UobmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1vZHVsZXNbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBbiBhbGlhcyBmb3IgLmFkZCgpIDxici8+PGJyLz5cbiAgICogVXNlIHRoaXMgbWV0aG9kIGlmIHlvdSBrbm93IHRoYXQgeW91IHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGRlcGVuZGVuY3kuPGJyLz5cbiAgICogVXNlIGl0IGluIHlvdXIgYXBwLCBidXQgbm90IGluIG1vZHVsZSB0aGF0IHlvdSBwcm92aWRlIHRvIG90aGVyIHBlb3BsZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBkZXBlbmRlbmN5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKi9cbiAgc2V0KGtleSwgZGF0YSkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ0FERCcsXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGRlcGVuZGVuY3kgaW4gc3RvcmUgb2JqZWN0LCBieSBrZXkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKiBAcmV0dXJuIHtPYmplY3R8TW9kdWxlfVxuICAgKiBAdGhyb3dzIHtEZXBlbmRlbmN5RXJyb3J9IGlmIGRlcGVuZGVuY3kgaXMgbm90IGluIHRoZSBzdG9yZVxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5HZXQgdGhlICdoZWxsbycgZGVwZW5kZW5jeTwvY2FwdGlvbj5cbiAgICogbWFuYWdlci5nZXQoJ2hlbGxvJyk7IC8vIC0+IHt3b3JsZDogdHJ1ZX1cbiAgICovXG4gIGdldChrZXkpIHtcbiAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwZW5kZW5jeUVycm9yKFxuICAgICAgICAnTW9kdWxlTWFuYWdlcicsXG4gICAgICAgIGBNb2R1bGUgcmVxdWlyZXMgJyR7a2V5fScgZGVwZW5kZW5jeWAsXG4gICAgICAgIHRoaXMuY3VycmVudE1vZHVsZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoYXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHdoZXRoZXIgbWFuYWdlciBoYXMgYSBkZXBlbmRlbmN5IHdpdGggdGhlIGdpdmVuIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQGV4YW1wbGUgPGNhcHRpb24+Q2hlY2sgd2hldGhlciB0aGUgc3RvcmUgaGFzIHRoZSAnaGVsbG8nIGRlcGVuZGVuY3k8L2NhcHRpb24+XG4gICAqIG1hbmFnZXIuaGFzKCdoZWxsbycpOyAvLyAtPiB0cnVlXG4gICAqL1xuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBkZXBzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbZGVwc01hcD17fV1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIHVwZGF0ZShkZXBzTWFwID0ge30pIHtcbiAgICB0aGlzLnN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBbZGF0YSwgY2hhbmdlZEtleV0gPSB0aGlzLnN0b3JlLmdldFN0YXRlKCk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGRlcHNNYXBbY2hhbmdlZEtleV07XG5cbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZGF0YVtjaGFuZ2VkS2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBhZGRcbiAgICogQGFsaWFzIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXIjc2V0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICBhZGQoLi4uZGF0YSkge1xuICAgIGNvbnNvbGUud2FybignLmFkZCgpIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBVc2UgLnNldCgpIGluc3RlYWQnKTtcbiAgICByZXR1cm4gdGhpcy5zZXQoLi4uZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXF1aXJlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gUmVxdWlyZSBtb2R1bGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgRGVmaW5lZCBuYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZHVsZUV4ZWN1dG9yIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcHBsaWVkIG1vZHVsZVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKi9cbiAgcmVxdWlyZShuYW1lLCBtb2R1bGVFeGVjdXRvcikge1xuICAgIGlmICh0aGlzLnVzZShuYW1lKSA9PT0gdW5kZWZpbmVkKSB0aGlzLmhhbmRsZXIuYXBwbHlNb2R1bGUobW9kdWxlRXhlY3V0b3IoKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7ZXh0ZW5kLCB0cmFuc2Zvcm1EYXRhfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge01vZHVsZVN5c3RlbX0gZnJvbSAnLi9Nb2R1bGVTeXN0ZW0nO1xuaW1wb3J0IHtNb2R1bGVNYW5hZ2VyfSBmcm9tICcuL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHtNYW5hZ2VyRXJyb3IsIENvbXBvc2l0aW9uRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBAY2xhc3MgQ29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtpbnN0cnVjdGlvbnNdIC0gVGhlIGluc3RydWN0aW9ucyBvYmplY3QuXG4gKiBAZXh0ZW5kcyBNb2R1bGVTeXN0ZW1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5jbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBNb2R1bGVTeXN0ZW0ge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCB7XG4gICAqICAgbW9kdWxlczogW10sXG4gICAqICAgbWFuYWdlcjogdHJ1ZVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgbW9kdWxlczogbnVsbCxcbiAgICBtYW5hZ2VyOiB0cnVlXG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQge31cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7fTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgcHJvbWlzZXMgdGhhdCBzaG91bGQgYmUgcmVzb2x2ZWQgYmVmb3JlIENvbXBvbmVudCBpcyByZWFkeS5cbiAgICogQG1lbWJlciB7QXJyYXl9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNfd2FpdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dhaXQgPSBbXTsgLy8gQ29sbGVjdGlvbiBvZiBwcm9taXNlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgbW9kdWxlc2AuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbW9kdWxlc1xuICAgKiBAcHVibGljXG4gICAqL1xuICBtb2R1bGVzID0gW107IC8vIENvbGxlY3Rpb24gb2YgbW9kdWxlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgY2hpbGRgIENvbXBvbmVudHMuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjY2hpbGRyZW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY2hpbGRyZW4gPSBbXTsgLy8gRm9yIGtlZXBpbmcgY2hpbGRyZW4gY29tcG9uZW50cztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSwgZGVmYXVsdHMgPSBDb21wb25lbnQuZGVmYXVsdHMsIGluc3RydWN0aW9ucyA9IENvbXBvbmVudC5pbnN0cnVjdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gQXBwbHkgcG9seWZpbGxlZCBwYXJhbWV0ZXJzIHRvIC5wYXJhbXM7XG4gICAgdGhpcy5wYXJhbXMgPSBleHRlbmQodHJhbnNmb3JtRGF0YShwYXJhbXMsIGluc3RydWN0aW9ucyksIGRlZmF1bHRzKTtcbiAgICBpZiAodGhpcy5wYXJhbXMubWFuYWdlcikgdGhpcy5tYW5hZ2VyID0gbmV3IE1vZHVsZU1hbmFnZXIodGhpcyk7XG5cbiAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLnBhcmFtcy5tb2R1bGVzO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB3YWl0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gV2FpdCBmb3IgYSBwcm9taXNlLlxuICAgKiBAcGFyYW0ge1Byb21pc2V9IFtwcm9taXNlXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIHdhaXQocHJvbWlzZSkge1xuICAgIGlmIChwcm9taXNlKSB0aGlzLl93YWl0LnB1c2gocHJvbWlzZSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX3dhaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmZXJcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGBmdW5jYCAoQ2FsbGJhY2spIHdoZW4gQ29tcG9uZW50IGlzIHJlYWR5LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gQ2FsbGJhY2suXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIGRlZmVyKGZ1bmMpIHtcbiAgICBpZiAodGhpcy5pc0RlZmZlcmVkKSB0aGlzLndhaXQoKS50aGVuKCgpID0+IGZ1bmModGhpcykpO1xuICAgIGVsc2UgZnVuYyh0aGlzKTtcbiAgfVxuXG4gIC8vIFBBUkFNRVRFUlNcblxuICAvKipcbiAgICogQG1ldGhvZCB1cGRhdGVQYXJhbXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHBhcmFtZXRlcnMgb2YgdGhlIENvbXBvbmVudC5cbiAgICogQHJldHVybiB7T2JqZWN0fSBQYXJhbXMgb2YgdGhpcyBDb21wb25lbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgKi9cbiAgdXBkYXRlUGFyYW1zKHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBleHRlbmQocGFyYW1zLCB0aGlzLnBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zO1xuICB9XG5cbiAgLy8gQ09QWUlORyAmIENMT05JTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBjbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENsb25lIHRoaXMgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge29iamVjdH0gYSBjbG9uZWQgY29tcG9uZW50IHdpdGggYWxsIGl0cyBzb3VyY2UgY29tcG9uZW50JyBwYXJhbXMgY29waWVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5wYXJhbXMpLmNvcHkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjb3B5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgbmF0aXZlIGFuZCBpbnRlZ3JhdGUgYG1vZHVsZXNgIHRvIGl0LlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gc291cmNlIC0gU291cmNlIGNvbXBvbmVudCB0aGF0IGlzIHVzZWQgZm9yIGBjb3B5KClgIGFjdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZV0gLSBDYWxsYmFjayBleGVjdXRlZCBiZWZvcmUgbW9kdWxlcyBpbnRlZ3JhdGlvbiBwcm9jZXNzLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBDb21wb25lbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgKi9cbiAgY29weShzb3VyY2UsIGN1c3RvbWl6ZSkge1xuICAgIHRoaXMucGFyYW1zID0gey4uLnNvdXJjZS5wYXJhbXN9O1xuXG4gICAgaWYgKHNvdXJjZS5uYXRpdmUpIHRoaXMubmF0aXZlID0gc291cmNlLm5hdGl2ZS5jbG9uZShzb3VyY2UucGFyYW1zKTtcbiAgICBpZiAoY3VzdG9taXplKSBjdXN0b21pemUoKTtcbiAgICB0aGlzLmludGVncmF0ZU1vZHVsZXMoc291cmNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgY2hpbGQgYENvbXBvbmVudGAuXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBvYmplY3QgLSBDb21wb25lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgYXMgYSBgY2hpbGRgLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBhZGQob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5wYXJlbnQpIGF3YWl0IG9iamVjdC5wYXJlbnQucmVtb3ZlKG9iamVjdCk7XG5cbiAgICBhd2FpdCB0aGlzLndhaXQoKTtcbiAgICBhd2FpdCBvYmplY3Qud2FpdCgpO1xuXG4gICAgaWYgKCFvYmplY3QubmF0aXZlKSB7XG4gICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgJ0NvbXBvbmVudCcsXG4gICAgICAgICd0aGVyZSBpcyBubyBvYmplY3QubmF0aXZlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBvYmplY3QucGFyZW50ID0gdGhpcztcbiAgICBhd2FpdCB0aGlzLmFwcGx5QnJpZGdlKHtvbkFkZDogb2JqZWN0fSkub25BZGQ7XG4gICAgdGhpcy5uYXRpdmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuXG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbW92ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSBhIGNoaWxkIGBDb21wb25lbnRgLlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIGEgKipjaGlsZCoqIG9mIHRoaXMgQ29tcG9uZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyByZW1vdmUob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5wYXJlbnQgIT09IHRoaXMpIHJldHVybjtcblxuICAgIGF3YWl0IHRoaXMud2FpdCgpO1xuICAgIGF3YWl0IG9iamVjdC53YWl0KCk7XG5cbiAgICBvYmplY3QucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZS5yZW1vdmUob2JqZWN0Lm5hdGl2ZSk7XG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UodGhpcy5jaGlsZHJlbi5pbmRleE9mKG9iamVjdCksIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkVG9cbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGB0aGlzYCBDb21wb25lbnQgdG8gc3BlY2lmaWVkIGBBcHBgL2BDb21wb25lbnRgLlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgd2lsbCBiZSBhIHBhcmVudCBvZiBgdGhpc2AuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIGFkZFRvKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QuYWRkKHRoaXMpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gIH1cblxuICB1c2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBgYXN5bmNgIChgd2FpdGAgcHJvbWlzZXMgYXJlIG1vcmUgdGhhbiBgMGApLlxuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaXNEZWZmZXJlZFxuICAgKi9cbiAgZ2V0IGlzRGVmZmVyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhaXQubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgTW9kdWxlTWFuYWdlcmAgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIEBtZW1iZXIge01vZHVsZU1hbmFnZXJ9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNtYW5hZ2VyXG4gICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICovXG4gIGdldCBtYW5hZ2VyKCkge1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyKSByZXR1cm4gdGhpcy5fbWFuYWdlcjtcblxuICAgIHRocm93IG5ldyBNYW5hZ2VyRXJyb3IoXG4gICAgICAnQ29tcG9uZW50JyxcbiAgICAgIGBNb2R1bGVNYW5hZ2VyIGlzIG5vdCB1c2VkIGluIHRoaXMgY29tcG9uZW50LiAnbWFuYWdlcicgcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgYXMgJ3RydWUnYCxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgc2V0IG1hbmFnZXIobWFuYWdlcikge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBuYXRpdmVgIG9iamVjdCB1c2VkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbmF0aXZlXG4gICAqL1xuICBnZXQgbmF0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gIH1cblxuICBzZXQgbmF0aXZlKG1lc2gpIHtcbiAgICB0aGlzLl9uYXRpdmUgPSBtZXNoO1xuICAgIHRoaXMuX25hdGl2ZS5jb21wb25lbnQgPSB0aGlzO1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ29tcG9uZW50XG59O1xuIiwiLy8gMjYuMS42IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgWywgcmVjZWl2ZXJdKVxudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5IC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl07XG4gIHZhciBkZXNjLCBwcm90bztcbiAgaWYgKGFuT2JqZWN0KHRhcmdldCkgPT09IHJlY2VpdmVyKSByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYgKGRlc2MgPSBnT1BELmYodGFyZ2V0LCBwcm9wZXJ0eUtleSkpIHJldHVybiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICA/IGRlc2MudmFsdWVcbiAgICA6IGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZGVzYy5nZXQuY2FsbChyZWNlaXZlcilcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkgcmV0dXJuIGdldChwcm90bywgcHJvcGVydHlLZXksIHJlY2VpdmVyKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgeyBnZXQ6IGdldCB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWZsZWN0LmdldDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9yZWZsZWN0L2dldFwiKTsiLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkge1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zdXBlclByb3BCYXNlOyIsInZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG5cbnZhciBfUmVmbGVjdCRnZXQgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9yZWZsZWN0L2dldFwiKTtcblxudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vZ2V0UHJvdG90eXBlT2ZcIik7XG5cbnZhciBzdXBlclByb3BCYXNlID0gcmVxdWlyZShcIi4vc3VwZXJQcm9wQmFzZVwiKTtcblxuZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgX1JlZmxlY3QkZ2V0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0ID0gX1JlZmxlY3QkZ2V0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZGVzYyA9IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldDsiLCJleHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlcyguLi5tYXBwZXJzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtYXBwZXIgPSBtYXBwZXJzW2ldO1xuXG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1hcHBlci5tYXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gbWFwcGVyLm1hcFtrXTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSwgYXR0cmlidXRlLCB7XG4gICAgICAgICAgZ2V0OiBtYXBwZXIuZ2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgc2V0OiBtYXBwZXIuc2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBtYXBwZXIuY29uZmlndXJhYmxlLFxuICAgICAgICAgIGVudW1lcmFibGU6IG1hcHBlci5lbnVtZXJhYmxlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkoLi4ubWFwKSB7XG4gIHJldHVybiB7XG4gICAgbWFwLFxuICAgIGdldHRlcihuYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVbbmFtZV07XG4gICAgICB9O1xuICAgIH0sXG4gICAgc2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVbbmFtZV0uY29weSh2YWx1ZSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvciguLi5tYXApIHtcbiAgcmV0dXJuIHtcbiAgICBtYXAsXG4gICAgZ2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVtuYW1lXTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBzZXR0ZXIobmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm5hdGl2ZVtuYW1lXSA9IHZhbHVlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH07XG59XG4iLCJpbXBvcnQge01lc2h9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q29tcG9uZW50fSBmcm9tICcuL0NvbXBvbmVudCc7XG5cbmltcG9ydCB7YXR0cmlidXRlcywgY29weSwgbWlycm9yfSBmcm9tICcuL3Byb3RvdHlwZS9hdHRyaWJ1dGVzJztcbmltcG9ydCB7Q29tcG9zaXRpb25FcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuXG5AYXR0cmlidXRlcyhcbiAgY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICdzY2FsZScpLFxuICBtaXJyb3IoJ21hdGVyaWFsJywgJ2dlb21ldHJ5Jylcbilcbi8qKlxuICogQGNsYXNzIE1lc2hDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIE1lc2hDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHRcbiAgICoge1xuICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgKiAgIGdlb21ldHJ5OiB7fSxcbiAgICogICBtYXRlcmlhbDogZmFsc2UsXG4gICAqXG4gICAqICAgc2hhZG93OiB7XG4gICAqICAgICBjYXN0OiB0cnVlLFxuICAgKiAgICAgcmVjZWl2ZTogdHJ1ZVxuICAgKiAgIH0sXG4gICAqXG4gICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgKiAgIHNjYWxlOiB7eDogMSwgeTogMSwgejogMX1cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLkNvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIGJ1aWxkOiB0cnVlLFxuICAgIGdlb21ldHJ5OiB7fSxcbiAgICBtYXRlcmlhbDogZmFsc2UsXG5cbiAgICBzaGFkb3c6IHtcbiAgICAgIGNhc3Q6IHRydWUsXG4gICAgICByZWNlaXZlOiB0cnVlXG4gICAgfSxcblxuICAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICBzY2FsZToge3g6IDEsIHk6IDEsIHo6IDF9XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0XG4gICAqIHtcbiAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAqICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgcm90YXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICBzY2FsZTogWyd4JywgJ3knLCAneiddXG4gIH07XG5cbiAgLy8gQ1VTVE9NIEdFT01FVFJZIEhBTkRMSU5HXG5cbiAgc3RhdGljIGN1c3RvbShnZW9tLCBjb25zdHJ1Y3RvciA9IE1lc2gpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgICAgIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgZ2VvbWV0cnk6IGdlb20sXG4gICAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IGNvbnN0cnVjdG9yKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlKGdlb20sIHBhcmFtcywgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IChNZXNoQ29tcG9uZW50LmN1c3RvbShnZW9tLCBjb25zdHJ1Y3RvcikpKHBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgZnJvbShtZXNoLCBwYXJhbXMgPSB7fSkge1xuICAgIHBhcmFtcy5idWlsZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE1lc2hDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBtZXNoO1xuICAgIGNvbXBvbmVudC53cmFwKCk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zLCBkZWZhdWx0cyA9IE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIGluc3RydWN0aW9ucyA9IE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnTWVzaENvbXBvbmVudCcsXG4gICAgICAgICAgJy5idWlsZCgpIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgVEhSRUUuT2JqZWN0M0Qgb3IgYSBQcm9taXNlIHJlc29sdmVkIHdpdGggVEhSRUUuT2JqZWN0M0QuJyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWlsZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgdGhpcy53YWl0KGJ1aWxkKTtcblxuICAgICAgICB0aGlzLndhaXQobmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgYnVpbGQudGhlbihuYXRpdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgICAgICB0aGlzLndyYXAoKS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IGJ1aWxkO1xuICAgICAgICB0aGlzLndhaXQodGhpcy53cmFwKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlDb21tYW5kKCdwb3N0SW50ZWdyYXRlJyk7XG4gIH1cblxuICAvLyBCVUlMRElORyAmIFdSQVBQSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIGJ1aWxkKCkge1xuICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgJ01lc2hDb21wb25lbnQnLFxuICAgICAgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJyxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgd3JhcFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIHdyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgLy8gVE9ETzogRml4IGRlZmVyIHdpdGggcGh5c2ljc1xuICAgICAgLy8gdGhpcy5kZWZlcigoKSA9PiB7XG4gICAgICBjb25zdCB7cG9zaXRpb24sIHJvdGF0aW9uLCBzY2FsZSwgc2hhZG93fSA9IHRoaXMucGFyYW1zO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uLnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTtcbiAgICAgIHRoaXMucm90YXRpb24uc2V0KHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopO1xuICAgICAgdGhpcy5zY2FsZS5zZXQoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7XG5cbiAgICAgIHRoaXMubmF0aXZlLmNhc3RTaGFkb3cgPSBzaGFkb3cuY2FzdDtcbiAgICAgIHRoaXMubmF0aXZlLnJlY2VpdmVTaGFkb3cgPSBzaGFkb3cucmVjZWl2ZTtcblxuICAgICAgdGhpcy5hcHBseUJyaWRnZSh7b25XcmFwOiAxfSk7XG5cbiAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAvLyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29weVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgKiBAcmV0dXJuIHt0aGlzfSBNZXNoQ29tcG9uZW50XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gICAqL1xuICBjb3B5KHNvdXJjZSkge1xuICAgIHJldHVybiBzdXBlci5jb3B5KHNvdXJjZSwgKCkgPT4ge1xuICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG4gICAgICB0aGlzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTWVzaENvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICogQHJldHVybiB7TWVzaENvbXBvbmVudH0gY2xvbmUgb2YgdGhpcyBvYmplY3RcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIGNsb25lKGdlb21ldHJ5LCBtYXRlcmlhbCkge1xuICAgIGNvbnN0IGRlc3QgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7YnVpbGQ6IGZhbHNlfSkuY29weSh0aGlzKTtcblxuICAgIGlmIChnZW9tZXRyeSkgZGVzdC5nZW9tZXRyeSA9IGRlc3QuZ2VvbWV0cnkuY2xvbmUoKTtcbiAgICBpZiAobWF0ZXJpYWwpIGRlc3QubWF0ZXJpYWwgPSBkZXN0Lm1hdGVyaWFsLmNsb25lKCk7XG5cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxufVxuXG5leHBvcnQge1xuICBNZXNoQ29tcG9uZW50XG59O1xuIiwiaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4vQ29tcG9uZW50JztcblxuaW1wb3J0IHthdHRyaWJ1dGVzLCBjb3B5fSBmcm9tICcuL3Byb3RvdHlwZS9hdHRyaWJ1dGVzJztcbmltcG9ydCB7Q29tcG9zaXRpb25FcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuXG5AYXR0cmlidXRlcyhcbiAgY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICd0YXJnZXQnKVxuKVxuLyoqXG4gKiBAY2xhc3MgTGlnaHRDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIExpZ2h0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnQjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdFxuICAgKiB7XG4gICAqICAgYnVpbGQ6IHRydWUsXG4gICAqXG4gICAqICAgc2hhZG93OiB7XG4gICAqICAgICBjYXN0OiB0cnVlLFxuICAgKlxuICAgKiAgICAgYmlhczogMCxcbiAgICogICAgIHJhZGl1czogMSxcbiAgICpcbiAgICogICAgIG1hcFNpemU6IHtcbiAgICogICAgICAgd2lkdGg6IDEwMjQsXG4gICAqICAgICAgIGhlaWdodDogMTAyNFxuICAgKiAgICAgfSxcbiAgICpcbiAgICogICAgIGNhbWVyYToge1xuICAgKiAgICAgICBuZWFyOiB0cnVlLFxuICAgKiAgICAgICBmYXI6IDQwMCxcbiAgICogICAgICAgZm92OiA5MCxcbiAgICpcbiAgICogICAgICAgdG9wOiAyMDAsXG4gICAqICAgICAgIGJvdHRvbTogLTIwMCxcbiAgICogICAgICAgbGVmdDogLTIwMCxcbiAgICogICAgICAgcmlnaHQ6IDIwMFxuICAgKiAgICAgfVxuICAgKiAgIH0sXG4gICAqXG4gICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9XG4gICAqIH1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5Db21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBidWlsZDogdHJ1ZSxcblxuICAgIHNoYWRvdzoge1xuICAgICAgY2FzdDogdHJ1ZSxcblxuICAgICAgYmlhczogMCxcbiAgICAgIHJhZGl1czogMSxcblxuICAgICAgbWFwU2l6ZToge1xuICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgaGVpZ2h0OiAxMDI0XG4gICAgICB9LFxuXG4gICAgICBjYW1lcmE6IHtcbiAgICAgICAgbmVhcjogdHJ1ZSxcbiAgICAgICAgZmFyOiA0MDAsXG4gICAgICAgIGZvdjogOTAsXG5cbiAgICAgICAgdG9wOiAyMDAsXG4gICAgICAgIGJvdHRvbTogLTIwMCxcbiAgICAgICAgbGVmdDogLTIwMCxcbiAgICAgICAgcmlnaHQ6IDIwMFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0XG4gICAqIHtcbiAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbiAgfTtcblxuICBzdGF0aWMgZnJvbShsaWdodCwgcGFyYW1zID0ge30sIHdyYXBTaGFkb3cgPSB0cnVlKSB7XG4gICAgcGFyYW1zLmJ1aWxkID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTGlnaHRDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBsaWdodDtcbiAgICBjb21wb25lbnQud3JhcCgpO1xuICAgIGlmICh3cmFwU2hhZG93KSBjb21wb25lbnQud3JhcFNoYWRvdygpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcywgZGVmYXVsdHMgPSBMaWdodENvbXBvbmVudC5kZWZhdWx0cywgaW5zdHJ1Y3Rpb25zID0gTGlnaHRDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnTGlnaHRDb21wb25lbnQnLFxuICAgICAgICAgICcuYnVpbGQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiBhIFRIUkVFLk9iamVjdDNEIG9yIGEgUHJvbWlzZSByZXNvbHZlZCB3aXRoIFRIUkVFLk9iamVjdDNELicsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVpbGQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGJ1aWxkLnRoZW4obmF0aXZlID0+IHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgdGhpcy5uYXRpdmUgPSBidWlsZDtcblxuICAgICAgdGhpcy53YWl0KHRoaXMud3JhcCgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5Q29tbWFuZCgncG9zdEludGVncmF0ZScpO1xuICB9XG5cbiAgLy8gQlVJTERJTkcgJiBXUkFQUElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGl2ZWN5Y2xlIHNob3VsZCByZXR1cm4gYSBuYXRpdmUgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtDb21wb3NpdGlvbkVycm9yfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGJ1aWxkKCkge1xuICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgJ01lc2hDb21wb25lbnQnLFxuICAgICAgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJyxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgd3JhcFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAqL1xuICB3cmFwKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuZGVmZXIoKCkgPT4ge1xuICAgICAgICBjb25zdCB7cG9zaXRpb24sIHJvdGF0aW9ufSA9IHRoaXMucGFyYW1zO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopO1xuICAgICAgICB0aGlzLnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcblxuICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtvbldyYXA6IDF9KTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB3cmFwU2hhZG93XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gV3JhcHMgc2hhZG93IHByb3BlcnRpZXNcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAqL1xuICB3cmFwU2hhZG93KCkge1xuICAgIGNvbnN0IHtuYXRpdmUsIHBhcmFtczoge3NoYWRvd319ID0gdGhpcztcblxuICAgIG5hdGl2ZS5jYXN0U2hhZG93ID0gc2hhZG93LmNhc3Q7XG4gICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLndpZHRoID0gc2hhZG93Lm1hcFNpemUud2lkdGg7XG4gICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHNoYWRvdy5tYXBTaXplLmhlaWdodDtcbiAgICBuYXRpdmUuc2hhZG93LmJpYXMgPSBzaGFkb3cuYmlhcztcbiAgICBuYXRpdmUuc2hhZG93LnJhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cbiAgICBjb25zdCBzaGFkb3dDYW1lcmEgPSBuYXRpdmUuc2hhZG93LmNhbWVyYTtcbiAgICBjb25zdCB7Y2FtZXJhfSA9IHNoYWRvdztcblxuICAgIHNoYWRvd0NhbWVyYS5uZWFyID0gY2FtZXJhLm5lYXI7XG4gICAgc2hhZG93Q2FtZXJhLmZhciA9IGNhbWVyYS5mYXI7XG4gICAgc2hhZG93Q2FtZXJhLmZvdiA9IGNhbWVyYS5mb3Y7XG5cbiAgICBzaGFkb3dDYW1lcmEubGVmdCA9IGNhbWVyYS5sZWZ0O1xuICAgIHNoYWRvd0NhbWVyYS5yaWdodCA9IGNhbWVyYS5yaWdodDtcbiAgICBzaGFkb3dDYW1lcmEudG9wID0gY2FtZXJhLnRvcDtcbiAgICBzaGFkb3dDYW1lcmEuYm90dG9tID0gY2FtZXJhLmJvdHRvbTtcbiAgfVxuXG4gIC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29weVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgKiBAcmV0dXJuIHt0aGlzfSBMaWdodENvbXBvbmVudFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGNvcHkoc291cmNlKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNvcHkoc291cmNlLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy50YXJnZXQpIHRoaXMudGFyZ2V0LmNvcHkoc291cmNlLnRhcmdldCgpKTtcblxuICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG4gICAgICB0aGlzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTGlnaHRDb21wb25lbnQgdXNpbmcgYC5jb3B5KClgXG4gICAqIEByZXR1cm4ge0xpZ2h0Q29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7YnVpbGQ6IGZhbHNlfSkuY29weSh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBMaWdodENvbXBvbmVudFxufTtcbiIsImltcG9ydCB7Q29tcG9uZW50fSBmcm9tICcuL0NvbXBvbmVudCc7XG5cbmltcG9ydCB7YXR0cmlidXRlcywgY29weX0gZnJvbSAnLi9wcm90b3R5cGUvYXR0cmlidXRlcyc7XG5pbXBvcnQge0NvbXBvc2l0aW9uRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuQGF0dHJpYnV0ZXMoXG4gIGNvcHkoJ3Bvc2l0aW9uJywgJ3JvdGF0aW9uJywgJ3F1YXRlcm5pb24nLCAndGFyZ2V0Jylcbilcbi8qKlxuICogQGNsYXNzIENhbWVyYUNvbXBvbmVudFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdHJ1Y3Rpb25zXSAtIFRoZSBpbnN0cnVjdGlvbnMgb2JqZWN0LlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuY2xhc3MgQ2FtZXJhQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHRcbiAgICoge1xuICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgKlxuICAgKiAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAqICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgYnVpbGQ6IHRydWUsXG5cbiAgICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdFxuICAgKiB7XG4gICAqICAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICogICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHNjYWxlOiBbJ3gnLCAneScsICd6J11cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICB9O1xuXG4gIHN0YXRpYyBmcm9tKGNhbWVyYSwgcGFyYW1zID0ge30pIHtcbiAgICBwYXJhbXMuYnVpbGQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDYW1lcmFDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBjYW1lcmE7XG4gICAgY29tcG9uZW50LndyYXAoKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJhbXMsIGRlZmF1bHRzID0gQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLCBpbnN0cnVjdGlvbnMgPSBDYW1lcmFDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnQ2FtZXJhQ29tcG9uZW50JyxcbiAgICAgICAgICAnLmJ1aWxkKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBUSFJFRS5PYmplY3QzRCBvciBhIFByb21pc2UgcmVzb2x2ZWQgd2l0aCBUSFJFRS5PYmplY3QzRC4nLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1aWxkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBidWlsZC50aGVuKG5hdGl2ZSA9PiB7XG4gICAgICAgICAgdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHRoaXMubmF0aXZlID0gYnVpbGQ7XG5cbiAgICAgIHRoaXMud2FpdCh0aGlzLndyYXAoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseUNvbW1hbmQoJ3Bvc3RJbnRlZ3JhdGUnKTtcbiAgfVxuXG4gIC8vIEJVSUxESU5HICYgV1JBUFBJTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICAgKi9cbiAgYnVpbGQoKSB7XG4gICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAnQ2FtZXJhQ29tcG9uZW50JyxcbiAgICAgICdJbnN0YW5jZSBzaG91bGQgaGF2ZSBpdFxcJ3Mgb3duIC5idWlsZCgpLicsXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHdyYXBcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBXcmFwcyB0cmFuc2Zvcm1zIChgcG9zaXRpb25gICYgYHJvdGF0aW9uYClcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgY29tcGxldGVkXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAgICovXG4gIHdyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5kZWZlcigoKSA9PiB7XG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHRoaXMucGFyYW1zLnBvc2l0aW9uLngsIHRoaXMucGFyYW1zLnBvc2l0aW9uLnksIHRoaXMucGFyYW1zLnBvc2l0aW9uLnopO1xuICAgICAgICB0aGlzLnJvdGF0aW9uLnNldCh0aGlzLnBhcmFtcy5yb3RhdGlvbi54LCB0aGlzLnBhcmFtcy5yb3RhdGlvbi55LCB0aGlzLnBhcmFtcy5yb3RhdGlvbi56KTtcblxuICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtvbldyYXA6IDF9KTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjb3B5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgdHJhbnNmb3JtcyAmIGV4ZWN1dGUgYENvbXBvbmVudC5jb3B5KClgXG4gICAqIEByZXR1cm4ge3RoaXN9IENhbWVyYUNvbXBvbmVudFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAqL1xuICBjb3B5KHNvdXJjZSkge1xuICAgIHJldHVybiBzdXBlci5jb3B5KHNvdXJjZSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudGFyZ2V0KSB0aGlzLnRhcmdldC5jb3B5KHNvdXJjZS50YXJnZXQoKSk7XG5cbiAgICAgIHRoaXMucG9zaXRpb24uY29weShzb3VyY2UucG9zaXRpb24pO1xuICAgICAgdGhpcy5yb3RhdGlvbi5jb3B5KHNvdXJjZS5yb3RhdGlvbik7XG4gICAgICB0aGlzLnF1YXRlcm5pb24uY29weShzb3VyY2UucXVhdGVybmlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE1ha2UgYSBjbG9uZSBvZiB0aGlzIENhbWVyYUNvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICogQHJldHVybiB7Q2FtZXJhQ29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Ioe2J1aWxkOiBmYWxzZX0pLmNvcHkodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ2FtZXJhQ29tcG9uZW50XG59O1xuIiwiZXhwb3J0IGNvbnN0IHN5c3RlbSA9IHtcbiAgd2luZG93OiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvd1xufTtcbiIsImltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7c3lzdGVtfSBmcm9tICcuLi9wb2x5ZmlsbCc7XG5pbXBvcnQge01vZHVsZVN5c3RlbX0gZnJvbSAnLi9Nb2R1bGVTeXN0ZW0nO1xuaW1wb3J0IHtNb2R1bGVNYW5hZ2VyfSBmcm9tICcuL01vZHVsZU1hbmFnZXInO1xuXG4vKipcbiAqIEBjbGFzcyBBcHBcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byBwcmVwYXJlIGEgd29ybGQgc2NlbmUsIHNldHVwIHBoeXNpY3MsIGNhbWVyYSwgcmVuZGVyZXIgYW5kIGFsbCBvdGhlciB0aGluZ3MgdGhhdCB5b3UgdXN1YWxseSBkbyBiZWZvcmUgbWFraW5nIG1lc2hlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFttb2R1bGVzPVtdXSAtIEFycmF5IG9mIE1vZHVsZXNcbiAqIEBleHRlbmRzIE1vZHVsZVN5c3RlbVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIEFwcCBleHRlbmRzIE1vZHVsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB3aGV0aGVyIHRoZSBzY2VuZSBzaG91bGQgcmVuZGVyIG9yIG5vdFxuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5BcHAjZW5hYmxlZFxuICAgKiBAcHVibGljXG4gICAqL1xuICBlbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogTG9vcHMgaW4gdGhpcyBhcHBcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIGxvb3BzIHRoYXQgYXJlIGV4ZWN1dGVkIGJ5IHRoaXMgYXBwLlxuICAgKiBAbWVtYmVyIHtBcnJheX0gbW9kdWxlOmNvcmUuQXBwI2xvb3BzXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGxvb3BzID0gW107XG5cbiAgY29uc3RydWN0b3IobW9kdWxlcyA9IFtdKSB7XG4gICAgY29uc29sZS5sb2coYFdIUy5BcHAgJHt2ZXJzaW9ufWApO1xuXG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgTW9kdWxlTWFuYWdlcih0aGlzKTtcbiAgICB0aGlzLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG4gIH1cblxuICAvLyBDT05UUk9MUyAmIFVQREFUSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0IHJlbmRlcmluZyBsb29wIGFuZCBwaHlzaWNzIHNpbXVsYXRpb24gKGlmIHlvdSB1c2UgdmVyc2lvbiB3aXRoIHBoeXNpY3MpLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQXBwXG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBjb25zdCByZXF1ZXN0QW5pbUZyYW1lID0gKCgpID0+IHtcbiAgICAgIHJldHVybiBzeXN0ZW0ud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBzeXN0ZW0ud2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBzeXN0ZW0ud2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBzeXN0ZW0ud2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0QW5pbUZyYW1lKCgpID0+IHByb2Nlc3MoKSk7XG4gICAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBmb3IgKGxldCBpID0gMCwgbGwgPSB0aGlzLmxvb3BzLmxlbmd0aDsgaSA8IGxsOyBpKyspIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMubG9vcHNbaV07XG4gICAgICAgIGlmIChlLmVuYWJsZWQpIGUuZXhlY3V0ZShlLmNsb2NrKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5yZXF1ZXN0KVxuICAgICAgcHJvY2VzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyaW5nIGxvb3BzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBhZGRMb29wXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvb3AgdG8gdGhpcyBhcHAuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsb29wIC0gdGhlIGxvb3AgdG8gYWRkXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkFwcFxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5BZGRpbmcgYSBsb29wIHRvIGFuIGFwcDwvY2FwdGlvbj5cbiAgICogY29uc3QgbG9vcCA9IG5ldyBMb29wKCgpID0+IHtcbiAgICogIC8vIC4uLlxuICAgKiB9KTtcbiAgICpcbiAgICogY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICAgKlxuICAgKiBhcHAuYWRkTG9vcChsb29wKTtcbiAgICogbG9vcC5zdGFydCgpO1xuICAgKi9cbiAgYWRkTG9vcChsb29wKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5sb29wcy5wdXNoKGxvb3ApO1xuICAgICAgcmVzb2x2ZShsb29wKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbW92ZUxvb3BcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgbG9vcCBmcm9tIHRoaXMgYXBwLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbG9vcCAtIHRoZSBsb29wIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICovXG4gIHJlbW92ZUxvb3AobG9vcCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sb29wcy5pbmRleE9mKGxvb3ApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy5sb29wcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICByZXNvbHZlKGxvb3ApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gIH1cblxuICB1c2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBBcHBcbn07XG4iLCJpbXBvcnQge0Nsb2NrfSBmcm9tICd0aHJlZSc7XG5cbi8qKlxuICogQGNsYXNzIExvb3BcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBhbmltYXRpb24gZnJhbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3VzZUNsb2NrPXRydWVdIHBhc3NlcyBhIENsb2NrIHRvIHRoZSBmdW5jdGlvbiB3aGVuIGNhbGxlZCwgaWYgdHJ1ZVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIExvb3Age1xuICBjb25zdHJ1Y3RvcihmdW5jLCB1c2VDbG9jayA9IHRydWUpIHtcbiAgICB0aGlzLmZ1bmMgPSBmdW5jO1xuICAgIHRoaXMuY2xvY2sgPSB1c2VDbG9jayA/IG5ldyBDbG9jaygpIDogbnVsbDtcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIENPTlRST0xTXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgdGhpcyBsb29wLCBjbG9jayBpZiBpdCBoYXMgb25lLiBXb24ndCBkbyBhbnl0aGluZyBpZiBsb29wIGVuYWJsZWQgYWxyZWFkeS5cbiAgICogQHBhcmFtIHtDb21wb25lbnR9IFt3b3JsZF0gYXBwIHRvIGFkZCB0aGlzIGxvb3AgdG8sIGlmIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTG9vcFxuICAgKi9cbiAgc3RhcnQod29ybGQpIHtcbiAgICBpZiAodGhpcy5lbmFibGVkKSByZXR1cm47XG5cbiAgICBpZiAod29ybGQpIHdvcmxkLmFkZExvb3AodGhpcyk7XG5cbiAgICBpZiAodGhpcy5jbG9jaykgdGhpcy5jbG9jay5zdGFydCgpO1xuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzdG9wXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgdGhpcyBsb29wIGFuZCBpdHMgY2xvY2sgaWYgaXQgaGFzIG9uZSwgd29uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBsb29wIGlzIG5vdCBlbmFibGVkKVxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gW3dvcmxkXSBhcHAgdG8gcmVtb3ZlIHRoaXMgbG9vcCBmcm9tLCBpZiBwcm92aWRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICovXG4gIHN0b3Aod29ybGQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuY2xvY2spIHRoaXMuY2xvY2suc3RvcCgpO1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHdvcmxkKSB3b3JsZC5yZW1vdmVMb29wKHRoaXMpO1xuICB9XG5cbiAgLy8gRVhFQ1VUSU9OXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZXhlY3V0ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3BcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICogQHJldHVybnMgeyp9IHdoYXRldmVyIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3AgcmV0dXJuc1xuICAgKi9cbiAgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mdW5jKHRoaXMuY2xvY2spO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIExvb3Bcbn07XG4iLCIvKiogQG1vZHVsZSBjb3JlICovXG5leHBvcnQgKiBmcm9tICcuL0NvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL01lc2hDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9MaWdodENvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0NhbWVyYUNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0FwcCc7XG5leHBvcnQgKiBmcm9tICcuL0xvb3AnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVNYW5hZ2VyJztcbiIsImltcG9ydCB7QW1iaWVudExpZ2h0IGFzIEFtYmllbnRMaWdodE5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtMaWdodENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9MaWdodENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIEFtYmllbnRMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gQW1iaWVudExpZ2h0IGlzIGEgc2ltcGxlIGNsYXNzLCBpdCBleHRlbmRzIExpZ2h0IGFuZCBpbmhlcml0cyBhbGwgaXRzIG1ldGhvZHMuXG4gKiBBbWJpZW50TGlnaHQgY3JlYXRlcyBiYXNpYyBsaWdodCBhcm91bmQgYWxsIHNjZW5lLCBzbyBpdCBkb2Vzbid0IG5lZWQgcHJvcGVydGllcyBsaWtlIHBvcyBvciB0YXJnZXQuXG4gKiBJdCBzdXBwb3J0cyBvbmx5IGNvbG9yIGFuZCBpbnRlbnNpdHkgYXMgcGFyYW1ldGVycywgd2hpY2ggZGVmaW5lcyB0aGUgY29sb3Igb2YgdGhlIHN1cnJvdW5kZWQgbGlnaHQgYW5kIGludGVuc2l0eSBvZiBsaWdodC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBBbWJpZW50TGlnaHQgPC9jYXB0aW9uPlxuICogbmV3IEFtYmllbnRMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjJcbiAqIH0pLmFkZFRvKHdvcmxkKTtcbiAqL1xuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEFtYmllbnRMaWdodC5kZWZhdWx0cyk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IEFtYmllbnRMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQW1iaWVudExpZ2h0XG59O1xuIiwiaW1wb3J0IHtEaXJlY3Rpb25hbExpZ2h0IGFzIERpcmVjdGlvbmFsTGlnaHROYXRpdmUsIERpcmVjdGlvbmFsTGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBEaXJlY3Rpb25hbExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBEaXJlY3RpbmFsTGlnaHQgY3JlYXRlcyBhIGxpZ2h0IHRoYXQgc2hpbmVzIGZyb20gYSBzcGVjaWZpYyBkaXJlY3Rpb24gbm90IGZyb20gYSBzcGVjaWZpYyBwb3NpdGlvbi48YnIvPjxici8+XG4gKiBUaGlzIGxpZ2h0IHdpbGwgYmVoYXZlIGFzIHRob3VnaCBpdCBpcyBpbmZpbml0ZWx5IGZhciBhd2F5IGFuZCB0aGUgcmF5cyBwcm9kdWNlZCBmcm9tIGl0IGFyZSBhbGwgcGFyYWxsZWwuIDxici8+PGJyLz5cbiAqIFRoZSBiZXN0IGFuYWxvZ3kgd291bGQgYmUgYSBsaWdodCBzb3VyY2UgdGhhdCBhY3RzIGxpa2UgdGhlIHN1bjogdGhlIHN1biBpcyBzbyBmYXIgYXdheSB0aGF0IGFsbCBzdW5saWdodCBoaXR0aW5nIG9iamVjdHMgY29tZXMgZnJvbSB0aGUgc2FtZSBhbmdsZS48YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgb3B0aW9ucyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQgcGFyYW1hdGVyLCBidXQgaXQgYWxzbyBzdXBwb3J0cyBwb3MgYW5kIHRhcmdldCBwYXJhbWF0ZXJzLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgRGlyZWN0aW9uYWxMaWdodCB0byBmYWxsIGRvd24gZnJvbSB2ZWMzKDEwLCAyMCwgMTApIHRvIHZlYzMoMCwgMCwgMCk8L2NhcHRpb24+XG4gKiBuZXcgRGlyZWN0aW9uYWxMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjIsXG4gKlxuICogICBwb3NpdGlvbjogWzEwLCAyMCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIERpcmVjdGlvbmFsTGlnaHQuZGVmYXVsdHMpO1xuICAgIHRoaXMud3JhcFNoYWRvdygpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bGlnaHQ6IG5ldyBEaXJlY3Rpb25hbExpZ2h0TmF0aXZlKFxuICAgICAgcGFyYW1zLmNvbG9yLFxuICAgICAgcGFyYW1zLmludGVuc2l0eVxuICAgICl9KS5saWdodDtcbiAgfVxufVxuXG5leHBvcnQge1xuICBEaXJlY3Rpb25hbExpZ2h0XG59O1xuIiwiaW1wb3J0IHtIZW1pc3BoZXJlTGlnaHQgYXMgSGVtaXNwaGVyZUxpZ2h0TmF0aXZlLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBIZW1pc3BoZXJlTGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIEhlbWlzcGhlcmVMaWdodCBpcyBhIGxpZ2h0IHNvdXJjZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGFib3ZlIHRoZSBzY2VuZS48YnIvPlxuICogSXQgYWxzbyBkb2Vzbid0IG5lZWQgcG9zaXRpb24gYW5kIHRhcmdldCBwcm9wZXJ0aWVzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2xpZ2h0c19oZW1pc3BoZXJlLmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge3NreUNvbG9yOiAweGZmZmZmZiwgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSGVtaXNwaGVyZUxpZ2h0PC9jYXB0aW9uPlxuICogbmV3IEhlbWlzcGhlcmVMaWdodCh7XG4gKiAgIHNreUNvbG9yOiAweGZmMDAwMCxcbiAqICAgZ3JvdW5kQ29sb3I6IDB4MDAwMGZmLFxuICogICBpbnRlbnNpdHk6IDAuMlxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgSGVtaXNwaGVyZUxpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBza3lDb2xvcjogMHhmZmZmZmYsXG4gICAgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLFxuICAgIGludGVuc2l0eTogMVxuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEhlbWlzcGhlcmVMaWdodC5kZWZhdWx0cyk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IEhlbWlzcGhlcmVMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5za3lDb2xvcixcbiAgICAgIHBhcmFtcy5ncm91bmRDb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSGVtaXNwaGVyZUxpZ2h0XG59O1xuIiwiaW1wb3J0IHtQb2ludExpZ2h0IGFzIFBvaW50TGlnaHROYXRpdmUsIFBvaW50TGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBQb2ludExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBQb2ludExpZ2h0IGNyZWF0ZXMgYSBsaWdodCBhdCBhIHNwZWNpZmljIHBvc2l0aW9uIGluIHRoZSBzY2VuZS4gVGhlIGxpZ2h0IHNoaW5lcyBpbiBhbGwgZGlyZWN0aW9ucyAocm91Z2hseSBzaW1pbGFyIHRvIGEgbGlnaHQgYnVsYi4pPGJyLz48YnIvPlxuICogSXQgaGFzIHRoZSBzYW1lIG9wdGlvbnMgYXMgQW1iaWVudExpZ2h0IGluIGxpZ2h0IHBhcmFtYXRlciwgYnV0IGl0IGFsc28gc3VwcG9ydHMgcG9zaXRpb24sIGRpc3RhbmNlIGFuZCBkZWNheS48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDEsIGRpc3RhbmNlOiAxMDAsIGRlY2F5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIExpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFBvaW50TGlnaHQ8L2NhcHRpb24+XG4gKiBuZXcgUG9pbnRMaWdodCgge1xuICogICBjb2xvcjogMHhmZjAwMDAsXG4gKiAgIGludGVuc2l0eTogMixcbiAqICAgZGlzdGFuY2U6IDMwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0Q29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRzPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxLFxuICAgIGRpc3RhbmNlOiAxMDAsXG4gICAgZGVjYXk6IDFcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBQb2ludExpZ2h0LmRlZmF1bHRzKTtcbiAgICB0aGlzLndyYXBTaGFkb3coKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2xpZ2h0OiBuZXcgUG9pbnRMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMuZGlzdGFuY2UsXG4gICAgICBwYXJhbXMuZGVjYXlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUG9pbnRMaWdodFxufTtcbiIsImltcG9ydCB7U3BvdExpZ2h0IGFzIFNwb3RMaWdodE5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtMaWdodENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9MaWdodENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFNwb3RMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gU3BvdExpZ2h0IGNyZWF0ZXMgc3BvdCBsaWdodCB0aGF0IGNhbiBjYXN0IHNoYWRvdyBpbiBvbmUgZGlyZWN0aW9uLiA8YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQsIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIHBvcyBhbmQgdGFyZ2V0LiA8YnIvPjxici8+XG4gKiBTcG90TGlnaHQgYWZmZWN0cyBtZXNoZXMgd2l0aCBsYW1iZXJ0IGFuZCBwaG9uZyBtYXRlcmlhbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9saWdodHNfc3BvdGxpZ2h0Lmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxLCBkaXN0YW5jZTogMTAwLCBhbmdsZTogTWF0aC5QSSAvIDMsIGV4cG9uZW50OiAwLCBkZWNheTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcG90TGlnaHQgdGhhdCBmYWxscyBkb3duIGZyb20gdmVjMygxMCwgMjAsIDEwKSB0byB2ZWMzKDAsIDAsIDApPC9jYXB0aW9uPlxuICogbmV3IFNwb3RMaWdodCh7XG4gKiAgIGNvbG9yOiAweDAwZmYwMCxcbiAqICAgaW50ZW5zaXR5OiAzLFxuICogICBkaXN0YW5jZTogMTAwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxLFxuICAgIGRpc3RhbmNlOiAxMDAsXG4gICAgYW5nbGU6IE1hdGguUEkgLyAzLFxuICAgIGV4cG9uZW50OiAwLFxuICAgIGRlY2F5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFNwb3RMaWdodC5kZWZhdWx0cyk7XG4gICAgdGhpcy53cmFwU2hhZG93KCk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IFNwb3RMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMuZGlzdGFuY2UsXG4gICAgICBwYXJhbXMuYW5nbGUsXG4gICAgICBwYXJhbXMuZXhwb25lbnQsXG4gICAgICBwYXJhbXMuZGVjYXlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU3BvdExpZ2h0XG59O1xuIiwiaW1wb3J0IHtSZWN0QXJlYUxpZ2h0IGFzIFJlY3RBcmVhTGlnaHROYXRpdmV9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG5jbGFzcyBBcmVhTGlnaHQgZXh0ZW5kcyBMaWdodENvbXBvbmVudCB7XG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5MaWdodENvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIGNvbG9yOiAweGZmZmZmZixcbiAgICBpbnRlbnNpdHk6IDEsXG4gICAgd2lkdGg6IDEwLFxuICAgIGhlaWdodDogMTBcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgQXJlYUxpZ2h0LmRlZmF1bHRzKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2xpZ2h0OiBuZXcgUmVjdEFyZWFMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMud2lkdGgsXG4gICAgICBwYXJhbXMuaGVpZ2h0XG4gICAgKX0pLmxpZ2h0O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEFyZWFMaWdodFxufTtcbiIsIi8qKiBAbW9kdWxlIGNvbXBvbmVudHMvbGlnaHRzICovXG5leHBvcnQgKiBmcm9tICcuL0FtYmllbnRMaWdodCc7XG5leHBvcnQgKiBmcm9tICcuL0RpcmVjdGlvbmFsTGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9IZW1pc3BoZXJlTGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9Qb2ludExpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vU3BvdExpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vQXJlYUxpZ2h0JztcbiIsImltcG9ydCB7Q3ViZUNhbWVyYSBhcyBDdWJlQ2FtZXJhTmF0aXZlfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQge0NhbWVyYUNvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9DYW1lcmFDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBDdWJlQ2FtZXJhXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyA2IGNhbWVyYXMgdGhhdCByZW5kZXIgdG8gYSBXZWJHTFJlbmRlclRhcmdldEN1YmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0ZXMgYSBDdWJlQ2FtZXJhIGFuZCBzZXQgaXQgYXMgYXBwJ3MgY2FtZXJhPC9jYXB0aW9uPlxuICogY29uc3QgY2FtZXJhID0gbmV3IEN1YmVDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBjdWJlUmVzb2x1dGlvbjogMjU2XG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHg6IDAsXG4gKiAgICAgeTogMTAwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSk7XG4gKlxuICogYXBwLmNhbWVyYSA9IGNhbWVyYTtcbiAqL1xuY2xhc3MgQ3ViZUNhbWVyYSBleHRlbmRzIENhbWVyYUNvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5DdWJlQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGNhbWVyYToge1xuICAgKiAgICAgbmVhcjogMSxcbiAgICogICAgIGZhcjogMTAwMCxcbiAgICogICAgIGN1YmVSZXNvbHV0aW9uOiAxMjhcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5DYW1lcmFDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBuZWFyOiAxLFxuICAgIGZhcjogMTAwMCxcbiAgICBjdWJlUmVzb2x1dGlvbjogMTI4XG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEN1YmVDYW1lcmEuZGVmYXVsdHMpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7Y2FtZXJhOiBuZXcgQ3ViZUNhbWVyYU5hdGl2ZShcbiAgICAgIHBhcmFtcy5uZWFyLFxuICAgICAgcGFyYW1zLmZhcixcbiAgICAgIHBhcmFtcy5jdWJlUmVzb2x1dGlvblxuICAgICl9KS5jYW1lcmE7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ3ViZUNhbWVyYVxufTtcbiIsImltcG9ydCB7T3J0aG9ncmFwaGljQ2FtZXJhIGFzIE9ydGhvZ3JhcGhpY0NhbWVyYU5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtDYW1lcmFDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7c3lzdGVtfSBmcm9tICcuLi8uLi9wb2x5ZmlsbCc7XG5cbi8qKlxuICogQGNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvY2FtZXJhc1xuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuIE9ydGhvZ3JhcGhpY0NhbWVyYSBhbmQgc2V0IGl0IGFzIGFwcCdzIGNhbWVyYTwvY2FwdGlvbj5cbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDUwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cbmNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYSBleHRlbmRzIENhbWVyYUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXMuT3J0aG9ncmFwaGljQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIG5lYXI6IDEsXG4gICAqICAgZmFyOiAxMDAwLFxuICAgKiAgIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICAgKiAgIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICAgKiAgIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gICAqICAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLkNhbWVyYUNvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIG5lYXI6IDEsXG4gICAgZmFyOiAxMDAwLFxuICAgIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICAgIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICAgIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gICAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgT3J0aG9ncmFwaGljQ2FtZXJhLmRlZmF1bHRzKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2NhbWVyYTogbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYU5hdGl2ZShcbiAgICAgIHBhcmFtcy5sZWZ0LFxuICAgICAgcGFyYW1zLnJpZ2h0LFxuICAgICAgcGFyYW1zLnRvcCxcbiAgICAgIHBhcmFtcy5ib3R0b20sXG4gICAgICBwYXJhbXMubmVhcixcbiAgICAgIHBhcmFtcy5mYXJcbiAgICApfSkuY2FtZXJhO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIE9ydGhvZ3JhcGhpY0NhbWVyYVxufTtcbiIsImltcG9ydCB7UGVyc3BlY3RpdmVDYW1lcmEgYXMgUGVyc3BlY3RpdmVDYW1lcmFOYXRpdmV9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q2FtZXJhQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQge3N5c3RlbX0gZnJvbSAnLi4vLi4vcG9seWZpbGwnO1xuXG4vKipcbiAqIEBjbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYVxuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIHBlcnNwZWN0aXZlIHByb2plY3Rpb24uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhc1xuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGUgYW4gUGVyc3BlY3RpdmVDYW1lcmEgYW5kIHNldCBpdCBhcyBhcHAncyBjYW1lcmE8L2NhcHRpb24+XG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICBmb3Y6IDc1LFxuICogICBhc3BlY3Q6IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cbmNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5QZXJzcGVjdGl2ZUNhbWVyYSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBuZWFyOiAxLFxuICAgKiAgIGZhcjogMTAwMCxcbiAgICogICBmb3Y6IDc1LFxuICAgKiAgIGFzcGVjdDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodFxuICAgKiB9PC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgbmVhcjogMSxcbiAgICBmYXI6IDEwMDAsXG4gICAgZm92OiA3NSxcbiAgICBhc3BlY3Q6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHRcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgUGVyc3BlY3RpdmVDYW1lcmEuZGVmYXVsdHMpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7Y2FtZXJhOiBuZXcgUGVyc3BlY3RpdmVDYW1lcmFOYXRpdmUoXG4gICAgICBwYXJhbXMuZm92LFxuICAgICAgcGFyYW1zLmFzcGVjdCxcbiAgICAgIHBhcmFtcy5uZWFyLFxuICAgICAgcGFyYW1zLmZhclxuICAgICl9KS5jYW1lcmE7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUGVyc3BlY3RpdmVDYW1lcmFcbn07XG4iLCIvKiogQG1vZHVsZSBjb21wb25lbnRzL2NhbWVyYXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vQ3ViZUNhbWVyYSc7XG5leHBvcnQgKiBmcm9tICcuL09ydGhvZ3JhcGhpY0NhbWVyYSc7XG5leHBvcnQgKiBmcm9tICcuL1BlcnNwZWN0aXZlQ2FtZXJhJztcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEJveEJ1ZmZlckdlb21ldHJ5LFxuICBCb3hHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgQm94XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBcyB0b2xkIG9uIENvbXBvbmVudCBkZWZpbml0aW9uLCB3aGlsZSB5b3UgY2FuIHBhc3MgYW55IG9mIHRoZSBpbmhlcml0ZWQgcGFyYW1zIGZvciB0aGlzIGNvbXBvbmVudCBjb25zdHJ1Y3Rpb24sIHlvdSB3aWxsIG5lZWQgdG9cbiAqIHBhc3Mgc3BlY2lmaWMgcGFyYW1ldGVycyB0byBidWlsZCB0aGlzIG1lc2ggYXMgYSBnZW9tZXRyeSBvYmplY3QuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0JveEdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBCb3gsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogIG5ldyBCb3goe1xuICogICAgZ2VvbWV0cnk6IHtcbiAqICAgICAgd2lkdGg6IDIsXG4gKiAgICAgIGhlaWdodDogMixcbiAqICAgICAgZGVwdGg6IDJcbiAqICAgIH0sXG4gKlxuICogICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgIGNvbG9yOiAweGZmZmZmZlxuICogICAgfSksXG4gKlxuICogICAgcG9zaXRpb246IFs1MCwgNjAsIDcwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgQm94IGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgd2lkdGg6IDEsXG4gICAqICAgICBoZWlnaHQ6IDEsXG4gICAqICAgICBkZXB0aDogMSxcbiAgICogICAgIHdpZHRoU2VnbWVudHM6IDEsXG4gICAqICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICogICAgIGRlcHRoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICB3aWR0aDogMSxcbiAgICAgIGhlaWdodDogMSxcbiAgICAgIGRlcHRoOiAxLFxuICAgICAgd2lkdGhTZWdtZW50czogMSxcbiAgICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgICAgZGVwdGhTZWdtZW50czogMVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cycsICdkZXB0aFNlZ2VtZW50cyddXG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICdkZXB0aCcsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJywgJ2RlcHRoU2VnZW1lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgQm94LmRlZmF1bHRzLCBCb3guaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQm94XG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBCb3hCdWZmZXJHZW9tZXRyeSA6IEJveEdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS53aWR0aCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGVwdGgsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5kZXB0aFNlZ21lbnRzXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBCb3hcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcbiAgQ2lyY2xlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIENpcmNsZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQXMgdG9sZCBvbiBDb21wb25lbnQgZGVmaW5pdGlvbiwgd2hpbGUgeW91IGNhbiBwYXNzIGFueSBvZiB0aGUgaW5oZXJpdGVkIHBhcmFtcyBmb3IgdGhpcyBjb21wb25lbnQgY29uc3RydWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvXG4gKiBwYXNzIHNwZWNpZmljIHBhcmFtZXRlcnMgdG8gYnVpbGQgdGhpcyBtZXNoIGFzIGEgZ2VvbWV0cnkgb2JqZWN0LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDaXJjbGVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgQ2lyY2xlLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqICBuZXcgQ2lyY2xlKHtcbiAqICAgIGdlb21ldHJ5OiB7XG4gKiAgICAgIHJhZGl1czogNCxcbiAqICAgICAgc2VnbWVudHM6IDE2XG4gKiAgICB9LFxuICpcbiAqICAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgIH0pLFxuICpcbiAqICAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIENpcmNsZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogNTAsXG4gICAqICAgICBzZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogNTAsXG4gICAgICBzZWdtZW50czogOCxcbiAgICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3NlZ21lbnRzJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucyxcbiAgICBnZW9tZXRyeTogWydyYWRpdXMnLCAnc2VnbWVudHMnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIENpcmNsZS5kZWZhdWx0cywgQ2lyY2xlLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNpcmNsZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gQ2lyY2xlQnVmZmVyR2VvbWV0cnkgOiBDaXJjbGVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIENpcmNsZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIENvbmVCdWZmZXJHZW9tZXRyeSxcbiAgQ29uZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBDb25lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDb25lR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIENvbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IENvbmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBDb25lIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMjAsXG4gICAgICBoZWlnaHQ6IDEwMCxcbiAgICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Db25lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbXG4gICAqICAgJ3JhZGl1cycsXG4gICAqICAgJ2hlaWdodCcsXG4gICAqICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICogICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgKiAgICdvcGVuRW5kZWQnLFxuICAgKiAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAndGhldGFMZW5ndGgnXG4gICAqIF1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncmFkaXVzJyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICAgICdoZWlnaHRTZWdtZW50cycsXG4gICAgICAnb3BlbkVuZGVkJyxcbiAgICAgICd0aGV0YVN0YXJ0JyxcbiAgICAgICd0aGV0YUxlbmd0aCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIENvbmUuZGVmYXVsdHMsIENvbmUuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IENvbmVCdWZmZXJHZW9tZXRyeSA6IENvbmVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5vcGVuRW5kZWQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFTdGFydCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50aGV0YUxlbmd0aFxuICAgICk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ29uZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG4gIEN5bGluZGVyR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIEN5bGluZGVyXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDeWxpbmRlckdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBDeWxpbmRlciwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgQ3lsaW5kZXIoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBDeWxpbmRlciBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DeWxpbmRlciNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzVG9wOiAyMCxcbiAgICogICAgIHJhZGl1c0JvdHRvbTogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICByYWRpdXNUb3A6IDAsXG4gICAgICByYWRpdXNCb3R0b206IDEsXG4gICAgICBoZWlnaHQ6IDEsXG4gICAgICByYWRpdXNTZWdtZW50czogMzIsXG4gICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICAgIG9wZW5FbmRlZDogZmFsc2UsXG4gICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ3lsaW5kZXIjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IFtcbiAgICogICAncmFkaXVzVG9wJyxcbiAgICogICAncmFkaXVzQm90dG9tJyxcbiAgICogICAnaGVpZ2h0JyxcbiAgICogICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICdoZWlnaHRTZWdtZW50cycsXG4gICAqICAgJ29wZW5FbmRlZCcsXG4gICAqICAgJ3RoZXRhU3RhcnQnLFxuICAgKiAgICd0aGV0YUxlbmd0aCdcbiAgICogXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdyYWRpdXNUb3AnLFxuICAgICAgJ3JhZGl1c0JvdHRvbScsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdyYWRpdXNTZWdtZW50cycsXG4gICAgICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgICAgJ29wZW5FbmRlZCcsXG4gICAgICAndGhldGFTdGFydCcsXG4gICAgICAndGhldGFMZW5ndGgnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBDeWxpbmRlci5kZWZhdWx0cywgQ3lsaW5kZXIuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkN5bGluZGVyXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IDogQ3lsaW5kZXJHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzVG9wLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1c0JvdHRvbSxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0U2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkub3BlbkVuZGVkLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEN5bGluZGVyXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG4gIERvZGVjYWhlZHJvbkdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBEb2RlY2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIGRvZGVjYWhlZHJvbiBpcyBhbnkgcG9seWhlZHJvbiB3aXRoIHR3ZWx2ZSBmbGF0IGZhY2VzLiA8YnIvPjxici8+XG4gKiBUaGUgbW9zdCBmYW1pbGlhciBkb2RlY2FoZWRyb24gaXMgdGhlIHJlZ3VsYXIgZG9kZWNhaGVkcm9uLCB3aGljaCBpcyBhIFBsYXRvbmljIHNvbGlkLiA8YnIvPlxuICogVGhlcmUgYXJlIGFsc28gdGhyZWUgcmVndWxhciBzdGFyIGRvZGVjYWhlZHJhLCB3aGljaCBhcmUgY29uc3RydWN0ZWQgYXMgc3RlbGxhdGlvbnMgb2YgdGhlIGNvbnZleCBmb3JtLiA8YnIvPlxuICogQWxsIG9mIHRoZXNlIGhhdmUgaWNvc2FoZWRyYWwgc3ltbWV0cnksIG9yZGVyIDEyMC5cbiAqIERvZGVjYWhlZHJvbiBjcmVhdGVzIERvZGVjYWhlZHJvbiBvYmplY3QgYnkgaXQncyByYWRpdXMgYW5kIGRldGFpbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRG9kZWNhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIERvZGVjYWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgRG9kZWNhaGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMTBcbiAqICAgfVxuICAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIERvZGVjYWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IHtcbiAgICogICByYWRpdXM6IDEsXG4gICAqICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIERvZGVjYWhlZHJvbi5kZWZhdWx0cywgRG9kZWNhaGVkcm9uLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Eb2RlY2FoZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBEb2RlY2FoZWRyb25HZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmRldGFpbFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgRG9kZWNhaGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgQnVmZmVyR2VvbWV0cnksXG4gIEV4dHJ1ZGVHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgRXh0cnVkZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gRXh0cnVkZSBnZW9tZXRyeSBtZWFucyB0aGF0IHlvdSBjYW4gY3JlYXRlIGEgM0QgbWVzaCBmcm9tIGFueSAyRCBzaGFwZSB1c2luZyB0aHJlZS5qcyBnZW9tZXRyeSBiYXNlZCBvbiA8YSBocmVmPSdodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9tYXRoL1ZlY3RvcjInPlRIUkVFLlZlY3RvcjIuPC9hPiA8YnIvPlxuICogU3VjaCBpbXBsZW1lbnRhdGlvbiB3aWxsIGhlbHAgeW91IHRvIG1ha2Ugdm9sdW1lZCBzaGFwZXMgdGhhdCBoYXZlIHRoZWlyIG93biBkZXB0aCBhbmQgY2FuIGJlIHNlZW4gZnJvbSBhbGwgYW5nZWxzLjxici8+PGJyLz5cbiAqIFlvdSBjYW4gYWxzbyBmaW5kIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgbWFkZSB1c2luZyA8YSBocmVmPSd0aHJlZWpzLm9yZyc+dGhyZWUuanM8L2E+IHdoaWNoIGlzIGEgY29yZSBvZiB3aHMuanMsIHN1Y2ggYXM6XG4gKiAtIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9nZW9tZXRyeV9leHRydWRlX3NoYXBlcy5odG1sJz5XZWJnbCBnZW9tZXRyeSBleHRydWRlPC9hPlxuICogLSA8YSBocmVmPSdodHRwOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfZ2VvbWV0cnlfZXh0cnVkZV9zaGFwZXMyLmh0bWwnPkV4dHJ1ZGUgc2hhcGVzIGZyb20gZ2VvZGF0YTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cDovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2dlb21ldHJ5X2V4dHJ1ZGVfc3BsaW5lcy5odG1sJz5FeHRydWRlIHNwbGluZXM8L2E+XG4gKlxuICogU3VjaCBleGFtcGxlcyBjYW4gYmUgZWFzaWx5IGltcGxlbWVudGVkIHVzaW5nIHdoaXRlc3Rvcm0uanMgb3IgaXQncyBwbHVnaW5zLiBVc2UgYEV4dHJ1ZGVgIGNsYXNzIHdpdGggPGEgaHJlZj0naHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvZXh0cmFzL2NvcmUvU2hhcGUnPlRIUkVFLlNoYXBlPC9hPiB0byBnZXQgZXh0cnVkZSBlZmZlY3Qgb2Ygc2hhcGUgZGVmaW5lZCBieSAyRCB2ZWN0b3JzLlxuICogVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2dlb21ldHJpZXMvRXh0cnVkZUdlb21ldHJ5Jz5USFJFRS5FeHRydWRlR2VvbWV0cnk8L2E+LFxuICogYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIHByb3BlcnRpZXMsIGFwcGxpZWQgYnkgYFNoYXBlYCwgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRXh0cnVkZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBzaGFwZSwgdGhlbiBhbiBFeHRydWRlIGZyb20gaXQ8L2NhcHRpb24+XG4gKiBjb25zdCBzaGFwZSA9IG5ldyBUSFJFRS5TaGFwZShbXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoLTIsMCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigwLDIpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigyLDApLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoMCwtMilcbiAqIF0pO1xuICpcbiAqIGNvbnN0IGV4dHJ1ZGUgPSBuZXcgRXh0cnVkZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGVzOiBzaGFwZSxcbiAqICAgICBvcHRpb25zOiB7XG4gKiAgICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICogICAgICAgYmV2ZWxTaXplOiAwLFxuICogICAgICAgYW1vdW50OiAyXG4gKiAgICAgfVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KTtcbiAqXG4gKiBleHRydWRlLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIEV4dHJ1ZGUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkV4dHJ1ZGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW10sXG4gICAqICAgICBvcHRpb25zOiB7fVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaGFwZXM6IFtdLFxuICAgICAgb3B0aW9uczoge31cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5FeHRydWRlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydzaGFwZXMnLCAnb3B0aW9ucyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3NoYXBlcycsICdvcHRpb25zJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgRXh0cnVkZS5kZWZhdWx0cywgRXh0cnVkZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRXh0cnVkZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEV4dHJ1ZGVHZW9tZXRyeShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zaGFwZXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkub3B0aW9uc1xuICAgICk7XG5cbiAgICByZXR1cm4gcGFyYW1zLmJ1ZmZlciA/IG5ldyBCdWZmZXJHZW9tZXRyeSgpLmZyb21HZW9tZXRyeShnZW9tZXRyeSkgOiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBFeHRydWRlXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgSWNvc2FoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgSWNvc2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhbiBpY29zYWhlZHJvbiBpcyBhIHBvbHloZWRyb24gd2l0aCAyMCBmYWNlcy48YnIvPlxuICogVGhlcmUgYXJlIG1hbnkga2luZHMgb2YgaWNvc2FoZWRyYSwgd2l0aCBzb21lIGJlaW5nIG1vcmUgc3ltbWV0cmljYWwgdGhhbiBvdGhlcnMuIFRoZSBtb3N0IHdlbGwga25vd24gaXMgdGhlIFBsYXRvbmljLCBjb252ZXggcmVndWxhciBpY29zYWhlZHJvbi48YnIvPlxuICogYEljb3NhaGVkcm9uYCBjcmVhdGVzIGFuIEljb3NhaGVkcm9uIG9iamVjdCBieSBpdHMgcmFkaXVzIGFuZCBkZXRhaWwuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0ljb3NhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEljb3NhaGVkcm9uLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBJY29zYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBJY29zYWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSWNvc2FoZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMSxcbiAgICogICAgIGRldGFpbDogMFxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMSxcbiAgICAgIGRldGFpbDogMFxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IHtnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ119XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBJY29zYWhlZHJvbi5kZWZhdWx0cywgSWNvc2FoZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBJY29zYWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBJY29zYWhlZHJvblxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIExhdGhlQnVmZmVyR2VvbWV0cnksXG4gIExhdGhlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIExhdGhlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGBMYXRoZUdlb21ldHJ5YCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBzaGFwZXMgZnJvbSBhIHNtb290aCBjdXJ2ZS5cbiAqIFRoaXMgY3VydmUgaXMgZGVmaW5lZCBieSBhIG51bWJlciBvZiBwb2ludHMgKGFsc28gY2FsbGVkIGtub3RzKSBhbmQgaXMgbW9zdCBvZnRlbiBjYWxsZWQgYSBzcGxpbmUuIFRoaXMgc3BsaW5lIGlzIHJvdGF0ZWQgYXJvdW5kIGEgZml4ZWQgcG9pbnQgYW5kIHJlc3VsdHMgaW4gdmFzZS0gYW5kIGJlbGwtbGlrZSBzaGFwZXMuPGJyLz48YnIvPlxuICogSW4gM0QgY29tcHV0ZXIgZ3JhcGhpY3MsIGEgbGF0aGVkIG9iamVjdCBpcyBhIDNEIG1vZGVsIHdob3NlIHZlcnRleCBnZW9tZXRyeSBpcyBwcm9kdWNlZCBieSByb3RhdGluZyB0aGUgcG9pbnRzIG9mIGEgc3BsaW5lIG9yIG90aGVyIHBvaW50IHNldCBhcm91bmQgYSBmaXhlZCBheGlzLlxuICogVGhlIGxhdGhpbmcgbWF5IGJlIHBhcnRpYWw7IHRoZSBhbW91bnQgb2Ygcm90YXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGEgZnVsbCAzNjAgZGVncmVlcy5cbiAqIFRoZSBwb2ludCBzZXQgcHJvdmlkaW5nIHRoZSBpbml0aWFsIHNvdXJjZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgY3Jvc3Mgc2VjdGlvbiB0aHJvdWdoIHRoZSBvYmplY3QgYWxvbmcgYSBwbGFuZSBjb250YWluaW5nIGl0cyBheGlzIG9mIHJhZGlhbCBzeW1tZXRyeS4gPGJyLz48YnIvPlxuICogVGhlIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjTGF0aGVHZW9tZXRyeSc+Zm9sbG93aW5nIGV4YW1wbGU8L2E+IHNob3dzIGEgZ2VvbWV0cnkgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCB1c2luZyBgTGF0aGVgIGNsYXNzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNMYXRoZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMYXRoLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHBvaW50cyA9IFtdO1xuICpcbiAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICogICBwb2ludHMucHVzaChcbiAqICAgICBuZXcgVEhSRUUuVmVjdG9yMihcbiAqICAgICAgIChNYXRoLnNpbihpICogMC43KSAqIDE1ICsgNTApIC8gMTAsXG4gKiAgICAgICAoaSAtIDUpICogMC4yXG4gKiAgICAgKVxuICogICApO1xuICogfVxuICpcbiAqIGNvbnN0IGxhdGhlID0gbmV3IExhdGhlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwb2ludHM6IHBvaW50c1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCA1MCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBMYXRoZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBvaW50czogW11cbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcG9pbnRzOiBbXVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxhdGhlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3BvaW50cyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIExhdGhlLmRlZmF1bHRzLCBMYXRoZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gTGF0aGVCdWZmZXJHZW9tZXRyeSA6IExhdGhlR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnBvaW50c1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgTGF0aGVcbn07XG4iLCJpbXBvcnQge1xuICBMaW5lIGFzIExpbmVOYXRpdmUsXG4gIEJ1ZmZlckdlb21ldHJ5LFxuICBHZW9tZXRyeSxcbiAgQnVmZmVyQXR0cmlidXRlLFxuICBMaW5lQ3VydmUzLFxuICBWZWN0b3IzXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBMaW5lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBMaW5lIGNvbXBvbmVudCBpcyBnZW5lcmF0ZWQgZnJvbSBhIGN1cnZlL2xpbmUgYW5kIGFtb3VudCBvZiB2ZWN0b3JzIHRoYXQgc2hvdWxkIGJlIHVzZWQgKHBvaW50cykuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMaW5lLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBMaW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBjdXJ2ZTogbmV3IFRIUkVFLkxpbmVDdXJ2ZTMobmV3IFRIUkVFLlZlY3RvcjMoMTAsIDEwLCAwKSwgbmV3IFRIUkVFLlZlY3RvcjMoMTAsIDMwLCAwKSlcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgTGluZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGluZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBjdXJ2ZTogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDEwLCAwLCAwKSksXG4gICAqICAgcG9pbnRzOiA1MFxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjdXJ2ZTogbnVsbCxcbiAgICBwb2ludHM6IDUwXG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MaW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBMaW5lLmRlZmF1bHRzLCBMaW5lLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxpbmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTGluZU5hdGl2ZShnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHBhcmFtcy5idWZmZXIgPyBuZXcgQnVmZmVyR2VvbWV0cnkoKSA6IG5ldyBHZW9tZXRyeSgpO1xuXG4gICAgaWYgKHBhcmFtcy5idWZmZXIpIHtcbiAgICAgIGNvbnN0IHBwID0gcGFyYW1zLmN1cnZlLmdldFBvaW50cyhwYXJhbXMucG9pbnRzKTtcbiAgICAgIGNvbnN0IHZlcnRzID0gbmV3IEZsb2F0MzJBcnJheShwcC5sZW5ndGggKiAzKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IHBwLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGkzID0gaSAqIDM7XG5cbiAgICAgICAgdmVydHNbaTNdID0gcHBbaV0ueDtcbiAgICAgICAgdmVydHNbaTMgKyAxXSA9IHBwW2ldLnk7XG4gICAgICAgIHZlcnRzW2kzICsgMl0gPSBwcFtpXS56O1xuICAgICAgfVxuXG4gICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0cywgMykpO1xuICAgIH0gZWxzZSBnZW9tZXRyeS52ZXJ0aWNlcyA9IHBhcmFtcy5jdXJ2ZS5nZXRQb2ludHMocGFyYW1zLnBvaW50cyk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgTGluZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEpTT05Mb2FkZXIsXG4gIFNraW5uZWRNZXNoXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBJbXBvcnRlclxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW1wb3J0ZXIgaXMgYSBsb2FkZXIgZm9yIG1lc2hlcyBhbmQgYW55IG90aGVyIGRhdGEgdG8geW91ciBzY2VuZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSW1wb3J0ZXIsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgbG9hZGVyOiBuZXcgVEhSRUUuT0JKTG9hZGVyKCksXG4gKlxuICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFsKSB7IC8vIGRhdGEgZnJvbSBsb2FkZXJcbiAqICAgICByZXR1cm4gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsgLy8gc2hvdWxkIHJldHVybiB5b3VyIC5uYXRpdmUgKG1lc2ggaW4gdGhpcyBjYXNlKVxuICogICB9LFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBJbXBvcnRlciBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlciNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICB1cmw6ICcnLFxuICAgKiAgIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcbiAgICpcbiAgICogICBvbkxvYWQoKSB7fSxcbiAgICogICBvblByb2dyZXNzKCkge30sXG4gICAqICAgb25FcnJvcigpIHt9LFxuICAgKlxuICAgKiAgIHRleHR1cmVQYXRoOiBudWxsLFxuICAgKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcbiAgICpcbiAgICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFscykge1xuICAgKiAgICAgcmV0dXJuIG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbHMpO1xuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICB1cmw6ICcnLFxuICAgIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcblxuICAgIG9uTG9hZCgpIHt9LFxuICAgIG9uUHJvZ3Jlc3MoKSB7fSxcbiAgICAvLyBUT0RPIGFkZCBvbkNvbXBsZXRlP1xuICAgIG9uRXJyb3IoKSB7fSxcblxuICAgIHRleHR1cmVQYXRoOiBudWxsLFxuICAgIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcblxuICAgIHBhcnNlcihnZW9tZXRyeSwgbWF0ZXJpYWwpIHtcbiAgICAgIGNvbnN0IHtnZW9tZXRyeTogZ2VvbSwgbWF0ZXJpYWw6IG1hdH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtnZW9tZXRyeSwgbWF0ZXJpYWx9KTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBnZW9tLmJvbmVzID8gbmV3IFNraW5uZWRNZXNoKGdlb20sIG1hdCkgOiBuZXcgTWVzaChnZW9tLCBtYXQpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zXG4gIH07XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZmlsdGVyXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHZhbHVlcyBmb3IgZmlsdGVyXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtUSFJFRS5NZXNofSBvYmplY3QgSW5zdGFuY2UgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIGl0J3MgY2hpbGRyZW4uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlciBGdW5jdGlvbiB3aXRoIGNoaWxkIGFzIGFyZ3VtZW50LCBzaG91bGQgcmV0dXJuIGEgYm9vbGVhbiB3aGV0aGVyIGluY2x1ZGUgdGhlIGNoaWxkIG9yIG5vdC5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gb2JqZWN0IHdpdGggY2hpbGRyZW5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5SZW1vdmluZyB1bm5lY2Vzc2FyeSBsaWdodHMgZnJvbSBjaGlsZHJlbjwvY2FwdGlvbj5cbiAgICogbmV3IEltcG9ydGVyKHtcbiAgICogICBsb2FkZXI6IG5ldyBUSFJFRS5PQkpMb2FkZXIoKSxcbiAgICpcbiAgICogICBwYXJzZShncm91cCkgeyAvLyBkYXRhIGZyb20gbG9hZGVyXG4gICAqICAgICByZXR1cm4gSW1wb3J0ZXIuZmlsdGVyKGdyb3VwLCBjaGlsZCA9PiAhY2hpbGQuaXNMaWdodCk7IC8vIHJlbW92ZSBsaWdodHNcbiAgICogICB9LFxuICAgKlxuICAgKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICAgKiB9KS5hZGRUbyhhcHApO1xuICAgKi9cbiAgc3RhdGljIGZpbHRlcihvYmplY3QsIGZpbHRlcikge1xuICAgIGNvbnN0IHByb2Nlc3NGaWx0ZXIgPSBvYmplY3QgPT4ge1xuICAgICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goKGVsLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoZWwuY2hpbGRyZW4pIHByb2Nlc3NGaWx0ZXIoZWwpO1xuICAgICAgICBpZiAoIWZpbHRlcihlbCkpIG9iamVjdC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfTtcblxuICAgIHJldHVybiBwcm9jZXNzRmlsdGVyKG9iamVjdCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgSW1wb3J0ZXIuZGVmYXVsdHMsIEltcG9ydGVyLmluc3RydWN0aW9ucywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnRleHR1cmVQYXRoKSBwYXJhbXMubG9hZGVyLnNldFRleHR1cmVQYXRoKHBhcmFtcy50ZXh0dXJlUGF0aCk7XG5cbiAgICAgIHBhcmFtcy5sb2FkZXIubG9hZChwYXJhbXMudXJsLCAoLi4uZGF0YSkgPT4geyAvLyBnZW9tZXRyeSwgbWF0ZXJpYWxzXG4gICAgICAgIHBhcmFtcy5vbkxvYWQoLi4uZGF0YSk7XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gcGFyYW1zLnBhcnNlci5hcHBseSh0aGlzLCBkYXRhKTtcbiAgICAgICAgaWYgKHBhcmFtcy5tYXRlcmlhbCkgb2JqZWN0Lm1hdGVyaWFsID0gdGhpcy5hcHBseUJyaWRnZSh7bWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbH0pLm1hdGVyaWFsO1xuXG4gICAgICAgIHJlc29sdmUob2JqZWN0KTtcbiAgICAgIH0sIHBhcmFtcy5vblByb2dyZXNzLCBwYXJhbXMub25FcnJvcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSW1wb3J0ZXJcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG4gIE9jdGFoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgT2N0YWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZ2VvbWV0cnksIGFuIG9jdGFoZWRyb24gaXMgYSBwb2x5aGVkcm9uIHdpdGggZWlnaHQgZmFjZXMuXG4gKiBBIHJlZ3VsYXIgb2N0YWhlZHJvbiBpcyBhIFBsYXRvbmljIHNvbGlkIGNvbXBvc2VkIG9mIGVpZ2h0IGVxdWlsYXRlcmFsIHRyaWFuZ2xlcywgZm91ciBvZiB3aGljaCBtZWV0IGF0IGVhY2ggdmVydGV4LlxuICogPGJyLz48YnIvPlxuICogYE9jdGFoZWRyb25gIGNyZWF0ZXMgYW4gT2N0YWhlZHJvbiBvYmplY3QgYnkgaXRzIGByYWRpdXNgIGFuZCBgZGV0YWlsYC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjT2N0YWhlZHJvbkdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gT2N0YWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgT2N0YWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBPY3RhaGVkcm9uIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5PY3RhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEsXG4gICAqICAgICBkZXRhaWw6IDBcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIE9jdGFoZWRyb24uZGVmYXVsdHMsIE9jdGFoZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLk9jdGFoZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogT2N0YWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBPY3RhaGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LFxuICBQYXJhbWV0cmljR2VvbWV0cnksXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFBhcmFtZXRyaWNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIGBQYXJhbWV0cmljYCBnZW5lcmF0ZXMgYSBnZW9tZXRyeSByZXByZXNlbnRpbmcgYSA8YSBocmVmPSdodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJhbWV0cmljX3N1cmZhY2UnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIDxici8+PGJyLz5cbiAqIEl0IGlzIHVzdWFsbHkgdXNlZCB0byBkZXZlbG9wIGRpZmZlcmVudCBraW5kcyBvZiBoaWdoZmllbGRzIG9yIHZpc3VhbGl6ZSBhIDxhIGhyZWY9J2h0dHBzOi8vc3RlbWtvc2tpLmdpdGh1Yi5pby9UaHJlZS5qcy9HcmFwaHVsdXMtRnVuY3Rpb24uaHRtbCc+bWF0aCBmdW5jdGlvbjwvYT4uXG4gKiA8YnIvPlxuICogLSA8YSBocmVmPSdodHRwOi8vbWF0aC5od3MuZWR1L2dyYXBoaWNzYm9vay9zb3VyY2UvdGhyZWVqcy9jdXJ2ZXMtYW5kLXN1cmZhY2VzLmh0bWwnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cHM6Ly9zdGVta29za2kuZ2l0aHViLmlvL1RocmVlLmpzL0dyYXBodWx1cy1TdXJmYWNlLmh0bWwnPlwiR3JhcGh1bHVzXCI8L2E+XG4gKiA8YnIvPjxici8+XG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1BhcmFtZXRyaWNHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV4YW1wbGUgY3JlYXRpbmcgYW4gaGVpZ2h0ZmllbGQtbGlrZSBnZW9tZXRyeS4gYHVgIGFuZCBgdmAgYXJlIGxpa2UgYHhgIGFuZCBgeWAgaW4gc2hhcGUsIGJ1dCB0aGVpciB2YWx1ZXMgYXJlIGFsd2F5cyBmcm9tIGAwYCB0byBgMWAuXG4gKiBXZSB1c2UgdGhlbSBpbiBgVEhSRUUuVmVjdG9yM2AgbGlrZSBgeGAgYW5kIGB6YCBhbmQgYE1hdGgucmFuZG9tKCkgKiA1YCBmb3IgYHlgLjwvY2FwdGlvbj5cbiAqIGNvbnN0IGNyZWF0ZVBhcmFtZXRyaWMgPSAodSwgdikgPT4ge1xuICogICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjModSAqIDMwLCBNYXRoLnJhbmRvbSgpICogNSwgdiAqIDMwKTtcbiAqIH1cbiAqXG4gKiBuZXcgUGFyYW1ldHJpYyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgZnVuYzogY3JlYXRlUGFyYW1ldHJpY1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgICAgc2lkZTogVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAtMTAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUGFyYW1ldHJpYyBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGFyYW1ldHJpYyNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgZnVuYzogKHUsIHYpID0+IG5ldyBWZWN0b3IzKHUsIHYsIDApLFxuICAgKiAgICAgc2xpY2VzOiAxMCxcbiAgICogICAgIHRhY2tzOiAxMFxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBmdW5jOiAodSwgdikgPT4gbmV3IFZlY3RvcjModSwgdiwgMCksXG4gICAgICBzbGljZXM6IDEwLFxuICAgICAgc3RhY2tzOiAxMFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBQYXJhbWV0cmljLmRlZmF1bHRzLCBQYXJhbWV0cmljLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBhcmFtZXRyaWNcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5IDogUGFyYW1ldHJpY0dlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5mdW5jLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNsaWNlcyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zdGFja3NcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhcmFtZXRyaWNcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBQbGFuZUJ1ZmZlckdlb21ldHJ5LFxuICBQbGFuZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBQbGFuZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gYFBsYW5lYCBpcyB1c2VkIGZvciBjcmVhdGluZyBwbGFuZXMgZ2l2ZW4gc29tZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjUGxhbmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUGxhbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBsYW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICB3aWR0aDogMjAsXG4gKiAgICAgaGVpZ2h0OiAzMFxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBQbGFuZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGxhbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHdpZHRoOiAxMCxcbiAgICogICAgIGhlaWdodDogMTAsXG4gICAqICAgICB3U2VnbWVudHM6IDEsXG4gICAqICAgICBoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgd2lkdGg6IDEwLFxuICAgICAgaGVpZ2h0OiAxMCxcbiAgICAgIHdTZWdtZW50czogMSxcbiAgICAgIGhTZWdtZW50czogMVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBsYW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnd1NlZ21lbnRzJywgJ2hTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICd3U2VnbWVudHMnLCAnaFNlZ21lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgUGxhbmUuZGVmYXVsdHMsIFBsYW5lLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QbGFuZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gUGxhbmVCdWZmZXJHZW9tZXRyeSA6IFBsYW5lR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LndpZHRoLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS53U2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuaFNlZ21lbnRzXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQbGFuZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgUG9seWhlZHJvbkdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG5jb25zdCBbdmVydGljZXNPZkN1YmUsIGluZGljZXNPZkZhY2VzXSA9IFtcbiAgW1xuICAgIC0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSxcbiAgICAtMSwgLTEsIDEsIDEsIC0xLCAxLCAxLCAxLCAxLCAtMSwgMSwgMVxuICBdLFxuICBbXG4gICAgMiwgMSwgMCwgMCwgMywgMixcbiAgICAwLCA0LCA3LCA3LCAzLCAwLFxuICAgIDAsIDEsIDUsIDUsIDQsIDAsXG4gICAgMSwgMiwgNiwgNiwgNSwgMSxcbiAgICAyLCAzLCA3LCA3LCA2LCAyLFxuICAgIDQsIDUsIDYsIDYsIDcsIDRcbiAgXVxuXTtcblxuLyoqXG4gKiBAY2xhc3MgUG9seWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZWxlbWVudGFyeSBnZW9tZXRyeSwgYSBwb2x5aGVkcm9uIGlzIGEgc29saWQgaW4gdGhyZWUgZGltZW5zaW9ucyB3aXRoIGZsYXQgcG9seWdvbmFsIGZhY2VzLCBzdHJhaWdodCBlZGdlcyBhbmQgc2hhcnAgY29ybmVycyBvciB2ZXJ0aWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBQb2x5aGVkcm9uYCBjcmVhdGVzIGEgUG9seWhlZHJvbiBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgLlxuICogPGJyLz48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIFBvbHloZWRyb24sIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBvbHloZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMixcbiAqICAgICBkZXRhaWw6IDFcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUG9seWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICBzdGF0aWMgdmVydGljZXNPZkN1YmUgPSB2ZXJ0aWNlc09mQ3ViZTtcbiAgc3RhdGljIGluZGljZXNPZkZhY2VzID0gaW5kaWNlc09mRmFjZXM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHZlcnRpY2VzT2ZDdWJlOiBbXG4gICAqICAgICAgIC0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSxcbiAgICogICAgICAgLTEsIC0xLCAxLCAxLCAtMSwgMSwgMSwgMSwgMSwgLTEsIDEsIDFcbiAgICogICAgIF0sXG4gICAqXG4gICAqICAgICBpbmRpY2VzT2ZGYWNlczogW1xuICAgKiAgICAgICAyLCAxLCAwLCAwLCAzLCAyLFxuICAgKiAgICAgICAwLCA0LCA3LCA3LCAzLCAwLFxuICAgKiAgICAgICAwLCAxLCA1LCA1LCA0LCAwLFxuICAgKiAgICAgICAxLCAyLCA2LCA2LCA1LCAxLFxuICAgKiAgICAgICAyLCAzLCA3LCA3LCA2LCAyLFxuICAgKiAgICAgICA0LCA1LCA2LCA2LCA3LCA0XG4gICAqICAgICBdLFxuICAgKlxuICAgKiAgICAgcmFkaXVzOiA2LFxuICAgKiAgICAgZGV0YWlsOiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHZlcnRpY2VzT2ZDdWJlLFxuICAgICAgaW5kaWNlc09mRmFjZXMsXG4gICAgICByYWRpdXM6IDYsXG4gICAgICBkZXRhaWw6IDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Qb2x5aGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd2ZXJ0aWNlc09mQ3ViZScsICdpbmRpY2VzT2ZGYWNlcycsICdyYWRpdXMnLCAnZGV0YWlsJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFsndmVydGljZXNPZkN1YmUnLCAnaW5kaWNlc09mRmFjZXMnLCAncmFkaXVzJywgJ2RldGFpbCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFBvbHloZWRyb24uZGVmYXVsdHMsIFBvbHloZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogUG9seWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS52ZXJ0aWNlc09mQ3ViZSxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5pbmRpY2VzT2ZGYWNlcyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQb2x5aGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgUmluZ0dlb21ldHJ5LFxuICBSaW5nQnVmZmVyR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFJpbmdcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFJpbmcgY2xhc3MgY3JlYXRlcyBhIGNpcmNsZSBvciBqdXN0IDJEIFRvcnVzLiBEb2VzIG5vdCBzdXBwb3J0IHBoeXNpY3MuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1JpbmdHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUmluZywgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgUmluZyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgaW5uZXJSYWRpdXM6IDUsXG4gKiAgICAgb3V0ZXJSYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgIHNpZGUgVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgOCwgMF0sXG4gKlxuICogICByb3RhdGlvbjoge1xuICogICAgIHg6IE1hdGguUEkvNFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBSaW5nIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5SaW5nI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBpbm5lclJhZGl1czogMCxcbiAgICogICAgIG91dGVyUmFkaXVzOiA1MCxcbiAgICogICAgIHRoZXRhU2VnbWVudHM6IDgsXG4gICAqICAgICBwaGlTZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgaW5uZXJSYWRpdXM6IDAsXG4gICAgICBvdXRlclJhZGl1czogNTAsXG4gICAgICB0aGV0YVNlZ21lbnRzOiA4LFxuICAgICAgcGhpU2VnbWVudHM6IDgsXG4gICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUmluZyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdpbm5lclJhZGl1cycsXG4gICAqICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgKiAgICAgJ3RoZXRhU2VnbWVudHMnLFxuICAgKiAgICAgJ3BoaVNlZ21lbnRzJyxcbiAgICogICAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAgICd0aGV0YUxlbmd0aCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgICAgJ3RoZXRhU2VnbWVudHMnLFxuICAgICAgJ3BoaVNlZ21lbnRzJyxcbiAgICAgICd0aGV0YVN0YXJ0JyxcbiAgICAgICd0aGV0YUxlbmd0aCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFJpbmcuZGVmYXVsdHMsIFJpbmcuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlJpbmdcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUmluZ0J1ZmZlckdlb21ldHJ5IDogUmluZ0dlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5pbm5lclJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5vdXRlclJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50aGV0YVNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnBoaVNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFJpbmdcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBTaGFwZUJ1ZmZlckdlb21ldHJ5LFxuICBTaGFwZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBTaGFwZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU2hhcGUgaXMgYSB1bml2ZXJzYWwgY2xhc3MuIEl0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGRpZmZlcmVudCAyRCBzaGFwZXMgaW4gM0Qgc2NlbmUuPGJyLz5cbiAqIFVuZm9ydHVuYXRlbHksIG5vdCBhbGwgb2YgdGhlbSBzdXBwb3J0IHBoeXNpY3MsIGFuIGFsdGVybmF0aXZlIGlzIHRvIG1ha2UgYSBzaW1pbGFyIDNEIG9iamVjdCBhbmQgc2NhbGUgaXRzIHdpZHRoIGRvd24gdG8gbmVhciB6ZXJvLlxuICogPGJyLz48YnIvPlxuICogYFNoYXBlYCBjb25zaXN0cyBvZiBzaGFwZXMgdGhhdCBhcmUgaW4gaXRzIHNoYXBlcyBwYXJhbWV0ZXIuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NoYXBlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIHBsYW5lIGxvb2tpbmcgU2hhcGUgZnJvbSBhIFRIUkVFLlNoYXBlLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHJlY3RXaWR0aCA9IDEwLFxuICogcmVjdExlbmd0aCA9IDU7XG4gKlxuICogY29uc3QgcmVjdFNoYXBlID0gbmV3IFRIUkVFLlNoYXBlKCk7XG4gKiByZWN0U2hhcGUubW92ZVRvKDAsMCk7XG4gKiByZWN0U2hhcGUubGluZVRvKDAsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIDApO1xuICogcmVjdFNoYXBlLmxpbmVUbygwLCAwKTtcbiAqXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBTaGFwZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGU6IHJlY3RTaGFwZVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBTaGFwZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaGFwZXM6IFtdXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFNoYXBlLmRlZmF1bHRzLCBTaGFwZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gU2hhcGVCdWZmZXJHZW9tZXRyeSA6IFNoYXBlR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNoYXBlc1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU2hhcGVcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBTcGhlcmVCdWZmZXJHZW9tZXRyeSxcbiAgU3BoZXJlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFNwaGVyZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU3BoZXJlIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHNwaGVyZSBvYmplY3RzIGJ5IGl0cyByYWRpdXMgcHJvcGVydHkgYW5kIG90aGVyIHZhbHVlcyB0aGF0IGRldGVybWluZXMgaXRzIGRldGFsaXR5LlxuICogPGJyLz48YnIvPlxuICogSXQgaXMgc2ltaWxhciB0byBUSFJFRS5TcGhlcmVHZW9tZXRyeSwgYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIGBTaGFwZWAgcHJvcGVydGllcywgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIDxici8+PGJyLz5cbiAqIFRoZW4gaXQgY3JlYXRlcyBhbiBgVGhyZWUuanMgbWVzaGAgb3IgYSBgUGh5c2lqcyBtZXNoYCwgdGhhdCBpcyBzaW1pbGFyIHRvIGBUaHJlZS5qcyBtZXNoYCwgYnV0IGl0IGFsc28gdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gY29sbGlzaW9uIGNhbGN1bGF0aW9ucy5cbiAqIFRoaXMgbWVzaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGBUaHJlZS5qcyBnZW9tZXRyeWAgYW5kIGBQaHlzaWpzIG1hdGVyaWFsYCAoVGhlIHNhbWUgYXMgaW4gdGhyZWUuanMsIGJ1dCB3aXRoIGZyaWN0aW9uIGFuZCByZXN0aXR1dGlvbikuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NwaGVyZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcGhlcmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFNwaGVyZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDEwMFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBTcGhlcmUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNwaGVyZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgd2lkdGhTZWdtZW50czogOCxcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgd2lkdGhTZWdtZW50czogOCxcbiAgICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydyYWRpdXMnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgU3BoZXJlLmRlZmF1bHRzLCBTcGhlcmUuaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBTcGhlcmVCdWZmZXJHZW9tZXRyeSA6IFNwaGVyZUdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50c1xuICAgICk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU3BoZXJlXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgVGV0cmFoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgVGV0cmFoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIHRldHJhaGVkcm9uIGlzIGEgcG9seWhlZHJvbiBjb21wb3NlZCBvZiBmb3VyIHRyaWFuZ3VsYXIgZmFjZXMsIHNpeCBzdHJhaWdodCBlZGdlcywgYW5kIGZvdXIgdmVydGV4IGNvcm5lcnMuXG4gKiBUaGUgdGV0cmFoZWRyb24gaXMgdGhlIHNpbXBsZXN0IG9mIGFsbCB0aGUgb3JkaW5hcnkgY29udmV4IHBvbHloZWRyYSBhbmQgdGhlIG9ubHkgb25lIHRoYXQgaGFzIGZld2VyIHRoYW4gNSBmYWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBUZXRyYWhlZHJvbmAgY3JlYXRlcyBhIFRldHJhaGVkcm9uIG9iamVjdCBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1RldHJhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRldHJhaGVkcm9uLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXRyYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIFRldHJhaGVkcm9uIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV0cmFoZWRyb24jaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucyxcbiAgICBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgVGV0cmFoZWRyb24uZGVmYXVsdHMsIFRldHJhaGVkcm9uLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvblxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogVGV0cmFoZWRyb25HZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmRldGFpbFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgVGV0cmFoZWRyb25cbn07XG4iLCJpbXBvcnQge1xuICBGb250LFxuICBNZXNoLFxuICBUZXh0R2VvbWV0cnksXG4gIEZvbnRMb2FkZXJcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFRleHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRleHQgY2xhc3MgaXMgbWFkZSBmb3IgY3JlYXRpbmcgM0QgdGV4dCBvYmplY3RzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNUZXh0R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIDxici8+PGJyLz5cbiAqIFBoeXNpY3MgdGV4dCBvYmplY3QgY2FuIGJlIGNvbnZleCBvciBjb25jYXZlLiBCeSBkZWZhdWx0IGl0J3MgY29udmV4IGJ1dCB5b3UgY2FuIGFsc28gc3dpdGNoIHRvIGNvbmNhdmUuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUZXh0LCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXh0KHtcbiAqICAgICB0ZXh0OiAnU29tZSB0ZXh0JyxcbiAqICAgICBwYXJhbWV0ZXJzOiB7XG4gKiAgICAgICBmb250OiAncGF0aC90by9mb250LnR5cGVmYWNlLmpzJyxcbiAqICAgICAgIHNpemU6IDIwLFxuICogICAgICAgaGVpZ2h0OiA1LFxuICogICAgICAgY3VydmVTZWdtZW50czogNlxuICogICAgIH1cbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeDogLTQwLFxuICogICAgIHk6IDIwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVGV4dCBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICB0ZXh0OiAnSGVsbG8gV29ybGQhJyxcbiAgICogICBmb250OiBudWxsLFxuICAgKlxuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBzaXplOiAxMixcbiAgICogICAgIGhlaWdodDogNTAsXG4gICAqICAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICogICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAqICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgKiAgICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgKiAgICAgYmV2ZWxTaXplOiA4XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgdGV4dDogJ0hlbGxvIFdvcmxkIScsXG4gICAgZm9udDogbnVsbCxcblxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaXplOiAxMixcbiAgICAgIGhlaWdodDogNTAsXG4gICAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgICAgYmV2ZWxTaXplOiA4XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnNcbiAgfTtcblxuICAvKipcbiAgICogRGVmYXVsdCBGb250TG9hZGVyXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRleHQjbG9hZGVyXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgbmV3IEZvbnRMb2FkZXIoKVxuICAgKi9cbiAgc3RhdGljIGxvYWRlciA9IG5ldyBGb250TG9hZGVyKCk7XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbG9hZFxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBsb2FkKCkgcHJlbG9hZHMgYSBGb250IG9iamVjdCBhbmQgcmV0dXJucyBhIFByb21pc2Ugd2l0aCBpdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgZm9udFxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2UgcmVzb2x2ZWQgd2l0aCBhIGZvbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXh0XG4gICAqL1xuICBzdGF0aWMgbG9hZChwYXRoLCBsb2FkZXIgPSBUZXh0LmxvYWRlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxvYWRlci5sb2FkKHBhdGgsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFRleHQuZGVmYXVsdHMsIFRleHQuaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgbGlmZWN5Y2xlIHRvIGNyZWF0ZSBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dFxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAocGFyYW1zLmZvbnQgaW5zdGFuY2VvZiBQcm9taXNlID8gcGFyYW1zLmZvbnQgOiBQcm9taXNlLnJlc29sdmUocGFyYW1zLmZvbnQpKVxuICAgICAgLnRoZW4oZm9udCA9PiB7XG4gICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgZ2VvbWV0cnk6IG5ldyBUZXh0R2VvbWV0cnkoXG4gICAgICAgICAgICBwYXJhbXMudGV4dCxcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHBhcmFtcy5nZW9tZXRyeSxcbiAgICAgICAgICAgICAge2ZvbnR9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgICAgICB9KS5tZXNoXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHN1cGVyLndhaXQocHJvbWlzZSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBUZXh0XG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVG9ydXNHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgVG9ydXNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVzIGNsYXNzIG1ha2VzIGEgdG9ydXMgZmlndXJlLiBBIGRvbnV0IGlzIGEgdG9ydXMuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1RvcnVzR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVzLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUb3J1cyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiA1LFxuICogICAgIHR1YmU6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMzVcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVG9ydXMgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEwMCxcbiAgICogICAgIHR1YmU6IDQwLFxuICAgKiAgICAgcmFkaWFsU2VnbWVudHM6IDgsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDYsXG4gICAqICAgICBhcmM6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMTAwLFxuICAgICAgdHViZTogNDAsXG4gICAgICByYWRpYWxTZWdtZW50czogOCxcbiAgICAgIHR1YnVsYXJTZWdtZW50czogNixcbiAgICAgIGFyYzogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1cyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdyYWRpdXMnLFxuICAgKiAgICAgJ3R1YmUnLFxuICAgKiAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICogICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgKiAgICAgJ2FyYydcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncmFkaXVzJyxcbiAgICAgICd0dWJlJyxcbiAgICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICAgICdhcmMnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBUb3J1cy5kZWZhdWx0cywgVG9ydXMuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBUb3J1c0dlb21ldHJ5KFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50dWJlLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5hcmNcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFRvcnVzXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksXG4gIFRvcnVzS25vdEdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBUb3J1c2tub3RcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVza25vdCBjbGFzcyBtYWtlcyBhIHRvcnVza25vdCBmaWd1cmUuIEl0J3MgbGlrZSBhIGNyb29rZWQgZG9udXQsIHZlcnkgY3Jvb2tlZC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjVG9ydXNLbm90R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVza25vdCwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgVG9ydXNrbm90KHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6NSxcbiAqICAgICB0dWJlOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IHtcbiAqICAgICB5OiAxMDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVG9ydXNrbm90IGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMTAwLFxuICAgKiAgICAgdHViZTogNDAsXG4gICAqICAgICByYWRpYWxTZWdtZW50czogNjQsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDgsXG4gICAqICAgICBwOiAyLFxuICAgKiAgICAgcTogM1xuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICByYWRpdXM6IDEwMCxcbiAgICAgIHR1YmU6IDQwLFxuICAgICAgcmFkaWFsU2VnbWVudHM6IDY0LFxuICAgICAgdHVidWxhclNlZ21lbnRzOiA4LFxuICAgICAgcDogMixcbiAgICAgIHE6IDNcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncmFkaXVzJyxcbiAgICogICAgICd0dWJlJyxcbiAgICogICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAqICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICogICAgICdwJyxcbiAgICogICAgICdxJ1xuICAgKiAgIF1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdyYWRpdXMnLFxuICAgICAgJ3R1YmUnLFxuICAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgICAgJ3AnLFxuICAgICAgJ3EnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBUb3J1c2tub3QuZGVmYXVsdHMsIFRvcnVza25vdC5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXNrbm90XG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgR0NvbnN0cnVjdCA9IHBhcmFtcy5idWZmZXIgPyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSA6IFRvcnVzS25vdEdlb21ldHJ5O1xuXG4gICAgcmV0dXJuIG5ldyBHQ29uc3RydWN0KFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50dWJlLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5wLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnFcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFRvcnVza25vdFxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIExpbmVDdXJ2ZTMsXG4gIFZlY3RvcjMsXG4gIFR1YmVCdWZmZXJHZW9tZXRyeSxcbiAgVHViZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBUdWJlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBUdWJlIGNsYXNzIG1ha2VzIGEgdHViZSB0aGF0IGV4dHJ1ZGVzIGFsb25nIGEgM2QgY3VydmUuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1R1YmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVHViZSBmcm9tIGEgdGhyZWUuanMgQ3VydmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogY29uc3QgQ3VzdG9tU2luQ3VydmUgPSBUSFJFRS5DdXJ2ZS5jcmVhdGUoXG4gKiAgIGZ1bmN0aW9uIChzY2FsZSkgeyAvLyBjdXN0b20gY3VydmUgY29uc3RydWN0b3JcbiAqICAgICB0aGlzLnNjYWxlID0gKHNjYWxlID09PSB1bmRlZmluZWQpID8gMSA6IHNjYWxlO1xuICogICB9LFxuICpcbiAqICAgZnVuY3Rpb24gKHQpIHsgLy8gZ2V0UG9pbnQ6IHQgaXMgYmV0d2VlbiAwLTFcbiAqICAgICBjb25zdCB0eCA9IHQgKiAzIC0gMS41LFxuICogICAgIHR5ID0gTWF0aC5zaW4oIDIgKiBNYXRoLlBJICogdCApLFxuICogICAgIHR6ID0gMDtcbiAqXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKHR4LCB0eSwgdHopLm11bHRpcGx5U2NhbGFyKHRoaXMuc2NhbGUpO1xuICogICB9XG4gKiApO1xuICpcbiAqIGNvbnN0IHBhdGggPSBuZXcgQ3VzdG9tU2luQ3VydmUoMTApO1xuICpcbiAqIG5ldyBUdWJlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwYXRoOiBwYXRoXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSlcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIFR1YmUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBhdGg6IG5ldyBUSFJFRS5MaW5lQ3VydmUzKG5ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAxKSksXG4gICAqICAgICBzZWdtZW50czogMjAsXG4gICAqICAgICByYWRpdXM6IDIsXG4gICAqICAgICByYWRpdXNTZWdtZW50czogOCxcbiAgICogICAgIGNsb3NlZDogZmFsc2VcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcGF0aDogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDAsIDAsIDEpKSxcbiAgICAgIHNlZ21lbnRzOiAyMCxcbiAgICAgIHJhZGl1czogMixcbiAgICAgIHJhZGl1c1NlZ21lbnRzOiA4LFxuICAgICAgY2xvc2VkOiBmYWxzZVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncGF0aCcsXG4gICAqICAgICAnc2VnbWVudHMnLFxuICAgKiAgICAgJ3JhZGl1cycsXG4gICAqICAgICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICAgJ2Nsb3NlZCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncGF0aCcsXG4gICAgICAnc2VnbWVudHMnLFxuICAgICAgJ3JhZGl1cycsXG4gICAgICAncmFkaXVzU2VnbWVudHMnLFxuICAgICAgJ2Nsb3NlZCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFR1YmUuZGVmYXVsdHMsIFR1YmUuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IFR1YmVCdWZmZXJHZW9tZXRyeSA6IFR1YmVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucGF0aCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuY2xvc2VkXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBUdWJlXG59O1xuIiwiaW1wb3J0IHtPYmplY3QzRH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgR3JvdXBcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBtYWtlIGdyb3VwcyBvZiBvYmplY3RzIChpdCdzIG5vdCBjb252ZW5pZW50bHkgdG8gYXBwbHkgdHJhbnNmb3JtcyB0byBlYWNoIG9iamVjdCB3aGVuIGNhbiBtYWtlIGp1c3Qgb25lIHRvIGEgZ3JvdXApLjxici8+XG4gKiBJbiBUaHJlZS5qcyB5b3UgbWFrZSBpdCB1c2luZyBgVEhSRUUuT2JqZWN0M0RgIGFuZCBpdCdzIGNoaWxkcmVuLiA8YnIvPjxici8+XG4gKiBJbiB3aHMuanMgd2UgaGF2ZSBgR3JvdXBgXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gQWRkaW5nIG9iamVjdHMgdG8gYW4gZW1wdHkgZ3JvdXA8L2NhcHRpb24+XG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG4gKiBjb25zdCBib3ggPSBuZXcgQm94KCk7XG4gKiBjb25zdCBncm91cCA9IG5ldyBHcm91cCgpO1xuICpcbiAqIHNwaGVyZS5hZGRUbyhncm91cCk7XG4gKiBib3guYWRkVG8oZ3JvdXApO1xuKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gTWFraW5nIGEgZ3JvdXAgZnJvbSBvYmplY3RzPC9jYXB0aW9uPlxuICogY29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuICogY29uc3QgYm94ID0gbmV3IEJveCgpO1xuICogY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAoYm94LCBzcGhlcmUpO1xuICogLy8gT1I6IGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwKFtib3gsIHNwaGVyZV0pO1xuICovXG5jbGFzcyBHcm91cCBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvciguLi5vYmplY3RzKSB7XG4gICAgc3VwZXIoe30pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvYmogPSBvYmplY3RzW2ldO1xuXG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9uZW50KSBvYmouYWRkVG8odGhpcyk7XG4gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QzRCkgdGhpcy5uYXRpdmUuYWRkKG9iaik7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3QzRCgpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEdyb3VwXG59O1xuIiwiLyoqIEBtb2R1bGUgY29tcG9uZW50cy9tZXNoZXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vQm94JztcbmV4cG9ydCAqIGZyb20gJy4vQ2lyY2xlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29uZSc7XG5leHBvcnQgKiBmcm9tICcuL0N5bGluZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vRG9kZWNhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0cnVkZSc7XG5leHBvcnQgKiBmcm9tICcuL0ljb3NhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vTGF0aGUnO1xuZXhwb3J0ICogZnJvbSAnLi9MaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vSW1wb3J0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9PY3RhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vUGFyYW1ldHJpYyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYW5lJztcbmV4cG9ydCAqIGZyb20gJy4vUG9seWhlZHJvbic7XG5leHBvcnQgKiBmcm9tICcuL1JpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFwZSc7XG5leHBvcnQgKiBmcm9tICcuL1NwaGVyZSc7XG5leHBvcnQgKiBmcm9tICcuL1RldHJhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL1RvcnVzJztcbmV4cG9ydCAqIGZyb20gJy4vVG9ydXNrbm90JztcbmV4cG9ydCAqIGZyb20gJy4vVHViZSc7XG5leHBvcnQgKiBmcm9tICcuL0dyb3VwJztcbiIsIi8qKlxuICogQGNsYXNzIEVsZW1lbnRNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtjb250YWluZXI9ZG9jdW1lbnQuYm9keV0gY29udGFpbmVyIGlzIHRoZSBET00gb2JqZWN0IHRvIHdoaWNoIGFwcGxpY2F0aW9uJ3MgY2FudmFzIHdpbGwgYmUgYWRkZWQgdG8uXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBlbGVtZW50IG1vZHVsZSwgcGFzc2luZyBpdCB0byB0aGUgQXBwPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAnKSlcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRWxlbWVudE1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lciA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdFbGVtZW50TW9kdWxlIG5vdyBhY2NlcHRzIG9ubHkgYXJndW1lbnQgd2hpY2ggaXMgYSBET00gb2JqZWN0LCBub3QgYSBwYXJhbXMgb2JqZWN0LicpO1xuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIuY29udGFpbmVyO1xuICAgIH0gZWxzZSB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcblxuICAgIHRoaXMuY3JlYXRlRWxlbWVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY3JlYXRlRWxlbWVudFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjYW52YXMgZWxlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FbGVtZW50TW9kdWxlXG4gICAqL1xuICBjcmVhdGVFbGVtZW50KCkge1xuICAgIHRoaXMuZWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAnd2hzLWFwcCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KCdlbGVtZW50JywgdGhpcy5lbGVtZW50KTtcbiAgICBtYW5hZ2VyLnNldCgnY29udGFpbmVyJywgdGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWxmLmVsZW1lbnQpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBXZWJHTFJlbmRlcmVyLFxuICBWZWN0b3IyXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtMb29wfSBmcm9tICcuLi8uLi9jb3JlL0xvb3AnO1xuXG4vKipcbiAqIEBjbGFzcyBSZW5kZXJpbmdNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgICAgcG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDYsIDE4KSxcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0pKSxcbiAqICAgbmV3IFJlbmRlcmluZ01vZHVsZSh7XG4gKiAgICAgYmdDb2xvcjogMHgxNjIxMjksXG4gKlxuICogICAgIHJlbmRlcmVyOiB7XG4gKiAgICAgICBhbnRpYWxpYXM6IHRydWVcbiAqICAgICB9XG4gKiAgIH0sIHtzaGFkb3c6IHRydWV9KVxuICogXSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdNb2R1bGUge1xuICAvKipcbiAgICogYWRkaXRpb25hbFxuICAgKiBAZGVzY3JpcHRpb24gY29sbGVjdGlvbiBvZiBhZGRpdGlvbmFsIHNjcmlwdHNcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkFwcCNhZGRpdGlvbmFsXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHN0YXRpYyBhZGRpdGlvbmFsID0ge1xuICAgIHNoYWRvdyhyZW5kZXJlcikge1xuICAgICAgcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBlbmFibGVkXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlciB7Qm9vbGVhbn0gbW9kdWxlOmNvcmUuQXBwI2VuYWJsZWRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZW5hYmxlZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30sIGFkZGl0aW9uYWwpIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG5cbiAgICAgIHJlc29sdXRpb246IG5ldyBWZWN0b3IyKDEsIDEpLFxuICAgICAgcGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG5cbiAgICAgIGJnQ29sb3I6IDB4MDAwMDAwLFxuICAgICAgYmdPcGFjaXR5OiAxLFxuXG4gICAgICByZW5kZXJlcjoge30sXG4gICAgICBmaXgoKSB7fVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICBjb25zdCB7XG4gICAgICBiZ0NvbG9yLFxuICAgICAgYmdPcGFjaXR5LFxuICAgICAgcmVuZGVyZXIsXG4gICAgICBwaXhlbFJhdGlvLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICByZXNvbHV0aW9uLFxuICAgICAgZml4XG4gICAgfSA9IHRoaXMucGFyYW1zO1xuXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBXZWJHTFJlbmRlcmVyKHJlbmRlcmVyKTtcbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihcbiAgICAgIGJnQ29sb3IsXG4gICAgICBiZ09wYWNpdHlcbiAgICApO1xuXG4gICAgaWYgKHBpeGVsUmF0aW8pIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhwaXhlbFJhdGlvKTtcblxuICAgIHRoaXMuc2V0U2l6ZShcbiAgICAgIE51bWJlcih3aWR0aCAqIHJlc29sdXRpb24ueCkudG9GaXhlZCgpLFxuICAgICAgTnVtYmVyKGhlaWdodCAqIHJlc29sdXRpb24ueSkudG9GaXhlZCgpXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGFkZGl0aW9uYWwpXG4gICAgICBpZiAoYWRkaXRpb25hbFtrZXldKSB0aGlzLmFwcGx5QWRkaXRpb25hbChrZXkpO1xuXG4gICAgZml4KHRoaXMucmVuZGVyZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlBZGRpdGlvbmFsXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBseSBhZGRpdGlvbmFsIHNjcmlwdCBmcm9tIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsXG4gICAqIEBwYXJhbSB7U3Rpcm5nfSBuYW1lIFNjcmlwdCBuYW1lXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBhcHBseUFkZGl0aW9uYWwobmFtZSkge1xuICAgIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsW25hbWVdLmFwcGx5KHRoaXMsIFt0aGlzLnJlbmRlcmVyXSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpbnRlZ3JhdGVSZW5kZXJlclxuICAgKiBAZGVzY3JpcHRpb24gSW50ZWdyYXRlIHJlbmRlcmVyXG4gICAqIEBwYXJhbSB7Tm9kZUVsZW1lbnR9IGVsZW1lbnQgRE9NIG9iamVjdFxuICAgKiBAcGFyYW0ge1RIUkVFLlNjZW5lfSBzY2VuZSB1c2VkIHNjZW5lXG4gICAqIEBwYXJhbSB7VEhSRUUuQ2FtZXJhfSBjYW1lcmEgdXNlZCBjYW1lcmFcbiAgICogQHJldHVybiB7TG9vcH0gcmVuZGVyTG9vcFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgaW50ZWdyYXRlUmVuZGVyZXIoZWxlbWVudCwgc2NlbmUsIGNhbWVyYSkge1xuICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcbiAgICB0aGlzLmF0dGFjaFRvQ2FudmFzKGVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIG5ldyBMb29wKCgpID0+IHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBlZmZlY3RcbiAgICogQGRlc2NyaXB0aW9uIEFkZCB0aHJlZS5qcyBlZmZlY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdCB0aHJlZS5qcyBlZmZlY3RcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWZmZWN0TG9vcCB1cGRhdGUgZnVuY3Rpb24gZm9yIGVmZmVjdFxuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgZWZmZWN0KGVmZmVjdCwgZWZmZWN0TG9vcCA9ICgpID0+IHtcbiAgICBlZmZlY3QucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcbiAgfSkge1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG5cbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKCk7XG4gICAgZWZmZWN0LnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuXG4gICAgY29uc3QgbG9vcCA9IG5ldyBMb29wKGVmZmVjdExvb3ApO1xuXG4gICAgdGhpcy5lZmZlY3RzLnB1c2gobG9vcCk7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCkgbG9vcC5zdGFydCh0aGlzLmFwcCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFNpemVcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSByZW5kZXIgdGFyZ2V0IHdpZHRoIGFuZCBoZWlnaHQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXR0YWNoVG9DYW52YXNcbiAgICogQGRlc2NyaXB0aW9uIEF0dGFjaCByZW5kZXJlci5kb21FbGVtZW50IHRvIGVsZW1lbnRcbiAgICogQHBhcmFtIHtOb2RlRWxlbWVudH0gZWxlbWVudCBET00gb2JqZWN0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBhdHRhY2hUb0NhbnZhcyhlbGVtZW50KSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50O1xuXG4gICAgLy8gYXR0YWNoIHRvIG5ldyBwYXJlbnQgd29ybGQgZG9tXG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyTG9vcCBhbmQgZWZmZWN0IGxvb3BzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG4gICAgdGhpcy5lZmZlY3RzLmZvckVhY2gobG9vcCA9PiBsb29wLnN0b3AoKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqIEBkZXNjcmlwdGlvbiBSZXN1bWVzIHJlbmRlckxvb3AgYW5kIGVmZmVjdCBsb29wc1xuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgcGxheSgpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdGFydCgpO1xuICAgIHRoaXMuZWZmZWN0cy5mb3JFYWNoKGxvb3AgPT4gbG9vcC5zdGFydCgpKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdyZW5kZXJpbmcnKTtcbiAgICBtYW5hZ2VyLnNldCgncmVuZGVyZXInLCB0aGlzLnJlbmRlcmVyKTtcblxuICAgIHRoaXMuYXBwID0gbWFuYWdlci5oYW5kbGVyO1xuXG4gICAgdGhpcy5yZW5kZXJMb29wID0gdGhpcy5pbnRlZ3JhdGVSZW5kZXJlcihcbiAgICAgIG1hbmFnZXIuZ2V0KCdlbGVtZW50JyksXG4gICAgICBtYW5hZ2VyLmdldCgnc2NlbmUnKSxcbiAgICAgIG1hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmVcbiAgICApO1xuXG4gICAgbWFuYWdlci51cGRhdGUoe1xuICAgICAgZWxlbWVudDogZWxlbWVudCA9PiB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9DYW52YXMoZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgc2NlbmU6IHNjZW5lID0+IHtcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgfSxcbiAgICAgIGNhbWVyYTogY2FtZXJhID0+IHtcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmEubmF0aXZlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLnJlbmRlckxvb3Auc3RhcnQodGhpcyk7XG4gICAgc2VsZi5lZmZlY3RzLmZvckVhY2gobG9vcCA9PiBsb29wLnN0YXJ0KHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2UgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgdGhpcy5yZW5kZXJlci5mb3JjZUNvbnRleHRMb3NzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFNjZW5lLFxufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IFNZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUgPSBTeW1ib2woJ1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUnKVxuXG4vKipcbiAqIEBjbGFzcyBTY2VuZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFt3aWxsU2NlbmVCZVJlcGxhY2VkPWZhbHNlXSB3aWxsU2NlbmVCZVJlcGxhY2VkIHNob3VsZCBiZSB0cnVlIG9ubHkgaWYgeW91IGFyZSBnb2luZyB0byBvdmVyd3JpdGUgc2NlbmUgZGVwZW5kZW5jeSBldmVuIHdpdGhvdXQgdGhlIHVzZSBvZiBkZWZhdWx0IG9uZS5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqL1xuZXhwb3J0IGNsYXNzIFNjZW5lTW9kdWxlIHtcbiAgY29uc3RydWN0b3Iod2lsbFNjZW5lQmVSZXBsYWNlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zY2VuZSA9IHdpbGxTY2VuZUJlUmVwbGFjZWQgPyBudWxsIDogbmV3IFNjZW5lKCk7XG4gIH1cblxuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLnNldCgnc2NlbmUnLCB0aGlzLnNjZW5lKTtcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgT2JqZWN0LmFzc2lnbihcbiAgICAgIHRoaXMsXG4gICAgICB7XG4gICAgICAgIGFzeW5jIGFkZChvYmplY3QpIHtcbiAgICAgICAgICBpZiAob2JqZWN0LnBhcmVudCkgYXdhaXQgb2JqZWN0LnBhcmVudC5yZW1vdmUob2JqZWN0KTtcbiAgICAgIFxuICAgICAgICAgIGF3YWl0IG9iamVjdC53YWl0KCk7XG4gICAgICBcbiAgICAgICAgICBpZiAoIW9iamVjdC5uYXRpdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnU2NlbmVNb2R1bGUnLFxuICAgICAgICAgICAgICAndGhlcmUgaXMgbm8gb2JqZWN0Lm5hdGl2ZScsXG4gICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgICAgb2JqZWN0LnBhcmVudCA9IHRoaXM7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hcHBseUJyaWRnZSh7b25BZGQ6IG9iamVjdH0pLm9uQWRkO1xuICAgICAgICAgIHNlbGYuc2NlbmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuICAgICAgXG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcmVtb3ZlKG9iamVjdCkge1xuICAgICAgICAgIGlmIChvYmplY3QucGFyZW50ICE9PSB0aGlzKSByZXR1cm47XG4gICAgICBcbiAgICAgICAgICBhd2FpdCBvYmplY3Qud2FpdCgpO1xuICAgICAgICAgIHRoaXMuYXBwbHlCcmlkZ2Uoe29uUmVtb3ZlOiBvYmplY3R9KTtcbiAgICAgIFxuICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHNlbGYuc2NlbmUucmVtb3ZlKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKHRoaXMuY2hpbGRyZW4uaW5kZXhPZihvYmplY3QpLCAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgX3NldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHNjZW5lW1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkVdID0gc2NlbmVbU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORV0gfHwgW11cbiAgICAgICAgICBzZWxmLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5fc2V0U2NlbmUoc2NlbmUpO1xuICAgICAgICAgIHRoaXMubWFuYWdlci5zZXQoJ3NjZW5lJywgc2NlbmUpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRTY2VuZSgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5zY2VuZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAoc2VsZi5zY2VuZSkgdGhpcy5fc2V0U2NlbmUoc2VsZi5zY2VuZSk7XG4gIH1cbn1cbiIsIi8vIGltcG9ydCB7YWRkUmVzaXplTGlzdGVuZXJ9IGZyb20gJ2RldGVjdC1lbGVtZW50LXJlc2l6ZSc7XG5cbi8qKlxuICogQGNsYXNzIFJlc2l6ZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXV0bzogdHJ1ZX1dIC0gSWYgYXV0byBpcyBzZXQgdG8gdHJ1ZSAtIHJlc2l6ZSB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNvbnRhaW5lciByZXNpemVzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdXRvOiB0cnVlXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMuY2FsbGJhY2tzID0gW3RoaXMuc2V0U2l6ZS5iaW5kKHRoaXMpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb24gc2V0U2l6ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcHJvdmlkZWQgd2lkdGggJiBoZWlnaHQgdG8gdGhlIHJlbmRlcmVyIG9iamVjdC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0PTFdIC0gdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICBzZXRTaXplKHdpZHRoID0gMSwgaGVpZ2h0ID0gMSkge1xuICAgIHRoaXMuY2FtZXJhLm5hdGl2ZS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICB0aGlzLmNhbWVyYS5uYXRpdmUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG4gICAgaWYgKHRoaXMucmVuZGVyaW5nKSB0aGlzLnJlbmRlcmluZy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdHJpZ2dlclxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFRyaWdnZXJzIHJlc2l6ZSB3aGVuIGNhbGxlZC4gd2lkdGggJiBoZWlnaHQgYXJlIGRldGVybWluZWQgYXV0b21hdGljYWxseVxuICAgKiBUaGlzIGludm9rZXMgZWFjaCBjYWxsYmFja3Mgd2l0aCB0aGUgbmV3IHdpZHRoIGFuZCBoZWlnaHQgYXMgcGFyYW1zXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICB0cmlnZ2VyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcjoge1xuICAgICAgICBvZmZzZXRXaWR0aCxcbiAgICAgICAgb2Zmc2V0SGVpZ2h0XG4gICAgICB9LFxuICAgICAgcmVzb2x1dGlvblxuICAgIH0gPSB0aGlzO1xuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIob2Zmc2V0V2lkdGggKiByZXNvbHV0aW9uLngpLnRvRml4ZWQoKTtcbiAgICBjb25zdCBoZWlnaHQgPSBOdW1iZXIob2Zmc2V0SGVpZ2h0ICogcmVzb2x1dGlvbi55KS50b0ZpeGVkKCk7XG5cbiAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKGNiID0+IHtcbiAgICAgIGNiKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkQXV0b3Jlc2l6ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgbW9kdWxlIHRvIGF1dG9yZXNpemUsIHRoaXMgYWRkcyBhbiBldmVudCBsaXN0ZW5lIG9uIHdpbmRvdyByZXNpemUgdG8gdHJpZ2dlciB0aGUgcmVzaXplXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICBhZGRBdXRvcmVzaXplKCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSB0aGlzLmdldFJlc29sdXRpb24oKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5hdXRvKSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy50cmlnZ2VyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkQ2FsbGJhY2tcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIHRoZSBleGlzdGluZyBjYWxsYmFja3MgbGlzdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhZGRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZXNpemVNb2R1bGVcbiAgICovXG4gIGFkZENhbGxiYWNrKGZ1bmMpIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ3Jlc2l6ZScpO1xuXG4gICAgdGhpcy5yZW5kZXJpbmcgPSBtYW5hZ2VyLmdldCgncmVuZGVyZXInKTtcbiAgICB0aGlzLmNhbWVyYSA9IG1hbmFnZXIuZ2V0KCdjYW1lcmEnKTtcblxuICAgIHRoaXMuZ2V0UmVzb2x1dGlvbiA9ICgpID0+IG1hbmFnZXIudXNlKCdyZW5kZXJpbmcnKS5wYXJhbXMucmVzb2x1dGlvbjtcbiAgICB0aGlzLmdldENvbnRhaW5lciA9ICgpID0+IG1hbmFnZXIuZ2V0KCdjb250YWluZXInKTtcblxuICAgIG1hbmFnZXIudXBkYXRlKHtcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyID0+IHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEF1dG9yZXNpemUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0UHJldmlvdXNMdW07XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEN1cnJlbnRMdW07XFxyXFxudW5pZm9ybSBmbG9hdCBtaW5MdW1pbmFuY2U7XFxyXFxudW5pZm9ybSBmbG9hdCBkZWx0YTtcXHJcXG51bmlmb3JtIGZsb2F0IHRhdTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHRmbG9hdCBwcmV2aW91c0x1bSA9IHRleHR1cmUyRCh0UHJldmlvdXNMdW0sIHZVdiwgTUlQX0xFVkVMXzFYMSkucjtcXHJcXG5cXHRmbG9hdCBjdXJyZW50THVtID0gdGV4dHVyZTJEKHRDdXJyZW50THVtLCB2VXYsIE1JUF9MRVZFTF8xWDEpLnI7XFxyXFxuXFxyXFxuXFx0cHJldmlvdXNMdW0gPSBtYXgobWluTHVtaW5hbmNlLCBwcmV2aW91c0x1bSk7XFxyXFxuXFx0Y3VycmVudEx1bSA9IG1heChtaW5MdW1pbmFuY2UsIGN1cnJlbnRMdW0pO1xcclxcblxcclxcblxcdC8vIEFkYXB0IHRoZSBsdW1pbmFuY2UgdXNpbmcgUGF0dGFuYWlrJ3MgdGVjaG5pcXVlLlxcclxcblxcdGZsb2F0IGFkYXB0ZWRMdW0gPSBwcmV2aW91c0x1bSArIChjdXJyZW50THVtIC0gcHJldmlvdXNMdW0pICogKDEuMCAtIGV4cCgtZGVsdGEgKiB0YXUpKTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IuciA9IGFkYXB0ZWRMdW07XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFkYXB0aXZlIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhZGFwdGl2ZSBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHRkZWZpbmVzOiB7XHJcblxyXG5cdFx0XHRcdE1JUF9MRVZFTF8xWDE6IFwiMC4wXCJcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0UHJldmlvdXNMdW06IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRDdXJyZW50THVtOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHRtaW5MdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDAuMDEpLFxyXG5cdFx0XHRcdGRlbHRhOiBuZXcgVW5pZm9ybSgwLjApLFxyXG5cdFx0XHRcdHRhdTogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgZm9jdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBkb2Y7XFxyXFxudW5pZm9ybSBmbG9hdCBhc3BlY3Q7XFxyXFxudW5pZm9ybSBmbG9hdCBhcGVydHVyZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG5cXHRmbG9hdCByZWFkRGVwdGgoc2FtcGxlcjJEIGRlcHRoU2FtcGxlciwgdmVjMiBjb29yZCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZyYWdDb29yZFogPSB0ZXh0dXJlMkQoZGVwdGhTYW1wbGVyLCBjb29yZCkueDtcXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCh2aWV3WiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgYXNwZWN0Q29ycmVjdGlvbiA9IHZlYzIoMS4wLCBhc3BlY3QpO1xcclxcblxcclxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkZXB0aCA9IHRleHR1cmUyRCh0RGVwdGgsIHZVdikueDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gcmVhZERlcHRoKHREZXB0aCwgdlV2KTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRmbG9hdCBmb2N1c05lYXIgPSBjbGFtcChmb2N1cyAtIGRvZiwgMC4wLCAxLjApO1xcclxcblxcdGZsb2F0IGZvY3VzRmFyID0gY2xhbXAoZm9jdXMgKyBkb2YsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgYSBEb0YgbWFzay5cXHJcXG5cXHRmbG9hdCBsb3cgPSBzdGVwKGRlcHRoLCBmb2N1c05lYXIpO1xcclxcblxcdGZsb2F0IGhpZ2ggPSBzdGVwKGZvY3VzRmFyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZmFjdG9yID0gKGRlcHRoIC0gZm9jdXNOZWFyKSAqIGxvdyArIChkZXB0aCAtIGZvY3VzRmFyKSAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0dmVjMiBkb2ZCbHVyID0gdmVjMihjbGFtcChmYWN0b3IgKiBhcGVydHVyZSwgLW1heEJsdXIsIG1heEJsdXIpKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRvZmJsdXI5ID0gZG9mQmx1ciAqIDAuOTtcXHJcXG5cXHR2ZWMyIGRvZmJsdXI3ID0gZG9mQmx1ciAqIDAuNztcXHJcXG5cXHR2ZWMyIGRvZmJsdXI0ID0gZG9mQmx1ciAqIDAuNDtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAgMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjM3LCAgMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgLTAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgLTAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjE1LCAgMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgIDAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjQsICAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjE1LCAtMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yIC8gNDEuMDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogRGVwdGggb2YgRmllbGQgc2hhZGVyIChCb2tlaCkuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IE1hcnRpbnMgVXBpdGlzOlxyXG4gKiAgaHR0cDovL2FydG1hcnRpbnNoLmJsb2dzcG90LmNvbS8yMDEwLzAyL2dsc2wtbGVucy1ibHVyLWZpbHRlci13aXRoLWJva2VoLmh0bWxcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQm9rZWhNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IFtjYW1lcmFdIC0gQSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5mb2N1cz0xLjBdIC0gVGhlIGZvY3VzIGRpc3RhbmNlLCBjb3JyZXNwb25kcyBkaXJlY3RseSB3aXRoIHRoZSBzY2VuZSBkZXB0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZG9mPTAuMDJdIC0gRGVwdGggb2YgZmllbGQuIEFuIGFyZWEgaW4gZnJvbnQgb2YgYW5kIGJlaGluZCB0aGUgZm9jdXMgcG9pbnQgdGhhdCBzdGlsbCBhcHBlYXJzIHNoYXJwLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hcGVydHVyZT0wLjAyNV0gLSBDYW1lcmEgYXBlcnR1cmUgc2NhbGUuIEJpZ2dlciB2YWx1ZXMgZm9yIHN0cm9uZ2VyIGJsdXIgYW5kIHNoYWxsb3dlciBkZXB0aCBvZiBmaWVsZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4Qmx1cj0xLjBdIC0gTWF4aW11bSBibHVyIHN0cmVuZ3RoLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihjYW1lcmEsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGZvY3VzOiAxLjAsXHJcblx0XHRcdGRvZjogMC4wMixcclxuXHRcdFx0YXBlcnR1cmU6IDAuMDI1LFxyXG5cdFx0XHRtYXhCbHVyOiAxLjBcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiQm9rZWhNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhTmVhcjogbmV3IFVuaWZvcm0oMC4xKSxcclxuXHRcdFx0XHRjYW1lcmFGYXI6IG5ldyBVbmlmb3JtKDIwMDApLFxyXG5cdFx0XHRcdGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHREZXB0aDogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGZvY3VzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5mb2N1cyksXHJcblx0XHRcdFx0ZG9mOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kb2YpLFxyXG5cdFx0XHRcdGFwZXJ0dXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hcGVydHVyZSksXHJcblx0XHRcdFx0bWF4Qmx1cjogbmV3IFVuaWZvcm0oc2V0dGluZ3MubWF4Qmx1cilcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBbY2FtZXJhPW51bGxdIC0gQSBjYW1lcmEuXHJcblx0ICovXHJcblxyXG5cdGFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhID0gbnVsbCkge1xyXG5cclxuXHRcdGlmKGNhbWVyYSAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0dGhpcy51bmlmb3Jtcy5jYW1lcmFOZWFyLnZhbHVlID0gY2FtZXJhLm5lYXI7XHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhRmFyLnZhbHVlID0gY2FtZXJhLmZhcjtcclxuXHRcdFx0dGhpcy51bmlmb3Jtcy5hc3BlY3QudmFsdWUgPSBjYW1lcmEuYXNwZWN0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSwgVmVjdG9yMiB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdGNvbnN0IHZlYzIgdGhyZXNob2xkID0gdmVjMihFREdFX1RIUkVTSE9MRCk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGNvbG9yIGRlbHRhcy5cXHJcXG5cXHR2ZWM0IGRlbHRhO1xcclxcblxcdHZlYzMgYyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KS5yZ2I7XFxyXFxuXFxyXFxuXFx0dmVjMyBjTGVmdCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFswXS54eSkucmdiO1xcclxcblxcdHZlYzMgdCA9IGFicyhjIC0gY0xlZnQpO1xcclxcblxcdGRlbHRhLnggPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMF0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wKTtcXHJcXG5cXHRkZWx0YS55ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gV2UgZG8gdGhlIHVzdWFsIHRocmVzaG9sZC5cXHJcXG5cXHR2ZWMyIGVkZ2VzID0gc3RlcCh0aHJlc2hvbGQsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHQvLyBUaGVuIGRpc2NhcmQgaWYgdGhlcmUgaXMgbm8gZWRnZS5cXHJcXG5cXHRpZihkb3QoZWRnZXMsIHZlYzIoMS4wKSkgPT0gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzY2FyZDtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHJpZ2h0IGFuZCBib3R0b20gZGVsdGFzLlxcclxcblxcdHZlYzMgY1JpZ2h0ID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnh5KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY1JpZ2h0KTtcXHJcXG5cXHRkZWx0YS56ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0dmVjMyBjQm90dG9tID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnp3KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY0JvdHRvbSk7XFxyXFxuXFx0ZGVsdGEudyA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBkZWx0YSBpbiB0aGUgZGlyZWN0IG5laWdoYm9yaG9vZC5cXHJcXG5cXHRmbG9hdCBtYXhEZWx0YSA9IG1heChtYXgobWF4KGRlbHRhLngsIGRlbHRhLnkpLCBkZWx0YS56KSwgZGVsdGEudyk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGxlZnQtbGVmdCBhbmQgdG9wLXRvcCBkZWx0YXMuXFxyXFxuXFx0dmVjMyBjTGVmdExlZnQgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0ueHkpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjTGVmdExlZnQpO1xcclxcblxcdGRlbHRhLnogPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3BUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wVG9wKTtcXHJcXG5cXHRkZWx0YS53ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBtYXhpbXVtIGRlbHRhLlxcclxcblxcdG1heERlbHRhID0gbWF4KG1heChtYXhEZWx0YSwgZGVsdGEueiksIGRlbHRhLncpO1xcclxcblxcclxcblxcdC8vIExvY2FsIGNvbnRyYXN0IGFkYXB0YXRpb24gaW4gYWN0aW9uLlxcclxcblxcdGVkZ2VzLnh5ICo9IHN0ZXAoMC41ICogbWF4RGVsdGEsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGVkZ2VzLCAwLjAsIDAuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldFszXTtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldFswXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoLTEuMCwgMC4wLCAwLjAsIDEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgxLjAsIDAuMCwgMC4wLCAtMS4wKTsgLy8gQ2hhbmdlZCBzaWduIGluIFcgY29tcG9uZW50LlxcclxcblxcdHZPZmZzZXRbMl0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KC0yLjAsIDAuMCwgMC4wLCAyLjApOyAvLyBDaGFuZ2VkIHNpZ24gaW4gVyBjb21wb25lbnQuXFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCB0aGF0IGRldGVjdHMgZWRnZXMgaW4gYSBjb2xvciB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBNYWlubHkgdXNlZCBmb3IgU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9yRWRnZXNNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb2xvciBlZGdlcyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHRleGVsU2l6ZSA9IG5ldyBWZWN0b3IyKCkpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkNvbG9yRWRnZXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHRFREdFX1RIUkVTSE9MRDogXCIwLjFcIlxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKHRleGVsU2l6ZSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlZGdlIGRldGVjdGlvbiBzZW5zaXRpdml0eS5cclxuXHQgKlxyXG5cdCAqIEEgbG93ZXIgdmFsdWUgcmVzdWx0cyBpbiBtb3JlIGVkZ2VzIGJlaW5nIGRldGVjdGVkIGF0IHRoZSBleHBlbnNlIG9mXHJcblx0ICogcGVyZm9ybWFuY2UuXHJcblx0ICpcclxuXHQgKiAwLjEgaXMgYSByZWFzb25hYmxlIHZhbHVlLCBhbmQgYWxsb3dzIHRvIGNhdGNoIG1vc3QgdmlzaWJsZSBlZGdlcy5cclxuXHQgKiAwLjA1IGlzIGEgcmF0aGVyIG92ZXJraWxsIHZhbHVlLCB0aGF0IGFsbG93cyB0byBjYXRjaCAnZW0gYWxsLlxyXG5cdCAqXHJcblx0ICogSWYgdGVtcG9yYWwgc3VwZXJzYW1wbGluZyBpcyB1c2VkLCAwLjIgY291bGQgYmUgYSByZWFzb25hYmxlIHZhbHVlLFxyXG5cdCAqIGFzIGxvdyBjb250cmFzdCBlZGdlcyBhcmUgcHJvcGVybHkgZmlsdGVyZWQgYnkganVzdCAyeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB0aHJlc2hvbGQgLSBUaGUgZWRnZSBkZXRlY3Rpb24gc2Vuc2l0aXZpdHkuIFJhbmdlOiBbMCwgMC41XS5cclxuXHQgKi9cclxuXHJcblx0c2V0RWRnZURldGVjdGlvblRocmVzaG9sZCh0aHJlc2hvbGQpIHtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMuRURHRV9USFJFU0hPTEQgPSB0aHJlc2hvbGQudG9GaXhlZChcIjJcIik7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHkxO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDEgPSBvcGFjaXR5MSAqIHRleHR1cmUyRCh0ZXh0dXJlMSwgdlV2KTtcXHJcXG5cXHR2ZWM0IHRleGVsMiA9IG9wYWNpdHkyICogdGV4dHVyZTJEKHRleHR1cmUyLCB2VXYpO1xcclxcblxcclxcblxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdHZlYzMgaW52VGV4ZWwxID0gdmVjMygxLjApIC0gdGV4ZWwxLnJnYjtcXHJcXG5cXHRcXHR2ZWMzIGludlRleGVsMiA9IHZlYzMoMS4wKSAtIHRleGVsMi5yZ2I7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHZlYzQoXFxyXFxuXFx0XFx0XFx0dmVjMygxLjApIC0gaW52VGV4ZWwxICogaW52VGV4ZWwyLFxcclxcblxcdFxcdFxcdHRleGVsMS5hICsgdGV4ZWwyLmFcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHRleGVsMSArIHRleGVsMjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgY29tYmluaW5nIHR3byB0ZXh0dXJlcy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBzdXBwb3J0cyB0aGUgdHdvIGJsZW5kIG1vZGVzIEFkZCBhbmQgU2NyZWVuLlxyXG4gKlxyXG4gKiBJbiBTY3JlZW4gbW9kZSwgdGhlIHR3byB0ZXh0dXJlcyBhcmUgZWZmZWN0aXZlbHkgcHJvamVjdGVkIG9uIGEgd2hpdGUgc2NyZWVuXHJcbiAqIHNpbXVsdGFuZW91c2x5LiBJbiBBZGQgbW9kZSwgdGhlIHRleHR1cmVzIGFyZSBzaW1wbHkgYWRkZWQgdG9nZXRoZXIgd2hpY2hcclxuICogb2Z0ZW4gcHJvZHVjZXMgdW5kZXNpcmVkLCB3YXNoZWQgb3V0IHJlc3VsdHMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbWJpbmVNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb21iaW5lIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NyZWVuTW9kZSA9IGZhbHNlKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJDb21iaW5lTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUxOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0ZXh0dXJlMjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdG9wYWNpdHkxOiBuZXcgVW5pZm9ybSgxLjApLFxyXG5cdFx0XHRcdG9wYWNpdHkyOiBuZXcgVW5pZm9ybSgxLjApXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRTY3JlZW5Nb2RlRW5hYmxlZChzY3JlZW5Nb2RlKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTY3JlZW4gYmxlbmQgbW9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTY3JlZW5Nb2RlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NSRUVOX01PREU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIFNhbXBsZSB0b3AgbGVmdCB0ZXhlbC5cXHJcXG5cXHR2ZWM0IHN1bSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2MCk7XFxyXFxuXFxyXFxuXFx0Ly8gU2FtcGxlIHRvcCByaWdodCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYxKTtcXHJcXG5cXHJcXG5cXHQvLyBTYW1wbGUgYm90dG9tIHJpZ2h0IHRleGVsLlxcclxcblxcdHN1bSArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdjIpO1xcclxcblxcclxcblxcdC8vIFNhbXBsZSBib3R0b20gbGVmdCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYzKTtcXHJcXG5cXHJcXG5cXHQvLyBDb21wdXRlIHRoZSBhdmVyYWdlLlxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHN1bSAqIDAuMjU7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIGZsb2F0IGtlcm5lbDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2MDtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MTtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MztcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBkVXYgPSAodGV4ZWxTaXplICogdmVjMihrZXJuZWwpKSArIGhhbGZUZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0dlV2MCA9IHZlYzIodXYueCAtIGRVdi54LCB1di55ICsgZFV2LnkpO1xcclxcblxcdHZVdjEgPSB2ZWMyKHV2LnggKyBkVXYueCwgdXYueSArIGRVdi55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54ICsgZFV2LngsIHV2LnkgLSBkVXYueSk7XFxyXFxuXFx0dlV2MyA9IHZlYzIodXYueCAtIGRVdi54LCB1di55IC0gZFV2LnkpO1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIG9wdGltaXNlZCBjb252b2x1dGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiB0aGUgR0RDMjAwMyBQcmVzZW50YXRpb24gYnkgTWFzYWtpIEthd2FzZSwgQnVua2FzaGEgR2FtZXM6XHJcbiAqICBGcmFtZSBCdWZmZXIgUG9zdHByb2Nlc3NpbmcgRWZmZWN0cyBpbiBET1VCTEUtUy5ULkUuQS5MIChXcmVja2xlc3MpXHJcbiAqIGFuZCBhbiBhcnRpY2xlIGJ5IEZpbGlwIFN0cnVnYXIsIEludGVsOlxyXG4gKiAgQW4gaW52ZXN0aWdhdGlvbiBvZiBmYXN0IHJlYWwtdGltZSBHUFUtYmFzZWQgaW1hZ2UgYmx1ciBhbGdvcml0aG1zXHJcbiAqXHJcbiAqIEZ1cnRoZXIgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIEFwcGxlJ3NcclxuICogW0Jlc3QgUHJhY3RpY2VzIGZvciBTaGFkZXJzXShodHRwczovL2dvby5nbC9sbVJvTTUpLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBDb252b2x1dGlvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbnZvbHV0aW9uIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiQ29udm9sdXRpb25NYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0aGFsZlRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0a2VybmVsOiBuZXcgVW5pZm9ybSgwLjApXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRUZXhlbFNpemUodGV4ZWxTaXplLngsIHRleGVsU2l6ZS55KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGtlcm5lbCBzaXplLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdFx0ICogQGRlZmF1bHQgS2VybmVsU2l6ZS5MQVJHRVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5rZXJuZWxTaXplID0gS2VybmVsU2l6ZS5MQVJHRTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBrZXJuZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IFRoZSBrZXJuZWwuXHJcblx0ICovXHJcblxyXG5cdGdldEtlcm5lbCgpIHtcclxuXHJcblx0XHRyZXR1cm4ga2VybmVsUHJlc2V0c1t0aGlzLmtlcm5lbFNpemVdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFRleGVsU2l6ZSh4LCB5KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xyXG5cdFx0dGhpcy51bmlmb3Jtcy5oYWxmVGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KS5tdWx0aXBseVNjYWxhcigwLjUpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIEthd2FzZSBibHVyIGtlcm5lbCBwcmVzZXRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3Qga2VybmVsUHJlc2V0cyA9IFtcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAxLjBdKSxcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMS4wLCAyLjBdKSxcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMi4wLCAyLjAsIDMuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA0LjAsIDUuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA1LjAsIDcuMCwgOC4wLCA5LjAsIDEwLjBdKVxyXG5dO1xyXG5cclxuLyoqXHJcbiAqIEEga2VybmVsIHNpemUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBWRVJZX1NNQUxMIC0gQSB2ZXJ5IHNtYWxsIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSA3eDcgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTTUFMTCAtIEEgc21hbGwga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDE1eDE1IEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTUVESVVNIC0gQSBtZWRpdW0gc2l6ZWQga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDIzeDIzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTEFSR0UgLSBBIGxhcmdlIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSAzNXgzNSBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFZFUllfTEFSR0UgLSBBIHZlcnkgbGFyZ2Uga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDYzeDYzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gSFVHRSAtIEEgaHVnZSBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgMTI3eDEyNyBHYXVzcyBibHVyIGtlcm5lbC5cclxuICovXHJcblxyXG5leHBvcnQgY29uc3QgS2VybmVsU2l6ZSA9IHtcclxuXHJcblx0VkVSWV9TTUFMTDogMCxcclxuXHRTTUFMTDogMSxcclxuXHRNRURJVU06IDIsXHJcblx0TEFSR0U6IDMsXHJcblx0VkVSWV9MQVJHRTogNCxcclxuXHRIVUdFOiA1XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGdsX0ZyYWdDb2xvciA9IG9wYWNpdHkgKiB0ZXhlbDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBzaW1wbGUgY29weSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvcHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb3B5IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkNvcHlNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdG9wYWNpdHk6IG5ldyBVbmlmb3JtKDEuMClcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSwgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8cGFja2luZz5cXHJcXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG52YXJ5aW5nIGZsb2F0IHZWaWV3WjtcXHJcXG52YXJ5aW5nIHZlYzQgdlByb2pUZXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXHJcXG5cXHJcXG5cXHQvLyBUcmFuc2Zvcm0gaW50byBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSAobm90IG1pcnJvcmVkKS5cXHJcXG5cXHR2ZWMyIHByb2pUZXhDb29yZCA9ICh2UHJvalRleENvb3JkLnh5IC8gdlByb2pUZXhDb29yZC53KSAqIDAuNSArIDAuNTtcXHJcXG5cXHRwcm9qVGV4Q29vcmQgPSBjbGFtcChwcm9qVGV4Q29vcmQsIDAuMDAyLCAwLjk5OCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHVucGFja1JHQkFUb0RlcHRoKHRleHR1cmUyRCh0RGVwdGgsIHByb2pUZXhDb29yZCkpO1xcclxcblxcclxcblxcdCNpZmRlZiBQRVJTUEVDVElWRV9DQU1FUkFcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WihmcmFnQ29vcmRaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGZsb2F0IGRlcHRoVGVzdCA9ICgtdlZpZXdaID4gLXZpZXdaKSA/IDEuMCA6IDAuMDtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gdmVjMygwLjAsIGRlcHRoVGVzdCwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxyXFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcclxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxyXFxuXFxyXFxudmFyeWluZyBmbG9hdCB2Vmlld1o7XFxyXFxudmFyeWluZyB2ZWM0IHZQcm9qVGV4Q29vcmQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXHJcXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcclxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxyXFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcclxcblxcclxcblxcdHZWaWV3WiA9IG12UG9zaXRpb24uejtcXHJcXG5cXHR2UHJvalRleENvb3JkID0gZ2xfUG9zaXRpb247XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgZGVwdGggY29tcGFyaXNvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRlcHRoIGNvbXBhcmlzb24gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IFtkZXB0aFRleHR1cmU9bnVsbF0gLSBBIGRlcHRoIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBBIGNhbWVyYS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoZGVwdGhUZXh0dXJlID0gbnVsbCwgY2FtZXJhKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJEZXB0aENvbXBhcmlzb25NYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERlcHRoOiBuZXcgVW5pZm9ybShkZXB0aFRleHR1cmUpLFxyXG5cdFx0XHRcdGNhbWVyYU5lYXI6IG5ldyBVbmlmb3JtKDAuMSksXHJcblx0XHRcdFx0Y2FtZXJhRmFyOiBuZXcgVW5pZm9ybSgyMDAwKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHJcblx0XHRcdG1vcnBoVGFyZ2V0czogdHJ1ZSxcclxuXHRcdFx0c2tpbm5pbmc6IHRydWVcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gW2NhbWVyYT1udWxsXSAtIEEgY2FtZXJhLlxyXG5cdCAqL1xyXG5cclxuXHRhZG9wdENhbWVyYVNldHRpbmdzKGNhbWVyYSA9IG51bGwpIHtcclxuXHJcblx0XHRpZihjYW1lcmEgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHR0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0XHRpZihjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmRlZmluZXMuUEVSU1BFQ1RJVkVfQ0FNRVJBID0gXCIxXCI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlBFUlNQRUNUSVZFX0NBTUVSQTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjQgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2UGF0dGVybjtcXHJcXG5cXHJcXG5mbG9hdCBwYXR0ZXJuKCkge1xcclxcblxcclxcblxcdGZsb2F0IHMgPSBzaW4oYW5nbGUpO1xcclxcblxcdGZsb2F0IGMgPSBjb3MoYW5nbGUpO1xcclxcblxcclxcblxcdHZlYzIgcG9pbnQgPSB2ZWMyKGMgKiB2VXZQYXR0ZXJuLnggLSBzICogdlV2UGF0dGVybi55LCBzICogdlV2UGF0dGVybi54ICsgYyAqIHZVdlBhdHRlcm4ueSkgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gKHNpbihwb2ludC54KSAqIHNpbihwb2ludC55KSkgKiA0LjA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzMgY29sb3IgPSB0ZXhlbC5yZ2I7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIEFWRVJBR0VcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHZlYzMoKGNvbG9yLnIgKyBjb2xvci5nICsgY29sb3IuYikgLyAzLjApO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yID0gdmVjMyhjb2xvciAqIDEwLjAgLSA1LjAgKyBwYXR0ZXJuKCkpO1xcclxcblxcdGNvbG9yID0gdGV4ZWwucmdiICsgKGNvbG9yIC0gdGV4ZWwucmdiKSAqIGludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSB2ZWM0IG9mZnNldFJlcGVhdDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjMiB2VXZQYXR0ZXJuO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHR2VXZQYXR0ZXJuID0gdXYgKiBvZmZzZXRSZXBlYXQuencgKyBvZmZzZXRSZXBlYXQueHk7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBkb3Qgc2NyZWVuIHNoYWRlciBtYXRlcmlhbC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgRG90U2NyZWVuTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdmVyYWdlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHNoYWRlciBzaG91bGQgb3V0cHV0IHRoZSBjb2xvdXIgYXZlcmFnZSAoYmxhY2sgYW5kIHdoaXRlKS5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFuZ2xlPTEuNTddIC0gVGhlIGFuZ2xlIG9mIHRoZSBkb3QgcGF0dGVybi5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjYWxlPTEuMF0gLSBUaGUgc2NhbGUgb2YgdGhlIGRvdCBwYXR0ZXJuLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGF2ZXJhZ2U6IGZhbHNlLFxyXG5cdFx0XHRhbmdsZTogMS41NyxcclxuXHRcdFx0c2NhbGU6IDEuMCxcclxuXHRcdFx0aW50ZW5zaXR5OiAxLjBcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiRG90U2NyZWVuTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0YW5nbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmFuZ2xlKSxcclxuXHRcdFx0XHRzY2FsZTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbGUpLFxyXG5cdFx0XHRcdGludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuaW50ZW5zaXR5KSxcclxuXHJcblx0XHRcdFx0b2Zmc2V0UmVwZWF0OiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yNCgwLjUsIDAuNSwgMS4wLCAxLjApKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc2V0QXZlcmFnZUVuYWJsZWQoc2V0dGluZ3MuYXZlcmFnZSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0QXZlcmFnZUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5BVkVSQUdFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuQVZFUkFHRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IHRpbWU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcdHVuaWZvcm0gZmxvYXQgc2NhbmxpbmVDb3VudDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JJRFxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZEludGVuc2l0eTtcXHJcXG5cXHR1bmlmb3JtIHZlYzIgZ3JpZFNjYWxlO1xcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZExpbmVXaWR0aDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGdyZXlzY2FsZUludGVuc2l0eTtcXHJcXG5cXHJcXG4jZWxpZiBkZWZpbmVkKFNFUElBKVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgc2VwaWFJbnRlbnNpdHk7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCB2aWduZXR0ZU9mZnNldDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHZpZ25ldHRlRGFya25lc3M7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0dmVjMyBjb2xvciA9IHRleGVsLnJnYjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0NSRUVOX01PREVcXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIGludkNvbG9yO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBOT0lTRVxcclxcblxcclxcblxcdFxcdGZsb2F0IHggPSB2VXYueCAqIHZVdi55ICogdGltZSAqIDEwMDAuMDtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDEzLjApICogbW9kKHgsIDEyMy4wKTtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDAuMDEpO1xcclxcblxcclxcblxcdFxcdHZlYzMgbm9pc2UgPSB0ZXhlbC5yZ2IgKiBjbGFtcCgwLjEgKyB4ICogMTAwLjAsIDAuMCwgMS4wKSAqIG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZOb2lzZSA9IHZlYzMoMS4wKSAtIG5vaXNlO1xcclxcblxcclxcblxcdFxcdFxcdGNvbG9yID0gdmVjMygxLjApIC0gaW52Q29sb3IgKiBpbnZOb2lzZTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IG5vaXNlO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIHNsID0gdmVjMihzaW4odlV2LnkgKiBzY2FubGluZUNvdW50KSwgY29zKHZVdi55ICogc2NhbmxpbmVDb3VudCkpO1xcclxcblxcdFxcdHZlYzMgc2NhbmxpbmVzID0gdGV4ZWwucmdiICogdmVjMyhzbC54LCBzbC55LCBzbC54KSAqIHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZTY2FubGluZXMgPSB2ZWMzKDEuMCkgLSBzY2FubGluZXM7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Y29sb3IgPSB2ZWMzKDEuMCkgLSBpbnZDb2xvciAqIGludlNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IHNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JJRFxcclxcblxcclxcblxcdFxcdGZsb2F0IGdyaWQgPSAwLjUgLSBtYXgoYWJzKG1vZCh2VXYueCAqIGdyaWRTY2FsZS54LCAxLjApIC0gMC41KSwgYWJzKG1vZCh2VXYueSAqIGdyaWRTY2FsZS55LCAxLjApIC0gMC41KSk7XFxyXFxuXFx0XFx0Y29sb3IgKj0gKDEuMCAtIGdyaWRJbnRlbnNpdHkpICsgdmVjMyhzbW9vdGhzdGVwKDAuMCwgZ3JpZExpbmVXaWR0aCwgZ3JpZCkpICogZ3JpZEludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIHZlYzMobGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZShjb2xvcikpLCBncmV5c2NhbGVJbnRlbnNpdHkpO1xcclxcblxcclxcblxcdCNlbGlmIGRlZmluZWQoU0VQSUEpXFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBjID0gY29sb3IucmdiO1xcclxcblxcclxcblxcdFxcdGNvbG9yLnIgPSBkb3QoYywgdmVjMygxLjAgLSAwLjYwNyAqIHNlcGlhSW50ZW5zaXR5LCAwLjc2OSAqIHNlcGlhSW50ZW5zaXR5LCAwLjE4OSAqIHNlcGlhSW50ZW5zaXR5KSk7XFxyXFxuXFx0XFx0Y29sb3IuZyA9IGRvdChjLCB2ZWMzKDAuMzQ5ICogc2VwaWFJbnRlbnNpdHksIDEuMCAtIDAuMzE0ICogc2VwaWFJbnRlbnNpdHksIDAuMTY4ICogc2VwaWFJbnRlbnNpdHkpKTtcXHJcXG5cXHRcXHRjb2xvci5iID0gZG90KGMsIHZlYzMoMC4yNzIgKiBzZXBpYUludGVuc2l0eSwgMC41MzQgKiBzZXBpYUludGVuc2l0eSwgMS4wIC0gMC44NjkgKiBzZXBpYUludGVuc2l0eSkpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBWSUdORVRURVxcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzIgY2VudGVyID0gdmVjMigwLjUpO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBFU0tJTFxcclxcblxcclxcblxcdFxcdFxcdHZlYzIgdXYgPSAodlV2IC0gY2VudGVyKSAqIHZlYzIodmlnbmV0dGVPZmZzZXQpO1xcclxcblxcdFxcdFxcdGNvbG9yID0gbWl4KGNvbG9yLnJnYiwgdmVjMygxLjAgLSB2aWduZXR0ZURhcmtuZXNzKSwgZG90KHV2LCB1dikpO1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZGlzdCA9IGRpc3RhbmNlKHZVdiwgY2VudGVyKTtcXHJcXG5cXHRcXHRcXHRjb2xvciAqPSBzbW9vdGhzdGVwKDAuOCwgdmlnbmV0dGVPZmZzZXQgKiAwLjc5OSwgZGlzdCAqICh2aWduZXR0ZURhcmtuZXNzICsgdmlnbmV0dGVPZmZzZXQpKTtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHRcXHRcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNsYW1wKGNvbG9yLCAwLjAsIDEuMCksIHRleGVsLmEpO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGNpbmVtYXRpYyBzaGFkZXIgdGhhdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6XHJcbiAqICAtIEZpbG0gR3JhaW5cclxuICogIC0gU2NhbmxpbmVzXHJcbiAqICAtIFZpZ25ldHRlXHJcbiAqICAtIEdyZXlzY2FsZVxyXG4gKiAgLSBTZXBpYVxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzY2FubGluZXMgYWxnb3JpdGhtIGJ5IFBhdCBcIkhhd3Rob3JuZVwiIFNoZWFyb24uXHJcbiAqICBodHRwOi8vd3d3LnRydWV2aXNpb24zZC5jb20vZm9ydW1zL3Nob3djYXNlL3N0YXRpY25vaXNlX2NvbG9yYmxhY2t3aGl0ZV9zY2FubGluZV9zaGFkZXJzLXQxODY5OC4wLmh0bWxcclxuICpcclxuICogT3B0aW1pc2VkIHNjYW5saW5lcyBhbmQgbm9pc2Ugd2l0aCBpbnRlbnNpdHkgc2NhbGluZyBieSBHZW9yZyBcIkxldmlhdGhhblwiXHJcbiAqIFN0ZWlucm9oZGVyLiBUaGlzIHZlcnNpb24gd2FzIHByb3ZpZGVkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvblxyXG4gKiAzLjAgTGljZW5zZTogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLlxyXG4gKlxyXG4gKiBUaGUgc2VwaWEgZWZmZWN0IGlzIGJhc2VkIG9uOlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2dsZnguanNcclxuICpcclxuICogVGhlIHZpZ25ldHRlIGNvZGUgaXMgYmFzZWQgb24gUGFpbnRFZmZlY3QgcG9zdHByb2Nlc3MgZnJvbSByby5tZTpcclxuICogIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC8zLWRyZWFtcy1vZi1ibGFjay9zb3VyY2UvYnJvd3NlL2RlcGxveS9qcy9lZmZlY3RzL1BhaW50RWZmZWN0LmpzXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbG1NYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmaWxtIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBEaXNhYmxlZCBlZmZlY3RzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBzaGFkZXIgYW5kIGhhdmUgbm8gbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3JleXNjYWxlPWZhbHNlXSAtIEVuYWJsZSBncmV5c2NhbGUgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zZXBpYT1mYWxzZV0gLSBFbmFibGUgc2VwaWEgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBBcHBseSB2aWduZXR0ZSBlZmZlY3QuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5lc2tpbD1mYWxzZV0gLSBVc2UgRXNraWwncyB2aWduZXR0ZSBhcHByb2FjaC4gVGhlIGRlZmF1bHQgbG9va3MgZHVzdHkgd2hpbGUgRXNraWwgbG9va3MgYnVybmVkIG91dC5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3Igbm9pc2UgYW5kIHNjYW5saW5lcy4gQm90aCBvZiB0aGVzZSBlZmZlY3RzIGFyZSBjb21wdXRlZCBpbmRlcGVuZGVudGx5LlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBTaG93IG5vaXNlLWJhc2VkIGZpbG0gZ3JhaW4uXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zY2FubGluZXM9dHJ1ZV0gLSBTaG93IHNjYW5saW5lcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmdyaWQ9dHJ1ZV0gLSBTaG93IGEgZ3JpZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubm9pc2VJbnRlbnNpdHk9MC41XSAtIFRoZSBub2lzZSBpbnRlbnNpdHkuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjYW5saW5lSW50ZW5zaXR5PTAuMDVdIC0gVGhlIHNjYW5saW5lIGludGVuc2l0eS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZEludGVuc2l0eT0xLjBdIC0gVGhlIGdyaWQgc3RyZW5ndGguIDAuMCB0byAxLjAuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmdyZXlzY2FsZUludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZ3JleXNjYWxlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2VwaWFJbnRlbnNpdHk9MS4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIHNlcGlhIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVPZmZzZXQ9MS4wXSAtIFRoZSBvZmZzZXQgb2YgdGhlIHZpZ25ldHRlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVEYXJrbmVzcz0xLjBdIC0gVGhlIGRhcmtuZXNzIG9mIHRoZSB2aWduZXR0ZSBlZmZlY3QuIDAuMCB0byAxLjAuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblxyXG5cdFx0XHRzY3JlZW5Nb2RlOiB0cnVlLFxyXG5cdFx0XHRub2lzZTogdHJ1ZSxcclxuXHRcdFx0c2NhbmxpbmVzOiB0cnVlLFxyXG5cdFx0XHRncmlkOiBmYWxzZSxcclxuXHJcblx0XHRcdGdyZXlzY2FsZTogZmFsc2UsXHJcblx0XHRcdHNlcGlhOiBmYWxzZSxcclxuXHRcdFx0dmlnbmV0dGU6IGZhbHNlLFxyXG5cdFx0XHRlc2tpbDogZmFsc2UsXHJcblxyXG5cdFx0XHRub2lzZUludGVuc2l0eTogMC41LFxyXG5cdFx0XHRzY2FubGluZUludGVuc2l0eTogMC4wNSxcclxuXHRcdFx0Z3JpZEludGVuc2l0eTogMS4wLFxyXG5cdFx0XHRncmV5c2NhbGVJbnRlbnNpdHk6IDEuMCxcclxuXHRcdFx0c2VwaWFJbnRlbnNpdHk6IDEuMCxcclxuXHJcblx0XHRcdHZpZ25ldHRlT2Zmc2V0OiAxLjAsXHJcblx0XHRcdHZpZ25ldHRlRGFya25lc3M6IDEuMFxyXG5cclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiRmlsbU1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGltZTogbmV3IFVuaWZvcm0oMC4wKSxcclxuXHJcblx0XHRcdFx0bm9pc2VJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm5vaXNlSW50ZW5zaXR5KSxcclxuXHRcdFx0XHRzY2FubGluZUludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbmxpbmVJbnRlbnNpdHkpLFxyXG5cdFx0XHRcdGdyaWRJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmdyaWRJbnRlbnNpdHkpLFxyXG5cclxuXHRcdFx0XHRzY2FubGluZUNvdW50OiBuZXcgVW5pZm9ybSgwLjApLFxyXG5cdFx0XHRcdGdyaWRTY2FsZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0Z3JpZExpbmVXaWR0aDogbmV3IFVuaWZvcm0oMC4wKSxcclxuXHJcblx0XHRcdFx0Z3JleXNjYWxlSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5ncmV5c2NhbGVJbnRlbnNpdHkpLFxyXG5cdFx0XHRcdHNlcGlhSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5zZXBpYUludGVuc2l0eSksXHJcblxyXG5cdFx0XHRcdHZpZ25ldHRlT2Zmc2V0OiBuZXcgVW5pZm9ybShzZXR0aW5ncy52aWduZXR0ZU9mZnNldCksXHJcblx0XHRcdFx0dmlnbmV0dGVEYXJrbmVzczogbmV3IFVuaWZvcm0oc2V0dGluZ3MudmlnbmV0dGVEYXJrbmVzcylcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldFNjcmVlbk1vZGVFbmFibGVkKHNldHRpbmdzLnNjcmVlbk1vZGUpO1xyXG5cdFx0dGhpcy5zZXROb2lzZUVuYWJsZWQoc2V0dGluZ3Mubm9pc2UpO1xyXG5cdFx0dGhpcy5zZXRTY2FubGluZXNFbmFibGVkKHNldHRpbmdzLnNjYW5saW5lcyk7XHJcblx0XHR0aGlzLnNldEdyaWRFbmFibGVkKHNldHRpbmdzLmdyaWQpO1xyXG5cdFx0dGhpcy5zZXRHcmV5c2NhbGVFbmFibGVkKHNldHRpbmdzLmdyZXlzY2FsZSk7XHJcblx0XHR0aGlzLnNldFNlcGlhRW5hYmxlZChzZXR0aW5ncy5zZXBpYSk7XHJcblx0XHR0aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XHJcblx0XHR0aGlzLnNldEVza2lsRW5hYmxlZChzZXR0aW5ncy5lc2tpbCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0U2NyZWVuTW9kZUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5TQ1JFRU5fTU9ERSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBub2lzZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBub2lzZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldE5vaXNlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLk5PSVNFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuTk9JU0U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNjYW5saW5lcyBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzY2FubGluZXMgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTY2FubGluZXNFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuU0NBTkxJTkVTID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NBTkxJTkVTO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmlkIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGdyaWQgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRHcmlkRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkdSSUQgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5HUklEO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmV5c2NhbGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgZ3JleXNjYWxlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0R3JleXNjYWxlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkdSRVlTQ0FMRSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLkdSRVlTQ0FMRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VwaWEgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgc2VwaWEgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTZXBpYUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5TRVBJQSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNFUElBO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBWaWduZXR0ZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEVza2lsIFZpZ25ldHRlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEhhcyBubyBlZmZlY3QgaWYgVmlnbmV0dGUgaXMgZGlzYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBFc2tpbCBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldEVza2lsRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkVTS0lMID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuRVNLSUw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFBlcnR1cmI7XFxyXFxuXFxyXFxudW5pZm9ybSBib29sIGFjdGl2ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFtb3VudDtcXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZDtcXHJcXG51bmlmb3JtIGZsb2F0IHNlZWRYO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZFk7XFxyXFxudW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uWDtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RvcnRpb25ZO1xcclxcbnVuaWZvcm0gZmxvYXQgY29sUztcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbmZsb2F0IHJhbmQodmVjMiB0Yykge1xcclxcblxcclxcblxcdGNvbnN0IGZsb2F0IGEgPSAxMi45ODk4O1xcclxcblxcdGNvbnN0IGZsb2F0IGIgPSA3OC4yMzM7XFxyXFxuXFx0Y29uc3QgZmxvYXQgYyA9IDQzNzU4LjU0NTM7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZHQgPSBkb3QodGMsIHZlYzIoYSwgYikpO1xcclxcblxcdGZsb2F0IHNuID0gbW9kKGR0LCAzLjE0KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBjb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHRmbG9hdCB4cywgeXM7XFxyXFxuXFx0dmVjNCBub3JtYWw7XFxyXFxuXFxyXFxuXFx0dmVjMiBvZmZzZXQ7XFxyXFxuXFx0dmVjNCBjciwgY2dhLCBjYjtcXHJcXG5cXHR2ZWM0IHNub3csIGNvbG9yO1xcclxcblxcclxcblxcdGZsb2F0IHN4LCBzeTtcXHJcXG5cXHJcXG5cXHRpZihhY3RpdmUpIHtcXHJcXG5cXHJcXG5cXHRcXHR4cyA9IGZsb29yKGdsX0ZyYWdDb29yZC54IC8gMC41KTtcXHJcXG5cXHRcXHR5cyA9IGZsb29yKGdsX0ZyYWdDb29yZC55IC8gMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRub3JtYWwgPSB0ZXh0dXJlMkQodFBlcnR1cmIsIGNvb3JkICogc2VlZCAqIHNlZWQpO1xcclxcblxcclxcblxcdFxcdGlmKGNvb3JkLnkgPCBkaXN0b3J0aW9uWCArIGNvbFMgJiYgY29vcmQueSA+IGRpc3RvcnRpb25YIC0gY29sUyAqIHNlZWQpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRzeCA9IGNsYW1wKGNlaWwoc2VlZFgpLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0XFx0Y29vcmQueSA9IHN4ICogKDEuMCAtIChjb29yZC55ICsgZGlzdG9ydGlvblkpKSArICgxLjAgLSBzeCkgKiBkaXN0b3J0aW9uWTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0aWYoY29vcmQueCA8IGRpc3RvcnRpb25ZICsgY29sUyAmJiBjb29yZC54ID4gZGlzdG9ydGlvblkgLSBjb2xTICogc2VlZCkge1xcclxcblxcclxcblxcdFxcdFxcdHN5ID0gY2xhbXAoY2VpbChzZWVkWSksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRcXHRjb29yZC54ID0gc3kgKiBkaXN0b3J0aW9uWCArICgxLjAgLSBzeSkgKiAoMS4wIC0gKGNvb3JkLnggKyBkaXN0b3J0aW9uWCkpO1xcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHRjb29yZC54ICs9IG5vcm1hbC54ICogc2VlZFggKiAoc2VlZCAvIDUuMCk7XFxyXFxuXFx0XFx0Y29vcmQueSArPSBub3JtYWwueSAqIHNlZWRZICogKHNlZWQgLyA1LjApO1xcclxcblxcclxcblxcdFxcdG9mZnNldCA9IGFtb3VudCAqIHZlYzIoY29zKGFuZ2xlKSwgc2luKGFuZ2xlKSk7XFxyXFxuXFxyXFxuXFx0XFx0Y3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkICsgb2Zmc2V0KTtcXHJcXG5cXHRcXHRjZ2EgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkKTtcXHJcXG5cXHRcXHRjYiA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQgLSBvZmZzZXQpO1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdmVjNChjci5yLCBjZ2EuZywgY2IuYiwgY2dhLmEpO1xcclxcblxcdFxcdHNub3cgPSAyMDAuMCAqIGFtb3VudCAqIHZlYzQocmFuZCh2ZWMyKHhzICogc2VlZCwgeXMgKiBzZWVkICogNTAuMCkpICogMC4yKTtcXHJcXG5cXHRcXHRjb2xvciArPSBzbm93O1xcclxcblxcclxcblxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGdsaXRjaCBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFmZmFudGFuL3VuaXR5Z2xpdGNoXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEdsaXRjaE1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJHbGl0Y2hNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRQZXJ0dXJiOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0YWN0aXZlOiBuZXcgVW5pZm9ybSgxKSxcclxuXHJcblx0XHRcdFx0YW1vdW50OiBuZXcgVW5pZm9ybSgwLjgpLFxyXG5cdFx0XHRcdGFuZ2xlOiBuZXcgVW5pZm9ybSgwLjAyKSxcclxuXHRcdFx0XHRzZWVkOiBuZXcgVW5pZm9ybSgwLjAyKSxcclxuXHRcdFx0XHRzZWVkWDogbmV3IFVuaWZvcm0oMC4wMiksXHJcblx0XHRcdFx0c2VlZFk6IG5ldyBVbmlmb3JtKDAuMDIpLFxyXG5cdFx0XHRcdGRpc3RvcnRpb25YOiBuZXcgVW5pZm9ybSgwLjUpLFxyXG5cdFx0XHRcdGRpc3RvcnRpb25ZOiBuZXcgVW5pZm9ybSgwLjYpLFxyXG5cdFx0XHRcdGNvbFM6IG5ldyBVbmlmb3JtKDAuMDUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xcclxcbnVuaWZvcm0gZmxvYXQgZGVjYXk7XFxyXFxudW5pZm9ybSBmbG9hdCBkZW5zaXR5O1xcclxcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0O1xcclxcbnVuaWZvcm0gZmxvYXQgY2xhbXBNYXg7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdmVjdG9yIGZyb20gcGl4ZWwgdG8gbGlnaHQgc291cmNlIGluIHNjcmVlbiBzcGFjZS5cXHJcXG5cXHR2ZWMyIGRlbHRhVGV4Q29vcmQgPSB0ZXhDb29yZCAtIGxpZ2h0UG9zaXRpb24uc3Q7XFxyXFxuXFx0ZGVsdGFUZXhDb29yZCAqPSAxLjAgLyBOVU1fU0FNUExFU19GTE9BVCAqIGRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0Ly8gQSBkZWNyZWFzaW5nIGlsbHVtaW5hdGlvbiBmYWN0b3IuXFxyXFxuXFx0ZmxvYXQgaWxsdW1pbmF0aW9uRGVjYXkgPSAxLjA7XFxyXFxuXFxyXFxuXFx0dmVjNCBzYW1wbGU7XFxyXFxuXFx0dmVjNCBjb2xvciA9IHZlYzQoMC4wKTtcXHJcXG5cXHJcXG5cXHQvLyBFc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgb2Ygb2NjbHVzaW9uIGF0IGVhY2ggcGl4ZWwgYnkgc3VtbWluZyBzYW1wbGVzIGFsb25nIGEgcmF5IHRvIHRoZSBsaWdodCBzb3VyY2UuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE5VTV9TQU1QTEVTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0dGV4Q29vcmQgLT0gZGVsdGFUZXhDb29yZDtcXHJcXG5cXHRcXHRzYW1wbGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSBzYW1wbGUgYXR0ZW51YXRpb24gc2NhbGUvZGVjYXkgZmFjdG9ycy5cXHJcXG5cXHRcXHRzYW1wbGUgKj0gaWxsdW1pbmF0aW9uRGVjYXkgKiB3ZWlnaHQ7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgKz0gc2FtcGxlO1xcclxcblxcclxcblxcdFxcdC8vIFVwZGF0ZSBleHBvbmVudGlhbCBkZWNheSBmYWN0b3IuXFxyXFxuXFx0XFx0aWxsdW1pbmF0aW9uRGVjYXkgKj0gZGVjYXk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNsYW1wKGNvbG9yICogZXhwb3N1cmUsIDAuMCwgY2xhbXBNYXgpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgY3JlcHVzY3VsYXIgcmF5cyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2VzOlxyXG4gKlxyXG4gKiBUaGliYXV0IERlc3BvdWxhaW4sIDIwMTI6XHJcbiAqICBbKFdlYkdMKSBWb2x1bWV0cmljIExpZ2h0IEFwcHJveGltYXRpb24gaW4gVGhyZWUuanNdKFxyXG4gKiAgaHR0cDovL2JrY29yZS5jb20vYmxvZy8zZC93ZWJnbC10aHJlZS1qcy12b2x1bWV0cmljLWxpZ2h0LWdvZHJheXMuaHRtbClcclxuICpcclxuICogTnZpZGlhLCBHUFUgR2VtcyAzLCAyMDA4OlxyXG4gKiAgW0NoYXB0ZXIgMTMuIFZvbHVtZXRyaWMgTGlnaHQgU2NhdHRlcmluZyBhcyBhIFBvc3QtUHJvY2Vzc10oXHJcbiAqICBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvR1BVR2VtczMvZ3B1Z2VtczNfY2gxMy5odG1sKVxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBHb2RSYXlzTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcclxuXHRcdFx0ZXhwb3N1cmU6IDAuNixcclxuXHRcdFx0ZGVuc2l0eTogMC45MyxcclxuXHRcdFx0ZGVjYXk6IDAuOTYsXHJcblx0XHRcdHdlaWdodDogMC40LFxyXG5cdFx0XHRjbGFtcE1heDogMS4wXHJcblx0XHR9LCBvcHRpb25zKTtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkdvZFJheXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHROVU1fU0FNUExFU19GTE9BVDogXCI2MC4wXCIsXHJcblx0XHRcdFx0TlVNX1NBTVBMRVNfSU5UOiBcIjYwXCJcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0bGlnaHRQb3NpdGlvbjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGV4cG9zdXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5leHBvc3VyZSksXHJcblx0XHRcdFx0ZGVjYXk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRlY2F5KSxcclxuXHRcdFx0XHRkZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kZW5zaXR5KSxcclxuXHRcdFx0XHR3ZWlnaHQ6IG5ldyBVbmlmb3JtKHNldHRpbmdzLndlaWdodCksXHJcblx0XHRcdFx0Y2xhbXBNYXg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmNsYW1wTWF4KVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RpbmN0aW9uO1xcclxcbnVuaWZvcm0gdmVjMiByYW5nZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGZsb2F0IGwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKHRleGVsLnJnYik7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFJBTkdFXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgbG93ID0gc3RlcChyYW5nZS54LCBsKTtcXHJcXG5cXHRcXHRmbG9hdCBoaWdoID0gc3RlcChsLCByYW5nZS55KTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSB0aGUgbWFzay5cXHJcXG5cXHRcXHRsICo9IGxvdyAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0bCA9IHBvdyhhYnMobCksIGRpc3RpbmN0aW9uKTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQ09MT1JcXHJcXG5cXHJcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KHRleGVsLnJnYiAqIGwsIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChsLCBsLCBsLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBsdW1pbm9zaXR5IHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogVGhpcyBzaGFkZXIgcHJvZHVjZXMgYSBncmV5c2NhbGUgbHVtaW5hbmNlIG1hcCB0aGF0IGRlc2NyaWJlcyB0aGUgYWJzb2x1dGVcclxuICogYW1vdW50IG9mIGxpZ2h0IGVtaXR0ZWQgYnkgYSBzY2VuZS4gSXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBvdXRwdXRcclxuICogY29sb3VycyB0aGF0IGFyZSBzY2FsZWQgd2l0aCB0aGVpciByZXNwZWN0aXZlIGx1bWluYW5jZSB2YWx1ZS4gQWRkaXRpb25hbGx5LFxyXG4gKiBhIHJhbmdlIG1heSBiZSBwcm92aWRlZCB0byBtYXNrIG91dCB1bmRlc2lyZWQgdGV4ZWxzLlxyXG4gKlxyXG4gKiBUaGUgYWxwaGEgY2hhbm5lbCB3aWxsIHJlbWFpbiB1bmFmZmVjdGVkIGluIGFsbCBjYXNlcy5cclxuICpcclxuICogT24gbHVtaW5hbmNlIGNvZWZmaWNpZW50czpcclxuICogIGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzlcclxuICpcclxuICogQ29lZmZpY2llbnRzIGZvciBkaWZmZXJlbnQgY29sb3VyIHNwYWNlczpcclxuICogIGh0dHBzOi8vaHN0by5vcmcvZ2V0cHJvL2hhYnIvcG9zdF9pbWFnZXMvMmFiLzY5ZC8wODQvMmFiNjlkMDg0ZjlhNTk3ZTAzMjYyNGJjZDc0ZDU3YTcucG5nXHJcbiAqXHJcbiAqIEx1bWluYW5jZSByYW5nZSByZWZlcmVuY2U6XHJcbiAqICBodHRwczovL2N5Y2xpbmc3NC5jb20vMjAwNy8wNS8yMy95b3VyLWZpcnN0LXNoYWRlci8jLlZ0eTlGZmtyTDRaXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEx1bWlub3NpdHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbY29sb3JPdXRwdXQ9ZmFsc2VdIC0gRGVmaW5lcyB3aGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBjb2xvdXJzIHNjYWxlZCB3aXRoIHRoZWlyIGx1bWluYW5jZSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtsdW1pbmFuY2VSYW5nZV0gLSBJZiBwcm92aWRlZCwgdGhlIHNoYWRlciB3aWxsIG1hc2sgb3V0IHRleGVscyB0aGF0IGFyZW4ndCBpbiB0aGUgc3BlY2lmaWVkIGx1bWluYW5jZSByYW5nZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoY29sb3JPdXRwdXQgPSBmYWxzZSwgbHVtaW5hbmNlUmFuZ2UgPSBudWxsKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFza0x1bWluYW5jZSA9IChsdW1pbmFuY2VSYW5nZSAhPT0gbnVsbCk7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJMdW1pbm9zaXR5TWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHRkaXN0aW5jdGlvbjogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRyYW5nZTogbmV3IFVuaWZvcm0obWFza0x1bWluYW5jZSA/IGx1bWluYW5jZVJhbmdlIDogbmV3IFZlY3RvcjIoKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4XHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRDb2xvck91dHB1dEVuYWJsZWQoY29sb3JPdXRwdXQpO1xyXG5cdFx0dGhpcy5zZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWQobWFza0x1bWluYW5jZSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyBjb2xvciBvdXRwdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIGNvbG9yIG91dHB1dCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0Q29sb3JPdXRwdXRFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuQ09MT1IgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5DT0xPUjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbHVtaW5hbmNlIG1hc2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBsdW1pbmFuY2UgbWFzayBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuUkFOR0UgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5SQU5HRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQ29sb3IsIFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdE1hc2s7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEVkZ2VzO1xcclxcblxcclxcbnVuaWZvcm0gdmVjMyB2aXNpYmxlRWRnZUNvbG9yO1xcclxcbnVuaWZvcm0gdmVjMyBoaWRkZW5FZGdlQ29sb3I7XFxyXFxudW5pZm9ybSBmbG9hdCBwdWxzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGVkZ2VTdHJlbmd0aDtcXHJcXG5cXHJcXG4jaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCB0UGF0dGVybjtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzIgZWRnZSA9IHRleHR1cmUyRCh0RWRnZXMsIHZVdikucmc7XFxyXFxuXFx0dmVjMiBtYXNrID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYpLnJnO1xcclxcblxcclxcblxcdCNpZm5kZWYgWF9SQVlcXHJcXG5cXHJcXG5cXHRcXHRlZGdlLnkgPSAwLjA7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0ZWRnZSAqPSAoZWRnZVN0cmVuZ3RoICogbWFzay54ICogcHVsc2UpO1xcclxcblxcdHZlYzMgb3V0bGluZUNvbG9yID0gZWRnZS54ICogdmlzaWJsZUVkZ2VDb2xvciArIGVkZ2UueSAqIGhpZGRlbkVkZ2VDb2xvcjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQUxQSEFfQkxFTkRJTkdcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgPSBtaXgoY29sb3IucmdiLCBvdXRsaW5lQ29sb3IsIG1heChlZGdlLngsIGVkZ2UueSkpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IG91dGxpbmVDb2xvcjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIHBhdHRlcm5Db2xvciA9IHRleHR1cmUyRCh0UGF0dGVybiwgdlBhdHRlcm5Db29yZCkucmdiO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBYX1JBWVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuNTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuMDtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gKDEuMCAtIG1hc2sueSA+IDAuMCkgPyAxLjAgOiBoaWRkZW5GYWN0b3I7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IHZpc2liaWxpdHlGYWN0b3IgKiAoMS4wIC0gbWFzay54KSAqICgxLjAgLSBwYXR0ZXJuQ29sb3IpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCIjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGFzcGVjdDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHBhdHRlcm5TY2FsZTtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHRcXHR2UGF0dGVybkNvb3JkID0gdXYgKiBhc3BlY3RDb3JyZWN0aW9uICogcGF0dGVyblNjYWxlO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIG91dGxpbmUgYmxlbmQgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lQmxlbmRNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5lZGdlU3RyZW5ndGg9MS4wXSAtIFRoZSBlZGdlIHN0cmVuZ3RoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wYXR0ZXJuU2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgcGF0dGVybiB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52aXNpYmxlRWRnZUNvbG9yPTB4ZmZmZmZmXSAtIFRoZSBjb2xvciBvZiB2aXNpYmxlIGVkZ2VzLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oaWRkZW5FZGdlQ29sb3I9MHgyMjA5MEFdIC0gVGhlIGNvbG9yIG9mIGhpZGRlbiBlZGdlcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFthbHBoYUJsZW5kaW5nPWZhbHNlXSAtIFdoZXRoZXIgdGhlIG91dGxpbmUgc2hvdWxkIGJlIGJsZW5kZWQgdXNpbmcgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbeFJheT10cnVlXSAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGVkZ2VTdHJlbmd0aDogMS4wLFxyXG5cdFx0XHRwYXR0ZXJuU2NhbGU6IDEuMCxcclxuXHRcdFx0dmlzaWJsZUVkZ2VDb2xvcjogMHhmZmZmZmYsXHJcblx0XHRcdGhpZGRlbkVkZ2VDb2xvcjogMHgyMjA5MEEsXHJcblx0XHRcdGFscGhhQmxlbmRpbmc6IGZhbHNlLFxyXG5cdFx0XHR4UmF5OiB0cnVlXHJcblx0XHR9LCBvcHRpb25zKTtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIk91dGxpbmVCbGVuZE1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHRwdWxzZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRhc3BlY3Q6IG5ldyBVbmlmb3JtKDEuMCksXHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0TWFzazogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dEVkZ2VzOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0UGF0dGVybjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGVkZ2VTdHJlbmd0aDogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZWRnZVN0cmVuZ3RoKSxcclxuXHRcdFx0XHRwYXR0ZXJuU2NhbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnBhdHRlcm5TY2FsZSksXHJcblxyXG5cdFx0XHRcdHZpc2libGVFZGdlQ29sb3I6IG5ldyBVbmlmb3JtKG5ldyBDb2xvcihzZXR0aW5ncy52aXNpYmxlRWRnZUNvbG9yKSksXHJcblx0XHRcdFx0aGlkZGVuRWRnZUNvbG9yOiBuZXcgVW5pZm9ybShuZXcgQ29sb3Ioc2V0dGluZ3MuaGlkZGVuRWRnZUNvbG9yKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldEFscGhhQmxlbmRpbmdFbmFibGVkKHNldHRpbmdzLmFscGhhQmxlbmRpbmcpO1xyXG5cdFx0dGhpcy5zZXRYUmF5RW5hYmxlZChzZXR0aW5ncy54UmF5KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhbHBoYSBibGVuZGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGFscGhhIGJsZW5kaW5nIHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkFMUEhBX0JMRU5ESU5HID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuQUxQSEFfQkxFTkRJTkc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciBoaWRkZW4gcGFydHMgb2Ygc2VsZWN0ZWQgb2JqZWN0cyBzaG91bGQgYmUgdmlzaWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdHNldFhSYXlFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuWF9SQVkgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5YX1JBWTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgb3ZlcmxheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuXHQgKi9cclxuXHJcblx0c2V0UGF0dGVyblRleHR1cmUodGV4dHVyZSA9IG51bGwpIHtcclxuXHJcblx0XHRpZih0ZXh0dXJlICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuVVNFX1BBVFRFUk4gPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5VU0VfUEFUVEVSTjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50UGF0dGVybi52YWx1ZSA9IHRleHR1cmU7XHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSwgVmVjdG9yMiB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRNYXNrO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXYwO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYxO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYyO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYzO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGMwID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYwKS5yZztcXHJcXG5cXHR2ZWMyIGMxID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYxKS5yZztcXHJcXG5cXHR2ZWMyIGMyID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYyKS5yZztcXHJcXG5cXHR2ZWMyIGMzID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYzKS5yZztcXHJcXG5cXHJcXG5cXHRmbG9hdCBkMCA9IChjMC54IC0gYzEueCkgKiAwLjU7XFxyXFxuXFx0ZmxvYXQgZDEgPSAoYzIueCAtIGMzLngpICogMC41O1xcclxcblxcdGZsb2F0IGQgPSBsZW5ndGgodmVjMihkMCwgZDEpKTtcXHJcXG5cXHJcXG5cXHRmbG9hdCBhMCA9IG1pbihjMC55LCBjMS55KTtcXHJcXG5cXHRmbG9hdCBhMSA9IG1pbihjMi55LCBjMy55KTtcXHJcXG5cXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gbWluKGEwLCBhMSk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnID0gKDEuMCAtIHZpc2liaWxpdHlGYWN0b3IgPiAwLjAwMSkgPyB2ZWMyKGQsIDAuMCkgOiB2ZWMyKDAuMCwgZCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdjAgPSB2ZWMyKHV2LnggKyB0ZXhlbFNpemUueCwgdXYueSk7XFxyXFxuXFx0dlV2MSA9IHZlYzIodXYueCAtIHRleGVsU2l6ZS54LCB1di55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54LCB1di55ICsgdGV4ZWxTaXplLnkpO1xcclxcblxcdHZVdjMgPSB2ZWMyKHV2LngsIHV2LnkgLSB0ZXhlbFNpemUueSk7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQW4gb3V0bGluZSBlZGdlIGRldGVjdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIE91dGxpbmVFZGdlc01hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih0ZXhlbFNpemUgPSBuZXcgVmVjdG9yMigpKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJPdXRsaW5lRWRnZXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dE1hc2s6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldFRleGVsU2l6ZSh0ZXhlbFNpemUueCwgdGV4ZWxTaXplLnkpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFRleGVsU2l6ZSh4LCB5KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCBncmFudWxhcml0eTtcXHJcXG51bmlmb3JtIGZsb2F0IGR4O1xcclxcbnVuaWZvcm0gZmxvYXQgZHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDtcXHJcXG5cXHJcXG5cXHRpZihncmFudWxhcml0eSA+IDAuMCkge1xcclxcblxcclxcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKFxcclxcblxcdFxcdFxcdGR4ICogKGZsb29yKHZVdi54IC8gZHgpICsgMC41KSxcXHJcXG5cXHRcXHRcXHRkeSAqIChmbG9vcih2VXYueSAvIGR5KSArIDAuNSlcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdFxcdHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHR0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4ZWw7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgcGl4ZWxhdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IFJvYmVydCBDYXNhbm92YTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JlcnRjYXNhbm92YS9waXhlbGF0ZS1zaGFkZXJcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgUGl4ZWxhdGlvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpeGVsYXRpb24gbWF0ZXJpYWwuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiUGl4ZWxhdGlvbk1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0Z3JhbnVsYXJpdHk6IG5ldyBVbmlmb3JtKDEuMCksXHJcblx0XHRcdFx0cmVzb2x1dGlvbjogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoMS4wLCAxLjApKSxcclxuXHRcdFx0XHRkeDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRkeTogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBncmFudWxhcml0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGdyYW51bGFyaXR5KHgpIHtcclxuXHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XHJcblx0XHRjb25zdCByZXNvbHV0aW9uID0gdW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZTtcclxuXHJcblx0XHR1bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZSA9IHg7XHJcblx0XHR1bmlmb3Jtcy5keC52YWx1ZSA9IHggLyByZXNvbHV0aW9uLng7XHJcblx0XHR1bmlmb3Jtcy5keS52YWx1ZSA9IHggLyByZXNvbHV0aW9uLnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmVzb2x1dGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlLnNldCh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMuZ3JhbnVsYXJpdHkgPSB0aGlzLmdyYW51bGFyaXR5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGVwdGg7XFxyXFxuXFxyXFxudW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYU5lYXI7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFGYXI7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBmb2NhbExlbmd0aDtcXHJcXG51bmlmb3JtIGZsb2F0IGZvY2FsU3RvcDtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VUaHJlc2hvbGQ7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VHYWluO1xcclxcbnVuaWZvcm0gZmxvYXQgYmlhcztcXHJcXG51bmlmb3JtIGZsb2F0IGZyaW5nZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpdGhlclN0cmVuZ3RoO1xcclxcblxcclxcbiNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHZlYzIgZm9jdXNDb29yZHM7XFxyXFxuXFxyXFxuI2Vsc2VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGZvY2FsRGVwdGg7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdGZsb2F0IHJlYWREZXB0aChzYW1wbGVyMkQgZGVwdGhTYW1wbGVyLCB2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHRleHR1cmUyRChkZXB0aFNhbXBsZXIsIGNvb3JkKS54O1xcclxcblxcdFxcdGZsb2F0IHZpZXdaID0gcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooZnJhZ0Nvb3JkWiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKHZpZXdaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgUEVOVEFHT05cXHJcXG5cXHJcXG5cXHRmbG9hdCBwZW50YSh2ZWMyIGNvb3Jkcykge1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMwID0gdmVjNCggMS4wLCAgICAgICAgICAwLjAsICAgICAgICAgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMxID0gdmVjNCggMC4zMDkwMTY5OTQsICAwLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMyID0gdmVjNCgtMC44MDkwMTY5OTQsICAwLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMzID0gdmVjNCgtMC44MDkwMTY5OTQsIC0wLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM0ID0gdmVjNCggMC4zMDkwMTY5OTQsIC0wLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM1ID0gdmVjNCggMC4wLCAgICAgICAgICAwLjAsICAgICAgICAgMS4wLCAxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgT05FID0gdmVjNCgxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IFBfRkVBVEhFUiA9IDAuNDtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBOX0ZFQVRIRVIgPSAtUF9GRUFUSEVSO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGluT3JPdXQgPSAtNC4wO1xcclxcblxcclxcblxcdFxcdHZlYzQgUCA9IHZlYzQoY29vcmRzLCB2ZWMyKFJJTkdTX0ZMT0FUIC0gMS4zKSk7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBkaXN0ID0gdmVjNChcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMwKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMxKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMyKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMzKVxcclxcblxcdFxcdCk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdCA9IHNtb290aHN0ZXAoTl9GRUFUSEVSLCBQX0ZFQVRIRVIsIGRpc3QpO1xcclxcblxcclxcblxcdFxcdGluT3JPdXQgKz0gZG90KGRpc3QsIE9ORSk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdC54ID0gZG90KFAsIEhTNCk7XFxyXFxuXFx0XFx0ZGlzdC55ID0gSFM1LncgLSBhYnMoUC56KTtcXHJcXG5cXHJcXG5cXHRcXHRkaXN0ID0gc21vb3Roc3RlcChOX0ZFQVRIRVIsIFBfRkVBVEhFUiwgZGlzdCk7XFxyXFxuXFx0XFx0aW5Pck91dCArPSBkaXN0Lng7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGluT3JPdXQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFNIT1dfRk9DVVNcXHJcXG5cXHJcXG5cXHR2ZWMzIGRlYnVnRm9jdXModmVjMyBjLCBmbG9hdCBibHVyLCBmbG9hdCBkZXB0aCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGVkZ2UgPSAwLjAwMiAqIGRlcHRoO1xcclxcblxcdFxcdGZsb2F0IG0gPSBjbGFtcChzbW9vdGhzdGVwKDAuMCwgZWRnZSwgYmx1ciksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRmbG9hdCBlID0gY2xhbXAoc21vb3Roc3RlcCgxLjAgLSBlZGdlLCAxLjAsIGJsdXIpLCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0XFx0YyA9IG1peChjLCB2ZWMzKDEuMCwgMC41LCAwLjApLCAoMS4wIC0gbSkgKiAwLjYpO1xcclxcblxcdFxcdGMgPSBtaXgoYywgdmVjMygwLjAsIDAuNSwgMS4wKSwgKCgxLjAgLSBlKSAtICgxLjAgLSBtKSkgKiAwLjIpO1xcclxcblxcclxcblxcdFxcdHJldHVybiBjO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgVklHTkVUVEVcXHJcXG5cXHJcXG5cXHRmbG9hdCB2aWduZXR0ZSgpIHtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCB2ZWMyIENFTlRFUiA9IHZlYzIoMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBWSUdORVRURV9PVVQgPSAxLjM7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfSU4gPSAwLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfRkFERSA9IDIyLjA7IFxcclxcblxcclxcblxcdFxcdGZsb2F0IGQgPSBkaXN0YW5jZSh2VXYsIENFTlRFUik7XFxyXFxuXFx0XFx0ZCA9IHNtb290aHN0ZXAoVklHTkVUVEVfT1VUICsgKGZvY2FsU3RvcCAvIFZJR05FVFRFX0ZBREUpLCBWSUdORVRURV9JTiArIChmb2NhbFN0b3AgLyBWSUdORVRURV9GQURFKSwgZCk7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmVjMiByYW5kMih2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBub2lzZTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBhID0gMTIuOTg5ODtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBiID0gNzguMjMzO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGMgPSA0Mzc1OC41NDUzO1xcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSBjbGFtcChmcmFjdChzaW4obW9kKGRvdChjb29yZCwgdmVjMihhLCBiKSksIDMuMTQpKSAqIGMpLCAwLjAsIDEuMCkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9IGNsYW1wKGZyYWN0KHNpbihtb2QoZG90KGNvb3JkLCB2ZWMyKGEsIGIpICogMi4wKSwgMy4xNCkpICogYyksIDAuMCwgMS4wKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSAoKGZyYWN0KDEuMCAtIGNvb3JkLnMgKiBoYWxmVGV4ZWxTaXplLngpICogMC4yNSkgKyAoZnJhY3QoY29vcmQudCAqIGhhbGZUZXhlbFNpemUueSkgKiAwLjc1KSkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9ICgoZnJhY3QoMS4wIC0gY29vcmQucyAqIGhhbGZUZXhlbFNpemUueCkgKiAwLjc1KSArIChmcmFjdChjb29yZC50ICogaGFsZlRleGVsU2l6ZS55KSAqIDAuMjUpKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbm9pc2U7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzMgcHJvY2Vzc1RleGVsKHZlYzIgY29vcmRzLCBmbG9hdCBibHVyKSB7XFxyXFxuXFxyXFxuXFx0dmVjMyBjO1xcclxcblxcdGMuciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigwLjAsIDEuMCkgKiB0ZXhlbFNpemUgKiBmcmluZ2UgKiBibHVyKS5yO1xcclxcblxcdGMuZyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigtMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuZztcXHJcXG5cXHRjLmIgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcyArIHZlYzIoMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuYjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdGhlIGx1bWluYW5jZSBvZiB0aGUgY29uc3RydWN0ZWQgY29sb3VyLlxcclxcblxcdGZsb2F0IGx1bWluYW5jZSA9IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoYyk7XFxyXFxuXFx0ZmxvYXQgdGhyZXNob2xkID0gbWF4KChsdW1pbmFuY2UgLSBsdW1pbmFuY2VUaHJlc2hvbGQpICogbHVtaW5hbmNlR2FpbiwgMC4wKTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gYyArIG1peCh2ZWMzKDAuMCksIGMsIHRocmVzaG9sZCAqIGJsdXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBsaW5lYXJpemUoZmxvYXQgZGVwdGgpIHtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gLWNhbWVyYUZhciAqIGNhbWVyYU5lYXIgLyAoZGVwdGggKiAoY2FtZXJhRmFyIC0gY2FtZXJhTmVhcikgLSBjYW1lcmFGYXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBnYXRoZXIoZmxvYXQgaSwgZmxvYXQgaiwgZmxvYXQgcmluZ1NhbXBsZXMsIGlub3V0IHZlYzMgY29sb3IsIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGJsdXIpIHtcXHJcXG5cXHJcXG5cXHRjb25zdCBmbG9hdCBUV09fUEkgPSA2LjI4MzE4NTMxO1xcclxcblxcclxcblxcdGZsb2F0IHN0ZXAgPSBUV09fUEkgLyByaW5nU2FtcGxlcztcXHJcXG5cXHRmbG9hdCBwdyA9IGNvcyhqICogc3RlcCkgKiBpO1xcclxcblxcdGZsb2F0IHBoID0gc2luKGogKiBzdGVwKSAqIGk7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFBFTlRBR09OXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgcCA9IHBlbnRhKHZlYzIocHcsIHBoKSk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBwID0gMS4wO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yICs9IHByb2Nlc3NUZXhlbCh2VXYgKyB2ZWMyKHB3ICogdywgcGggKiBoKSwgYmx1cikgKiBtaXgoMS4wLCBpIC8gUklOR1NfRkxPQVQsIGJpYXMpICogcDtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbWl4KDEuMCwgaSAvIFJJTkdTX0ZMT0FULCBiaWFzKSAqIHA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGggPSBsaW5lYXJpemUodGV4dHVyZTJEKHREZXB0aCwgdlV2KS54KTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gbGluZWFyaXplKHJlYWREZXB0aCh0RGVwdGgsIHZVdikpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZkRlcHRoID0gbGluZWFyaXplKHRleHR1cmUyRCh0RGVwdGgsIGZvY3VzQ29vcmRzKS54KTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGZEZXB0aCA9IGxpbmVhcml6ZShyZWFkRGVwdGgodERlcHRoLCBmb2N1c0Nvb3JkcykpO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZkRlcHRoID0gZm9jYWxEZXB0aDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTUFOVUFMX0RPRlxcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IG5Eb0ZTdGFydCA9IDEuMDsgXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgbkRvRkRpc3QgPSAyLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgZkRvRlN0YXJ0ID0gMS4wO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGZEb0ZEaXN0ID0gMy4wO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZvY2FsUGxhbmUgPSBkZXB0aCAtIGZEZXB0aDtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZSAtIGZEb0ZTdGFydCkgLyBmRG9GRGlzdDtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKC1mb2NhbFBsYW5lIC0gbkRvRlN0YXJ0KSAvIG5Eb0ZEaXN0O1xcclxcblxcclxcblxcdFxcdGZsb2F0IGJsdXIgPSAoZm9jYWxQbGFuZSA+IDAuMCkgPyBmYXJEb0YgOiBuZWFyRG9GO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgQ0lSQ0xFX09GX0NPTkZVU0lPTiA9IDAuMDM7IC8vIDM1bW0gZmlsbSA9IDAuMDNtbSBDb0MuXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZm9jYWxQbGFuZU1NID0gZkRlcHRoICogMTAwMC4wO1xcclxcblxcdFxcdGZsb2F0IGRlcHRoTU0gPSBkZXB0aCAqIDEwMDAuMDtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmb2NhbFBsYW5lID0gKGRlcHRoTU0gKiBmb2NhbExlbmd0aCkgLyAoZGVwdGhNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZU1NICogZm9jYWxMZW5ndGgpIC8gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKSAvIChmb2NhbFBsYW5lTU0gKiBmb2NhbFN0b3AgKiBDSVJDTEVfT0ZfQ09ORlVTSU9OKTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBibHVyID0gYWJzKGZvY2FsUGxhbmUgLSBmYXJEb0YpICogbmVhckRvRjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRibHVyID0gY2xhbXAoYmx1ciwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdC8vIERpdGhlcmluZy5cXHJcXG5cXHR2ZWMyIG5vaXNlID0gcmFuZDIodlV2KSAqIGRpdGhlclN0cmVuZ3RoICogYmx1cjtcXHJcXG5cXHJcXG5cXHRmbG9hdCBibHVyRmFjdG9yWCA9IHRleGVsU2l6ZS54ICogYmx1ciAqIG1heEJsdXIgKyBub2lzZS54O1xcclxcblxcdGZsb2F0IGJsdXJGYWN0b3JZID0gdGV4ZWxTaXplLnkgKiBibHVyICogbWF4Qmx1ciArIG5vaXNlLnk7XFxyXFxuXFxyXFxuXFx0Y29uc3QgaW50IE1BWF9SSU5HX1NBTVBMRVMgPSBSSU5HU19JTlQgKiBTQU1QTEVTX0lOVDtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGlvbiBvZiBmaW5hbCBjb2xvci5cXHJcXG5cXHR2ZWM0IGNvbG9yO1xcclxcblxcclxcblxcdGlmKGJsdXIgPCAwLjA1KSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBzID0gMS4wO1xcclxcblxcdFxcdGludCByaW5nU2FtcGxlcztcXHJcXG5cXHJcXG5cXHRcXHRmb3IoaW50IGkgPSAxOyBpIDw9IFJJTkdTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0cmluZ1NhbXBsZXMgPSBpICogU0FNUExFU19JTlQ7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Ly8gQ29uc3RhbnQgbG9vcC5cXHJcXG5cXHRcXHRcXHRmb3IoaW50IGogPSAwOyBqIDwgTUFYX1JJTkdfU0FNUExFUzsgKytqKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0Ly8gQnJlYWsgZWFybGllci5cXHJcXG5cXHRcXHRcXHRcXHRpZihqID49IHJpbmdTYW1wbGVzKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0cyArPSBnYXRoZXIoZmxvYXQoaSksIGZsb2F0KGopLCBmbG9hdChyaW5nU2FtcGxlcyksIGNvbG9yLnJnYiwgYmx1ckZhY3RvclgsIGJsdXJGYWN0b3JZLCBibHVyKTtcXHJcXG5cXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiAvPSBzOyAvLyBEaXZpZGUgYnkgc2FtcGxlIGNvdW50LlxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0hPV19GT0NVU1xcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiA9IGRlYnVnRm9jdXMoY29sb3IucmdiLCBibHVyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICo9IHZpZ25ldHRlKCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIERlcHRoIG9mIEZpZWxkIHNoYWRlciB2Mi40LlxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzaGFkZXIgY29kZSBieSBNYXJ0aW5zIFVwaXRpczpcclxuICogIGh0dHA6Ly9ibGVuZGVyYXJ0aXN0cy5vcmcvZm9ydW0vc2hvd3RocmVhZC5waHA/MjM3NDg4LUdMU0wtZGVwdGgtb2YtZmllbGQtd2l0aC1ib2tlaC12Mi00LSh1cGRhdGUpXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm9rZWgyIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgbWFpbiBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25zLnRleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yaW5ncz0zXSAtIFRoZSBudW1iZXIgb2YgYmx1cnJpbmcgaXRlcmF0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNhbXBsZXM9Ml0gLSBUaGUgYW1vdW50IG9mIHNhbXBsZXMgdGFrZW4gcGVyIHJpbmcuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaG93Rm9jdXM9ZmFsc2VdIC0gV2hldGhlciB0aGUgZm9jdXMgcG9pbnQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFudWFsRG9GPWZhbHNlXSAtIEVuYWJsZXMgbWFudWFsIGRlcHRoIG9mIGZpZWxkIGJsdXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBFbmFibGVzIGEgdmlnbmV0dGUgZWZmZWN0LlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucGVudGFnb249ZmFsc2VdIC0gRW5hYmxlIHRvIHVzZSBhIHBlbnRhZ29uYWwgc2hhcGUgdG8gc2NhbGUgZ2F0aGVyZWQgdGV4ZWxzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hhZGVyRm9jdXM9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBjb21wdXRlIHlvdXIgb3duIGZvY2FsRGVwdGggKGluIG1ldHJlcyEpLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBkb24ndCB3YW50IG5vaXNlIHBhdHRlcm5zIGZvciBkaXRoZXJpbmcuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heEJsdXI9MS4wXSAtIFRoZSBtYXhpbXVtIGJsdXIgc3RyZW5ndGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmx1bWluYW5jZVRocmVzaG9sZD0wLjVdIC0gQSBsdW1pbmFuY2UgdGhyZXNob2xkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5sdW1pbmFuY2VHYWluPTIuMF0gLSBBIGx1bWluYW5jZSBnYWluIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmlhcz0wLjVdIC0gQSBibHVyIGJpYXMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZyaW5nZT0wLjddIC0gQSBibHVyIG9mZnNldC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGl0aGVyU3RyZW5ndGg9MC4wMDAxXSAtIFRoZSBkaXRoZXIgc3RyZW5ndGguXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdHRleGVsU2l6ZTogbnVsbCxcclxuXHRcdFx0cmluZ3M6IDMsXHJcblx0XHRcdHNhbXBsZXM6IDIsXHJcblx0XHRcdHNob3dGb2N1czogZmFsc2UsXHJcblx0XHRcdG1hbnVhbERvRjogZmFsc2UsXHJcblx0XHRcdHZpZ25ldHRlOiBmYWxzZSxcclxuXHRcdFx0cGVudGFnb246IGZhbHNlLFxyXG5cdFx0XHRzaGFkZXJGb2N1czogdHJ1ZSxcclxuXHRcdFx0bm9pc2U6IHRydWUsXHJcblx0XHRcdG1heEJsdXI6IDEuMCxcclxuXHRcdFx0bHVtaW5hbmNlVGhyZXNob2xkOiAwLjUsXHJcblx0XHRcdGx1bWluYW5jZUdhaW46IDIuMCxcclxuXHRcdFx0YmlhczogMC41LFxyXG5cdFx0XHRmcmluZ2U6IDAuNyxcclxuXHRcdFx0ZGl0aGVyU3RyZW5ndGg6IDAuMDAwMVxyXG5cdFx0fSwgb3B0aW9ucyk7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJSZWFsaXN0aWNCb2tlaE1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHRkZWZpbmVzOiB7XHJcblxyXG5cdFx0XHRcdFJJTkdTX0lOVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgwKSxcclxuXHRcdFx0XHRSSU5HU19GTE9BVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgxKSxcclxuXHRcdFx0XHRTQU1QTEVTX0lOVDogc2V0dGluZ3Muc2FtcGxlcy50b0ZpeGVkKDApLFxyXG5cdFx0XHRcdFNBTVBMRVNfRkxPQVQ6IHNldHRpbmdzLnNhbXBsZXMudG9GaXhlZCgxKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0RGVwdGg6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cclxuXHRcdFx0XHR0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxyXG5cdFx0XHRcdGhhbGZUZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxyXG5cclxuXHRcdFx0XHRjYW1lcmFOZWFyOiBuZXcgVW5pZm9ybSgwLjEpLFxyXG5cdFx0XHRcdGNhbWVyYUZhcjogbmV3IFVuaWZvcm0oMjAwMCksXHJcblxyXG5cdFx0XHRcdGZvY2FsTGVuZ3RoOiBuZXcgVW5pZm9ybSgyNC4wKSxcclxuXHRcdFx0XHRmb2NhbFN0b3A6IG5ldyBVbmlmb3JtKDAuOSksXHJcblxyXG5cdFx0XHRcdG1heEJsdXI6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm1heEJsdXIpLFxyXG5cdFx0XHRcdGx1bWluYW5jZVRocmVzaG9sZDogbmV3IFVuaWZvcm0oc2V0dGluZ3MubHVtaW5hbmNlVGhyZXNob2xkKSxcclxuXHRcdFx0XHRsdW1pbmFuY2VHYWluOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5sdW1pbmFuY2VHYWluKSxcclxuXHRcdFx0XHRiaWFzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5iaWFzKSxcclxuXHRcdFx0XHRmcmluZ2U6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmZyaW5nZSksXHJcblx0XHRcdFx0ZGl0aGVyU3RyZW5ndGg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRpdGhlclN0cmVuZ3RoKSxcclxuXHJcblx0XHRcdFx0Zm9jdXNDb29yZHM6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKDAuNSwgMC41KSksXHJcblx0XHRcdFx0Zm9jYWxEZXB0aDogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc2V0U2hvd0ZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaG93Rm9jdXMpO1xyXG5cdFx0dGhpcy5zZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkKHNldHRpbmdzLm1hbnVhbERvRik7XHJcblx0XHR0aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XHJcblx0XHR0aGlzLnNldFBlbnRhZ29uRW5hYmxlZChzZXR0aW5ncy5wZW50YWdvbik7XHJcblx0XHR0aGlzLnNldFNoYWRlckZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaGFkZXJGb2N1cyk7XHJcblx0XHR0aGlzLnNldE5vaXNlRW5hYmxlZChzZXR0aW5ncy5ub2lzZSk7XHJcblxyXG5cdFx0aWYoc2V0dGluZ3MudGV4ZWxTaXplICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldFRleGVsU2l6ZShzZXR0aW5ncy50ZXhlbFNpemUueCwgc2V0dGluZ3MudGV4ZWxTaXplLnkpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93bi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFRydWUgaWYgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93biwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaG93Rm9jdXNFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuU0hPV19GT0NVUyA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNIT1dfRk9DVVM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciBtYW51YWwgRGVwdGggb2YgRmllbGQgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG1hbnVhbCBEb0Ygc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5NQU5VQUxfRE9GID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuTUFOVUFMX0RPRjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgcGVudGFnb25hbCBibHVyIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHBlbnRhZ29uYWwgYmx1ciBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFBlbnRhZ29uRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlBFTlRBR09OID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuUEVOVEFHT047XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBzaGFkZXIgZm9jdXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzaGFkZXIgZm9jdXMgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFNoYWRlckZvY3VzRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUyA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBkaXRoZXJpbmcgc2hvdWxkIGNvbXB1dGUgbm9pc2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG5vaXNlLWJhc2VkIGRpdGhlcmluZyBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0Tm9pc2VFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuTk9JU0UgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5OT0lTRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdGV4ZWwgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHRleGVsIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gVGhlIHRleGVsIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0VGV4ZWxTaXplKHgsIHkpIHtcclxuXHJcblx0XHR0aGlzLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSk7XHJcblx0XHR0aGlzLnVuaWZvcm1zLmhhbGZUZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpLm11bHRpcGx5U2NhbGFyKDAuNSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRvcHRzIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgYW5kIHRoZSBmb2NhbCBsZW5ndGggb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKi9cclxuXHJcblx0YWRvcHRDYW1lcmFTZXR0aW5ncyhjYW1lcmEpIHtcclxuXHJcblx0XHRpZihjYW1lcmEgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHR0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblx0XHRcdHRoaXMudW5pZm9ybXMuZm9jYWxMZW5ndGgudmFsdWUgPSBjYW1lcmEuZ2V0Rm9jYWxMZW5ndGgoKTsgLy8gdW5pdDogbW0uXHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzIgY2VudGVyO1xcclxcbnVuaWZvcm0gZmxvYXQgYXNwZWN0O1xcclxcbnVuaWZvcm0gZmxvYXQgd2F2ZVNpemU7XFxyXFxudW5pZm9ybSBmbG9hdCByYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhSYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBhbXBsaXR1ZGU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIGZsb2F0IHZTaXplO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRpZmZlcmVuY2UgPSB2VXYgKiBhc3BlY3RDb3JyZWN0aW9uIC0gY2VudGVyICogYXNwZWN0Q29ycmVjdGlvbjtcXHJcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IHNxcnQoZG90KGRpZmZlcmVuY2UsIGRpZmZlcmVuY2UpKSAqIHZTaXplO1xcclxcblxcclxcblxcdHZlYzIgZGlzcGxhY2VtZW50ID0gdmVjMigwLjApO1xcclxcblxcclxcblxcdGlmKGRpc3RhbmNlID4gcmFkaXVzKSB7XFxyXFxuXFxyXFxuXFx0XFx0aWYoZGlzdGFuY2UgPCByYWRpdXMgKyB3YXZlU2l6ZSkge1xcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGFuZ2xlID0gKGRpc3RhbmNlIC0gcmFkaXVzKSAqIFBJMiAvIHdhdmVTaXplO1xcclxcblxcdFxcdFxcdGZsb2F0IGNvc1NpbiA9ICgxLjAgLSBjb3MoYW5nbGUpKSAqIDAuNTtcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBleHRlbnQgPSBtYXhSYWRpdXMgKyB3YXZlU2l6ZTtcXHJcXG5cXHRcXHRcXHRmbG9hdCBkZWNheSA9IG1heChleHRlbnQgLSBkaXN0YW5jZSAqIGRpc3RhbmNlLCAwLjApIC8gZXh0ZW50O1xcclxcblxcclxcblxcdFxcdFxcdGRpc3BsYWNlbWVudCA9ICgoY29zU2luICogYW1wbGl0dWRlICogZGlmZmVyZW5jZSkgLyBkaXN0YW5jZSkgKiBkZWNheTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2IC0gZGlzcGxhY2VtZW50KTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFEaXN0YW5jZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgZmxvYXQgdlNpemU7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdHZTaXplID0gKDAuMSAqIGNhbWVyYURpc3RhbmNlKSAvIHNpemU7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogQmFzZWQgb24gYSBHaXN0IGJ5IEplYW4tUGhpbGlwcGUgU2FyZGE6XHJcbiAqICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qcHNhcmRhLzMzY2VhNjdhOWYyZWNiMGEwZWRhXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNob2NrV2F2ZU1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNob2NrIHdhdmUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdG1heFJhZGl1czogMS4wLFxyXG5cdFx0XHR3YXZlU2l6ZTogMC4yLFxyXG5cdFx0XHRhbXBsaXR1ZGU6IDAuMDVcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU2hvY2tXYXZlTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0Y2VudGVyOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigwLjUsIDAuNSkpLFxyXG5cdFx0XHRcdGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRjYW1lcmFEaXN0YW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHJcblx0XHRcdFx0c2l6ZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRyYWRpdXM6IG5ldyBVbmlmb3JtKC1zZXR0aW5ncy53YXZlU2l6ZSksXHJcblx0XHRcdFx0bWF4UmFkaXVzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5tYXhSYWRpdXMpLFxyXG5cdFx0XHRcdHdhdmVTaXplOiBuZXcgVW5pZm9ybShzZXR0aW5ncy53YXZlU2l6ZSksXHJcblx0XHRcdFx0YW1wbGl0dWRlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hbXBsaXR1ZGUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0V2VpZ2h0cztcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIEZldGNoIHRoZSBibGVuZGluZyB3ZWlnaHRzIGZvciBjdXJyZW50IHBpeGVsLlxcclxcblxcdHZlYzQgYTtcXHJcXG5cXHRhLnh6ID0gdGV4dHVyZTJEKHRXZWlnaHRzLCB2VXYpLnh6O1xcclxcblxcdGEueSA9IHRleHR1cmUyRCh0V2VpZ2h0cywgdk9mZnNldC56dykuZztcXHJcXG5cXHRhLncgPSB0ZXh0dXJlMkQodFdlaWdodHMsIHZPZmZzZXQueHkpLmE7XFxyXFxuXFxyXFxuXFx0dmVjNCBjb2xvcjtcXHJcXG5cXHJcXG5cXHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgYmxlbmRpbmcgd2VpZ2h0IHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4wLlxcclxcblxcdGlmKGRvdChhLCB2ZWM0KDEuMCkpIDwgMWUtNSkge1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHQvKiBVcCB0byBmb3VyIGxpbmVzIGNhbiBiZSBjcm9zc2luZyBhIHBpeGVsIChvbmUgdGhyb3VnaCBlYWNoIGVkZ2UpLlxcclxcblxcdFxcdCAqIFRoZSBsaW5lIHdpdGggdGhlIG1heGltdW0gd2VpZ2h0IGZvciBlYWNoIGRpcmVjdGlvbiBpcyBmYXZvdXJlZC5cXHJcXG5cXHRcXHQgKi9cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIG9mZnNldDtcXHJcXG5cXHRcXHRvZmZzZXQueCA9IGEuYSA+IGEuYiA/IGEuYSA6IC1hLmI7IC8vIExlZnQgdnMuIHJpZ2h0LlxcclxcblxcdFxcdG9mZnNldC55ID0gYS5nID4gYS5yID8gLWEuZyA6IGEucjsgLy8gVG9wIHZzLiBib3R0b20gKGNoYW5nZWQgc2lnbnMpLlxcclxcblxcclxcblxcdFxcdC8vIEdvIGluIHRoZSBkaXJlY3Rpb24gd2l0aCB0aGUgbWF4aW11bSB3ZWlnaHQgKGhvcml6b250YWwgdnMuIHZlcnRpY2FsKS5cXHJcXG5cXHRcXHRpZihhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSkge1xcclxcblxcclxcblxcdFxcdFxcdG9mZnNldC55ID0gMC4wO1xcclxcblxcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0b2Zmc2V0LnggPSAwLjA7XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBvcHBvc2l0ZSBjb2xvciBhbmQgbGVycCBieSBoYW5kLlxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFx0XFx0dmVjMiBjb29yZCA9IHZVdiArIHNpZ24ob2Zmc2V0KSAqIHRleGVsU2l6ZTtcXHJcXG5cXHRcXHR2ZWM0IG9wcG9zaXRlQ29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkLCAwLjApO1xcclxcblxcdFxcdGZsb2F0IHMgPSBhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSA/IGFicyhvZmZzZXQueCkgOiBhYnMob2Zmc2V0LnkpO1xcclxcblxcclxcblxcdFxcdC8vIEdhbW1hIGNvcnJlY3Rpb24uXFxyXFxuXFx0XFx0Y29sb3IucmdiID0gcG93KGFicyhjb2xvci5yZ2IpLCB2ZWMzKDIuMikpO1xcclxcblxcdFxcdG9wcG9zaXRlQ29sb3IucmdiID0gcG93KGFicyhvcHBvc2l0ZUNvbG9yLnJnYiksIHZlYzMoMi4yKSk7XFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIG9wcG9zaXRlQ29sb3IsIHMpO1xcclxcblxcdFxcdGNvbG9yLnJnYiA9IHBvdyhhYnMoY29sb3IucmdiKSwgdmVjMygxLjAgLyAyLjIpKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldCA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoMS4wLCAwLjAsIDAuMCwgLTEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBTdWJwaXhlbCBNb3JwaG9sb2dpY2FsIEFudGlhbGlhc2luZy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgZmluYWwgYW50aWFsaWFzaW5nLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBTTUFBQmxlbmRNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBTTUFBIGJsZW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU01BQUJsZW5kTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0V2VpZ2h0czogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjZGVmaW5lIHNhbXBsZUxldmVsWmVyb09mZnNldCh0LCBjb29yZCwgb2Zmc2V0KSB0ZXh0dXJlMkQodCwgY29vcmQgKyBmbG9hdChvZmZzZXQpICogdGV4ZWxTaXplLCAwLjApXFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEFyZWE7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFNlYXJjaDtcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52ZWMyIHJvdW5kKHZlYzIgeCkge1xcclxcblxcclxcblxcdHJldHVybiBzaWduKHgpICogZmxvb3IoYWJzKHgpICsgMC41KTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoTGVuZ3RoKHZlYzIgZSwgZmxvYXQgYmlhcywgZmxvYXQgc2NhbGUpIHtcXHJcXG5cXHJcXG5cXHQvLyBOb3QgcmVxdWlyZWQgaWYgdFNlYXJjaCBhY2Nlc3NlcyBhcmUgc2V0IHRvIHBvaW50LlxcclxcblxcdC8vIGNvbnN0IHZlYzIgU0VBUkNIX1RFWF9QSVhFTF9TSVpFID0gMS4wIC8gdmVjMig2Ni4wLCAzMy4wKTtcXHJcXG5cXHQvLyBlID0gdmVjMihiaWFzLCAwLjApICsgMC41ICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFICsgZSAqIHZlYzIoc2NhbGUsIDEuMCkgKiB2ZWMyKDY0LjAsIDMyLjApICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFO1xcclxcblxcclxcblxcdGUuciA9IGJpYXMgKyBlLnIgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gMjU1LjAgKiB0ZXh0dXJlMkQodFNlYXJjaCwgZSwgMC4wKS5yO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYTGVmdCh2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHQvKiBAUFNFVURPX0dBVEhFUjRcXHJcXG5cXHQgKiBUaGlzIHRleENvb3JkIGhhcyBiZWVuIG9mZnNldCBieSAoLTAuMjUsIC0wLjEyNSkgaW4gdGhlIHZlcnRleCBzaGFkZXIgdG9cXHJcXG5cXHQgKiBzYW1wbGUgYmV0d2VlbiBlZGdlLCB0aHVzIGZldGNoaW5nIGZvdXIgZWRnZXMgaW4gYSByb3cuXFxyXFxuXFx0ICogU2FtcGxpbmcgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cyBpbiBlYWNoIGRpcmVjdGlvbiBhbGxvd3MgdG8gZGlzYW1iaWd1YXRlXFxyXFxuXFx0ICogd2hpY2ggZWRnZXMgYXJlIGFjdGl2ZSBmcm9tIHRoZSBmb3VyIGZldGNoZWQgb25lcy5cXHJcXG5cXHQgKi9cXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcdFxcdHRleENvb3JkIC09IHZlYzIoMi4wLCAwLjApICogdGV4ZWxTaXplO1xcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueCA+IGVuZCAmJiBlLmcgPiAwLjgyODEgJiYgZS5yID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ29ycmVjdCB0aGUgcHJldmlvdXNseSBhcHBsaWVkIG9mZnNldCAoLTAuMjUsIC0wLjEyNSkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFxyXFxuXFx0Ly8gVGhlIHNlYXJjaGVzIGFyZSBiaWFzZWQgYnkgMSwgc28gYWRqdXN0IHRoZSBjb29yZHMgYWNjb3JkaW5nbHkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSB0ZXhlbFNpemUueDtcXHJcXG5cXHJcXG5cXHQvLyBEaXNhbWJpZ3VhdGUgdGhlIGxlbmd0aCBhZGRlZCBieSB0aGUgbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggKz0gMi4wICogdGV4ZWxTaXplLng7IC8vIFVuZG8gbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLnggKiBzZWFyY2hMZW5ndGgoZSwgMC4wLCAwLjUpO1xcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC54O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYUmlnaHQodmVjMiB0ZXhDb29yZCwgZmxvYXQgZW5kKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBlID0gdmVjMigwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE1BWF9TRUFSQ0hfU1RFUFNfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCArPSB2ZWMyKDIuMCwgMC4wKSAqIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnggPCBlbmQgJiYgZS5nID4gMC44MjgxICYmIGUuciA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnggLT0gMC4yNSAqIHRleGVsU2l6ZS54O1xcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLng7XFxyXFxuXFx0dGV4Q29vcmQueCAtPSAyLjAgKiB0ZXhlbFNpemUueDtcXHJcXG5cXHR0ZXhDb29yZC54ICs9IHRleGVsU2l6ZS54ICogc2VhcmNoTGVuZ3RoKGUsIDAuNSwgMC41KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4Q29vcmQueDtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoWVVwKHZlYzIgdGV4Q29vcmQsIGZsb2F0IGVuZCkge1xcclxcblxcclxcblxcdHZlYzIgZSA9IHZlYzIoMS4wLCAwLjApO1xcclxcblxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfU0VBUkNIX1NURVBTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFx0XFx0dGV4Q29vcmQgKz0gdmVjMigwLjAsIDIuMCkgKiB0ZXhlbFNpemU7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnkgPiBlbmQgJiYgZS5yID4gMC44MjgxICYmIGUuZyA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnkgLT0gMC4yNSAqIHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSAtPSB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gMi4wICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55ICogc2VhcmNoTGVuZ3RoKGUuZ3IsIDAuMCwgMC41KTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC55O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hZRG93bih2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDEuMCwgMC4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSApIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCAtPSB2ZWMyKDAuMCwgMi4wKSAqIHRleGVsU2l6ZTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueSA8IGVuZCAmJiBlLnIgPiAwLjgyODEgJiYgZS5nID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0dGV4Q29vcmQueSArPSAwLjI1ICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSArPSAyLjAgKiB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gdGV4ZWxTaXplLnkgKiBzZWFyY2hMZW5ndGgoZS5nciwgMC41LCAwLjUpOyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleENvb3JkLnk7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzIgYXJlYSh2ZWMyIGRpc3QsIGZsb2F0IGUxLCBmbG9hdCBlMiwgZmxvYXQgb2Zmc2V0KSB7XFxyXFxuXFxyXFxuXFx0Ly8gUm91bmRpbmcgcHJldmVudHMgcHJlY2lzaW9uIGVycm9ycyBvZiBiaWxpbmVhciBmaWx0ZXJpbmcuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IEFSRUFURVhfTUFYX0RJU1RBTkNFICogcm91bmQoNC4wICogdmVjMihlMSwgZTIpKSArIGRpc3Q7XFxyXFxuXFxyXFxuXFx0Ly8gU2NhbGUgYW5kIGJpYXMgZm9yIHRleGVsIHNwYWNlIHRyYW5zbGF0aW9uLlxcclxcblxcdHRleENvb3JkID0gQVJFQVRFWF9QSVhFTF9TSVpFICogdGV4Q29vcmQgKyAoMC41ICogQVJFQVRFWF9QSVhFTF9TSVpFKTtcXHJcXG5cXHJcXG5cXHQvLyBNb3ZlIHRvIHByb3BlciBwbGFjZSwgYWNjb3JkaW5nIHRvIHRoZSBzdWJwaXhlbCBvZmZzZXQuXFxyXFxuXFx0dGV4Q29vcmQueSArPSBBUkVBVEVYX1NVQlRFWF9TSVpFICogb2Zmc2V0O1xcclxcblxcclxcblxcdHJldHVybiB0ZXh0dXJlMkQodEFyZWEsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB3ZWlnaHRzID0gdmVjNCgwLjApO1xcclxcblxcdHZlYzQgc3Vic2FtcGxlSW5kaWNlcyA9IHZlYzQoMC4wKTtcXHJcXG5cXHR2ZWMyIGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdikucmc7XFxyXFxuXFxyXFxuXFx0aWYoZS5nID4gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRWRnZSBhdCBub3J0aC5cXHJcXG5cXHRcXHR2ZWMyIGQ7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGxlZnQuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYTGVmdCh2T2Zmc2V0WzBdLnh5LCB2T2Zmc2V0WzJdLngpO1xcclxcblxcdFxcdGNvb3Jkcy55ID0gdk9mZnNldFsxXS55OyAvLyB2T2Zmc2V0WzFdLnkgPSB2VXYueSAtIDAuMjUgKiB0ZXhlbFNpemUueSAoQENST1NTSU5HX09GRlNFVClcXHJcXG5cXHRcXHRkLnggPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBOb3cgZmV0Y2ggdGhlIGxlZnQgY3Jvc3NpbmcgZWRnZXMsIHR3byBhdCBhIHRpbWUgdXNpbmcgYmlsaW5lYXJcXHJcXG5cXHRcXHRmaWx0ZXJpbmcuIFNhbXBsaW5nIGF0IC0wLjI1IChzZWUgQENST1NTSU5HX09GRlNFVCkgZW5hYmxlcyB0byBkaXNjZXJuIHdoYXRcXHJcXG5cXHRcXHR2YWx1ZSBlYWNoIGVkZ2UgaGFzLiAqL1xcclxcblxcdFxcdGZsb2F0IGUxID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMsIDAuMCkucjtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGaW5kIHRoZSBkaXN0YW5jZSB0byB0aGUgcmlnaHQuXFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYUmlnaHQodk9mZnNldFswXS56dywgdk9mZnNldFsyXS55KTtcXHJcXG5cXHRcXHRkLnkgPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBUcmFuc2xhdGUgZGlzdGFuY2VzIHRvIHBpeGVsIHVuaXRzIGZvciBiZXR0ZXIgaW50ZXJsZWF2ZSBhcml0aG1ldGljIGFuZFxcclxcblxcdFxcdG1lbW9yeSBhY2Nlc3Nlcy4gKi9cXHJcXG5cXHRcXHRkID0gZCAvIHRleGVsU2l6ZS54IC0gdlBpeENvb3JkLng7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gVGhlIGFyZWEgdGV4dHVyZSBpcyBjb21wcmVzc2VkIHF1YWRyYXRpY2FsbHkuXFxyXFxuXFx0XFx0dmVjMiBzcXJ0RCA9IHNxcnQoYWJzKGQpKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGZXRjaCB0aGUgcmlnaHQgY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMSwgMCkpLnI7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gUGF0dGVybiByZWNvZ25pc2VkLCBub3cgZ2V0IHRoZSBhY3R1YWwgYXJlYS5cXHJcXG5cXHRcXHR3ZWlnaHRzLnJnID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLnkpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRpZihlLnIgPiAwLjApIHtcXHJcXG5cXHJcXG5cXHRcXHQvLyBFZGdlIGF0IHdlc3QuXFxyXFxuXFx0XFx0dmVjMiBkO1xcclxcblxcclxcblxcdFxcdC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSB0b3AuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnkgPSBzZWFyY2hZVXAodk9mZnNldFsxXS54eSwgdk9mZnNldFsyXS56KTtcXHJcXG5cXHRcXHRjb29yZHMueCA9IHZPZmZzZXRbMF0ueDsgLy8gdk9mZnNldFsxXS54ID0gdlV2LnggLSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFx0XFx0ZC54ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmV0Y2ggdGhlIHRvcCBjcm9zc2luZyBlZGdlcy5cXHJcXG5cXHRcXHRmbG9hdCBlMSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzLCAwLjApLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGJvdHRvbS5cXHJcXG5cXHRcXHRjb29yZHMueSA9IHNlYXJjaFlEb3duKHZPZmZzZXRbMV0uencsIHZPZmZzZXRbMl0udyk7XFxyXFxuXFx0XFx0ZC55ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRGlzdGFuY2VzIGluIHBpeGVsIHVuaXRzLlxcclxcblxcdFxcdGQgPSBkIC8gdGV4ZWxTaXplLnkgLSB2UGl4Q29vcmQueTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBUaGUgYXJlYSB0ZXh0dXJlIGlzIGNvbXByZXNzZWQgcXVhZHJhdGljYWxseS5cXHJcXG5cXHRcXHR2ZWMyIHNxcnREID0gc3FydChhYnMoZCkpO1xcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBib3R0b20gY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMCwgMSkpLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gR2V0IHRoZSBhcmVhIGZvciB0aGlzIGRpcmVjdGlvbi5cXHJcXG5cXHRcXHR3ZWlnaHRzLmJhID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLngpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB3ZWlnaHRzO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dlBpeENvb3JkID0gdXYgLyB0ZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0Ly8gT2Zmc2V0cyBmb3IgdGhlIHNlYXJjaGVzIChzZWUgQFBTRVVET19HQVRIRVI0KS5cXHJcXG5cXHR2T2Zmc2V0WzBdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4yNSwgMC4xMjUsIDEuMjUsIDAuMTI1KTsgLy8gQ2hhbmdlZCBzaWduIGluIFkgYW5kIFcgY29tcG9uZW50cy5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4xMjUsIDAuMjUsIC0wLjEyNSwgLTEuMjUpOyAvL0NoYW5nZWQgc2lnbiBpbiBZIGFuZCBXIGNvbXBvbmVudHMuXFxyXFxuXFxyXFxuXFx0Ly8gVGhpcyBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdGhlIGxvb3BzLlxcclxcblxcdHZPZmZzZXRbMl0gPSB2ZWM0KHZPZmZzZXRbMF0ueHosIHZPZmZzZXRbMV0ueXcpICsgdmVjNCgtMi4wLCAyLjAsIC0yLjAsIDIuMCkgKiB0ZXhlbFNpemUueHh5eSAqIE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgY29tcHV0ZXMgd2VpZ2h0cyBmb3IgZGV0ZWN0ZWQgZWRnZXMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNNQUFXZWlnaHRzTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSB3ZWlnaHRzIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU01BQVdlaWdodHNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHQvLyBDb25maWd1cmFibGUgc2V0dGluZ3M6XHJcblx0XHRcdFx0TUFYX1NFQVJDSF9TVEVQU19JTlQ6IFwiOFwiLFxyXG5cdFx0XHRcdE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ6IFwiOC4wXCIsXHJcblxyXG5cdFx0XHRcdC8vIE5vbi1jb25maWd1cmFibGUgc2V0dGluZ3M6XHJcblx0XHRcdFx0QVJFQVRFWF9NQVhfRElTVEFOQ0U6IFwiMTYuMFwiLFxyXG5cdFx0XHRcdEFSRUFURVhfUElYRUxfU0laRTogXCIoMS4wIC8gdmVjMigxNjAuMCwgNTYwLjApKVwiLFxyXG5cdFx0XHRcdEFSRUFURVhfU1VCVEVYX1NJWkU6IFwiKDEuMCAvIDcuMClcIixcclxuXHRcdFx0XHRTRUFSQ0hURVhfU0laRTogXCJ2ZWMyKDY2LjAsIDMzLjApXCIsXHJcblx0XHRcdFx0U0VBUkNIVEVYX1BBQ0tFRF9TSVpFOiBcInZlYzIoNjQuMCwgMTYuMClcIlxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0QXJlYTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dFNlYXJjaDogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3RlcHMgcGVyZm9ybWVkIGluIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsXHJcblx0ICogcGF0dGVybiBzZWFyY2hlcywgYXQgZWFjaCBzaWRlIG9mIHRoZSBwaXhlbC5cclxuXHQgKlxyXG5cdCAqIEluIG51bWJlciBvZiBwaXhlbHMsIGl0J3MgYWN0dWFsbHkgdGhlIGRvdWJsZS4gU28gdGhlIG1heGltdW0gbGluZSBsZW5ndGhcclxuXHQgKiBwZXJmZWN0bHkgaGFuZGxlZCBieSwgZm9yIGV4YW1wbGUgMTYsIGlzIDY0IChwZXJmZWN0bHkgbWVhbnMgdGhhdCBsb25nZXJcclxuXHQgKiBsaW5lcyB3b24ndCBsb29rIGFzIGdvb2QsIGJ1dCBhcmUgc3RpbGwgYW50aWFsaWFzZWQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHN0ZXBzIC0gVGhlIHNlYXJjaCBzdGVwcy4gUmFuZ2U6IFswLCAxMTJdLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRPcnRob2dvbmFsU2VhcmNoU3RlcHMoc3RlcHMpIHtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMuTUFYX1NFQVJDSF9TVEVQU19JTlQgPSBzdGVwcy50b0ZpeGVkKFwiMFwiKTtcclxuXHRcdHRoaXMuZGVmaW5lcy5NQVhfU0VBUkNIX1NURVBTX0ZMT0FUID0gc3RlcHMudG9GaXhlZChcIjFcIik7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1pZGRsZUdyZXk7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhMdW1pbmFuY2U7XFxyXFxuXFxyXFxuI2lmZGVmIEFEQVBURURfTFVNSU5BTkNFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbHVtaW5hbmNlTWFwO1xcclxcblxcclxcbiNlbHNlXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBhdmVyYWdlTHVtaW5hbmNlO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudmVjMyB0b25lTWFwKHZlYzMgYykge1xcclxcblxcclxcblxcdCNpZmRlZiBBREFQVEVEX0xVTUlOQU5DRVxcclxcblxcclxcblxcdFxcdC8vIEdldCB0aGUgY2FsY3VsYXRlZCBhdmVyYWdlIGx1bWluYW5jZSBieSBzYW1wbGluZyB0aGUgY2VudGVyLlxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IHRleHR1cmUyRChsdW1pbmFuY2VNYXAsIHZlYzIoMC41KSkucjtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IGF2ZXJhZ2VMdW1pbmFuY2U7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgcGl4ZWwuXFxyXFxuXFx0ZmxvYXQgbHVtUGl4ZWwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKGMpO1xcclxcblxcclxcblxcdC8vIEFwcGx5IHRoZSBtb2RpZmllZCBvcGVyYXRvciAoUmVpbmhhcmQgRXEuIDQpLlxcclxcblxcdGZsb2F0IGx1bVNjYWxlZCA9IChsdW1QaXhlbCAqIG1pZGRsZUdyZXkpIC8gbHVtQXZnO1xcclxcblxcclxcblxcdGZsb2F0IGx1bUNvbXByZXNzZWQgPSAobHVtU2NhbGVkICogKDEuMCArIChsdW1TY2FsZWQgLyAobWF4THVtaW5hbmNlICogbWF4THVtaW5hbmNlKSkpKSAvICgxLjAgKyBsdW1TY2FsZWQpO1xcclxcblxcclxcblxcdHJldHVybiBsdW1Db21wcmVzc2VkICogYztcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh0b25lTWFwKHRleGVsLnJnYiksIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEZ1bGwtc2NyZWVuIHRvbmUtbWFwcGluZyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBodHRwOi8vd3d3LmNpcy5yaXQuZWR1L3Blb3BsZS9mYWN1bHR5L2ZlcndlcmRhL3B1YmxpY2F0aW9ucy9zaWcwMl9wYXBlci5wZGZcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgVG9uZU1hcHBpbmdNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgbWF0ZXJpYWwuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiVG9uZU1hcHBpbmdNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdGx1bWluYW5jZU1hcDogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0YXZlcmFnZUx1bWluYW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRtYXhMdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDE2LjApLFxyXG5cdFx0XHRcdG1pZGRsZUdyZXk6IG5ldyBVbmlmb3JtKDAuNilcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCIvKipcclxuICogQSBjb2xsZWN0aW9uIG9mIHNoYWRlciBtYXRlcmlhbHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcG9zdCBwcm9jZXNzaW5nIHBhc3Nlcy5cclxuICpcclxuICogQG1vZHVsZSBwb3N0cHJvY2Vzc2luZy9tYXRlcmlhbHNcclxuICovXHJcblxyXG5leHBvcnQgeyBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCB9IGZyb20gXCIuL0FkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IEJva2VoTWF0ZXJpYWwgfSBmcm9tIFwiLi9Cb2tlaE1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IENvbG9yRWRnZXNNYXRlcmlhbCB9IGZyb20gXCIuL0NvbG9yRWRnZXNNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBDb21iaW5lTWF0ZXJpYWwgfSBmcm9tIFwiLi9Db21iaW5lTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgQ29udm9sdXRpb25NYXRlcmlhbCwgS2VybmVsU2l6ZSB9IGZyb20gXCIuL0NvbnZvbHV0aW9uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgQ29weU1hdGVyaWFsIH0gZnJvbSBcIi4vQ29weU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIH0gZnJvbSBcIi4vRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgRG90U2NyZWVuTWF0ZXJpYWwgfSBmcm9tIFwiLi9Eb3RTY3JlZW5NYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBGaWxtTWF0ZXJpYWwgfSBmcm9tIFwiLi9GaWxtTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgR2xpdGNoTWF0ZXJpYWwgfSBmcm9tIFwiLi9HbGl0Y2hNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBHb2RSYXlzTWF0ZXJpYWwgfSBmcm9tIFwiLi9Hb2RSYXlzTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgTHVtaW5vc2l0eU1hdGVyaWFsIH0gZnJvbSBcIi4vTHVtaW5vc2l0eU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IE91dGxpbmVCbGVuZE1hdGVyaWFsIH0gZnJvbSBcIi4vT3V0bGluZUJsZW5kTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgT3V0bGluZUVkZ2VzTWF0ZXJpYWwgfSBmcm9tIFwiLi9PdXRsaW5lRWRnZXNNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBQaXhlbGF0aW9uTWF0ZXJpYWwgfSBmcm9tIFwiLi9QaXhlbGF0aW9uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuL1JlYWxpc3RpY0Jva2VoTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgU2hvY2tXYXZlTWF0ZXJpYWwgfSBmcm9tIFwiLi9TaG9ja1dhdmVNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBTTUFBQmxlbmRNYXRlcmlhbCB9IGZyb20gXCIuL1NNQUFCbGVuZE1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IFNNQUFXZWlnaHRzTWF0ZXJpYWwgfSBmcm9tIFwiLi9TTUFBV2VpZ2h0c01hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IFRvbmVNYXBwaW5nTWF0ZXJpYWwgfSBmcm9tIFwiLi9Ub25lTWFwcGluZ01hdGVyaWFsLmpzXCI7XHJcbiIsImltcG9ydCB7IFNjZW5lLCBNZXNoLCBPcnRob2dyYXBoaWNDYW1lcmEsIFBsYW5lQnVmZmVyR2VvbWV0cnkgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbi8qKlxyXG4gKiBBbiBhYnN0cmFjdCBwYXNzLlxyXG4gKlxyXG4gKiBQYXNzZXMgdGhhdCBkbyBub3QgcmVseSBvbiB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBleHBsaWNpdGx5IGRpc2FibGUgdGhlXHJcbiAqIGRlcHRoIHRlc3QgYW5kIGRlcHRoIHdyaXRlIGluIHRoZWlyIHJlc3BlY3RpdmUgc2hhZGVyIG1hdGVyaWFscy5cclxuICpcclxuICogQGltcGxlbWVudHMge1Jlc2l6YWJsZX1cclxuICogQGltcGxlbWVudHMge0Rpc3Bvc2FibGV9XHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IFtzY2VuZV0gLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBbY2FtZXJhXSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtNZXNofSBbcXVhZF0gLSBBIHF1YWQgdGhhdCBmaWxscyB0aGUgc2NyZWVuIHRvIHJlbmRlciAyRCBmaWx0ZXIgZWZmZWN0cy4gU2V0IHRoaXMgdG8gbnVsbCwgaWYgeW91IGRvbid0IG5lZWQgaXQgKHNlZSB7QGxpbmsgUmVuZGVyUGFzc30pLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdG5hbWUgPSBcIlBhc3NcIixcclxuXHRcdHNjZW5lID0gbmV3IFNjZW5lKCksXHJcblx0XHRjYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKC0xLCAxLCAxLCAtMSwgMCwgMSksXHJcblx0XHRxdWFkID0gbmV3IE1lc2gobmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoMiwgMiksIG51bGwpXHJcblx0KSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGlzIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1N0cmluZ31cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTY2VuZX1cclxuXHRcdCAqIEBwcm90ZWN0ZWRcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqIEBwcm90ZWN0ZWRcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNZXNofVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucXVhZCA9IHF1YWQ7XHJcblxyXG5cdFx0aWYodGhpcy5xdWFkICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLnF1YWQuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYodGhpcy5zY2VuZSAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNjZW5lLmFkZCh0aGlzLnF1YWQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgcmVuZGVyIHRvIHNjcmVlbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVG9TY3JlZW4gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgYmUgZXhlY3V0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gc2hvdWxkIHN3YXAgdGhlIGZyYW1lXHJcblx0XHQgKiBidWZmZXJzIGFmdGVyIHRoaXMgcGFzcyBoYXMgZmluaXNoZWQgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgdGhpcyBwYXNzIGRvZXNuJ3QgcmVuZGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIG9yXHJcblx0XHQgKiB0aGUgc2NyZWVuLiBPdGhlcndpc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgYmUgbG9zdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtNYXRlcmlhbH1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG1hdGVyaWFsKCkge1xyXG5cclxuXHRcdHJldHVybiAodGhpcy5xdWFkICE9PSBudWxsKSA/IHRoaXMucXVhZC5tYXRlcmlhbCA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIFRoZSBtYXRlcmlhbCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge01hdGVyaWFsfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgbWF0ZXJpYWwodmFsdWUpIHtcclxuXHJcblx0XHRpZih0aGlzLnF1YWQgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMucXVhZC5tYXRlcmlhbCA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgb3ZlcnJpZGRlbi5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbi5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvcihcIlJlbmRlciBtZXRob2Qgbm90IGltcGxlbWVudGVkIVwiKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoaXMgcGFzcyB3aXRoIHRoZSByZW5kZXJlcidzIHNpemUuXHJcblx0ICpcclxuXHQgKiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGNhc2UgeW91IHdhbnQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgdGhlIG1haW5cclxuXHQgKiByZW5kZXIgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIFRoZSB7QGxpbmsgRWZmZWN0Q29tcG9zZXJ9IGNhbGxzIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGlzIHBhc3MgaXNcclxuXHQgKiBpbml0aWFsaXplZCBhbmQgZXZlcnkgdGltZSBpdHMgb3duIHNpemUgaXMgdXBkYXRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSByZW5kZXJlcidzIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgcmVuZGVyZXIncyBoZWlnaHQuXHJcblx0ICogQGV4YW1wbGUgdGhpcy5teVJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB5b3UgZ2FpbiBhY2Nlc3MgdG8gdGhlIHJlbmRlcmVyLiBZb3UnbGwgYWxzbyBiZVxyXG5cdCAqIGFibGUgdG8gY29uZmlndXJlIHlvdXIgY3VzdG9tIHJlbmRlciB0YXJnZXRzIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0XHJcblx0ICogKFJHQiBvciBSR0JBKS5cclxuXHQgKlxyXG5cdCAqIFRoZSBwcm92aWRlZCByZW5kZXJlciBjYW4gYmUgdXNlZCB0byB3YXJtIHVwIHNwZWNpYWwgb2ZmLXNjcmVlbiByZW5kZXJcclxuXHQgKiB0YXJnZXRzIGJ5IHBlcmZvcm1pbmcgYSBwcmVsaW1pbmFyeSByZW5kZXIgb3BlcmF0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGlzIHBhc3MgaXMgYWRkZWQgdG8gaXRzXHJcblx0ICogcXVldWUsIGJ1dCBub3QgYmVmb3JlIGl0cyBzaXplIGhhcyBiZWVuIHNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG5cdCAqIEBleGFtcGxlIGlmKCFhbHBoYSkgeyB0aGlzLm15UmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0OyB9XHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIHNoYWxsb3cgc2VhcmNoIGZvciBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIGEgZGlzcG9zZSBtZXRob2QgYW5kXHJcblx0ICogZGVsZXRlcyB0aGVtLiBUaGUgcGFzcyB3aWxsIGJlIGlub3BlcmF0aXZlIGFmdGVyIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQhXHJcblx0ICpcclxuXHQgKiBEaXNwb3NhYmxlIG9iamVjdHM6XHJcblx0ICogIC0gcmVuZGVyIHRhcmdldHNcclxuXHQgKiAgLSBtYXRlcmlhbHNcclxuXHQgKiAgLSB0ZXh0dXJlc1xyXG5cdCAqXHJcblx0ICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBiZWluZyBkZXN0cm95ZWQuXHJcblx0ICogWW91IG1heSwgaG93ZXZlciwgdXNlIGl0IGluZGVwZW5kZW50bHkgdG8gZnJlZSBtZW1vcnkgd2hlbiB5b3UgYXJlIGNlcnRhaW5cclxuXHQgKiB0aGF0IHlvdSBkb24ndCBuZWVkIHRoaXMgcGFzcyBhbnltb3JlLlxyXG5cdCAqL1xyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdGxldCBrZXk7XHJcblxyXG5cdFx0Zm9yKGtleSBvZiBPYmplY3Qua2V5cyh0aGlzKSkge1xyXG5cclxuXHRcdFx0aWYodGhpc1trZXldICE9PSBudWxsICYmIHR5cGVvZiB0aGlzW2tleV0uZGlzcG9zZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcblxyXG5cdFx0XHRcdHRoaXNba2V5XS5kaXNwb3NlKCk7XHJcblx0XHRcdFx0dGhpc1trZXldID0gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5tYXRlcmlhbCAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciwgUkdCRm9ybWF0LCBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBDb252b2x1dGlvbk1hdGVyaWFsLCBLZXJuZWxTaXplIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIEFuIGVmZmljaWVudCwgaW5jcmVtZW50YWwgYmx1ciBwYXNzLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHBhc3MgYWxsb3dzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciB0byBiZSB0aGUgc2FtZS5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQmx1clBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBibHVyIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCbHVyUGFzc1wiKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJCbHVyLlRhcmdldFhcIjtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiQmx1ci5UYXJnZXRZXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzXHJcblx0XHQgKiB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZXNvbHV0aW9uU2NhbGUgPSAob3B0aW9ucy5yZXNvbHV0aW9uU2NhbGUgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnJlc29sdXRpb25TY2FsZSA6IDAuNTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY29udm9sdXRpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29udm9sdXRpb25NYXRlcmlhbCA9IG5ldyBDb252b2x1dGlvbk1hdGVyaWFsKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvbnZvbHV0aW9uIHNoYWRlciBtYXRlcmlhbCB0aGF0IHVzZXMgZGl0aGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsID0gbmV3IENvbnZvbHV0aW9uTWF0ZXJpYWwoKTtcclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmRpdGhlcmluZyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBibHVycmVkIHJlc3VsdCBzaG91bGQgYWxzbyBiZSBkaXRoZXJlZCB1c2luZyBub2lzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5rZXJuZWxTaXplID0gb3B0aW9ucy5rZXJuZWxTaXplO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhYnNvbHV0ZSB3aWR0aCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgd2lkdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC53aWR0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYWJzb2x1dGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0cy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBoZWlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC5oZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGtlcm5lbCBzaXplLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdGdldCBrZXJuZWxTaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwua2VybmVsU2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0c2V0IGtlcm5lbFNpemUodmFsdWUgPSBLZXJuZWxTaXplLkxBUkdFKSB7XHJcblxyXG5cdFx0dGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCbHVycyB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlXHJcblx0ICogaW5wdXQgYnVmZmVyIHJlbWFpbnMgaW50YWN0LCB1bmxlc3MgaXRzIGFsc28gdGhlIG91dHB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lID0gdGhpcy5zY2VuZTtcclxuXHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldFggPSB0aGlzLnJlbmRlclRhcmdldFg7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRZO1xyXG5cclxuXHRcdGxldCBtYXRlcmlhbCA9IHRoaXMuY29udm9sdXRpb25NYXRlcmlhbDtcclxuXHRcdGxldCB1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xyXG5cdFx0Y29uc3Qga2VybmVsID0gbWF0ZXJpYWwuZ2V0S2VybmVsKCk7XHJcblxyXG5cdFx0bGV0IGxhc3RSVCA9IGlucHV0QnVmZmVyO1xyXG5cdFx0bGV0IGRlc3RSVDtcclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvLyBBcHBseSB0aGUgbXVsdGktcGFzcyBibHVyLlxyXG5cdFx0Zm9yKGkgPSAwLCBsID0ga2VybmVsLmxlbmd0aCAtIDE7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdC8vIEFsdGVybmF0ZSBiZXR3ZWVuIHRhcmdldHMuXHJcblx0XHRcdGRlc3RSVCA9ICgoaSAlIDIpID09PSAwKSA/IHJlbmRlclRhcmdldFggOiByZW5kZXJUYXJnZXRZO1xyXG5cclxuXHRcdFx0dW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xyXG5cdFx0XHR1bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGxhc3RSVC50ZXh0dXJlO1xyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgZGVzdFJUKTtcclxuXHJcblx0XHRcdGxhc3RSVCA9IGRlc3RSVDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5kaXRoZXJpbmcpIHtcclxuXHJcblx0XHRcdG1hdGVyaWFsID0gdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWw7XHJcblx0XHRcdHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xyXG5cdFx0dW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBsYXN0UlQudGV4dHVyZTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aWR0aCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XHJcblx0XHRoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFkuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cdFx0dGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0aWYoIWFscGhhKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTGluZWFyRmlsdGVyLCBSR0JGb3JtYXQsIFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7IENvbWJpbmVNYXRlcmlhbCwgS2VybmVsU2l6ZSwgTHVtaW5vc2l0eU1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBibG9vbSBwYXNzLlxyXG4gKlxyXG4gKiBUaGlzIHBhc3MgcmVuZGVycyBhIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIgYnkgdXRpbGl6aW5nIHRoZSBmYXN0IEthd2FzZVxyXG4gKiBjb252b2x1dGlvbiBhcHByb2FjaC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQmxvb21QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmxvb20gcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvblNjYWxlPTAuNV0gLSBUaGUgcmVuZGVyIHRleHR1cmUgcmVzb2x1dGlvbiBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiByZW5kZXIgc2l6ZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMua2VybmVsU2l6ZT1LZXJuZWxTaXplLkxBUkdFXSAtIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbnRlbnNpdHk9MS4wXSAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgYmxvb20gZWZmZWN0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kaXN0aW5jdGlvbj0xLjBdIC0gVGhlIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuIFJhaXNlIHRoaXMgdmFsdWUgdG8gYnJpbmcgb3V0IHRoZSBicmlnaHRlciBlbGVtZW50cyBpbiB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3IgY29tYmluaW5nIHRoZSBibG9vbSB0ZXh0dXJlIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCbG9vbVBhc3NcIik7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkJsb29tLlRhcmdldFwiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgYmx1ciBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCbHVyUGFzc31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzID0gbmV3IEJsdXJQYXNzKG9wdGlvbnMpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbCgob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbHVtaW5vc2l0eSBzaGFkZXIgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0x1bWlub3NpdHlNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmx1bWlub3NpdHlNYXRlcmlhbCA9IG5ldyBMdW1pbm9zaXR5TWF0ZXJpYWwodHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5kaXN0aW5jdGlvbiA9IG9wdGlvbnMuZGlzdGluY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgcmVzb2x1dGlvblNjYWxlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IHJlc29sdXRpb25TY2FsZSh2YWx1ZSA9IDAuNSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGJsdXIga2VybmVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IGtlcm5lbFNpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0c2V0IGtlcm5lbFNpemUodmFsdWUgPSBLZXJuZWxTaXplLkxBUkdFKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG92ZXJhbGwgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgaW50ZW5zaXR5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgaW50ZW5zaXR5KHZhbHVlID0gMS4wKSB7XHJcblxyXG5cdFx0dGhpcy5jb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbHVtaW5hbmNlIGRpc3RpbmN0aW9uIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXN0aW5jdGlvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpc3RpbmN0aW9uKHZhbHVlID0gMS4wKSB7XHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgZGl0aGVyaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLmRpdGhlcmluZztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiBlbmFibGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGl0aGVyZWQgdG8gcmVtb3ZlIGJhbmRpbmcgYXJ0aWZhY3RzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBkaXRoZXJpbmcodmFsdWUpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLmRpdGhlcmluZyA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGlucHV0IGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgYmxlbmQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubmVlZHNTd2FwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGRpc2FibGVkLCB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVuYWZmZWN0ZWQuXHJcblx0ICpcclxuXHQgKiBZb3UgbWF5IHVzZSB0aGUge0BsaW5rIEJsb29tUGFzcyNvdmVybGF5fSB0ZXh0dXJlIHRvIGFwcGx5IHRoZSBlZmZlY3QgdG9cclxuXHQgKiB5b3VyIHNjZW5lLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBibGVuZCh2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGVmZmVjdCBvdmVybGF5IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG92ZXJsYXkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IGJsdXJQYXNzID0gdGhpcy5ibHVyUGFzcztcclxuXHJcblx0XHRjb25zdCBsdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmx1bWlub3NpdHlNYXRlcmlhbDtcclxuXHRcdGNvbnN0IGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Ly8gTHVtaW5hbmNlIGZpbHRlci5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRsdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCk7XHJcblxyXG5cdFx0Ly8gQ29udm9sdXRpb24gcGhhc2UuXHJcblx0XHRibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHJlbmRlclRhcmdldCwgcmVuZGVyVGFyZ2V0KTtcclxuXHJcblx0XHRpZih0aGlzLmJsZW5kKSB7XHJcblxyXG5cdFx0XHQvLyBSZW5kZXIgdGhlIG9yaWdpbmFsIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBjb21iaW5lTWF0ZXJpYWw7XHJcblx0XHRcdGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHRcdGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3Muc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR3aWR0aCA9IHRoaXMuYmx1clBhc3Mud2lkdGg7XHJcblx0XHRoZWlnaHQgPSB0aGlzLmJsdXJQYXNzLmhlaWdodDtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblxyXG5cdFx0aWYoIWFscGhhKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIERlcHRoIG9mIEZpZWxkIChEb0YpIHBhc3MgdXNpbmcgYSBib2tlaCBzaGFkZXIuXHJcbiAqXHJcbiAqIFRoaXMgcGFzcyByZXF1aXJlcyBhIHtAbGluayBFZmZlY3RDb21wb3NlciNkZXB0aFRleHR1cmV9LlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBCb2tlaFBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLiBVc2VkIHRvIG9idGFpbiB0aGUgYXNwZWN0IHJhdGlvIGFuZCB0aGUgbmVhciBhbmQgZmFyIHBsYW5lIHNldHRpbmdzLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuIFNlZSB7QGxpbmsgQm9rZWhNYXRlcmlhbH0gZm9yIGRldGFpbHMuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCb2tlaFBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBCb2tlaE1hdGVyaWFsKGNhbWVyYSwgb3B0aW9ucyk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERlcHRoLnZhbHVlID0gaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBwYXNzIHRoYXQgZGlzYWJsZXMgdGhlIHN0ZW5jaWwgdGVzdC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQ2xlYXJNYXNrUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsZWFyIG1hc2sgcGFzcy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoXCJDbGVhck1hc2tQYXNzXCIsIG51bGwsIG51bGwsIG51bGwpO1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzYWJsZXMgdGhlIGdsb2JhbCBzdGVuY2lsIHRlc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHJlbmRlcmVyLnN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRUZXN0KGZhbHNlKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgY2xlYXIgY29sb3Igb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAdHlwZSB7Q29sb3J9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3QgY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCBjbGVhcnMgdGhlIGlucHV0IGJ1ZmZlciBvciB0aGUgc2NyZWVuLlxyXG4gKlxyXG4gKiBZb3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYml0cyBmcm9tIGJlaW5nIGNsZWFyZWQgYnkgc2V0dGluZyBlaXRoZXIgdGhlXHJcbiAqIGF1dG9DbGVhckNvbG9yLCBhdXRvQ2xlYXJTdGVuY2lsIG9yIGF1dG9DbGVhckRlcHRoIHByb3BlcnRpZXMgb2YgdGhlIHJlbmRlcmVyXHJcbiAqIHRvIGZhbHNlLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBDbGVhclBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjbGVhciBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBbb3B0aW9ucy5jbGVhckNvbG9yPW51bGxdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgY29sb3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNsZWFyQWxwaGE9MC4wXSAtIEFuIG92ZXJyaWRlIGNsZWFyIGFscGhhLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkNsZWFyUGFzc1wiLCBudWxsLCBudWxsLCBudWxsKTtcclxuXHJcblx0XHR0aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJDb2xvciA9IChvcHRpb25zLmNsZWFyQ29sb3IgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmNsZWFyQ29sb3IgOiBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGFscGhhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNsZWFyQWxwaGEgPSAob3B0aW9ucy5jbGVhckFscGhhICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5jbGVhckFscGhhIDogMC4wO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgaW5wdXQgYnVmZmVyIG9yIHRoZSBzY3JlZW4uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XHJcblxyXG5cdFx0bGV0IGNsZWFyQWxwaGE7XHJcblxyXG5cdFx0aWYoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0Y29sb3IuY29weShyZW5kZXJlci5nZXRDbGVhckNvbG9yKCkpO1xyXG5cdFx0XHRjbGVhckFscGhhID0gcmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xyXG5cdFx0XHRyZW5kZXJlci5zZXRDbGVhckNvbG9yKGNsZWFyQ29sb3IsIHRoaXMuY2xlYXJBbHBoYSk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IGlucHV0QnVmZmVyKTtcclxuXHRcdHJlbmRlcmVyLmNsZWFyKCk7XHJcblxyXG5cdFx0aWYoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihjb2xvciwgY2xlYXJBbHBoYSk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IERvdFNjcmVlbk1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIEEgZG90IHNjcmVlbiBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBEb3RTY3JlZW5QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXZlcmFnZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBhIGNvbG91ciBhdmVyYWdlIChibGFjayBhbmQgd2hpdGUpLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbmdsZT0xLjU3XSAtIFRoZSBhbmdsZSBvZiB0aGUgcGF0dGVybi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgb3ZlcmFsbCBlZmZlY3QuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkRvdFNjcmVlblBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBEb3RTY3JlZW5NYXRlcmlhbChvcHRpb25zKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR3aWR0aCA9IE1hdGgubWF4KDEsIHdpZHRoKTtcclxuXHRcdGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUueiA9IHdpZHRoO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUudyA9IGhlaWdodDtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBGaWxtTWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBmaWxtIHBhc3MuXHJcbiAqXHJcbiAqIFByb3ZpZGVzIHZhcmlvdXMgY2luZW1hdGljIGVmZmVjdHMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbG1QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZmlsbSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBTZWUge0BsaW5rIEZpbG1NYXRlcmlhbH0gZm9yIG1vcmUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbmxpbmVEZW5zaXR5PTEuMjVdIC0gVGhlIHNjYW5saW5lIGRlbnNpdHksIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ncmlkU2NhbGU9MS4wXSAtIFRoZSBncmlkIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGhlaWdodC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZExpbmVXaWR0aD0wLjBdIC0gVGhlIGdyaWQgbGluZSB3aWR0aC4gVGhpcyB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiYXNlIGxpbmUgd2lkdGguXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdHN1cGVyKFwiRmlsbVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBGaWxtTWF0ZXJpYWwob3B0aW9ucyk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW1vdW50IG9mIHNjYW5saW5lcywgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBoZWlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG5cdFx0ICogdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2NhbmxpbmVEZW5zaXR5ID0gKG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5ID09PSB1bmRlZmluZWQpID8gMS4yNSA6IG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdyaWQgc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXNcclxuXHRcdCAqIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmdyaWRTY2FsZSA9IChvcHRpb25zLmdyaWRTY2FsZSA9PT0gdW5kZWZpbmVkKSA/IDEuMCA6IE1hdGgubWF4KG9wdGlvbnMuZ3JpZFNjYWxlLCAxZS02KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncmlkIGxpbmUgd2lkdGguXHJcblx0XHQgKlxyXG5cdFx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG5cdFx0ICogdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZ3JpZExpbmVXaWR0aCA9IChvcHRpb25zLmdyaWRMaW5lV2lkdGggPT09IHVuZGVmaW5lZCkgPyAwLjAgOiBNYXRoLm1heChvcHRpb25zLmdyaWRMaW5lV2lkdGgsIDAuMCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGltZS52YWx1ZSArPSBkZWx0YTtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG5cdFx0Y29uc3QgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcblx0XHRjb25zdCBncmlkU2NhbGUgPSB0aGlzLmdyaWRTY2FsZSAqIChoZWlnaHQgKiAwLjEyNSk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5zY2FubGluZUNvdW50LnZhbHVlID0gTWF0aC5yb3VuZChoZWlnaHQgKiB0aGlzLnNjYW5saW5lRGVuc2l0eSk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmdyaWRTY2FsZS52YWx1ZS5zZXQoYXNwZWN0ICogZ3JpZFNjYWxlLCBncmlkU2NhbGUpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5ncmlkTGluZVdpZHRoLnZhbHVlID0gKGdyaWRTY2FsZSAvIGhlaWdodCkgKyB0aGlzLmdyaWRMaW5lV2lkdGg7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgRGF0YVRleHR1cmUsIFJHQkZvcm1hdCwgRmxvYXRUeXBlIH0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7IEdsaXRjaE1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbG93IC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2ggLSBUaGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmFuZG9tIHZhbHVlLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludChsb3csIGhpZ2gpIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93ICsgMSkpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gZmxvYXQgaW4gdGhlIHNwZWNpZmllZCByYW5nZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGxvdyAtIFRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoIC0gVGhlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJhbmRvbSB2YWx1ZS5cclxuICovXHJcblxyXG5mdW5jdGlvbiByYW5kb21GbG9hdChsb3csIGhpZ2gpIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdyk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBnbGl0Y2ggcGFzcy5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgR2xpdGNoUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW29wdGlvbnMucGVydHVyYk1hcF0gLSBBIHBlcnR1cmJhdGlvbiBtYXAuIElmIG5vbmUgaXMgcHJvdmlkZWQsIGEgbm9pc2UgdGV4dHVyZSB3aWxsIGJlIGNyZWF0ZWQuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmR0U2l6ZT02NF0gLSBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIG5vaXNlIG1hcC4gV2lsbCBiZSBpZ25vcmVkIGlmIGEgcGVydHVyYmF0aW9uIG1hcCBpcyBwcm92aWRlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJHbGl0Y2hQYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgR2xpdGNoTWF0ZXJpYWwoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGVydHVyYmF0aW9uIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMucGVydHVyYk1hcCA9IChvcHRpb25zLnBlcnR1cmJNYXAgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnBlcnR1cmJNYXAgOiB0aGlzLmdlbmVyYXRlUGVydHVyYk1hcChvcHRpb25zLmR0U2l6ZSk7XHJcblx0XHR0aGlzLnBlcnR1cmJNYXAubmFtZSA9IFwiR2xpdGNoLlBlcnR1cmJhdGlvblwiO1xyXG5cdFx0dGhpcy5wZXJ0dXJiTWFwLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVmZmVjdCBtb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHbGl0Y2hNb2RlfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5tb2RlID0gR2xpdGNoTW9kZS5TUE9SQURJQztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY291bnRlciBmb3IgdGhlIGdsaXRjaCBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNvdW50ZXIgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByYW5kb20gYnJlYWsgcG9pbnQgZm9yIHRoZSBzcG9yYWRpYyBnbGl0Y2ggYWN0aXZhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuYnJlYWtQb2ludCA9IHJhbmRvbUludCgxMjAsIDI0MCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgcGVydHVyYk1hcCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFzc2lnbmluZyBhIG5ldyBwZXJ0dXJiYXRpb24gbWFwIGRvZXMgbm90IGRlc3Ryb3kgdGhlIGN1cnJlbnQgb25lIVxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCBwZXJ0dXJiTWFwKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlID0gdmFsdWU7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRQZXJ0dXJiLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIG5ldyBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NpemU9NjRdIC0gVGhlIHRleHR1cmUgc2l6ZS5cclxuXHQgKiBAcmV0dXJuIHtEYXRhVGV4dHVyZX0gVGhlIHBlcnR1cmJhdGlvbiB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cclxuXHRnZW5lcmF0ZVBlcnR1cmJNYXAoc2l6ZSA9IDY0KSB7XHJcblxyXG5cdFx0Y29uc3QgcGl4ZWxzID0gc2l6ZSAqIHNpemU7XHJcblx0XHRjb25zdCBkYXRhID0gbmV3IEZsb2F0MzJBcnJheShwaXhlbHMgKiAzKTtcclxuXHJcblx0XHRsZXQgZHQgPSB0aGlzLnBlcnR1cmJNYXA7XHJcblx0XHRsZXQgaSwgeDtcclxuXHJcblx0XHRmb3IoaSA9IDA7IGkgPCBwaXhlbHM7ICsraSkge1xyXG5cclxuXHRcdFx0eCA9IE1hdGgucmFuZG9tKCk7XHJcblxyXG5cdFx0XHRkYXRhW2kgKiAzXSA9IHg7XHJcblx0XHRcdGRhdGFbaSAqIDMgKyAxXSA9IHg7XHJcblx0XHRcdGRhdGFbaSAqIDMgKyAyXSA9IHg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmKGR0ICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHRkdC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGR0ID0gbmV3IERhdGFUZXh0dXJlKGRhdGEsIHNpemUsIHNpemUsIFJHQkZvcm1hdCwgRmxvYXRUeXBlKTtcclxuXHRcdGR0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnBlcnR1cmJNYXAgPSBkdDtcclxuXHJcblx0XHRyZXR1cm4gZHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBtb2RlID0gdGhpcy5tb2RlO1xyXG5cdFx0Y29uc3QgY291bnRlciA9IHRoaXMuY291bnRlcjtcclxuXHRcdGNvbnN0IGJyZWFrUG9pbnQgPSB0aGlzLmJyZWFrUG9pbnQ7XHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMubWF0ZXJpYWwudW5pZm9ybXM7XHJcblxyXG5cdFx0dW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0dW5pZm9ybXMuc2VlZC52YWx1ZSA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR1bmlmb3Jtcy5hY3RpdmUudmFsdWUgPSB0cnVlO1xyXG5cclxuXHRcdGlmKGNvdW50ZXIgJSBicmVha1BvaW50ID09PSAwIHx8IG1vZGUgPT09IEdsaXRjaE1vZGUuQ09OU1RBTlRfV0lMRCkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDMwLjA7XHJcblx0XHRcdHVuaWZvcm1zLmFuZ2xlLnZhbHVlID0gcmFuZG9tRmxvYXQoLU1hdGguUEksIE1hdGguUEkpO1xyXG5cdFx0XHR1bmlmb3Jtcy5zZWVkWC52YWx1ZSA9IHJhbmRvbUZsb2F0KC0xLjAsIDEuMCk7XHJcblx0XHRcdHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTEuMCwgMS4wKTtcclxuXHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdHVuaWZvcm1zLmRpc3RvcnRpb25ZLnZhbHVlID0gcmFuZG9tRmxvYXQoMC4wLCAxLjApO1xyXG5cclxuXHRcdFx0dGhpcy5icmVha1BvaW50ID0gcmFuZG9tSW50KDEyMCwgMjQwKTtcclxuXHRcdFx0dGhpcy5jb3VudGVyID0gMDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYoY291bnRlciAlIGJyZWFrUG9pbnQgPCBicmVha1BvaW50IC8gNSB8fCBtb2RlID09PSBHbGl0Y2hNb2RlLkNPTlNUQU5UX01JTEQpIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDkwLjA7XHJcblx0XHRcdFx0dW5pZm9ybXMuYW5nbGUudmFsdWUgPSByYW5kb21GbG9hdCgtTWF0aC5QSSwgTWF0aC5QSSk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblkudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdFx0dW5pZm9ybXMuc2VlZFgudmFsdWUgPSByYW5kb21GbG9hdCgtMC4zLCAwLjMpO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTAuMywgMC4zKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIFNwb3JhZGljLlxyXG5cdFx0XHRcdHVuaWZvcm1zLmFjdGl2ZS52YWx1ZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQrK3RoaXMuY291bnRlcjtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZ2xpdGNoIG1vZGUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTUE9SQURJQyAtIFNwb3JhZGljIGdsaXRjaGVzLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gQ09OU1RBTlRfTUlMRCAtIENvbnN0YW50IG1pbGQgZ2xpdGNoZXMuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBDT05TVEFOVF9XSUxEIC0gQ29uc3RhbnQgd2lsZCBnbGl0Y2hlcy5cclxuICovXHJcblxyXG5leHBvcnQgY29uc3QgR2xpdGNoTW9kZSA9IHtcclxuXHJcblx0U1BPUkFESUM6IDAsXHJcblx0Q09OU1RBTlRfTUlMRDogMSxcclxuXHRDT05TVEFOVF9XSUxEOiAyXHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gc2NlbmUgZGlyZWN0bHkgb24gc2NyZWVuIG9yIGludG8gdGhlIHJlYWQgYnVmZmVyXHJcbiAqIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlbmRlclBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1c2UgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IFtvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWw9bnVsbF0gLSBBbiBvdmVycmlkZSBtYXRlcmlhbCBmb3IgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IFtvcHRpb25zLmNsZWFyQ29sb3I9bnVsbF0gLSBBbiBvdmVycmlkZSBjbGVhciBjb2xvci5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY2xlYXJBbHBoYT0xLjBdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGVhckRlcHRoPWZhbHNlXSAtIFdoZXRoZXIgZGVwdGggc2hvdWxkIGJlIGNsZWFyZWQgZXhwbGljaXRseS5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNsZWFyPXRydWVdIC0gV2hldGhlciBhbGwgYnVmZmVycyBzaG91bGQgYmUgY2xlYXJlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJSZW5kZXJQYXNzXCIsIHNjZW5lLCBjYW1lcmEsIG51bGwpO1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNsZWFyIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NsZWFyUGFzc31cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJQYXNzID0gbmV3IENsZWFyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG92ZXJyaWRlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRlcmlhbH1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IChvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgOiBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBleHBsaWNpdGx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jbGVhckRlcHRoID0gKG9wdGlvbnMuY2xlYXJEZXB0aCAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuY2xlYXJEZXB0aCA6IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbG9yLCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzIHNob3VsZCBiZSBjbGVhcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEV2ZW4gd2l0aCBjbGVhciBzZXQgdG8gdHJ1ZSB5b3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYnVmZmVycyBmcm9tIGJlaW5nXHJcblx0XHQgKiBjbGVhcmVkIGJ5IHNldHRpbmcgZWl0aGVyIHRoZSBhdXRvQ2xlYXJDb2xvciwgYXV0b0NsZWFyU3RlbmNpbCBvclxyXG5cdFx0ICogYXV0b0NsZWFyRGVwdGggcHJvcGVydGllcyBvZiB0aGUgcmVuZGVyZXIgdG8gZmFsc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNsZWFyID0gKG9wdGlvbnMuY2xlYXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmNsZWFyIDogdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBzY2VuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBpbnB1dEJ1ZmZlcjtcclxuXHRcdGNvbnN0IG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xyXG5cclxuXHRcdGlmKHRoaXMuY2xlYXIpIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJQYXNzLnJlbmRlclRvU2NyZWVuID0gdGhpcy5yZW5kZXJUb1NjcmVlbjtcclxuXHRcdFx0dGhpcy5jbGVhclBhc3MucmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0fSBlbHNlIGlmKHRoaXMuY2xlYXJEZXB0aCkge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCk7XHJcblx0XHRcdHJlbmRlcmVyLmNsZWFyRGVwdGgoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMub3ZlcnJpZGVNYXRlcmlhbDtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgdGhpcy5jYW1lcmEsIHJlbmRlclRhcmdldCk7XHJcblx0XHRzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQge1xyXG5cdENvbG9yLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRSR0JGb3JtYXQsXHJcblx0U2NlbmUsXHJcblx0VmVjdG9yMyxcclxuXHRXZWJHTFJlbmRlclRhcmdldFxyXG59IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuaW1wb3J0IHsgQ29tYmluZU1hdGVyaWFsLCBHb2RSYXlzTWF0ZXJpYWwsIEtlcm5lbFNpemUgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tIFwiLi9SZW5kZXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IEJsdXJQYXNzIH0gZnJvbSBcIi4vQmx1clBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBDbGFtcHMgYSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbWluIC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IG1heCAtIFRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBjbGFtcGVkIHZhbHVlLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkge1xyXG5cclxuXHRyZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBjcmVwdXNjdWxhciByYXlzIHBhc3MuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEdvZFJheXNQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBsaWdodFNvdXJjZSAtIFRoZSBtYWluIGxpZ2h0IHNvdXJjZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBBIGNvbnN0YW50IGZhY3RvciBmb3IgYWRkaXRpdmUgYmxlbmRpbmcuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2FtcGxlcz02MF0gLSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY3JlZW5Nb2RlPXRydWVdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbWJpbmluZyB0aGUgZ29kIHJheXMgdGV4dHVyZSB3aXRoIHRoZSBzY2VuZSBjb2xvcnMuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHNjZW5lLCBjYW1lcmEsIGxpZ2h0U291cmNlLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkdvZFJheXNQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzY2VuZSB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGxpZ2h0IHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2NlbmV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5saWdodFNjZW5lID0gbmV3IFNjZW5lKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBzY2VuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2NlbmV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5tYWluU2NlbmUgPSBzY2VuZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtYWluIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2FtZXJhfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJHb2RSYXlzLlRhcmdldFhcIjtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5UYXJnZXRZXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBtYXNrZWQgbGlnaHQgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzayA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlclxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5NYXNrXCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGFzcyB0aGF0IG9ubHkgcmVuZGVycyB0aGUgbGlnaHQgc291cmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0ID0gbmV3IFJlbmRlclBhc3ModGhpcy5saWdodFNjZW5lLCB0aGlzLm1haW5DYW1lcmEsIHtcclxuXHRcdFx0Y2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHBhc3MgdGhhdCByZW5kZXJzIHRoZSBtYXNrZWQgc2NlbmUgb3ZlciB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JlbmRlclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTWFzayA9IG5ldyBSZW5kZXJQYXNzKHRoaXMubWFpblNjZW5lLCB0aGlzLm1haW5DYW1lcmEsIHtcclxuXHRcdFx0b3ZlcnJpZGVNYXRlcmlhbDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKHsgY29sb3I6IDB4MDAwMDAwIH0pXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLmNsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGJsdXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qmx1clBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBzb3VyY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5saWdodFNvdXJjZSA9IGxpZ2h0U291cmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IHBvc2l0aW9uIGluIHNjcmVlbiBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNjcmVlblBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZ29kIHJheXMgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHb2RSYXlzTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwgPSBuZXcgR29kUmF5c01hdGVyaWFsKG9wdGlvbnMpO1xyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwudW5pZm9ybXMubGlnaHRQb3NpdGlvbi52YWx1ZSA9IHRoaXMuc2NyZWVuUG9zaXRpb247XHJcblxyXG5cdFx0dGhpcy5zYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbCgob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCByZXNvbHV0aW9uU2NhbGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXMgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgcmVzb2x1dGlvblNjYWxlKHZhbHVlID0gMC41KSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQga2VybmVsU2l6ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQga2VybmVsU2l6ZSh2YWx1ZSA9IEtlcm5lbFNpemUuTEFSR0UpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgb3ZlcmFsbCBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBpbnRlbnNpdHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCBpbnRlbnNpdHkodmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgc2FtcGxlcygpIHtcclxuXHJcblx0XHRyZXR1cm4gTnVtYmVyLnBhcnNlSW50KHRoaXMuZ29kUmF5c01hdGVyaWFsLmRlZmluZXMuTlVNX1NBTVBMRVNfSU5UKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIHZhbHVlIG11c3QgYmUgY2FyZWZ1bGx5IGNob3Nlbi4gQSBoaWdoZXIgdmFsdWUgZGlyZWN0bHkgaW5jcmVhc2VzIHRoZVxyXG5cdCAqIEdQVSBsb2FkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IHNhbXBsZXModmFsdWUgPSA2MCkge1xyXG5cclxuXHRcdHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XHJcblxyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGVmaW5lcy5OVU1fU0FNUExFU19GTE9BVCA9IHZhbHVlLnRvRml4ZWQoMSk7XHJcblx0XHR0aGlzLmdvZFJheXNNYXRlcmlhbC5kZWZpbmVzLk5VTV9TQU1QTEVTX0lOVCA9IHZhbHVlLnRvRml4ZWQoMCk7XHJcblx0XHR0aGlzLmdvZFJheXNNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgZGl0aGVyaW5nIGlzIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IGRpdGhlcmluZygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpdGhlcmluZyh2YWx1ZSkge1xyXG5cclxuXHRcdGlmKHRoaXMuZGl0aGVyaW5nICE9PSB2YWx1ZSkge1xyXG5cclxuXHRcdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XHJcblx0XHRcdHRoaXMuZ29kUmF5c01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBibGVuZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uZWVkc1N3YXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuXHQgKlxyXG5cdCAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG5cdCAqIHlvdXIgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGJsZW5kKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3ZlcmxheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IG1haW5TY2VuZSA9IHRoaXMubWFpblNjZW5lO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0U291cmNlID0gdGhpcy5saWdodFNvdXJjZTtcclxuXHRcdGNvbnN0IHNjcmVlblBvc2l0aW9uID0gdGhpcy5zY3JlZW5Qb3NpdGlvbjtcclxuXHJcblx0XHRjb25zdCBnb2RSYXlzTWF0ZXJpYWwgPSB0aGlzLmdvZFJheXNNYXRlcmlhbDtcclxuXHRcdGNvbnN0IGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldE1hc2sgPSB0aGlzLnJlbmRlclRhcmdldE1hc2s7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRYID0gdGhpcy5yZW5kZXJUYXJnZXRYO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0WSA9IHRoaXMucmVuZGVyVGFyZ2V0WTtcclxuXHJcblx0XHRsZXQgYmFja2dyb3VuZCwgcGFyZW50O1xyXG5cclxuXHRcdC8vIENvbXB1dGUgdGhlIHNjcmVlbiBsaWdodCBwb3NpdGlvbiBhbmQgdHJhbnNsYXRlIGl0IHRvIFswLjAsIDEuMF0uXHJcblx0XHRzY3JlZW5Qb3NpdGlvbi5jb3B5KGxpZ2h0U291cmNlLnBvc2l0aW9uKS5wcm9qZWN0KHRoaXMubWFpbkNhbWVyYSk7XHJcblx0XHRzY3JlZW5Qb3NpdGlvbi54ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnggKyAxLjApICogMC41LCAwLjAsIDEuMCk7XHJcblx0XHRzY3JlZW5Qb3NpdGlvbi55ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnkgKyAxLjApICogMC41LCAwLjAsIDEuMCk7XHJcblxyXG5cdFx0cGFyZW50ID0gbGlnaHRTb3VyY2UucGFyZW50O1xyXG5cdFx0YmFja2dyb3VuZCA9IG1haW5TY2VuZS5iYWNrZ3JvdW5kO1xyXG5cdFx0bWFpblNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xyXG5cdFx0dGhpcy5saWdodFNjZW5lLmFkZChsaWdodFNvdXJjZSk7XHJcblxyXG5cdFx0LyogRmlyc3QsIHJlbmRlciB0aGUgbGlnaHQgc291cmNlLiBUaGVuIHJlbmRlciB0aGUgc2NlbmUgaW50byB0aGUgc2FtZVxyXG5cdFx0YnVmZmVyIHVzaW5nIGEgbWFzayBvdmVycmlkZSBtYXRlcmlhbCB3aXRoIGRlcHRoIHRlc3QgZW5hYmxlZC4gKi9cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0LnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XHJcblxyXG5cdFx0aWYocGFyZW50ICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHRwYXJlbnQuYWRkKGxpZ2h0U291cmNlKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bWFpblNjZW5lLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xyXG5cclxuXHRcdC8vIEJsdXIgdGhlIG1hc2tlZCBzY2VuZSB0byByZWR1Y2UgYXJ0aWZhY3RzLlxyXG5cdFx0dGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0TWFzaywgcmVuZGVyVGFyZ2V0WCk7XHJcblxyXG5cdFx0Ly8gQmx1ciB0aGUgbWFza2VkIHNjZW5lIGFsb25nIHJhZGlhbCBsaW5lcyB0b3dhcmRzIHRoZSBsaWdodCBzb3VyY2UuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gZ29kUmF5c01hdGVyaWFsO1xyXG5cdFx0Z29kUmF5c01hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gcmVuZGVyVGFyZ2V0WC50ZXh0dXJlO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFkpO1xyXG5cclxuXHRcdGlmKHRoaXMuYmxlbmQpIHtcclxuXHJcblx0XHRcdC8vIENvbWJpbmUgdGhlIGdvZCByYXlzIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IGNvbWJpbmVNYXRlcmlhbDtcclxuXHRcdFx0Y29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdFx0Y29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUyLnZhbHVlID0gcmVuZGVyVGFyZ2V0WS50ZXh0dXJlO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0LnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0d2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xyXG5cdFx0aGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTGlnaHQuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTWFzay5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcclxuXHJcblx0XHRpZighYWxwaGEpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBtYXNrIHBhc3MuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hc2tQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWFzayBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVzZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NlbmUsIGNhbWVyYSkge1xyXG5cclxuXHRcdHN1cGVyKFwiTWFza1Bhc3NcIiwgc2NlbmUsIGNhbWVyYSwgbnVsbCk7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludmVyc2UgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuaW52ZXJzZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3RlbmNpbCBidWZmZXIgY2xlYXIgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHQgPSByZW5kZXJlci5jb250ZXh0O1xyXG5cdFx0Y29uc3Qgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHJcblx0XHRjb25zdCB3cml0ZVZhbHVlID0gdGhpcy5pbnZlcnNlID8gMCA6IDE7XHJcblx0XHRjb25zdCBjbGVhclZhbHVlID0gMSAtIHdyaXRlVmFsdWU7XHJcblxyXG5cdFx0Ly8gRG9uJ3QgdXBkYXRlIGNvbG9yIG9yIGRlcHRoLlxyXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKGZhbHNlKTtcclxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayhmYWxzZSk7XHJcblxyXG5cdFx0Ly8gTG9jayB0aGUgYnVmZmVycy5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKHRydWUpO1xyXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRMb2NrZWQodHJ1ZSk7XHJcblxyXG5cdFx0Ly8gQ29uZmlndXJlIHRoZSBzdGVuY2lsLlxyXG5cdFx0c3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldFRlc3QodHJ1ZSk7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0T3AoY29udGV4dC5SRVBMQUNFLCBjb250ZXh0LlJFUExBQ0UsIGNvbnRleHQuUkVQTEFDRSk7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0RnVuYyhjb250ZXh0LkFMV0FZUywgd3JpdGVWYWx1ZSwgMHhmZmZmZmZmZik7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0Q2xlYXIoY2xlYXJWYWx1ZSk7XHJcblxyXG5cdFx0Ly8gQ2xlYXIgdGhlIHN0ZW5jaWwuXHJcblx0XHRpZih0aGlzLmNsZWFyU3RlbmNpbCkge1xyXG5cclxuXHRcdFx0aWYodGhpcy5yZW5kZXJUb1NjcmVlbikge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XHJcblx0XHRcdFx0cmVuZGVyZXIuY2xlYXJTdGVuY2lsKCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoaW5wdXRCdWZmZXIpO1xyXG5cdFx0XHRcdHJlbmRlcmVyLmNsZWFyU3RlbmNpbCgpO1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQob3V0cHV0QnVmZmVyKTtcclxuXHRcdFx0XHRyZW5kZXJlci5jbGVhclN0ZW5jaWwoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRHJhdyB0aGUgbWFzay5cclxuXHRcdGlmKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCBudWxsKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIGlucHV0QnVmZmVyKTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVubG9jayB0aGUgYnVmZmVycy5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKGZhbHNlKTtcclxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TG9ja2VkKGZhbHNlKTtcclxuXHJcblx0XHQvLyBPbmx5IHJlbmRlciB3aGVyZSB0aGUgc3RlbmNpbCBpcyBzZXQgdG8gMS5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cdFx0c3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE9wKGNvbnRleHQuS0VFUCwgY29udGV4dC5LRUVQLCBjb250ZXh0LktFRVApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBzaGFkZXIgcGFzcy5cclxuICpcclxuICogVXNlZCB0byByZW5kZXIgYW55IHNoYWRlciBtYXRlcmlhbCBhcyBhIDJEIGZpbHRlci5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgU2hhZGVyUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRlciBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFkZXJNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgc2hhZGVyIG1hdGVyaWFsIHRvIHVzZS5cclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW3RleHR1cmVJRD1cInREaWZmdXNlXCJdIC0gVGhlIHRleHR1cmUgdW5pZm9ybSBpZGVudGlmaWVyLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihtYXRlcmlhbCwgdGV4dHVyZUlEID0gXCJ0RGlmZnVzZVwiKSB7XHJcblxyXG5cdFx0c3VwZXIoXCJTaGFkZXJQYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBjb2xvciBzYW1wbGVyIHVuaWZvcm0gb2YgdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTdHJpbmd9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRleHR1cmVJRCA9IHRleHR1cmVJRDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGlmKHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdICE9PSB1bmRlZmluZWQpIHtcclxuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHtcclxuXHRDb2xvcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0TWVzaERlcHRoTWF0ZXJpYWwsXHJcblx0UkdCQURlcHRoUGFja2luZyxcclxuXHRSR0JGb3JtYXQsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7XHJcblx0Q29weU1hdGVyaWFsLFxyXG5cdERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsLFxyXG5cdE91dGxpbmVCbGVuZE1hdGVyaWFsLFxyXG5cdE91dGxpbmVFZGdlc01hdGVyaWFsLFxyXG5cdEtlcm5lbFNpemVcclxufSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcblxyXG5pbXBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tIFwiLi9SZW5kZXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFNoYWRlclBhc3MgfSBmcm9tIFwiLi9TaGFkZXJQYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQW4gb3V0bGluZSBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiBTZWUge0BsaW5rIEJsdXJQYXNzfSwge0BsaW5rIE91dGxpbmVCbGVuZE1hdGVyaWFsfSBhbmQge0BsaW5rIE91dGxpbmVFZGdlc01hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucHVsc2VTcGVlZD0wLjBdIC0gVGhlIHB1bHNlIHNwZWVkLiBBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgdGhlIHB1bHNlIGVmZmVjdC5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJsdXI9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBvdXRsaW5lIHNob3VsZCBiZSBibHVycmVkLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihzY2VuZSwgY2FtZXJhLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIk91dGxpbmVQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1haW4gc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NjZW5lfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpblNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLm1haW5DYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIGRlcHRoIGluZm9ybWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldERlcHRoID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5EZXB0aFwiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXREZXB0aC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgb3V0bGluZSBtYXNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldE1hc2sgPSB0aGlzLnJlbmRlclRhcmdldERlcHRoLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5NYXNrXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBlZGdlIGRldGVjdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcyA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0c3RlbmNpbEJ1ZmZlcjogZmFsc2UsXHJcblx0XHRcdGRlcHRoQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXRcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkVkZ2VzXCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBibHVycmVkIG91dGxpbmUgb3ZlcmxheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMgPSB0aGlzLnJlbmRlclRhcmdldEVkZ2VzLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkJsdXJyZWRFZGdlc1wiO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZXB0aCBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0RlcHRoID0gbmV3IFJlbmRlclBhc3ModGhpcy5tYWluU2NlbmUsIHRoaXMubWFpbkNhbWVyYSwge1xyXG5cdFx0XHRvdmVycmlkZU1hdGVyaWFsOiBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoe1xyXG5cdFx0XHRcdGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcclxuXHRcdFx0XHRtb3JwaFRhcmdldHM6IHRydWUsXHJcblx0XHRcdFx0c2tpbm5pbmc6IHRydWVcclxuXHRcdFx0fSksXHJcblx0XHRcdGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXHJcblx0XHRcdGNsZWFyQWxwaGE6IDEuMFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRlcHRoIGNvbXBhcmlzb24gbWFzayBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc01hc2sgPSBuZXcgUmVuZGVyUGFzcyh0aGlzLm1haW5TY2VuZSwgdGhpcy5tYWluQ2FtZXJhLCB7XHJcblx0XHRcdG92ZXJyaWRlTWF0ZXJpYWw6IG5ldyBEZXB0aENvbXBhcmlzb25NYXRlcmlhbCh0aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUsIHRoaXMubWFpbkNhbWVyYSksXHJcblx0XHRcdGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXHJcblx0XHRcdGNsZWFyQWxwaGE6IDEuMFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGJsdXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qmx1clBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHR0aGlzLmtlcm5lbFNpemUgPSBvcHRpb25zLmtlcm5lbFNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvcHkgcGFzcyB0aGF0IHJlbmRlcnMgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbiBpZiBuZWVkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NoYWRlclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5UGFzcyA9IG5ldyBTaGFkZXJQYXNzKG5ldyBDb3B5TWF0ZXJpYWwoKSk7XHJcblx0XHR0aGlzLmNvcHlQYXNzLnJlbmRlclRvU2NyZWVuID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge091dGxpbmVFZGdlc01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWwgPSBuZXcgT3V0bGluZUVkZ2VzTWF0ZXJpYWwob3B0aW9ucyk7XHJcblx0XHR0aGlzLm91dGxpbmVFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRNYXNrLnZhbHVlID0gdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPdXRsaW5lQmxlbmRNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsID0gbmV3IE91dGxpbmVCbGVuZE1hdGVyaWFsKG9wdGlvbnMpO1xyXG5cdFx0dGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50TWFzay52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlO1xyXG5cclxuXHRcdHRoaXMuYmx1ciA9IChvcHRpb25zLmJsdXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmJsdXIgOiB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIG9iamVjdHMgdG8gb3V0bGluZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0RbXX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRpbWUgPSAwLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHVsc2Ugc3BlZWQuIEEgdmFsdWUgb2YgemVybyBkaXNhYmxlcyB0aGUgcHVsc2UgZWZmZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnB1bHNlU3BlZWQgPSAob3B0aW9ucy5wdWxzZVNwZWVkICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5wdWxzZVNwZWVkIDogMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZWRpY2F0ZWQgcmVuZGVyIGxheWVyIGZvciBzZWxlY3RlZCBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgbGF5ZXIgaXMgc2V0IHRvIDEwIGJ5IGRlZmF1bHQuIElmIHRoaXMgY29sbGlkZXMgd2l0aCB5b3VyIG93biBjdXN0b21cclxuXHRcdCAqIGxheWVycywgcGxlYXNlIGNoYW5nZSBpdCB0byBhIGZyZWUgbGF5ZXIgYmVmb3JlIHJlbmRlcmluZyFcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zZWxlY3Rpb25MYXllciA9IDEwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHJlc29sdXRpb25TY2FsZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpcyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCByZXNvbHV0aW9uU2NhbGUodmFsdWUgPSAwLjUpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdGdldCBrZXJuZWxTaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdHNldCBrZXJuZWxTaXplKHZhbHVlID0gS2VybmVsU2l6ZS5WRVJZX1NNQUxMKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG91dGxpbmUgb3ZlcmxheSBzaG91bGQgYmUgYmx1cnJlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgYmx1cigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5lbmFibGVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgYmx1cih2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MuZW5hYmxlZCA9IHZhbHVlO1xyXG5cclxuXHRcdHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudEVkZ2VzLnZhbHVlID0gdmFsdWUgP1xyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcy50ZXh0dXJlIDpcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcy50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXRoZXJpbmcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpdGhlcmluZyh2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBibGVuZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uZWVkc1N3YXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuXHQgKlxyXG5cdCAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG5cdCAqIHlvdXIgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGJsZW5kKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3ZlcmxheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50RWRnZXMudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgYW4gb3ZlcmxheSBmb3Igc2VsZWN0ZWQgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuXHQgKi9cclxuXHJcblx0c2V0UGF0dGVyblRleHR1cmUodGV4dHVyZSA9IG51bGwpIHtcclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnNldFBhdHRlcm5UZXh0dXJlKHRleHR1cmUpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHNlbGVjdHMgYSBsaXN0IG9mIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEW119IG9iamVjdHMgLSBUaGUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGNvcGllZC5cclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTZWxlY3Rpb24ob2JqZWN0cykge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IG9iamVjdHMuc2xpY2UoMCk7XHJcblx0XHRjb25zdCBzZWxlY3Rpb25MYXllciA9IHRoaXMuc2VsZWN0aW9uTGF5ZXI7XHJcblxyXG5cdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0dGhpcy5jbGVhclNlbGVjdGlvbigpO1xyXG5cclxuXHRcdGZvcihpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdHNlbGVjdGlvbltpXS5sYXllcnMuZW5hYmxlKHNlbGVjdGlvbkxheWVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRjbGVhclNlbGVjdGlvbigpIHtcclxuXHJcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcclxuXHRcdGNvbnN0IHNlbGVjdGlvbkxheWVyID0gdGhpcy5zZWxlY3Rpb25MYXllcjtcclxuXHJcblx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBzZWxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoc2VsZWN0aW9uTGF5ZXIpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlbGVjdHMgYW4gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC5cclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRzZWxlY3RPYmplY3Qob2JqZWN0KSB7XHJcblxyXG5cdFx0b2JqZWN0LmxheWVycy5lbmFibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XHJcblx0XHR0aGlzLnNlbGVjdGlvbi5wdXNoKG9iamVjdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzZWxlY3RzIGFuIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSBvYmplY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIG91dGxpbmVkLlxyXG5cdCAqIEByZXR1cm4ge091dGxpbmVQYXNzfSBUaGlzIHBhc3MuXHJcblx0ICovXHJcblxyXG5cdGRlc2VsZWN0T2JqZWN0KG9iamVjdCkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG5cdFx0Y29uc3QgaW5kZXggPSBzZWxlY3Rpb24uaW5kZXhPZihvYmplY3QpO1xyXG5cclxuXHRcdGlmKGluZGV4ID49IDApIHtcclxuXHJcblx0XHRcdHNlbGVjdGlvbltpbmRleF0ubGF5ZXJzLmRpc2FibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XHJcblx0XHRcdHNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuXHRcdFx0aWYoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRpbWUgPSAwLjA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgYWxsIHNlbGVjdGVkIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gdmlzaWJsZSAtIFdoZXRoZXIgdGhlIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdHNldFNlbGVjdGlvblZpc2libGUodmlzaWJsZSkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG5cclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdGZvcihpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdGlmKHZpc2libGUpIHtcclxuXHJcblx0XHRcdFx0c2VsZWN0aW9uW2ldLmxheWVycy5lbmFibGUoMCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoMCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3QgbWFpblNjZW5lID0gdGhpcy5tYWluU2NlbmU7XHJcblx0XHRjb25zdCBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xyXG5cdFx0Y29uc3QgcHVsc2UgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnB1bHNlO1xyXG5cclxuXHRcdGxldCBiYWNrZ3JvdW5kLCBtYXNrO1xyXG5cclxuXHRcdGlmKHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcclxuXHJcblx0XHRcdGJhY2tncm91bmQgPSBtYWluU2NlbmUuYmFja2dyb3VuZDtcclxuXHRcdFx0bWFzayA9IG1haW5DYW1lcmEubGF5ZXJzLm1hc2s7XHJcblx0XHRcdG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHJcblx0XHRcdHB1bHNlLnZhbHVlID0gMS4wO1xyXG5cclxuXHRcdFx0aWYodGhpcy5wdWxzZVNwZWVkID4gMC4wKSB7XHJcblxyXG5cdFx0XHRcdHB1bHNlLnZhbHVlID0gMC42MjUgKyBNYXRoLmNvcyh0aGlzLnRpbWUgKiB0aGlzLnB1bHNlU3BlZWQgKiAxMC4wKSAqIDAuMzc1O1xyXG5cdFx0XHRcdHRoaXMudGltZSArPSBkZWx0YTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJlbmRlciBhIGN1c3RvbSBkZXB0aCB0ZXh0dXJlIGFuZCBpZ25vcmUgc2VsZWN0ZWQgb2JqZWN0cy5cclxuXHRcdFx0dGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKGZhbHNlKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJQYXNzRGVwdGgucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldERlcHRoKTtcclxuXHRcdFx0dGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKHRydWUpO1xyXG5cclxuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFzayBmb3IgdGhlIHNlbGVjdGVkIG9iamVjdHMgdXNpbmcgdGhlIGRlcHRoIGluZm9ybWF0aW9uLlxyXG5cdFx0XHRtYWluQ2FtZXJhLmxheWVycy5tYXNrID0gMSA8PCB0aGlzLnNlbGVjdGlvbkxheWVyO1xyXG5cdFx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXRNYXNrKTtcclxuXHJcblx0XHRcdC8vIFJlc3RvcmUgdGhlIGNhbWVyYSBsYXllciBtYXNrIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZC5cclxuXHRcdFx0bWFpbkNhbWVyYS5sYXllcnMubWFzayA9IG1hc2s7XHJcblx0XHRcdG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcclxuXHJcblx0XHRcdC8vIERldGVjdCB0aGUgb3V0bGluZS5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWw7XHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXRFZGdlcyk7XHJcblxyXG5cdFx0XHRpZih0aGlzLmJsdXJQYXNzLmVuYWJsZWQpIHtcclxuXHJcblx0XHRcdFx0Ly8gQmx1ciB0aGUgZWRnZXMuXHJcblx0XHRcdFx0dGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMsIHRoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKHRoaXMuYmxlbmQpIHtcclxuXHJcblx0XHRcdFx0Ly8gRHJhdyB0aGUgZmluYWwgb3ZlcmxheSBvbnRvIHRoZSBzY2VuZSBjb2xvdXJzLlxyXG5cdFx0XHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsO1xyXG5cdFx0XHRcdHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiB0aGlzLm91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcclxuXHJcblx0XHRcdC8vIERyYXcgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbi5cclxuXHRcdFx0dGhpcy5jb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0RGVwdGguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzay5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0RlcHRoLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0d2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xyXG5cdFx0aGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cdFx0dGhpcy5vdXRsaW5lRWRnZXNNYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuXHQgKi9cclxuXHJcblx0aW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlclBhc3NEZXB0aC5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcclxuXHRcdHRoaXMuYmx1clBhc3MuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBpeGVsYXRpb25NYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBpeGVsYXRpb24gcGFzcy5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgUGl4ZWxhdGlvblBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwaXhlbGF0aW9uIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2dyYW51bGFyaXR5PTMwLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihncmFudWxhcml0eSA9IDMwLjApIHtcclxuXHJcblx0XHRzdXBlcihcIlBpeGVsYXRpb25QYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgUGl4ZWxhdGlvbk1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBncmFudWxhcml0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tYXRlcmlhbC5ncmFudWxhcml0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGdyYW51bGFyaXR5KHZhbHVlID0gMzApIHtcclxuXHJcblx0XHR2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xyXG5cclxuXHRcdGlmKHZhbHVlICUgMiA+IDApIHtcclxuXHJcblx0XHRcdHZhbHVlICs9IDE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuZ3JhbnVsYXJpdHkgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnNldFJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBbiBhZHZhbmNlZCBEZXB0aCBvZiBGaWVsZCAoRG9GKSBwYXNzLlxyXG4gKlxyXG4gKiBZaWVsZHMgbW9yZSByZWFsaXN0aWMgcmVzdWx0cyBidXQgaXMgYWxzbyBtb3JlIGRlbWFuZGluZy5cclxuICpcclxuICogVGhpcyBwYXNzIHJlcXVpcmVzIGEge0BsaW5rIEVmZmVjdENvbXBvc2VyI2RlcHRoVGV4dHVyZX0uXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlYWxpc3RpY0Jva2VoUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJva2VoIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuIFVzZWQgdG8gb2J0YWluIHRoZSBmb2NhbCBsZW5ndGggYW5kIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgc2V0dGluZ3MuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycy4gU2VlIHtAbGluayBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoY2FtZXJhLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIlJlYWxpc3RpY0Jva2VoUGFzc1wiKTtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwoY2FtZXJhLCBvcHRpb25zKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGVwdGgudmFsdWUgPSBpbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciwgUkdCRm9ybWF0LCBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBDb3B5TWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBwYXNzIHRoYXQgcmVuZGVycyB0aGUgcmVzdWx0IGZyb20gYSBwcmV2aW91cyBwYXNzIHRvIGFub3RoZXIgcmVuZGVyIHRhcmdldC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgU2F2ZVBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzYXZlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBbcmVuZGVyVGFyZ2V0XSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZSBmb3Igc2F2aW5nIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmVzaXplPXRydWVdIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgYWRqdXN0IHRvIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHJlbmRlclRhcmdldCwgcmVzaXplID0gdHJ1ZSkge1xyXG5cclxuXHRcdHN1cGVyKFwiU2F2ZVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBDb3B5TWF0ZXJpYWwoKTtcclxuXHJcblx0XHR0aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSAocmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQpID8gcmVuZGVyVGFyZ2V0IDogbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIlNhdmUuVGFyZ2V0XCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGJlIHJlc2l6ZWQgd2hlbiB0aGUgc2l6ZSBvZlxyXG5cdFx0ICogdGhlIGNvbXBvc2VyJ3MgZnJhbWUgYnVmZmVyIGNoYW5nZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlc2l6ZSA9IHJlc2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHRpZih0aGlzLnJlc2l6ZSkge1xyXG5cclxuXHRcdFx0d2lkdGggPSBNYXRoLm1heCgxLCB3aWR0aCk7XHJcblx0XHRcdGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG5cdCAqL1xyXG5cclxuXHRpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xyXG5cclxuXHRcdGlmKCFhbHBoYSkge1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHsgQ29weU1hdGVyaWFsLCBTaG9ja1dhdmVNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBIYWxmIFBJLlxyXG4gKlxyXG4gKiBAdHlwZSB7TnVtYmVyfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmNvbnN0IEhBTEZfUEkgPSBNYXRoLlBJICogMC41O1xyXG5cclxuLyoqXHJcbiAqIEEgdmVjdG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7VmVjdG9yM31cclxuICogQHByaXZhdGVcclxuICovXHJcblxyXG5jb25zdCB2ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHZlY3Rvci5cclxuICpcclxuICogQHR5cGUge1ZlY3RvcjN9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3QgYWIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgc2hvY2sgd2F2ZSBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBTaG9ja1dhdmVQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hvY2sgd2F2ZSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtlcGljZW50ZXJdIC0gVGhlIHdvcmxkIHBvc2l0aW9uIG9mIHRoZSBzaG9jayB3YXZlIGVwaWNlbnRlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNwZWVkPTEuMF0gLSBUaGUgYW5pbWF0aW9uIHNwZWVkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSYWRpdXM9MS4wXSAtIFRoZSBleHRlbnQgb2YgdGhlIHNob2NrIHdhdmUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSwgZXBpY2VudGVyID0gbmV3IFZlY3RvcjMoKSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJTaG9ja1dhdmVQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1haW4gY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlcGljZW50ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKiBAZXhhbXBsZSBzaG9ja1dhdmVQYXNzLmVwaWNlbnRlciA9IG15TWVzaC5wb3NpdGlvbjtcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZXBpY2VudGVyID0gZXBpY2VudGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCBwb3NpdGlvbiBpbiBzY3JlZW4gc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zY3JlZW5Qb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlZWQgb2YgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNwZWVkID0gKG9wdGlvbnMuc3BlZWQgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnNwZWVkIDogMi4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0aW1lIGFjY3VtdWxhdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uIGlzIGFjdGl2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2hvY2tXYXZlTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zaG9ja1dhdmVNYXRlcmlhbCA9IG5ldyBTaG9ja1dhdmVNYXRlcmlhbChvcHRpb25zKTtcclxuXHJcblx0XHR0aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmNlbnRlci52YWx1ZSA9IHRoaXMuc2NyZWVuUG9zaXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvcHkgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW1pdHMgdGhlIHNob2NrIHdhdmUuXHJcblx0ICovXHJcblxyXG5cdGV4cGxvZGUoKSB7XHJcblxyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cdFx0dGhpcy5hY3RpdmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3QgZXBpY2VudGVyID0gdGhpcy5lcGljZW50ZXI7XHJcblx0XHRjb25zdCBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xyXG5cdFx0Y29uc3Qgc2NyZWVuUG9zaXRpb24gPSB0aGlzLnNjcmVlblBvc2l0aW9uO1xyXG5cclxuXHRcdGNvbnN0IHNob2NrV2F2ZU1hdGVyaWFsID0gdGhpcy5zaG9ja1dhdmVNYXRlcmlhbDtcclxuXHRcdGNvbnN0IHVuaWZvcm1zID0gc2hvY2tXYXZlTWF0ZXJpYWwudW5pZm9ybXM7XHJcblx0XHRjb25zdCBjZW50ZXIgPSB1bmlmb3Jtcy5jZW50ZXI7XHJcblx0XHRjb25zdCByYWRpdXMgPSB1bmlmb3Jtcy5yYWRpdXM7XHJcblx0XHRjb25zdCBtYXhSYWRpdXMgPSB1bmlmb3Jtcy5tYXhSYWRpdXM7XHJcblx0XHRjb25zdCB3YXZlU2l6ZSA9IHVuaWZvcm1zLndhdmVTaXplO1xyXG5cclxuXHRcdHRoaXMuY29weU1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLmNvcHlNYXRlcmlhbDtcclxuXHJcblx0XHRpZih0aGlzLmFjdGl2ZSkge1xyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIGRpcmVjdGlvbiB2ZWN0b3JzLlxyXG5cdFx0XHRtYWluQ2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHYpO1xyXG5cdFx0XHRhYi5jb3B5KG1haW5DYW1lcmEucG9zaXRpb24pLnN1YihlcGljZW50ZXIpO1xyXG5cclxuXHRcdFx0Ly8gRG9uJ3QgcmVuZGVyIHRoZSBlZmZlY3QgaWYgdGhlIG9iamVjdCBpcyBiZWhpbmQgdGhlIGNhbWVyYS5cclxuXHRcdFx0aWYodi5hbmdsZVRvKGFiKSA+IEhBTEZfUEkpIHtcclxuXHJcblx0XHRcdFx0Ly8gU2NhbGUgdGhlIGVmZmVjdCBiYXNlZCBvbiBkaXN0YW5jZSB0byB0aGUgb2JqZWN0LlxyXG5cdFx0XHRcdHVuaWZvcm1zLmNhbWVyYURpc3RhbmNlLnZhbHVlID0gbWFpbkNhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKGVwaWNlbnRlcik7XHJcblxyXG5cdFx0XHRcdC8vIENhbGN1bGF0ZSB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBlcGljZW50ZXIuXHJcblx0XHRcdFx0c2NyZWVuUG9zaXRpb24uY29weShlcGljZW50ZXIpLnByb2plY3QobWFpbkNhbWVyYSk7XHJcblx0XHRcdFx0Y2VudGVyLnZhbHVlLnggPSAoc2NyZWVuUG9zaXRpb24ueCArIDEuMCkgKiAwLjU7XHJcblx0XHRcdFx0Y2VudGVyLnZhbHVlLnkgPSAoc2NyZWVuUG9zaXRpb24ueSArIDEuMCkgKiAwLjU7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdFx0XHR0aGlzLm1hdGVyaWFsID0gc2hvY2tXYXZlTWF0ZXJpYWw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHNob2NrIHdhdmUgcmFkaXVzIGJhc2VkIG9uIHRpbWUuXHJcblx0XHRcdHRoaXMudGltZSArPSBkZWx0YSAqIHRoaXMuc3BlZWQ7XHJcblx0XHRcdHJhZGl1cy52YWx1ZSA9IHRoaXMudGltZSAtIHdhdmVTaXplLnZhbHVlO1xyXG5cclxuXHRcdFx0aWYocmFkaXVzLnZhbHVlID49IChtYXhSYWRpdXMudmFsdWUgKyB3YXZlU2l6ZS52YWx1ZSkgKiAyKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsIi8vIEdlbmVyYXRlZCB3aXRoIFNNQUFTZWFyY2hJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLCBub3QgY3JvcHBlZCwgbG93IGR5bmFtaWMgcmFuZ2UuXHJcbmV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFSUFBQUFoQ0FBQUFBQklYeUxBQUFBQU9FbEVRVlJJeDJOZ0dBV2pZQlNNZ2xFd0VJQ1JFWVJnRkJaQnFEQ1NMQTJNR1BVSVZRRVRFOWlOVUFxTFI1Z0llb1FLUmd3WGp3QUFHbjRBdGFGZVlMRUFBQUFBU1VWT1JLNUNZSUlcIjtcclxuIiwiLy8gR2VuZXJhdGVkIHdpdGggU01BQUFyZWFJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLlxyXG5leHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBS0FBQUFJd0NBWUFBQUFCTm1CSEFBQWdBRWxFUVZSNFh1eTlDYmhsVjFrdE92YnBxMDlEa2lJa1VCSTZreEFTSUgwRGxBUWlJSzF3UmZTSlR4K2k0Slg3dktJaWdzOEhYcFh2cVZjdnJjQzlhZ1E3SURUU1NXZ3FDUVFsaURSQkpLa2toRFNrcVZQTnFWT25QKzhiLy9ySDNQK2VaKzE5OXRsem5WVGx2VnJmdDcrMVQ3T2F1ZVpZNDIvbTM3UUFMS05rMndIZzFwSVRsQjE3bUMrUHAxMVczWC9MSHlUMzJ2aGc0OC81U092K1Bud3BzSEE3MEpvR2x1ZUIxaUtBcGVxenZPem40NEdhdFRCNzZYemhkN3N1QlI3K1dXQURnREVBd3dDRy9MNTRiL3BvRExySHV2dm03MFoyQXZoc2MrUFZjeHNjQlU4RjhDOEFEZzUraXBJakQvUGxHd2ZnanU4QjkyNEU1c2VBUlVmTHNpTm1xUVcwSWpMOCs3TDJOWUQvN0NPQnpmY0NtK2FCOFNWZ2RBa1lJUkNYS3lEYXg0RWRBYW5MNVB1TlBsbE52WERsQUh3RmdQOEFjQzJBaFJJb0RYYnNZYjQ4ZGw1V2tWRlRFM0xHRGNDOW00Q1pDV0J1RkZnZUFaYUdBWUpRUUNScURIVCtNY0pyVmI4endBVFVYSDAyTUhZZk1IRUlHRnNBeGdqQXBRcUFDWVFPUmp0ZC9CN0F4dC96NzlzQzArY01QZ2pqbHdQd1Z3SGNBK0RmQUh6VHhjVmdXQnJvcU1OOCtjWUJlTTcxd0gwVHdLRXhZSFlVV0NJQUhZUkxUbGtDWWdjSUJjQWdVL24zcXk4R1J1NEhSZ25BT1dCa0VSaGRkUEFKaEdKREJ4a3Z3N2NxaW1yK3pGTS9aTG5aRjY0Y2dMOEJZRCtBV3dCOHgvZGxXdVdhZ0hpWUw5ODRBSi8wUldCeTFBRTRBaXp5TTF5eFlBY1RpZ1c1NXhNYkFreEVpd0Vka0ovWkNReFBBaU9IZ0JFQ2NLRUM0VEJaY0trU3YrbVRpZU5jTlBOQzI2bUxOc2o0NVFEOExRRFRBTzRHY0p0LzdpdzJiZm9HNFdHK3ZBR3dtOUV4aUVnNjl6cGcvd2d3UFFMTWpnQUx6bjRFNGFJem9KalE5ZzQwMjR1eWdraitweXVBb1gwVkFJZm5nT0g1TmdDSE1oQW04U3YyeTNYRFplQmhOSXA4T3pKRThPc0J6QUtZQkhBWGdEdDgvNE8rTVZUMGo0ZjU4bzBEOFB4cmdmM0R3TXdJTUVQUUVZUmtOd2Znc3V1RFpMc2tpcDBObzBnV01ELzlIR0RvQURBa0FDNEF3L3dzQWdaQWdzMlowQUJJMEdVNklWbUt2K2YyOEtEbkh4a0EvRzBBOHk2RzczTjlrT0NqWG5oL0ViYjZPdmd3WDc1eEFGNXdMVEExVklIUEFEZ01MRGo0eUlBNUFBbTZhQ1VudjRvejQ2ZWVEd3hOQVVNendKQXo0QkFCU05ERlR3U2ZnN0RES0hFMjNNRzVQcUlZOEExdS9kSU5zOWRCZHk4QWduR1BNMk5mVUJyc253N3o1UnNINElYWEFBY0p2aUZnbHVBYnlnQklOblNMV09Bakd4SjRwZ09LRFYwdi9PU0xLcDhpR1hCb3ZoTEJCT0NRTTJBQ29UT2huWXJBZEl0WWJDaWo1SkZ6UnlJQXFSY2NBbkRBUVVqZzZVTlE3aHNNWFAwY1JRQWV4c3MzRHNDTENFQ0NMd0NRek1jUHdVaTJNd0FTY0FLYmZuWS9ZUkxGUThESFgrSUFKQU1TZkRrQUYxM2tMdmxlSWpoalFRSHhVVlMzampnR3BLZWVOellWUUVqZ1VTOGsrUGdoT05kaEl3QVA0K1hYQllDSEtJSmJ3SnlEVGdhSUFkQ0JKeDNRMk04dFlBSFA5bTRkZi95bFFPc1EwSnF0UkxDeDMwSzF3dExCZ2dTY1FPZ3NLQkdjV0hBSmVPd1JDMEJTTTFtUUlLUmJoaCtCajk4SlFQNnQ0VTBBUEV5WFh4Y0FFbnhrUUFGd29WVXhJRDlrdlFnK2MxQzd2aWRSYklEa2MyNEIvL2hUUUd1bURjQ1dBNURnTXhBU2ROSUZCVUk1cENNTDh2OEFQSTV6ZkVReDRCdWRncWljenZpU25KaFF3Q1A0Qk1DR2wrd084K1U3QUppL1c0TzRZUzYrcG1LLzJjaUFEc0FPQmhUSUlpQUpuUEI3QXZOalArMEFuQU5hWWtBSFgySkJBYyt0WWFKWE9xQlp2MjRWYzM4NlhXNWR0a0hHVys0SEZBSm9ucE9lK1lZUVpBU2hnS2p2M1BOdlBRYXhWb0k4ekpkZkZ3QVNmUHpNVXdTM0t0MXYwVUZJbG9zNm9ERmRBR0ZjbGlNQVAvcnlBRUFHTndRUm5ET2dMYmRsSUV3cklzNkFaL1Fna01NSFFGNlpBS1FjSkFzU1lQd0llQUlrOXdKZ29QSzFnaTcrUHdGNEdDL2ZPQUF2SVFQU3MwVVJUUEJKL1BwM0dTRUdSSGZCQ0lRMHhvd0J0VWJjQWo3eXM1WDRKZnUxSElBR1FySWdRUlhFc0FGUUlPUkRGaGlEWS9yTUhtclU0UVVnUjA4QWtnVWpDQVc2Q0Q2Q2t3QnNBSVFDNEdHNmZQTUEzT1hpTnpDZzJJOWdOQ01rc21BQW9lbUR6b2ltRndMNDhNODVBS2tpdVFWTUFBcDhDWVJSREF0OEdRaUo2N042R0pPREFYQUhsc0dndXNjQTJBSmcxSVBHWW14T3BCeEZXa1JOOUxzQVRnSXdYbk5zL3YvNXovOVhDZjhCTzNZQXR4YmMvNDYvS0R0KzUrZWExWWt1MlZVeEh6L3owdjI0RndNR0sxZ1dzSzJPVVV4SEhkQ0JlUlVCNk94SEFCcjRaSUNJQmQwUVdTRitYUmRNVEFqZ0NkVHJHOWNCTndFNEY4Q3BEa0lDeVlMR3N1aEZ0NnpzK2dJU3dVZW44ekVBamdNdzRjZngySDZPLzkweUFGbzg0Q2JnNElEMy85VGZMVHQrNStlYm5SQUJrT0RqeDBTd1BpNWVjL0ZyWXBtcVNBeE04RG42MENzcUFGSTZHZmhxQU1pREUvZ29rbXZFcjBDNFBnRGtCUW00MHdFOHpNRkVVREtFVm94SU1MbC9LUzczbUU3SDlkK3ZjS0hRUWNqd1cwWXU5blA4bThzQW1PSUJ1V1k2d1AyLzRzMGV6ampnOFR1dmFSNkFCSjcwdnhVQXBHcm03RWJHRStpNDcyQkFCK1dIZnFIUy9lb0FhRXdZMkU5K3dMU1hUcWhJN0NYZ25CNkxDb09KNEJpU1QraFRuRzBIY0N3QWdsQ3gzQVJvWkVWRlhuQlBwL08vQS9oWEFDYzdDUHM5L2kxbEFPeUlCK1JEWCtQOS8rcGJRampqQU1mdi9QTDZBRkRzMXdGQWdzLzlmZ0tmZ2RFL1pFcHVpUWxid0FkZTZRQU1CZ2lSbXNTd0E5QlkwSmZqb3ZHUkRCTUg0VGxjWEdoY0JPYzZIa0YwZ2pQaFpnY2h4VExaTUFjaS8wNFcvQjZBYjN0MDlFUFhjUHlmbGdGd1JUd2dKMk1OOS84YmY1cUZNNjd4K0IvYVc0WFF6NDJGZUwwWXJSeWlrenRVRncwNzA0bWY5a1hneGhPQXFjM0FBc1B5Unh4UUNzL1BkWE9GWTBXMUtIeTNRSVVHdHgrNnZkbngxdnNCK2RzVG5jbTJBb2dnbEZnVkVBbFVXck9NQjJSeUVtTUNHUS9ZNy9IdktuczZ0ZkdBbkpRK3IvOWI3Nm9KWjF6RDhXZHlRallCaDhhQmhWRUhqRUxvdVE4dWtRN1ZSU0NKQUFMd2tyK3NBTGhuR3pERDNKQUpZSkhnOXVob2k0Yng4eXRrV1V0dkhULzcrWmM0ZHcxdVozNjEyZkgyZGtRZjd5eElFRW9ja3drSlFuNElRb3E4dW5oQWhtUFJLS0Z4MHV2NEs4dWVUczk0d0Q3dS8vVlg5Z2huN09QNGMrNEc3aDhIcHNlQitkRjJBS2xGTHd1QUlaOGpENk5Qck9oQWZmbWZBOS9aQnV6WkNreVJXU2VxQkNXeW9ZR1E1eVFyQnBEYnVtL01FMUhvUG8wWEVrU0QyemxmYm5hOHE2K0VVSmNUQ3hLRXRITDVFUWpQNkJFUHlJZ1lBWkJ2WXQzeEh5eDdPcXZHQTY1eS83Lzl3VlhDR1ZjNS9zbDdxeEQ2NmRFcWlZZ1J6QXFoTjFBNENCTkFBbER5QUZJK2laOS9OM0RMSnVDK2pjRFVCbUNXeVVuT3JtVFlDTUlPa05jbExnMEI4L1JzTkxnOStVdk5qbmQxQVBMbW1RcEZIeUVCUk91V0FDUVQ4bk4rSC9HQXZZNy9WTm5UNlNzZXNNZjEzL0NwYWhHblp6aGpqK1BQbXdYMk1ZZERJZlFleFd5QkF3RVVPUURyUkROLzk4cDNBN2R2QU82ZkFBNXNxSEpEQkVBeW9VVkdrd0VkNkhSMTJYVTRrd3pmbDZmQ1hUWnpqeTU3dnZuUjUxM1g3SGo3QXlEdmdnQVVpOUV5RmdpWnFOeFBRRjYzNDVuT1diRDFIUS9ZNWZwdnVMYS8yKzgyL3ZOSGdBUERGUURuaG9GNWoyQzJxQldDSThidzFlUnc1Q0w1bDk0TDNERU9USTREQjhZOU9XbXNFdS96QkozcmdzYXlicUJvYi83QTRDN2p0V2Nvb1JyY3pyK3UyZkgyRDBBT1FnQVVDeEtFUDdhR2dMeTY0K202S2RqV0ZBOVljLzAzL09zYTRnbHJqcitBdXBxSHoxc0VzMGN4RzBCQzlISWVQTG9pdDllTmtWZjlMK0R1VVdCeURKZ2FxNHliR1lMUEFXZ2lYbUxlZFVFN2R3QzdzYUw3Q3FmUEtYaTROWWRheWtDRDQxMGJBSGxERXNOaXdaOXdBUFlia0pjZno2VDJnbTNOOFlEWjlkL3dIeFVBKzczOWZQd1hQclNLWUdiK0J1UDNqQUZERWxGSDlISVd3YnpDSUdrQnIvb3I0SjRSWU84b01PVzZaVmNBdXZpMUNnb2hhMDRCQ3dUNWdmTUtIbTdOb1JkZTIreDQxdzVBM2hRWmtBRGs1K2NHaUFlTXgzKy83QUVORkE4WXJ2L0c3MWNBWEZNNFl6aitvdE9BYVFMUUEwZ1p4YUlJWnRNREZUaWdLSlY4SDlJcTZhWjU5WlhBdlNQQXZwRUtnQlR0Qk9EY1NDV0NaZVJZdHB6cm1MeWVHTkNBeUZsMXYrSGVpOHFlYjM3MFJkYzJPOTdCQU1pN0VnQi8yUUc0MW5oQUhVOUx1V0FiT0I3UXIvL0dQUlVBMTNyN0d2OUZad0lNb1ZjRXN3RXdmRG9pbUVQMHNoS0t0SXBoYVpRQVh2MStZTSt3QTNERWRjdlJLa0dKQURRUUVzUXVoaTFUanQ5NXZCc2g1bngySU81OVNzSERyVG1VT1N0TmpuZHdBQXFFcnkwSXlDTUlDa095aXVJQk53QnZQRlFRVDdnQnVQamM5b1JZQUlIeU9FTDR2SUZFWVZOYU9vdTV2Q0dFL3RWL0Ewd09WY25wekk0N05PcmkzUUZJQnBTZWFTRFVkWUxPU1d2WUltU0dnZnRwSkRhNE1XSmJBR3hpdkdVQTVNQU9jMEJlNmVWTGo3LzRNaytoekNPWVBZcFpEQmlOa0xoK0cvTTN5Rnl2L2x0Z0wzVzNZUWZnY0ZVaGdSWTJQd1krWjcvRWhBUjFTRnlYQ09iNTdyMjhRZlFCc0pRQk1uNUQ0eTBIWUxQamU5Q2Q3UklDMFBNM0VpTW9mRjRnVkNCcDFQODQwaXgvZ3l6NTZyK3ZBTWprOUdsMzc1aUI0K0N6dmV1WmRMa2tFUEo4WkVmWC82Ujczdk9qelQ1U2k5aHVjTHhIQVZnNFB3SmdSd2g5Q0tPWEs4WUE0WkVxS1pYU1FXaDVQKzVBZnRYZkEvdUdLdllqQ0tuNzJjY3RiRnJaTkVDa2E1TDVDUHdJUHRNSDNUVnoxN01MQjVnZExnQTJOZDZqQUN5Y0h3TFF4RkVVU1I1QVN2QVJEQjBoOUFRYjliWElnQ0drNmxVZkFQWVRnRVBBSVRLZ2cxQk9iazU4c3JUSmdHNThXTWtXTWFBYlFRVDFuYzhySEdBTkFKc2M3MUVBRnM0UEFhZ1Flc3RnQzFsc0JKNEJNQ1NPSzZkRFVjd3FxYUZpUXIvMFFlQUFBZGp5K2pCaVFRZWVNU0JaVDNuQ1BVRElhOXorL01JQjFnQ3d5ZkVlQldEaC9CQ0FlUVN6Z2tqRmZHTEJCRDVueFE0RHhOMHd2M2hWeFg1VEJHRHdMNW9ieHZWQTVZcVlMNUJlTUxkNjZZWXhKcFJCMGdLKzk2TENBZFlBc01ueEhnVmc0ZndJZ01yaFVQS1EyQytCejBQbUJUcUJNUWVoQWJEbElqajRGODBLSmd1U1ZaMEZ1WHBqb0NPZ1hhd0xqQUxoYlQ5ZU9NQXVBR3hxdkVjQldEZy9sMUlFMDVFZDB5Z1pueUhkejBWd0NxRVBJZk55eDBRUXZ2TERGUUNwKzhuZlprNXVuZDh0WHdJZ1djSFNOWDBOMkNKbW5BbDN2NlJ3Z05uaGwxN1Q3SGlQQXJCd2ZnaEFTN21WL2hleTJKUzlGdk0zQkxwVVVpMVl3RFJNWHZrUllKb0FsQWgybDBkY1owNHM2SlVURElqeUJjcmw0eURjL2RMQ0FkWUFzTW54SGdWZzRmeHdLVndKZ0dFSk5tV3R4cFFNcFg5b24yZVJoVkErTzU2QWpNZm5QK2UzWHZmM053RzR4SVBUbGVpWTU1YnBHaDZVYmFmTlUwbDB6MHArNUpoNUhxWUo2YjUxblA2WFA4Y3gxMlhOSFFWZ0lRQi9iRlBWZzJPQzdRK1dnVkZXbmcvRnZ0V0xJMDZ1V2g1b2d1S0VjWFZTLzlzRUFGLy9WR0Q3dDRFVERnSmJGNENOaThDR1pXQnMyZlBML0g2VndwMktFdFZrNGZKK3YvRUlZUE45d0thNXF1K0luY2ZQd1hIVlplL2FPTDNFYndTN3h2OEExclF2bk8wajhQQXJUZ1RHWjRCeEZ2OW1JeGhPQ0dzdiswT1BZRFJnaGNMZmtXa0V1cTArRzAweDRPdGZER3orZDJEYkhtRExqTDhzaThBWVAvN0NHSUFpRUVNVEc5MnpYcVNiSCtkOVIyYUEwWG52TytKanRoaUlyT1ZESEhQT2tCcnpVUUFXQVBzWnAzb1BEcGEvWGFnNkVWa0xCSys1ckFuSkMzL25Zay9BUEQ3MDRXaUVBVjhPVEh3WDJMUUgyRGdGYkpnRk5yQmhqZDhyNzlkZUdvRXdzbGxnTkJPenk4Q2Rqd2VHOXdCajA4QUlBY2kyRDZIYWZteUFrNC9aN1NKNzJoR1lSd0ZZQU1ETFR3T0dwNEZSRmdEM0hoenFSR1FpeWV1cnFPZEc2cjBSbThJRVpqelJsa2lxQ1dvRWdLOEF4bTRCSnU0SEpoeUFiRmhEeG1iREduWk80ajBTZ0xHRGtwaWJnRXE2NlRKdy8xbkEwRjVnZExwcSt6RHFGZmQ1TE1lV3F1NUhOU1QwdUpPSWxsZytxZ01XZ0krSFB2MHh3TEEzZ1dIcFcyc0M0NDFnQ0VDYm1LemlhR3JuVWRNTzRhSGVoNk14QVA0U01ISTdNTDRIR0Q4QWpIdkhKR05BZ3BEZ1kvY2szc3RpcFJlbXZWaGMrdUFTTVBVRVlHaC85ZElSZ0d4OFkrTU5iUi8wMHVWdEgwd0V4OTRqL3Ywb0F4YUE4RWQrR0JpZUFZWlpnNWtBREMwUVdHT0Z6R0psY0dQemwxQnhOTFhEOHNrNHhmdHdOQWJBL3d3TTN3R01VbXhPT1FCbkhYemV0SVl2aWJvbm1TaXVZVE5qcmlWZzdnbEFpd0JrMGZOWkg2K1BtWDlQNmtmTm1DWEdwZnRKN1RnS3dCSUFubG4xNEJBQVl4TVltNUM2UmpDeUNvT3lyMHFrRC9jK0hJMEI4RFhBOE4zQXlDUXdlc0QxVlFLSDdFY0FTbTFRK3k0Q2tOOXBVS2lWRjVuTHZ5K2ZCYlRVZDhRQmFIMUh2TkJST2ladmZzTm5yRjRrY3ZQd3Bkc0JMQmVVMThOZjdBQjIzRHA0ZWNIQzhvQmdVbEpKZWNMUys3K1dPcEUzZ2JFK0hLdyt5b2V2Q1lrTUdLcVBKcmRFS0FSdXRhRllSczFmaUVaMHdQOENETjhMRE84RlJxWXEzVzEwcGdLZ2ZZTGFZQ3pvb3RnQTZLWGFUQTkweTM3NFRLQjFzQm96eTc3eEhGWjUzNnV0UmdBbUVhdzZnNWtVU0Zad1NYbkEzMzBxc09sZmdITVBEbFplc0xBOElPam9MeXBQV0hqLzExRW5DaVZ3a3o3a0FFeHRzR3JhWVVXZFNEWDVUbXNhZ0w4S0RCR0E3QmQzMEpzVzBvV2l2bkVPUU5QN3lHVFNCUjEwMUFsWlNVdEd5ZmdaRGtDV1kxSG5KZGNCVmU2MzI1aFR2ZWxnMkNRalpORHlnRy8yQW4wajF3S25MNnk5dkdCaGVVQzhwclE4WWVIOVgzOU9WUVNjN01jNmZDYUt2QWVIZENJVmY0eU1ZQ3luVHBYK25iOTdOSm1sU1FiOHI4RFFIbTlZT0ZVWlRLT3pvWEdoczZBeEYwSElleGNMQnZXQnVpSE44czJuZTk4UjNxYzZMNFZ5YjJvQlZqZm05TUlGSGJqRENoNmtQT0JiUW9HK29XOENPNWJXVmw2d3NEd2dmcjIwUEdIaC9YLzFpYUVJdURjQ1RJVy8xUTRyRnY4T25ZaVczYytXMmlLd1VqS2J5alFOd0wxdXVSNnNBRWdEZ3ExYnJYT21WODFQeGhOQjZEVURCU1l6UUp3RnR6NjIzWGNrdFgxUTFWV0thVEYvelpoVmF6QlZZQTF0WDVNYXpzR3ZvYndlL2pRcjBOZTZCVGg1dWYveWdvWGxBZkc2MHZLRWhmZi9yU2UxaTREblRXRFVBQ1kxZ3VGVERxTFlkQ0J2ZjZESllTTVlBVEJmT3gxa0xmajF2MWF4SDEwblEzU2QwR1VrQm5UZnBlbXRCSmdzZUlLUUFITFFjVnhhMlRudU1XMEFxdWk1ZXM4eEJJZWdWZFZWRThWaHpIbkxoNjVXTUI5QW4rWDE4SzZhQW4ydE80RVRsNnZxYkt1VkZ5d3NEd2hldnFnOFllSDkzL1JrNzBKRTkwbm93eFpiSUpqdlMzV1lOU0dVd0dISlRwUHh3d2NiQnVCcmdSWUJlS0FDbjdWdHBkVXUvYzBOSnhPOUJJeGNLdTRUVE9EemJrb25QTG9hTDB2eVVRUmIyeThIc0wxY2tmV3pNZXVGaTQwUWV6cWkreWlQaHl0N0ZPanI2L2dDRndnUDdYYjV2c3NURnQ3L25RUmc2TUdSV21EUm9leVRscGd3NjhHUlR3Z1pnbzFnR21YQVg2LzhkdGF5bFNLWS9rb3lJRDlCaHpNTDNxMWdBb3MyQWNPclpZU29xL3BKcDFWdE9EUm05WjNMUy83V2pWa3ZYT3pFdE9wS3lHcmxBVCs0U29HK1ZZOHZCR0N2eS9kVm5yRHcvdmVlNjVOQkppQWpCSVZjQUpRak9tK0RrQ1pFZWlHQU13NnNBd0Rac0pyQWRoRk05clBHaGQ0OTA0Q281b1Z1Q1pQVjZrRDQwRWM2KzlXOGRCVEJzZmRjM25rcHZuQjgyZnAyUlBjczc5ZEhnYjUxTEE5b2ZzRFY2dnV0NS8zUG54Y0FtTFZCaURxZ2V2RGFKTGtZcnB1UXh6Y053TjhBV2dJZ1JiQjhsb0VCelhEd2w0Y0dpREdmdDU4U0NPV0dlZGdqdk9KK2JQdmdSa2l1QStaanpoblFRT2lGTlZibG9hN2wvZm9zMExkTzVRRU5nRVhsQ2ZzOFFiZjdIeU1BM1FWallpaFloTEVOZ2pYOXkvcXd4UW1SVS9hc2ZkMFpjTFUyQ0hWR3l1c0pRTEtmVmk5OENTMTJUNWY3aUVDa0hwc01rQWhDRjgrbnNoV0gySS9qWHNPWU8xNDRHVi85QXBBSXJTM3Z0NFlDZmV0UUh0QUEyRysvNFBXNC8yUFBiek1nbVVNaTJOb2VTQ1J4SXQyL0Z2dXhXVVJJV0NYZzM1N2dmVGpFRE5JSG5UUlhSQ3BINXVnS3dHbDNIcE1CWFFjMHY2V0xZVm0vNWxpbWowNHJHNzYySzJ1WVk5akJrcjkrckkwM05MNVpiY3pTL2RKK0xReW9nYTRvNzdmR0FuME5sd2RNQU95M3ZsL1Q5MzhLQWNqMTIxejhCbitZOWVXUUpSejhZNmtOYWdEaDJleTVFdnhqeFFEOFRXZEF1bmVDQ080QW4xdnc1dmR6UU1tZGt0d3E3cExaUVIrZE0zNCtadW1BeHZZMVkwNHVxT0FKNkZzRXh6ZXRvN3pmQUFYNkdpd1BhTFdSMWxyZnI4bjdmL1JsM1FHem1zaXMrL3VPNzFWOU9GZ1AyZ3BQaGdyN1RHUnFSVVQ2ZHl2cjRhSXMvcG0vMnpWVU5iQlN2Nkc4ZTVwRXYwQ3ZlYzdQbzcrYlR0amxCUmxrdkFNQmtEZVF5dnNOV0tDdm9mS0FDWUJycmUvWDFQMC9vV0VBbm5GRDFZZGpodFh4UjczbVgxMEZmQ0hIRTlwVldjR0FJL1MwZ0tzZkEyeSt0d3JGWnc2SHhmL0YwUGs4Umkva3BHU25NdUR4NVQwaUFDZ1FIaW9vME5kQWVjQlVIVzZRZHNWMi9jTDd2L0N5cXI1Z25jNDJDQ09jZlgxVklaL1Y4V2U5SURtVHpWWHdQREppWHVLWFB4dERCbWE4K2x6UDRXQWdLa1B4Q1VBUEU0djVHekV1TVgwUFlKUExoQjZGSnNjN01BTW1rVnhhWUMvSzlnRytGMSsrOEFRN0d3YmdrNzhJN0dGcFhnSXdGaVJYT3dhSlpQVWJpUjB5Q1VEUmsrY0hmK1lwd01qOUhnZkk4Q2xHUHl2c1NpSDBXU0tSdVlsaXRMYi96SE0vSk9TczVDL1lJQzljTVFEWnIvZHd4Z09XOWd0R1lVQmkwd0E4bDMwNHZEUXZBY2hpbEZicElCUWhaN0VqcTZaUTAvWWhpbDh5NGo4OUF4aWU5REFzRDZGWDlIT0szUXRST1RGa3ZpTjgza0c0ZmVsSVk4RENlTHJTZU1EU2ZzRW92QUVDVUZzVGpIRCt0Y0IrdGtGZ2NYS3ZCUmlyN3F0Rmw5b3dtTzRYeS8xRzNiQUZmUHJaSG9yRk5XQkZ3SGpRQUZjdElnaGoya0JhcncwNklmLytNTTlacVRONkRnc0RvakNlcmpRZXNMUmZNQXB2b0drQVdoOE9iL3RnQVBTS1dDcDhuZ05RdGFkam1UZGx0dk52bjNwZUZZaGdRUWdoK2lVbUVhVUFVb1hNMXlSTG1XdUZMYUU5WitYSUFXQmhQRjFwUEdCcHYyQVUza0RUQUx6d21xbzZxdFZoOWtKRXJBdWRBQmlhMzhUQzV3SmdTMnhJaEF3Qm4zeWhCeUw0RWh6WGZSWHhZc0RUSjRJdnJOTjJKRk14WmNCelZvNGNBQmJHMDVYR0E1YjJDMGJoRFRRTlFMWkJZSDFBVnNRU0FBVStpbUkxb2JIeWJsbmpHL2tKazNVOEJIejh4VlVRQWhuUUlsNUN5TmdLQUdwNUxLU1NDb0F5U2g1Smo3OXZUYWdjeFVhSUJlUk5lNzlnOWdxK0RYaWc0d0d6eStQT05mVDdSV0ZBNG5vQWtHWFpWQWhjQmNrSlFnTmdyTGlhTmIzcGFJRG8xdkhIWCtvQTlMUUJpNER4SmNPVVBKVW5UZ1UyTkpVeVJPczhpckdBUnhRQUMrUHBDdHNGZDQwSC9BRWYwZ01Ra0xnZUFDVDQxUGlHb0xPS3F5ckpxM0svWWE5bU55cjVGdXNOL3VQTFBJZURhOEJjK3czcnR5bDRWRkhhTVpjM2k5UldCTTlqanpnQUZzYlRGYllMUm1tL1lCVGVRTk1BdEQ0Y0JLRFhCVFFHZEFCMk1HQm84U0NMbUV1UzFBRlZBSjNBL05oUHQwUG9DY0E4YlNERzc2WEk3YXlTZzZKWXVHZkt3SkhGZ0gwRTVCM3VlTUNlL1k0TCt4VkhBT1orOUVIY0VnUWd3YmVpRVl4Nmp3VGR6NHFmdTdFaEVKcXhHcXJ1Zi9SbkhJQUVueGd3Qk0wYUM4YVVBWVdOQlJDbW9JbGw0SFRxTzEyMlFjWmJyZ01XeHRNVnRndnVPeDZ3YTcvandodG9Hb0RXaDRNQkoxNldONGxmcjhBcUkwVFZWMU8xZmE5QmJRem92a0F5NEVkK05nQ1FVU3haQ0ZXdkNPYU9GUkVYeVV3Wk9QSUEyR2RBM3VHT0I2d1BhT3orUVB2NVMrTUEzT1hpTjlhY2xnaFcrZDNJZ3VwQkYycFBxeGN4R2VuRFB4ZlNSaDJBU2lLS2lWUDJQYVpTY3ZBS29BMFZEYzZjT2xJQjJHZEEzdUdPQjF6Ujc3aXdYL0Y2QUZCOU9OU09RVzBmckE1MHNJTFZjY2tXSnlJRFNnd1BBVmNKZ0ZiWXVaM0ZKdkFsRUhiSjNJc2dKTEdlZGVCSUErQUFBWG1IT3g2d285OXhZYi9pOVFLZzJpQUlmREpFSkhxajRTRXhiRXR5MGdrZGhCLzZQOW9aYkJaSUdpS1lWYjlHS2FONTBsUkhCTE92aER4aC81RUt3RFVHNUIzdWVNQjJRR00vZ3JiNy82d0hBUE5HTUFZK0dTR1VqQzUyVlgyZjJDRDQrSE8wZ3FrWmZlZ1hLZ0JhSGtjV3RTMEFXaWk5eEcxSW1yTGxONVhSOEw4Zm1RRDA1QlZybUVFTm1wWVNQOVFYK0tIaXFqMi84MitIcXFEV3duYkJSZkdBVGR6QWVnR3dydTJEcFJxN016cTJmcEFmME5xMFJsMndCWHpnbFo0eVVBUEFtRFNWV0RCUEhRakxjZ1RxT1o2elV2ZEtIaDRydURDZXJveC9EbnU3WXF3WEFDMU5JL1FjRVF1SzZXSy9rZGdDVEdDMFBZQVAvS0lETUJnZ2xxK2hJa3JPZnNhQ3ZpTFNvZmNKZ0o1QWRNN2trU2FDai9IcVFLVklHdkQ0c3dGOGJjQmptempzYVEySDVELzZhY0JkOXdBTEI0REZXV0I1QVZoZXJNcDRHS0lZRU9wNysyNlVGMGFTZlQveFl1REc3d0RqcklwQUVSeXRYZjJ2YWpqN3VlcnlRWFNGbDEwSy9PTjNnSVdEd0NMdmpmR0I4WjU0TytFZTR2ZTY1MTN1QjJSMXl6c3FDK3R3YkM4SGNOVmhmQWVhQnVEUC9Udnd0UzNBL2VQQUlmWUZWbFBxMkhIVHV5dWxaQ1RsaGJqaEVURjV5eFRRR2dQR2hvSGhJV0M0VlNYR0QzbjB0TGtNSFhIeHUrWXlCK01sUHdEdVpzNUs2RmxzYkN6ZFZPOUR1S2ZrSE04QUVrUDdCOGZPa3dEY0QrQjducDQyK0prR092S2RBTDRFNEs4UDB6dlFkRVQwYjE0RDNEZ0IzRDBCN0I4SFprYTlXenJEODhONnNGbStZY1Vqcm43RTFaRHZNdEY5REJnZUFZYUhnU0dCMFBOSENENEJMd0xSc0J5QXlYL2lqMC9kRFV4dXFsSUc1aGl4N2VGaHZMY09WVUF0eVBTeWRBRm1PUU5lNkVZR1YvOVpFU2lLZ0lFZ3RiYUQvZ0hBTFFDNG92WTVyNUt3dGpPVS9YZlRBSHp6THVDbUllRHVNV0R2S0hCd3BNb04wV1F6TnRBYVlTczBLNFpsT1NBakdHOWtQakNCUndaMEFCS0VCSmV4WUFaRUFVM0E3T2kxQmVEeW00RURualExVHdDR1dNVzhNWGNLa3MwWU95Wk5sUU9RamNnWUlVSGxsRXpZUTBrdG0rcjZvejhHNEY0QVh3WHdSZDgva085QTB3Qjh5NjVLbVB4Z0dKZ2NxWUpUS1lwVHYyQ0N6eWRkUUpSRE9qS2l2bitEZWg4QkY4Qm53QnRhQ1VBK1lZRXlBVThoK2M2QXo5Z05ISFJtcmdPZ21EQTNqSFEraVd1cENlVUF2TlNyQTlITndxeCttdWs5bkpWTmcvQ1Rmcm1iQVB3YmdLOEQrUGNIa0lpYmpvYjVvMTNBM1h5cFdzQWtHMWNQQTlQREZRRFpNMWlkMGkxS3hzV2ZPcktuQUZYbGlmQ0ZGTU1SY0FTaWdPY3MyTUdBSWZFOWlXWHBsUzZPbjdVYm1QYVVVVFhRcmdzVk16Y1JqNUZvbGcyVjVheVVBNUJXWUt3T3hLVWFmbm9zV2pjSndrKzdXNUYyRUt2bEUzeGNYYU5ZZmlDWXNHa0Evc211cXVnNmhjbGVBbkFJbVBiTzZZd1JwTWdqQ0FWQW0veVFtS1R2NWhOc0FmL2k3U3lOQlNsMmE4UXYvNC9NMXlGK0JaU1lsTlFDbm5WcnBiQyttVG9BQUNBQVNVUkJWSmNhSTdzT1NFWTJOcGFEWExxcFIrdkUvT1Zrc0RnSW1nR2dnaEhvWUpiVFdjN29KdEZXYzY1L2NnMkFZdmgyQUxzQjNBemdWdjk1blMvZjRRZHNJa1Q5VDNjQnJHdElUV1pmQzVocXRRSEluc0VHUW4zVUREdkVERVkvSUNmN1N4TU9yQWc4VCtjMDBKR2t2SEdkMkRBQlVZWklBT056Q1VEcHBDRmhTdWtDQnNMUXJGdFplL0lpeFlRcFN5RW9Kb3FudVBXclZSQXViUWg4M0hObFpCMjN6N2oxeXdtajZDSUlxVVB4dzJYZXU5YngyangxMHd6NFo3c3FUWVphREQ4RUlEdW9FM2hNVkVwaFdnNjZKSXA5MGswc0J4QmN5K2lQSUlhVDFSdEVzSFMveUlBcXcrVlNOUFdRZmU1dGxWRWs4YXVYZ1ZhNUJVc0VKdVQ1dW9saUFiRTVBR290bUlBakNQblI5eERHM1RRZXJuWUFVdXBUZEJHRUZNZjgzT2tBcEhHK1hsdlRBUHdmdXlyZ1NaT2hhczN1NmN3VHNVQlZuMmdUd3lGTWk4d2pIWkFBMU05ZllHSERVTEpEMW04Q3BhOGZSeERhZCtsK1lrZi8zWE52ZDExVStxaUwzOVN4WGV2U3NzaGRERnZnYkkxTzJBd0F0UlpNWnpUQlJ1REZqeGUxWGc4UUVJQjh5eWo1eVlJVXhmUUlrZmtJUm5tSENNNzEySm9HNEZzZGdISHAzQUNvTUgyRzZqTTRsV3pvUWFyU3Z3UTZNU0IvdnBvclZhRmtoK21DTGxwVlI4WitkcURaTG9ET3BIU2lRZUFGRGtCalBybGdDSGdDVWFGaWZnNjdILzl1WWpuNEFpMXZwVEVSVEFBU0Jhb1FKQkFLZU5xSGxMNm13UERaWUFPUk9hZy9FWVJrUFgzNE13SEl2elc5clFjQStUTHBJMjJHN0VjUUtsSkdzWUlKaEM2Q2xVTWlYZkJUYkZVUUFlajZuUFMvT3VBbDlwT09xSWMyQkx6ZysrM1ZtV2dJRVV6ODJjUnVDQXRMSUhRUW0wZ081MnVPQWIyMnNDM0pFV2dSZlBwWmYyc1FCUUlnTHlkUEVJRkd3UEVqOE1sRjJiU2JzdWxnaExmdHFzQ1hxOUhHZ0h5c3puckdnaTVxelRVVEZIOEZMaEFVbjNoSUp3Q04wSExuY3czN3FhRjJ6b1l2dUtOaXZtUUl1VU5jN0d2V3Q2c0hOczI2dHdBNnZoeXE4TkVNQUhseW50RnJEQ2NRZWh5YVBUbCtGd0FiWERjbUFLTVJUaGFrRWs4UThrUGc4U1BMMHF6TEJsK0E5UUNnUjZ1WkdzM3ZmSHo4VHRCWnZrZ0dRckVQQlZBVWcyU2lqNTBRQU9qaVZLSTNzYUFESlJtN2RTTFlXZlNGRGtDZW0vZGhaZU15OXBQWTVRdlNEWVF5VUpvRElLOHFNZXpoM3dZNmZTTDQ5UGNHZ0NBQThwU2NKTElnQVVZUUVtejhSUEExN1N0dkdvQnYzOVcyNGVSRWlCb05RU2dXTkkxSEJrZGd4SlN3MUFJK2RGSWJnT1lta2ppbVExcjZYWEMzckFiQ0h5Y0FneXRvaGY4dnNCL3IyS1JhUnE3enBaK0QzN0hNWDBzM0REY0NVR0xZYXc1M01KNFlVT0R6dXNxbEdDUUFPUUNlanV4QThVVUxVa3hJd0FtTUFwOFdhM3FrTi9SOVcrc0J3T2hJRVBqazVTTHI4SGVLRmJUUWZiNzdjc1BJTUhHbC80TVBiUmVzbFBoTmU0K01pVHBpOUFGR1Y0bkk3TWZ2YWdOUUxoL3BmclluREFTOGFKUTQyQTJ3NGVtMmNBeVdRVXVKVlFUR1dMczF1TDdERzlKMVJqaEEranZZazR0M0tYZU1xaWpwenJ1ZDRBdDl6M1h0UDE2eUdmaktabUNHb29ZaDF0Wnp2djh4WFBGbDRQb0pZQzk3azlGbHdaV0QrQXppL2RlTVpXZVAxM2VRQ0dFeW9FUnVkQ2hJamJiM21KWXdIN1YwUUlLdUN3ai9nZk1qMGFzbjJJMEZYUlNIWGZML2lSa05nTHllVmo4Y2NNWS8vSjFmeXh6VEFYVDIreG9RVmlLWUQvMWhEcUx4UGlZeFRnU3ZRcnBocGhHOTd0ejRTbHFhZm5qN3VrMWtJUURacnZXVHc4QjNqd0VXK1JMeFBnU2lDRVJkUHdQUjcrd0NQZy9ndWxGZ2ZydURrT01Ra0ZjNXg4NGU3MDhKQU1tQ3VSTkJYaTRUSWc1Q0dSekdpQkdFL0Q0RS9DMnIydmNBWUpvaWZ5NjJpMGFKU01oQisySUhvTnd1MGZrY2pRODVwdTNhY2s1bklCUkVxbmVZRnlXTGtBWElKSEVTZTAwQ3l4NVF5ZUw2Ri90eUVjRGNyT1cybjdmWDhkZjBtTUUrL3ZRL1BRamhveTNnem8zQUlTWWY4ME1RYVF4MXBlSDl3Yjd2Mm1ydG1DQmtJTU1lanAzaklKRDFNc2F4YU1aOHY1Ti82N0lOQXNCM0JBWVU0Skw0RFNvMUoxNUFGUEFFd3VRSFpKemtLZlVBdE9ITEpTT1FSV25kQllRdkNRQTAxY2ZuTm9wZnNhQ0phRDJiYUJuNzlRalNUaU9FUDFFY2F3SXBrcTJrZWdCVE5nSFdFcE9LRjhVd3EyTlJGUE00QXFDZjQ2L3JBMlU5L3VWRHZ1ckIwMXp2QUpwaWl3T2wzZkVlY2lDR0YrSWoxMWYrUWtiU2ZNUGZJenF3NTdtRUZaOURsM1BzNUhYV0FZQnlISkFKS1Y3TitzMGNDUVFod1NsZm00bEdaMEtCOEMvckFCZ1pVUzZaSElUQlNFaENvd1VZQUFrc0Y3Y1N0V1JFeXhSd3R1UHBPbGd3KzVzOXNxNk9hSUpJSWxVZ0VoQTFlZG9UZ0h4YTlIVnc1amliWk5GK2ovOXlHUUEvN3BidWpaNGJ3djIrY1dCNnRGbzBOellua3hGQStjdkVBbzQzVkJvRW8yZSs0OEVNWEVPbUQ5RjZ4aENFOFJ3WkVKODBWYmxLdkRsbXp3aWNmcXk5My9vKzhLOFR3QjJqVlNnVzEzOEZySlFUWEJObG5KZ21yalp3YW5vdzlDQlAvckw5d0YwandBR1dEdEZ5b045UEh1dG5JSFQwNW1QWHo5M2RNR1FBUG5pSnNqaUJYaVRieERaRk1GOU5MVVBReEtSNXFlenoxWTYvWVpESDBENkdrZEFrWUpJdlJhbEFkSEFNbVBab1loYjZOaERXdkV5Zi9tYTczN0NYTjdSMVpDN2hVYlBnY0ZncXQvWlpqQURuTTF4cUVWaFlCcGI0Q1VrNVVzTDdqUXZqLy8vNWJ1RHJMZUNPRWVEK1lRY2hZd0c5VklmeWcxTmFac3pGaUNINkRrUkdMemU1L2RnazhJTVdjTUNqZENpQ3pSOG9kMUI4T1R3dkpNOEpFU2hGdXQxZnpNaGkrZVJKcjZMSTdoWVAyTS94Vkx3S05vWmpVVHdSTUFRUW1ZeWhXR1F4c1NBRE9mbFo0a3VrajdQaFo3NWJFVGpCcGtBR2FoTWtjckdnd2hzWGVDeUJIQmoxd21PQlF3dkF3cUt6b0ZlUlY4WmFlcmpLWUF1aXJtUFkvbzlYN3E1Q3lyN2ZBdllNQWZ0Q1BHQUVvWWxCaVZ0RndManRwMlU0aXJqN3lPQU5iaStjckh5cmZDYlRxdUpWNDRPMEYxRnJ3UUdJTVpGcWRRRHlQL2dHU1o4VEMwWlJSc09sVnp6Z2FzZC91K3pwTUJ5TGVoQWZDZ01RQ0R5R1pKSEZDQ2dMWjJmOG1nSTVxYXVFY1Z4OWU1dkFDVGdDVHdFTVdyNVRkSXBXS0piNU12cm5vb2NEc3d2QVBBRzRWTEdnNlVLZXFtaTRpdUR6NGVyMzBvWDBGUDd1NW1vTXZJZjdXOEIrandsVU5BekZubFpDSWh2R0ZSQ2VXenJnWFNTSUJyZVhURlpTZ1ZMSEFwNFVIT0Z1b2NpRUVzbjJQSndsL1hFazBkemZTb2plZXJGZzFJT281QktBdmVJQmV4MVA2N2xnVXpnV1FhSndMQUtSSDA0aTE0SXRnREtFdEdzUm5XeDQ5YjJWa2s5d1VlZlRHcktDRjdSMEp4Wk1xeE44Y21QQXhXY0FjeEdBQktFQUtQQTV1OWxFYUFiQ21LTUkrc0ROMVgzeitybzI0d0VaRmMwVkVFNjRBQmdUMTgwUEY5WmRCY0RiNkpwcWNQdFBrKzFBQ2JtS2pKbmxsd3l1SUx1bkVBV2paSGtCc3JzUlVuZkQwcUVpQzVJSmZ5aXNnTWh6V2hjUDJPMTRSbzRXYkFTZ0FNUUo0OFNKd2NobUJDREZhOHFweUJiU1A3T3ZVNFBRMHAyVzcrTFNuU0pVRk9ySTRWN3c1SW9CVFFRVGZKNm9UU1lrMm1RY3BHUnlIMnN5R2pJRjZFTTNWL2ZNKytDMUNmd1VFeGhDc216Q2FRVDQzbFpDM2UxaEJwRUhoMzZYRXFyQjdTY21xNWRWMFhaeG1WOFd1REZ6QUY5aXdob3c5c2VBR29CY0d0S2pxQWMrMWw5ckxiLzFpZ2VzTzU1eXNtQ3JDOGVpNkl4Uk1BS1RXTkJpNlh3OTh4TlRGVWkwakVjbXBZZ1JBUGhkZHBWaTlPSUVQUDVjWUQ0Q2NMa0Nvb0hQd2FXOWtWK2l3V3JRSFQ4dUExZmQzRjdERnZnVUhVUDJrOGpUaW9nQXFMb3hGcERnYk1qOWpYU3VON2k5ZExJZGF4ekJwNVhWQk1JTWdGRW5GQVBLVDlxUGQ2QTlCSUdJN01mUG1mNFUrNDBIekk4bldncTJQQnhMNEZFa2pLSml4R1JSRnlRUVB6emQxaUFVekNBUWFzMVlPbUFFb0Zqd2tlY0RDL1BBd2hLdzZDeElrQ1h3T2RWSkx4VG9iTWpCZHlJZ2Z2aW1Odk5KN0V2ZjRqV3RkblJZRDFZTkdWdUc5M1ZXdVdzNEpmK21sWkNDWnh3UC9jbko2bVhWS2syK3RLOGxRUVZIUlRHYzY0U0RBWkIzRXkzSmN4eUFDa1RvSng0d0hsK1l3cWxvR0RJQ21ZbVRGZ01RRkJFVDh5eVl6eUFHL0FmV1g4bUNHUWcwQlRSb0h3dDlLVmFQRS9IUTg5MEFJZmdXSytDUkFhTVJZblZkeEhiaGRZOFdzbHcxVjkzVURzbVBJajlHeGdpQWlvUlJNSUpOdm90aStTVy9Ja2QwZ3dBVTgrWHhKY2JHSVRKUER2STZYZENGUkVGU2tuVEI4M3hrYTQwSDFQR0Y5ZG55Y0N4Rnd5Z2tLMGJBU0pRU1ZBYkFZZUQ5OHhVQWU1VTNqS0l3Qm9zU2dOc3VBQllvZ2wzL0l3Z0ZQck9JZzFYYzRacnBBc1NydnJ1eWtsMnVjeWthcGtNTWg0Q0V4RDVEd0pmV0FZQXh3azRNS1BBSmdPSWpHU0VHd3VDYWtSaGVtdzZZdjBVVXdSZjdMMDBMOXBuc054NlF4NGZlWTRPOHBERWNpeE9qc29US0twTVlqU0ZZWWpPQzhFcTNXbm5yMFlZUyswVG1pMkh5c3JQR0xxd0FTTll6Qm5UMk16MlFEOTFsYXhMQjBnczEyR0FoODFjZi9vL09jSHlKK3FqMFMvenhuaFVaYlN5WVdhTDgrUnEyUzI5d293aVdrSlBhbjRNdmdyRERHQWxSZTdLSXl3RElnUjNtZUVEV2c5SGJKZ0FwTlRrWG84bzBpN29WZ3huRWdGcjhGN2pFZG5VNUd2cWZKUUtRS3lFT1Bsc05JUXZ5dnVwQUdIUy9Pa3Y0cXY5b2grUEh4TUxrOGdnQkNSeHZBbUVOK0FpRXp6MmlRZlFCZU5ta2g0SzUyaEpCS09hTmUvRlNMb2JMUlhDejQzclFudTJ5aTlvTVNNRHhzMmpvODMwM0VSejF3c0NHWkVDRjRrZDNEd0VZWXdKamhvTmxRcmdJamxZb2RiQlByd01BWmZFbXl6Y0l2MjdnczZYRHpDL0lSMURPZ0E5YTZEUno0d1pBc1orTFlYdlFZc0hvRDR6aU9Ga2xuYTZZRDMrbm5VNmRaN2JHREFjQlVJbUlBbUVVdy96YkoxaS9zY0dOREppTFhtbGUzUmhRK2wvYXE1N2dVUUNXend3QktQZUxzWi9MRnJHZy9TaFJYQWU2NEFqa3YzMGtBTEFqRjhSMTFEeTNLN0tSd0pjc1VUYXFXU2NBUm91M3cvSU5WbkNIK0EzNm44UnZNM25CNVhQNG9ENkRBVEJZd0diNWFqbE9MT2g2WDhKYUJLUkc3Nys3eWdHWXAxYm4rVjI1LzAxQXpCbndRMXlwYW5EN0tXZkExUURZQzN6SklqN0tnT1V6YzluRmJldFgvcitPNWJpd05oeVg1dVNFRHI1bzB4c0p3THA4L200QTdHYUpVdi9qMy81K0hRRllKM29GUFBraG8vaE5lcUJjTWtjQjJCQUE2WHJ4bU1Ca2ZGQWNpL20wSnB3elh3MFRYdlh0enJ6K1BLYy9NbC91Z3pNOU1EcUNBYnova2VWampHY1FBL1lMdmpvZ3VvMW1Sc2xSSTZSd2ZzaUE1bnFoTDVENm5zY0Y4Z2ZUZGZ4cFMrL2hMenZXZnpNUUNvQjFGcS84YjNWV2FQSURacXNSVjY0REFMc1pIVkhzMWdFdnNxRkFlQlNBcFFDOHBISzkwT3FsNFVFQXl2Q3dOZUdjQlhOTE9QTUxmdGdac0k3NW91VXI5b3VzcDJURXlJSi9zVTRBekMxZStXSUZzaHlBSFBaUkVWd0l0cnJEM3dHQWhpYlRZQmh4VnBlL3hlUHlyTkJ1V2FvTnAzRGdGd0M4MU8rUkFlcEsvYTVMZmU1MWp4cjdKd0E4M25QWFlncTFhc2wweVg1TjQ4K2Y0VkVHTEFUbEsxdkFvNVlCMWdCU1Jtc00rTkZFNTdsY2ZQRDVwUEZXQ0pJbXR5dkdnR2ZPQWFjQllPNTl6RmdsZ0hnUGVmWnNYVjYvZ1BYQlllQzBSVmd5Sk5PR1l1SmpQa2E5ZUhXZ2pMOWJXemhXazAvbi93UG4razhiZ0ZObWdZY3NWZmxabkJSbUlTaHRKTS9tN0pHaWJHQm9PSUllejl3S1BQNEFjTnB5bGZiTmxHZmRJKzlOakJqejhKVnpwcGNrWnVKK2RCdzRhUTQ0ZHJrNmoxTElZOUprUEQ3UDRzMmx3VkVHTEh3Sm5uY3NjTkloNE5oNVlNc1NzSG01bmRPdTFCR0ZUaEo4L0s2SnJadG9zbFNUMitYSEE2ZnRCMDVaQUU1Y3JnQXVwczVUZmFMNkVGK1V5SWlmM2dBY093dHNYZXA4MmVJWVk5SmtYcE1nTXAvQWVaUUJDMmI4T2R1Qll3OEMyK2FBTFF2QVJnSndHWmhZN3N3RXpiTmE4OElSdkFWTzFxa0Y5MUozNkROT0JFN2VEMnlmQjQ1ZnFwaExuZXZ6ZEdlQktCZkw4VVg1L0NaZ3l5eXdlUkhZc0Z3eFlIelJOSzZvZXRTQk1ETGpVUUFXVFBxUG5ncHNuUUsyemdLYkNNQWxZTU1TTUU0QUxyY25SNkpZUUl3c29VbmpwRFJzdE9MeTdjQkpCNENIVUd3dUF0dVcyblVEVkgxRUZVaHljU3dXakdENjRtWmcweHl3Y2FFQ29JMHo1UDNYNVA2bldsSGRnSGdVZ0FVQWZPWU9ZTXRCWU5Nc3NIRWUyTGdJVEJDQURrSXpTSlpYcENPbklnMjV1UHJoZ251cE8vVHlod0xISHdTT213VzJMVlNpazJwQ3JEc1Fza3pOSUJHSXBCZEdJK1ZmTmdNYjVvRU5DeFg0eVBSalBqNHhhSjArV0dlRUhSWEJEVXoyTXg0RmJEb0liSnlwQURpeFVBRnd6QUZJOEtVSkNoTVYyU1VhQUdjMWNFL3hGSmVmM0ZZUnRpNjRua3FXRHJxcUVoYnJzbTV6dlpDZFBDZDhuSHpKT0xadUFCUno5aFRIWndQTDdMbkxub05NSVkyVnlhS2NqdFpMSE9BYk5nTlBuZ0tlNEJhY2ZHRjFwbnlkRCtocGhRLzhYVjVVaUV1ZUxHbkROMXRXWGovMy80Y1R3QVV6d0dQY1JjRkppRHBQdDNGTG1mNXZqd0UySEFRMnpQckV6RHY3T1FnNU9TTStTY1lReTVYYm84NDY1dS9aZkxUSjdmS0hBZHVtS3hWaDh3S3dlYWxTRTZpbkVvU3kyTVdDZGJVSElnaHYzQXFNendIamk5VkxadUR6RDhjWHh4V1pzNWM3YXBtVzBmTUJuSUhLbjVYN2Q2STVucHZSejk0TzdMZ1h1R0lSZUpTYitYbDF0enFmbHlid1J3cWY5aTk3QlFSV29tV0pRN29aVkZ0Sm9xRFgvYi9vR09Ec3ZjQlRBVEI5Z3NmR3FtemRqdFZ6K0crUEF5YW1nWW1aQ29EakZFMmFuQ1ZnMUNlSndPTW5UUkIvRG1VSU5Wa2tnaWEzeTA4QnRrd0RXK1lxQUZKRk1EMVZBQXc2WEc2MVIzMU85L2ZkcmNEWVBERG1ZMHpqYzFVaml2QnVBTXgxUWRNQitXQVlYVThkaEVVMTZkT1NrcHBiY0hGU3JuZzhNSHduc0dNUGNONXlwVVJIcDJ4TUlhN3pEejJ6OEduL2tWZTBZb21PMHdFd0JZS3VqTDd2L3pIQTZDM0F4Zk9WaDU4ZzVBc1p4eDRmWk03c2YzaDZCY0R4V1dlR0JaK2NNRUZpd0dFSEhSbkR6dW43T05Icy9kamtSZ0J1bnFsMFZET1NISURVM2N4U0Q0YUVhamhGWFM0SDRTMWJnVkdOMFY4d2U3RTBGaDlqVkRHNk9icjFMSk1Sd24ra09DYVRFWVQwZHNmcVpIWGwvcDdQckxpOXdJWTdnTzBIMnlBZ0NBV0NXQ293S3JZRThuTUxuL2E3UFFuOVg3eklKUFBrQ2NLKzc1OHk3eDdndU5zQjZsOThnWmpMTFlldDNBeTVuMHN2NFIrZkNZeFBBMk1Pd0xFQVFMSURQeVA4dUJnMmNSWW16RndlQVlpbEtrbitPQzgvRmRoMENOaEVBNG5HQTQwa2Q2RkVTMTNXTE84djFxSEtBZmg5QitEb1lqVTJBay9qcy84TkFJd2c3T1ViN0xDQytXQWZCNENwQkpvSWlUUk5SbVMxbDEza3FXaDNBZHYyQThjZHFxcDFNQithSU9TeFd2NnBxNUQya2tJQXZ0OHJGN0JMSmtzTi9qTXFmYTd2KzcvQWs0QjNBNmNlcXBhc0tNcTVha0FtbExXWTM3dDhaVzk3UERCMnFBTGcyQnhnQUZ3QU5FR2NuSTVKY3JEWlJQbGthWEw0dTFLSlVBZkFqYlRRNTl4NmRTdmRMUFhBZ0dZc2haV1I2SklSYVhCL053Rkk4QzFXd0xNWHpNZVN3TGZjWHVLckEyRyt3ckxDRGNOL0lJZzRFUlJuMHF2eXlTQVFYNm1HMVh1QTRmdUFiVE9Wd2t0UlJyMk1MQ29ReXZFWi9VWS9Xd2pBajNqdEZKWmtVNzlnMWdoa2dFQmY5OCswVW1iLzNBMk0zbGtCbC9mT2NkTW9rMkVqa1p5djg3NzNMQWZnSERES2p3Tnd4RVV3OXlhaWxwd2R4QkFFWWhCYkF1R3pHM2FLa1FFSndBa0NrT0NqbGI3WTZTWXlmMlV3bEFTK3ZLWW5BWGpmTm1ERVg3REVmQTVDalVjc256dmJ1MW5EdFVNbUNEa1JaRUV5R2RsQWs2RzZsUVRTYTZtME1QNkh1WTczQXhOVGxjSkxaNldPSllDNS9DTnhMcEhNZ2RLSUtObDY5UXZ1Ni83NUFqSE9pVFU4N2dLT09WaUpiNzQ4QktDV3JuSy9tYVRBKzU4QWpNMEFvN1BBNkx4L3hCQXVwb1lEQzlva0JSQW1QZEJaNDdsTkEvRGh3TVJzeFg3bVBnbCtTcm1LNUVhUk5Sc2xYRlE5Q0tCOURrQURuNzljWnRrSEZreXNKMTAzZUJicWxoOTdEcG1UUVRZZ2s5Vk54dSt4WWJYS1UzbGhGb0pQT2dkRkdZK2xQa2dReG9ra2dGOVhnajRBdmZvRnM4NGVYNEtlOXg5ZklDK3RSZkR4dnZuaWlmMzU4c1NpcjJMQ2o1d05qQktBYzhDSWkyQXh4TEN6SUFHWTlMN0FoR0lLZ3BBVHc0bDh3VG9CMEpqUHJmVGtwK1NMUWJIck9xbTVqTnlhalM2VkNNSXBBcERBV3dRNExyR2dYcXpJZm5xNWN2MHZOMFpYSFRJbk1FNUdCTkxiMURHZE9ZUXNJN0FmR0tGamxncXZlOHdKd0c0VCtmdUZBRnl0WHpDTGIrVmdXbkgvZklHWWZjNDZIczdpSEM4WmtQY2RYeDRWZlZYSnc4K2NBNHdJZ002QUhTTEtXWkNURVNmTGZnN1dzSXlSRjNja2lSUStIQUNYa3dIcHR5UDRLSHJwSnZLVkduT2hSRjllQkY5d0UwbVVFb2d6MndDK1dHSS92VnhpUVFJeEFzOStybUhBNkUxWUZZQjhESndRTVpsME9yTForK2k3c2ZUOHpyb1lITFM5ZGY0UkFDV0t4U1p2TFh6Ry9mUUxacWsyZ3FuMi92VUNVUTlVWmFNOXdEYVBlU1ByQzRBNUMxS1YrTklUS3dDUy9TaUNSL2pSQkRsTG1QN25IeW5zeG5vMUlQd0pTeVJwYmlNQURYenVQRFlmWmZCVEVvQW1jdVZRZGlhVzB6d1h3UXNDWURZbU1hREExd0c4VEJTdmFvUjBHNzdFY0dTRVQ2aGpPdlZBcGZSUEFVTjB6anI0NUp6VmNTcWlUeEQrVmVHelhrdS80TnI3SndESk9reEZJd3Q2ajYrUnFVcmxrTzRiWHpwMWdDQUF2MDRBemdMRERzQmhLdWdMRlV2UVVoVHdDRUtibktDdzE0SHdKOWNEZ0dROVdlZ1JnREk4WEVjVkVEdkFsN2xWbGdsQWdpK0k0Q1IrWmYxbUxHZ01tREZoQkdGZkRDaWNSSkZFUnZpU0FCakxTN0ZDME1GS01VKzA3d09QRTBrR3Zhb1FnR3Z0Rjl6MS9pT0Rrd24zVldvRVh4cmVzNWliOXh4MXdadWZCQXdMZ0FRZXhiQUQwSmlRd0pPdUpCQTY4L0gzWmhrNiszQ2lmcXF3V05NS044d2pLZ2JrNmdXSmdDK0ZNYUJiNXZKVm1zVWJWMnZDcW8zY1JXWmNDSUFDb2F4NTMrdWxrcU5kN2lxT2NVMVdjQzljeEVtNWtRQlVkWitzVG5TTC9qRXRUV25naTIxamhKTkpCaXZaQnVrWHZPTCt5WUJrY09xeEtqSjRBR2d4ek1yQlZ3ZEFNbUhyWk9BWUYybDZ5L213VjZ4RDE3em1XbzZNYlJ5ZVd0T0h3eEo5MUlJaHI2cnFaUzcwRFBQTFhEVlVyZkJ3ekhLcjFFVXA2L2gwVC82TC9HY0Nxc2x0NElob1Rjd2RBcURTczdJNjBXUUg2UjMyOXBIdUZ5dVhESm1FanVPU2JkQit3U3Z1UDViR1VqbXNBNVhvVXZjdkJYS0tBUW5BcFVkWHdhaDBiOGpYUjJZekpUc0MwWkhCMzNGTCsyeWlYM2gvMVllRDFmRlpHVDgxZy9INnlxa1ZhOVlFcHFNaFRBRGxlOGVySEE2dDdNaDZqNFpCWGRCR2pGeU80Q1NJbTl3R0JpQnZncXh3SUFKUWxYSXlFSkx5SS9pMFNrQUcvRmJoYUVyNkJYZmN2KzVkTEtoQ2c0ejFDMUhFQko4K0JPRFFHWlhmay9xdUFaQzZrZXRBWkVRQ1RXQVU4UElKdDBmZ3dIelp2VldOYUtxaTdKTE9tdERXRnk0MmcxRnhIL1hmcUdrSUkwQythMHRuRGtmc0d4UWpuM1ZQc2s3dFhtdXkrWHAwSmh0b0pvc0FhRmNVQUpVWUtpWUp4Y3FIcUtBSDlyUGxHMmNNcm1DVWJNWDlndU1McEdUY0NNS0RsWkdoTUs4SVBuUEluMVg1UEEyQXdlZ3dFRVltREdCTWpPSTV3aEdRUDNOUEJUN1ZKbFJOYUt2RjR0MklXSGJERXJ0RGxTazFwNGxKNy96ZDI0NnRnbEdacnlJZnJGaFE3cFU4V0NBWDBaRU5HKzU3VTE0WjRZckNlTHJTeFhkZXY2VGZMd3JieFQ3em5NcmZLUVhmSExRQ255dm1SSXYwUTM0MzBlek1tTDk4UDM5M0czd3F6NmFtMU5ZenpvR24rc3ZxUm1UQVUyY2l0Y3RxQVgvMkVJOEY5QUNFbUxIWExaR29GeHRTbDJ4eUsyYkFZd3JqNlhyMTIrMW5vTC9qVVRDRDl2dkZybjZ1MHYxL252R2thb1ZCQVFpMGV1bW1NQXVYUUhNV0pBQTdnQ2l4RzhVMGdGZmNYZGxCS2s0WjZ6RUxnQUpmWkVLcnhwQzF4T0lsLytTazdqa2NkWWxTY285MHk5K2dLNnZKclJpQUREMHBpYWQ3UnVGbzN1ZE5DZ2Z0OTR2Q2RyR1huK3R1amdWM1FBY0hMY0Zucm9lbGl2SGtjaEVMOHVlMHVRNzRTM2V1YkFJVFMzSVFoS2tNUmpCTW9rZ1dHM0wvLzJ6M1ZTblA0VkRnUVd4VUVFVXhBWkZITDBlUjNIRGZtM0lSYkRIa0JmRjB6eTRFSUtOaFN2cjlnb0dFQmR2VHovTUlZUUxRZFZzVHdSVEZEajVqUW1kQXJSRFlKUU5EU3M5NjFSM3RQaHg1TlhvVmdveGxlSG5hcmpvaGdMZWMzRDJISTQ5MnlRTnZJd3ZxTzlmSm05ektHYkF3bnU2RmhhUDVwRnVNZy9iN3RUYnBCZHZUejY4Y3ovekk4YXpWajhpQUhUcWdtRkhYRFVCODlSMmR0YUM3dFVHdzRrRE9nRmIwUjJ3WVJER1o4ZzlPOGFVNFh3UE9jemhpd0dsTWpxcUxXaUZZR3U1NzB3QURGc2JUdmF4Zzhua293N0U4bk0vYXRmS3psbjYvMW1TNFlIdjZCUTQrWjBCYnFIY2QwTnd3WWJWRDMrMXlXaFhKeFBCcmJxOEFxRS9YQXBTcUF4aUJWMk1aLzU0RE1PWndLRTAwcm5EVVdjUjVLaVYvYnJqdFNBTUFMSXluKy9tQ3llZWhqSVlwNmZkcnZWRUx0aDhSQUNseUhYeG1oUGk2cjFtOEZNMHVjZ2s4K3k0UkhDMWtBSy81WGdXKzJoWllvZmFmV2NQcTFCNUFxRHFFWXNRM25lcFIyZ3FoVjJ5aW9sMUNPa0QwQythT2FvR3g0YUw3RFFDd01KN3VWd29tbjRmbTdWclgydS9YQWxFTHRoKzVzSFB0TitsL0FwNnNYMmRDc1ovcGhaa0lKZ3Y5bCsrMXdiY3ErMldGdjJOWElqTktBUHp1dzdNVUFWOERUdXluRklFc1F5ODNSZ1RBaGl2K05nQkFCYVFPR0UvM213V1RMd0FxSG5hUWZyOUdud1ViQVJnRE5CVWxrcHpRYm95WUN5WURZZElMZGYwbDROZHVXOWtHb2E0Z2VOZGF6TEVsS29BM1ByeDdEb2ZpRVR0QzZYdkU3aEdFekpscGNpczNRZ3JqNmQ1VU9Kb1lEY01nbHJYMit5ME5QdGw1VVpVamtmeC9IcWJlY29lME9aemRGMWdIUXJsbjlCaGVlNHMzZjNaeG00TXZBazlWU0ZkVUl3MGkrUTJQYUJ0SVNpQlNTRmdDWU1qTVcwME1QN3B3dnZMRG13RmdRVHpkSHhjT1NHdkJnL2I3WlJaQnlXWUFsT0VSbHVLTTNSYTlDS1djMHE3M2RUQmhNRlQ0WndJdzlsNUxycGVzK0hqZUJpR0NVT0tYZXVCdlBjS1RpRUlPUjBmK1JoREJNWWkwTGhlYTRHVGFhNU5iT1FBVkR6aGdQQjFMYTVSc3NWM3JJUDErN3l5NU9BQURvQWNoRUhCa0ZiS2ZHUnBpd2VBUHRNczVJRk5va3lPR2svN3JBWUM5T2hCRndOWFZZMWF0NXRmdENCSGFXVlMyQUpkRWNFaW5yRE5DK0x1bWl5YzFCOEFCNCttdUxBUkFYVERDV3ZyOTNsUjQvWjBYdDZPREZRa2o4V3R1bUV3SFRLRExRZWpBZk4zdWRzL2Rmam9RZGF0R0x4YjhqUUJBWXo2L2JveGlGZ0FWdWR6TkljMi9zM3hMazFzekFPUm9CNHluKzJEaGFBVEFHSkN0YnBrQ1lxOSt2NFYrYUJnQVE0aTY2WHRhQzg1WWtEb2cvemRadnpVZ2ZOMU43YTYzM1hxdjZmZTltc0RJSGZOYUI2QXkySlJFMUFIQUVESWZJNW56WkNMZU40TmJtOXlhQStDQThYU3N1bDZ5cVYwckoyV1FmcitzcGxDeUNZQlIvSEp5S1g0cGhzMFBLQlowbHFPWVRwdm5pQWlVQW1BZCtIS2pvMWN2RGpIZ3IrM3dQSlFzVkN5bVVaclBNdVJzUkJERzRBUUNzdW55SnRGR0h3QUFJQUJKUkVGVWNjMEJVSmx4UW9INjJxOFNUOGNnZ3BLTkFGUkd3Q0Q5Zmt1dmJ3QWt5R2dKRTNDK056MVAxcTkvVDNGMUVaQnh2Wmg1MHM2QUVZQzV5eVVIWHQ1L1E4ekk1L0tyQW1BSWtraXBreUdQWXdYejFhUlQ4djVaTzZqSnJSeUF2S092TlhsTGF6c1hzOWJvL3p0YzI5UG9oZ290cDVKNDlSY2ovcHpmSXdHUy8vM09NNENOZDFkcG50UXBGVW1qRUg0TFlJZ255bi9PTGpMOEZlREdod0piTmdGakk4RElFREE4QkF5MVBGSzdGU0tmNDNjTktydkh4KzhDL3ZteHdNZ21ZSGdFYUEzNUowU3RwdnZ6TC9uUDhSYkxBZmh5VDIwN1RDaGdEUml1L1pMOURzZldOQUJ2WXpiaENEQktvQkFrL3BFb2JHV1RxcDgxOWh6UTEvMGswUG9hTURFSmJKanhWWkZnRGFkMFNhVU81TGtzV1ZqK1hTY0RtdzVVRVVESjZVNGQwblZiQzkxUzNvdmZWSHA1YWw2NGNnQytrN21aQVA3NjhLQ0EwV0QzQS9pZUx6MDkwQ0RjZVZtbEF1aEJsakxncmZjQXc2UEF5REF3UEZ3QmtDQWJJdE00YS9GaU50RVJqQmw3Nlc5ZmZEMkFid0pEZHdGais2c3lJbVJYcmQ1WTJGaklZY256V1BMRXFuc2ZDMHpzcjZxQk1RbWZJRFIvcHlKNnhNaEt5TXJTRGlLRDJ4amE2VEFEVHQwL0FHQXMxS2NBVUNGck9MRjZ0YnRpUlZGYXZUL3d1TUNhN01mVlRsSDA5OFlCZUJjd05BSU1FWUFVbFM0dUJVTE9tSzNMQ253T1BBTmxFSU9Tb0Y5K0M0RHZWb1dYaHZkV1pWT1lxV2dpM3ZPWERVUWhnaWVCMEVFbFZpTVlKMDhIeHFlcW5HOEQ0SUlEa0F6bzUxREtRUUp2QktVbUtBQ3piTTQrNWhVaXZ3cmdpd0M0THp2am1nQ2g2bkJjZ2lNVGN2OUFibzBEOEU2ZzVlQ2pmcFVBNkF4b1FJemdpOEFMbVd3QzR6Ly9EeGNQUHdCYWs4RFFGREI4eUpQcFBaSGVHQ3lDMEtONURGQ0J5Zmg5LytPQXNla0tnRXpDVHdEMDQ3WDBTQ1BNMUlZUWpDdjJFL01Kb0dWd1VVUW9QYm9xME1kcWtXVm43UnRERE1haEI0ZytQNnFoWEZwalZ0a0R0UkdBMm5Lam9zN0l5T3lIRlViSXJYZTBGWHNUdXpJWWZOYjRPMk0zQVRHSVlRT21QbjZoRzZnaTNlVWtRUUFlQUlZT0FVT3pBTE1WaDJwQWxFU3FHRkJBWEFZT01RVmp4bGwwM2lPL3lZS1JBVDBGUVhrd1pranAxcHo1MUxPMlhBVDNLdEQzQUlBd2o0V2cwNWtmaXVVSFlsc1hBSkxWblAwSU5MTTBPWUZ4NzhBemNSeVNlVHN3MkFKdWVJK0RqMkZuZTRFV0t6NU1BME16RGtDQ2tBQnlVV3FzSnphckVhbnpqMnpYd2pFR0ZIdUdZK3BZc01vanpaTDFHOUVCZXhYb3UzMzlJUkJyQzNsSkdtTkR1U0hYK3c3V0M0Q202d1d4bThEbmdMVEltZ0M4cEJjR0J1VFhmLzFmWG55VHVnbkZ3eFRRT2dpMENFQ3lJRmxzdnZKZkVuaDBtaHNZSS9zNXV4RllpMXhab2Y3b09xU0Fhd3dZalJHQnpZR1hidFdYYUNJcmx2SFVhZ1g2U1AvcnVNVllDRWJFcUVDWEFNamZyZWUySGdBMEVTdXIxLzB2dG5Od0dTc0cwUnNaTUUyMC8rL1hXSDZNdWdrL3luZ1BBR3k1R0RZQUxqaUlISWdSVUlyc1pqTTdBeCtCU3gxUzRwZmZmUVZJZXA4ZEw3ZE1Ec1RHakpCK0N2UXhUSG1kdHJ3NGwwQ292RnJ1QzJOT2U5NzVlZ0RRc0NYUksvZUs2MzRKaEJLOTBxMkM3STFpK0d0MGp4RjQwazFjUEpBQjdVUDJtM01HSkFBRlFyR2VpOWlVVEg5eUJVRFRIZlUzQjUrQk9JS1E0M0JXdE50UGNXSU96RVpFOEZvSzlLMERDR054TGkzRnFhS0E5Z1RnZW9Gd1BRQW9JME91bFdUMTFvRXdpRno3Y3diRXJ6TnhXdEVZQkIrVlk3NlZoNERXckg4SU9vR1E3T2NnMUNxTVJMUGx0bXh2czEvU0hhUDRkY0FKZVBZeXlVQ1JJenJUQjh0RThGb0w5RFVNd2w2MWtRUTg3Um15MlBTMnJnQjBhMWNpMThSdWRFSkg1N09zWTAyeS8rODMvc1pkQktyNEZYUVRBcEJ2cHJHZ1FDZzlVRUFNK2g5RjZ1Z0pEa0MzZ0pQQkV2UkdyWW9ZQ0JYOUl4RWNTNUs0aTZjWkFISXc4b1hRNG1MQmIzNVlINWQ3T2VrYWR0VFYxVVpTamFFSVBING5RellOd2dqQUhOd0R1V0dZcFpjN2x6UGZYMWNRdXI1b0JvcmZ6RGYremkweVZUdVNrdXhCSTJRK1BoUURJVUVuTUxvMVRCQ1pMdWZHdy9peGJRYTBLQjhDVE9EalBvaGRZNzhJUW1mRGptVzdZby9kb0FYNkdxSWlBdERIYVlzd1NtZU11YlY4MWtwMTFMNmh5MlBkQWNnYmxmc2xPS0MxSWlLUm15UnhaZ1YvOCsrRFM4QkZyeFhpNUhkL1U2TWVTS2RxRXNFS2hwQlJzZ1JNYkF0dUc0S1UvKzlyeTVicnpQL2xQVk12MUVQT1FlZ2hhcnJWY2daVWhWSEZ4TlBjcDlWRnRsT1drTDQzN0MwV0FCV3lwRlJHc1Ywc2I1SG4yellCd3ZVR29LbDEwdjFrbkRnbzB5N1hBOFBmdjBVQUNuamFLMzNDbzlnSlFBT2U2NEZrTnZ0WkFIUWRqejl2Mk56MkdTYTNqWWVqMlczS0d1WjlpeEdkSVZTb0tUMTNCMnM1QUhrR2hlU1Q2cW4wZXJIdjVBSWdBQVUrTFZmdy93cTNDRUFWN2NsQktEREdaRzkvNW9WWHgvb3lZQVJjemNxSDVHeUg4ZUZwbFRhd0Z2QXRydFhMR3BOclFER2JlanVwQjNvbWxJSFFHYy9FcnpPY0dTUnM4enJoQWJidUwxVGNvL0pmYkxsTndIT21pMmtJY3Mzb3diZHdOcFl0eW5EUWhzRmNndnVHOS9ZYXBHRnZZWDIyelpjQVUwL0d3QTJMSi80QW1HRjltd0ViQnU5OFkzY01GK3VBR1FDajJIVnAzQmJQdW8zSWxxeEF5NXdIQXE0T2ZBUm1FQlhHZk5JQmEwQklzRzBlY3dDNjdtZXJIZ1JwWkx3b2NyV2FvdnVUeGV3L1YwdHhKUTJEV2VhZTNXQUdiZGhiMkRCNCt3Unc3dzVnOFFwdjg4bGl5R3RvV0h6TWk0QzlmQUVIYkJpOGt3VUt1MnhOQWRCeGFHQkxiSmRadXgxTHdBR0VDWUFFbTZ3eWZwZWxKckVnRm5SRHhFU3dneVV4SVVzVk13alZ5NUFZTzBiRzg5QXV1MS81QkYzOEtxakJIbFVBWVhzdGVOQ0d3VGVXTnV3dGs0Sk1rcmx6R05pekExaG02OWcxTml4K3pET0JXMGFCZVJaWkdxQmg4TTRlbWZXTkFERFQrenFNalF5RVNkUUZIZkRiWkVDQ0xSZ2RIZUNUZThDQmFLSlkxckRuQlJDSUF1R1c0VFlBWmVGRzhadU1rR2lRMUlFd0dDSnRIWkJteTFvYkJzdlZNbkREM2pJQWVydGkzTEVCT01qR2NPcGEzV2ZENGljOXQ2b3ZlRHRMZnc3UU1Iam5INndQQXliVzZ5YUc0KzhENEhJUWZ2dERJVnRMZWpwQkZzVnZVSTdOSUJIdzNEVWpSekwzckRWdHNZUE9rQVNjdVgzY29ORHluVDJWWUpDa24rUGpxdlVEOGhWYlM4TmdqcGhHeGNBTmU4c0FHTm9WWS84MjRCQ0J0SWFHeFJlOHBMS1pkcE1rVHZYaUoydG9HSHpTTkhEUFNjQXlxM2VyNHFQeUdhTmM3SkNSWFdMVDJUandHbUNPZVFhc2hxNitxU3BabXA4dm9qUXBoZUY1OG5jZFpWakxualdQSHI0VldLVEt4ckhHVXFxOTdxWHUzanAwd1B5K2VFQy9EWU5ac1pBTzZJRWI5cFk5bE5DdUdQY05WODMwWm1rTTlkbXcrT0tmYmRjWHZKTVBkWTBOZzAvN0duRFhLY0RNY2NCUzdNd2RLejhLQ0FLUUlnWTBNV0dDdHI0VE9IQWFzTXdPa1RxZjZ1bnl1THlrZmQyNTRua2I3cXN3L2lWZzdqaGdtU1gzMVZwZDl5UkhlTHgrelJoakVHUmJCNndEWVQ4TmR5bXl1YnpEekNDR2ZwTUpXZlNSWWZyOUhQL2FNZ0JtN1lveE5RSE1iUUhtK0lENmFGaDh5UzkzdEF2R1FiN2RhMmdZZlBvWGdidFBBcWFQQSthM0FFdWJnR1UxUk02QjA2MGZna1JvQ3pqK1RjRCswNENGRTRCbGRaZFJjNC9ZeGx4Z2pKTWV3U2l3TjF6V2ZzT25nZGxqcTNFbVkwOHZtNWkvN2o1eUlNcXB2dXBLeUdvTmc5bG5nWW9zbDl3WS8wZFpkck16WWw4TmU4c0FXTk91Mk1BM3p3L0YyQ29OaXk5OVhidmZ0cmNMcml6NlBoc0duM1U5Y005eE1PRE9iUVlXQ01BTndQSjQ5VWxpdVc2U2FxcUJuL2dHWVA4cHdQeUp3Tkl4d0RLNzZhaERlTjZ1WFlDdVl5QUJrRXphNExicFk1V0VXZFNMeGpGMjYvZFFCMFNKNnI0QnlBTjZOUXhta1djcXJuUTAweDFERURKRmpSOENjTldHdldWUHA2WmRNUTZPVk9DYjN3QXNjUEo2TkN5KzdQZXJrUDVRM3RCWTFQclQ5dEV3K0p3YmdQdTJBbE5iZ1ZrQ2NDT3d0QUZZY2dBdWl3V2xNL1hxRGpNRWJQOXQ0TUIyWU81NFlKRk1vLzVnSEljQUxWMVRSWjE3RlhPaFB0dmd0dmtxZjlINGt2SERseUtLNGw2Vnp2VlNCRjIydXdqT2I3cGJ3K0NmY3dCU2t5ZUZFSEFVeC95dzlKVHlFYm8yN0MxN09sM2FGV051QWxnSW45UXhPMnRZZk5sYks2TXZheGVNUllxdXZMOXJUY1BnSjMwVHVIOExjSEF6TU91Z1gzUUFMbzIxV1hCWkxFSHdSRjFPZ0hTMmVPZ2JnSVBIQTdQSEFlek51N1FGV0ZaN0puWEo1cm5xeEhFdWx2bHp3eVZOTjMrd2VybjVZb3ZsN1NYTEd3dm40cmlMV080ZmdNUkpYY1BkLytwbU95bUVMRWhSekJ4SkFvOWdWTDRrd1ZuYnNMY2NnSEVwV2kzZXBvY0NBTWVCUlU1ZVRjUGl5LzZxdGwwd3B2aEErMmdZZk83TndPUW00T0JHWUdhRHMrNUV4WURHZ3FQK2NjQWtJTmFWcEI4R1R2NGQ0T0J4d053MllHRnJ4WUNtVjBZeExOWWhlQ1hhdTdFaFYzZ2EzTGI4ZzQrUjQ1dW9HTEFEZ0hXcWhzQlhBOEsxQVpBRHlSdnV2dGtCU0FyaCtpOURzUWhDT3RmMFVVZ1cvN2FpWVcvWjArblJyaGl6b3hYd0ZoeUFpNXk0ckdIeFU2NnFBRmhUM3JEU0lWZHBHSHplbmNEZWpjREJEY0RzQkRCUDF1WDFDTUpSd0ZpUUlCenhpZUwzS0lZMVlXNU1QT3hOd0xSYjhnczBhZ2hBc3MxR1oxTytTRkhzZFJQdDBpL1BMSHUrK2RGYi94NG1YZmhjYld4aGZDdFlNRnIvdVd2S3hmRGFBY2c3aXBQQ3ZGT1ZwdW8zSHJDallXL1pBK3JScnRpNlRTNk1WUStMNE5QSDJueDY5OEduWEYwQnNLYThJYWI0ZEZacEdIeitKTEJ2QXBpZXFBQTRKOENQT1F1T0JCQU9WMENVWWJJc2tSa0FlY3J2QWROYlhjL2FEQ3hTcHlUNENFSXlUZ1JnbmVpTElwM25QNmZzK2E0QTROOEI4LzQ4Q1VDK1pHSkEyOWZwdUxteEpXKzVoNWtORmcyamlXSFNpMHIwVXY0cENvWnN4dzhEVWZuaGQ0VmswWEdkR3ZhV1BhQlYyaFZqZGpnQTBCbHBrUS9LOWJtbi9IT1ZxdENsdktFQnFsZkQ0QXRtZ1AzakRzQnhCNkRBN3RkYmN2WXpKdlFKa2lpMm40Tk9lTXBiZ0prdGJZUEdBQ2lGM3dGb0V4MVpNTmUvNGpuUExYdStLd0Q0dC81U08vaU1CY1h1ZXNIeWx5QUNNQlBEZ3pHZzdvcE04bUVISUdkd3JmR0ExckMzN0FIMTBhNjRZcjRBUHZ2T1Nkd0VQT1ZiS3h1K0sycGRLUlRtZEkzZHFrUFBWZ2JTVEJHQVk4QXNBVGpXbmlCZHgwUXhKeWxPRkNjcjZIQml3MVAvQ0RnVTNFZ0VJTVc1Mk04WWtMb2xRUmRkSU4xQXlLV2lCcmV0ZjlNSlFONkhzYUNQeGU0cnZnRGRIT2NPeERJQWNtREZEWHZMbms0ZjdZcXQ2M2dFSUIvWW9qKzRwOXhhQWJCSGVVUE04cUYyYVJoODRRUXdOUVljR2dkbXg0QzUwV3FDRm5nTnNnU3ZRK0R4dTRNdWlhd2h3SUFYVmsxTytlL0E3Q1pnVGhZMWRjbm8xbkhMMm9ESXlaVUxwQnNBRlRCWjlwalQwUVFnbjJWNnVmUmljUzhRUmdiczVaWXBFc0VORGVqQmZwb0xyd0FPamdJelpNQlJaMEFIb1VDK1NPQTU2eEp3TmxFeVRGdzVGeEJQZVd2bHpwbmJBTkNkUTFlU0dUUnliTXV5ZGdNZ2dWQnNLbXRZb0M2TXQ4em5aeHNaTUx6QXhvQU92c2greWREcXRYeDRGSURsOEwvb21RN0EwUXFBODJTL0VSZFRJMjJtTmZhVHVCSUl4UjRCaEtlK3k2MXB1blFDK015dEkvWnovYzlFdXZ5QmVldExBZkdaNVdPTVo5ajIvZ3FBQkIxZk1Mc0hBVkJxaGZUY3lINWQ5TUJ5RWR6cytCNTBaN3ZvR1pYK056TlNzZDhjd1VjRzVBU1JLWWJkSFJOWXdoaERJSFJnR21PMGdGUCtISmgxNWpPWGpueUtibFZUNUNiZm9xK3lKT3N6RjhQOCtWbk5QbElDa01BemRzL1lMeGxZem5ySndJcE82ZWdUUE1xQTVaTkRBQjZpQ0NZQXlZQmNCcVRSUTBlNDYzMFN4WnlRSlFJdk1KOG1TZUxyWWUrcC9HekdmblRwRUlCeTZVUy9vdXQrSzF3ZyticnM4OHJIbURPZ0FWQ01uckVmeHhNdGUxTXQ2ajd1OXp6S2dJWHpjekVCT0pJQjBCbkNKb3FnSWZERWhNNThTV3pKRVBHSmU5aGZWSDQydW4vTWZ4bDliZ1NpQnlTSUJXbkFKQkRHRURBQjhRV0ZBOHdPMy9hK3dINCtyZzRSTFBZTHVsOHRDSThDc0ptSk1RQU91d0ZDOXFNSTlnOVowQ3hoWno2NUswd2ZGQlBxdTdQRXlWZFdBT1RIVmxUY3B4aFhIWkx6MXcwWkE2RURMaGtDc2tSZjBzdzRkUllDMFBRL3ZWU1JBWVBvN1FDZGo3R3FWT1NNZUJTQXpVek14WmNETXdMZ2NLWC96YnY0NVNRbEhYRElnYWdKYytialpCcUFXaFVvSC9ZK0IyRDBKN3JGYTZMWURSbXpvbXNBYU9lS3F4RXZiV2FjSFFCMDhKa1JJdGVTWGlTQkxZSk9MQitYNHhyekF6WTd2Z2ZkMlM0UkFLa0REZ1B6TkVBSXhNQVNTV0YzOFdzZ2t1WEx5WFRSU1JDZS9EZHVTWk1CTXdlNk9iVGQ4SkJqMjRBb3QwN3VET2JQUDlYc0l6VUdGUHM1K0pKL002b1Q0YnV4SHY5WDdCZVk4S2dPV0RnL1o1OEdUQzlYcTVGeFRYT3c5YzNDbTZrNWZQY2pnYkhiZ0FsdlZHMnRIMVQzT2F2b3E2QmxuaVorMTJuNXUvMnNEYk92YXNxb0ZnOHgyTG5iY2QxR2RoU0FoWE4rN3FNckFDNHNBOHNPUko2eUh3RDI4eitGdDRmZHY4VXlxVURyRG1DRUJjcFozOWtMUzZhcTlsNEQyckxiL0tZc0ZUUFdkZmJ2aDg2dlF1MnMxSy9LK3pJalRzWElWUTlhNTlFZ3M0WTZzWmZJQS9FY1NwL2pFWHY4QldjQWh4YUErU1ZnU1FBa0dBTUlDY3dWbE5MbHFUYzlHYnYvSEFBN01yTDQrZjFWbFh3clVxN1N2Q295R2NycldwR2h1dXIyZk5HWXdNOFlUNjdoVDNzMUxhWnZxbjVNTE0wYnptSE1tSUZTZ2RGTmovbUlCY3Q2M05oRlp3RXpEc0JGZ3BEUGVhbk5nQVRmQ3RHc1g5VElLd05yZzl0dVZraGxuZzdUSS9ZQXJYMVZrWEtyRWUxbDJTeW5OMVJDc0ZKc3FuUXYzVUlNeGh3SVJqVTVBR045UVV0ZVZ6M0JVQXZhaHVOZ2pDM0h4TEFORDduQnAvY2dPTlhGNXdDejh4VURHZ0NqS1BidmV2bHpjS1VISDJhZzZjbll6ZXBZQkI5WmkyRnhESmRqb1hKdjFXREZpTEo2TUtxS1pVem9RRlRmajJIbXdUS2NUcFZXdmN4SEttNmtLZ29PUkFFdlZjbFBENk5kekxYcE1UOElZTlBjTFY3eUpHQjJBVmhZckFDNFNOQTVBeEtNOXJ5RFBFNWZzNmVlVktXR1oyTTNTM01RZkV5SlVLVjhMMVpwSlhwVko5cExpbG1sQXhXa1ZKSEt3SWhqakQ5VHRWWFZtMUhkT3kvcEppYU1GUldNK2JvMHJXbDR5TTFON29QaFRKZWNDOHdSZ0F0dEJqUVdkQkJHRVN3Z1NpVjBQYjlEUmd1MFRZMTlOK00xbVJLaDhuaXFGeDNyUkRzTHFqZ2w5eWFHWFQ4MHZjTDF3bkUyNTJQQVpDekFIUUNvaXFvVzN5WVdGSXQ2NjRmVXBLYVJFcjFOUGFrSDZYa3VPUStZRHd5NEZNU3dnVThHU1JTejBVSngzVngvNXZGTmJycy9FaUxSWSt2NEFDSVR3dzZpSkVvZFFLd0JJeUJSdjl2d2hLelVXNno2NlRVR0V3aERTM2V6cXVzQXlOeG5Kbjh4YTFLUlBTRnRzOVlmRkIvUURaY0FtNzhDbkRCVDVVOHJDcWpmYzN5aDhHbi9oR2QvTXNLZjErUXpZSjQ4OTFKeWUxM2l5MWNBRTljREorNkZwWXJFa2lkeEROM090WFIrRndCR01lem9NbXhKTE91bUF1RDRKNHJ4SnJmZEgvWENvTEdGVktpVWJ3K0xBUFFxV1dhTU1McmQ2LytKeWNTSW04NXc5bE9wdDFqMU13QXdGVGlxQVdFVXhlWUg1RU5uL2pJblVWSGVNWFEvZi9qUmVQdkNhNERoVHdMSGZCYzRmckdxcWFOSnpMUHc2aVp4VitIVHBsRkd2WnJYWlQ0NU4zOStIVzNUdWpsWnY4RDZmcDhIUnE4RHRzOVhJT1I1WXRha2dCZ2RycnJ0NVFzcThTc2QwQmhRNEhNd21WaXRBV0hBWS9MYkxEUU5RRGFUVko4UTZXNHFWQjUxT09xRFpEUFZCM1RMT0JlcFc1am1xYUxiZWMzakdnQkdNU3h2dmVtRFlrUTlHb0tGMVNoVUNTS0NxQmVRcnZtZlZaUEMxa2VCalhjQ213OTExdFRKOHE1WGdPTGFRZ0EreC9PZFdBMkVHWjk4Z2JqbGVUSGRRSFFOKzJpd2xzM25LMy9aaGozVmVRaG92WXpkeG1BclN3UWdEUkEzUWlTQ0pVclRuamZsNEtvelJDU0NDZVltdDkwRW9KSmJWQ2svMStGaUN3Rlp4TGs0ZFJmTEZpYTZ4OExiWWtEOXY5Y1h0TEc2K080QVlRUmZyZ1B5Z1ZJY3F5aFRYY1dGT0pIOGZoM3J6N0VLd25VQXJxOG1jR3dLMk1DQzFpN1dZN1plbmg1NmZlSFQvakUzeWxpRTRUWm5jZDYzNmdQRkNLV2F2R2hjUngySitjdnM5TWxTdzBUeTNjQ20rYzduMEcwTUV4ZFc0Qk1JYlRYRTlVQ3ludnlDQ1grT3ZtNGdiQnlBL3hpc1ZnSlBwWHJ6TGo0RW9SSmpKSVpyV0hBclM5aXBySytLY2VmZ2l5QjBYVktHak9tQ21XOXhoUlZNVVN5UkZuTmVGR0VkSTJxKy9IRlhjbGtwOVdzQWJnVEc5d0dqMDhDSTY0V3hSay9PVERjVUF2QkhYU0xReGNWQ0RNUVNXYnp2KzFlN1dWYnorazV3MnRKdHNiY0NZVjZXSlk3aG1Bc0RBN3IxU3ozT2dPZ29NK0tUT0piY2pTSTV5R0lhTkUxdXV3bEFBVS9NRit0RjUvMHNJZ2hWTGRWZE0yUzBiU3pIeDJNaStGVHhYZjhYOTI1TkM0QnljSzhRd2ZtZ1ZYMUxsY0ZpeWtFTWNMMkJuZEpKN2FRZmlqS2Z4TEdEd0FoQnlNN2FDNVU0cXdQek53dWZObk51T0g0VlphQ1BsUG8yQWFocUZxb1BWRmMxNGdhMm0rV0VFTDBjQXo5a2RQck9tTXU4cjFvL3JUc1h6N2Y5b3N3RnMrak82TEFxa3ZDM0dnZzVGZzZtd1cwM0NVSTZYMTJoOGx5ZmN6M1FIcXIzRElsNjREYnFhUUtjOW1JODdRWEFDRDZ2cEpxWTBFVnh6MkNFeUNJNWVNU0dYMmU3VnRJNUo0eVRSeVpoc2NydnQxblF1aXZPQWFOTGxZRVN3Y3lTZ2lWYnIzN0JmZDAvdTMxeUVnZzJGVmFpUENlVk9ndXFBZkdvdjBpUjBSOUpBQkowYm53azluTXh3K2ZPaDU1RWJnUmh6b3pyQlVBMXBvbE45Q0x3b2s1SEVFVVFCakZNUUI3RCtqNjU2UFcrSXJKOE8vYkJDbzRzR0ZkR2VqcWl5WUN4M21LZTkvSnRUaUJ2bUk1T0ZpVGlzZzlMdEpGRjdnWkdEclViSEtzNzkraHl1NWhTYVV2aDFmb0ZyM3IvNnZaSkNpWGdDRHdWVkZKN01WbVJMc3JHbHR1RkNjNjh5RmRBQ01EQWZsd1I0UU0zSFBvS2dJRXh0NGd6NDJTdWFRYjhoQk9FMm9abWx1K0tGbEtSM1FTc3NNSnhEUFdiYmpwZkxvSnJ4RzhDWVQ4TUtHWlNWVEN4WUZUSWI4NG5rQ3hDSVBMRGlieTMwZ1hGZ2hhRjRjMlJlUjQ2NlV1MmZ2b0ZyM3IvZktBRUZ4dnBxTWNkOXlvbklya3VLNUxMVjdNVkNNKy91REpDeUlDMko4YTB6MWl3cXlFU2dNbDE1U2EzM1FLZ210UEVCbnAxMW13dVhnTzcwVWQ0REhXemZnRFlDM3pCRU9rN0hsQTZYS3lIUXpiOEhnR29DU1FMcXN4b3JJeTFCeGllN1d4MHJGYWYrd3I5WHYzMkMrNTYvN0hiSjVWSHRSWVQrR0pyc2VoSGN5YTU3UHlLQVFrNit2QmtCWlBwalBFRXhsd1U1OWF3ZzNDMjRXNktCc0M2dHFIUitNaWR5VkczaTNyZEFuQXNIMlQwOTNYVCt6THIxOTdNVEE4MGgzU2ZzWlAyVXFwQ3JQUTQ2b0YzMTdWcnBlaUtYVEo5TWhNTGtnR2RDYWNLRy9tdXBWOXcxL3Zud3lHZ0NEQ0tXekplM2xxc3l6TFdaV2U2L2tjL29LemdLSDRqQzdvb2xoZEM0aml1ek0wV1BvK2NQUTJBc1gxb2JGQ1RPNUp6bjU2NlB3YlJlaXduZlRXakk0S3ZEb2gxanVoK2FUK1dLU1lEM2k4QXFsMnJKaytWc1ZRbHk1a2tkZHYyRnZIVDYxaWNxTzdGcjcxL0lrTE5YT2kwRlFqVjAwNDZvQnk2d1o5MjJROTVJQ3FERWFMNFhXdzNDT2NmOU13NzNERkI5QXFFNndaQUFTOFh1ekdRSURLZitvVmtxeHQwMHR0QWMrWVQwUEo5cVJGU0I4eG95ZTVYdTFaVmVDU2dDTGJZTFZOc3dvbmNIeG9lTHdDekJHakJOa2kvNEJYM3o5bFhnVUN5SUlHbWhvdmE4M2NSZ081VGU5eUxnUDNNZm1zQlM4eHM4L1U2N2VQUU9xeTl1bUJVcnVEY2hxbzhzSFNkM1BNZlQ1aWZvK2FjazhlRkhJNlFFY25UNUd2ZE9uVmRYb2YrcHRKK0JWUFdjZWlhUkhBOFVzL25rQUNvOG16cWxxbVdyYkZEcHBUNUE1VUlabTdDUEEyVmdtM1Fmc0VkOTA5a0tJcUIxcUpBS0NCRzhac3RaejN4SE9BQWl3bXBESWRuZzFtYVpRQWtaenNIWjUzN1lmUXJ3Tnl4b1ErSGFrcm5TMGgxbVVBMUM5NlRkSlRtT1J5aEMzb2VxZHdST2krR0Roa0ZJNmJZTnJjTkRFRGVBa1h3UWl6UFJwbW5JczNPZHFaUFNhUkZVY2JjaEhsZ2llNmFncTJrWDdEZC8rZDhsVUpWWHVVems4RVJtUysydmZkNHV2TjJWT1Y1clN3YjB5M0poZ0loOXdKZU4zWU1RQ0lnUjc4UStuREVWWUJZWlVyVXBiWEZuTTdDT1NkZjdONElQdnREblQyQlkvaDhDaGgxME1YUWVZR1MrN0dHamFRaUFCcHVOSUZpRUNuemRXSk1JVUhjYXpMcHRDN1lpdnNGOC83RmdMRk1xcGlRTDVUdU5iS2ZBL0RDNDZycXFBYkF3SUtXSyt0aW1SVUJFaU5Hc09Rc3lRbStHcGpkNG4wNDZoYlQ4NEtQdVlqT21ISHlwOTJnY2dEUzJPb0l1VkllaC94eVVrYVZ3eUVXZExyZXdIRTN1QlVEY0tJd25xNDBIcERYTCtuM0N6YmFLZGd1ZWw1Vm5GSmwyYXdhZ2hMUUJUenRlWjBjakxxMkEybjBNNkVQaDJwQzU3V2c0MXBvTHpac0FaTnNvMEh3NmVWUi9KOGJGOVlqV0dtVkNwR0t3UUxCUkNjcmJpU3hOTGdWQXhDRjhYU2w4WURISEZQVzd4ZUZCUnd2L3JHcU9LVUJrT0R6cWdkV1BZQU01M3ZUQVNNUXU0Qng5Sis2OU9ISUYrTjcxRjFPMWdVQitBc0JmRnFLQys0V2k0QldYK0NZZ09UQVUzNndkTVZOVktrYTNNb0JXQmhQeHlpdWtvM3hrU1g5ZnZHTWtxc0RsenpIQzFONlNRNERvSU5PZTdLZWxXV1RoZXppT2JlS0NkQVJBcEQxQWRWblJIMDQ4Z0tVQW1BRVlpNk9oNERKVjRWb0dEV3FqcTRYTGJPNW8xakJvaW1FUGhQSm13dTlGdm5UTGdkZ1lUd2Qyd3lYYk15UktlbjNpMmVYWEIyNDVGbFZZVXBWeFVwR2lMdG1HQmxyVEVoVlV3VjhkRWtWS0FxM01ISjF1elJiUngrT09nRFdGWDZNc1hKVS8zNmxKb0VvQTJBS3Z3OCt1d1RFRElCYlN0ZE9zOGRkRHNEQ2VEb203WmRzekJJczZmY0w5cm9yMkM3NVVTOUl4SkpzRXNIZEdGQmlsNHlZdVV3a25vZkpnRjRYY0VVZmpyeitYN2ZLbzRFSkovL1BrTU9STzZGclZqUU1lTDVrSmhaTU1Yekx3TlpDdDFuekRGZ1lUOGNRd3BMdDRoRE9OMGkvWDd5czVPckFKVmUwUy9JU2dGWTdqOVp2blE3STMrbHlxcFlhTDk4Q1dwL04rbkRrWmRoaTZiVzhBbjFrUDNmUlRMS1ZXbHdGNlJaQ0gyTDR6RERSMGsxSXFlVE5iMk9RU1lOYk9RTVd4dE14ZXF0a1k2SStueTlWRXo2YnRmYjd4YytYWEIyNDlBb1h2ODUrdElCVmdKSjZuNGxmNm9WK21mamRESk5NSDB3QVZGWDkwR01rMWY1VHhsUzNGZ2doOTJEeU4wSU9SeTU2NjVLSWZDa3RzbCtLM1ZzR3RwVk9XT01pdURDZXJsU25qUTJyQituM0MrcElCZHVsejh3cW9uck5QTEtnd0thQzVCM3M1M3FoWFZxNm9ETmc2c09ocXZxaEVyM1YyVk5MQmptblNTTmRyT0xKMXprQXU2VlBSakZjRno0ZlhESjhpNDVoRzk0R3QzSUdqT0ZZQThUVGxRWi9xR0gxb1AxKzhadGxUMU1BdEhLOG1RZzI1ek9aVVNDTElsaVdjYnc4d2ZXNUxuMDRzc3FuSFgwNGV1aUNrNi8zZGU2Nk1QcHVBUVZaQUVGa3cyTUtGdzZhMXdFTDQrbFNCdm1BT01oRDh2a09rRlg3N2ZlTE53MTRZVC9zc21jNEE2b09kSEJFa3dYbGdqSDJrNE5hbDZ3QjRmSXVYOUx6WmpBbW9yTmVITW81VGMwT2V3SHdEVFVoOUhYeGZHSnNZa0FiQUFBZ0FFbEVRVlMvdXZDcG9BY2V3NnpCQnJkeUJsUXd3b0R4ZExaV1hMREZrSHlGOHhHRS9mYjd4UjhYWEJ5QUFWQzFvQjE4SFFZSVQrOHVHZlA3NVNDVXMxbzY0aGU4djRqNmNJUStJcWtQaHhyQkNIamRqQkg2QWJsUWtBZVkxb25kdWtTaUVMbXNVUHBqYnlwN1h1dkRnQVh4ZE5aVnZXQ0xJZm1LZzZCYmhyanVwOTh2M2xWd2NRTHc4Z3FBNXY5ekM5akVydXRsdGc4Z014RFdXTUJhTVZrbUFOV0Z5RVY2UjB1SDJJMUl6Vzd5cGJrUU9UUDVmMmNoOUtzRmt3cDBrUWxEQU9teHpIcHNjR3VHQVF2aTZWRDRSZ21BZy9iN3haVmxUNU1BVE5Yd3FRYzZLR3dmMlUydUdWMnV6ZzNENHVhN2ZEblB3WmNLZ0lkcTlHYUlCUFpiMFlkRDdoZ3lJRldNWGlIMGVRNXZYUzVIY01rYysrOWx6MnQ5R0xBZ25zN0t4eFpzQ2tnZHROOHZXRCt2WURNQVVwY2phN2xPUjllTFZjSVA0dGN1b2IvM0FPSENkVzAyVlRYNjJBcEI0TXYxdjI0Z25QeTlIaUgwM2ZKMzY2S1lIWVRIc2dCQmcxczVBeGJHMCtITFphT3A2NWkrbG42L1lNNUV3ZFlCd0dqMWNtVWtFNys4VEhMTmRBSGh3clVPWHRjck8vcHdoRjRjY3Qyb042OEJNRENmbXNKTS9uNlBFUG9ZUHA4Ykgza0NrYnRqamkydEpKQTk2MllBV0JCUFowV0JDcmJZc0ZvT2Y5cERBaUVOazE3OWZrdXZmOW5UWGV3S2NCU2pzbjdsZG9uV2JnUXB4KzI2b3RhTEl3QWxmaTJRUVNKWTNZank1aTlkbXNGTS9vRURNTS9aN1VmMFJpWVVBN0orVG9OYk9RQzNlMFdCQm05cUxhZDZISUNHMVpLMVhCNVBveG51T09JY3hTWGUvT2Y4eEhWL1ArRnB3TjQ3Z0tVcFlIbXVTdmUwcEtaZ0NLU3E1d3FuaVdFMVdaei94b3VCbTc0S1RNd0JJMTdsVkJYd3RXU3MrOC92TDQ1RmYzdmhwY0FudndvczhkNDhEWlgzTTJoeDlYSUFudTBJSU8wY2h1MzVBT2dMTDB5dUcvak9td2JnMDI4Ry9tTnoxWVdkRVRibTRJNUJyRmxvditFdEQyd0lvN2wrQXRnOEQyeFk3aXczVjVkaUVxTzU0bW5qNlhkTUFZY1UrNmdvbjdBM05TTzJxRmpseVpZRGtBWDZ1RDVJYW00NFlhVWZWTkROeGFKY0xJUFhjR0dwZmk2UG5aZFZEMXdQc3BRQlgvd2w0T2FOd042SnFnK3h3cnhzbGNWRnVZSmJsZWhrY1lZWkdQUzNMMjBCeHVlQmNTOG53ZzVINWtaa3g2VFFTYlhGWmNDUUthZHg1Q3o1bVB1ckFGeHJSYWExN3BBUjJQRkMrRWxTSEtRLzBRalFjZ0N5R3lNOXYzU25zREJSSmdMNm1zV0NmNklmV2VVSmFjOFVGbHBZODUwMERjQ2Z2Z2I0M2hpd1p3eVlWaGQyRC9WU3JLR0FtSURuQmtpYWZFY045Y3BySGdLTXpnTmpTMVY3clJqUmxjZXlycWlmNktBa01nWElNKzZ0QW5EbCt6U0wzNk85K1U4cDlqR0hRbzI4NS8yWEEvQW5YZU5uS0FvckRYSC9BSUx3YlN2TEV6NlFsMitjQWYvM1hjQ2R3OERrS0hCd3BPcEZiRTJ3YWR6SWR5aDNqak5RaXJZV0V3WXErL3pKd01oOHBmK3hLTlN3TTZEWk1tek5SUmJNMksrMklpNlRsRnJBV2ZkNVYzaS9GN0lnVDJMQkY1TGJJZGtxeExQV3Z0emxBR1EzUnBVM1k3QWlpeE14TE9VQjJ0N3BLUThNMHFDVG5wOEhrb2pKZ05xYU1FSmVzUXY0QVIzSXc4REI0UXFBcys2U1dSaXFnSmdZMEhWREFkQkE0QmE0eE43bmRsU0ZBQWpBWVg0SVBPNWRCRE1BZFMyaStKeDdYVGYxZUVkVERmZ0FRblIzNHAvd1FrUm1qTkFvQnlEVC91Z0ZwaFhBbWpBRW44cWFQUUFnWkNzMGxTY2tDTm1WaWdFYkZNc1BCQkUzRGNCWDdnTHVhd0g3aG9BRDdFTThETXc0OEFoQVRyanRRd2lYb3FrVEV3V2Q3TE9uZVhOQ2J6NlRpcS9USW5iMk04WnpJRnJUUWJHaXk5Mm9HejdwWGwvN2p2ZEFKbmIyNDcwSWJCM1Q3N1NhaStoeUFQNXZvVHFXNnNLd0ZBYy9UQWRjNSszZHZjc1RydlBWWVNLNFNRYjh4VjMrNklhQXFTSGcwRkRWaDNpT0lGVElGeHRpdDlvckw1Wi9MRDFRNHMrQjhPbkhWdVh3aGhkZDVEb0xHc2dDQ0owNHE2NlgvSnUvdlNhZUF4RFB2YmR0bWR0S0RWOTBnVkVQSWwveHlTa3ZpT2htQUVqcmx6U2t3ajQwU2xRWllaMzlJKzhKQk14OG1acnloT3NLd3FZQitLcGRWU0RGdmhZd1BWUjlCRDd1eVg0U3dSUzU5bk5JK2JSY2svRHpKMDV2MTJNMG5ZOGZBazhpV0w1QkI1cUFTUEdSQ2k4RVZqenYzbXFwa0M5QUNycndoS3VrQjY3R2hwcVJSb3dRTXFDaVliajhvT29IZVVXcGRZSUJBVWo4YzhXanJqeWhOSUoxdW56akRQanFYZFVqSkFBUDhUTUV6TFlxOXVPSElDUUFMZS9Fd1dlK1FnZGRBcUN6ekQ4K3ZnSWdnMHFwKzVuWWphRHpDZ2ptbkNZb25lMGtscVA0SlNndnZLKzZMb0ZQb0ZNbGtQR2grMHJQV3RhNFJIVE5KSlF6NE04RUFHb05UUFZVOG9wUzY0Q0M5em9BV1RGQ2hjcTdsQ2RjaDZzM0w0Si8yUUZJRUJLQTFQOW1ISUJtaFBoM0FpMzU0UnlBQW1Xc1IvUFJzNnZPUjhaOEZNUFM5N3l4dElsWWdWQi9JN2pDMHJJS1NmTFhGMUVFQitCRkZqUTNqQ0xBNDlPV3NSVFRFUHp2elFFd3J5N1ZyWjVLd3pBUUFQc3NUOWp3MWRjSGdDck9SUUNTL2JnbisxSHNDWVFTdmVhSGt6dkd2MXNjZ1UvNlI1NVkxWUl4aHZPbTFFWmVrUVdsOHdWRHhKZ3djODhRaUpjNkFLWC9tZUhEYXdYOXoxNk0vRW03Yk84UTA4R0JQL2pFa0FFVmpNQm9BRldYVWpSQTNLdE53T0JYVzNFa0FaaHJBTGt0cEM2bEt0VFY0T1U3UkhCKzNrSFdndi96cm5ZWmwya0NrRjR1RjhNR1FHYytNcUVZVUNBMG4xdGt3eGJ3NFNjSEFIcjcxUTdXNCsrYzhjendjQkFtSFZCL2M3QmNlazliM0Z1d2JkRC9rakdXZ3pKalEzdGhHbVZBM2poZk95VStSeEI2RmFtT0ZwOE5yaHNUZ0x5OENwem01UWxWcHRBVSs2Q2lOZ1hDYUlRMEJjRFlWOGIwUDRwaTMwdmZJeEQ1K3c3MkM5YWxpZWdXOE1IenFybWgvbWV1RmhZaTBwS2JzNkQ5ZnNoL24xWEZNcllNYlBnVUJ5Q1p6NkordUVrbkRBOUFvcm5XRlJiMDFXWkVzQUNvSGhPcXlDN3dkZXRUMFFBSzJLcU9iNU1DVXZQeWhMRTBvUXh6cWFZTlhMNXhCdnlWWGUxMnZCeUxBRGpYQXZneEJ2U1BHRkdNSWpDbUpiRVc4SGZudHh0UW14VDBjbXhwOVVQQWRLQVoxdXBBNkVCN3FnRG82b0NVeFhSdFBWU3BBd0pwblVodXhBcVdDQ1lLMU1CRXhabGpZNVM4U1lyK3B4QUZBdUJheWhORzI2anc4dXNDUUxYMFNBQWt3d2NBRW5neVFpemFYb3ppSWxpK09lNy85a0p2TmsxTG1CTWU5RUNPM1hSQjdhUGVGMEVZSE5WUGRUOGdqMDE2WUJjV3RCZkJWWUp1ejdtRjdWZ0dZL3BPOGY1V2RRMS83VTY3bklLTlM3ajB3SWJEUEZac3lOSEhZN29kL3hkbEVIajhDY0MzVGdDV0hnR0FQU3hpU2R0NDMxMnUvOFNQQWw4L0RsaDRwRGVaVzJQRDRKMWM5K3V5RGFJRGtnRUpRS25UZkcvTjhuVUFtdTVIVW5NVzVBUmJQZkV1SUh5L0FDalJLN0ZMNXBPUjRSYXhnVEhvZktsOHIvUzFaV0JuQUdES2VmYm4zQUZJUFJQWEI3c0ZpVlFpbUtWZ0dkbDVvb053TFExLzFVK0RRR1NYUTlyNUV2eTFxOXJaYlAxbEdRRFpzUHB6SThBUEhnWGdvZDdxVXgxMVl0QmJGekMrL0MrQkw3U0FXd2hnZG9Ma09OU0xxeTVvTG9nWWZ0M1pJMUY3RUFDK3Boc0FuZWtva2hQNEhJem1sL1B2dGhRV21QQjlMSjdqeGtjU3IxNGpXajQvMHdGbGdKRDVlb0R3NmZlNER6QVlQSG9rV2hISlozVEZTa240aDdZT1NPQndFdGlNVHYxYVkwdWt0RllUbUkyLzQzRU1RbUN1QUptVUUwZ21WRDhFRmRQcGRueGhWaHF6RHI4RjROTXRZTTlKZmc5OEVWVGVOdTlRMk9GWkJYN3ZyOXZ0Z20vbGNlemN6WjYxWk5OOERDdmlsWUNkUFhxTkRRcEFsZkdUS20wTTZBQTBQVEF5b01TeDY0Y1JmUFFIWHNuaU9USStmRVdERkdwK1FiOUJleVNSQlYya3BsMFF4eEdBbEhEbWtJNTZYNnorRVA3VURZU2RSZ2gvSW91d0laMzZsSGFiQkUwR0owcjEwUmdiL3hBL3R0L2ovNmFNQWYrN1I0Q3h6dUJYV1JHVUx3QmZJclk2VU5mcHZMYWU3bjBJK0xPL3Jlb0xNcWlWTWJXMzhvVWhrTmtRSXpaTzd0SXdlR2VQY21XbEFGVGpBWUhQVkd3WHhXb0xZYmxFRGtMdVRUOE1EUGhYTEo0akFMcGFKQitnZ1U2eGZnSmtuVDdJS1hJUVhoNFkwRlpDb2crd3hpVVR3U2tYVWJTTVYxckIvQTMxT1hXdUZwUFVkYS9tUkhLaTFlNlUraEE3WnE3bCtBK1VBZkR0SGcvTHJwdGtRcFo3MjdjUldPTDk1NDJQYTNyT3Z1T3FhZ1VsdGd0bUpNMDhqNC9QSUxiSURLejZ3NVBBSHNicmFUbk1HZFpXSXdJenhJZmVLMHJuNTc4SjNMQVZ1SDhDT0RSYWhWL0ZGUS8xSXVtSXZYUDFRdWROZnlOVDhvVnFjSHZpUGNCZDQ4QTBnMlJEdW9EcUhkYjJTYWxaQWRHOWRuZkRrQUUwZ1huSDVpaldDRGJLQ3E1L01SaVYwUUQ4SGdIUTYzakcwaGRzTEd4QTN4OUJ3MUFzbGk3aE8zQndBcGduZy9HanZxMDFJSHJYSjdxM0N6N0UrK1l6aUYycnMxWkxaKzhIOWpKc1NvRUNXWGo2aWdtUjg3YUxnZmJHcTRHdmJnTHUyZ2pzSHdkbUNFSVBTSTFoK1NrQ1JqcGZVQzNpTldjcG9ScmNucllidUdzVU9NQm83UUJDeFNURy9pZ3hWY0JJVkdQV00xaDFKWVFQbnlLTkV4R1pNRElKOWI2NmVFQkd4UERZMVk1bnYrR0NqZkdBeEQrRERwaWF3cGhBQldaUGp3TnpOTEFFSUg0WENIME03LzVjOTNiQmZJOFlrMmNnVkFkdmRUMTBpZkRrQldDL3I5bEdINTFOaElzbnNXSE9mUG1FVUtUOTRXZUFHOGVBTzhhQWZXUEF3VkVISVNOUWxLUVVnbEpqSkV4cUMrSDZOcTkza09wVWc5c3pid0x1SGE2NlF6RldrYUZpZVh4aTZoZ1ZIT01DWUdSdUorNVY0allKSURLSTlLbHNBdkZEcThRRHJuYjhOV1ZQaDlFd2RGa1E3OVRsU01Jc04wTWk1czlNb09Hbm80VTZmM1lBdmVmTDdZN3J2ZG9GTHhPQU5TQThmN3hTZ1dtZDBrQ1FibVo2bVRMRW5KMFVxV0xoVWt4bHJCbjZuM3dXdUdrWXVHdWtDc3VmR3EyaW9qblJGcGFmc1U3TUR4RXJKdVpoWUNzSm9zSHRXVGNCZTFvZXEraHhpZ0pnWEJyTW1UQlBuSktMcnIrVkVENTRpYkhZdlpvczhzTytETmNySHJEWDhZVlZ5Z2xBS3VkMEx0TWpGUHROTXo2UUxEWTdWb21MSmQ2NzFBRUg0WHUrM2c3bldxMjhJU3ZYNTgvaGd1T0JnOHZ0RlF2Vi9oRXp4ZnFPZXZ1VGZwanJpOHZBV3o4TDNOWUNmakJjNlpZSG1CY2l0bkZkMDZweHliOFc0Z1BsZ29uQnFmZlR0ZFRnOXB5YnFpVk5Cc3N5VXNkVUQ3ZUdPOWFtbmYzc1h0eFFpcGw3V2cvc0Q0QThBd0hJeVpNWWt5NTBUcC94Z04yT0w4eTA1MXF3MmhYendSQ0VkVDJubWNrMVJ4SEcrdzVqZU85TkZRQnBSNmxkTUlNWGxGV2dWbmRxRjJkVkZzSnp1T2dSd01FbEI2RGNJNnJ6bmVtRDBSbmJ3UWlTUlMzZzdaK3RWSWw3UEM5a2FoaVlabTZJaXp1TGlnbGlUL1ZvVW9nK3A4UDlsM3dKN3FHRWFuQjc3azNWY3pyb1VUb1dMQ3NBQnVkNHlwYUxDVW94ZjlpLzl3OUFEaUlDVUxyUVJXdUlCNnc3bnVacndhWndMQkd3Q2xTcVN5ejNBaEhiYVJHRUZHT21DNDRENzJVVmdqVzJDMlo0bElGNEFyam9kT0RRY3FVR3FBeGZjcEc0bUpWdVZxY0w1dGJzMnovdmVWMHRZSy9uaFRBcWVzWU5IZE81UENKWm9zK1d1enhISklWaXVYRnlKeHVwTkxnOTc2WksybGl6VUtvZGlsR1VnenlHaG9rRjh5dzVNZitxUmtqZGpmdUR0d2trbTdEVGtOYUJhUTJveDFxM2VNRDgrQjZPM0g2ZW04S3gxQ2N4OXB0V2w5aVlJVUFBV3JJM0kzbkhnUGRPdHNPNWVPdXhYWEJkajBWMXZPTC9zbzNDeGVmNjB0bFNwWXd2ZUtmMHBBdTZvaGZkSjhrNENVcWd2cjVqVjZWR1RCS0FMZUNBaCtWYlpMVG5oNWd1NkQ0NEE2SDhjVmxrTks5NU8xV2tCcmZuMzFSNUhTeStKQ3dQcGxBeFJlZ0UvMlQrQWxvR25jTm1iUXlvZ1VReC9Ld0I0Z0hqOFlXTlR3UkFPVzBGSUlJbmRvcU5rVEF4ei9iZDA5WERHTEJkTU02L3BMS2k1d2hBWDYwZ0NLMnVqeHpFQXFHTDJwUTFKaXM1QUpFQUZIdlR1allBS2pSZitTRXVnbTFkMkNPUUxVL0RBd1E0NGNhRXc4QXRaelNJUGdBdnVLa2RyV01NNk03eENNQm9pQm40WXBDRTJOQ2Z4V0FBNU1FdXd2Q0NFSUN3bG5oQUhWK1lPUmZEc1dKR2dQcE1Ld2cxYjlRcEZuekhiRDJCSzJKR3VsOXM4S2tZVzE3dkxBTFFSVENCcHpYWnBTNGd0Q1hYTUFrZHV1QXk4RTdQaWpQV3ByWEo1Q1IzOHlndzFmSkRvaGgyQmxSQWdxMk9lTjd1VFdjMUQwQUZOdG1MNTRFU0JzQ2FKY0xrRGFqeGo1WlhSaUNJR0Ewd2FEd2dqeThzazUrSFkrWDlwcFViSlNDcDZUbkZDTVh3bnkxV0FGUThyVUFjMndVclJMNm1YVEFlZlduRmZuejNGcGJhZ1FLTEFxQXpvWmpBS2trcFhrTk81R0NFdk9NTEZYT25uQzR4SUtPam5RR05kV1NNK0dxSFFHZDdKU3N4VWYrSnpRTHdoVGRWNGplMW5RdnIxTWtQR3RsZjl5UDJEeStnQXFaNnJReXRmdmRIU0R4Z0x3QkY4QW1BWWpIV2x1RURpS0dNaXFPVnZ0ZWpYVEJPdVJTWUp3REpBQVJnWkFHV0w5TmsrSU0zU3pnVHlkRTRlZWMxblpIYnREYU5BZjFEcGQvU014MkVORDZrRDBvWHRGaEJYbWNZK09ZNkFGQ2huS256bDdOZmRNUjNxQ0FhZTJCK1ZWTVlYQVN2RHMzL1gvekhKWmNCODR2dWlxQUJFbzBRUG5obndxUUx5UlVSbVpCUHl0bndIZGUwTTF2TjJsUjZwaWNvS1VMYXhIRElFZEhrVzJpV2c0LzdiNXpiN0RTUUFWZDAvZ3JpVjJKWW9qZnB3UkdFWXNHQnJPQm14L09nUDVzQUtBTmtjYkZ6TldUUm5YL0dTR0ltTVlIL0xZbGsrZ0d2ZFQrYlcrU1dIK0lnMUdxTDVRZVR0UjJFWWo1TFZIZmp3L1pEd0w4eUo2VEI3VVUzVlZvVGpUWXhZREsrSXZ2N2R6TkFaSXhwWlNpVThqaktnSVdUY3lrWmtCYXdEQkJuUWRNcjVRZVRLSTVpV0NCMDlBbUViNyt1Y25PUS9hVFBXbjZ3dXp5UzR1K1IwT2I2Q1VHcUpwSURBOTdBZHFJTmJnUmdCSjY5Q0c0SnA2cS9ja2pYcUIvUktsYTRXcGtPMk9EZ0hveW5pZ0EwSmlMd2FOaUV0OTVZUUtKNEZSQys3YnJLelJIOWpaYk42aUpZdVNIbTlJNWlPQU9oSE5KZlpraCtneHNCS1BiTHUzK0pnYVdEZG9qaE1PNWtrRFdTbE5UZzRCNk1weUlBamYzSWdnSmdNRDRNQ0FSakZNVTlRQ2dBeWtoU0tuVUNZSEI5SkIwd3k1YVRSVXhtdXA0aCtRMXVBbURzK2hwWGdGTG5CNlVMT05PbjV4QUNOSnF4Z2hzYzNJUHhWQkdBaVFHOWFMZWlsV1VKVzFGdlZYRU4wVEtwMUM2QXQxOVRNU0NCcHoxZEh0VC9KSDdOOXlheHA2UWtGNzNLQnhZSXIxMG5BTXByb0I0NHFRR1RqNnNqVXJ0T0ZQdExlRlFITEVTOUFkREZycTFFNk0xM01heFZDVE5BWE5GVGhJeWxMY29yNDB6eHRnREFQS3VWd0RNck9LdytTQlRidFIyTU5EN3Nad0M3UXZtNHdxSGE0VC91SXJoYis3bjBFZ2JRZFRpam95ZythZ1dYVDhsbERzQUZXci9COHFQMUs3YlQwcHZ0VndIaFc2K3QyQy9tOHN2dlpsYXdpMkNLZTM3bmhGdGFwa0RuSUxScUJRQSt2MDRBak15bjc5RUlrWE8vRG56eUNCd1Z3ZVg0d3hzOUI0clJaZ3lQVkZxeWtnRGQrNUpTcEJVNXIwdkh5SHoranNjM3ViMEtBQnNaTUN5UWdlRXhLeUZQVkl6M2xtY002T2ZQQUdDQURZUEU2N0pmczZoN0cwbyt4dmk3b3lLNGNMWmZPZ3BzWHdDMkxxOU13dXVWRVJvbktuNG5TSnJjWG5RS2NNN2R3TU1YZ1ljc1Z4a1NlYkpnek9XUHFkQjFhZDJmM2dwc253SzJMWFdlUjltM2RhblVJVjFsQlNDUEFyQnd0cCs3RFRodUJ0aTZVRFdEbVdBL0R2WGs4TFJwdGZQdE5VbGloWVpUT1BDaTA0R0gzd0ZzbndHT1c2aUFzNW4zR2VKSitLTG9FKzlWRENsUThSNnZPUUhZZWdEWXd1WTNTNkgvaUo4amIxMWNrMHE5UWhvYzlRTVdnUEJaSndGYnBvRk44OERHUldCaXFRSWdXeUpZM2xQb3phR0oxS1RFUGgzNnpwVGtKcmNYUFJFNDRTN2crQ25nMkRsZ3l5S3dhY2xmRm9Jd3ZDd3g5Wm4zUTFEbUlQeC8yL3NTYU11dXNzenZqZlhxMVpSVUVsSmtLc0JFR1F5WWhKQ0JTa1VxQVcxdHNCZHB1eEVWYUJ6b3dYWnFlMWc5MEcyTG90alFkbU1qS3F0QnhRRVJkQVdVQWtVbFpOQkdrUVJOeUlBRU1Ba3hwRktwcWpmVUczdDkvL20vYy8rNzM3bmpQcTl1VmVxY3RlNjZiN2pubm4zMi9zNi8vLzN2Ly8rK1R6MGRtRDBLekM0RE02dkFGcGQvMEwzR2g2eVREZ252THdLekFXREdpSC9UaGNDMk9XRHJFckIxcFJnUWlzSVFoQWErQUVEK0hFRVk2dU5MeXJSblpMU2w2dFNicmdMT2VCUTQ0eWl3OHppd2ZhVjRVR2JkZWdtQTVRTVRMRmxxc2ZuN1hlY0RXK2VBbWVQQWx0WGlYbmt1WlNCa1JjbTRVR1h0VTJ1bzN4c0FaZ3o2eTU0SnpNd0RXemtnQk9BcU1NVkJDU0FVT2JoOFF1Ti9DaVRnY1dBdXlXaEwxYW12dkJiWStWZ3hiVzQ3N3BhYTdnSUJxQ25VcmJVQmlRdWhBS0RVb3QxM0liQmxEdGl5QkV5dnRPNVZEeHZ2VmZ4Vy9Ka1dORnJDZUs4TkFHc1k3QnN2S1FDNGhRQ2tKTmFLeTJMUklzZzZTSjNJUVNlMW9uS0tDMkNzT1lNZU4rMER0ajBPYkRzR2JGc0VabVdwNVM3NGcySXIydUEyMkJTY0FKR0ErZEpGd1BROE1MMEVUQVVBa2dEVFBxOXpkSy8rc01XcFBGMTlOeFl3QTRnM1B0c0h4QUU0U1FDNkZkU2dtR1dSUklKTFpKbGw4RUdLakhpWDFqd2FOMTBIekQ0QmJEMEd6QzRXcnNLTVcycE5vYlpvQ3U2Q0xDRGZDVHF6Z2c2c3Ird0ZwaGFBS1FmZ1pIS3ZwUlNZZzdITjVYQ0wyQWJBWndQclpHYWo2aXBwWGhnbjBrcW1VMXdveG5IZWRnNUFBVHVXSGlnMkZFMXVWUndveG9YK1djYmc4OVMzQXFDS1BPTmNDaThvUHRWUCs5KytHM2orb1NLMnhSQkZERWxVeGJUUyszbnZjNEZwRHNqeGxsWFFvSmc4RmdkQ1FvR0pKVFRpY0xjUTZ2UEw2d2JnOWNETTRjSnYyN29BekZBNWt5OS9VT1N2bWc4b1A4Nm4wZElDQm4yNUp3akFSV0RTQVVnQkhONnZmZGJ2MTBBYkFSaDhYOTF2RE0yc3MrTnZBRUNLUFZMQ3NIb3lVZ1JxcmxiblJ3QjkzM09CYys0RFhySUMwSUVtaUxuRTc1ZGk4SHN5QWNqeldVVkdVaTZ1SUNNcFZ3d0pWTVhkZU9rM1hBeGMrSG5nK3ZWMmVzQVl3K3NXb1AzMXIzZUxjTHdRQmVRVXJFSGg0Sm8yaDR2RG1KUHVBeU1MR0FlRW43dXFiZ0IrSTdEbFNXQkdDd2UzMUdiOWFMMjBrR0RiL0VHUnhZNldUejhmMnd0TThsNHBnTDFTZ004ZXNIQ3ZzdXlsTUU0bm45Y2ZRTHRsZGc2VFowa1VLb3JBZmlqMjN2QVBDbXFwM2ZjQ2w2MFhGSU5pZDFQbFpyZjQxL2RuQXBCNndTUWp1dFVmSURKUjhDR0lRT3dXRUg3RHl3cEtyV2M4Q0Z6cVJMSGtWWXJCMmpTMkZRSDV2a3VCeWNYQ0FsSVVVQUFrQ00yaVJCQTYrQVJDZTdEalltUWR1TFlUbGVpUS9YVFRTNERwSSs2bkxoWlcybnpWQ0VCYU1MZCtzb0lHcWpEMWFtcGR1Z2lZV0NwZUJLQTliQkpDOUFjdEFrOExFUzI2U3FzZnRJbkxaNDRkUWlmNElnZGh5bTVXTHJQRHl1WUgvN0hUQ053RG5Qa284TFhyQmNjalFhaW9lNkJpS2FkMytRWS9NR1RINnJTM09CdkNuUUR1QUl5cWhpRGtROVJYKzI5eUUzb244SXdqeFFQSTh6a1RpQXBHVTNvVmtELzRmR0RpZUF1QWRNdzVNRlFqRWdnMURZc1VrdSthM3VJMFRHQmZWN1BvdHdId2FPRW1iSEVBVHZ1REl1dG5pNlVBUW9GUklGUlloZmUvZGhFdzd0YmU5T2YwU2kxZzhIa3J3UmNldkRhanowN2dJSjduMDVyWXlXSXBiNHlhLzd2djhQUmRGcGovTFhEbWtRTEFuQTRqQ0NPbFRCUk4vckZNQUpLZ2trVkhwR1VqeVNTQlNGZWc3L2F6cWs4RWdiU0VxOFVEUkFDTEtEWFN5YVE3QnIvL0RjQTRMU0N0d25LaFRFa1FjbUFJUWh0TStVYWFqbDB1UzlOYXRJVFhXenB6ZmNkTkI0RHBZKzZuQmdEYUN0YW5ZTE42ZkNqNHUxYXkwUUlxdE1ML0VZQzYxd1NBOXRBSmVQNmVXc0FvRHlzRnBnMWVCMEhJUVJDSUlrVmVDcVFmLzA1UDNXQ0IrVVBBK0NQQXp2bUNhRldES0V1WWNsMXlNTitZMmRja3FHVGVIUEV2dldEU05oT0FmYmVmWDBBNnJTOENVdzhYOTA2NmJGSWZkcU1ISklEKytESmdMQUNRdW15YzNneUFFWVJSS0ZDTEQxZXU1T0RMRjZRdlhlZHgwdzNBMUJ3d3hkQUpMVFhqZDhzZVFuR3JaOWJQRnhMeUE3V0lLT042M3RZdENRQk4vc3Y5UVBtNkJrTHAwdmw5dC9tNmlldFI2ZmJ5QkE0Z25YdE9Sd1JScE5uVHRQcFc2Z1dMSDgzbEtxY09GVEVuRGlLdG9Id3k4Uk5GaHJlZnllenRibnJCZmJXZmd0dHNQK2tJeU8zMkVMRDFjSEh2SW5ybHZXczZUc25CN3FBVWxnL3N1RnRBV2tFNTV6WVEwUXBxY0FMb05DWFRFdDdBM0tvYUR3R1FmcW9BT0VVQmE3ZlViS2N0bHR3Q2FqVmJ4dlNpeXZvYXNNMEJhQkt3d2RLYjlmTjdOZmNxQldHaVNXeWtXWEVSMHVtZWFjVUVvblFnQ0tSZklnREZqeWE1eXE4V2ZzZnM4ZFlnaXVNeGdwQWcvdm5NenU2bUYwejZaajVBUGR2UFFlYzBURW9zbnZRb3NHT2hhTHVJWXZud0VZU2l0aEU1MkYxWEZBQTBwNXlpZ0Q0b3RDcXlnRktucEhVcExZUDBPY0tVUll2Nk1qNE1OUjQzM1FoTTBnTDZRb25nYXdPZys2cmw5Q3N3S29Ta0VJeFB5VHN1QVBpZ0NZQm1BWFZmWWNWZituMFNSWXc2ZFAxWXdOZ0hzZ1NhamlKUDQyOVJycFdPTTZjeERpSkI2TklOTTR3N0xiVUdNUVV3Qi9NOW1aM2RTeStZVkcwRW9CaURCU1Q1ZGRaK1BrQ3NBaUlsUVpEYTNMVmF0SjBXWEcyUGJMOThBQis0b21CM29QL0hnVFVobUdnQmZScVdmMlRUclVTakV4RFNQL3FXelFEZ2ZBRkFXeXpSOHJrRnREQUtYNzVqbzZuVWd1WnhaOE5CeUhidnZxQlEzNlQxc3djc0JhQkFHR1JnNDBJcitydDlXVURoUTVaQVU3RXMyZTlMTHpnbHFIUnhOa2JldVcrb1FSUmxzNWphTWpuSzBhOWVjTmYyUjRMQXdPODI5a1FCM0xUdEVZUVBVd3pRQVdnVzBBR284QVFIMGxqcC9WMTdwbTBLUmNFaWZHdU5Pbm9jTzFyQUNRYktQWGhzOFR0TndWcjV1aCtuNlpmM3dEZ3UyOWcyRmRNdE9jOEI2UGRwRmowOFpGcnBsdytaQTVGVHZBUVEwL0JUMzZGUERrUnFCVDlKYWc3eFlsUUl0WTBmODhqNzhzWnpDY0tQWmxyQVFmU0NLOXV2QjRoNTc3U0NvdFVpRUo4b3BxOElRRmwvUFVCUEVvQkx4YlJFNjJMU3FHNGRGQjhyNWJIY090aU9RU3FUNVQ3Ukt6WURnSngrQlVDQ1R4WlFDd2hhUWM5b0tjRW5FQktrbmo1RnNKMUxBUG85eG9XV1BXRHkrNklJb3FiZWFPMFZBK3pIQjB6eElRREtrbjFHZ3RYaVJ4TUlBeDBWbjBEYitsa3VGakxSQ3Q1V0V3RDcxUXZ1Mkg1T2Zla0Q1RmFjaVFheS9HSWJGZ0JYcml3QXlHbUpBRFIxY2szRHdURTNUUTRCMExldHpCSkVyVFlBcjJCQlNJM0hUUzh0TEtCWlBvL2ZXUURacDE5N1ozc2NqR2I1QkRwL0wzK25qTXdlQjZCODNHajl3ajNhdE9zUFdpbjlXZ1hDRmxWTy8zY3RmNGlEOFhrQmtINVVTbEFabE5QWkFRcUFScjV2eHUxeWptSDBnaXZiWDBVUUtJNjNvMFd1bi94SHVSOEU0Vm5QSzVKUUxkNFZOdHRUQnZLMnVvaUtPVWYvZitHandNTkJoME5NVjZKMGMwTnBjUnY3bXJZdjNraDgvdUh4WXArYlZwd0xwM1I3c3RzMll6b3VTcTNLR2ErcTcreDdDbzRuYXpBZXJSS3NWbFYxUWl0RjU5ZHl5RlphWVkwSE11OW1XTDNndHZaWE1ieW1CSUZNWjFvdjJoMEIrTFRMaXN4Z1crRXE1dVU5MmlaNzJ1ZDl2dlIrNEpGcDROamtSaDJPTmkwT0IxL1VCQ2t2RVlSaGZ1TnM0T21oaGlQS25GUWx4NmFBak1uU1hKVUFBQ0FBU1VSQlZQam16MXc0MW5ud080Y0NJQnZCd1pnVEFPVUhScTNneURFeEQ0elJHVllFbnBtNUxxbVFjME01ZXNGdDdhY0ZsMFNsSGlCeHVUa1l4eGRhaWhVQzRRVlhGdTVGQ1VENVF0Smw4NXNqR0EwemlReHFldS9mZW0raHcwRjJmTExRR3hGbFlNUnZvN3YxV21JVnRwdDFERmtYdk9SN0x3SjJIU2t5b1ptRXlwb1ZWZThwN2I2cUVNbmlkR0cvVmwvTDJhUE9Jd3VBMXBBSVFFM0RBbUZhNGo5ZjdDUGFGcENIS3VqcjV4elplc0dkSHFBcUt6NVgrRkxSQWw1OGxlK2p1aStrVEJBTE1jZ1o3M0NEQmtwTjIvNytiZmNXT2h3VXlDRUFqUVRjQVZoS2Rqa1BjMlJhamV3S3l1L24xLy9xSmNBMnVoQk1SR1hRT2NuOVU2SklPalhIUXFTWU9zVm9RcDFITmdBdno4eW55ODBINVBWejlINlJxVmQ4NDlXdFhRL3pBME93MmF5R0xKNDc0TDBHNzl2dmJ1bHdrSmk4QkdDZzRTMDFTS3FvZm9OdlNJQys1emtoRlV1cFY4clVUcEpOMDZLcGFCa0ZRbTVNMUhsa0EzQXlNNS91OVpsMzh6cms2ZjBpVTYvNGhtc2NnSzVJU1V0Q1Rvd3lEcWI3VXh3c3FGSlczZm8vdmJ1SUJKRVoxWVJneUh3UUtOaTBLRWwxT0tUQ1pKZHh0UERuLy92OG9vYURhVmdxRnlpVEQySUtmY2paUzRGbys3ZytIWE9Qdjg0akc0REl6S2ZMelFmOEtWZkkvRk5LclE2aDk0dGZ6K3ZPQTljR0FBYnJweWxZMlNEbFZUVHQrdUNuVjMvVjNhN0RRUUF5c0pBd29iWkpnVVhpNzhRYXloZDgxMldlaU9BWnpFeVVpQWtITWV1NUJGNUZ3WlFBV0xQd2tua0xReTlDclBNeTgrbElIWkZ6dk4zVCtZYlYrOFg3YzY0T0hIaXg3NFY2ekl4QitSSjB3UStVVTk5MnRZb0Z5M2ZjWGNURHhRa29Qc0NVaEZJY3pLVkNlZ1NnNUI4QS9QSUxOOVp3eEJTeHRpS2lVQU9pN0pXMGRMVHVzdEY4QUdibTAvMW8zdmpqblNHZGorbFlsR3dkUk84WE4rYzF3QUJJb0hrNms2MXl1U0NKSVRxM2pEWTlWeDBCcUsrK3V3QWZYNkprSS9oTUUwU0MxRUdndWlRK2lzcWNRUkxyRjYvMGpPMncrNkZNblpoeVpZc1ExVzUwcU9IZ1BYMU5YbmR0T0RzZmdNd0h6TWluKzArWk4wUzlZT2xsTXpXZkx3S1FTUzM5NlAzaVkza05PTERQTTF5MDY1SDRnT1czcDR1VERrQjh6V2RiN0ZnYmREaEVnSmtDVURSdm9nVG1kL3ZQdjNCVkFVQnV2eWxOekFBWWk0aGlzVlFuRUhvSXFXYmxyeHFtNE14OHVqZmxqVCtZanNXQllnSU9jMG9KUHNxMXNsQ3BINzFmS3liSk9Fb0F1dVZUUlNDbllsbVU2UC9aNGlTSkVjYkx2K1l1OS8xRUFoN0pLRVhES3hxNENoVWlLeW1SYndqZ0hkY1VXVEFSZ0xZWEhTcjJMT1UrQlY3TVZ3enh3T2ZrT1d5YllBR1pENWlSVDBlZGpweEQ2VmhjT1E2ajk0dFA1MXdkT0hCZE1lWGE5T3FXUmNtV1hBMVhMVUlVSDZ6eUN3bEFzM3orWUJrZnMxdStWSWVqSkVGM2NrcmpJOVQweS9hTUEyKy90Z0FnMDhWVVJLVDh2YktNVWdBTUlHenpBY09pNUhrbkhRQXo4K2wrTVcvODI5S3hodEg3dFR6K2pJTUFKUENZTVVMQVdkNmZ2aStFWTlvdW9aQk0vS3gvNExVQmdGTGdOQzVvMTZGckU4SkpWSmdraUZoYVFRQnYzK2RWYk1yV1ZzQzhVeEZSa2pqYVZzVzJEdFJkT0ovdkF5b2hWWUs3QStiVHZUZGo4SGxxVE1jYVJ1L1h4SGt6amdOa0lPV3VEcjhqbllZREtEdXRncFVocmEwdUFsQXlDQ1VBSzhCWGNqQlhnTENrL2gwRC9oY0J5RHhGQWRBem9GVXFVQllSSlRVY01XZFBQN09OTDZpNWJMUWVBTEpSUStiVC9XN0c0QXVBT1hxL2xzR2RjUmdBWStnbExrWWNsSlZUc2E2cHRDWDN1UWpBS0lOUXN0RnJBWktJd1d4UUloSUp1b3ZCL054K3IyTHpGQ3dsajhZMGV2bC9NWWswa2llVnRjdnJ3R1VuSFFDVmpqVmtQbDNtSXRRc0lQdUVseDlHNzlkT3pEZ01nR2tBV2xOeUJKbjh4S3ByQlJDK3pnRW80TFdSZ2NkVmNPQ2pqbE52bXg4NERyek5BYWhhRlpXTHlnS1d4VU5pYkloVGNQRDlCTUxMYTY1YnpyZUFNU0dWb1h2Si9DZ2gxV1VmTytYVFpTNUNEWURzOUdIMWZuT3JJRGNBa0FCVFREQ0NMWUswQ3dpLzU4NldjS0pVaUVwQzhDQ0JZRHNpaVNwbHFVSVVtT2pmK28ydElpS1ZVSmJnVTV1U1dsNERXd1g0K1BjWG5yUUFUQk5TKzh5bnkxeUVvcGRjYXkrOTMweTVZaGdBZys5bjJPb1VlSTVUZFFlciszMmZkaG1Hb09CWmFuQm8rZzF5RUtVNGRZZ0ZTdnFCLy92WkJJQnQ5UnNoa1RiVzhaWloyaFVndkRMM2lVM3V1eDRMU0JNMFpEN2RQUm5USDA4VkFJZlYrMlhBT3VjUUFNdVZjS2ZGU0QvK0lBQUJzRW9Hd1lBb0haSUtFRVl4UklId0xTOHBVdWhqRlZzNi9aWmhJVld5eFZLQkJJUlhuYlFBVEJOUys4eW5JNHRCemtFQUN2K2NobFVWSUtFLzVjUkdzV21sS2ZJenVkYzNBUExRU2xnM0UyT0N5VlJjMWtwVTNEZ0JtS29Rc1d0bEJjc3dqUHUrbmZUWXRCTCtHUWRnT2YxNkdDWlc2cFhsQkNxV1NncUp5cG9PQUZmWFhEaWZid0ZKTHZpNUhBamxuVXNpSWU2QWpPcDRpUU5RSFJsVDJQbGdKQ1ViYmMycyt2L2hGd0ZiL3E3Z202SGxZcEJibVRWMnNzY1F5eS9xRkJqMnYwL2NBZHovSEdEN05EQTFBVXlPT1UrMUN3V09ld05qS2o2L08wM0YxL1d1dWdXNC9YSmdmQm9ZbXdER2RIN0l4QjVrTFBJQitJOEFmTndaZ2dhNWNrMmZKYkVtOFY5ek5XUGZyYXNiZ011UEFjdXNlSjhFeHNiOUZkQmhBKzdnYVFOS0I2VGZjZ0NZdWcrWUpUK2c4OWFvQkRNbUlNU2NQMTJ1VEtqMTN1RHY4enNLaWcvdUoxdVFPc25vam0zcUI1UDVBQ1JCSDNPaFB1enpSTjlEVjg4SHFRTEVXUEpudlR5NW5tL3QvMXM0QmN1U3BSWnRHQXU0Zmkrd3RCVllFeWNjcll3bjZoRjgvRmtKcDliS3hBS1ZGc24vZDh1cmdiSFBBOU5QT0VPV2w0KzJjZm9GSGhmVnJKVFpQS0hTajVkYU90dXA2SnlDcFB4OHJIV1JWUTdXT2xyWUNNeDhBSEl6bHhrQUxQRDljMFZCK3gvQTNFLytFMmZVWUhYZEY3S1RHd2R2VGQwQUhQOXI0UGdXWUcwS1dCZGZzQmRzTVBmUHJLS3NvTDlYQVZMQXZPMmZGeWxDRTRjS2xpeXJEVlpOY0dTMUNxRVloV0ZpQVpWK1hudGFVUmRUTG1wQ0VicGNoVFlMcWk2TnJrTUN6THp0NVhjNEh3eUptbWtKK1o3M2pRT2g0TldlRFVaaUsxSzA4ZjBFWHQ3Q01IVmF3SWs3Z2FWcFlKVUE5TEkxQW84YnpLWDFjeXRvRnRGZnBkQ0lXejdyZ3pIZ3RoOHUwb1BHRHdFVGM4Q0VNeVNVekZhaWtndGxwVzFUYThKcU5iYTdsVmxqU1JnVytRNlpQLzU3V1F2ajZmeWRCalhmQWpLYmdFdk1Md1dDdmhOb2lwZ05wblFzaGxTNElHRld6SWs2eWxXd0F6OTNFVEx4R1dCNUNsaWRMQUJvSU9TN3BtR2ZHKzMzWUFHNW1ORDBHOEY0Njc4dmtpUEpjek5PQUM0VXlRbTJOOHc5NGtpckZsZklBbDdpNDAyZDZkYlBXV0F0cnNqT0ZpdUN2QUpaT1FFMHBIVEZzY2tIWURlQ3ZoTmdpcFFOeG9BejgvOElQcjVuYnZIMmpkKzZBVGhKQUU0QXF3VGRaS0VCTERvRGdVNCtZVmtQSElCb1B3YXJlT3QvQmtEZXhzTUZBRm5iek5KWW0wSURuVndidDR1eXVyMWt3TDdUcCtpWk0vMDhXVDlSYzdESFVtdVlUci94KzZvNG92dnU5ZmpCYmdSOUp5QStvbXd3eHZaSTVVTGc2Wlc3eTlGUGY5UU53S20vQ2dDY0tBQm92aDhCeVZ5L1VDdEpxMmYrWDF5WUpQR1UyN2xJWkxidUVXRHNXQkhlc1plRHo0aVVSTFVXYTFURTQ3THFLMTJmWm1kM09YaWRGY3RxbTkyS2F0VnMxakFFc052NnNkeW1hYTJnOCt4VUw0SStQbjJiZUNnYkxHV0hJL2g4RzNvVHI0NWlLODZQT2xiQlU5eUtJL0FjZkxSK291UXdIOUJmbW1iTGxUSGJvT25aL1Q5KzV2YWY4RlVhQVRoWHNGT1E0NW1VY2daQ1dUQXhlMFVRK3VyWU1PMS8zN0d0eFFtb0xDQnRSU3AzMExyRHAyU0ZkellNZ2svUitWTnd2d1I5bXdRRHNhc3BHU2ZKZ1lEWU5UYnA4cHNDUUZKeEVJQmtRakRyeHQ4ZFhDVUlZK0NPSDVNVkZQaThTT24ybi9RWUxaOUdwMGN4QU5JUDVJdkFrelZ6eGl2UnlkbktOekJhOGZkZE04NGI2QUZ5QXJpTUYycGFqazlrWUllb0NsWG1BM0FRZ3I1TlFFSE1CcU1WRk1OYUlPYXlOUkwvdmhsSDNSWndtaGJRUVVjQWFzclZWR3o0RXRqQ3UvM2RmYi9JRDNQYlQ3dUtBWi9NaGNJQzB2cVJUbzRXMElCSUVBbUV0RndDWXFqVzAzYmNtZHdCWWVvV2dldFViclI4c25ybG9pUjJkcnBBQ2YrckQ0RDlFdlRWaklKdTdIQlYrNzgxWDc1MkN6ajlsd1Vaa1RFZ2NQb05QcDVOdjRvQlJoQ0c2ZGQrMURrTXoxSkloUjFCQUhKN3p3cU8zZklSUk01dG1ESzVDb1FLc1NnT2VCWUJLRlpVTFRxY0I5cjZOaTVLWW1kM1dLRFVBMEJsaE5MTThFYlQxUUJYQlU3MmFJNVpqVWNWT3h6N1dMa1E4ZDM3dnNhcnQvdUE2UmNQc3hOU0F0QVhIRFlOQzFBRXBmOXMwMWtLd3VCd0dVN0hnVnQvMWp0RDFlNjBmZ1FpZ1NlL2o1YlFwK0tZcEdCK0g2MmpUN1A4L1p5cEJJQzhEaGN4OGVZOXdGMDE1YWJobW5vQXlKNVdTcktlTmdLTzlTSHhuVC9MU2FzSkJpbTVsUmpXQkVJVmVST0luS0wxcXVueWJSYXdMZ0FTZEV5NzRxamFOTnpKQ2dxRUVZekJHdkswMjk3bUFGU0hFSUI2ZWJLRGdjOEoxa3NtVjh0MjlmMWVuNkw1djZjeElLNWlLNlhuZS81akNUaUZjVHFWbi9yL3RXRFBXd1huRVBUVmdJS1VIVTdsakFTYXdLZWZJd0RwTWRSeFJCK3dGZ0QrUlJFREpBQnB3U3p6MmMwTGZ4Y3pWamtWS3dhWWd0QkJlenUzU3ZYMDhkMzlQNXVPM1FLYWhYTVFjaW91clpSQUdLWldhci9ZWjF4WFJQZTh3UXIyQVVLN1R2Yk9WVFpCWHg0TUJFQ1JuQ29uVUJTRkVYVDZtZi9USysvcW16QUYvMFVCT1BxQlpZRjUySHJURkN3MkxINUc4VUN6SkVrbzVuWnFtUm5QaC91Q1htcG5WcERUc0lQUHdLQXBPYVNBMlFMRExTSGY5N2lQeDB0cElTTGZ6N2JsNGlGZnNVc25qK0haV0VlT1lEQ0RuRG1DdlprRWdlZGNDanhHc2VJaEJZdDN2eDA0OUh3TUxSaDhnQTlnaDJNb0g5QUJxS0p6eGYwTWNPN1hsU0FVNEh6aFlZRnErNUQ3aHdCdS85OE9RTGxJQkNLblczOVNsWE5ZK25xZWlxMmRrUWcrZ25HUGI5L1pwVDBscTZNVjVEOTZnTEN3Z0RtQ3diZG5DdlptQ2dZL2R4eTQ3eHhnNVNXdVVqaWdZUEhGYndBK2Z5R3dmcjJyWHJNdlBCK3ZwM0wzR0hDZ2k5Sk9IUUNrUlZQcHBlVUJpZ1hMRnlteWVqWVRCNFlzZ2ZBMjBvZlJBbFlCMEZmQWx2UXFQMC9Uc1g1UExPQjVETnU0NzFjbUl3aUJhUnd3L0YwMUorbXoycHFDaHhVTVp2cEpsbUJ2M2lUb2NzVzRkemV3ZmhrR0ZpeCsyZmViWERBZUpPL1lFSUxCQjdwVTFnOExRRm85OFFBU1ZHWU5RNkRaZkVHM2ZuRXFyZ0xoYmYvSFYxNWFuYmtGTkN2b2hXU2w5WFBRMlhUTS8yczNJNER3UElad0JFRGZnaXRIMEVrNk42eCt1L2lEN1Q0Zy9ZZEJCWVBwV0hFYUhscXdOdytBUWE0WWo1NEpySk8rYVFEQjRwdCtvQ0F5WXZPUEVJUURDZ1lmZUYvOVUzQWJBTVg3SXRBbFZ0QXNwS1pkejVTT2x2QTJwc3R4akVTM3dKKzkyTmdBR0syZ3dpNzhRb1ZmRWhCZVFBQ3FOTlAxUmRvQTE4a0tkZ0RoeGtVSS96S0lZRENucXl6QjNqd0FKbkxGT0VJVzdRRUVpMS8xWTIxeXdWZ2xDQWNRREQ1L0VmajdNNENWclo1QUtsa2h4ZVFVYXhCSTRudkZ6eGY4SWZDVkM0SFY3Y0M2WkVYNW5lbjNWWDF2QUdMWnE4eXNydkhZK1FCd2JHZkkyRTZKcEx2ZFgra3N0aHBVdlFybVgvc1ZER1pWVUpaZ2IxN3ZKSExGZUdRY21DZFZiNStDeGQvNXhqWjZRenpNTE9RQkJJT2ZUVjJQczRIRkhRN0NMUVVRbVVyVjByZ0tKTXNDanN4R0FxVG4vaHp3MEVYQTR0bkF5ZzVnYlRZQm9yS2tVeUxua0I5WVZoVHh1K2tUMTNpY2N3dHdkQmV3UEF1cytiMmFyOXhKQWFmcWZnTVFPNGRoK0o5K0JIZTVncVpaWnpZb2sxSkpVY3BhUjZicDkzUCtXL042cDBLdUdJZW1nRVdLZ1BRaFdQeGRQN05CTGhpSEtZSFVwMkR3cFo4ckxPRDh0bUpRVnBsT0x4QXFtYlJLQzZFRFlDNy9DZUNSUGNDeDNjRFNyc0lTcnMwNENQbTlBclprNTVVdktBc3BZTHFQYVBkUjQvSDBnOERSSGNEeVZyL1g2VmFiTEhrMlBoanBQVlpZN2Q1eHdGNkN3Uzl5LzRMYmJWeVFzRUtJdWZHaUtlMHAySnZYT3gza2luRjBHamhPUVkrb05SdGxqamk5VFFQZi9mT1Y5SVpZNEdxNEQ4SGd5LzRXK09vMllHNWJVVXkwNHZVY0xDcVNKVlJXc3pKYk5neFNtTWF1K3EvQW8yY0JSODhFanRPcWJnTldXYVRrSUZ6M1lpV3JGNG5BanROMG5CWnJKblUrLzhQQTNDeHdmTVlCNkxVcmEzb2dsTDB0cHM2d2xWaGE1ckxpcWQ5QWREZkI0SmU2VTBzLzBCWFREWWg4MFNyMkZPek5BMkFYdVdJc3pBQkwxSmFLV3ExUitud0dlTTE3T3NvRlk1WFRWdy9CNEN2K0RqZzBDOHh2TFlxSkNFQ3pnc3htWmxxOVQ4ZTBYR1V5YVVpemF2UHR4b0ZyL3p2dzJCbkEwWjNBOGUyRlZWM3g2YzRzcXdPYmNrZXloaVhBb3dVU0FEaEQxWGhjZURNd3gzN2x2VTRYeFZOMm4zckpJb2N5Z2tyL1ZiczdmZStFZEJMY2ZhWFhRM0lQV0lycEJCNlhsbndwUjc2allHOWU3L1NRS3phcnhNN3FKRmo4bWc4VWFyTVY5SVo0Z3ZOREQ4SGdLeDhIRHM4QTh6TUZBRm5QWVFQRGwwQ28yZzRmcERaTHFLQ3hUMC83ZmhKNGZDZHdiRnZoUml3UmdKcnVDT3dVZ0NwZUN2VWpabUVGeGhmazlXOTY5a1cvQjh4dktRcW5WZ2crQjZDQjBNc0k3UDcwQUhnbWQybjFOUTBydjdGdkFMSWxWWUs3M01uUUNETFRoU0dab0RwdVA3dUNldVg1bjh6cm9CNXl4VGhHblEwQ2d5Qk14WTYzQXEvNWFCSEc2RUJ2aURsT0xWMEVnMSswQUJ5WkxnYmwrSFJ4blpYSm9xcXR0QTRPRG92bEpaVnVTalRRRnRxK053TlBiSE1BenJhbWRWcFZzNndFb1B0ZE5nMzd3SmZ2c1lpSlA5TkZxdkhZKzd2QXdqU3d4QWVOeFZPOFQ2YU5WUlJSbFQ2aEhySjBPdmF3MFdESkNLbmc3Zzg2QVB2TkI5d2cySnZYTzMzSUZXT0JnbjhFSWYyblJMRDR0YmUxK0FVN3lBV2JaZXNrR0h3VmRkMm1nQVVDY05LbkpnTFFyWi9WOS9Kbm41SlVZbW5BRTNoQ212Myt0OEFXUWZTenlQSy9QT09nSmdEZHNncUE1bmZKQXZMZExWK2J6MGtLNFJxUFozd1FXSnh5QVBxRFZoWlF5UXI3Z3lhWEk5YXhXQ0ZWQUdMdlJVaFY0NlBnTG5VV0JzMEhiQlBzemV1ZFB1V0tzVFJaQUpEVG84bDh1aS80Mmp1TDV2ZVFDN1pwc0VvdytPclpRbHFWVnVINEZMQThXVnlEQU9UQW1IVVFDQVdRa09sc1FBd0R0LzkvQUU4U2dQUXBOYTA3K0FoQUE2SExYYmI1WHI0SWFBTWZ2L2VHdlA1Tnp5WUE3VUdqQldUV2poNDB2OWZTeXNjSEx0YXhoSld4RlZzTk5BWEgxa2h3OTgzK0RZUG1BNWFDdlhrZE5JQmNjZW1mY2Vvb0FmaEFBY0ErNkEyeEx1QUd1Y3hyemdLT01leERmVjlPd2JTMkJCL0JFb3FMU3JCb1lHZ0ozRThxTGNJRXNQL25nQ1B1VXk3UzEzTDN3YjZQVTU2L20vWGo0UHMwVEtDWFFBNkFYdU5lWlkzSE16NVFBTkFlTkQxa3djS1hsajZ3T1pRK2I3UitQaTBQRDBEZUZBZms1OTBDS2c4cW5jZm9GeklSVldWcWZGZkJoZ24yNXZYT0FITEZXQ0RidlBzdEJzSlo0TFVQdCtqZGVzZ0ZnK3FWcHRXcTExYmcyZ3RnZnVMaVJBQWdRZWcrb0Vtc091anNYYjVTc0FvQ0lOLzN2eDA0T2xOTTZZdjB0ZHgxTUt2SzcvVEZqVm1lQ0Q0SFFRUWhmMTU5ZVY3L3BtYy9rd0NjS0FCb2VZdlIwb2VwdDdTRW9aUTBUcjFsUHVQUUZsQXRPMG55QWNXaHB6dy9GU2pGekdqTHgrUkd2eHpvU2VDMWh3c0E5a2x2YUZONUZBeSs5bUpnbmhhUTBxcWFnZ2xBRG80YzlBaENEcEpQbDVab21tUTg3MzhIY0d3NkFKQlcxVmVjWnYwY2VQd09ZMC93bDFsQUQvV1VDeDBtTWxETHI4YmptYitEd3AzeDRua0RZYkQwdGhJTzVhTnRmbURpL3hHRWVSYXd4aHM3VmIvcTJodUFCUUp3QWxoeXkyY0MweG9nZ2pBQVVDV1dBa2tzT2lJWTk3OFRtT09xZXFxd3FBeDNXR2hISzA2bjdURHdPY0FWL2lpcFBBS2p3Z3JabTJvOG5rVUEwZ0ttQUhUcnArbzlNVHJFWXZxNDRvOXBaSU90Z211OG1hZkNWNzJZQUtUL1J3QXk1T1BPdVZsQUFrOU91bGU2eFFSVFdVS2xXdGtVL0l2QUhBSHRpNW9Jd0RLODQxWlBGdENtZHIwVThQYUM5aFZ1bHRkNENJQzhQMlp0dC9tNS9xQzExVEpYbEpER0dwZkdBbVlPRGdGb0N4QUNrTHB1V2gzS0NncUU4Z05WWks0S3R4Z2pKQUIvMlgxS3JhbzFyZk43Q1daZjNMU0JUNHVBRUl5V0JWcGlwTDdHZ3dBMEFXMjVHYkdFTkJUUngzcm0xTTJ3MzltbXJGVndqVGQxS24rVkFaQUxFRTVMdElEeU1XVUJ2YkxOTEdIZ2Q1SC9WMDdCRHA3cjN1VStKYWRnbjNwdHhla0E1TUJyaTAvV3A0d3pCakRiQ25rTVdNcVZwRThHSndMUXF2ZmMwcHFia1ZqNWFOazdnYkN4Z0pubzMwY0FqbnRvd3RYTmFaMXN1dlNLTmhzWVRjVkttdzlGNXhHRSs5NGRmRW9QK0pZaEQvOE9DOGVJUFVzVUhva1ZWS0I3OFhzemJ6QUY0UHZkLy9QQ0tWR0lwT0FyNzhtbjREWk9tOFlDMWpjbyt3NkVGVEREUEpxZUNFQlpCYTVHZmZWYmhtUThEdFpXNVRZT3ZQaFhpcDBHVHV1MjJsVE1MU3crYUFWbDlRaEVXanVySS9hUWlMSmtUTUxzWDlSM3IveW1aNzNmcDErMzdPVTlodW5YU2tkbDdUM1FyaEtDdGxDTTU5azJpNUNNTVNJQUdkcXhFSXdybXB0elRzQ0V1dDV5aWxLb0pMQWN4Q3EzZmU4dExDREJGd08rdEtqeXV4U0NNZFlFWG9lRHJIY0h2dTB0VHdMem13SEE0Ti9HaDZ6TkNxcWVPU3hDMmxiOHRRU2lNd2J1cVhJcUFjakZoMkpqQktHSnlTaFFHNnlnVmJmSmVnVUxXQlljTVIzcnZiNm9DUmFRd0ZQZ2wxTTVyUjcvSnRCWk9JWld4LzArczRRZVk1ei8xL1gydEZuQXhQcEZFTGFWa2RMTjhNV0dWcjRwQ0JzZk1ITjhibVRLZkNqWjBOY3A0NTYveDU4ekx6Znc2UWYzQUJkOHBVZ0VZbXFrNWJHeWVrMDZJUWwxYmtYU2NubE4vdThMMjRHZHgxcVZxOTFLUXZycGd3YUFBdzlwK3duWFB3MVlqeVdNR3REbzJBU09GR01VN1NJRVV6ZFlEMzR2TVBtWHdMYkhnZGtGWUF0bEdpaW02RHB4SnR2cTlMdGxWci9hV0tFQjhwVVhBT09QQUZQendCVFo5cjA0dmRROVRzNHBBWjNjZCt5SHhnZk1BT0grdmNBNjkvOVV4aWptei9BZXJZcGRhcjFsTlNNWXpWK3ZXWS8zNEk4RFk1OEdwaDhCcG84QTA0dkFGRUZJa25JSG9oR1ZSNjJRaEZSU1lqUUU2cUZyaTJ6M2lhUEFoSE5ObHhLd0FySTBRMUlBeHdmUmVhY2JDNWdCUHA2Ni81SUNnTEtDdHFuc3JLS2xyRlpVRlBLT3I3b3NNVHRkc3h6cVFSWjkzUTFNUEFSTVBsbG9oVXhScWtFSzZnU2hPUDBTK2RZMmhsUnY5OXkrb3ZSaTdJaVRuVHZMcW1nNnhEUFlwcUFVZ1Jnc29SN014Z0ptZ0hEL2M0RTFGWHU3RlJSYnZFZ2Q3ZXZYV2xiUHBwOUVnVWppSnB3ZTZ6d09NbHZwQVdDTVZ1c0pZUElZTU9sU0RaUnBvR2lOeEt6YmRJUWxYT05NV0piR3R3NHN2ZGd6M0VsNDduelRSdlBycktwdEFKVDZacnpmaW50dkFKZ3g0dnN2ZFF2SVhLNVZZRjNzVVp4bUpVdmdBMUZPdndGOHNwS3lCdE0xeTZFZXBJNExxVk1lZGJFYVRwMEVJS2RQS2g1RnFZWXFTeGdvMmpnRnIxM2o2WFhIbk9pU1pPZUJWU3Z5QzhxQzJyMDVGVnZWdzljQU1BT0ExNzhBV1BNcDJMSmFhZWtpQ1BYRXh3SHc2NjBuMW9CL25pR1FhendPa2tTZXBiSi83MkkxeDRDSitjSjZsWUkxcmljY3JWaWNVdVZTbUlXODJwa3duSEhWT0tiRnNPb3pRR2tGa3dld25CRVMzN0FCWU1hQVgzOVpBVUNDYjgybklsbys0MHAyZ05udnNvS3VueEgxeEd3QS9MT3pkUU9RSlBJdUh6VjJHQmc3Q293N0FJMGwzM1hmak9zdjZvVm9kZXM2SVNiQnNBWk1YK2tKeFU1NktZN3BrbUZWaE9jaXV2VHpTdDA1djArcnl1VC85Z0RyWk5lNHdQTXNJN1ZKUDNHY1A3Z1VPT2R2Z0wxclJZSjBaSTVJVjNoVjQvd3JHWVBQVTMvQWlSaFl1c3kySzdtVTk5OVArejkwT2JEN0x1QlpLMFhka2VxOU5TWDIrbzRITHdmV2xvcEZDQzBmZ2NpQk10QUZDOENHcllYVm9Wam5VMkc3clRYcnpoNGtmUnpMWTFreUd3Qm9laUdjUGlYYjVlQXpkWFduYXpQQ1NTY2I0ajN4Zm1hdjhDeDJwNTBsQU1XMFZYSU5pdENvZ2wycjlIMmRjY3RXd1F4UXNuNlpUQmJNTnRjZ2RLSWJpWmo1MVZjQmszOENYUHhvUWNmQ1VnOHBqY1lnWlNjdy9tb21BQ25YeXI0bGVCaHM1UWFCVEhwZjdYOGRNUFlKWU84WGdBdjllOFFKbEFaWnE4RDR4U3VBTllLUEpRbjBBUjJBSEt5MU1BQ0tlOW5mRkk2SUVxZHVFV29ISUo5d2xzVktMZWtvTUNhOUVBZWdTVFlRZU00VFhjbzJTRU1rQUhFYkJab2o0YmJZdGR5Q1ZyRnFHWGdUU3hnWFlUWmVITGk5QU1qRVFSQ1ZVWFAvbjRLVWFhVDh2VlRpK1J0ZzdHUEF1WWNBV2xNQ2dVVmtRZkoyUTEyeUJ2UFhNd0hJbWhEV3dmODFpbXNUaUxTRXZIWmtyK2pZL3A5Q1FSRDRwOERPQnd0ZUl0YWkwNXFuMzFGRmRmTGxGeFlXZ0NEVUlrUmtqL1R4YkNFaS84OWpmUFozWDJWcVlTSlFibVVOUVkzSFFUN2hidjJzTG9lclZ3S1FITkVFb0NzbThSNE1oUFJqWFVHelZFSUtJb1k3eWFFWXVZNGRnR2I1UlhydW9TZ3RTQ0xMYXJrSUNROWY2UU55a0dqRmRqc0lCYUk0a0dsdDhXK1JnNWcwSEo4cUFwNDduaWhBekZwdVd0UElNQlpKbEFTSUx2UjZmUTBEQ1ZiSkNrSk9KQ3FuazRwR3BiOTl0WjhNb3B5aUtEWDdXV0Rpd1lLWGlFUU9laENyZ0toK2VKUStFUUhvMUxieS96Umx5ZjhUSWJmOVhTNWZ0SWI4STkyWXVnSDRheTJwTHVzb3JsN2RBb29uV3RNd1FTVGRPRnVRU0xUR0h5SUM4a3hTSVF1QTRod1UyV1VBb080L2dyQmNEYnNmV0VsU3pnK0pDb1lEb0VHTTFpeFNrSHpnRi93Rzd5OHNJYTNKN0pQQUdXdUZKU1FJYVUwMWlKSFVpWVA0ZTMzQnJQT0htRy9KTWFPZlRaVllSaHdHYXY4N3ZXS1BKOS9yU0g0SU9HTzVzSVRxZy9nZ3hYczRUT2FCQUVDYmVvT3NnZmwrRHJRU2hGcWNFSWh5eXQwTWJNdXNFa3g3NmlBWlhLTThCdlhpWkFHbEYrS2FJYmFhZFlwZW00YURncEpaUXo2WUpBQlY1VmNIQUpaMHY0RnhYNktHNVVwWXMwS25xamhSdWFnRVZnUGdsWUFsOWNpSGY4bWRVckpoMFF4OXZrREJ6Qnl3ZmJrWVFJR3dhaEEva2dsQVRzSHNEektBMEJBVGlQeVo0TkVEd0llb2EvdUZZS0tYTDJmMjRuUW9JZ2Q5UjN5UUNNVEZxd0lBZmRCV0k3K3lCNVpMRUNZTEVUZDg1WUpsKzJZQVVOb3NMSWVsL3hZbHU0SnNsNmJoTmhENml0NFdKQ3ZBMlpjNEd4bzczUmNnSmVPcUZtR1I2cmNDaExZQUN5R29qbUVZZGo1OUtuWit0SVFSaEg5SXZXQTJoaVJFakRlUkk5Q2x5N2ZNRjNFdFdSRmF3aFFJZjVJSndFNTZ3ZFRJWWR0N3RwOXlzMUs4Sm5vSnZvZDlXbjY4MlBOa1A0aFV5MW5kV2dzdEF0QkRNTFlONS82UEFjNURHTm9GNFNyWmZOKzQrSWhUOGpxd2cyQ3A4VGhJSjV2ZlNXQlhBVkNyV045U014REsrc2thT3Zob0FjOG1lNjU0cG1VQjNmMHd5dCtFOEZ5UkFHbVBsT0VvaVNEMnFndm1BS29PbTUyZkF1aVRESFN5SVJ4eCtsSTBReHhBRHViZkY1dmZmTW1TYWpyV2xQN25tWjNkU3krNHIvWnpBVUVIblE4UjcwSHNYbEsrUGdKc1c2OEc0WFlHWmowRVkyRVlBVENBVDZ0QWhtRTBEWGNDNGZhYXBjd01nQUlmTGIwa3V6VDlRbXc1dXdBQUlBQkpSRUZVU2krRWZlQUxrU3JwQm92YnJRRG5rbTh3QW84L0UzaStDQ3NaOThOQ3BBcDhjVWVrWnlCYXZJNEVUL1RuYUFrL1JRQ3lBWHk2dU5TUEEwaSt3TWVCNmVQQTVIRmdacTJ3cE5HSzNGVURBSG12M2ZTQ2U3YWZYOENCNFVORUVPb2xWaS8zb2Jhc3ROd0o5Y081Qk9CS0VRTXNBY2lmSFd6UkFpZ1dXQWxDbjVLMmJRWUFPZTFLTWpUSVIya1JVaEtWUzdJckxpYTB2KzN4d0hNWk1DYllOUDBLZkc3OXpBcUs1RHhPdnlFdVd1NlZENUtTSHkyWUFFUUFmcGFSZGw1VWt1VWN0SXBCbkNJSWw0cHNEMDNGdElJUDFBREFsQnVKTTQ3RXFxVVgzTFg5a1NCUWN1dXlmdEs3OHhVa0h5UStSTHFIWjNGdjFLY2dMajVrQVExczBRbzZJQTFuSGhOTFF6QThaeHZCWHVOeDhEY1M1VVlwTm5vWXhzQ25VSXF2Wm8wRjN3UFRNYTdIdjUzSE9KVmJTL2wrNWJ1bVg3ZCs1V0xFNDRoeElSSkIyTk1DcWo5aXh3dUU5MHN2V0NhSUE2YkFwOTU5RUtlV0NoQXlBMFBUT1YydW5HTVF2ZUNPN2JmcUhiY1M0ckpSN0V3cW53NUFXaEx1SW1nMnVGUUFYQVZzOFJHbW50VzQrZzJoQjNQNzlML0VKOXpHdnFyeE9QaWJpVmloQU9ncldRT2YvRUJmQmNzUE5CQnFXOUh2Nnp6R3FGem1vWHozQjlBZVBnWGlxNmJnaXY0WU9COVFIUzhBZnBrQUZNTWpyV0FjUUEwaU85WEppUXlBbm9zMnZWN0VTSE9PUWZXQ083WmY3RjQwbVpGUVNjUktBWUJhU1U2dkFWY1RnTjd4WEhpVUZwRFRNSzJkRmg1NjkxMkJUaURjdnBrQVRJWHpDTDRnM1dYVFo0anBHZmpvRi9vaWhMK2Z4KzB5V1VBQkx3SXd0WUtLSWFiZ0N6SFF2aTJnZ0JLbjBNY0VRRGFLVDVjR2tJT282U3V5WXpFZmpRQjBFTTVuWmdBUG94ZThvZjNzZ1NxQ1FNM2prZEZMdnBSdlIxMys3VVZSdWhVRlNhdk5PNm90d3A4OFpaMyt0NE02SEx0Y2g2T1Q5QUcvcTljbXRmLy9nVjFKRFljblEyelk2L1lha2ZTclUrUGcxTTQ1TnFQdDNJRXRvTTdXRkhva3lyV0trb29nbENNV0xZamlVWE10SzNnOFV6ZDFXTDNnRGUzdlJSQ29VRVlDd0d0WUZ4eHFnQTJFL2pJMjBGNWhobVFvZDk4QkhObmx4T1RpZzFhR2lEYW5PMjF5VjREeWdXdUI4WWVCNmZuQzlXRXRpS1ZWS2VFMFpHaVhXY3plSm9XTUlpZzVhOVY1REExQU5vS0RlRHlsWjlOU1h4eUFzaUthd3JRcW1DdjJIVmY1ZThhUm94ZmMxbjd4cytraEl0QVV2b2p2eVdyeXhWY1dKWmtzVlN5Wm9RUkEzZGNBb0h6YXg0R2oyd3R1NkZWS003Z01ndGkwMmpiVjQ3Nm9VSkpzMWovQWJBMW1RM1BtOGVUUnNvWkR0Uit4WktDaUVLbU1YVEllWEhQR2RoWUFyWDhGd0c0REdNRW5BSElLNHl2VDU4bldDMmI3M2NleGFaZ1dXYUVLZ1UxZ2pOYlBQN1B2T1lHc1VTQmt2M2hCdG1SV056eGpUazlSV2t0dnhwNlBPajB2QVJqWTlzV2tGZWw4Uld4ZWdqSUY0Ump3QU9uWldNUEJUR2pxdkhtc3p4Sk9CVUQzeHl6bkwyYnFST3ZvUDNOM3E4NGpHNEM3TS9QcGN2TUJlZjBjdlY5azZoWHYrMllubzVRZkdBclJiYUNDMG1XdjJZdEYzZWNlck5EaGtOWklJc1hRUnY1ZGxUdEdBREpTejJnRUUxRUpRTS8vMDI2SGRJRVpMQzhCNkEwdGswZzFKYThEdXpKZHBoUzgyUUJFWmo1ZGJqN2d4Wk41ZXIvSVpJKzY3cHNjZ0U3UWFET1VNeUMwV2I4K2dYanVSNEY1SjZZc2FYbkZoQm9BR0VWdlVoYjYwaklTZ0NRbm9oL09MQmd2SXJMOHY3RGRGa0VZTTVkdE5nOTd0dno1ekpxemRmSUJtSmxQbDVzUCtESlA1eHRXN3hmZm56ZWg3SCtaKzMrUnBreVdUMVl4dVVSSllWdHg2VDBmQ1RvY291UVY4NVZrSFJJR2VnRXVFdi9ZS3BrQS9KY2VWbUw4a3Y2dDUvOXB1NjJ0ZmlQV2NGUVZFYTBEWjlXY0xKRVB3TXg4dXZmbmpUOUlnWnlqOTR0L2xkZUEvUzl0TWFHYTlTTmRtc0l4YnZWc2NWSjFHU2NvTXQ0VVB3aEFzbU1aMGFYelFCc3ZkR1JCalF6MEZVcEVKUkFKUU9xNEtBbkJkeitzZmlQSjNiT1luOGZzeWt5VldNZmlOM0JPemNrUytRRE16S2U3T1cvODhhcVF6c2ZFNWtIMWZ2R2plUTB3QURvZG1WR3dPZWlNc1VxSHJHT25TNFVGeTlQL3dBRW9qa0VuSStJcU9JSlFOTGdwQ1hoY21MQXREL0Qra2dRRTIzNUw5M3RqK1lCcWdUWDlCaUNlVy9OZWRUNEFtUStZa1UvM3NienhCeW1RdVpobThnMVQrUWJWK3dXRmRqS08vVGUybUVGTmxDYjZnUEY3MDhWSjFUWEhnS2Q5MUduWnBEZmkxay9nTTJ2cVUzRFVuQ3VCbU5RZTNQOXZ3NnBlMjI5S092QjBLMWsrWlMrcm5yZk0yQWxBM0pNWnRhaC9FWktaVDNkcnh1RHoxTy95eEF3dTlKZ0p4cjNsUWZSKzhhYThCdXkvd2RXUVpBVmwrWnpDckczcTljL1lya21IeTNJUllyeUFBcUFrRUJJbG9wSnhOTlViRVIrZkEvSCsvK0FBZFA5UG1TOWRhemljSnlibTdtbEI4blIyZEkxSHZnVmtPbFpHUHQybk0yOUdDYW1jR1pqQXdsUSt2dnJWKzhYL3pHc0FBVWlMVlBwL3dkK3phVE1GV3crL2tBQTBHUVFucEN3NW1Ec0FNSXJjUkI1bUMvK01BZmZUd2dmd0tZMktmbUNaNlpJa1VTaHJ4WHhCWDR5WWFWOEh6bWNuMTNqVUE4Q01mRHFXWWVRY1NraFZPbDhVNnV4SDd4ZWtyc2c0OWg4b2lDRU5nQzVUVUc1dkt4eFQ4ZjJhUnRPdGNBS1Exczhzb1B1T1ZVSXdwY2hObEVFSU95TlNJcnJ2djNod25ja1dJWlBac25iY0R5elRwdmczbFU4bXBaUXFvenlmSzc0YWozd0FLaDFMZ3JzRDV0TXhpei9ua0dEMXNIcS9ZTkZPeGtFQWN1VzdvcW1YbGlzdVFPVDdWVjJqd2kva1RnajFSa29aaEJqZThaODNTQ0FFRUpaVzBDM2dmZjh0QURDdDRWQVNhV0lCSzBISTlxOEJGNXlVQU16SXA4dE54NUpnOWJCNnYvamREUFNSbnMwQldJWmVVaXRJbzlJaEhtaFhUdnpDUFFkZGNjblo3NlUxVi9JdkM0U0JDRnlnMjZERk5nN2MrK01oaGI2cWlDaWtUN1dWVW1yNmxZbjJuUkt5cmRaNTFHTUJsWkljMDdHVUJkTWpueTZYQ2lVbXBBNmo5NHZNWmJnQk1GbzU1MnB1MjdQWEFxWFR5QVVRY2l0T1FqQW05eFgwTjlwSXdJUG1TQ21INVF1UHFFUjBMNGtEWWdwOXpPVUw2Zll4a2JaY0ZjZXlBcmVBRjNHbFYrTlJEd0F6OHVrc25UM2ppSUxWU21wV05saE16ZStrOTR2TVpmZ0dBUEplSERqcENyZ00wMVRkcnk5T3p2bVlBekFxTFZXSXdFU2h3emJSd3dTRW4rTXFQNmJRSzV0WmxXeWhqQ0NDc0MxOVh2N2dPbkJSYmdwN2N1LzVBT3lWanFWTW1BNzVkSlo5bkhGMHlvaFdObGhNeEtuUyswWG1NdHdBbUZxNGltbllickVxTkpQYys5a2ZkNjJSS2gwT244cVY5aFhaOWFza0VQZ0FmSTU2emlvY1VnVmJ6R1QyOGxFdFJNb0t0ZzdsQkh0em5mWk5BK0NRK1hRV004azR1Z2xXSy9OTFlLelMrOFU5R1JlWEQwZy9UeXZoNE5lMTdZYjRaYnI2ZzZ5Ny9hTldjb1BwaktSVHNKSWFnczVJSndrRUF2NmVuMDVTNkdVQmZSV3NVRXhaeVZaVlFDUXdyZ043V2ZkZDQxR1BCY3pJcDhPRGVYZlRTYkJhNllZeGxZOC9wM3EvdWRjM0MralRidHZxdDJvYWRuQjJtNG9OZ01uMFcwcCtoWVdIV2J3Zzl5VS8wS2I5RUl5KzV5MmhpQ2l0NFVnS3lUZUFrTjhWYWxrNExlL2xkbE9OUno0QVdXQlJNNmZkSVBmSHN0dy9HK1NFNXJNblZRL2tBNUFrTEhTMGFrN1Y3cmVYZmhnQUNhQnFEdEQzZS9ubWM1azlrQS9BODBKUmVxK1UzOHpHVnAzT2JKby9CdkFPRDNkdHdpV2FyOXpFSHNnSElHbEZ1YnFTeDcrSmphMzZhbkxMY0R2dmd3QStORHBEZklMditxbHp1WHdBWHVTanJrS2VtbE8yZTNVMXVXVVluTDhkd0IvNWUyYXBjYTlMTnYrdnNRZnlBVWhlWDRWZ3VCK216SXNhRzludHF4aEY0WGJlM1FEK243L3VITEFXOXdRMXRibE1SUS9VQTBDYUhDN3BsWEVoK3E0VDBPV2NmaGxlWVRTSEJLMEVIL21pK2ZjUnVLUW40STZmV3Blb0I0QWV2Q3ozSE9PbTl5YjNGNW1CbFpCTmNsWUNqMWFSZnlmcmJnUENUUjZBeksrdkQ0Q3lnbFg3anBtTjdIWTY2ZDFFMGN0ZElyRUVFNHdFSU1sYW0rUGs3WUY2QU1qN0V3QVZiVTgydlRlckN3aEFYb3BKTjl6VkkrQVlyT2VVTExaZ0VyWTJ4OG5aQS9rQUpHV3IwbmFVV2RGcHkyY1Qrb0NXanBkakxGeEU1VXpZSUJCcEVVWDVuTG5sdkFrdGI3NlNQVkFmQU9VSHBpQU1tOTZic1Z0Q0FNYUtBTElDTXl4RHE2Y1hmeWNBK2IvbU9MbDZvRjRBaXFCUklFekJwNy9YMkFmMCtmaTFYSWlvTUlsQUkrQUlQSUdQbWVST1dWM2oxWnV2eXUyQitnSG9GZlppRFMybEMwTGlZNTJXVUFEa1FvVFRNSDFCRlNZUmRIb1JmS1N1NXY5cXJpek1IWVBUK3Z4NkFSaFN1RGNBenptRG81WkdIVDFQQUtZTXdReE1FMmppU28vZ0V3QnJycSt1NDFaT3krK29ENEJhQ2NzWFRQaVNJM2V5OHM0S0dvRzhRd0NNRk0rMGdnUWhMUjBCRjE5U1h1RC9heWFrejd1UjAvVHNNY3hnM1NqZnFXTkEwaHNyZ2Evb2phcS84V1BjQytZSWs0S2U0Q01TdUIyWFZodDFPajh6SWZYbFU4QnRVOERobVlSWFdkZnJkRjFmZ3IzK1M4QXQ0OENEMDREVmpYUVNETzcwUFRVbmFKNXVPQ3dzSUlGSFNTRnkxcEtQV0NEc1p4Q3B3OFVWZ0tTUHhMWE05MzdPenh4QWxqemNQQWJjc3dVNFFoNFYzVU44bUtvZUttL2J1NzhJZktKUWE4VkQ0OEN5bEhRaUwzTzMvcWc1UmYzMEJLQUNNdEpYalhLUWNmQlNLOERmcWMzS1ZDd3VOMlZGR1JubS95S1p0cTRSZTVpZnlRUWdNMkErQmVCM0dIYVpCbzVNQUl1ZTBsN0t0M2NDNHhodys1ZUw3VHVDa0prMWpCdHllcmJVZllHNUV4alovcHFyeEU1ZkFPck9xNVNtb3dWSXJScDFJeVQyUjYrZmcwYmdWWUc0Q3N5WmUyVXNhaU9HS1hyNFNmcDlrOEN4Q1lBRlNLeXZYZVkxbzFCeFF1eDkxeU10ZnNIUHV0Z25ueVV1VXZoYzBac2dVWGliK25Wa3E2K1pLYUFCSUhzZ1ZabnV3RDlzVm82NnJyUjRJbWRoTEdTUTh6UEwvSmdCUXhlVTFvdVdrTzlQVGdEemJnbVh4cnpNa2F0bDNrZWl2Zkc1eDRyNElSY3o1QmZrTzV2RVowa2dwSWZCWjh5S2psTDE3c3l5MHRNTmNPbjlkbDRGeTZkTEZhYmoxTXB2b3c5SWZ5K0k0TmxvOVh0K1pxVTlWZEpwcVpoNFFERHl4VXlZT1lKd0hEZytEaGdJL1dVVlpsN2FTRXQ5MytHTzlJYTJpdVpLT2ZBN2xocDlKcHZBVnk2MXcybU93TzVobUNnTUhDMUg5TzI0Z3U2VUQ5alArWm1idExSYVNzZWk5U0w0WERQYkFFaC9rR1EvcFNVY2MwbGJBcEZXYjY3bFFVaHBWbkxCc29LcXFaY2xGTW1VdHJ4UGN3eGwzWDd2T0NBdFlMU0NjdWdGUW1xaGRzc0g3SFUrUnpuamlPbFlYQTh3cWtPZmtJdFRBb20rb0t5Z2NhNEVTOGpZK04zejdmU0c0aGZVdHAzaWhVSHJ1VlNzRnkxaVJ2TlArMU43QTVCZEpBQ21WcEFnWlBoR095Q2lnRWpsUEx1ZG43a3ZGdE94dUI0ZzZPakQ4VVdMUmtDWkZSd3JMQ0VYSlFRaHAySyszN2xRZUJDUlgxQTdLUFF0bzFwckZFbVNZbjJtQjlFQXNPK2tZZms4S1FoWkY4eWpWejVncC9NenR5T1VqaVc5YkNVaEVCaEtSQ0NnU2lzNDV1US9QaFgveGZGV01nT25XdTJneEIwVEYvbzBrRVova0NETTFUcyszUkhZbndWVUw2WGhERnJBc3dmSUI2dzZQMU1yVHVsWTBzdW0xVklDZ2xLd0NFQUNxdlFGQ1VLM2dIY3NGUUNNL0lMYXlxUDFrOUpzaFZxcm5jTWFsT1lZdmdjR0F5Q3ZJd3VvZDhZQkpRbVpwbUdKZXlSd2tHdzRuOGpKT0pRTnczaWRMRmhNUk5CMFNnQVNUSnlLb3kvNGllWENlRmZKQlVlVjJTb0FjbEZ5UjBiYm0xT0hUVWlOMC9EVEF3RDd6UWVNNTJkcWo4VnNHRWtWRTJqS2V0RzdBRWhRMGZySkF2NlJDMHRyQzFza2wrSVdsTmluR0xiU2FaZzdNYzB4ZkE4TWJnRjFMUVYxejA4QTJHOCtvTTdQVkY5TXMyR1VFMGdReXArTHd1MnlhZ0xnUjlaYVlwa1N5cFE2YTZRMkRDcXpwa3ZpZXRYSUZkb1pmdWllR21jT0QwRGVQMEhFYkJoTndZUG1BL0w4ekpRc0FUQUtuZ3VFcVMrWFRxa0U0WWZXV3dDVUZaVGtzWUFZd1pmSUJlTjlUdzBjak93dThnRElacXNvU1N2aEVlUURpaUdZRm95V2lTRFJ5cFdnaTY5VVA1c2M1ZkljcXVTQ05lWHFlMlg5WkFIZk03S2hlMnBjT0IrQVQ0MSthTzVpUkQzUUFIQkVIZDljdHVpQkJvQU5Fa2JhQXcwQVI5cjl6Y1ViQURZWUdHa1BOQUFjYWZjM0YyOEEyR0JncEQzUUFIQ2szZDljdkFGZ2c0R1I5a0FEd0pGMmYzUHhCb0FOQmtiYUF3MEFSOXI5emNVYkFEWVlHR2tQTkFBY2FmYzNGMjhBMkdCZ3BEM1FBSENrM2Q5Y2ZPeHFZSjJhdTlSZFB0ZHAva2hvRU9sZ2xEWVQzOVYxUHpRRlhMc01YQWxndDlQQ3hKS1BidWZ5ZjgvS0hJUGZCUEFaQUJmNzlYYzVYUTBaUTFRNzM2ME5ieG9IcmxzRHZzNVpSc2dvMHVuZTA2Ynk2WDFtWnZ0UDk5UE5BcDRGNExzQlhBNWdqdzhFR1RlcWFHRjRRaHpRRjgwQ1g3Y0F2R0lkZURZQWZoZFoyc1RLVWNWcnBFN25kMzFONWdqOGUyZElvMm9zazdOWnBNZEswWjE5dHYrYko0RjlLOEQxQUNqOHlmTlNpa0hlZys1Wjk2OW01N1kvOC9aUCtkUExLWmhQL3JjQStBWUFGN2cxb1JVaEVNVXpGTXQ2ZVNKZlg3OGIyRGtQZk0waThHSUFYK3VXbEFNcHByZVVVRXJuOHAyZ3pUbCsyZmxnL3NEYlRrdklPaWsrQ1AyMC8vbXp3QVh6d0RjQ3VOVFBKZUZYcEVwTTZRRWpJSG0velRGOEQ3VDVnQVRZTlFDZTY5YUFsb1JUR3VsZkJFU0JTWU55eFI1Zy9CaHc3aEt3WndsNHZrOUxuTTVKbXNCelV5REdBWDNCOEcyM016L2c5QnVVYS8wSWl1dGZNa2o3endLbW5nQXVYU3ZPcFV2QVdZQnRGNEJUbnNwSWovTzh6UGFmN3FkdldJVHc2ZVpBMEpMUUVoS0VHZ3haaFVqL2R6M056U0t3YlI0NGV4bll2VktjeSttTTVLbTBKaHhJblV0ckdrbXpDUGljZzNXNUxNR2tRaVpaVG05eFM5WjMrNG0ybzhDNWM0WDE1cFRLVzJMYitmQ3g3V0x0all4enFpcWwyOUljdy9kQTVTcVlmNlJUVGlsZytsWUNJWG1JQ0tRNElLOXd4ZlNKWThBWks4Q3VGV0RuYW5FdWE5WlRBTXNhQ29nM0R0OTJPL012blJHQnRHd2txS1JtTUVrcUNhYSsyayswTFFEVGg0clA4OFVIajc0a0YxV2FBVG85UUhRN21tUDRIdWdZaHRFS2o0UEI2WlErRlMwaFFhaHBsZFB5YTFrWFRPcU5ZOERzY2dHK0hhdkF0dFVDdkJ4SW5pdHJrZ0w0bGNPMzNjN3NwQmRNM2tBdVNucTJueDlnUWZBaDRKeVZ3dnJ4d2VsMnozcDRhTWx6SDZETTJ6L2xUKzhhQitRL09UNEVFcWNrV1FTQmtHRDZFUUtRbkRDTHdCU25ZZ2NmMzJmWGlvR1VGYXdDNGVzeXU3Q1hYbkRQOXRPQ3N5RDRLTEIxcm1ndlg3emZidTJXRy9KdG1lMC8zVS92S3hCTkFNb2kwS2Nqa0FUQ04zSE9FcjNVQWpEcndPUDcxclhpeFlFa2VLTUZsU1g4b2N3UjZLVVhUSjdBYU5FMnRGOFdmQTRZZTdLdzFtd3ZYL3labitlS252Y3JmekM2SUsvT2JQL3BmbnBmQUdRbnlTb0lTQnFVWHlBQVNTMUFLMEpmYWdXWWNSRE9yQUY2NlR4WlFVN2pCT0ViTTBlZ0g3MWdjZ1hTRlpBVjU0TlF0ajlZY05JcGJPTkN5aDhZZ2k4Q1Zvc3BBcER1QjYzZzkyVzIvM1Evdlc4QXNxTTRnTElLQkJJSDhiY0p3TUNOTVg2OEJUcUJiOHM2c0dXdHNJQTZqd0RrNjYyWkk5Q3ZYakE1QTZOVmEydC9JQWljbkMvYUdWKzhUNzRJUVBtL0FtR3VCYys4L1ZQKzlJRUF5THNsQUtNVi9MZ0F5SVVJbmZuandQUXFNT09nSS9Ec3RRNU1yN1VBcU1GOFYyWVhEcW9YWE5sK0VRUTZOOXYyOWFLZGVzVXBXSlpiQVB5UG1lMC8zVThmR0lEc3NEaWQvcFVBU0N2Q2FYZ0ptRmd1QUVmZ0VYVDI3Z0RrdXdhVWcvbmJtU013akY3d2h2YkxoU0RMNVR3d3ZkUnFvOW9xSHpBQ2tDQjhVMmI3VC9mVGh3SWdPMDFUMUlNQ29BWnhHUmhiS29BWFFVY1FUamtJK2E0QjVlNUZ6akdzWHZDRzlnZHFyTEdGWXJwVkcvVXVIekJPdzIvTGFYeHpiaDQzREtlb0p3bEFIcUxuZFNzNHVkb0NvSUJIUUU0NUVQazNEdWl0bVlPUW94ZGN0cDgrckZ3SVdzR0ZZaUZGb0xHTmNoY0VRQzZlK09KQzVKMlo3VC9kVHgvYUFwWWRKMzdBeUpLL0RJd3ZGeFl2V3IwSXdFbi9IMU9wY281c3ZlRFVoU0FBRjRISnBRSmtXaXhwNmsybjRJWWZNR2YwYW1ESGV2Mkk4K2w0L1Vidk53OEVvenc3MndKZVBPSjh1bmQ3RWtLajl6dEtHQTEvN1d3QVRvNDRuNDVwV0kzZTcvQUFHUFdaMlFCa1lIQ1UrWFRNZkdHUW1ZSXhqZDd2cU9FMCtQWHpBVGppZkRyS3RUWjZ2NE1QL01seVJqNEFSNXhQRitWYXFaTEpGMVV6S2RQVjZQMmVMRERyM0k1OEFJNDRuMDdaTUFSYm8vZDc4Z011YldFK0FFZWNUOGU5WU9uMlVoZXUwZnM5dFVDWUQ4QVI1OU1wRzZiUit6MjFnS2ZXMWdOQXo0Z2VSVDVkVEVabzlINVBQUkRtQXpCbVJNOEJKenFmTGlZalNLS3IwZnM5ZFlCWUR3QkhtRTlYdFJmTXNJejA0YVFaMStqOW5weWdyQStBa3FzOHdmbDBCQ0NUV1JxOTM1TVRZTDFhVlE4QW8xemxBbkFpOCtrRVFHWlROWHEvdlliNzVQdC9mUUFjVVQ1ZEJHQ2o5M3Z5QWF4WGkrb0RvRkx5VDNBKzNSY2F2ZDllWTN4Uy96OGZnQ1FYL0xQUjNTT3prb241NWpnMWV5QWZnRDhNNE5jQVBENmFEbUJ0QjFlNE5NRE5jZXIxUUQ0QWJ3Ynd4d0RlNFV2UkU5d0haRzFnTlNYRExsd0xOY2VwMVFQNUFQeHp6d2o5SUlBUG5YaFQ1T1JjNUVZQ0E5SE5jV3IxUUQ0QW1SSDZGUUJNVFNaWkg5OFptRDVCaDVnMUZvcGlObnMxeDZuVEEva0F2QWZBRXdEdWRuSStFdlF4UGZrRXpZZmFDWFJTQmx1UU1CN1lIS2RHRCtRRHNCTkJILzkrQWtBb2JxVEFER0s3SW53MXg4bmZBL2tBN0VYUXQ4a2dyR0FHTWZCeFo1Q3Y1amk1ZXlBZmdMMEkrcjY4dVIwUW1VRm9CUVU4dmZOdnpYSHk5a0E5QU9Sb013N0NkR1FDam9VWkR3TDRrdi8rOE9aMWdKaEJJakdEZ01oM3ZUYXZCYzAzNS9SQVBnRDdKZWdqT0RmaGlNd2dvcWVKd05QUFRhQjZFenEvaHErc0I0QWNYZVhFUCtaaEdWbzl2UmltSVFENXY1b1BBWkN1cGdESTl3ZzgvcXovMVh6NTV1c3lleUFmZ01NUTlHVTJPcDRlQWNocE9JSlFRRXovVnVQbG02L0s3SUg2QU1qZ0d6ZGw2UXR5WDVqV2pwUUZldkYzbHEzeGY2eWhyT2xJQVVnUUNvalI4Z21FK2w5TmwyKytKck1INmdFZ1I1VUE1S1lzYytBWm1DYlFDRGkrSXZnRVFNb2IxWEJFQUhJYWpnQk1MViswa0Nkd3M2YUd1M3pxZmtWOUFHVHdqZnRnM0pSVlZSQXRIUUVYWC93YkFjb1hQNWQ1Q0lEOEdvSkt2cURBbG9LT29Jei95N3g4YzNwbUQ0emhhcXdqUnpDWXlRZzVncjJaZ3NGVEx3ZVdyOFhRZ3NYamJ3TFdybk50TWxLZ05vTEJtWkFhN1BUQ0F1WUlCbE12bFdRc3d3cjJVbFV3NDVqZERTeDhIYkQrQ3RkK0hWQ3dlUEtiZ0pWOWFBU0RNOFlnNTlUV0ZEeXNZUEJ0bVlLOTFJYk5PSGFQQS9NN2dVWEtYQTRoV0R6NzljQTgrVzBhd2VDTVVSaisxSFlmY0JqQllPNTRNTVkzdEdEdjhJM25tV1NIT3pZT0xKMExMUEdYQVFXTHozb0I4TVFVc0VhMTZrWXdPRzh3aGpoNzR5SmtVTUZnYnNObENmWU8wZXB3aXNzVlkzNGJzSHcyc0VJUmtBRUVpL2RjVTBTUDVxaEYxZ2dHNXczR0VHZFhyNEw1MTM0Rmc0a0FqdURRZ3IxRHREcWNVbVpFVHdBclp3QXJ1NEJWcXN2MEtWaDgvbzNGNHYwUVhaQkdNRGh2TUlZNHUzTVlodjk1WmgrQ3UxeEJjeHVPVS9IZmVESXE1Y3Y3RnV3ZG90WGhsQ0JYak9YWkFueXJPNEJWNmluMElWaDh3U3RMdVdDc1VBeXZFUXpPRzVBQnorNGVCK1IvZXdudS9rT1AvM0cvbDRrSlRFUmxsalF0SW90MmU1My9Jd08yT1BsNEZMdGNuQ3FBcDljYWhUNTZDQlpmK0xwU0xoaHoxTjVxQklQekJtVEFzL3NMUkhjVERLYmlOSGRCR0d5bU9DLzNoZ2xFdmdqQW5vSzlBN1k0K1hnaVY0elZXWURBcy9ldHhhdWJZUEZGUDFRa0x0Q0lQOG5lYUFTRDh3Wmt3TFA3QXlDL3RKTmc4TC94TE5CdStZQmRCWHNIYkhFRkFJTmNNVmFtZ2RXWkFvUnJmUGRYbThLaXRMZG1nWXZlV0FxKzJ5N2lNcWZ1UmpBNGIxQUdPTHQvQVBKTHF3U0QzK3k1VDF5STBBb1NiQXhNTXpHVjFvOC9NeTJybzJEdkFLMnQrR2dpVjR6ajQrM0FJd0RYdHdCclZKZXVFQ3plKzlhVzREdXQ0UHhrSWhZc2RldEdNRGh2b0RxY1BSZ0ErU1dwNE80dmVRNVV2L21BR3dSNzgrNnJRcTRZcTlQQU9pMmZBNC92QmtLdWRLVlU3Vlp3Nzd1S3ZXRnVaYnRjTU5iNXYwWXdPRzlnK2p4N2NBRHlpNlBnN2djY2dJeGxjQTVUS2hhRDAxeVlLQm1WRnBCWk1meC9tMkJ2bnkzdDhMR3FvcVRsaVpiVkkrZ01nSHduTUFuQ0lGaTg5N2NMQUFaNlF5ekZ6elNDd1hrRDFPUHM0UURJTDVYZ0xtazVKSGsvU0Q1Z0tkaWJkMzhWY3NWWUdtdUJUYUF6RUhMSGd5Q2Nhb2tCNy8xSWtVRVQ1SUt4d0Y1cEJJUHpCcWJQczRjSElDL0FhZXF2UEw5cG1IeEFFK3p0czZWZExDRC9sY2dWWTNVeVdEMEJqMVp3cWdDZ2dYQTdzUGZXQW9BSnZhRXRaQnJCNEx5eDZlZnNQQUR5Q3RtQ3ZmMDBzL05uT3NnVlkzbThCVFJaUFp1R0JVQUNkQXJZKzVsV0RxR21ZYklyTEhFeDBnZ0c1dzFPSDJmbkE3Q1BpelFmYVhxZ1V3ODBBR3l3TWRJZWFBQTQwdTV2THQ0QXNNSEFTSHVnQWVCSXU3KzVlQVBBQmdNajdZRUdnQ1B0L3ViaURRQWJESXkwQnhvQWpyVDdtNHMzQUd3d01OSWVhQUE0MHU1dkx0NEFzTUhBU0h1Z0FlQkl1Nys1ZUFQQUJnTWo3WUVHZ0NQdC91YmlEUUFiREl5MEI4WllOTWJrWCtaZWtwdUlpT1FyUGFyK3hzODg5SEpnNmpaZzVqQXd2Vlo4QitsbDlQbE81L0ZjL28rRUNqbkhmaTh6WWZrdk01dWxtcDRxSlhWcXg1ZGVENHpmQWt3L0NHeGRBWmdvSGZ1aDEzMVFrYUk1aHU4QnM0RHM4QjBBV0xuSVJHQ0JzRmZuODdKZmZETXdkak93NVI1ZzhnaXdaYTM0am5RUVV3RG85OXdCZko0VE03Q09pTmRsYWoyckEvamVWL3ZmRGVBVEFQNFVHSDhJMkxyYzZnYytTSHFZNG9NWjc0VlNLTTB4ZkErVVV6Qi9vQlVVQ0tNbDZ6U1EvUHNYcVpENUtRQy9BMHcvREV3Y0FjWVhnWW5Wd3Bwd0FEdUJrZWZuQ2ltOTBGbUJXWHduSzg3VWVuNTNCSThzYnV3cWF6OXA1VWduUWhCUytaTjF6RThBazB1dHZpQ3dxOERJOC9ueDVoaStCemI0Z0p6S1pFMVNFRlpaZ1M5LzJwV1IvZ1RBSjRISlE4REVNV0I4QVJoZkJzYVdDd0RxdXdRS3Z2TmdIWHZPY1lWYlBGSlBrdytkRHhDL1cxWTR0V0Rwdy9SbGdvNGxvMVQ0L0t4VGloRE5wSndqMy9VaU1MWGVtcHJqZmZDN2VXcHpETjhEbFlzUURpS3RWeHpFcW9Ia3lYOUhSaXpXK25JZ2FRbnZBaWFlQkNibUMwczR0Z1NNdTJyTWVQQVI5WDI1MmpYa2xhVEZVMTA4SzBNSGF2L252SjZaeFZWazlPSTdHUjJJWm9HUU5jL0hnYkhnSXdxSUxJVnVqdUY3b09NcVdGYXdDb1J4a2ZFSUI1Q1dna1JFQkNOZjl3TVRjOEE0UWNpQld5b0d6MTZyd05nYU1MNWVXS3BjdFlaTDNOK1RXTFgwZ3Z0dVAwSEhrMm4xNkpEeXhYbVZoZlUwcXl3YkpicjVHU3VYS3hBL3NWNVk5VVlXZG5qd3lTM3FLS2dhcldBNjlXZzZmalFPSUswSGFkbklqUFZGQitBaU1FNEF1aVVrQ0ZuRVN5Q1NrbUF1VTdDam0xNXdYKzJYMmlmQlJuOUE4bUtjVzJVRmpVTFZRY2dWRGw4MHU0MFNZaDc2M0ZmdnF1aExDeGl0b0JZVXNvSmZqWEt0dEJ5TXE5Q0tjSG40c1B1Q2JnWE5Kd3lXa0VDY3o1UTM3NlVYM0xObmNaeVFBQUFERWtsRVFWVDlmRmdJSnM2bEJCd3RuM1R0NkZwSXo0UldudVF4UGgyWElHem00Q3dROWhXSUZnQlRLMGdRSGlJQUpkZEtxMEVMUWgrS0wxcVVSNE12U0Vzb0VOSUtyZ0FMSE5pTW94Kzk0Szd0bDlxbm5NaW84TVNmNlNOd0dwWVZqQ0RrL0p1N2lzcTQ5NmZDcVgwQmtEZXFsV3dLd2ljMWdBUVNwekdSRW5GZ1JFejAxZUFMTHZ2cTJLZmk0NW02Y2YzcUJYZHNmeFJiSk1obzhkaW1xT2hFSzhjWFFScjlRVnB2UG9ETk1YUVA5QTNBQ0VMRnhQaCtqQUNrUDBmTElLRkNDUlJxS3VQVWRxamxDOW8wN0pad0tWTkhlQkM5NERRY1pPMFhBQWttZ290QWs5UVlyUjlmL0J2QnlZZk1TQVREVk16d1RYTU0zUU1EQVZBZ1ZIQ1o3L01hUUs0UVpVSGlOQ2JCUWxxVXc3NFlDYjdnY21Za2VsQzlZRmx3dlZ2N1JSQW9yVHVCa0VDVTlhc0NJRDkveDlCOTM1ell6eUtrcXBmaU5IeGNBMGdMUWd2QkFhUFZrQ3FtM2gyQXRDNW0vUnlFcXp3LzR4aEdMM2hEKytNbXNsZ3FDYmdVZkxLQWNScm1UbEJ6RE4wREExdEFYVWxXY0RtMUlPSUlKQWpsVC9GZDA1bGJGUUZ3amR0Z0djZXdlc0Z0N1JjL0d4OGlXalVDakdDVDFZdldUMU13Z1VxcmYzTkc0NXRUYmN1MGF4aW1XeDl4RU5jRVFIR2JjWUFFd3RTWFNxWTBnbkNkZ2V1TUkwY3Z1R3gvRlVHZ0Zod0VZclI4MFFja1dOK1gwZmptMUR3QVd2OFJnSkZpbEpaQnpuejBwUWcrQVpBQWxWV2gxR3ZHa2EwWHpCMGNDUWkzMGFTR1ZhOUFGNjJmTE9CN01ocmZuSm9Qd1BFUjU5UHgrbzNlNzZtTDVLd3AyRzU3eFBsMGt4YzNlcituTHZ5S3RMbWhmVUM3OFJIbjA4MU9ObnEvcHpjQVI1eFBSOW1SUnUvMzFJVmd2Z1VjY1Q0ZE5hb2J2ZC9UR1lBanpxZWp1bXFqOTNzNkEzREUrWFJVZzJWU0NqZGFHcjNmVXcrSStWUHdpUFBwcUpqTzhKMU53NDNlN3ltSHdIb0FLTUZkN1FFckFlRUU1Tk5KTWIzUit6M2xzR2NOemdmZ2lQUHBvbUo2by9kNzZvR3dQZ0NPS0o4dUtxWTNlcituS3dCSG1FK25vcVJHNy9mVUExOTlVL0FJOCtrRXdFYnY5M1FIb0VoWlRuQStuWXFTR3IzZkJvQXRhaXFCVUltZG01aFBKd0EyZXIrbkt3QkhuRStYMWdVelNiblIrejExd1BqL0FlQ3BQREQzdDdydkFBQUFBRWxGVGtTdVFtQ0NcIjtcclxuIiwiaW1wb3J0IHtcclxuXHRDb2xvcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0TmVhcmVzdEZpbHRlcixcclxuXHRSR0JBRm9ybWF0LFxyXG5cdFJHQkZvcm1hdCxcclxuXHRUZXh0dXJlLFxyXG5cdFdlYkdMUmVuZGVyVGFyZ2V0XHJcbn0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5pbXBvcnQgeyBDb2xvckVkZ2VzTWF0ZXJpYWwsIFNNQUFCbGVuZE1hdGVyaWFsLCBTTUFBV2VpZ2h0c01hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbmltcG9ydCBzZWFyY2hJbWFnZURhdGFVUkwgZnJvbSBcIi4uL21hdGVyaWFscy9pbWFnZXMvc21hYS9zZWFyY2hJbWFnZURhdGFVUkwuanNcIjtcclxuaW1wb3J0IGFyZWFJbWFnZURhdGFVUkwgZnJvbSBcIi4uL21hdGVyaWFscy9pbWFnZXMvc21hYS9hcmVhSW1hZ2VEYXRhVVJMLmpzXCI7XHJcblxyXG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcgKFNNQUEpIHYyLjguXHJcbiAqXHJcbiAqIFByZXNldDogU01BQSAxeCBNZWRpdW0gKHdpdGggY29sb3IgZWRnZSBkZXRlY3Rpb24pLlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2lyeW9rdS9zbWFhL3JlbGVhc2VzL3RhZy92Mi44XHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNNQUFQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbWFnZX0gc2VhcmNoSW1hZ2UgLSBUaGUgU01BQSBzZWFyY2ggaW1hZ2UuIFByZWxvYWQgdGhpcyBpbWFnZSB1c2luZyB0aGUge0BsaW5rIHNlYXJjaEltYWdlRGF0YVVSTH0uXHJcblx0ICogQHBhcmFtIHtJbWFnZX0gYXJlYUltYWdlIC0gVGhlIFNNQUEgYXJlYSBpbWFnZS4gUHJlbG9hZCB0aGlzIGltYWdlIHVzaW5nIHRoZSB7QGxpbmsgYXJlYUltYWdlRGF0YVVSTH0uXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHNlYXJjaEltYWdlLCBhcmVhSW1hZ2UpIHtcclxuXHJcblx0XHRzdXBlcihcIlNNQUFQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjbGVhciBwYXNzIGZvciB0aGUgY29sb3IgZWRnZXMgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDbGVhclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jbGVhclBhc3MgPSBuZXcgQ2xlYXJQYXNzKHtcclxuXHRcdFx0Y2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKSxcclxuXHRcdFx0Y2xlYXJBbHBoYTogMS4wXHJcblx0XHR9KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIGNvbG9yIGVkZ2UgZGV0ZWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXQsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZmFsc2VcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuQ29sb3JFZGdlc1wiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBTTUFBIHdlaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyA9IHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuV2VpZ2h0c1wiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIGVkZ2UgZGV0ZWN0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3JFZGdlc01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29sb3JFZGdlc01hdGVyaWFsID0gbmV3IENvbG9yRWRnZXNNYXRlcmlhbCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU01BQSB3ZWlnaHRzIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U01BQVdlaWdodHNNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbCA9IG5ldyBTTUFBV2VpZ2h0c01hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy53ZWlnaHRzTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSB0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMudGV4dHVyZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBTTUFBIHNlYXJjaCB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZSA9IG5ldyBUZXh0dXJlKHNlYXJjaEltYWdlKTtcclxuXHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUubmFtZSA9IFwiU01BQS5TZWFyY2hcIjtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cdFx0dGhpcy5zZWFyY2hUZXh0dXJlLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50U2VhcmNoLnZhbHVlID0gdGhpcy5zZWFyY2hUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFNNQUEgYXJlYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuYXJlYVRleHR1cmUgPSBuZXcgVGV4dHVyZShhcmVhSW1hZ2UpO1xyXG5cclxuXHRcdHRoaXMuYXJlYVRleHR1cmUubmFtZSA9IFwiU01BQS5BcmVhXCI7XHJcblx0XHR0aGlzLmFyZWFUZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblx0XHR0aGlzLmFyZWFUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50QXJlYS52YWx1ZSA9IHRoaXMuYXJlYVRleHR1cmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTTUFBIGJsZW5kIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U01BQUJsZW5kTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibGVuZE1hdGVyaWFsID0gbmV3IFNNQUFCbGVuZE1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5ibGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRXZWlnaHRzLnZhbHVlID0gdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHQvLyBEZXRlY3QgY29sb3IgZWRnZXMuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gdGhpcy5jb2xvckVkZ2VzTWF0ZXJpYWw7XHJcblx0XHR0aGlzLmNvbG9yRWRnZXNNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHR0aGlzLmNsZWFyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBlZGdlIHdlaWdodHMuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gdGhpcy53ZWlnaHRzTWF0ZXJpYWw7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyk7XHJcblxyXG5cdFx0Ly8gQXBwbHkgdGhlIGFudGlhbGlhc2luZyBmaWx0ZXIgdG8gdGhlIGNvbG9ycy5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLmJsZW5kTWF0ZXJpYWw7XHJcblx0XHR0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdHRoaXMuY29sb3JFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5jb3B5KFxyXG5cdFx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuY29weShcclxuXHRcdFx0XHR0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLnNldChcclxuXHRcdFx0XHRcdDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpKSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIFNNQUEgc2VhcmNoIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG5cdCAqXHJcblx0ICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcblx0ICogdGhlIGFyZWEgaW1hZ2UgdG8gY3JlYXRlIGFuIFNNQUFQYXNzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1N0cmluZ31cclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIGNvbnN0IHNlYXJjaEltYWdlID0gbmV3IEltYWdlKCk7XHJcblx0ICogc2VhcmNoSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgcHJvZ3Jlc3MpO1xyXG5cdCAqIHNlYXJjaEltYWdlLnNyYyA9IFNNQUFQYXNzLnNlYXJjaEltYWdlRGF0YVVSTDtcclxuXHQgKi9cclxuXHJcblx0c3RhdGljIGdldCBzZWFyY2hJbWFnZURhdGFVUkwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHNlYXJjaEltYWdlRGF0YVVSTDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgU01BQSBhcmVhIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG5cdCAqXHJcblx0ICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcblx0ICogdGhlIHNlYXJjaCBpbWFnZSB0byBjcmVhdGUgYW4gU01BQVBhc3MuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7U3RyaW5nfVxyXG5cdCAqIEBleGFtcGxlXHJcblx0ICogY29uc3QgYXJlYUltYWdlID0gbmV3IEltYWdlKCk7XHJcblx0ICogYXJlYUltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHByb2dyZXNzKTtcclxuXHQgKiBhcmVhSW1hZ2Uuc3JjID0gU01BQVBhc3MuYXJlYUltYWdlRGF0YVVSTDtcclxuXHQgKi9cclxuXHJcblx0c3RhdGljIGdldCBhcmVhSW1hZ2VEYXRhVVJMKCkge1xyXG5cclxuXHRcdHJldHVybiBhcmVhSW1hZ2VEYXRhVVJMO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbWJpbmVNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gdGV4dHVyZS5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dHVyZVBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wYWNpdHk9MS4wXSAtIFRoZSB0ZXh0dXJlIG9wYWNpdHkuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT10cnVlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkIGZvciBjb21iaW5pbmcgdGhlIHRleHR1cmUgd2l0aCB0aGUgc2NlbmUgY29sb3JzLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih0ZXh0dXJlLCBvcGFjaXR5ID0gMS4wLCBzY3JlZW5Nb2RlID0gdHJ1ZSkge1xyXG5cclxuXHRcdHN1cGVyKFwiVGV4dHVyZVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBDb21iaW5lTWF0ZXJpYWwoc2NyZWVuTW9kZSk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcclxuXHRcdHRoaXMub3BhY2l0eVNvdXJjZSA9IG9wYWNpdHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTIudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCB0ZXh0dXJlKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBvcGFjaXR5IG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBUaGUgZGVzdGluYXRpb24gY29sb3IgaXMgdGhlIGNvbG9yIGZyb20gdGhlIGltYWdlIGluIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3BhY2l0eURlc3RpbmF0aW9uKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCBvcGFjaXR5RGVzdGluYXRpb24odmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG9wYWNpdHkgb2YgdGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBUaGUgc291cmNlIGNvbG9yIGlzIHRoZSBjb2xvciBmcm9tIHRoZSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG9wYWNpdHlTb3VyY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IG9wYWNpdHlTb3VyY2UodmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7XHJcblx0TGluZWFyRmlsdGVyLFxyXG5cdExpbmVhck1pcE1hcExpbmVhckZpbHRlcixcclxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRSR0JGb3JtYXQsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7XHJcblx0QWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwsXHJcblx0Q29weU1hdGVyaWFsLFxyXG5cdEx1bWlub3NpdHlNYXRlcmlhbCxcclxuXHRUb25lTWFwcGluZ01hdGVyaWFsXHJcbn0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5cclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHRvbmUgbWFwcGluZyBwYXNzIHRoYXQgc3VwcG9ydHMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuICpcclxuICogSWYgYWRhcHRpdml0eSBpcyBlbmFibGVkLCB0aGlzIHBhc3MgZ2VuZXJhdGVzIGEgdGV4dHVyZSB0aGF0IHJlcHJlc2VudHMgdGhlXHJcbiAqIGx1bWlub3NpdHkgb2YgdGhlIGN1cnJlbnQgc2NlbmUgYW5kIGFkanVzdHMgaXQgb3ZlciB0aW1lIHRvIHNpbXVsYXRlIHRoZVxyXG4gKiBvcHRpYyBuZXJ2ZSByZXNwb25kaW5nIHRvIHRoZSBhbW91bnQgb2YgbGlnaHQgaXQgaXMgcmVjZWl2aW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBHREMyMDA3IC0gV29sZmdhbmcgRW5nZWwsIFBvc3QtUHJvY2Vzc2luZyBQaXBlbGluZVxyXG4gKiAgaHR0cDovL3BlcnNvLnVuaXYtbHlvbjEuZnIvamVhbi1jbGF1ZGUuaWVobC9QdWJsaWMvZWR1Yy9HQU1BLzIwMDcvZ2RjMDcvUG9zdC1Qcm9jZXNzaW5nX1BpcGVsaW5lLnBkZlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBUb25lTWFwcGluZ1Bhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFkYXB0aXZlPXRydWVdIC0gV2hldGhlciB0aGUgdG9uZSBtYXBwaW5nIHNob3VsZCB1c2UgYW4gYWRhcHRpdmUgbHVtaW5hbmNlIG1hcC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvbj0yNTZdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRpc3RpbmN0aW9uPTEuMF0gLSBBIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdHN1cGVyKFwiVG9uZU1hcHBpbmdQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IGx1bWlub3NpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0b2RvIFVzZSBSRUQgZm9ybWF0IGluIFdlYkdMIDIuMC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXQsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZmFsc2VcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkx1bWlub3NpdHlcIjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXIgdGFyZ2V0IGZvciBhZGFwdGVkIGx1bWlub3NpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZCA9IHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkFkYXB0ZWRMdW1pbm9zaXR5XCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldCB0aGF0IGhvbGRzIGEgY29weSBvZiB0aGUgYWRhcHRlZCBsaW1vbm9zaXR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzID0gdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLlByZXZpb3VzTHVtaW5vc2l0eVwiO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29weSBzaGFkZXIgbWF0ZXJpYWwgdXNlZCBmb3Igc2F2aW5nIHRoZSBsdW1pbmFuY2UgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMdW1pbm9zaXR5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwgPSBuZXcgTHVtaW5vc2l0eU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSAob3B0aW9ucy5kaXN0aW5jdGlvbiAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuZGlzdGluY3Rpb24gOiAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhZGFwdGl2ZSBsdW1pbmFuY2Ugc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsID0gbmV3IEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHV0aW9uID0gb3B0aW9ucy5yZXNvbHV0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0b25lIG1hcHBpbmcgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUb25lTWFwcGluZ01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbCA9IG5ldyBUb25lTWFwcGluZ01hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5hZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHJlc29sdXRpb24gb2YgdGhlIHJlbmRlciB0YXJnZXRzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHJlc29sdXRpb24oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS53aWR0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVuZGVyIHRhcmdldHMuIE11c3QgYmUgYSBwb3dlciBvZiB0d28gZm9yIG1pcG1hcHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgcmVzb2x1dGlvbih2YWx1ZSA9IDI1Nikge1xyXG5cclxuXHRcdC8vIFJvdW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgbmV4dCBwb3dlciBvZiB0d28uXHJcblx0XHRjb25zdCBleHBvbmVudCA9IE1hdGgubWF4KDAsIE1hdGguY2VpbChNYXRoLmxvZzIodmFsdWUpKSk7XHJcblx0XHR2YWx1ZSA9IE1hdGgucG93KDIsIGV4cG9uZW50KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy5zZXRTaXplKHZhbHVlLCB2YWx1ZSk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xyXG5cclxuXHRcdHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwuZGVmaW5lcy5NSVBfTEVWRUxfMVgxID0gZXhwb25lbnQudG9GaXhlZCgxKTtcclxuXHRcdHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhpcyBwYXNzIHVzZXMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHJcblx0Z2V0IGFkYXB0aXZlKCkge1xyXG5cclxuXHRcdHJldHVybiAodGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgIT09IHVuZGVmaW5lZCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGlzIHBhc3Mgc2hvdWxkIHVzZSBhZGFwdGl2ZSBsdW1pbm9zaXR5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBhZGFwdGl2ZSh2YWx1ZSA9IHRydWUpIHtcclxuXHJcblx0XHRpZih2YWx1ZSkge1xyXG5cclxuXHRcdFx0dGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgPSBcIjFcIjtcclxuXHRcdFx0dGhpcy50b25lTWFwcGluZ01hdGVyaWFsLnVuaWZvcm1zLmx1bWluYW5jZU1hcC52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0U7XHJcblx0XHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy5sdW1pbmFuY2VNYXAudmFsdWUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXRoZXJpbmcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kaXRoZXJpbmc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZW5hYmxlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGRpdGhlcmVkIHRvIHJlbW92ZSBiYW5kaW5nIGFydGlmYWN0cy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgZGl0aGVyaW5nKHZhbHVlKSB7XHJcblxyXG5cdFx0aWYodGhpcy5kaXRoZXJpbmcgIT09IHZhbHVlKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XHJcblx0XHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xyXG5cdFx0Y29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmE7XHJcblxyXG5cdFx0Y29uc3QgYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgbHVtaW5vc2l0eU1hdGVyaWFsID0gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRjb25zdCB0b25lTWFwcGluZ01hdGVyaWFsID0gdGhpcy50b25lTWFwcGluZ01hdGVyaWFsO1xyXG5cdFx0Y29uc3QgY29weU1hdGVyaWFsID0gdGhpcy5jb3B5TWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJldmlvdXMgPSB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eTtcclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldEFkYXB0ZWQgPSB0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQ7XHJcblxyXG5cdFx0aWYodGhpcy5hZGFwdGl2ZSkge1xyXG5cclxuXHRcdFx0Ly8gUmVuZGVyIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgc2NlbmUgaW50byBhIHJlbmRlciB0YXJnZXQgd2l0aCBtaXBtYXBwaW5nIGVuYWJsZWQuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRcdGx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXRMdW1pbm9zaXR5KTtcclxuXHJcblx0XHRcdC8vIFVzZSB0aGUgbmV3IGx1bWluYW5jZSB2YWx1ZXMsIHRoZSBwcmV2aW91cyBsdW1pbmFuY2UgYW5kIHRoZSBmcmFtZSBkZWx0YSB0byBhZGFwdCB0aGUgbHVtaW5hbmNlIG92ZXIgdGltZS5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy5kZWx0YS52YWx1ZSA9IGRlbHRhO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50UHJldmlvdXNMdW0udmFsdWUgPSByZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50Q3VycmVudEx1bS52YWx1ZSA9IHJlbmRlclRhcmdldEx1bWlub3NpdHkudGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldEFkYXB0ZWQpO1xyXG5cclxuXHRcdFx0Ly8gQ29weSB0aGUgbmV3IGFkYXB0ZWQgbHVtaW5hbmNlIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgdGhlIG5leHQgZnJhbWUuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBjb3B5TWF0ZXJpYWw7XHJcblx0XHRcdGNvcHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IHJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFByZXZpb3VzKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQXBwbHkgdGhlIHRvbmUgbWFwcGluZyB0byB0aGUgY29sb3Vycy5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0b25lTWFwcGluZ01hdGVyaWFsO1xyXG5cdFx0dG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuXHQgKi9cclxuXHJcblx0aW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHsgY29sb3I6IDB4N2ZmZmZmIH0pO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsIi8qKlxyXG4gKiBBIGNvbXBpbGF0aW9uIG9mIHRoZSBwb3N0IHByb2Nlc3NpbmcgcGFzc2VzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHBvc3Rwcm9jZXNzaW5nL3Bhc3Nlc1xyXG4gKi9cclxuXHJcbmV4cG9ydCB7IEJsb29tUGFzcyB9IGZyb20gXCIuL0Jsb29tUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IEJva2VoUGFzcyB9IGZyb20gXCIuL0Jva2VoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBDbGVhck1hc2tQYXNzIH0gZnJvbSBcIi4vQ2xlYXJNYXNrUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuZXhwb3J0IHsgRG90U2NyZWVuUGFzcyB9IGZyb20gXCIuL0RvdFNjcmVlblBhc3MuanNcIjtcclxuZXhwb3J0IHsgRmlsbVBhc3MgfSBmcm9tIFwiLi9GaWxtUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBHbGl0Y2hNb2RlLCBHbGl0Y2hQYXNzIH0gZnJvbSBcIi4vR2xpdGNoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBHb2RSYXlzUGFzcyB9IGZyb20gXCIuL0dvZFJheXNQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IE1hc2tQYXNzIH0gZnJvbSBcIi4vTWFza1Bhc3MuanNcIjtcclxuZXhwb3J0IHsgT3V0bGluZVBhc3MgfSBmcm9tIFwiLi9PdXRsaW5lUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBQaXhlbGF0aW9uUGFzcyB9IGZyb20gXCIuL1BpeGVsYXRpb25QYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFJlYWxpc3RpY0Jva2VoUGFzcyB9IGZyb20gXCIuL1JlYWxpc3RpY0Jva2VoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSBcIi4vUmVuZGVyUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBTYXZlUGFzcyB9IGZyb20gXCIuL1NhdmVQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNoYWRlclBhc3MgfSBmcm9tIFwiLi9TaGFkZXJQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNob2NrV2F2ZVBhc3MgfSBmcm9tIFwiLi9TaG9ja1dhdmVQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNNQUFQYXNzIH0gZnJvbSBcIi4vU01BQVBhc3MuanNcIjtcclxuZXhwb3J0IHsgVGV4dHVyZVBhc3MgfSBmcm9tIFwiLi9UZXh0dXJlUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBUb25lTWFwcGluZ1Bhc3MgfSBmcm9tIFwiLi9Ub25lTWFwcGluZ1Bhc3MuanNcIjtcclxuIiwiaW1wb3J0IHtcclxuXHREZXB0aFN0ZW5jaWxGb3JtYXQsXHJcblx0RGVwdGhUZXh0dXJlLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRSR0JBRm9ybWF0LFxyXG5cdFJHQkZvcm1hdCxcclxuXHRVbnNpZ25lZEludDI0OFR5cGUsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7IENsZWFyTWFza1Bhc3MsIE1hc2tQYXNzLCBTaGFkZXJQYXNzIH0gZnJvbSBcIi4uL3Bhc3Nlc1wiO1xyXG5pbXBvcnQgeyBDb3B5TWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcblxyXG4vKipcclxuICogVGhlIEVmZmVjdENvbXBvc2VyIG1heSBiZSB1c2VkIGluIHBsYWNlIG9mIGEgbm9ybWFsIFdlYkdMUmVuZGVyZXIuXHJcbiAqXHJcbiAqIFRoZSBhdXRvIGNsZWFyIGJlaGF2aW91ciBvZiB0aGUgcHJvdmlkZWQgcmVuZGVyZXIgd2lsbCBiZSBkaXNhYmxlZCB0byBwcmV2ZW50XHJcbiAqIHVubmVjZXNzYXJ5IGNsZWFyIG9wZXJhdGlvbnMuXHJcbiAqXHJcbiAqIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byB1c2UgYSB7QGxpbmsgUmVuZGVyUGFzc30gYXMgdGhlIGZpcnN0IHBhc3MgdG9cclxuICogYXV0b21hdGljYWxseSBjbGVhciB0aGUgc2NyZWVuIGFuZCByZW5kZXIgdGhlIHNjZW5lIHRvIGEgdGV4dHVyZSBmb3IgZnVydGhlclxyXG4gKiBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBAaW1wbGVtZW50cyB7UmVzaXphYmxlfVxyXG4gKiBAaW1wbGVtZW50cyB7RGlzcG9zYWJsZX1cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgRWZmZWN0Q29tcG9zZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGVmZmVjdCBjb21wb3Nlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gW3JlbmRlcmVyXSAtIFRoZSByZW5kZXJlciB0aGF0IHNob3VsZCBiZSB1c2VkLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRlcHRoQnVmZmVyPXRydWVdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIGRlcHRoIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0ZW5jaWxCdWZmZXI9ZmFsc2VdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVwdGhUZXh0dXJlPWZhbHNlXSAtIFNldCB0byB0cnVlIGlmIG9uZSBvZiB5b3VyIHBhc3NlcyByZWxpZXMgb24gYSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihyZW5kZXJlciA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIFlvdSBtYXkgcmVwbGFjZSB0aGUgcmVuZGVyZXIgYXQgYW55IHRpbWUgYnkgdXNpbmdcclxuXHRcdCAqIHtAbGluayBFZmZlY3RDb21wb3NlciNyZXBsYWNlUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlcmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGlucHV0IGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBSZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gdGhlIHNhbWUgcmVuZGVyIHRhcmdldCBzaG91bGQgYmUgYXZvaWRlZC5cclxuXHRcdCAqIFRoZXJlZm9yZSwgdHdvIHNlcGVyYXRlIHlldCBpZGVudGljYWwgYnVmZmVycyBhcmUgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb3V0cHV0IGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdGlmKHRoaXMucmVuZGVyZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIoXHJcblx0XHRcdFx0KG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZSxcclxuXHRcdFx0XHQob3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogZmFsc2UsXHJcblx0XHRcdFx0KG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBmYWxzZVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSB0aGlzLmlucHV0QnVmZmVyLmNsb25lKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb3B5IHBhc3MgdXNlZCBmb3IgY29weWluZyBtYXNrZWQgc2NlbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTaGFkZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29weVBhc3MgPSBuZXcgU2hhZGVyUGFzcyhuZXcgQ29weU1hdGVyaWFsKCkpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhc3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGFzc1tdfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucGFzc2VzID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGRlcHRoIHRleHR1cmUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdGdldCBkZXB0aFRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhcmUgYSBzaW5nbGUgZGVwdGggdGV4dHVyZS4gRGVwdGggd2lsbCBiZVxyXG5cdCAqIHdyaXR0ZW4gdG8gdGhpcyB0ZXh0dXJlIHdoZW4gc29tZXRoaW5nIGlzIHJlbmRlcmVkIGludG8gb25lIG9mIHRoZSBidWZmZXJzXHJcblx0ICogYW5kIHRoZSBpbnZvbHZlZCBtYXRlcmlhbHMgaGF2ZSBkZXB0aCB3cml0ZSBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogWW91IG1heSBlbmFibGUgdGhpcyBtZWNoYW5pc20gZHVyaW5nIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBjb21wb3NlciBvclxyXG5cdCAqIGJ5IGFzc2lnbmluZyBhIERlcHRoVGV4dHVyZSBpbnN0YW5jZSBsYXRlciBvbi4gWW91IG1heSBhbHNvIGRpc2FibGUgaXQgYnlcclxuXHQgKiBhc3NpZ25pbmcgbnVsbC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCBkZXB0aFRleHR1cmUoeCkge1xyXG5cclxuXHRcdHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlID0geDtcclxuXHRcdHRoaXMub3V0cHV0QnVmZmVyLmRlcHRoVGV4dHVyZSA9IHg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gb25lLiBUaGUgRE9NIGVsZW1lbnQgb2YgdGhlXHJcblx0ICogY3VycmVudCByZW5kZXJlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgbm9kZSBhbmQgdGhlXHJcblx0ICogRE9NIGVsZW1lbnQgb2YgdGhlIG5ldyByZW5kZXJlciB3aWxsIHRha2UgaXRzIHBsYWNlLlxyXG5cdCAqXHJcblx0ICogVGhlIGF1dG8gY2xlYXIgbWVjaGFuaXNtIG9mIHRoZSBwcm92aWRlZCByZW5kZXJlciB3aWxsIGJlIGRpc2FibGVkLlxyXG5cdCAqXHJcblx0ICogU3dpdGNoaW5nIGJldHdlZW4gcmVuZGVyZXJzIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgZW5hYmxlIG9yIGRpc2FibGVcclxuXHQgKiBhbnRpYWxpYXNpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIG5ldyByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtXZWJHTFJlbmRlcmVyfSBUaGUgb2xkIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cclxuXHRyZXBsYWNlUmVuZGVyZXIocmVuZGVyZXIpIHtcclxuXHJcblx0XHRjb25zdCBvbGRSZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IHBhcmVudCwgb2xkU2l6ZSwgbmV3U2l6ZTtcclxuXHJcblx0XHRpZihvbGRSZW5kZXJlciAhPT0gbnVsbCAmJiBvbGRSZW5kZXJlciAhPT0gcmVuZGVyZXIpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuXHJcblx0XHRcdHBhcmVudCA9IG9sZFJlbmRlcmVyLmRvbUVsZW1lbnQucGFyZW50Tm9kZTtcclxuXHRcdFx0b2xkU2l6ZSA9IG9sZFJlbmRlcmVyLmdldFNpemUoKTtcclxuXHRcdFx0bmV3U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcclxuXHJcblx0XHRcdGlmKHBhcmVudCAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0XHRwYXJlbnQucmVtb3ZlQ2hpbGQob2xkUmVuZGVyZXIuZG9tRWxlbWVudCk7XHJcblx0XHRcdFx0cGFyZW50LmFwcGVuZENoaWxkKHJlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYob2xkU2l6ZS53aWR0aCAhPT0gbmV3U2l6ZS53aWR0aCB8fCBvbGRTaXplLmhlaWdodCAhPT0gbmV3U2l6ZS5oZWlnaHQpIHtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRTaXplKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvbGRSZW5kZXJlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IHJlbmRlciB0YXJnZXQgYnkgcmVwbGljYXRpbmcgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG5cdCAqXHJcblx0ICogVGhlIGNyZWF0ZWQgcmVuZGVyIHRhcmdldCB1c2VzIGEgbGluZWFyIGZpbHRlciBmb3IgdGV4ZWwgbWluaWZpY2F0aW9uIGFuZFxyXG5cdCAqIG1hZ25pZmljYXRpb24uIEl0cyByZW5kZXIgdGV4dHVyZSBmb3JtYXQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSByZW5kZXJlclxyXG5cdCAqIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwuIE1pcG1hcHMgYXJlIGRpc2FibGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBkZXB0aEJ1ZmZlciAtIFdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGhhdmUgYSBkZXB0aCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBzdGVuY2lsQnVmZmVyIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVwdGhUZXh0dXJlIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIGRlcHRoIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7V2ViR0xSZW5kZXJUYXJnZXR9IEEgbmV3IHJlbmRlciB0YXJnZXQgdGhhdCBlcXVhbHMgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG5cdCAqL1xyXG5cclxuXHRjcmVhdGVCdWZmZXIoZGVwdGhCdWZmZXIsIHN0ZW5jaWxCdWZmZXIsIGRlcHRoVGV4dHVyZSkge1xyXG5cclxuXHRcdGNvbnN0IGRyYXdpbmdCdWZmZXJTaXplID0gdGhpcy5yZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xyXG5cdFx0Y29uc3QgYWxwaGEgPSB0aGlzLnJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYTtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCwge1xyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdGZvcm1hdDogYWxwaGEgPyBSR0JBRm9ybWF0IDogUkdCRm9ybWF0LFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZGVwdGhCdWZmZXIsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IHN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdGRlcHRoVGV4dHVyZTogZGVwdGhUZXh0dXJlID8gbmV3IERlcHRoVGV4dHVyZSgpIDogbnVsbFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYoZGVwdGhUZXh0dXJlICYmIHN0ZW5jaWxCdWZmZXIpIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID0gRGVwdGhTdGVuY2lsRm9ybWF0O1xyXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkVmZmVjdENvbXBvc2VyLkJ1ZmZlclwiO1xyXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgcGFzcywgb3B0aW9uYWxseSBhdCBhIHNwZWNpZmljIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQYXNzfSBwYXNzIC0gQSBuZXcgcGFzcy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2luZGV4XSAtIEFuIGluZGV4IGF0IHdoaWNoIHRoZSBwYXNzIHNob3VsZCBiZSBpbnNlcnRlZC5cclxuXHQgKi9cclxuXHJcblx0YWRkUGFzcyhwYXNzLCBpbmRleCkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGRyYXdpbmdCdWZmZXJTaXplID0gcmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoKTtcclxuXHJcblx0XHRwYXNzLnNldFNpemUoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCk7XHJcblx0XHRwYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIHJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYSk7XHJcblxyXG5cdFx0aWYoaW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG5cclxuXHRcdFx0dGhpcy5wYXNzZXMuc3BsaWNlKGluZGV4LCAwLCBwYXNzKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5wYXNzZXMucHVzaChwYXNzKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgLSBUaGUgcGFzcy5cclxuXHQgKi9cclxuXHJcblx0cmVtb3ZlUGFzcyhwYXNzKSB7XHJcblxyXG5cdFx0dGhpcy5wYXNzZXMuc3BsaWNlKHRoaXMucGFzc2VzLmluZGV4T2YocGFzcyksIDEpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgYWxsIGVuYWJsZWQgcGFzc2VzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGVsdGEgLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKGRlbHRhKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFzc2VzID0gdGhpcy5wYXNzZXM7XHJcblx0XHRjb25zdCBjb3B5UGFzcyA9IHRoaXMuY29weVBhc3M7XHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IGlucHV0QnVmZmVyID0gdGhpcy5pbnB1dEJ1ZmZlcjtcclxuXHRcdGxldCBvdXRwdXRCdWZmZXIgPSB0aGlzLm91dHB1dEJ1ZmZlcjtcclxuXHJcblx0XHRsZXQgc3RlbmNpbFRlc3QgPSBmYWxzZTtcclxuXHRcdGxldCBwYXNzLCBjb250ZXh0LCBzdGF0ZSwgYnVmZmVyO1xyXG5cdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0Zm9yKGkgPSAwLCBsID0gcGFzc2VzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xyXG5cclxuXHRcdFx0cGFzcyA9IHBhc3Nlc1tpXTtcclxuXHJcblx0XHRcdGlmKHBhc3MuZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0XHRwYXNzLnJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KTtcclxuXHJcblx0XHRcdFx0aWYocGFzcy5uZWVkc1N3YXApIHtcclxuXHJcblx0XHRcdFx0XHRpZihzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29weVBhc3MucmVuZGVyVG9TY3JlZW4gPSBwYXNzLnJlbmRlclRvU2NyZWVuO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29udGV4dCA9IHJlbmRlcmVyLmNvbnRleHQ7XHJcblx0XHRcdFx0XHRcdHN0YXRlID0gcmVuZGVyZXIuc3RhdGU7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBQcmVzZXJ2ZSB0aGUgdW5hZmZlY3RlZCBwaXhlbHMuXHJcblx0XHRcdFx0XHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuTk9URVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cdFx0XHRcdFx0XHRjb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCk7XHJcblx0XHRcdFx0XHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRidWZmZXIgPSBpbnB1dEJ1ZmZlcjtcclxuXHRcdFx0XHRcdGlucHV0QnVmZmVyID0gb3V0cHV0QnVmZmVyO1xyXG5cdFx0XHRcdFx0b3V0cHV0QnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmKHBhc3MgaW5zdGFuY2VvZiBNYXNrUGFzcykge1xyXG5cclxuXHRcdFx0XHRcdHN0ZW5jaWxUZXN0ID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmKHBhc3MgaW5zdGFuY2VvZiBDbGVhck1hc2tQYXNzKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RlbmNpbFRlc3QgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidWZmZXJzIGFuZCB0aGUgcmVuZGVyZXIncyBvdXRwdXQgY2FudmFzLlxyXG5cdCAqXHJcblx0ICogRXZlcnkgcGFzcyB3aWxsIGJlIGluZm9ybWVkIG9mIHRoZSBuZXcgc2l6ZS4gSXQncyB1cCB0byBlYWNoIHBhc3MgaG93IHRoYXRcclxuXHQgKiBpbmZvcm1hdGlvbiBpcyB1c2VkLlxyXG5cdCAqXHJcblx0ICogSWYgbm8gd2lkdGggb3IgaGVpZ2h0IGlzIHNwZWNpZmllZCwgdGhlIHJlbmRlciB0YXJnZXRzIGFuZCBwYXNzZXMgd2lsbCBiZVxyXG5cdCAqIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdGNvbnN0IHBhc3NlcyA9IHRoaXMucGFzc2VzO1xyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdGxldCBzaXplLCBkcmF3aW5nQnVmZmVyU2l6ZTtcclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdGlmKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuXHJcblx0XHRcdHNpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XHJcblx0XHRcdHdpZHRoID0gc2l6ZS53aWR0aDtcclxuXHRcdFx0aGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSB0aGUgbG9naWNhbCByZW5kZXIgc2l6ZS5cclxuXHRcdHJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0Ly8gVGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgdGFrZXMgdGhlIGRldmljZSBwaXhlbCByYXRpbyBpbnRvIGFjY291bnQuXHJcblx0XHRkcmF3aW5nQnVmZmVyU2l6ZSA9IHJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCk7XHJcblxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlci5zZXRTaXplKGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQpO1xyXG5cdFx0dGhpcy5vdXRwdXRCdWZmZXIuc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRwYXNzZXNbaV0uc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoaXMgY29tcG9zZXIgYnkgZGVsZXRpbmcgYWxsIHBhc3NlcyBhbmQgY3JlYXRpbmcgbmV3IGJ1ZmZlcnMuXHJcblx0ICovXHJcblxyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IHRoaXMuY3JlYXRlQnVmZmVyKFxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyLmRlcHRoQnVmZmVyLFxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyLnN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdCh0aGlzLmlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZSAhPT0gbnVsbClcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5kaXNwb3NlKCk7XHJcblxyXG5cdFx0Ly8gUmVhbmltYXRlLlxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlciA9IHJlbmRlclRhcmdldDtcclxuXHRcdHRoaXMub3V0cHV0QnVmZmVyID0gcmVuZGVyVGFyZ2V0LmNsb25lKCk7XHJcblx0XHR0aGlzLmNvcHlQYXNzID0gbmV3IFNoYWRlclBhc3MobmV3IENvcHlNYXRlcmlhbCgpKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGlzIGNvbXBvc2VyIGFuZCBhbGwgcGFzc2VzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgZGVhbGxvY2F0ZXMgYWxsIGRpc3Bvc2FibGUgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBwYXNzZXMuIEl0XHJcblx0ICogYWxzbyBkZWxldGVzIHRoZSBtYWluIGZyYW1lIGJ1ZmZlcnMgb2YgdGhpcyBjb21wb3Nlci5cclxuXHQgKi9cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRjb25zdCBwYXNzZXMgPSB0aGlzLnBhc3NlcztcclxuXHJcblx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRwYXNzZXNbaV0uZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBhc3NlcyA9IFtdO1xyXG5cclxuXHRcdGlmKHRoaXMuaW5wdXRCdWZmZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMuaW5wdXRCdWZmZXIuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5vdXRwdXRCdWZmZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMub3V0cHV0QnVmZmVyLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNvcHlQYXNzLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQge0VmZmVjdENvbXBvc2VyfSBmcm9tICdwb3N0cHJvY2Vzc2luZy9zcmMvY29yZS9FZmZlY3RDb21wb3Nlcic7XG5pbXBvcnQge1JlbmRlclBhc3N9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUmVuZGVyUGFzcyc7XG5pbXBvcnQge1NoYWRlclBhc3N9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvU2hhZGVyUGFzcyc7XG5cbmltcG9ydCB7TG9vcH0gZnJvbSAnLi4vLi4vY29yZS9Mb29wJztcblxuY29uc3QgcG9seWZpbGwgPSAob2JqZWN0LCBtZXRob2QsIHNob3dXYXJuID0gdHJ1ZSkgPT4ge1xuICBpZiAob2JqZWN0W21ldGhvZF0pIHJldHVybjtcbiAgaWYgKHNob3dXYXJuKSBjb25zb2xlLndhcm4oYEBQb3N0UHJvY2Vzc29yTW9kdWxlOiBwYXNzLiR7bWV0aG9kfSgpIHdhcyBub3QgZm91bmQuYCwgb2JqZWN0KTtcbiAgb2JqZWN0W21ldGhvZF0gPSAoKSA9PiB7fTtcbn07XG5cbi8qKlxuICogQGNsYXNzIFBvc3RQcm9jZXNzb3JNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IFBvc3RQcm9jZXNzb3JNb2R1bGUoKVxuICogXSk7XG4gKlxuICogY29uc3QgcHJvY2Vzc29yID0gYXBwLnVzZSgncG9zdHByb2Nlc3NvcicpO1xuICpcbiAqIHByb2Nlc3NvclxuICogICAucmVuZGVyKClcbiAqICAgLnBhc3MobmV3IEdsaXRjaFBhc3MoKSlcbiAqICAgLnJlbmRlclRvU2NyZWVuKClcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3RQcm9jZXNzb3JNb2R1bGUge1xuICBjdXJyZW50UGFzcyA9IG51bGw7XG5cbiAgZGVmZXIgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICB9KTtcblxuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGVidWc6IHRydWVcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSBQb3N0UHJvY2Vzc29yTW9kdWxlLmRlZmF1bHRzKSB7XG4gICAgdGhpcy5kZWJ1ZyA9IHBhcmFtcy5kZWJ1ZztcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdwb3N0cHJvY2Vzc29yJyk7XG5cbiAgICB0aGlzLmVmZmVjdHMgPSBtYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuZWZmZWN0cztcbiAgICB0aGlzLnJlbmRlcmVyID0gbWFuYWdlci5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgdGhpcy5zY2VuZSA9IG1hbmFnZXIuZ2V0KCdzY2VuZScpO1xuICAgIHRoaXMuY2FtZXJhID0gbWFuYWdlci5nZXQoJ2NhbWVyYScpO1xuXG4gICAgdGhpcy5jb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3Nlcih0aGlzLnJlbmRlcmVyLCB0aGlzLnBhcmFtcyk7XG5cbiAgICBtYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuc3RvcCgpO1xuXG4gICAgY29uc3QgY29tcG9zZXIgPSB0aGlzLmNvbXBvc2VyO1xuICAgIHRoaXMucmVuZGVyTG9vcCA9IG5ldyBMb29wKGNsb2NrID0+IGNvbXBvc2VyLnJlbmRlcihjbG9jay5nZXREZWx0YSgpKSkuc3RhcnQobWFuYWdlci5oYW5kbGVyKTtcblxuICAgIG1hbmFnZXIudXBkYXRlKHtcbiAgICAgIHJlbmRlcmVyOiByZW5kZXJlciA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9zZXIucmVwbGFjZVJlbmRlcmVyKHJlbmRlcmVyKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjZW5lOiBzY2VuZSA9PiB7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgIH0sXG5cbiAgICAgIGNhbWVyYTogY2FtZXJhID0+IHtcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbmRlclxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBSZW5kZXJQYXNzXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZGVmZXIudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzID0gbmV3IFJlbmRlclBhc3ModGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEubmF0aXZlKTtcblxuICAgICAgLy8gVE9ETzogU3VwcG9ydCBmb3IgZWZmZWN0cy5cblxuICAgICAgdGhpcy5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuICAgICAgdGhpcy5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHBhc3NcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgeW91ciBjdXN0b20gcGFzc1xuICAgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgQSBjdXN0b20gcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIHBhc3MocGFzcykge1xuICAgIHRoaXMuZGVmZXIudGhlbigoKSA9PiB7XG4gICAgICBwb2x5ZmlsbChwYXNzLCAnc2V0U2l6ZScsIHRoaXMuZGVidWcpO1xuICAgICAgcG9seWZpbGwocGFzcywgJ2luaXRpYWxpc2UnLCB0aGlzLmRlYnVnKTtcblxuICAgICAgdGhpcy5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuICAgICAgdGhpcy5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNoYWRlclxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIHBhc3MgbWFkZSBmcm9tIHNoYWRlciBtYXRlcmlhbFxuICAgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCBBIFNoYWRlck1hdGVyaWFsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0dXJlSUQgTmFtZSBvZiB0aGUgcmVhZEJ1ZmZlciB1bmlmb3JtXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgKi9cbiAgc2hhZGVyKG1hdGVyaWFsLCB0ZXh0dXJlSUQgPSAncmVhZEJ1ZmZlcicpIHtcbiAgICB0aGlzLmRlZmVyLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdKVxuICAgICAgICBtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdID0ge3ZhbHVlOiBudWxsfTtcblxuICAgICAgY29uc3QgcGFzcyA9IG5ldyBTaGFkZXJQYXNzKG1hdGVyaWFsLCB0ZXh0dXJlSUQpO1xuXG4gICAgICB0aGlzLmNvbXBvc2VyLmFkZFBhc3MocGFzcyk7XG4gICAgICB0aGlzLmN1cnJlbnRQYXNzID0gcGFzcztcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZ2V0XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgcGFzcyBieSB0aGUgZ2l2ZW4gbmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWVcbiAgICAgID8gdGhpcy5jb21wb3Nlci5wYXNzZXMuZmlsdGVyKHBhc3MgPT4gcGFzcy5uYW1lID09PSBuYW1lKVswXVxuICAgICAgOiB0aGlzLmN1cnJlbnRQYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVuZGVyVG9TY3JlZW5cbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHJlbmRlclRvU2NyZWVuIHByb3BlcnR5IG9mIGN1cnJlbnRQYXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZT10cnVlXSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIHJlbmRlclRvU2NyZWVuKGJvb2wgPSB0cnVlKSB7XG4gICAgdGhpcy5kZWZlci50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFBhc3MucmVuZGVyVG9TY3JlZW4gPSBib29sO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsIi8qKlxuICogQGNsYXNzIEV2ZW50c1BhdGNoTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBvbmUgaXMgdXNlZCBpbiB0aGUgY29yZSB0byBoYW5kbGUgZXZlbnRzIHVzZWQgYnkgbW9kdWxlcy4gSWYgeW91IHdhbnQgdG8gbWFrZSBjdXN0b20gZXZlbnRzIC0gcGxlYXNlIG1ha2UgYSBzaW1pbGFyIG9uZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRzUGF0Y2hNb2R1bGUge1xuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLmRlZmluZSgnZXZlbnRzJyk7XG4gICAgdGhpcy5lbGVtZW50ID0gbWFuYWdlci5nZXQoJ3JlbmRlcmVyJykuZG9tRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb24gcGF0Y2hFdmVudHNcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kcyBwYXRjaGVzIHRoZSBsaXN0IG9mIGV2ZW50cyBvbiBzcGVjaWZpYyBvYmplY3QuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcmlnaW5PYmplY3QgLSBUaGUgb2JqZWN0IHRoYXQgZ2l2ZXMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2Rlc3RPYmplY3Q9dGhpc10gLSBUaGUgb2JqZWN0IHRoYXQgdGFrZXMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5W1N0cmluZ3NdfSBbZXZlbnRzPVtdXSAtIFRoZSBsaXN0IG9mIGV2ZW50cyBieSBuYW1lcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FdmVudHNQYXRjaE1vZHVsZVxuICAgKi9cbiAgcGF0Y2hFdmVudHMob3JpZ2luT2JqZWN0LCBkZXN0T2JqZWN0ID0gdGhpcywgZXZlbnRzID0gW10pIHtcbiAgICBldmVudHMuZm9yRWFjaChldmVudCA9PlxuICAgICAgb3JpZ2luT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGUgPT4gZGVzdE9iamVjdC5lbWl0KGV2ZW50LCBlKSlcbiAgICApO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBjb25zdCB7ZWxlbWVudCwgcGF0Y2hFdmVudHN9ID0gc2VsZjtcblxuICAgIHBhdGNoRXZlbnRzKGVsZW1lbnQsIHRoaXMsIFtcbiAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgJ21vdXNldXAnLFxuICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICdtb3VzZWRvd24nLFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICd3aGVlbCcsXG4gICAgICAndG91Y2hzdGFydCcsXG4gICAgICAndG91Y2hlbmQnLFxuICAgICAgJ3RvdWNobW92ZScsXG4gICAgICAna2V5ZG93bicsXG4gICAgICAna2V5dXAnLFxuICAgICAgJ2tleXByZXNzJ1xuICAgIF0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBWZWN0b3IyLFxuICBSYXljYXN0ZXIsXG4gIFBsYW5lLFxuICBWZWN0b3IzXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IEV2ZW50cyBmcm9tICdtaW5pdmVudHMnO1xuaW1wb3J0IHtFdmVudHNQYXRjaE1vZHVsZX0gZnJvbSAnLi9FdmVudHNQYXRjaE1vZHVsZSc7XG5cbi8qKlxuICogQGNsYXNzIFZpcnR1YWxNb3VzZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtnbG9iYWxNb3ZlbWVudD1mYWxzZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleHRlbmRzIEV2ZW50c1xuICovXG5leHBvcnQgY2xhc3MgVmlydHVhbE1vdXNlTW9kdWxlIGV4dGVuZHMgRXZlbnRzIHtcbiAgbW91c2UgPSBuZXcgVmVjdG9yMigpO1xuICByYXljYXN0ZXIgPSBuZXcgUmF5Y2FzdGVyKCk7XG4gIHdvcmxkID0gbnVsbDtcbiAgY2FudmFzID0gbnVsbDtcbiAgcHJvamVjdGlvblBsYW5lID0gbmV3IFBsYW5lKG5ldyBWZWN0b3IzKDAsIDAsIDEpLCAwKTtcblxuICBjb25zdHJ1Y3RvcihnbG9iYWxNb3ZlbWVudCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmdsb2JhbE1vdmVtZW50ID0gZ2xvYmFsTW92ZW1lbnQ7XG4gIH1cblxuICB1cGRhdGUoZSwgY3VzdG9tWCwgY3VzdG9tWSkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHggPSBjdXN0b21YIHx8IGUuY2xpZW50WDtcbiAgICBjb25zdCB5ID0gY3VzdG9tWSB8fCBlLmNsaWVudFk7XG5cbiAgICB0aGlzLm1vdXNlLnggPSAoKHggLSByZWN0LmxlZnQpIC8gKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpKSAqIDIgLSAxO1xuICAgIHRoaXMubW91c2UueSA9IC0oKHkgLSByZWN0LnRvcCkgLyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCkpICogMiArIDE7XG5cbiAgICB0aGlzLnByb2plY3Rpb25QbGFuZS5ub3JtYWwuY29weSh0aGlzLmNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbigpKTtcblxuICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuICAgIHRoaXMuZW1pdCgnbW92ZScpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ21vdXNlJyk7XG4gICAgbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCAoKSA9PiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKSk7XG5cbiAgICB0aGlzLmNhbnZhcyA9IG1hbmFnZXIuZ2V0KCdyZW5kZXJlcicpLmRvbUVsZW1lbnQ7XG4gICAgdGhpcy5jYW1lcmEgPSBtYW5hZ2VyLmdldCgnY2FtZXJhJykubmF0aXZlO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBbXG4gICAgICAnY2xpY2snLFxuICAgICAgJ21vdXNlZG93bicsXG4gICAgICAnbW91c2V1cCcsXG4gICAgICAnbW91c2Vtb3ZlJ1xuICAgIF0uZm9yRWFjaChldiA9PiB0aGlzLm9uKGV2LCBlID0+IHNlbGYuZW1pdChldiwgZSkpKTtcblxuICAgIHNlbGYuZ2xvYmFsWCA9IDA7XG4gICAgc2VsZi5nbG9iYWxZID0gMDtcblxuICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGUgPT4ge1xuICAgICAgaWYgKGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICBzZWxmLmdsb2JhbFggKz0gZS5tb3ZlbWVudFg7XG4gICAgICAgIHNlbGYuZ2xvYmFsWSArPSBlLm1vdmVtZW50WTtcblxuICAgICAgICBzZWxmLnVwZGF0ZShlLCBzZWxmLmdsb2JhbFgsIHNlbGYuZ2xvYmFsWSk7XG4gICAgICB9IGVsc2Ugc2VsZi51cGRhdGUoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB0cmFja1xuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIHRyYWNraW5nIGV2ZW50cyBvbiBhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50LCB0aGF0IHNob3VsZCBiZSB0cmFja2VkIGJ5IHRoZSBtb3VzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgKi9cbiAgdHJhY2soY29tcG9uZW50LCBuZXN0ZWQgPSB0cnVlKSB7XG4gICAgbGV0IGlzSG92ZXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5vbignbW92ZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhvdmVycyhjb21wb25lbnQsIG5lc3RlZCkpIHtcbiAgICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNlbW92ZScpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdCgnbW91c2VvdmVyJyk7XG4gICAgICAgICAgaXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoJ21vdXNlb3V0Jyk7XG4gICAgICAgIGlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnY2xpY2snKTtcbiAgICAgIGVsc2UgY29tcG9uZW50LmVtaXQoJ29mZkNsaWNrJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCAoKSA9PiB7XG4gICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnbW91c2Vkb3duJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNldXAnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGludGVyc2VjdGlvblxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gZGF0YVxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIG1vdXNlIHJheSAob3IgZG9lc24ndClcbiAgICogQHBhcmFtIHtCb29sZWFufSBuZXN0ZWQgV2hldGhlciBjb21wb25lbnQncyBjaGlsZHJlbiBzaG91bGQgYmUgdHJhY2tlZCBvciBub3RcbiAgICogQHJldHVybiB7QXJyYXl9IGludGVyc2VjdGlvbiBkYXRhLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKHtuYXRpdmV9LCBuZXN0ZWQgPSB0cnVlKSB7XG4gICAgaWYgKG5hdGl2ZS5jaGlsZHJlbi5sZW5ndGggPiAwICYmIG5lc3RlZCkge1xuICAgICAgY29uc3Qgb2JqZWN0cyA9IFtdO1xuICAgICAgbmF0aXZlLnRyYXZlcnNlKGNoaWxkID0+IG9iamVjdHMucHVzaChjaGlsZCkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvYmplY3RzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KG5hdGl2ZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwcm9qZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgdmVjdG9yIGJhc2VkIG9uIG1vdXNlIHJheSBpbnRlcnNlY3Rpb24gd2l0aCBwbGFuZVxuICAgKiBAcGFyYW0ge1RIUkVFLlBsYW5lfSBbcGxhbmU9dGhpcy5wcm9qZWN0aW9uUGxhbmVdIE1hdGggcGxhbmUgdGhhdCBpcyB1c2VkXG4gICAqIEBwYXJhbSB7VmVjdG9yM30gW3RhcmdldF0gT3B0aW9uYWwgdGFyZ2V0XG4gICAqIEByZXR1cm4ge1ZlY3RvcjN9IEFuIGludGVyc2VjdGlvbiBwb2ludC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICovXG4gIHByb2plY3QocGxhbmUgPSB0aGlzLnByb2plY3Rpb25QbGFuZSwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RQbGFuZShwbGFuZSwgdGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhvdmVyc1xuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGJvb2xlYW4gYmFzZWQgb24gaW50ZXJzZWN0aW9uIGRhdGEgKFdoZXRoZXIgbW91c2UgaG92ZXJzIHRoZSBjb21wb25lbnQpXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBpbnRlcnNlY3RzIHdpdGggbW91c2UgcmF5IChvciBkb2Vzbid0KVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaG92ZXJlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICovXG4gIGhvdmVycyhjb21wb25lbnQsIG5lc3RlZCA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb24oY29tcG9uZW50LCBuZXN0ZWQpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogTW91c2UgcmF5XG4gICAqIEBtZW1iZXIge1RIUkVFLlJheX0gbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZSNyYXlcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZ2V0IHJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIucmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdXNlIHggWy0xOyAxXVxuICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeFxuICAgKiBAcHVibGljXG4gICAqL1xuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3VzZS54O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdXNlIHkgWy0xOyAxXVxuICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeVxuICAgKiBAcHVibGljXG4gICAqL1xuICBnZXQgeSgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3VzZS55O1xuICB9XG59XG4iLCJpbXBvcnQge0xvb3B9IGZyb20gJy4uLy4uL2NvcmUvTG9vcCc7XG5pbXBvcnQge0V2ZW50c1BhdGNoTW9kdWxlfSBmcm9tICcuL0V2ZW50c1BhdGNoTW9kdWxlJztcblxuLyoqXG4gKiBAY2xhc3MgQ29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IENvbnRyb2xzTW9kdWxlLmZyb20obmV3IFRIUkVFLlRyYWNrYmFsbENvbnRyb2xzKCkpXG4gKiBdKTtcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xzTW9kdWxlIHtcbiAgc3RhdGljIGZyb20oY29udHJvbHMpIHtcbiAgICByZXR1cm4gbmV3IENvbnRyb2xzTW9kdWxlKHtjb250cm9sc30pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29udHJvbHM6IGZhbHNlLFxuICAgICAgZml4OiBjb250cm9scyA9PiBjb250cm9scyxcblxuICAgICAgdXBkYXRlKGMpIHtcbiAgICAgICAgdGhpcy5jb250cm9scy51cGRhdGUoYy5nZXREZWx0YSgpKTtcbiAgICAgIH1cbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMucGFyYW1zLmNvbnRyb2xzO1xuICAgIHRoaXMudXBkYXRlID0gdGhpcy5wYXJhbXMudXBkYXRlO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ2NvbnRyb2xzJyk7XG4gICAgbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCAoKSA9PiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRDb250cm9sc1xuICAgKiBAZGVzY3JpcHRpb24gU2V0IHdvcmtpbmcgY29udHJvbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRyb2xzIFdvcmtpbmcgdGhyZWUuanMgY29udHJvbHMgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLkNvbnRyb2xzTW9kdWxlXG4gICAqL1xuICBzZXRDb250cm9scyhjb250cm9scykge1xuICAgIHRoaXMuY29udHJvbHMgPSBjb250cm9scztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFVwZGF0ZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0IGNvbnRyb2xzIHVwZGF0ZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGUgVXBkYXRlIGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuQ29udHJvbHNNb2R1bGVcbiAgICovXG4gIHNldFVwZGF0ZSh1cGRhdGUpIHtcbiAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgc2VsZi51cGRhdGVMb29wID0gbmV3IExvb3Aoc2VsZi51cGRhdGUuYmluZChzZWxmKSk7XG4gICAgc2VsZi51cGRhdGVMb29wLnN0YXJ0KHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBGb2dFeHAyLFxuICBGb2dcbn0gZnJvbSAndGhyZWUnO1xuXG4vKipcbiAqIEBjbGFzcyBGb2dNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2NvbG9yOiAweGVmZDFiNSwgZGVuc2l0eTogMC4wMjAsIG5lYXI6IDEwLCBmYXI6IDEwMDB9XSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZT1leHAyXSAtIFRoZSB0eXBlIG9mIGZvZyAtIGV4cDIgb3IgbGluZWFyXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Ib3cgdG8gY3JlYXRlIGFuZCBhcHBseSBhIEZvZ01vZHVsZTwvY2FwdGlvbj5cbiAqIGNvbnN0IGZvZ01vZHVsZSA9IG5ldyBGb2dNb2R1bGUoe1xuICogICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgZGVuc2l0eTogMC4wMyxcbiAqICAgIG5lYXI6IDIwLFxuICogICAgZmFyOiAyMDBcbiAqICB9LCAnZXhwMicpO1xuICpcbiAqIG5ldyBBcHAoW1xuICogIC4uLixcbiAqICBmb2dNb2R1bGVcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRm9nTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30sIHR5cGUpIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29sb3I6IDB4ZWZkMWI1LFxuICAgICAgZGVuc2l0eTogMC4wMjAsXG4gICAgICBuZWFyOiAxMCxcbiAgICAgIGZhcjogMTAwMFxuICAgIH0sIHBhcmFtcyk7XG4gICAgaWYgKCF0eXBlIHx8IHR5cGUgPT09ICdleHAyJykgdGhpcy5mb2cgPSBuZXcgRm9nRXhwMih0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMuZGVuc2l0eSk7XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmVhcicpIHRoaXMuZm9nID0gbmV3IEZvZyh0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMubmVhciwgdGhpcy5wYXJhbXMuZmFyKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KCdmb2cnLCB0aGlzLmZvZyk7XG4gICAgbWFuYWdlci5nZXQoJ3NjZW5lJykuZm9nID0gdGhpcy5mb2c7XG4gIH1cbn1cbiIsImltcG9ydCB7Y3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4JztcblxuY29uc3QgaXNFcXVhbERlZmF1bHQgPSAoYSwgYikgPT4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGVsc2UgaWYgKGEgJiYgYS5lcXVhbHMgJiYgYS5lcXVhbHMoYikpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQGNsYXNzIFN0YXRlTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gYFN0YXRlTW9kdWxlYCBpcyB1c2VmdWwgZm9yIGFwcHMsIHdoZXJlIHlvdSBuZWVkIHN0YXRlIG1hbmlwdWxhdGlvbi5cbiAqIFRoaXMgY2FuIGJlOiBfdHJhbnNpdGlvbnMgYmV0d2VlbiBzY3JlZW5zLCBnYW1lcywgZGV2ZWxvcG1lbnQgbW9tZW50c18uXG4gKiBZb3UgY2FuIGNoZWNrIFtiYXNpYy9zdGF0ZV0oaHR0cHM6Ly93aHMtZGV2LnN1cmdlLnNoL2V4YW1wbGVzLz9iYXNpYy9zdGF0ZSkgZXhhbXBsZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSBzdGF0ZSBtb2R1bGU8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgLy8gLi4uXG4gKiAgIG5ldyBTdGF0ZU1vZHVsZSgpLmRlZmF1bHQoe1xuICogICAgIHNwaGVyZUNvbG9yOiAweGZmMDAwMFxuICogICB9KVxuICogXSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0ZU1vZHVsZSB7XG4gIHN0YXRpYyBhY3Rpb25HZW5lcmF0ZShpc0VxdWFsKSB7XG4gICAgcmV0dXJuIChzdGF0ZSA9IFt7fSwgJyddLCB7a2V5LCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKGlzRXF1YWwoc3RhdGVbMF1ba2V5XSwgZGF0YSkpIHJldHVybiBzdGF0ZTtcblxuICAgICAgc3RhdGVbMF1ba2V5XSA9IGRhdGE7XG4gICAgICBzdGF0ZVsxXSA9IGtleTtcblxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihlcXVhbENoZWNrID0gaXNFcXVhbERlZmF1bHQpIHtcbiAgICB0aGlzLnN0b3JlID0gY3JlYXRlU3RvcmUoXG4gICAgICBTdGF0ZU1vZHVsZS5hY3Rpb25HZW5lcmF0ZShlcXVhbENoZWNrKVxuICAgICk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICB0aGlzLmN1cnJlbnRDb25maWcgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5wcmV2Q29uZmlnID0gJ2RlZmF1bHQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb24gQWRkIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBzZXR1cFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBXSFMuU3RhdGVNb2R1bGUoKS5kZWZhdWx0KHtcbiAgICogICBzcGhlcmVDb2xvcjogVVRJTFMuJGNvbG9ycy5tZXNoLFxuICAgKiAgIHBsYW5lQ29sb3I6IDB4NDQ3RjhCXG4gICAqIH0pXG4gICAqL1xuICBkZWZhdWx0KGRhdGEpIHtcbiAgICB0aGlzLmNvbmZpZyh7ZGVmYXVsdDogZGF0YX0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0RXF1YWxDaGVja1xuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBhbiBlcXVhbENoZWNrIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZXF1YWwgY2hlY2tcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKi9cbiAgc2V0RXF1YWxDaGVjayhmdW5jKSB7XG4gICAgdGhpcy5zdG9yZS5yZXBsYWNlUmVkdWNlcihcbiAgICAgIFN0YXRlTW9kdWxlLmFjdGlvbkdlbmVyYXRlKGZ1bmMpXG4gICAgKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdzdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29uZmlnXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkIGNvbmZpZ3VyYXRpb25zIGZyb20gb2JqZWN0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlncyBDb25maWd1cmF0aW9uIGRhdGFcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQWRkaW5nIGBncmVlbmAgY29uZmlndXJhdGlvbjwvY2FwdGlvbj5cbiAgICogc3RhdGUuY29uZmlnKHtcbiAgICogICBncmVlbjoge1xuICAgKiAgICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwLFxuICAgKiAgICAgcGxhbmVDb2xvcjogMHgwMGZmMDBcbiAgICogICB9XG4gICAqIH0pO1xuICAgKi9cbiAgY29uZmlnKGNvbmZpZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjb25maWdzKSB7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltrZXldID0ga2V5ID09PSAnZGVmYXVsdCdcbiAgICAgICAgICA/IGNvbmZpZ3Nba2V5XVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHQsIGNvbmZpZ3Nba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkIHVwZGF0ZXMgZnJvbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVzIFVwZGF0ZXMgZGF0YVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlIDxjYXB0aW9uPiBVcGRhdGUgY2FsbGJhY2sgZm9yIGBzcGhlcmVDb2xvcmA8L2NhcHRpb24+XG4gICAqIHN0YXRlLnVwZGF0ZSh7XG4gICAqICAgc3BoZXJlQ29sb3I6IGNvbG9yID0+IHNwaGVyZS5tYXRlcmlhbC5jb2xvci5zZXRIZXgoY29sb3IpXG4gICAqIH0pO1xuICAgKi9cbiAgdXBkYXRlKHVwZGF0ZXMgPSB7fSkge1xuICAgIHRoaXMuc3RvcmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IFtkYXRhLCBjaGFuZ2VkS2V5XSA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdXBkYXRlc1tjaGFuZ2VkS2V5XTtcblxuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhW2NoYW5nZWRLZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvXG4gICAqIEBkZXNjcmlwdGlvbiBTd2l0Y2ggdG8gY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZ05hbWUgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlIDxjYXB0aW9uPiBDaGFuZ2VzIGNvbmZpZ3VyYXRpb24gdG8gYGdyZWVuYDwvY2FwdGlvbj5cbiAgICogc3RhdGUudG8oJ2dyZWVuJyk7XG4gICAqL1xuICB0byhjb25maWdOYW1lKSB7XG4gICAgdGhpcy5wcmV2Q29uZmlnID0gdGhpcy5jdXJyZW50Q29uZmlnO1xuICAgIHRoaXMuY3VycmVudENvbmZpZyA9IGNvbmZpZ05hbWU7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ3VyYXRpb25bY29uZmlnTmFtZV1cbiAgICAgID8gdGhpcy5jb25maWd1cmF0aW9uW2NvbmZpZ05hbWVdXG4gICAgICA6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0O1xuXG4gICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFxuICAgKiBAZGVzY3JpcHRpb24gU2V0IGN1cnJlbnQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlXG4gICAqIHN0YXRlLnNldCh7XG4gICAqICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwXG4gICAqIH0pO1xuICAgKi9cbiAgc2V0KGRhdGEpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKVxuICAgICAgaWYgKGtleSkgdGhpcy5zdG9yZS5kaXNwYXRjaCh7dHlwZTogJ0FERCcsIGtleSwgZGF0YTogZGF0YVtrZXldfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybiBkYXRhIG9mIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBQYXJhbWV0ZXIgbmFtZS5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzdGF0ZS5nZXQoJ3NwaGVyZUNvbG9yJyk7IC8vIDB4MDBmZjAwXG4gICAqL1xuICBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcHJldlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIGB0cnVlVmFsYCBpZiBgY29uZmlnYCBtYXRjaCBwcmV2aW91cyBjb25maWd1cmF0aW9uLCBpbiBvdGhlciBjYXNlIC0gcmV0dXJuIGBmYWxzZVZhbGAuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWcgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0ge0FueX0gdHJ1ZVZhbCBWYWx1ZSByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgdHJ1dGh5LlxuICAgKiBAcGFyYW0ge0FueX0gZmFsc2VWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIGZhbHN5LlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqL1xuICBwcmV2KGNvbmZpZywgdHJ1ZVZhbCwgZmFsc2VWYWwpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2Q29uZmlnID09PSBjb25maWcgPyB0cnVlVmFsIDogZmFsc2VWYWw7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjdXJyZW50XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYHRydWVWYWxgIGlmIGBjb25maWdgIG1hdGNoIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgaW4gb3RoZXIgY2FzZSAtIHJldHVybiBgZmFsc2VWYWxgLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnIENvbmZpZ3VyYXRpb24gbmFtZS5cbiAgICogQHBhcmFtIHtBbnl9IHRydWVWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIHRydXRoeS5cbiAgICogQHBhcmFtIHtBbnl9IGZhbHNlVmFsIFZhbHVlIHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyBmYWxzeS5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKi9cbiAgY3VycmVudChjb25maWcsIHRydWVWYWwsIGZhbHNlVmFsKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZyA9PT0gY29uZmlnID8gdHJ1ZVZhbCA6IGZhbHNlVmFsO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBNT1VTRSxcbiAgUXVhdGVybmlvbixcbiAgU3BoZXJpY2FsLFxuICBWZWN0b3IyLFxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcbiAgT3J0aG9ncmFwaGljQ2FtZXJhLFxuICBFdmVudERpc3BhdGNoZXIsXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG4vLyBUaGlzIHNldCBvZiBjb250cm9scyBwZXJmb3JtcyBvcmJpdGluZywgZG9sbHlpbmcgKHpvb21pbmcpLCBhbmQgcGFubmluZy5cbi8vIFVubGlrZSBUcmFja2JhbGxDb250cm9scywgaXQgbWFpbnRhaW5zIHRoZSBcInVwXCIgZGlyZWN0aW9uIG9iamVjdC51cCAoK1kgYnkgZGVmYXVsdCkuXG4vL1xuLy8gICAgT3JiaXQgLSBsZWZ0IG1vdXNlIC8gdG91Y2g6IG9uZSBmaW5nZXIgbW92ZVxuLy8gICAgWm9vbSAtIG1pZGRsZSBtb3VzZSwgb3IgbW91c2V3aGVlbCAvIHRvdWNoOiB0d28gZmluZ2VyIHNwcmVhZCBvciBzcXVpc2hcbi8vICAgIFBhbiAtIHJpZ2h0IG1vdXNlLCBvciBhcnJvdyBrZXlzIC8gdG91Y2g6IHRocmVlIGZpbnRlciBzd2lwZVxuXG5leHBvcnQgY2xhc3MgVGhyZWVPcmJpdENvbnRyb2xzIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3Iob2JqZWN0LCBkb21FbGVtZW50LCBldmVudEhhbmRsZXIpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cbiAgICB0aGlzLmRvbUVsZW1lbnQgPSAoZG9tRWxlbWVudCA9PT0gdW5kZWZpbmVkKSA/IGRvY3VtZW50IDogZG9tRWxlbWVudDtcbiAgICB0aGlzLmV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjtcblxuICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbFxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG5cbiAgICAvLyBcInRhcmdldFwiIHNldHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgb2JqZWN0IG9yYml0cyBhcm91bmRcbiAgICB0aGlzLnRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gZG9sbHkgaW4gYW5kIG91dCAoIFBlcnNwZWN0aXZlQ2FtZXJhIG9ubHkgKVxuICAgIHRoaXMubWluRGlzdGFuY2UgPSAwO1xuICAgIHRoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiB6b29tIGluIGFuZCBvdXQgKCBPcnRob2dyYXBoaWNDYW1lcmEgb25seSApXG4gICAgdGhpcy5taW5ab29tID0gMDtcbiAgICB0aGlzLm1heFpvb20gPSBJbmZpbml0eTtcblxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLlxuICAgIHRoaXMubWluUG9sYXJBbmdsZSA9IDA7IC8vIHJhZGlhbnNcbiAgICB0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zXG5cbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgaG9yaXpvbnRhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIElmIHNldCwgbXVzdCBiZSBhIHN1Yi1pbnRlcnZhbCBvZiB0aGUgaW50ZXJ2YWwgWyAtIE1hdGguUEksIE1hdGguUEkgXS5cbiAgICB0aGlzLm1pbkF6aW11dGhBbmdsZSA9IC1JbmZpbml0eTsgLy8gcmFkaWFuc1xuICAgIHRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnNcblxuICAgIC8vIFNldCB0byB0cnVlIHRvIGVuYWJsZSBkYW1waW5nIChpbmVydGlhKVxuICAgIC8vIElmIGRhbXBpbmcgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wXG4gICAgdGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7XG4gICAgdGhpcy5kYW1waW5nRmFjdG9yID0gMC4yNTtcblxuICAgIC8vIFRoaXMgb3B0aW9uIGFjdHVhbGx5IGVuYWJsZXMgZG9sbHlpbmcgaW4gYW5kIG91dDsgbGVmdCBhcyBcInpvb21cIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZ1xuICAgIHRoaXMuZW5hYmxlWm9vbSA9IHRydWU7XG4gICAgdGhpcy56b29tU3BlZWQgPSAxLjA7XG5cbiAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSByb3RhdGluZ1xuICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTtcbiAgICB0aGlzLnJvdGF0ZVNwZWVkID0gMS4wO1xuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFubmluZ1xuICAgIHRoaXMuZW5hYmxlUGFuID0gdHJ1ZTtcbiAgICB0aGlzLmtleVBhblNwZWVkID0gNy4wOyAvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoXG5cbiAgICAvLyBTZXQgdG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldFxuICAgIC8vIElmIGF1dG8tcm90YXRlIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxuICAgIHRoaXMuYXV0b1JvdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b1JvdGF0ZVNwZWVkID0gMi4wOyAvLyAzMCBzZWNvbmRzIHBlciByb3VuZCB3aGVuIGZwcyBpcyA2MFxuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdXNlIG9mIHRoZSBrZXlzXG4gICAgdGhpcy5lbmFibGVLZXlzID0gdHJ1ZTtcblxuICAgIC8vIFRoZSBmb3VyIGFycm93IGtleXNcbiAgICB0aGlzLmtleXMgPSB7TEVGVDogMzcsIFVQOiAzOCwgUklHSFQ6IDM5LCBCT1RUT006IDQwfTtcblxuICAgIC8vIE1vdXNlIGJ1dHRvbnNcbiAgICB0aGlzLm1vdXNlQnV0dG9ucyA9IHtPUkJJVDogTU9VU0UuTEVGVCwgWk9PTTogTU9VU0UuTUlERExFLCBQQU46IE1PVVNFLlJJR0hUfTtcblxuICAgIC8vIGZvciByZXNldFxuICAgIHRoaXMudGFyZ2V0MCA9IHRoaXMudGFyZ2V0LmNsb25lKCk7XG4gICAgdGhpcy5wb3NpdGlvbjAgPSB0aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO1xuICAgIHRoaXMuem9vbTAgPSB0aGlzLm9iamVjdC56b29tO1xuXG4gICAgLy9cbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xuICAgIC8vXG5cbiAgICB0aGlzLmdldFBvbGFyQW5nbGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc3BoZXJpY2FsLnBoaTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRBemltdXRoYWxBbmdsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBzcGhlcmljYWwudGhldGE7XG4gICAgfTtcblxuICAgIHRoaXMucmVzZXQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnRhcmdldC5jb3B5KHRoaXMudGFyZ2V0MCk7XG4gICAgICB0aGlzLm9iamVjdC5wb3NpdGlvbi5jb3B5KHRoaXMucG9zaXRpb24wKTtcbiAgICAgIHRoaXMub2JqZWN0Lnpvb20gPSB0aGlzLnpvb20wO1xuXG4gICAgICB0aGlzLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIC8vIHRoaXMgbWV0aG9kIGlzIGV4cG9zZWQsIGJ1dCBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZSBjYW4gbWFrZSBpdCBwcml2YXRlLi4uXG4gICAgdGhpcy51cGRhdGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuXG4gICAgICAvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0IGF4aXNcbiAgICAgIGNvbnN0IHF1YXQgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhvYmplY3QudXAsIG5ldyBWZWN0b3IzKDAsIDEsIDApKTtcbiAgICAgIGNvbnN0IHF1YXRJbnZlcnNlID0gcXVhdC5jbG9uZSgpLmludmVyc2UoKTtcblxuICAgICAgY29uc3QgbGFzdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgIGNvbnN0IGxhc3RRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuICAgICAgcmV0dXJuICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5vYmplY3QucG9zaXRpb247XG5cbiAgICAgICAgb2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1Yih0aGlzLnRhcmdldCk7XG5cbiAgICAgICAgLy8gcm90YXRlIG9mZnNldCB0byBcInktYXhpcy1pcy11cFwiIHNwYWNlXG4gICAgICAgIG9mZnNldC5hcHBseVF1YXRlcm5pb24ocXVhdCk7XG5cbiAgICAgICAgLy8gYW5nbGUgZnJvbSB6LWF4aXMgYXJvdW5kIHktYXhpc1xuICAgICAgICBzcGhlcmljYWwuc2V0RnJvbVZlY3RvcjMob2Zmc2V0KTtcblxuICAgICAgICBpZiAodGhpcy5hdXRvUm90YXRlICYmIHN0YXRlID09PSBTVEFURS5OT05FKVxuICAgICAgICAgIHJvdGF0ZUxlZnQoZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSk7XG5cbiAgICAgICAgc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhO1xuICAgICAgICBzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERlbHRhLnBoaTtcblxuICAgICAgICAvLyByZXN0cmljdCB0aGV0YSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXG4gICAgICAgIHNwaGVyaWNhbC50aGV0YSA9IE1hdGgubWF4KHRoaXMubWluQXppbXV0aEFuZ2xlLCBNYXRoLm1pbih0aGlzLm1heEF6aW11dGhBbmdsZSwgc3BoZXJpY2FsLnRoZXRhKSk7XG5cbiAgICAgICAgLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcbiAgICAgICAgc3BoZXJpY2FsLnBoaSA9IE1hdGgubWF4KHRoaXMubWluUG9sYXJBbmdsZSwgTWF0aC5taW4odGhpcy5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpKSk7XG5cbiAgICAgICAgc3BoZXJpY2FsLm1ha2VTYWZlKCk7XG5cbiAgICAgICAgc3BoZXJpY2FsLnJhZGl1cyAqPSBzY2FsZTtcblxuICAgICAgICAvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xuICAgICAgICBzcGhlcmljYWwucmFkaXVzID0gTWF0aC5tYXgodGhpcy5taW5EaXN0YW5jZSwgTWF0aC5taW4odGhpcy5tYXhEaXN0YW5jZSwgc3BoZXJpY2FsLnJhZGl1cykpO1xuXG4gICAgICAgIC8vIG1vdmUgdGFyZ2V0IHRvIHBhbm5lZCBsb2NhdGlvblxuICAgICAgICB0aGlzLnRhcmdldC5hZGQocGFuT2Zmc2V0KTtcblxuICAgICAgICBvZmZzZXQuc2V0RnJvbVNwaGVyaWNhbChzcGhlcmljYWwpO1xuXG4gICAgICAgIC8vIHJvdGF0ZSBvZmZzZXQgYmFjayB0byBcImNhbWVyYS11cC12ZWN0b3ItaXMtdXBcIiBzcGFjZVxuICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXRJbnZlcnNlKTtcblxuICAgICAgICBwb3NpdGlvbi5jb3B5KHRoaXMudGFyZ2V0KS5hZGQob2Zmc2V0KTtcblxuICAgICAgICB0aGlzLm9iamVjdC5sb29rQXQodGhpcy50YXJnZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZURhbXBpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAqPSAoMSAtIHRoaXMuZGFtcGluZ0ZhY3Rvcik7XG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEucGhpICo9ICgxIC0gdGhpcy5kYW1waW5nRmFjdG9yKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEuc2V0KDAsIDAsIDApO1xuXG4gICAgICAgIHNjYWxlID0gMTtcbiAgICAgICAgcGFuT2Zmc2V0LnNldCgwLCAwLCAwKTtcblxuICAgICAgICAvLyB1cGRhdGUgY29uZGl0aW9uIGlzOlxuICAgICAgICAvLyBtaW4oY2FtZXJhIGRpc3BsYWNlbWVudCwgY2FtZXJhIHJvdGF0aW9uIGluIHJhZGlhbnMpXjIgPiBFUFNcbiAgICAgICAgLy8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9IDEgLSB4XjIgLyA4XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkXG4gICAgICAgICAgfHwgbGFzdFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMub2JqZWN0LnBvc2l0aW9uKSA+IEVQU1xuICAgICAgICAgIHx8IDggKiAoMSAtIGxhc3RRdWF0ZXJuaW9uLmRvdCh0aGlzLm9iamVjdC5xdWF0ZXJuaW9uKSkgPiBFUFMpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICAgICAgbGFzdFBvc2l0aW9uLmNvcHkodGhpcy5vYmplY3QucG9zaXRpb24pO1xuICAgICAgICAgIGxhc3RRdWF0ZXJuaW9uLmNvcHkodGhpcy5vYmplY3QucXVhdGVybmlvbik7XG4gICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5kaXNwb3NlID0gKCkgPT4ge1xuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UpO1xuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBmYWxzZSk7XG4gICAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpO1xuXG4gICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsgLy8gc2hvdWxkIHRoaXMgYmUgYWRkZWQgaGVyZT9cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBpbnRlcm5hbHNcbiAgICAvL1xuXG4gICAgY29uc3QgY2hhbmdlRXZlbnQgPSB7dHlwZTogJ2NoYW5nZSd9O1xuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSB7dHlwZTogJ3N0YXJ0J307XG4gICAgY29uc3QgZW5kRXZlbnQgPSB7dHlwZTogJ2VuZCd9O1xuXG4gICAgY29uc3QgU1RBVEUgPSB7Tk9ORTogLTEsIFJPVEFURTogMCwgRE9MTFk6IDEsIFBBTjogMiwgVE9VQ0hfUk9UQVRFOiAzLCBUT1VDSF9ET0xMWTogNCwgVE9VQ0hfUEFOOiA1fTtcblxuICAgIGxldCBzdGF0ZSA9IFNUQVRFLk5PTkU7XG5cbiAgICBjb25zdCBFUFMgPSAwLjAwMDAwMTtcblxuICAgIC8vIGN1cnJlbnQgcG9zaXRpb24gaW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzXG4gICAgY29uc3Qgc3BoZXJpY2FsID0gbmV3IFNwaGVyaWNhbCgpO1xuICAgIGNvbnN0IHNwaGVyaWNhbERlbHRhID0gbmV3IFNwaGVyaWNhbCgpO1xuXG4gICAgbGV0IHNjYWxlID0gMTtcbiAgICBjb25zdCBwYW5PZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuICAgIGxldCB6b29tQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgcm90YXRlU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IHJvdGF0ZUVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3Qgcm90YXRlRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgcGFuU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IHBhbkVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3QgcGFuRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgZG9sbHlTdGFydCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3QgZG9sbHlFbmQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IGRvbGx5RGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgZ2V0QXV0b1JvdGF0aW9uQW5nbGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogdGhpcy5hdXRvUm90YXRlU3BlZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldFpvb21TY2FsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLnBvdygwLjk1LCB0aGlzLnpvb21TcGVlZCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJvdGF0ZUxlZnQgPSBhbmdsZSA9PiB7XG4gICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAtPSBhbmdsZTtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm90YXRlVXAgPSBhbmdsZSA9PiB7XG4gICAgICBzcGhlcmljYWxEZWx0YS5waGkgLT0gYW5nbGU7XG4gICAgfTtcblxuICAgIGNvbnN0IHBhbkxlZnQgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgdiA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgIHJldHVybiAoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkgPT4ge1xuICAgICAgICB2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAwKTsgLy8gZ2V0IFggY29sdW1uIG9mIG9iamVjdE1hdHJpeFxuICAgICAgICB2Lm11bHRpcGx5U2NhbGFyKC1kaXN0YW5jZSk7XG4gICAgICAgIHBhbk9mZnNldC5hZGQodik7XG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICBjb25zdCBwYW5VcCA9ICgoKSA9PiB7XG4gICAgICBjb25zdCB2ID0gbmV3IFZlY3RvcjMoKTtcblxuICAgICAgcmV0dXJuIChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSA9PiB7XG4gICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDEpOyAvLyBnZXQgWSBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XG4gICAgICAgIHYubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuICAgICAgICBwYW5PZmZzZXQuYWRkKHYpO1xuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8gZGVsdGFYIGFuZCBkZWx0YVkgYXJlIGluIHBpeGVsczsgcmlnaHQgYW5kIGRvd24gYXJlIHBvc2l0aXZlXG4gICAgY29uc3QgcGFuID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgIHJldHVybiAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyB0aGlzLmRvbUVsZW1lbnQuYm9keSA6IHRoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5vYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xuICAgICAgICAgIC8vIHBlcnNwZWN0aXZlXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm9iamVjdC5wb3NpdGlvbjtcbiAgICAgICAgICBvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICBsZXQgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQubGVuZ3RoKCk7XG5cbiAgICAgICAgICAvLyBoYWxmIG9mIHRoZSBmb3YgaXMgY2VudGVyIHRvIHRvcCBvZiBzY3JlZW5cbiAgICAgICAgICB0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbigodGhpcy5vYmplY3QuZm92IC8gMikgKiBNYXRoLlBJIC8gMTgwLjApO1xuXG4gICAgICAgICAgLy8gd2UgYWN0dWFsbHkgZG9uJ3QgdXNlIHNjcmVlbldpZHRoLCBzaW5jZSBwZXJzcGVjdGl2ZSBjYW1lcmEgaXMgZml4ZWQgdG8gc2NyZWVuIGhlaWdodFxuICAgICAgICAgIHBhbkxlZnQoMiAqIGRlbHRhWCAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoMiAqIGRlbHRhWSAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vYmplY3QgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcbiAgICAgICAgICAvLyBvcnRob2dyYXBoaWNcbiAgICAgICAgICBwYW5MZWZ0KGRlbHRhWCAqICh0aGlzLm9iamVjdC5yaWdodCAtIHRoaXMub2JqZWN0LmxlZnQpIC8gdGhpcy5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoZGVsdGFZICogKHRoaXMub2JqZWN0LnRvcCAtIHRoaXMub2JqZWN0LmJvdHRvbSkgLyB0aGlzLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY2FtZXJhIG5laXRoZXIgb3J0aG9ncmFwaGljIG5vciBwZXJzcGVjdGl2ZVxuICAgICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9sc01vZHVsZS5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLicpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlUGFuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IGRvbGx5SW4gPSBkb2xseVNjYWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKVxuICAgICAgICBzY2FsZSAvPSBkb2xseVNjYWxlO1xuXG4gICAgICBlbHNlIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgodGhpcy5taW5ab29tLCBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlKSk7XG4gICAgICAgIHRoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICB0aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZG9sbHlPdXQgPSBkb2xseVNjYWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKVxuICAgICAgICBzY2FsZSAqPSBkb2xseVNjYWxlO1xuXG4gICAgICBlbHNlIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgodGhpcy5taW5ab29tLCBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gLyBkb2xseVNjYWxlKSk7XG4gICAgICAgIHRoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICB0aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBldmVudCBjYWxsYmFja3MgLSB1cGRhdGUgdGhlIG9iamVjdCBzdGF0ZVxuICAgIC8vXG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25Sb3RhdGUgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blJvdGF0ZScgKTtcblxuICAgICAgcm90YXRlU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25Eb2xseSA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duRG9sbHknICk7XG5cbiAgICAgIGRvbGx5U3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25QYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blBhbicgKTtcblxuICAgICAgcGFuU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmVSb3RhdGUgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVJvdGF0ZScgKTtcblxuICAgICAgcm90YXRlRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gdGhpcy5kb21FbGVtZW50LmJvZHkgOiB0aGlzLmRvbUVsZW1lbnQ7XG5cbiAgICAgIC8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBzY3JlZW4gZ29lcyAzNjAgZGVncmVlcyBhcm91bmRcbiAgICAgIHJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHRoaXMucm90YXRlU3BlZWQpO1xuXG4gICAgICAvLyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4gYXR0ZW1wdHMgdG8gZ28gMzYwLCBidXQgbGltaXRlZCB0byAxODBcbiAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogdGhpcy5yb3RhdGVTcGVlZCk7XG5cbiAgICAgIHJvdGF0ZVN0YXJ0LmNvcHkocm90YXRlRW5kKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlRG9sbHkgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZURvbGx5JyApO1xuXG4gICAgICBkb2xseUVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG5cbiAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7XG5cbiAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKVxuICAgICAgICBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcblxuICAgICAgZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMClcbiAgICAgICAgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO1xuXG4gICAgICBkb2xseVN0YXJ0LmNvcHkoZG9sbHlFbmQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmVQYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVBhbicgKTtcblxuICAgICAgcGFuRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcblxuICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KTtcblxuICAgICAgcGFuKHBhbkRlbHRhLngsIHBhbkRlbHRhLnkpO1xuXG4gICAgICBwYW5TdGFydC5jb3B5KHBhbkVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlVXAnICk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlV2hlZWwgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlV2hlZWwnICk7XG5cbiAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKVxuICAgICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7XG5cbiAgICAgIGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDApXG4gICAgICAgIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVLZXlEb3duJyApO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSB0aGlzLmtleXMuVVA6XG4gICAgICAgICAgcGFuKDAsIHRoaXMua2V5UGFuU3BlZWQpO1xuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB0aGlzLmtleXMuQk9UVE9NOlxuICAgICAgICAgIHBhbigwLCAtdGhpcy5rZXlQYW5TcGVlZCk7XG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHRoaXMua2V5cy5MRUZUOlxuICAgICAgICAgIHBhbih0aGlzLmtleVBhblNwZWVkLCAwKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgdGhpcy5rZXlzLlJJR0hUOlxuICAgICAgICAgIHBhbigtdGhpcy5rZXlQYW5TcGVlZCwgMCk7XG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0Um90YXRlJyApO1xuXG4gICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnREb2xseSA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hTdGFydERvbGx5JyApO1xuXG4gICAgICBjb25zdCBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xuICAgICAgY29uc3QgZHkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWTtcblxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICBkb2xseVN0YXJ0LnNldCgwLCBkaXN0YW5jZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnRQYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnRQYW4nICk7XG5cbiAgICAgIHBhblN0YXJ0LnNldChldmVudC50b3VjaGVzWzBdLnBhZ2VYLCBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlUm90YXRlID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVSb3RhdGUnICk7XG5cbiAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICByb3RhdGVEZWx0YS5zdWJWZWN0b3JzKHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IHRoaXMuZG9tRWxlbWVudC5ib2R5IDogdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVuIGdvZXMgMzYwIGRlZ3JlZXMgYXJvdW5kXG4gICAgICByb3RhdGVMZWZ0KDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQuY2xpZW50V2lkdGggKiB0aGlzLnJvdGF0ZVNwZWVkKTtcblxuICAgICAgLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwXG4gICAgICByb3RhdGVVcCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIHRoaXMucm90YXRlU3BlZWQpO1xuXG4gICAgICByb3RhdGVTdGFydC5jb3B5KHJvdGF0ZUVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZURvbGx5ID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVEb2xseScgKTtcblxuICAgICAgY29uc3QgZHggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWDtcbiAgICAgIGNvbnN0IGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgZG9sbHlFbmQuc2V0KDAsIGRpc3RhbmNlKTtcblxuICAgICAgZG9sbHlEZWx0YS5zdWJWZWN0b3JzKGRvbGx5RW5kLCBkb2xseVN0YXJ0KTtcblxuICAgICAgaWYgKGRvbGx5RGVsdGEueSA+IDApXG4gICAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcblxuICAgICAgZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMClcbiAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XG5cbiAgICAgIGRvbGx5U3RhcnQuY29weShkb2xseUVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZVBhbiA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3ZlUGFuJyApO1xuXG4gICAgICBwYW5FbmQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuXG4gICAgICBwYW5EZWx0YS5zdWJWZWN0b3JzKHBhbkVuZCwgcGFuU3RhcnQpO1xuXG4gICAgICBwYW4ocGFuRGVsdGEueCwgcGFuRGVsdGEueSk7XG5cbiAgICAgIHBhblN0YXJ0LmNvcHkocGFuRW5kKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoRW5kJyApO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIGV2ZW50IGhhbmRsZXJzIC0gRlNNOiBsaXN0ZW4gZm9yIGV2ZW50cyBhbmQgcmVzZXQgc3RhdGVcbiAgICAvL1xuXG4gICAgY29uc3Qgb25Nb3VzZURvd24gPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSB0aGlzLm1vdXNlQnV0dG9ucy5PUkJJVCkge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgaGFuZGxlTW91c2VEb3duUm90YXRlKGV2ZW50KTtcblxuICAgICAgICBzdGF0ZSA9IFNUQVRFLlJPVEFURTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSB0aGlzLm1vdXNlQnV0dG9ucy5aT09NKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgaGFuZGxlTW91c2VEb3duRG9sbHkoZXZlbnQpO1xuXG4gICAgICAgIHN0YXRlID0gU1RBVEUuRE9MTFk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gdGhpcy5tb3VzZUJ1dHRvbnMuUEFOKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZURvd25QYW4oZXZlbnQpO1xuXG4gICAgICAgIHN0YXRlID0gU1RBVEUuUEFOO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLk5PTkUpIHtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbk1vdXNlTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuUk9UQVRFKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuRE9MTFkpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZU1vdmVEb2xseShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5QQU4pIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIGhhbmRsZU1vdXNlTW92ZVBhbihldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VVcCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGhhbmRsZU1vdXNlVXAoZXZlbnQpO1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VXaGVlbCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8IHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UgfHwgKHN0YXRlICE9PSBTVEFURS5OT05FICYmIHN0YXRlICE9PSBTVEFURS5ST1RBVEUpKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaGFuZGxlTW91c2VXaGVlbChldmVudCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChzdGFydEV2ZW50KTsgLy8gbm90IHN1cmUgd2h5IHRoZXNlIGFyZSBoZXJlLi4uXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSB8fCB0aGlzLmVuYWJsZUtleXMgPT09IGZhbHNlIHx8IHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBoYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Ub3VjaFN0YXJ0ID0gZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6IC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKGV2ZW50KTtcblxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUk9UQVRFO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgICAgaGFuZGxlVG91Y2hTdGFydERvbGx5KGV2ZW50KTtcblxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfRE9MTFk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cblxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICAgIGhhbmRsZVRvdWNoU3RhcnRQYW4oZXZlbnQpO1xuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9QQU47XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuXG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuTk9ORSlcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblRvdWNoTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6IC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ST1RBVEUpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVSb3RhdGUoZXZlbnQpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfRE9MTFkpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVEb2xseShldmVudCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cblxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLlRPVUNIX1BBTikgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi5cblxuICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZVBhbihldmVudCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uVG91Y2hFbmQgPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBoYW5kbGVUb3VjaEVuZChldmVudCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChlbmRFdmVudCk7XG5cbiAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db250ZXh0TWVudSA9IGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIC8vXG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51LCBmYWxzZSk7XG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UpO1xuICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlKTtcblxuICAgIC8vIGZvcmNlIGFuIHVwZGF0ZSBhdCBzdGFydFxuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIGdldCBjZW50ZXIoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuY2VudGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnRhcmdldCcpO1xuICAgIHJldHVybiB0aGlzLnRhcmdldDtcbiAgfVxuXG4gIGdldCBub1pvb20oKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9ab29tIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlWm9vbSBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVab29tO1xuICB9XG5cbiAgc2V0IG5vWm9vbSh2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVpvb20gaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZVpvb20gPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgbm9Sb3RhdGUoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICByZXR1cm4gIXRoaXMuZW5hYmxlUm90YXRlO1xuICB9XG5cbiAgc2V0IG5vUm90YXRlKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZVJvdGF0ZSA9ICF2YWx1ZTtcbiAgfVxuXG4gIGdldCBub1BhbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVQYW47XG4gIH1cblxuICBzZXQgbm9QYW4odmFsdWUpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZW5hYmxlUGFuID0gIXZhbHVlO1xuICB9XG5cbiAgZ2V0IG5vS2V5cygpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub0tleXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVLZXlzIGluc3RlYWQuJyk7XG4gICAgcmV0dXJuICF0aGlzLmVuYWJsZUtleXM7XG4gIH1cblxuICBzZXQgbm9LZXlzKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9LZXlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlS2V5cyBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZW5hYmxlS2V5cyA9ICF2YWx1ZTtcbiAgfVxuXG4gIGdldCBzdGF0aWNNb3ZpbmcoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuc3RhdGljTW92aW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVEYW1waW5nO1xuICB9XG5cbiAgc2V0IHN0YXRpY01vdmluZyh2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZURhbXBpbmcgPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgZHluYW1pY0RhbXBpbmdGYWN0b3IoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuZHluYW1pY0RhbXBpbmdGYWN0b3IgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5kYW1waW5nRmFjdG9yIGluc3RlYWQuJyk7XG4gICAgcmV0dXJuIHRoaXMuZGFtcGluZ0ZhY3RvcjtcbiAgfVxuXG4gIHNldCBkeW5hbWljRGFtcGluZ0ZhY3Rvcih2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9yIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZGFtcGluZ0ZhY3RvciA9IHZhbHVlO1xuICB9XG59XG4iLCJpbXBvcnQge1ZlY3RvcjN9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q29udHJvbHNNb2R1bGV9IGZyb20gJy4uL0NvbnRyb2xzTW9kdWxlJztcblxuaW1wb3J0IHtUaHJlZU9yYml0Q29udHJvbHN9IGZyb20gJy4vbGliL1RocmVlT3JiaXRDb250cm9scyc7XG5cbi8qKlxuICogQGNsYXNzIE9yYml0Q29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5vYmplY3Q9Y2FtZXJhXSBPYmplY3QgdG8gd2hpY2ggY29udHJvbHMgYXJlIGFwcGxpZWQuXG4gKiBAcGFyYW0ge1RIUkVFLlZlY3RvcjN9IFtwYXJhbXMudGFyZ2V0PW5ldyBWZWN0b3IzKCldIENvbnRyb2xzIGNlbnRlciB2ZWN0b3IuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXJhbXMuZm9sbG93PWZhbHNlXSBGb2xsb3cgdGhlIHRhcmdldFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgcmVuZGVyaW5nIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKCksXG4gKiAgIG5ldyBTY2VuZU1vZHVsZSgpLFxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgNiwgMTgpLFxuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSkpLFxuICogICBuZXcgUmVuZGVyaW5nTW9kdWxlKCksXG4gKiAgIG5ldyBPcmJpdENvbnRyb2xzTW9kdWxlKClcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgT3JiaXRDb250cm9sc01vZHVsZSBleHRlbmRzIENvbnRyb2xzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGZvbGxvdzogZmFsc2UsXG4gICAgICBvYmplY3Q6IG51bGwsXG4gICAgICB0YXJnZXQ6IG5ldyBWZWN0b3IzKClcbiAgICB9LCBwYXJhbXMpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgc3VwZXIubWFuYWdlcihtYW5hZ2VyKTtcblxuICAgIGNvbnN0IHtvYmplY3Q6IG9iaiwgZm9sbG93LCB0YXJnZXR9ID0gdGhpcy5wYXJhbXM7XG4gICAgY29uc3Qgb2JqZWN0ID0gb2JqID8gb2JqLm5hdGl2ZSA6IG1hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmU7XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBUaHJlZU9yYml0Q29udHJvbHMoXG4gICAgICBvYmplY3QsXG4gICAgICBtYW5hZ2VyLmdldCgnZWxlbWVudCcpLFxuICAgICAgbWFuYWdlci5oYW5kbGVyXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVByb2Nlc3NvciA9IGZvbGxvdyA/IGMgPT4ge1xuICAgICAgY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgICBjb250cm9scy50YXJnZXQuY29weSh0YXJnZXQpO1xuICAgIH0gOiBjID0+IHtcbiAgICAgIGNvbnRyb2xzLnVwZGF0ZShjLmdldERlbHRhKCkpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldENvbnRyb2xzKGNvbnRyb2xzKTtcbiAgICB0aGlzLnNldFVwZGF0ZSh1cGRhdGVQcm9jZXNzb3IpO1xuXG4gICAgbWFuYWdlci51cGRhdGUoe1xuICAgICAgY2FtZXJhOiBjYW1lcmEgPT4ge1xuICAgICAgICBpZiAob2JqKSByZXR1cm47XG4gICAgICAgIGNvbnRyb2xzLm9iamVjdCA9IGNhbWVyYS5uYXRpdmU7XG4gICAgICB9LFxuICAgICAgZWxlbWVudDogZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnRyb2xzLmRvbUVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udHJvbHMudGFyZ2V0LmNvcHkodGFyZ2V0KTtcbiAgfVxufVxuIiwiLyoqIEBtb2R1bGUgbW9kdWxlcy9hcHAvY29udHJvbHMgKi9cbmV4cG9ydCAqIGZyb20gJy4vT3JiaXRDb250cm9sc01vZHVsZSc7XG4iLCIvKiogQG1vZHVsZSBtb2R1bGVzL2FwcCAqL1xuZXhwb3J0ICogZnJvbSAnLi9FbGVtZW50TW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vUmVuZGVyaW5nTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vU2NlbmVNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9SZXNpemVNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Qb3N0UHJvY2Vzc29yTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vVmlydHVhbE1vdXNlTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vRXZlbnRzUGF0Y2hNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db250cm9sc01vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL0ZvZ01vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL1N0YXRlTW9kdWxlJztcblxuLy8gY29udHJvbHNcbmV4cG9ydCAqIGZyb20gJy4vY29udHJvbHMvaW5kZXgnO1xuIiwiLyoqXG4gKiBAY2xhc3MgRHluYW1pY0dlb21ldHJ5TW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXR0cmlidXRlczogZmFsc2V9XSAtIHBhcmFtc1xuICogQHBhcmFtIHtCb29sZWFufSBbcGF0Y2hFdmVudHM9dHJ1ZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoXG4gKi9cbmV4cG9ydCBjbGFzcyBEeW5hbWljR2VvbWV0cnlNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdHRyaWJ1dGVzOiBmYWxzZVxuICAgIH0sIHBhcmFtcyk7XG4gIH1cblxuICBpbnRlZ3JhdGUoc2VsZikge1xuICAgIGNvbnN0IHBhcmFtcyA9IHNlbGYucGFyYW1zO1xuXG4gICAgdGhpcy5nXyA9IGZ1bmN0aW9uIChwYXJhbXMgPSB7fSkge1xuICAgICAgaWYgKHRoaXMuYnVpbGRHZW9tZXRyeSkge1xuICAgICAgICB0aGlzLm5hdGl2ZS5nZW9tZXRyeSA9IHRoaXMuYnVpbGRHZW9tZXRyeShcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmFtcyh7Z2VvbWV0cnk6IHBhcmFtc30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wYXJhbXMuZ2VvbWV0cnkpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBgZ18ke2tleX1gLCB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZW9tZXRyeS5wYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMubmF0aXZlLmdlb21ldHJ5ID0gdGhpcy5idWlsZEdlb21ldHJ5KHRoaXMudXBkYXRlUGFyYW1zKHtnZW9tZXRyeToge1trZXldOiB2YWx1ZX19KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBSZXBlYXRXcmFwcGluZyxcbiAgVVZNYXBwaW5nLFxuICBOZWFyZXN0RmlsdGVyLFxuICBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsXG4gIFRleHR1cmVMb2FkZXIsXG4gIFZlY3RvcjJcbn0gZnJvbSAndGhyZWUnO1xuXG5jb25zdCBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXG4vKipcbiAqIEBjbGFzcyBUZXh0dXJlTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQSBUZXh0dXJlTW9kdWxlIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBNZXNoIG9yIE1vZGVsLlxuICogQHBhcmFtIHtBcnJheX0gW3RleHR1cmVzXSAtIGFycmF5IG9mIHRleHR1cmUgb2JqZWN0c1xuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2hcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIGluc3RhbmNlLiB1cmwgdGFrZXMgYSBwYXRoLCBvciBhIGRhdGEgb2JqZWN0LjwvY2FwdGlvbj5cbiAqIHZhciB3b29kVGV4dHVyZSA9IG5ldyBUZXh0dXJlTW9kdWxlKHtcbiAqICAgdXJsOiBgJHtwcm9jZXNzLmFzc2V0c1BhdGh9L3RleHR1cmVzL3dvb2QuanBnYFxuICogfSk7XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Nb3JlIGNvbXByZWhlbnNpdmUgZXhhbXBsZSwgd29vZCB0ZXh0dXJlIGFwcGxpZWQgdG8gYSBCb3guPC9jYXB0aW9uPlxuICogbmV3IEJveCh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgd2lkdGg6IDIsXG4gKiAgICAgaGVpZ2h0OiAyLFxuICogICAgIGRlcHRoOiAyXG4gKiAgIH0sXG4gKiAgIG1vZHVsZXM6IFtcbiAqICAgICBuZXcgVGV4dHVyZU1vZHVsZSh7XG4gKiAgICAgICB1cmw6IGBwYXRoL3RvL3RleHR1cmUuanBnYCxcbiAqICAgICAgIHJlcGVhdDogbmV3IFRIUkVFLlZlY3RvcjIoMSwgMSkgLy8gb3B0aW9uYWxcbiAqICAgICB9KVxuICogICBdLFxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKiAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0dXJlTW9kdWxlIHtcbiAgc3RhdGljIGxvYWQodXJsKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlTW9kdWxlKHt1cmx9KS50ZXh0dXJlc1swXVsxXTtcbiAgfVxuXG4gIHRleHR1cmVzID0gW107XG5cbiAgY29uc3RydWN0b3IoLi4udGV4dHVyZXMpIHtcbiAgICB0ZXh0dXJlcy5mb3JFYWNoKCh7XG4gICAgICB1cmwsXG4gICAgICB0eXBlID0gJ21hcCcsXG4gICAgICBvZmZzZXQgPSBuZXcgVmVjdG9yMigwLCAwKSxcbiAgICAgIHJlcGVhdCA9IG5ldyBWZWN0b3IyKDEsIDEpLFxuICAgICAgd3JhcCA9IFJlcGVhdFdyYXBwaW5nLFxuICAgICAgbWFwcGluZyA9IFVWTWFwcGluZyxcbiAgICAgIGZpeCA9IHRleCA9PiB0ZXhcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0dXJlID0gbG9hZGVyLmxvYWQodXJsKTtcblxuICAgICAgaWYgKHdyYXAubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZXh0dXJlLndyYXBTID0gd3JhcFswXTtcbiAgICAgICAgdGV4dHVyZS53cmFwVCA9IHdyYXBbMV07XG4gICAgICB9IGVsc2VcbiAgICAgICAgdGV4dHVyZS53cmFwUyA9IHRleHR1cmUud3JhcFQgPSB3cmFwO1xuXG4gICAgICB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nO1xuXG4gICAgICB0ZXh0dXJlLm9mZnNldC5jb3B5KG9mZnNldCk7XG4gICAgICB0ZXh0dXJlLnJlcGVhdC5jb3B5KHJlcGVhdCk7XG5cbiAgICAgIHRleHR1cmUubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcbiAgICAgIHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG4gICAgICB0aGlzLnRleHR1cmVzLnB1c2goW3R5cGUsIGZpeCh0ZXh0dXJlKV0pO1xuICAgIH0pO1xuICB9XG5cbiAgYnJpZGdlID0ge1xuICAgIG1hdGVyaWFsKG1hdGVyaWFsLCBzZWxmKSB7XG4gICAgICBzZWxmLnRleHR1cmVzLmZvckVhY2godGV4dHVyZSA9PiB7XG4gICAgICAgIG1hdGVyaWFsW3RleHR1cmVbMF1dID0gdGV4dHVyZVsxXTtcbiAgICAgIH0pO1xuXG4gICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBBbmltYXRpb25NaXhlcixcbiAgQW5pbWF0aW9uQ2xpcFxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TG9vcH0gZnJvbSAnLi4vLi4vY29yZS9Mb29wJztcblxuLyoqXG4gKiBAY2xhc3MgQW5pbWF0aW9uTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgbW9kdWxlIHRoYXQgd3JhcHMgdGhlIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jbWFudWFsL2ludHJvZHVjdGlvbi9BbmltYXRpb24tc3lzdGVtJz50aHJlZS5qcyBhbmltYXRpb24gc3lzdGVtPC9hPlxuICogQHBhcmFtIHtBcHB9IGFwcCAtIHRoZSBhcHBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzRGVmZXJyZWQ9ZmFsc2VdIC0gc2V0IHRvIHRydWUgaWYgYW5pbWF0aW9uIHNob3VsZCBub3Qgc3RhcnQgYXV0b21hdGljYWxseVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e3NwZWVkOiAxfV0gLSB0aGUgcGFyYW1zXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuaW1hdGlvbiBtb2R1bGUgYW5kIHBsYXkgYSBnaXZlbiBjbGlwIG9mIGFuIGltcG9ydGVkIG1vZGVsPC9jYXB0aW9uPlxuICogY29uc3QgYW5pbWF0aW9uTW9kdWxlID0gbmV3IEFuaW1hdGlvbk1vZHVsZShhcHAsIGZhbHNlLCB7XG4gKiAgIHNwZWVkOiAxLjIgLy8gc3BlZWQgdXAgYW5pbWF0aW9uIGJ5IDIwJVxuICogfSk7XG4gKlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgcGFyc2VyKGdlb21ldHJ5LCBtYXRlcmlhbHMpIHtcbiAqICAgICAvLyBPdmVycmlkZSBwYXJzZSB0byBnZW5lcmF0ZSBhIHNraW5uZWRNZXNoLCBuZWVkZWQgZm9yIHNraW5uZWQgbW9kZWxzXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5Ta2lubmVkTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWxzKTtcbiAqICAgfSxcbiAqXG4gKiAgIHVybDogYHBhdGgvdG8vbW9kZWwuanNvbmAsXG4gKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiB0cnVlLFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7XG4gKiAgICAgc2tpbm5pbmc6IHRydWVcbiAqICAgfSksXG4gKlxuICogICBtb2R1bGVzOiBbYW5pbWF0aW9uTW9kdWxlXVxuICogfSkuYWRkVG8oYXBwKS50aGVuKCgpID0+IHtcbiAqICAgLy8gYWRkaW5nIG1vZGVsIHRvIGFwcCByZXR1cm5zIGEgcHJvbWlzZSwgc28gcGlwZSB0aGUgZnVuY3Rpb24gdG8ga2ljayBvZmYgdGhlIGFuaW1hdGlvbiBjbGlwXG4gKiAgIGFuaW1hdGlvbk1vZHVsZS5wbGF5KCdjbGlwTmFtZScpO1xuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25Nb2R1bGUge1xuICBjb25zdHJ1Y3RvcihhcHAsIGlzRGVmZXJyZWQsIHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHNwZWVkOiAxXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMuaXNEZWZlcnJlZCA9IGlzRGVmZXJyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gUGxheXMgdGhlIGdpdmVuIGNsaXAgbmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xpcE5hbWUgLSB0aGUgY2xpcCB0byBwbGF5XG4gICAqIEByZXR1cm4ge1RIUkVFLkFuaW1hdGlvbkFjdGlvbn0gUGxheWluZyBhY3Rpb24gXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoLkFuaW1hdGlvbk1vZHVsZVxuICAgKi9cbiAgcGxheShjbGlwTmFtZSkge1xuICAgIGNvbnN0IGNsaXAgPSBBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUodGhpcy5jbGlwcywgY2xpcE5hbWUpO1xuICAgIHJldHVybiB0aGlzLm1peGVyLmNsaXBBY3Rpb24oY2xpcCkucGxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHRoZSBtaXhlciAoYmVpbmcgY2FsbGVkIG9uIGZyYW1lIGFuaW1hdGlvbiBsb29wKVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaC5BbmltYXRpb25Nb2R1bGVcbiAgICovXG4gIHVwZGF0ZShjbG9jaykge1xuICAgIGlmICh0aGlzLm1peGVyKSB0aGlzLm1peGVyLnVwZGF0ZShjbG9jay5nZXREZWx0YSgpICogdGhpcy5wYXJhbXMuc3BlZWQpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLmxvb3AgPSBuZXcgTG9vcCgoY2xvY2spID0+IHNlbGYudXBkYXRlKGNsb2NrKSk7XG5cbiAgICBpZiAoIXNlbGYuaXNEZWZlcnJlZCkgc2VsZi5sb29wLnN0YXJ0KHNlbGYuYXBwKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdhbmltYXRpb24nKTtcbiAgfVxuXG4gIGJyaWRnZSA9IHtcbiAgICBtZXNoKG1lc2gsIHNlbGYpIHtcbiAgICAgIG1lc2guZ2VvbWV0cnkuc2tlbGV0b24gPSBtZXNoLnNrZWxldG9uO1xuXG4gICAgICBzZWxmLm1peGVyID0gbmV3IEFuaW1hdGlvbk1peGVyKG1lc2guZ2VvbWV0cnkpO1xuICAgICAgc2VsZi5jbGlwcyA9IG1lc2guZ2VvbWV0cnkuYW5pbWF0aW9ucztcblxuICAgICAgcmV0dXJuIG1lc2g7XG4gICAgfVxuICB9XG59XG4iLCIvKiogQG1vZHVsZSBtb2R1bGVzL21lc2ggKi9cbmV4cG9ydCAqIGZyb20gJy4vRHluYW1pY0dlb21ldHJ5TW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dHVyZU1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL0FuaW1hdGlvbk1vZHVsZSc7XG4iLCIvKipcbiAqIEBjbGFzcyBEZWZpbmVNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgRGVmaW5lTW9kdWxlIHdpdGggUGVyc3BlY3RpdmVDYW1lcmEgYXMgY2FtZXJhIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIC8vIC4uLlxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSlcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRGVmaW5lTW9kdWxlIHtcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KHRoaXMubmFtZSwgdGhpcy5kYXRhKTtcbiAgfVxufVxuIiwiLyoqIEBtb2R1bGUgbW9kdWxlcyAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2FwcC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21lc2gvaW5kZXgnO1xuXG4vLyBtb2R1bGVzXG5leHBvcnQgKiBmcm9tICcuL0RlZmluZU1vZHVsZSc7XG4iLCJpbXBvcnQge0ltcG9ydGVyfSBmcm9tICcuL2NvbXBvbmVudHMvbWVzaGVzL0ltcG9ydGVyJztcbmltcG9ydCB7UGVyc3BlY3RpdmVDYW1lcmF9IGZyb20gJy4vY29tcG9uZW50cy9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuZXhwb3J0IGNsYXNzIE1vZGVsIGV4dGVuZHMgSW1wb3J0ZXIge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMsIC4uLmFkZGl0aW9uYWwpIHtcbiAgICBjb25zb2xlLndhcm4oJ01vZGVsIGlzIGRlcHJlY2F0ZWQuIFVzZSBJbXBvcnRlciBpbnN0ZWFkLicpO1xuXG4gICAgaWYgKHBhcmFtcy5nZW9tZXRyeSkge1xuICAgICAgcGFyYW1zLnVybCA9IHBhcmFtcy5nZW9tZXRyeS5wYXRoO1xuICAgICAgcGFyYW1zLmxvYWRlciA9IHBhcmFtcy5nZW9tZXRyeS5sb2FkZXI7XG4gICAgfVxuXG4gICAgc3VwZXIocGFyYW1zLCAuLi5hZGRpdGlvbmFsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FtZXJhTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBjb25zb2xlLndhcm4oJ0NhbWVyYU1vZHVsZSBpcyBkZXByZWNhdGVkLiBVc2UgRGVmaW5lTW9kdWxlIGluc3RlYWQuJyk7XG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEocGFyYW1zKTtcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgdGhpcy5hZGQoc2VsZi5jYW1lcmEpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5zZXQoJ2NhbWVyYScsIHRoaXMuY2FtZXJhKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBOYW1lc3BhY2UgY29udGFpbmluZyBhbGwgY2xhc3NlcyBmcm9tIGFsbCBtb2R1bGVzLiBVc2VkIGFzIGdsb2JhbCBpbiBVTUQgcGF0dGVybi5cbiAqIEBuYW1lc3BhY2UgV0hTXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5UaGUgdXNlIG9mIFdIUyBuYW1lc3BhY2UuPC9jYXB0aW9uPlxuICogbmV3IFdIUy5BcHAoKSAvLyBjb3JlXG4gKiBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKCkgLy8gY29tcG9uZW50c1xuICogbmV3IFdIUy5SZXNpemVNb2R1bGUoKSAvLyBtb2R1bGVzXG4gKiBXSFMuZXh0ZW5kKCkgLy8gdXRpbHNcbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvbGlnaHRzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9jYW1lcmFzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9tZXNoZXMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvaW5kZXgnO1xuXG4vLyBERVBSRUNBVElPTlxuZXhwb3J0ICogZnJvbSAnLi9kZXByZWNhdGlvbic7XG4iXSwibmFtZXMiOlsicmVxdWlyZSQkMCIsImRlZmluZWQiLCJ0b0ludGVnZXIiLCJhRnVuY3Rpb24iLCJpc09iamVjdCIsImRvY3VtZW50IiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJhbk9iamVjdCIsInRvUHJpbWl0aXZlIiwiSUU4X0RPTV9ERUZJTkUiLCJkUCIsImNyZWF0ZURlc2MiLCJjb3JlIiwiZ2xvYmFsIiwiaGFzIiwiY3R4IiwiaGlkZSIsImNvZiIsIklPYmplY3QiLCJtaW4iLCJ0b0lPYmplY3QiLCJ0b0xlbmd0aCIsInRvQWJzb2x1dGVJbmRleCIsInVpZCIsIiRrZXlzIiwiZW51bUJ1Z0tleXMiLCJnZXRLZXlzIiwiSUVfUFJPVE8iLCJQUk9UT1RZUEUiLCJkUHMiLCJjcmVhdGUiLCJkZXNjcmlwdG9yIiwic2V0VG9TdHJpbmdUYWciLCJ0b09iamVjdCIsIiRpdGVyQ3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJMSUJSQVJZIiwiSXRlcmF0b3JzIiwicmVkZWZpbmUiLCIkZXhwb3J0Iiwic3RlcCIsIlRBRyIsIklURVJBVE9SIiwiY2xhc3NvZiIsImdldEl0ZXJGbiIsImlzQXJyYXlJdGVyIiwiY2FsbCIsImludm9rZSIsImNlbCIsImh0bWwiLCJwcm9jZXNzIiwiUHJvbWlzZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiU1BFQ0lFUyIsIkRFU0NSSVBUT1JTIiwiVHlwZUVycm9yIiwiaXNOb2RlIiwibmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUiLCJ1c2VyQWdlbnQiLCJwZXJmb3JtIiwiYW5JbnN0YW5jZSIsInJlcXVpcmUkJDMiLCJzcGVjaWVzQ29uc3RydWN0b3IiLCJyZXF1aXJlJCQ0IiwicmVxdWlyZSQkNSIsInJlcXVpcmUkJDYiLCJwcm9taXNlUmVzb2x2ZSIsInJlcXVpcmUkJDciLCJmb3JPZiIsIl9Qcm9taXNlIiwicElFIiwiZmFpbHMiLCJ3a3NFeHQiLCJnT1BTIiwidG9TdHJpbmciLCJnT1BEIiwiJEdPUEQiLCIkRFAiLCJnT1BOIiwiZ09QTkV4dCIsIndrcyIsInNoYXJlZCIsIk9iamVjdFByb3RvIiwiVVNFX05BVElWRSIsIiRmYWlscyIsIl9jcmVhdGUiLCJlbnVtS2V5cyIsIiRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ3a3NEZWZpbmUiLCJpc0FycmF5IiwiJE9iamVjdCIsIl9PYmplY3QkZGVmaW5lUHJvcGVydHkiLCJfT2JqZWN0JGtleXMiLCJfT2JqZWN0JGdldE93blByb3BlcnR5U3ltYm9scyIsIl9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVmaW5lUHJvcGVydHkiLCJfT2JqZWN0JHNldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfU3ltYm9sIiwiX1N5bWJvbCRpdGVyYXRvciIsIl90eXBlb2YiLCIkZ2V0UHJvdG90eXBlT2YiLCJfT2JqZWN0JGdldFByb3RvdHlwZU9mIiwiZXh0ZW5kIiwib2JqZWN0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm9wIiwidW5kZWZpbmVkIiwiY29uc3RydWN0b3IiLCJBcnJheSIsInNsaWNlIiwiaW5zdHJ1Y3QiLCJhcnJheSIsImluc3RBcnJheSIsInRlbXBPYmplY3QiLCJpIiwibWF4IiwibGVuZ3RoIiwiZ3VpZGUiLCJ0cmFuc2Zvcm1EYXRhIiwiaW5zdHJ1Y3Rpb25zIiwia2V5IiwidG9BcnJheSIsImluc3RydWN0aW9uIiwidGVtcEFycmF5IiwicHgiLCJyZWRlZmluZUFsbCIsInZhbGlkYXRlIiwiJGl0ZXJEZWZpbmUiLCJzZXRTcGVjaWVzIiwiYXNjIiwibWV0YSIsInN0cm9uZyIsImZyb20iLCJiaW5kIiwiX1JlZmxlY3QkY29uc3RydWN0IiwiX01hcCIsIl9PYmplY3QkY3JlYXRlIiwiY29uc3RydWN0IiwiQ29tcG9zaXRpb25FcnJvciIsImNsYXNzSW5zdGFuY2UiLCJtZXNzYWdlIiwiY29tcG9uZW50Iiwic3RhY2tBcnJheSIsInN0YWNrIiwic3BsaXQiLCJzcGxpY2UiLCJqb2luIiwiY29uc29sZSIsImVycm9yIiwibmFtZSIsIkVycm9yIiwiRGVwZW5kZW5jeUVycm9yIiwiYWN0aXZlTW9kdWxlIiwiZGVwZW5kZW5jeU1vZHVsZSIsIk1hbmFnZXJFcnJvciIsIndhcm5EZXBzIiwiUkVWSVNJT04iLCJlcnIiLCJNb2R1bGVTeXN0ZW0iLCJzb3VyY2UiLCJtb2R1bGVzIiwiYXBwbHlNb2R1bGUiLCJhcHBseUJyaWRnZSIsIm9uQ29weSIsImJyaWRnZU1hcCIsIm1vZHVsZSIsImJyaWRnZSIsImFwcGx5IiwiY2IiLCJmdW5jIiwibW9kdWxlU2NvcGUiLCJwdXNoIiwibWFuYWdlciIsImFjdGl2ZSIsImludGVncmF0ZSIsImRpc3Bvc2VNb2R1bGUiLCJpbmRleE9mIiwiZGlzcG9zZSIsIkV2ZW50cyIsImdldCIsIl9nZXRJdGVyYXRvciIsInBvbnlmaWxsIiwiJCRvYnNlcnZhYmxlIiwiTW9kdWxlTWFuYWdlciIsImhhbmRsZXIiLCJjdXJyZW50TW9kdWxlIiwic3RvcmUiLCJjcmVhdGVTdG9yZSIsInN0YXRlIiwiYWN0aW9uIiwiZGF0YSIsImRpc3BhdGNoIiwidHlwZSIsImdldFN0YXRlIiwiQm9vbGVhbiIsImRlcHNNYXAiLCJzdWJzY3JpYmUiLCJjaGFuZ2VkS2V5IiwiY2FsbGJhY2siLCJ3YXJuIiwic2V0IiwibW9kdWxlRXhlY3V0b3IiLCJ1c2UiLCJDb21wb25lbnQiLCJwYXJhbXMiLCJkZWZhdWx0cyIsImludGVncmF0ZU1vZHVsZXMiLCJwcm9taXNlIiwiX3dhaXQiLCJhbGwiLCJpc0RlZmZlcmVkIiwid2FpdCIsInRoZW4iLCJjb3B5IiwiY3VzdG9taXplIiwibmF0aXZlIiwiY2xvbmUiLCJwYXJlbnQiLCJyZW1vdmUiLCJvbkFkZCIsImFkZCIsImNoaWxkcmVuIiwiX21hbmFnZXIiLCJfbmF0aXZlIiwibWVzaCIsIl9SZWZsZWN0JGdldCIsImF0dHJpYnV0ZXMiLCJtYXBwZXJzIiwidGFyZ2V0IiwibWFwcGVyIiwiayIsIm1hcCIsImF0dHJpYnV0ZSIsInByb3RvdHlwZSIsImdldHRlciIsInNldHRlciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ2YWx1ZSIsIm1pcnJvciIsIk1lc2hDb21wb25lbnQiLCJnZW9tIiwiTWVzaCIsImdlb21ldHJ5IiwibWF0ZXJpYWwiLCJjdXN0b20iLCJidWlsZCIsIndyYXAiLCJyZXNvbHZlIiwiYXBwbHlDb21tYW5kIiwicG9zaXRpb24iLCJyb3RhdGlvbiIsInNjYWxlIiwic2hhZG93IiwieCIsInkiLCJ6IiwiY2FzdFNoYWRvdyIsImNhc3QiLCJyZWNlaXZlU2hhZG93IiwicmVjZWl2ZSIsIm9uV3JhcCIsInF1YXRlcm5pb24iLCJkZXN0IiwiTGlnaHRDb21wb25lbnQiLCJsaWdodCIsIndyYXBTaGFkb3ciLCJkZWZlciIsIm1hcFNpemUiLCJ3aWR0aCIsImhlaWdodCIsImJpYXMiLCJyYWRpdXMiLCJzaGFkb3dDYW1lcmEiLCJjYW1lcmEiLCJuZWFyIiwiZmFyIiwiZm92IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwiQ2FtZXJhQ29tcG9uZW50Iiwic3lzdGVtIiwid2luZG93IiwiQXBwIiwibG9nIiwidmVyc2lvbiIsInJlcXVlc3RBbmltRnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwicmVxdWVzdCIsImVuYWJsZWQiLCJsbCIsImxvb3BzIiwiZSIsImV4ZWN1dGUiLCJjbG9jayIsImxvb3AiLCJpbmRleCIsIkxvb3AiLCJ1c2VDbG9jayIsIkNsb2NrIiwid29ybGQiLCJhZGRMb29wIiwic3RhcnQiLCJzdG9wIiwicmVtb3ZlTG9vcCIsIkFtYmllbnRMaWdodCIsIkFtYmllbnRMaWdodE5hdGl2ZSIsImNvbG9yIiwiaW50ZW5zaXR5IiwiRGlyZWN0aW9uYWxMaWdodCIsIkRpcmVjdGlvbmFsTGlnaHROYXRpdmUiLCJIZW1pc3BoZXJlTGlnaHQiLCJIZW1pc3BoZXJlTGlnaHROYXRpdmUiLCJza3lDb2xvciIsImdyb3VuZENvbG9yIiwiUG9pbnRMaWdodCIsIlBvaW50TGlnaHROYXRpdmUiLCJkaXN0YW5jZSIsImRlY2F5IiwiU3BvdExpZ2h0IiwiU3BvdExpZ2h0TmF0aXZlIiwiYW5nbGUiLCJleHBvbmVudCIsIk1hdGgiLCJQSSIsIkFyZWFMaWdodCIsIlJlY3RBcmVhTGlnaHROYXRpdmUiLCJDdWJlQ2FtZXJhIiwiQ3ViZUNhbWVyYU5hdGl2ZSIsImN1YmVSZXNvbHV0aW9uIiwiT3J0aG9ncmFwaGljQ2FtZXJhIiwiT3J0aG9ncmFwaGljQ2FtZXJhTmF0aXZlIiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0IiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJQZXJzcGVjdGl2ZUNhbWVyYU5hdGl2ZSIsImFzcGVjdCIsIkJveCIsImJ1aWxkR2VvbWV0cnkiLCJidWZmZXIiLCJCb3hCdWZmZXJHZW9tZXRyeSIsIkJveEdlb21ldHJ5IiwiZGVwdGgiLCJ3aWR0aFNlZ21lbnRzIiwiaGVpZ2h0U2VnbWVudHMiLCJkZXB0aFNlZ21lbnRzIiwiQ2lyY2xlIiwiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiLCJDaXJjbGVHZW9tZXRyeSIsInNlZ21lbnRzIiwidGhldGFTdGFydCIsInRoZXRhTGVuZ3RoIiwiQ29uZSIsIkNvbmVCdWZmZXJHZW9tZXRyeSIsIkNvbmVHZW9tZXRyeSIsInJhZGl1c1NlZ21lbnRzIiwib3BlbkVuZGVkIiwiQ3lsaW5kZXIiLCJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IiwiQ3lsaW5kZXJHZW9tZXRyeSIsInJhZGl1c1RvcCIsInJhZGl1c0JvdHRvbSIsIkRvZGVjYWhlZHJvbiIsIkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiRG9kZWNhaGVkcm9uR2VvbWV0cnkiLCJkZXRhaWwiLCJFeHRydWRlIiwiRXh0cnVkZUdlb21ldHJ5Iiwic2hhcGVzIiwib3B0aW9ucyIsIkJ1ZmZlckdlb21ldHJ5IiwiZnJvbUdlb21ldHJ5IiwiSWNvc2FoZWRyb24iLCJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiSWNvc2FoZWRyb25HZW9tZXRyeSIsIkxhdGhlIiwiTGF0aGVCdWZmZXJHZW9tZXRyeSIsIkxhdGhlR2VvbWV0cnkiLCJwb2ludHMiLCJMaW5lIiwiTGluZU5hdGl2ZSIsIkdlb21ldHJ5IiwicHAiLCJjdXJ2ZSIsImdldFBvaW50cyIsInZlcnRzIiwiRmxvYXQzMkFycmF5IiwiaTMiLCJhZGRBdHRyaWJ1dGUiLCJCdWZmZXJBdHRyaWJ1dGUiLCJ2ZXJ0aWNlcyIsIkltcG9ydGVyIiwiZmlsdGVyIiwicHJvY2Vzc0ZpbHRlciIsImZvckVhY2giLCJlbCIsInRleHR1cmVQYXRoIiwibG9hZGVyIiwic2V0VGV4dHVyZVBhdGgiLCJsb2FkIiwidXJsIiwib25Mb2FkIiwicGFyc2VyIiwib25Qcm9ncmVzcyIsIm9uRXJyb3IiLCJKU09OTG9hZGVyIiwidXNlQ3VzdG9tTWF0ZXJpYWwiLCJtYXQiLCJib25lcyIsIlNraW5uZWRNZXNoIiwiT2N0YWhlZHJvbiIsIk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSIsIk9jdGFoZWRyb25HZW9tZXRyeSIsIlBhcmFtZXRyaWMiLCJQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkiLCJQYXJhbWV0cmljR2VvbWV0cnkiLCJzbGljZXMiLCJzdGFja3MiLCJ1IiwidiIsIlZlY3RvcjMiLCJQbGFuZSIsIlBsYW5lQnVmZmVyR2VvbWV0cnkiLCJQbGFuZUdlb21ldHJ5Iiwid1NlZ21lbnRzIiwiaFNlZ21lbnRzIiwidmVydGljZXNPZkN1YmUiLCJpbmRpY2VzT2ZGYWNlcyIsIlBvbHloZWRyb24iLCJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJQb2x5aGVkcm9uR2VvbWV0cnkiLCJSaW5nIiwiUmluZ0J1ZmZlckdlb21ldHJ5IiwiUmluZ0dlb21ldHJ5IiwiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyIsInRoZXRhU2VnbWVudHMiLCJwaGlTZWdtZW50cyIsIlNoYXBlIiwiU2hhcGVCdWZmZXJHZW9tZXRyeSIsIlNoYXBlR2VvbWV0cnkiLCJTcGhlcmUiLCJTcGhlcmVCdWZmZXJHZW9tZXRyeSIsIlNwaGVyZUdlb21ldHJ5IiwiVGV0cmFoZWRyb24iLCJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiVGV0cmFoZWRyb25HZW9tZXRyeSIsIlRleHQiLCJwYXRoIiwiZm9udCIsIlRleHRHZW9tZXRyeSIsInRleHQiLCJhc3NpZ24iLCJzaXplIiwiY3VydmVTZWdtZW50cyIsIkZvbnQiLCJiZXZlbEVuYWJsZWQiLCJiZXZlbFRoaWNrbmVzcyIsImJldmVsU2l6ZSIsIkZvbnRMb2FkZXIiLCJUb3J1cyIsIlRvcnVzR2VvbWV0cnkiLCJ0dWJlIiwicmFkaWFsU2VnbWVudHMiLCJ0dWJ1bGFyU2VnbWVudHMiLCJhcmMiLCJUb3J1c2tub3QiLCJHQ29uc3RydWN0IiwiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiLCJUb3J1c0tub3RHZW9tZXRyeSIsInAiLCJxIiwiVHViZSIsIlR1YmVCdWZmZXJHZW9tZXRyeSIsIlR1YmVHZW9tZXRyeSIsImNsb3NlZCIsIkxpbmVDdXJ2ZTMiLCJHcm91cCIsIm9iaiIsImFkZFRvIiwiT2JqZWN0M0QiLCJFbGVtZW50TW9kdWxlIiwiY29udGFpbmVyIiwiYm9keSIsImNyZWF0ZUVsZW1lbnQiLCJlbGVtZW50IiwiY2xhc3NOYW1lIiwic3R5bGUiLCJzZWxmIiwiYXBwZW5kQ2hpbGQiLCJSZW5kZXJpbmdNb2R1bGUiLCJhZGRpdGlvbmFsIiwicmVzb2x1dGlvbiIsIlZlY3RvcjIiLCJwaXhlbFJhdGlvIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImJnQ29sb3IiLCJiZ09wYWNpdHkiLCJyZW5kZXJlciIsImZpeCIsIldlYkdMUmVuZGVyZXIiLCJlZmZlY3RzIiwic2V0Q2xlYXJDb2xvciIsInNldFBpeGVsUmF0aW8iLCJzZXRTaXplIiwiTnVtYmVyIiwidG9GaXhlZCIsImFwcGx5QWRkaXRpb25hbCIsInNjZW5lIiwiYXR0YWNoVG9DYW52YXMiLCJyZW5kZXIiLCJlZmZlY3QiLCJlZmZlY3RMb29wIiwicmVuZGVyTG9vcCIsImdldFNpemUiLCJhcHAiLCJjYW52YXMiLCJkb21FbGVtZW50IiwiZGVmaW5lIiwiaW50ZWdyYXRlUmVuZGVyZXIiLCJ1cGRhdGUiLCJmb3JjZUNvbnRleHRMb3NzIiwic2hhZG93TWFwIiwiU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORSIsIlN5bWJvbCIsIlNjZW5lTW9kdWxlIiwid2lsbFNjZW5lQmVSZXBsYWNlZCIsIlNjZW5lIiwib25SZW1vdmUiLCJfc2V0U2NlbmUiLCJzZXRTY2VuZSIsImdldFNjZW5lIiwiUmVzaXplTW9kdWxlIiwiYXV0byIsImNhbGxiYWNrcyIsInVwZGF0ZVByb2plY3Rpb25NYXRyaXgiLCJyZW5kZXJpbmciLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImdldENvbnRhaW5lciIsImdldFJlc29sdXRpb24iLCJhZGRFdmVudExpc3RlbmVyIiwidHJpZ2dlciIsImFkZEF1dG9yZXNpemUiLCJmcmFnbWVudCIsInZlcnRleCIsIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwiZGVmaW5lcyIsIk1JUF9MRVZFTF8xWDEiLCJ1bmlmb3JtcyIsInRQcmV2aW91c0x1bSIsIlVuaWZvcm0iLCJ0Q3VycmVudEx1bSIsIm1pbkx1bWluYW5jZSIsImRlbHRhIiwidGF1IiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJkZXB0aFdyaXRlIiwiZGVwdGhUZXN0IiwiU2hhZGVyTWF0ZXJpYWwiLCJCb2tlaE1hdGVyaWFsIiwic2V0dGluZ3MiLCJmb2N1cyIsImRvZiIsImFwZXJ0dXJlIiwibWF4Qmx1ciIsImNhbWVyYU5lYXIiLCJjYW1lcmFGYXIiLCJ0RGlmZnVzZSIsInREZXB0aCIsImFkb3B0Q2FtZXJhU2V0dGluZ3MiLCJDb2xvckVkZ2VzTWF0ZXJpYWwiLCJ0ZXhlbFNpemUiLCJFREdFX1RIUkVTSE9MRCIsInRocmVzaG9sZCIsIm5lZWRzVXBkYXRlIiwiQ29tYmluZU1hdGVyaWFsIiwic2NyZWVuTW9kZSIsInRleHR1cmUxIiwidGV4dHVyZTIiLCJvcGFjaXR5MSIsIm9wYWNpdHkyIiwic2V0U2NyZWVuTW9kZUVuYWJsZWQiLCJTQ1JFRU5fTU9ERSIsIkNvbnZvbHV0aW9uTWF0ZXJpYWwiLCJoYWxmVGV4ZWxTaXplIiwia2VybmVsIiwic2V0VGV4ZWxTaXplIiwia2VybmVsU2l6ZSIsIktlcm5lbFNpemUiLCJMQVJHRSIsImtlcm5lbFByZXNldHMiLCJtdWx0aXBseVNjYWxhciIsIlZFUllfU01BTEwiLCJTTUFMTCIsIk1FRElVTSIsIlZFUllfTEFSR0UiLCJIVUdFIiwiQ29weU1hdGVyaWFsIiwib3BhY2l0eSIsIkRlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIiwiZGVwdGhUZXh0dXJlIiwibW9ycGhUYXJnZXRzIiwic2tpbm5pbmciLCJQRVJTUEVDVElWRV9DQU1FUkEiLCJEb3RTY3JlZW5NYXRlcmlhbCIsImF2ZXJhZ2UiLCJvZmZzZXRSZXBlYXQiLCJWZWN0b3I0Iiwic2V0QXZlcmFnZUVuYWJsZWQiLCJBVkVSQUdFIiwiRmlsbU1hdGVyaWFsIiwibm9pc2UiLCJzY2FubGluZXMiLCJncmlkIiwiZ3JleXNjYWxlIiwic2VwaWEiLCJ2aWduZXR0ZSIsImVza2lsIiwibm9pc2VJbnRlbnNpdHkiLCJzY2FubGluZUludGVuc2l0eSIsImdyaWRJbnRlbnNpdHkiLCJncmV5c2NhbGVJbnRlbnNpdHkiLCJzZXBpYUludGVuc2l0eSIsInZpZ25ldHRlT2Zmc2V0IiwidmlnbmV0dGVEYXJrbmVzcyIsInRpbWUiLCJzY2FubGluZUNvdW50IiwiZ3JpZFNjYWxlIiwiZ3JpZExpbmVXaWR0aCIsInNldE5vaXNlRW5hYmxlZCIsInNldFNjYW5saW5lc0VuYWJsZWQiLCJzZXRHcmlkRW5hYmxlZCIsInNldEdyZXlzY2FsZUVuYWJsZWQiLCJzZXRTZXBpYUVuYWJsZWQiLCJzZXRWaWduZXR0ZUVuYWJsZWQiLCJzZXRFc2tpbEVuYWJsZWQiLCJOT0lTRSIsIlNDQU5MSU5FUyIsIkdSSUQiLCJHUkVZU0NBTEUiLCJTRVBJQSIsIlZJR05FVFRFIiwiRVNLSUwiLCJHbGl0Y2hNYXRlcmlhbCIsInRQZXJ0dXJiIiwiYW1vdW50Iiwic2VlZCIsInNlZWRYIiwic2VlZFkiLCJkaXN0b3J0aW9uWCIsImRpc3RvcnRpb25ZIiwiY29sUyIsIkdvZFJheXNNYXRlcmlhbCIsImV4cG9zdXJlIiwiZGVuc2l0eSIsIndlaWdodCIsImNsYW1wTWF4IiwiTlVNX1NBTVBMRVNfRkxPQVQiLCJOVU1fU0FNUExFU19JTlQiLCJsaWdodFBvc2l0aW9uIiwiTHVtaW5vc2l0eU1hdGVyaWFsIiwiY29sb3JPdXRwdXQiLCJsdW1pbmFuY2VSYW5nZSIsIm1hc2tMdW1pbmFuY2UiLCJkaXN0aW5jdGlvbiIsInJhbmdlIiwic2V0Q29sb3JPdXRwdXRFbmFibGVkIiwic2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkIiwiQ09MT1IiLCJSQU5HRSIsIk91dGxpbmVCbGVuZE1hdGVyaWFsIiwiZWRnZVN0cmVuZ3RoIiwicGF0dGVyblNjYWxlIiwidmlzaWJsZUVkZ2VDb2xvciIsImhpZGRlbkVkZ2VDb2xvciIsImFscGhhQmxlbmRpbmciLCJ4UmF5IiwicHVsc2UiLCJ0TWFzayIsInRFZGdlcyIsInRQYXR0ZXJuIiwiQ29sb3IiLCJzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZCIsInNldFhSYXlFbmFibGVkIiwiQUxQSEFfQkxFTkRJTkciLCJYX1JBWSIsInRleHR1cmUiLCJVU0VfUEFUVEVSTiIsIk91dGxpbmVFZGdlc01hdGVyaWFsIiwiUGl4ZWxhdGlvbk1hdGVyaWFsIiwiZ3JhbnVsYXJpdHkiLCJkeCIsImR5IiwiUmVhbGlzdGljQm9rZWhNYXRlcmlhbCIsInJpbmdzIiwic2FtcGxlcyIsInNob3dGb2N1cyIsIm1hbnVhbERvRiIsInBlbnRhZ29uIiwic2hhZGVyRm9jdXMiLCJsdW1pbmFuY2VUaHJlc2hvbGQiLCJsdW1pbmFuY2VHYWluIiwiZnJpbmdlIiwiZGl0aGVyU3RyZW5ndGgiLCJSSU5HU19JTlQiLCJSSU5HU19GTE9BVCIsIlNBTVBMRVNfSU5UIiwiU0FNUExFU19GTE9BVCIsImZvY2FsTGVuZ3RoIiwiZm9jYWxTdG9wIiwiZm9jdXNDb29yZHMiLCJmb2NhbERlcHRoIiwic2V0U2hvd0ZvY3VzRW5hYmxlZCIsInNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQiLCJzZXRQZW50YWdvbkVuYWJsZWQiLCJzZXRTaGFkZXJGb2N1c0VuYWJsZWQiLCJTSE9XX0ZPQ1VTIiwiTUFOVUFMX0RPRiIsIlBFTlRBR09OIiwiU0hBREVSX0ZPQ1VTIiwiZ2V0Rm9jYWxMZW5ndGgiLCJTaG9ja1dhdmVNYXRlcmlhbCIsIm1heFJhZGl1cyIsIndhdmVTaXplIiwiYW1wbGl0dWRlIiwiY2VudGVyIiwiY2FtZXJhRGlzdGFuY2UiLCJTTUFBQmxlbmRNYXRlcmlhbCIsInRXZWlnaHRzIiwiU01BQVdlaWdodHNNYXRlcmlhbCIsIk1BWF9TRUFSQ0hfU1RFUFNfSU5UIiwiTUFYX1NFQVJDSF9TVEVQU19GTE9BVCIsIkFSRUFURVhfTUFYX0RJU1RBTkNFIiwiQVJFQVRFWF9QSVhFTF9TSVpFIiwiQVJFQVRFWF9TVUJURVhfU0laRSIsIlNFQVJDSFRFWF9TSVpFIiwiU0VBUkNIVEVYX1BBQ0tFRF9TSVpFIiwidEFyZWEiLCJ0U2VhcmNoIiwic3RlcHMiLCJUb25lTWFwcGluZ01hdGVyaWFsIiwibHVtaW5hbmNlTWFwIiwiYXZlcmFnZUx1bWluYW5jZSIsIm1heEx1bWluYW5jZSIsIm1pZGRsZUdyZXkiLCJQYXNzIiwicXVhZCIsImZydXN0dW1DdWxsZWQiLCJyZW5kZXJUb1NjcmVlbiIsIm5lZWRzU3dhcCIsImlucHV0QnVmZmVyIiwib3V0cHV0QnVmZmVyIiwic3RlbmNpbFRlc3QiLCJhbHBoYSIsImtleXMiLCJCbHVyUGFzcyIsInJlbmRlclRhcmdldFgiLCJXZWJHTFJlbmRlclRhcmdldCIsIm1pbkZpbHRlciIsIkxpbmVhckZpbHRlciIsIm1hZ0ZpbHRlciIsInN0ZW5jaWxCdWZmZXIiLCJkZXB0aEJ1ZmZlciIsImdlbmVyYXRlTWlwbWFwcyIsInJlbmRlclRhcmdldFkiLCJyZXNvbHV0aW9uU2NhbGUiLCJjb252b2x1dGlvbk1hdGVyaWFsIiwiZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsIiwiZGl0aGVyaW5nIiwiZ2V0S2VybmVsIiwibGFzdFJUIiwiZGVzdFJUIiwibCIsImZsb29yIiwiZm9ybWF0IiwiUkdCRm9ybWF0IiwiQmxvb21QYXNzIiwicmVuZGVyVGFyZ2V0IiwiYmx1clBhc3MiLCJjb21iaW5lTWF0ZXJpYWwiLCJsdW1pbm9zaXR5TWF0ZXJpYWwiLCJibGVuZCIsImluaXRpYWxpemUiLCJCb2tlaFBhc3MiLCJDbGVhck1hc2tQYXNzIiwiYnVmZmVycyIsInN0ZW5jaWwiLCJzZXRUZXN0IiwiQ2xlYXJQYXNzIiwiY2xlYXJDb2xvciIsImNsZWFyQWxwaGEiLCJnZXRDbGVhckNvbG9yIiwiZ2V0Q2xlYXJBbHBoYSIsInNldFJlbmRlclRhcmdldCIsImNsZWFyIiwiRG90U2NyZWVuUGFzcyIsInciLCJGaWxtUGFzcyIsInNjYW5saW5lRGVuc2l0eSIsInJvdW5kIiwicmFuZG9tSW50IiwibG93IiwiaGlnaCIsInJhbmRvbSIsInJhbmRvbUZsb2F0IiwiR2xpdGNoUGFzcyIsInBlcnR1cmJNYXAiLCJnZW5lcmF0ZVBlcnR1cmJNYXAiLCJkdFNpemUiLCJtb2RlIiwiR2xpdGNoTW9kZSIsIlNQT1JBRElDIiwiY291bnRlciIsImJyZWFrUG9pbnQiLCJwaXhlbHMiLCJkdCIsIkRhdGFUZXh0dXJlIiwiRmxvYXRUeXBlIiwiQ09OU1RBTlRfV0lMRCIsIkNPTlNUQU5UX01JTEQiLCJSZW5kZXJQYXNzIiwiY2xlYXJQYXNzIiwib3ZlcnJpZGVNYXRlcmlhbCIsImNsZWFyRGVwdGgiLCJjbGFtcCIsIkdvZFJheXNQYXNzIiwibGlnaHRTb3VyY2UiLCJsaWdodFNjZW5lIiwibWFpblNjZW5lIiwibWFpbkNhbWVyYSIsInJlbmRlclRhcmdldE1hc2siLCJyZW5kZXJQYXNzTGlnaHQiLCJyZW5kZXJQYXNzTWFzayIsIk1lc2hCYXNpY01hdGVyaWFsIiwic2NyZWVuUG9zaXRpb24iLCJnb2RSYXlzTWF0ZXJpYWwiLCJiYWNrZ3JvdW5kIiwicHJvamVjdCIsInBhcnNlSW50IiwiTWFza1Bhc3MiLCJpbnZlcnNlIiwiY2xlYXJTdGVuY2lsIiwiY29udGV4dCIsIndyaXRlVmFsdWUiLCJjbGVhclZhbHVlIiwic2V0TWFzayIsInNldExvY2tlZCIsInNldE9wIiwiUkVQTEFDRSIsInNldEZ1bmMiLCJBTFdBWVMiLCJzZXRDbGVhciIsIkVRVUFMIiwiS0VFUCIsIlNoYWRlclBhc3MiLCJ0ZXh0dXJlSUQiLCJPdXRsaW5lUGFzcyIsInJlbmRlclRhcmdldERlcHRoIiwicmVuZGVyVGFyZ2V0RWRnZXMiLCJyZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMiLCJyZW5kZXJQYXNzRGVwdGgiLCJNZXNoRGVwdGhNYXRlcmlhbCIsImRlcHRoUGFja2luZyIsIlJHQkFEZXB0aFBhY2tpbmciLCJjb3B5UGFzcyIsIm91dGxpbmVFZGdlc01hdGVyaWFsIiwib3V0bGluZUJsZW5kTWF0ZXJpYWwiLCJibHVyIiwic2VsZWN0aW9uIiwicHVsc2VTcGVlZCIsInNlbGVjdGlvbkxheWVyIiwic2V0UGF0dGVyblRleHR1cmUiLCJvYmplY3RzIiwiY2xlYXJTZWxlY3Rpb24iLCJsYXllcnMiLCJlbmFibGUiLCJkaXNhYmxlIiwidmlzaWJsZSIsIm1hc2siLCJjb3MiLCJzZXRTZWxlY3Rpb25WaXNpYmxlIiwiUGl4ZWxhdGlvblBhc3MiLCJzZXRSZXNvbHV0aW9uIiwiUmVhbGlzdGljQm9rZWhQYXNzIiwiU2F2ZVBhc3MiLCJyZXNpemUiLCJIQUxGX1BJIiwiYWIiLCJTaG9ja1dhdmVQYXNzIiwiZXBpY2VudGVyIiwic3BlZWQiLCJzaG9ja1dhdmVNYXRlcmlhbCIsImNvcHlNYXRlcmlhbCIsImdldFdvcmxkRGlyZWN0aW9uIiwic3ViIiwiYW5nbGVUbyIsImRpc3RhbmNlVG8iLCJTTUFBUGFzcyIsInNlYXJjaEltYWdlIiwiYXJlYUltYWdlIiwicmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyIsInJlbmRlclRhcmdldFdlaWdodHMiLCJSR0JBRm9ybWF0IiwiY29sb3JFZGdlc01hdGVyaWFsIiwid2VpZ2h0c01hdGVyaWFsIiwic2VhcmNoVGV4dHVyZSIsIlRleHR1cmUiLCJOZWFyZXN0RmlsdGVyIiwiZmxpcFkiLCJhcmVhVGV4dHVyZSIsImJsZW5kTWF0ZXJpYWwiLCJzZWFyY2hJbWFnZURhdGFVUkwiLCJhcmVhSW1hZ2VEYXRhVVJMIiwiVGV4dHVyZVBhc3MiLCJvcGFjaXR5U291cmNlIiwiVG9uZU1hcHBpbmdQYXNzIiwicmVuZGVyVGFyZ2V0THVtaW5vc2l0eSIsIkxpbmVhck1pcE1hcExpbmVhckZpbHRlciIsInJlbmRlclRhcmdldEFkYXB0ZWQiLCJyZW5kZXJUYXJnZXRQcmV2aW91cyIsImFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwidG9uZU1hcHBpbmdNYXRlcmlhbCIsImFkYXB0aXZlIiwiY2VpbCIsImxvZzIiLCJwb3ciLCJBREFQVEVEX0xVTUlOQU5DRSIsIkVmZmVjdENvbXBvc2VyIiwiYXV0b0NsZWFyIiwiY3JlYXRlQnVmZmVyIiwicGFzc2VzIiwib2xkUmVuZGVyZXIiLCJvbGRTaXplIiwibmV3U2l6ZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImRyYXdpbmdCdWZmZXJTaXplIiwiZ2V0RHJhd2luZ0J1ZmZlclNpemUiLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsIkRlcHRoVGV4dHVyZSIsIkRlcHRoU3RlbmNpbEZvcm1hdCIsIlVuc2lnbmVkSW50MjQ4VHlwZSIsInBhc3MiLCJOT1RFUVVBTCIsInBvbHlmaWxsIiwibWV0aG9kIiwic2hvd1dhcm4iLCJQb3N0UHJvY2Vzc29yTW9kdWxlIiwiZGVidWciLCJjb21wb3NlciIsImdldERlbHRhIiwicmVwbGFjZVJlbmRlcmVyIiwiYWRkUGFzcyIsImN1cnJlbnRQYXNzIiwiYm9vbCIsIkV2ZW50c1BhdGNoTW9kdWxlIiwib3JpZ2luT2JqZWN0IiwiZGVzdE9iamVjdCIsImV2ZW50cyIsImV2ZW50IiwiZW1pdCIsInBhdGNoRXZlbnRzIiwiVmlydHVhbE1vdXNlTW9kdWxlIiwiZ2xvYmFsTW92ZW1lbnQiLCJSYXljYXN0ZXIiLCJjdXN0b21YIiwiY3VzdG9tWSIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRYIiwiY2xpZW50WSIsIm1vdXNlIiwicHJvamVjdGlvblBsYW5lIiwibm9ybWFsIiwicmF5Y2FzdGVyIiwic2V0RnJvbUNhbWVyYSIsInJlcXVpcmUiLCJvbiIsImV2IiwiZ2xvYmFsWCIsImdsb2JhbFkiLCJwb2ludGVyTG9ja0VsZW1lbnQiLCJtb3ZlbWVudFgiLCJtb3ZlbWVudFkiLCJuZXN0ZWQiLCJpc0hvdmVyZWQiLCJob3ZlcnMiLCJ0cmF2ZXJzZSIsImNoaWxkIiwiaW50ZXJzZWN0T2JqZWN0cyIsImludGVyc2VjdE9iamVjdCIsInBsYW5lIiwicmF5IiwiaW50ZXJzZWN0UGxhbmUiLCJpbnRlcnNlY3Rpb24iLCJDb250cm9sc01vZHVsZSIsImNvbnRyb2xzIiwiYyIsInVwZGF0ZUxvb3AiLCJGb2dNb2R1bGUiLCJmb2ciLCJGb2dFeHAyIiwiRm9nIiwiaXNFcXVhbERlZmF1bHQiLCJhIiwiYiIsImVxdWFscyIsIlN0YXRlTW9kdWxlIiwiaXNFcXVhbCIsImVxdWFsQ2hlY2siLCJhY3Rpb25HZW5lcmF0ZSIsImNvbmZpZ3VyYXRpb24iLCJjdXJyZW50Q29uZmlnIiwicHJldkNvbmZpZyIsImNvbmZpZyIsImRlZmF1bHQiLCJyZXBsYWNlUmVkdWNlciIsImNvbmZpZ3MiLCJ1cGRhdGVzIiwiY29uZmlnTmFtZSIsInRydWVWYWwiLCJmYWxzZVZhbCIsIlRocmVlT3JiaXRDb250cm9scyIsImV2ZW50SGFuZGxlciIsIm1pbkRpc3RhbmNlIiwibWF4RGlzdGFuY2UiLCJJbmZpbml0eSIsIm1pblpvb20iLCJtYXhab29tIiwibWluUG9sYXJBbmdsZSIsIm1heFBvbGFyQW5nbGUiLCJtaW5BemltdXRoQW5nbGUiLCJtYXhBemltdXRoQW5nbGUiLCJlbmFibGVEYW1waW5nIiwiZGFtcGluZ0ZhY3RvciIsImVuYWJsZVpvb20iLCJ6b29tU3BlZWQiLCJlbmFibGVSb3RhdGUiLCJyb3RhdGVTcGVlZCIsImVuYWJsZVBhbiIsImtleVBhblNwZWVkIiwiYXV0b1JvdGF0ZSIsImF1dG9Sb3RhdGVTcGVlZCIsImVuYWJsZUtleXMiLCJMRUZUIiwiVVAiLCJSSUdIVCIsIkJPVFRPTSIsIm1vdXNlQnV0dG9ucyIsIk9SQklUIiwiTU9VU0UiLCJaT09NIiwiTUlERExFIiwiUEFOIiwidGFyZ2V0MCIsInBvc2l0aW9uMCIsInpvb20wIiwiem9vbSIsImdldFBvbGFyQW5nbGUiLCJzcGhlcmljYWwiLCJwaGkiLCJnZXRBemltdXRoYWxBbmdsZSIsInRoZXRhIiwicmVzZXQiLCJkaXNwYXRjaEV2ZW50IiwiY2hhbmdlRXZlbnQiLCJTVEFURSIsIk5PTkUiLCJvZmZzZXQiLCJxdWF0IiwiUXVhdGVybmlvbiIsInNldEZyb21Vbml0VmVjdG9ycyIsInVwIiwicXVhdEludmVyc2UiLCJsYXN0UG9zaXRpb24iLCJsYXN0UXVhdGVybmlvbiIsImFwcGx5UXVhdGVybmlvbiIsInNldEZyb21WZWN0b3IzIiwicm90YXRlTGVmdCIsImdldEF1dG9Sb3RhdGlvbkFuZ2xlIiwic3BoZXJpY2FsRGVsdGEiLCJtYWtlU2FmZSIsInBhbk9mZnNldCIsInNldEZyb21TcGhlcmljYWwiLCJsb29rQXQiLCJ6b29tQ2hhbmdlZCIsImRpc3RhbmNlVG9TcXVhcmVkIiwiRVBTIiwiZG90IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uQ29udGV4dE1lbnUiLCJvbk1vdXNlRG93biIsIm9uTW91c2VXaGVlbCIsIm9uVG91Y2hTdGFydCIsIm9uVG91Y2hFbmQiLCJvblRvdWNoTW92ZSIsIm9uTW91c2VNb3ZlIiwib25Nb3VzZVVwIiwib25LZXlEb3duIiwic3RhcnRFdmVudCIsImVuZEV2ZW50IiwiUk9UQVRFIiwiRE9MTFkiLCJUT1VDSF9ST1RBVEUiLCJUT1VDSF9ET0xMWSIsIlRPVUNIX1BBTiIsIlNwaGVyaWNhbCIsInJvdGF0ZVN0YXJ0Iiwicm90YXRlRW5kIiwicm90YXRlRGVsdGEiLCJwYW5TdGFydCIsInBhbkVuZCIsInBhbkRlbHRhIiwiZG9sbHlTdGFydCIsImRvbGx5RW5kIiwiZG9sbHlEZWx0YSIsImdldFpvb21TY2FsZSIsInJvdGF0ZVVwIiwicGFuTGVmdCIsIm9iamVjdE1hdHJpeCIsInNldEZyb21NYXRyaXhDb2x1bW4iLCJwYW5VcCIsInBhbiIsImRlbHRhWCIsImRlbHRhWSIsInRhcmdldERpc3RhbmNlIiwidGFuIiwiY2xpZW50SGVpZ2h0IiwibWF0cml4IiwiY2xpZW50V2lkdGgiLCJkb2xseUluIiwiZG9sbHlTY2FsZSIsImRvbGx5T3V0IiwiaGFuZGxlTW91c2VEb3duUm90YXRlIiwiaGFuZGxlTW91c2VEb3duRG9sbHkiLCJoYW5kbGVNb3VzZURvd25QYW4iLCJoYW5kbGVNb3VzZU1vdmVSb3RhdGUiLCJzdWJWZWN0b3JzIiwiaGFuZGxlTW91c2VNb3ZlRG9sbHkiLCJoYW5kbGVNb3VzZU1vdmVQYW4iLCJoYW5kbGVNb3VzZVdoZWVsIiwiaGFuZGxlS2V5RG93biIsImtleUNvZGUiLCJoYW5kbGVUb3VjaFN0YXJ0Um90YXRlIiwidG91Y2hlcyIsInBhZ2VYIiwicGFnZVkiLCJoYW5kbGVUb3VjaFN0YXJ0RG9sbHkiLCJzcXJ0IiwiaGFuZGxlVG91Y2hTdGFydFBhbiIsImhhbmRsZVRvdWNoTW92ZVJvdGF0ZSIsImhhbmRsZVRvdWNoTW92ZURvbGx5IiwiaGFuZGxlVG91Y2hNb3ZlUGFuIiwicHJldmVudERlZmF1bHQiLCJidXR0b24iLCJoYW5kbGVNb3VzZVVwIiwic3RvcFByb3BhZ2F0aW9uIiwiaGFuZGxlVG91Y2hFbmQiLCJFdmVudERpc3BhdGNoZXIiLCJPcmJpdENvbnRyb2xzTW9kdWxlIiwiZm9sbG93IiwidXBkYXRlUHJvY2Vzc29yIiwic2V0Q29udHJvbHMiLCJzZXRVcGRhdGUiLCJEeW5hbWljR2VvbWV0cnlNb2R1bGUiLCJnXyIsInVwZGF0ZVBhcmFtcyIsInBhcmFtZXRlcnMiLCJUZXh0dXJlTG9hZGVyIiwiVGV4dHVyZU1vZHVsZSIsInRleHR1cmVzIiwicmVwZWF0IiwiUmVwZWF0V3JhcHBpbmciLCJtYXBwaW5nIiwiVVZNYXBwaW5nIiwidGV4Iiwid3JhcFMiLCJ3cmFwVCIsIkFuaW1hdGlvbk1vZHVsZSIsImlzRGVmZXJyZWQiLCJza2VsZXRvbiIsIm1peGVyIiwiQW5pbWF0aW9uTWl4ZXIiLCJjbGlwcyIsImFuaW1hdGlvbnMiLCJjbGlwTmFtZSIsImNsaXAiLCJBbmltYXRpb25DbGlwIiwiZmluZEJ5TmFtZSIsImNsaXBBY3Rpb24iLCJwbGF5IiwiRGVmaW5lTW9kdWxlIiwiTW9kZWwiLCJDYW1lcmFNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7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QUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2xDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDM0MsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwRCxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0QsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDdEMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxPQUFP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QUFFOztDQUV2QixDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVk7O0NBRTdCOztDQUVBLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUVmLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUUzRCxHQUFHOztDQUVILEVBQUUsT0FBTyxTQUFTLFlBQVksR0FBRzs7Q0FFakMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztDQUMzQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0NBQzNDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7Q0FDM0MsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztDQUMzQyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRztDQUM5RyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHO0NBQ2pILElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtDQUMzRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7O0NBRS9GO0NBQ0EsR0FBRyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxDQUFDOztDQUVKLEVBQUUsSUFBSTs7Q0FFTixDQUFDLEtBQUssRUFBRSxXQUFXLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRTs7Q0FFRjtDQUNBOztDQUVBLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFcEMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRS9CLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUzQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUVyRCxFQUFFOztDQUVGOztDQUVBLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTVCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRS9CLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFdEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFeEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLE9BQU8sRUFBRSxXQUFXLEdBQUcsRUFBRSxJQUFJLEdBQUc7O0NBRWpDLEVBQUUsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVoRSxFQUFFOztDQUVGOztDQUVBLENBQUMsU0FBUyxFQUFFLFdBQVcsR0FBRyxFQUFFLElBQUksR0FBRzs7Q0FFbkMsRUFBRSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUU5QyxFQUFFOztDQUVGOztDQUVBLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sS0FBSyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7Q0FFekMsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLE9BQU8sR0FBRzs7Q0FFaEMsRUFBRSxPQUFPLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDOztDQUVqQyxFQUFFOztDQUVGLENBQUMsUUFBUSxFQUFFLFdBQVcsT0FBTyxHQUFHOztDQUVoQyxFQUFFLE9BQU8sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7O0NBRWpDLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRWxDLEVBQUUsT0FBTyxFQUFFLEtBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7O0NBRXhELEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRXBDLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRWxFLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRXJDLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRW5FLEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV6QixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNqQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Q0FFakIsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFNUMsQ0FBQyxPQUFPLEVBQUU7O0NBRVYsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7O0NBRWpCLEdBQUc7O0NBRUgsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0NBRWxCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRTs7Q0FFWCxFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQzs7Q0FFakIsR0FBRzs7Q0FFSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQzs7Q0FFbEIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFbEMsQ0FBQyxTQUFTLEVBQUUsSUFBSTs7Q0FFaEIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV4QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFYixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7Q0FDbEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7Q0FFbEIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV0QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUViLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFdEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFYixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxLQUFLLEVBQUUsS0FBSyxHQUFHOztDQUV6QyxFQUFFLFNBQVMsS0FBSzs7Q0FFaEIsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07Q0FDakMsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07Q0FDakMsR0FBRyxTQUFTLE1BQU0sSUFBSSxLQUFLLEVBQUUseUJBQXlCLEdBQUcsS0FBSyxFQUFFLENBQUM7O0NBRWpFLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVsQyxFQUFFLFNBQVMsS0FBSzs7Q0FFaEIsR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDekIsR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDekIsR0FBRyxTQUFTLE1BQU0sSUFBSSxLQUFLLEVBQUUseUJBQXlCLEdBQUcsS0FBSyxFQUFFLENBQUM7O0NBRWpFLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoRCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV0QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNmLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVmLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRXhCLEVBQUUsS0FBSyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUV6QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUZBQXVGLEVBQUUsQ0FBQztDQUMzRyxHQUFHLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWxDLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0NBRWhCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNkLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7O0NBRWQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFL0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVwQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV4QixFQUFFLEtBQUssQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFekIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHVGQUF1RixFQUFFLENBQUM7Q0FDM0csR0FBRyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQyxHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2hCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVoQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTNCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVkLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRS9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Q0FFckIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUUxQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNoQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Q0FFaEIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVyQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0NBQ25CLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7O0NBRW5CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFeEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0NBRWhCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDOztDQUUzQyxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU5QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDN0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFOUI7O0NBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDeEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXhELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDMUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sU0FBUyxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFaEQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUM3QixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU3QixHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRWpDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUVwQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXJHLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFlBQVk7O0NBRW5CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsWUFBWTs7Q0FFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDdkUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXZFLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxZQUFZOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ3BCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7O0NBRXBCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0NBRXJDLEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUUsWUFBWTs7Q0FFdkIsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O0NBRTNDLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsWUFBWTs7Q0FFckIsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV4RCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFlBQVk7O0NBRTlCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxZQUFZOztDQUV4QixFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7O0NBRWpELEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEI7O0NBRUEsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLEtBQUssS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7O0NBRXhDLEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRWYsRUFBRTs7Q0FFRixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUIsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWxELEVBQUU7O0NBRUYsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUMzQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUUzQixFQUFFOztDQUVGLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJDLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTdELEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUVuRCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEtBQUssR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztDQUNyQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDOztDQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRzs7Q0FFekMsRUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXJFLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXhCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRzs7Q0FFdEQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXZDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXpDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Q0FDeEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUMzQixFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7Q0FFL0IsRUFBRSxPQUFPLEtBQUssQ0FBQzs7Q0FFZixFQUFFOztDQUVGLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFNUQsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxxRUFBcUUsRUFBRSxDQUFDOztDQUV6RixHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxNQUFNLEVBQUUsS0FBSyxHQUFHOztDQUUxQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRW5ELEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQzVCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztDQUU1QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Q0FDcEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztDQUVwQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsT0FBTyxHQUFHOztDQUVuQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUc7O0NBRWpCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFWixFQUFFLENBQUM7O0NBRUgsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsK0VBQStFLEVBQUUsQ0FBQzs7Q0FFbkcsRUFBRTs7Q0FFRixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFbEMsQ0FBQyxTQUFTLEVBQUUsSUFBSTs7Q0FFaEIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRWxHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQzlELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUM5RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDL0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUUvRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUUsWUFBWTs7Q0FFdkIsRUFBRSxJQUFJLENBQUMsR0FBRzs7Q0FFVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWIsR0FBRyxDQUFDOztDQUVKLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUVsRCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV0QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUV0QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0UsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNqRixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFD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QUUsR0FBRyxNQUFNLENBQUM7O0NBRTlCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDOUIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztDQUM5QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDOztDQUU5QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0NBQzlCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDOUIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQzs7Q0FFaEMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMscUJBQXFCLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTNDLEVBQUUsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUc7O0NBRXRDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSx1R0FBdUcsRUFBRSxDQUFDOztDQUU1SCxHQUFHOztDQUVILEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRS9CLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVmLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFcEIsR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXRDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUVqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUNqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRTFCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Q0FDakIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSDtDQUNBLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFZjtDQUNBLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFZixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDN0MsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3pDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUU1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXBCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUU3QjtDQUNBLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNk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QUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbkUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDM0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZOztDQUVyQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLHNCQUFzQixFQUFFLFNBQVMsR0FBRzs7Q0FFdEQsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV2RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLElBQUk7O0NBRUosR0FBRyxPQUFPLFNBQVMsQ0FBQzs7Q0FFcEIsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRTtDQUNBOztDQUVBLEVBQUU7Q0FDRixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7O0NBRUosSUFBSTs7Q0FFSixFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksR0FBRyxDQUFDOztDQUVWLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVsRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFdEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVqQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsaUJBQWlCLEdBQUc7O0NBRS9DO0NBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUTtDQUN4QixHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUTs7Q0FFbEIsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtDQUM3RCxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzdELEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDL0QsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTs7Q0FFakUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ2xILEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztDQUNsSCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Q0FDbEgsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRW5ILEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFMUQsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUc7O0NBRW5CLEdBQUcsSUFBSSxHQUFHLEdBQUcsb0VBQW9FLENBQUM7O0NBRWxGLEdBQUcsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLEdBQUc7O0NBRXJDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSSxNQUFNOztDQUVWLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEIsSUFBSTs7Q0FFSixHQUFHLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFdkIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUMxQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVoQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUM1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7Q0FFNUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsWUFBWTs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNFLEVBQUUsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0UsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdB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QU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLE9BQU8sU0FBUyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEdBQUc7O0NBRTNELEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFMUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTlEO0NBQ0EsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUU1QixHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFekI7Q0FDQSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN0QixHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDdEIsR0FBRyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV0QixHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQzs7Q0FFakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7O0NBRWpDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDOztDQUVsQyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNoQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ2hCLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWhCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGVBQWUsRUFBRSxXQUFXLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHOztDQUVuRSxFQUFFLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7Q0FFM0IsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7O0NBRTFILEdBQUc7O0NBRUgsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7Q0FDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0NBQzlDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztDQUM5QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUU1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDdEQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3RELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN2RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFekQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRzs7Q0FFcEUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUUvQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQzs7Q0FFN0IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQzVELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUM1RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUMvRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXZELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQzs7Q0FFM0MsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV2QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDOztDQUU1QyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Q0FDeEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFF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Q0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRWxDLElBQUk7O0NBRUosR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztDQUV0QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDM0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztDQUMzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7O0NBRTNCO0NBQ0EsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUV0QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUVaLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDeEIsRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUM1QixFQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcs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R0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXpCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpDLEdBQUcsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVB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LEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFdEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDdEIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0NBRS9CLEdBQUcsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRzs7Q0FFdkMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWhELEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQ3RCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDOztDQUUvQixHQUFHLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHOztDQUUxQixHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEQsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFH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LEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTdCLEVBQUUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV4Qzs7Q0FFQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDckQsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVyRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFMUQsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUM7Q0FDN0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7O0NBRXpEOztDQUVBLEVBQUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5FLEVBQUUsS0FBSyxZQUFZLEdBQUcsQ0FBQyxHQUFHOztDQUUxQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDckIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQixHQUFHLFlBQVksR0FBRyxFQUFFLFlBQVks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QUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVoRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTlCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVsRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDbEUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzs7Q0FFbkUsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUU3Qzs7Q0FFQSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXRDOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQ3ZELEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdB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QUUsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRTlCOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcs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QUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNWLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVWLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRTNELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXRCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0NBRXRCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMs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RUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsRCxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWxELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUU5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJ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QUNsQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRS9ELEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9CLEVBQUUsSUFBSSxDQUFDLEdBQUc7Q0FDVixHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtDQUN2RCxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7Q0FDM0QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUM7O0NBRUosRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTVCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQzVCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDOUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQzlCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDaEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDaEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFF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LENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU5QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDckQsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUMvRCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFL0QsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUYsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUM7O0NBRUE7O0NBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUc7O0NBRXBCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDZCxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2QsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFZCxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQixHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsOEJBQThCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhEOztDQUVBOztDQUVBLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3BCLEdBQUcsT0FBTyxHQUFHLElBQUk7Q0FDakIsR0FBRyxRQUFRLEdBQUcsR0FBRzs7Q0FFakIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVE7O0NBRWxCLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWhELEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU87Q0FDeEMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUU7Q0FDMUMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRzs7Q0FFN0M7Q0FDQTtDQUNBOztDQUVBLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVE7Q0FDMUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUU7Q0FDNUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFH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R0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUU7Q0FDbEQscUJBQXFCLEVBQUUsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFO0NBQ2xELHFCQUFxQixFQUFFLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRXJELEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVyQztDQUNBOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUVwRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUU5Qjs7Q0FFQSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FB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LElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxH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Q0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3JDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztDQUVyQyxHQUFHLE1BQU07O0NBRVQsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDckMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFNUIsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdEMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXRDLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0QyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7Q0FFdEMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUU1QixHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0QyxHQUFHLEdBQUcsSUFBSSxLQUFL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RUFBRSxRQUFRLEdBQUc7O0NBRWpELEdBQUcsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUc7O0NBRXpCLElBQUksT0FBTyxLQUFLLENBQUM7O0NBRWpCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDNUIsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTFDO0NBQ0EsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdkMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdkMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXZDO0NBQ0EsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUMzQixHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTNCO0NBQ0E7Q0FDQTtDQUNBLEdBQUcsSUFBSSxJQUFJLEdBQUc7Q0FDZCxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUNyRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxF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QSxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVyQztDQUNBLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ2hGLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxN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Rzs7Q0FFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7O0NBRW5CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxFQUFFLFdBQVcsR0FBRzs7Q0FFcEQsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQzs7Q0FFckQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRTVDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxFQUFFLFdBQVcsR0FBRzs7Q0FFcEQsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQzs7Q0FFckQsRUFBRSxJQUFJLFdBQVcsR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLFdBQVcsS0FBSyxHQUFHLENBQUM7O0NBRXRFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFH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LElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNkLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVkLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzNDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMzQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFOUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FD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LENBQUM7O0NBRTFCOztDQUVBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztDQUN0QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkQsRUFBRSxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV6QixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZDLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUVwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZDLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2hCLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUVwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNoQixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9D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QUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXBGLElBQUk7O0NBRUosR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFELElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdELElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLFNBQVMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRzs7Q0FFN0MsR0FBRyxJQUFJLGFBQWEsR0FBRyxPQUFPLEtBQUssU0FBUyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckksR0FBRyxJQUFJLFlBQVksR0FBRyxNQUFNLEtBQUssU0FBUyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXRJLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7Q0FFL0UsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFHLElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdHLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFM0IsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUMsSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNLEVB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QUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFakMsSUFBSTs7Q0FFSixHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzFDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzFDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUxQyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXpELEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUU3QixHQUFHOztDQUVILEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixHQUFHLElBQUks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QyxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFckQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRXZDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXJELEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOztDQUUzQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV6RCxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVqRCxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7O0NB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O0NBQ3BDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDcEMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM5QixNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzlCLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFckIsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVjs7Q0FFQSxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFN0QsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN0QyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM3QixLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzdCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEIsS0FBSyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUN6QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0NBRTdCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NB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QUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDdkQsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7Q0FFOUUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUN0RCxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDOztDQUV2RSxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7Q0FFcEM7Q0FDQSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUzRCxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQzlELEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDbkUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUNoRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUUxRCxFQUFFLEtBQUss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QUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN2RCxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDM0YsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFckQsTUFBTSxNQUFNLEtBQUssRUFBRSxJQUFJLE1BQU0sR0FBRzs7Q0FFaEM7O0NBRUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDaEUsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxNQUFNLE1BQU07O0NBRVo7O0NBRUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDckQsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUN6RixNQUFNLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVyRCxNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSSxNQUFNOztDQUVWOztDQUVBLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsR0FBRyxTQUFTLENBQUM7Q0FDL0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDNUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFbkQsSUFBSTs7Q0FFSixHQUFHLEtBQUssa0JBQWtCLEdBQUc7O0NBRTdCLElBQUksa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEYsSUFBSTs7Q0FFSixHQUFHLEtBQUssc0JBQXNCLEdBQUc7O0NBRWpDLElBQUksc0JBQXNCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRWhGLElBQUk7O0NBRUosR0FBRyxPQUFPLE9BQU8sQ0FBQzs7Q0FFbEIsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGVBQWUsRUFBRSxZQUFZOztDQUU5QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUVwRCxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDL0MsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUN0QyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUNyQyxHQUFHLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFL0MsR0FBRyxLQUFLLEVBQUUsR0FBRyxPQUFPLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRW5DLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRXZDO0NBQ0EsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUV0QjtDQUNBLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFdEI7Q0FDQSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUV2QztDQUNBO0NBQ0E7Q0FDQSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU5QztDQUNBLEdBQUcsT0FBTyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFaEMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGdCQUFnQixFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUV2QyxFQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFaEUsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFckMsRUFBRSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRXZELEVBQUUsS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUFHOztDQUUzQjtDQUNBLEdBQUcsS0FBSyxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0NBRXJELElBQUksT0FBTyxDQUFDLENBQUM7O0NBRWIsSUFBSTs7Q0FFSjs7Q0FFQSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsV0FBVyxDQUFDOztDQUUvRTs7Q0FFQSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDOztDQUUzQixFQUFFOztDQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFNUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV4QyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksR0FBRzs7Q0FFcEIsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUIsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFckM7O0NBRUEsRUFBRSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFekQsRUFBRSxLQUFLLFdBQVcsS0FBSyxDQUFDLEdBQUc7O0NBRTNCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRzs7Q0FFSCxFQUFFLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFdkQsRUFBRSxLQUFLLFdBQVcsR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHOztDQUV2QyxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxPQUFPLEtBQUssQ0FBQzs7Q0FFZixFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsR0FBRyxFQUFFLE1BQU0sR0FBRzs7Q0FFeEMsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDOztDQUU3QyxFQUFFLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Q0FDcEMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUNqQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7O0NBRWxDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFM0IsRUFBRSxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUc7O0NBRXRCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7Q0FDN0MsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFN0MsR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7Q0FDN0MsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFN0MsR0FBRzs7Q0FFSCxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRzs7Q0FFdEIsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHLE1BQU07O0NBRVQsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHOztDQUVILEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLFFBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUUxRDtDQUNBOztDQUVBLEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEQsRUFBRSxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUVwRCxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRzs7Q0FFdEIsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FB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QyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5HLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0NBRXBDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Q0FDMUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUM7O0NBRWxILENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQzs7Q0FFbkMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFM0IsQ0FBQzs7Q0FFRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXJFLENBQUMsV0FBVyxFQUFFLElBQUk7O0NBRWxCLENBQUMsTUFBTSxFQUFFLElBQUk7O0NBRWIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRWpDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7O0NBRXhCLEVBQUU7O0NBRUYsQ0FB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LEVBQUUsQ0FBQzs7Q0FFMUQsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRXJDLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztDQUN0QixJQUFJLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXBELElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztDQUNyQyxJQUFJLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDL0IsSUFBSSxJQUFJLEdBQUcsQ0FBQzs7Q0FFWixJQUFJLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEQsSUFBSSxLQUFLLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxhQUFhLENBQUM7O0NBRXhELElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsS0FBSyxJQUFJLFlBQVksR0FBRyxlQUFlLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxRQUFRLENBQUM7O0NBRXBGLEtBQUssS0FBSyxZQUFZLEtBQUssU0FBUyxHQUFHLFNBQVM7O0NBRWhELEtBQUssR0FBRyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsS0FBSyxHQUFHLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUM5QixLQUFLLEdBQUcsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU5QixLQUFLLEtBQUssWUFB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SUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE1BQU07O0NBRVIsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXRDLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUVqQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLE1BQU07O0NBRVIsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE1BQU07O0NBRVIsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqRCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUQsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUc7O0NBRWpDLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3QyxFQUFFLE1BQU07O0NBRVIsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUM5QixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFckQsRUFBRTs7Q0FFRixDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRzs7Q0FFakMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUUsTUFBTTs7Q0FFUixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQzlCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVyRCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXZDLENBQUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDeEMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDakMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWxELENBQUM7O0NBRUQsU0FBUyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXZDLENBQUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDeEMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDakMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEQsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGlCQUFpQixFQUFFLElBQUksR0FBRzs7Q0FFbkMsQ0FBQyxTQUFTLElBQUk7O0NBRWQsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFVBQVUsQ0FBQztDQUNqQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQzs7Q0FFbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUNsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFVBQVUsQ0FBQztDQUM5QyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sVUFBVSxDQUFDOztDQUVqQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxVQUFVLENBQUM7Q0FDOUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQy9DLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUMvQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRS9DLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQztDQUNELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixDQUFDOztDQUVEOztDQUVBLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxD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RyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEQsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0NBQ2xCLEdBQUcsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXRCLEVBQUUsS0FBSyxDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUssR0FBRzs7Q0FFakM7Q0FDQSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXZDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsYUFBYSxDQUFDLFlBQVksR0FBRyxXQUFXLEdBQUcsRUFBRSxNQUFNLEdBQUc7O0NBRXRELENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUVaLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEQsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXBDLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7Q0FFVixDQUFDLENBQUM7O0NBRUY7Q0FDQTtDQUNBOztDQUVBLFNBQVMsY0FBYyxFQUFFLE1BQU0sR0FBRzs7Q0FFbEMsQ0FBQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVsQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMs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LEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ3ZFLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7O0NBRXZFLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFNUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLE1BQU0sRUFB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LEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCOztDQUVBLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0NBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0NBQzVDLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRXJFLElBQUk7O0NBRUo7O0NBRUEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVoRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssU0FBUyxFQUFFLEdBQUc7O0NBRTVHOztDQUVBLEtBQUssS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTdDLEtBQUssTUFBTTs7Q0FFWDs7Q0FFQSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTVCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVIO0NBQ0E7O0NB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LEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztDQUMvQixJQUFJLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7Q0FDekMsSUFBSSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFOUMsSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7O0NBRTFCLEtBQUssSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7Q0FFL0IsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUxRCxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUQsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0NBRXJDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUs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QU0sQ0FBQzs7Q0FFWjs7Q0FFQSxDQUFDLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRXhDOztDQUVBLEVBQUUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFN0IsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFL0MsR0FBRyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTlCLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM5QixJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3pDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsSUFBSSxLQUFLLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0NBRXRDLEtBQUssS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7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LEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXhDLE1BQU0sS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUV4QyxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUvRCxPQUFPOztDQUVQLE1BQU07O0NBRU4sS0FBSzs7Q0FFTCxJQUFJOztDQUVKOztDQUVBLEdBQUcsTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHOztDQUV4QixJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXJCLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDckQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWxELElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDckQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWxELElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVUOztDQUVBLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUUzQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFH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Q0FFZCxDQUFDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQzs7Q0FFbkIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Q0FFVjs7Q0FFQSxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRTdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7Q0FFckIsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDOztDQUV0Qjs7Q0FFQSxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3BCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVyQzs7Q0FFQTs7Q0FFQSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUc7O0NBRXZCLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENB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QUFFLENBQUM7Q0FDaEYsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWhGLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNuRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVuRCxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFELEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVqQyxHQUFHLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDbkMsR0FBRyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FB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Q0FBQyxJQUFJLFFBQVEsR0FBRztDQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9DLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDL0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRCxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLE9BQU8sR0FBRztDQUNmLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0NBQ3RELEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25ELEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFB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RSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckI7Q0FDQSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUN4QixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQjtDQUNBLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxPQUFPLEdBQUc7Q0FDZixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNqQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUNqQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUNoQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNqQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMs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R0FBRyxDQUFDLEdBQUc7O0NBRTNDO0NBQ0E7O0NBRUEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzVDLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNuQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQztDQUNBOztDQUVBLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDN0MsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUM3QyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU3QyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQ7O0NBRUEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhEOztDQUVBLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7Q0FDbkMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGOztDQUVBLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDOztDQUVBLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDMUQsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUNsRCxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWxEOztDQUVBLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxRQUFR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LEdBQUcsQ0FBQyxHQUFHLGVBQWUsR0FBRyxHQUFHLENBQUM7Q0FDckMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU1Qzs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqRDs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDckMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JDLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRW5ELEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoRDs7Q0FFQSxHQUFHLEdBQUcsQ0FBQyxJ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LENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQzNFLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDM0UsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1RTs7Q0FFQSxDQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0NBQ3ZELEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXJEOztDQUVBLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7Q0FFbkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRzs7Q0FFNUIsRUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSTtDQUN2QyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDN0QsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxPQUFPLEtBQUssQ0FBQztDQUNsRCxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztDQUVkLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7Q0FFZixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHOztDQUU1QixFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJO0NBQ3ZDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUM3RCxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLE9BQU8sS0FBSyxDQUFDOztDQUVsRCxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLElBQUksQ0FBQzs7Q0FFYixDQUFDOztDQUVEOztDQUVBLFNBQVMsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUc7O0NBRXpELENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDOztDQUVmLENBQUMsR0FBRzs7Q0FFSixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOztDQUVsQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHOztDQUU3RyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztDQUMvQixHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztDQUMvQixHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFL0I7O0NBRUEsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsR0FBRyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDOztDQUV4QixHQUFHLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztDQUVqQixHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRSxTQUFTLENBQUMsS0FBSyxLQUFLLEdBQUc7O0NBRXpCLENBQUMsT0FBTyxDQUFDLENBQUM7O0NBRVYsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRzs7Q0FFbkU7O0NBRUEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7O0NBRWYsQ0FBQyxHQUFHOztDQUVKLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O0NBRXRCLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRzs7Q0FFekIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHOztDQUVqRDs7Q0FFQSxJQUFJLElBQUksQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWpDOztDQUVBLElBQUksQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0NBQ2xDLElBQUksQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDOztDQUVsQzs7Q0FFQSxJQUFJLFlBQVksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzNELElBQUksWUFBWSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDM0QsSUFBSSxPQUFPOztDQUVYLElBQUk7O0NBRUosR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFZCxHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRSxTQUFTLENBQUMsS0FBSyxLQUFLLEdBQUc7O0NBRXpCLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxjQUFjLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFHOztDQUU3RCxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDOztDQUUxQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxFQUFFLEtBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2pDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Q0FDL0QsRUFBRSxJQUFJLEdBQUcsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNwRCxFQUFFLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Q0FDaEQsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDOztDQUVwQyxFQUFFOztDQUVGLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFeEI7O0NBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUN6QyxFQUFFLFNBQVMsR0FBRyxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sU0FBUyxDQUFDOztDQUVsQixDQUFDOztDQUVELFNBQVMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0NBRWxCLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxhQUFhLEVBQUUsSUFBSSxFQUFFLFNBQVMsR0FBRzs7Q0FFMUMsQ0FBQyxTQUFTLEdBQUcsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0MsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEIsRUFBRSxJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUxQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDOztDQUU1QixFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsR0FBRzs7Q0FFM0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTO0NBQ2xCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0NBQ2IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Q0FDYixFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVE7Q0FDakIsRUFBRSxDQUFDLENBQUM7O0NBRUo7Q0FDQTs7Q0FFQSxDQUFDLEdBQUc7O0NBRUosRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHOztDQUV6RCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV4RSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHOztDQUU1QixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRVgsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUc7O0NBRXBCLEtBQUssS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztDQUNoQyxLQUFLLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFMUMsS0FBSzs7Q0FFTCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOztDQUVwQyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixFQUFFLFNBQVMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFN0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUV4QixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWhDO0NBQ0E7Q0FDQTs7Q0FFQSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUM7Q0FDYixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNWLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ1YsRUFBRSxNQUFNLEdBQUcsUUFBUTtDQUNuQixFQUFFLEdBQUcsQ0FBQzs7Q0FFTixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOztDQUVaLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxHQUFHOztDQUV0QixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQzNDLE1BQU0sZUFBZSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHOztDQUUxRixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sTUFBTSxHQUFHLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLGFBQWEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUc7O0NBRTFGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNWLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQzs7Q0FFakIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRTs7Q0FFRixDQUFDLE9BQU8sQ0FBQyxDQUFDOztDQUVWLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHOztDQUVsRCxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzs7Q0FFZixDQUFDLEdBQUc7O0NBRUosRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUs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LElBQUksRUFBRSxPQUFPLEdBQUc7O0NBRTdDOztDQUVBLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO0NBQ3BDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDOztDQUVwQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDO0NBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDckMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDOztDQUVyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDO0NBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDckMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDOztDQUVyQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxLQUFLLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7O0NBRWpDLENBQUMsR0FBRzs7Q0FFSixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Q0FDdkMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixFQUFFLFNBQVMsQ0FBQyxLQUFLLEtBQUssR0FBRzs7Q0FFekIsQ0FBQyxPQUFPLFFBQVEsQ0FBQzs7Q0FFakIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUzRCxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUM7Q0FDbEUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztDQUM1RCxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7O0NBRTdELENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFakMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDM0UsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekUsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFekIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV0RSxDQUFDOztDQUVEOztDQUVBLFNBQVMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTFCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUV2QyxDQUFDOztDQUVEOztDQUVBLFNBQVMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7Q0FFdEMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUM1QyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUUxRCxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDekQsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV2RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFbkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRVgsQ0FBQyxHQUFHOztDQUVKLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDekUsTUFBTSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHOztDQUV0QyxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUc7O0NBRUgsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRzs7Q0FFckIsQ0FBQyxPQUFPLEtBQUssQ0FBQzs7Q0FFZCxDQUFDOztDQUVEOztDQUVBLFNBQVMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRS9CLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7Q0FDckMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0NBQ3hELEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV2RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztDQUNWLEVBQUUsTUFBTSxHQUFHLEtBQUs7Q0FDaEIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztDQUN4QixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRXpCLENBQUMsR0FBRzs7Q0FFSixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQ2pFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUc7O0NBRTlFLEdBQUcsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDOztDQUVyQixHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUc7O0NBRXJCLENBQUMsT0FBTyxNQUFNLENBQUM7O0NBRWYsQ0FBQzs7Q0FFRDtDQUNBOztDQUVBLFNBQVMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDbkMsRUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDaEMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUk7Q0FDYixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOztDQUVkLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDWixDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVaLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRVgsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUc7O0NBRXJDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxLQUFLLEVB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RSxDQUFDOztDQUVsQjs7Q0FFQSxFQUFFLGNBQWMsRUFBRSxDQUFDOzs7Q0FHbkI7O0NBRUEsRUFBRSxTQUFTLGFBQWEsR0FBRzs7Q0FFM0IsR0FBRyxJQUFJLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFeEMsR0FBRyxLQUFLLFlBQVksR0FBRzs7Q0FFdkIsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Q0FDbEIsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUU5Qjs7Q0FFQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdkIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEUsS0FBSzs7Q0FFTCxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztDQUN0QyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUUxQjs7Q0FFQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdkIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEUsS0FBSzs7Q0FFTCxJQUFJLE1BQU07O0NBRVY7O0NBRUEsSUFB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QUM7Q0FDckIsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDckIsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXJCLEdBQUc7O0NBRUgsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTVCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7O0NBR2xCLEdBQUcsSUFBSSxTQUFTLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Q0FDNUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTFILEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUs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QUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRTVCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsRDs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDbEMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDOztDQUVsQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQ7O0NBRUEsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7Q0FDdkIsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVwQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7OztDQUcxQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWpELEdBQUcsSUFBSSxHQUFHLENB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QUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsRCxFQUFFLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqQyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUN4QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXJDLEdBQUcsS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUVyQyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFeEYsSUFBSSxNQUFNOztDQUVWLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRTNCLElB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QU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQzs7Q0FFckI7Q0FDQSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsWUFBWSxHQUFHLFNBQVMsS0FBSyxNQUFNLENBQUM7O0NBRXBEOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDLEdBQUcsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztDQUVyQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUM7O0NBRTlCOztDQUVBLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLFlBQVksR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7O0NBRTdELEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQzs7Q0FFL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQzs7Q0FFN0MsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFckM7O0NBRUEsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7Q0FDakMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUM7Q0FDekMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7Q0FDakMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFB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TyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakQsSUFBSSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEdBQUc7O0NBRTlCLEtBQUssSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQzs7Q0FFaEUsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4QyxNQUFNLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEMsTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFeEQsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDcEYsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Q0FDNUMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDMUMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRTVDLE9BQU87O0NBRVAsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0NBQzFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztDQUM1QyxLQUFLLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxD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OztDQUVBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsU0FBUyxHQUFHOztDQUVyQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUVqQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDVixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDVixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN2QyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRTs7Q0FFRixDQUFDLE9BQU87O0NBRVIsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxHQUFHOztDQUV2RCxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVoRSxHQUFHOztDQUVILEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRXZFO0NBQ0EsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVB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USxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRXBGLEVBQUUsTUFBTSxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUc7O0NBRWxELEVBQUUsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUViLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEIsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRzs7Q0FFcEMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxNQUFNOztDQUVSO0NBQ0EsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVYLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM3QixDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFeEMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxNQUFNOztDQUVSO0NBQ0EsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDNUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVYLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHOztDQUV6RTtDQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztDQUN0RCxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3hELEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDeEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEQ7Q0FDQSxFQUFFLEtBQUssR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlCLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUIsRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUIsRUFBRUEsSUFBRSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN2RSxFQUFFLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkUsRUFBRSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV2RSxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksR0FBRzs7Q0FFL0MsRUFBRUEsSUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUM1RCxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDNUQsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUU1RCxFQUFFOztDQUVGLENBQUMsS0FBSyxDQUFDLEdBQUc7Q0FDVixFQUFFQSxJQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtDQUNuQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO0NBQ25CLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7Q0FDbkIsRUFBRSxDQUFDOztDQUVILENBQUMsT0FBTyxLQUFLLENBQUM7O0NBRWQsQ0FBQyxDQUFDOztDQUVGLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRXRELENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEIsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFMUQsRUFBRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVwQyxFQUFFOztDQUVGLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0NBQzdCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0NBQ25DLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztDQUUvQixDQUFDLE9BQU8sSUFBSSxDQUFDOztDQUViLENBQUMsQ0FBQzs7Q0FFRixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRWhELENBQUMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVoRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVsQixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRTs7Q0FFRixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUMzQixDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNqQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzs7Q0FFN0IsQ0FBQyxPQUFPLElBQUksQ0FBQzs7Q0FFYixDQUFDLENBQUM7O0NBRUYsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLElBQUksR0FBRzs7Q0FFeEQsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVsQixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUV2RCxFQUFFOztDQUVGLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQ2pDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDOztDQUU3QixDQUFDLE9BQU8sSUFBSSxDQUFDOztDQUViLENBQUMsQ0FBQzs7Q0FFRjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7Q0FFekMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDO0NBQzVCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQztDQUM1QixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDaEIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ2pCLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEcsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRW5DLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNmLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbEIsQ0FBQzs7Q0FFRCxTQUFTLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRW5DLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRTlCLENBQUM7O0NBRUQsU0FBUyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVuQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRWxCLENBQUM7O0NBRUQsU0FBUyxlQUFlLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUxQyxDQUFDLE9BQU8saUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLGlCQUFpQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7Q0FDL0QsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdCLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2YsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEIsQ0FBQzs7Q0FFRCxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUUvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDZixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFMUIsQ0FBQzs7Q0FFRCxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUUvQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbEMsQ0FBQzs7Q0FFRCxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUUvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0QixDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTFDLENBQUMsT0FBTyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7Q0FDaEYsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV6QixDQUFDOztDQUVELFNBQVMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUU1QyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXBCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQy9CLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMvQixDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDL0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUvQixDQUFDOztDQUVELGdCQUFnQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM5RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDOztDQUUxRCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOztDQUVyRCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxFQUFFLGNBQWMsR0FBRzs7Q0FFckUsQ0FBQyxJQUFJLEtBQUssR0FBRyxjQUFjLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFN0MsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztDQUU1RCxDQUFDLEtBQUssQ0FBQyxHQUFHO0NBQ1YsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Q0FDMUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Q0FDMUMsRUFBRSxDQUFDOztDQUVILENBQUMsT0FBTyxLQUFLLENBQUM7O0NBRWQsQ0FBQyxDQUFDOztDQUVGLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRXRELENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDM0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDM0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDM0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTNCLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFaEQsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWhELENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQzdCLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQzdCLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQzdCLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUU3QixDQUFDLE9BQU8sSUFBSSxDQUFDOztDQUViLENBQUMsQ0FBQzs7Q0FFRixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFdBQVcsSUFBSSxHQUFHOztDQUV4RCxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTdDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUU5QixDQUFDLE9BQU8sSUFBSSxDQUFDOztDQUViLENBQUMsQ0FBQzs7Q0FFRixTQUFTLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7Q0FFN0MsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVwQixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7O0NBRWpDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMvQixDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDL0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQy9CLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDL0QsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQzs7Q0FFNUQsaUJBQWlCLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzs7Q0FFdkQsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsRUFBRSxjQUFjLEdBQUc7O0NBRXRFLENBQUMsSUFBSSxLQUFLLEdBQUcsY0FBYyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTdDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUQsQ0FBQyxLQUFLLENBQUMsR0FBRztDQUNWLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLE9BQU8sS0FBSyxDQUFDOztDQUVkLENBQUMsQ0FBQzs7Q0FFRixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUV2RCxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTNDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFD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O0NBQzFCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRW5DLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7O0NBRTNCLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM3RCxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUM3QixDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3BGLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRXBGLENBQUMsS0FBSyxDQUFDLEdBQUc7Q0FDVixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUM5QyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUM5QyxFQUFFLENBQUM7O0NBRUgsQ0FBQyxPQUFPLEtBQUssQ0FBQzs7Q0FFZCxDQUFDLENBQUM7O0NBRUYsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRWpELENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEIsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFMUQsRUFBRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVwQyxFQUFFOztDQUVGLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTNDLENBQUMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVoRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVsQixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRTs7Q0FFRixD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LEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7Q0FFcEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUUzQixFQUFFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFELEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUMxQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU1RixFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMxRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztDQUNqRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztDQUNqRSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxH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QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXRDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRzs7Q0FFMUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXRDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7O0NBRTVCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7O0NBRTdCLENBQUM7O0NBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUUxRSxDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixDQUFDLGNBQWMsRUFBRSxJQUFJOztDQUVyQixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxhQUFhLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUUxRCxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFdEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDO0NBQ25ELENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLEtBQUssTUFBTSxHQUFHLEVBQUUsQ0FBQzs7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LEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFO0NBQy9CLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO0NBQ2IsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEI7O0NBRUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM3QyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQy9FLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUM1RCxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFOUI7O0NBRUEsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV4QyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUU7Q0FDZCxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFD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LEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztDQUNuRixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0NBQ3hELEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Q0FDaEYsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN2RSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQzNELEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Q0FDcEUsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztDQUNoRixFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQzFFLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztDQUM3RSxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0NBQzdFLEVBQUUsS0FB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QUMsT0FBTyxFQUFFLENBQUM7Q0FDL0MsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFdEMsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFMUIsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUV0QyxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUU5QixFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFN0IsR0FBRyxJQUFJLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ2xFLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFN0QsR0FBRzs7Q0FFSCxFQUFFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOztDQUV4QyxFQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxHQUFHOztDQUVoQyxHQUFHLElBQUksU0FBUyxHQUFHLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNyQyxHQUFHLElBQUksVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTFFLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxlQUFlLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUs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QUMsV0FBVyxHQUFHOztDQUUzQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxtQkFBbUIsR0FBRzs7Q0FFcEYsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6RSxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTVELEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFL0IsR0FBRyxLQUFLLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFF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QUFFLENBQUM7Q0FDNUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMzQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXRCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNoRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV0QixDQUFDLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDaEUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMzQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXRCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNoRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMs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QyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRWxFLElBQUksTUFBTTs7Q0FFVixJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFB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QUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFMUQsRUFBRSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFNUMsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0NBRW5EOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsR0FBRzs7Q0FFL0MsR0FBRyxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDOztDQUV2QyxHQUFHLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7O0NBRWpDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztDQUVmLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFcEQsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBFLEtBQUssSUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVoRCxLQUFLLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRW5ELEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXRHLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsS0FBSyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU5QyxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDOztDQUVuQixLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxNQUFNLEtBQUssV0FBVyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRzs7Q0FFNUQsR0FBRyxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzs7Q0FFaEQsR0FBRyxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzs7Q0FFL0MsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7O0NBRWY7O0NBRUEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRS9GLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV0RSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXRGLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0MsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFbEIsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU3QyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDOztDQUVsQixJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFOUIsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRU47Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztDQUV6QyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRWhDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0NBQ2pDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLElBQUksU0FBUyxHQUFHO0NBQ2pCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixFQUFFLENBQUM7O0NBRUgsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRW5DLEVBQUUsU0FBUyxDQUFDLElBQUk7Q0FDaEIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNwQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3BDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFOztDQUVGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakYsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXhELENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDcEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWYsQ0FBQzs7Q0FFRCxlQUFlLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ2hFLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQzs7Q0FFeEQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTs7Q0FFaEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUM5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUU5QixDQUFDLENBQUM7O0NBRUYsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFL0MsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQzVCLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHOztDQUUxQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Q0FDcEUsRUFBRSxJQUFJLFNBQVMsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUU1RCxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUUxRCxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0NBQ3pELEVBQUUsT0FBTyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUVqRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7Q0FFNUMsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHOztDQUVsQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUU5QyxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXJELEdBQUc7O0NBRUgsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsV0FBVyxFQUFFLE1BQU0sR0FBRzs7Q0FFL0IsQ0FBQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7O0NBRW5CLENBQUMsS0FBSyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRzs7Q0FFaEMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUUxQixFQUFFOztDQUVGLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXZFLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLFFBQVEsQ0FBQzs7Q0FFakIsQ0FBQzs7Q0FFRCxTQUFTLGNBQWMsRUFBRSxNQUFNLEdBQUc7O0NBRWxDLENBQUMsSUFBSSxLQUFLLEdBQUcsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUVuQyxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7O0NBRXJDLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0NBQ25CLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVqQixDQUFDLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVuQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUzQyxFQUFFLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0NBRTNDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQy9DLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUvQyxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2hGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0UsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0NBRWhJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUUvQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO0NBQ3BCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRXBCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0NBQ2xDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxjQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ25FLGNBQWMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQzs7Q0FFdEQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxZQUFZOztDQUV6RCxDQUFDLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTVCLENBQUMsSUFBSSxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUNoQyxDQUFDLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXBDLENBQUMsT0FBTyxTQUFTLGlCQUFpQixFQUFFLEtBQUssR0FBRzs7Q0FFNUMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUV6QixFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDL0IsRUFBRSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVyRCxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFckQsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVuRCxHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0NBRTVDLElBQUksVUFBVSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDcEUsSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDL0MsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV2RCxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUMzRSxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUMvQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUzRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O0NBRVgsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztDQUV6RCxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFM0QsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEdBQUc7O0NBRXRELENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRWhDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRXBCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdELENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXpFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV2QyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7Q0FDdEMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUUvQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7O0NBR2Y7Q0FDQTtDQUNBOztDQUVBO0NBQ0E7O0NBRUE7O0NBRUE7O0NBRUE7O0NBRUE7O0NBRUE7O0NBRUE7O0NBRUE7Q0FDQTs7Q0FFQSxDQUFDOztDQUVELGdCQUFnQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM3RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDOztDQUUxRCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFlBQVk7O0NBRWpELENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUN6QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRXpCLENBQUMsQ0FBQzs7Q0FFRixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRWhELENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFakMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUV4QyxFQUFFLE1BQU07O0NBRVIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFL0MsRUFBRTs7Q0FFRjtDQUNBOztDQUVBOztDQUVBOztDQUVBOztDQUVBO0NBQ0E7O0NBRUE7Q0FDQTs7Q0FFQSxDQUFDLENBQUM7O0NBRUY7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLG1CQUFtQixFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUc7O0NBRTdDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUNwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7Q0FDakMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUUvQixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztDQUVwQixDQUFDLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFeEQsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksZUFBZSxFQUFFLElBQUksWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUxRixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQzVDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7OztDQUd2QixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFZixDQUFDOztDQUVELG1CQUFtQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNwRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDOztDQUVoRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFlBQVk7O0NBRXBELENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDdkMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFdkMsQ0FBQyxDQUFDOztDQUVGLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFbkQ7O0NBRUEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7Q0FDakMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7O0NBRWxDLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztDQUN2RCxDQUFDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0NBRTVCOztDQUVBLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDcEQsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbEQsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNwRCxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDeEQsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFdkQsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFN0IsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUU3QyxFQUFFLE1BQU07O0NBRVIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXBELEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBO0NB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RSxDQUFDO0NBQ2hFLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDOztDQUVoRSxDQUFDLElBQUksTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDO0NBQzdCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFekIsQ0FBQyxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUc7O0NBRTNFLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEQsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRTdDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUs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RUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRXRDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sS0FBSyxNQUFNLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4QyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyQzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1Qzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVB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LEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDakMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUNqQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2pDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRWpDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDaEMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUNoQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUVoQzs7Q0FFQSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ2xDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRWpDOztDQUVBLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFckMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVyQyxDQUFDLFNBQVMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHOztDQUVqQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7Q0FDdkIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV2QixFQUFFOztDQUVGLENBQUMsU0FBUyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRzs7Q0FFaEMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsS0FBSyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUV0QyxHQUFHLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZCLEdBQUc7O0NBRUgsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7O0NBRXJELEVBQUU7O0NBRUYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2hGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0UsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEIsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOztDQUVoRixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztDQUNsQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0NBRS9CLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0NBRTFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVmLENBQUM7O0NBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNqRSxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7O0NBRWxELFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTVDLENBQUMsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDOztDQUV4QixDQUFDLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDOztDQUUzQixDQUFDLFNBQVMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFckMsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU1QyxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFdEQsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWpFLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRzs7Q0FFMUIsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMzQixFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUzQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVuQjtDQUNBOztDQUVBLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0NBRS9EOztDQUVBLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCOztDQUVBLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUI7O0NBRUEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUI7O0NBRUEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQzs7Q0FFQSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFekQsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUc7O0NBRXBDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRXRCLENBQUMsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7O0NBRTdDLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0csQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztDQUNyQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDeEQsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFMUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWhGLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWYsQ0FBQzs7Q0FFRCxTQUFTLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzlELFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQzs7Q0FFNUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxZQUFZOztDQUUzQyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7O0NBRXRCLENBQUMsT0FBTyxTQUFTLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRWxDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUU5QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUscURBQXFELEVBQUUsQ0FBQzs7Q0FFekUsR0FBRzs7Q0FFSCxFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRW5DLEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXBDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPOztDQUU5QixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7Q0FDcEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDOztDQUVwQjtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztDQUNuRCxFQUFFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0NBRTdCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzdELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzdELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzdELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQy9ELEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDOztDQUVoRSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztDQUU5QixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDOztDQUVOLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUV4RCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ3RCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVmLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUVoQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDOztDQUUxQixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUVoQixDQUFDLElBQUksS0FBSyxHQUFHLEVBQUUsR0FBRyxLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUcsUUFBUSxDQUFDOztDQUVwRCxDQUFDLElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUU3RyxDQUFDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEgsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXhELENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakYsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWhGLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOztDQUV2QyxDQUFDOztDQUVELFVBQVUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDL0QsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDOztDQUU5QyxVQUFVLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLFdBQVcsS0FBSyxHQUFHOztDQUU1RCxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7O0NBRXBCLENBQUMsS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTzs7Q0FFN0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFM0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTFELENBQUMsQ0FBQzs7Q0FFRjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUc7O0NBRXpDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7O0NBRTNCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRXBCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxTQUFTLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQzs7Q0FFL0MsQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFFLEdBQUcsS0FBSyxTQUFTLEtBQUssR0FBRyxHQUFHLFFBQVEsQ0FBQzs7Q0FFcEQsQ0FBQyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5SCxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Q0FDckMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2pGLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0NBRWxDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV4RTs7Q0FFQSxDQUFDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkYsQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0NBQ3RDLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNuRixDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOztDQUVuQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWxJLENBQUM7O0NBRUQsV0FBVyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUN4RCxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7O0NBRWhELFdBQVcsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxLQUFLLEdBQUc7O0NBRTdELENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQzs7Q0FFbkMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7O0NBRTlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTNELENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVsQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFMUQsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxJQUFJLFlBQVksQ0FBQztDQUNqQixJQUFJLFlBQVksQ0FBQzs7Q0FFakIsU0FBUyxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUc7O0NBRTFFOztDQUVBLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQztDQUM3QyxDQUFDLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0NBQ3hDLENBQUMsS0FBSyxVQUFVLEtBQUssU0FBUyxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0NBQzNELENBQUMsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDOztDQUU3RCxDQUFDLEtBQUssWUFBWSxLQUFLLFNBQVMsR0FBRzs7Q0FFbkMsRUFBRSxZQUFZLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztDQUN0QyxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWpHLEVBQUUsWUFBWSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9ELEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXhDLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNqRixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0NBQ3BDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDakYsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNwQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDMUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRWpELENBQUM7O0NBRUQsV0FBVyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM1RCxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7O0NBRWhELFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxLQUFLLFlBQVk7O0NBRW5ELENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMxQixDQUFDLElBQUksT0FBTyxDQUFDOztDQUViLENBQUMsT0FBTyxTQUFTLFlBQVksRUFBRSxHQUFHLEdBQUc7O0NBRXJDOztDQUVBLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRzs7Q0FFekIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRzs7Q0FFbEMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXJELEdBQUc7O0NBRUgsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRU4sV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsV0FBVyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRzs7Q0FFN0UsQ0FBQyxLQUFLLFVBQVUsS0FBSyxTQUFTLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7Q0FDM0QsQ0FBQyxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUM7O0NBRTdELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUUxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ3pELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztDQUMvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRTFCLENBQUMsQ0FBQzs7Q0FFRixXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLEtBQUssR0FBRzs7Q0FFcEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3hDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsVUFBVSxFQUFFLElBQUksR0FBRzs7Q0FFNUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQzs7Q0FFbEIsQ0FBQyxJQUFJLFFBQVEsR0FBRztDQUNoQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUNyQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSTtDQUNyQixFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLE1BQU0sR0FBRztDQUNkLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3BCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3BCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3BCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Q0FDckMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2hGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0UsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUM7O0NBRXhFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUUvQyxDQUFDOztDQUVELFVBQVUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDL0QsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBQzlDLEFBK0pBO0NBQ0E7O0NBRUEsS0FBSyxDQUFDLE1BQU0sR0FBRyxXQUFXLFNBQVMsRUFBRSxRQUFRLEdBQUc7O0NBRWhELENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSwwQ0FBMEMsRUFBRSxDQUFDOztDQUUzRCxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDeEQsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Q0FDN0MsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0NBRXpDLENBQUMsT0FBTyxTQUFTLENBQUM7O0NBRWxCLENBQUMsQ0FBQzs7Q0FFRjs7Q0FFQSxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUU7O0NBRXBDLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxTQUFTLEdBQUc7O0NBRTlDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxzSEFBc0gsRUFBRSxDQUFDOztDQUV6STs7Q0FFQSxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDeEMsRUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXBDLEVBQUU7O0NBRUYsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLFNBQVMsR0FBRzs7Q0FFcEQsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDRIQUE0SCxFQUFFLENBQUM7O0NBRS9JOztDQUVBLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUM5QyxFQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEMsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFckMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGdIQUFnSCxFQUFFLENBQUM7O0NBRW5JLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVwRCxHQUFHLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTNFLEdBQUc7O0NBRUgsRUFBRSxPQUFPLFFBQVEsQ0FBQzs7Q0FFbEIsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjs7Q0FFQSxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7O0NBRS9CLENBQUMsVUFBVSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVqQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUVBQWlFLEVBQUUsQ0FBQztDQUNwRixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7QUFDSixBQTJCQTtDQUNBOztDQUVBLFNBQVMsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFMUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLG9FQUFvRSxFQUFFLENBQUM7O0NBRXRGLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUN2QyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDOztDQUUxQixDQUFDOztDQUVELE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFOztDQUVqQyxDQUFDLGFBQWEsRUFBRSxxQkFBcUI7O0NBRXJDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxrREFBa0QsRUFBRSxDQUFDOztDQUV0RSxFQUFFO0NBQ0YsQ0FBQyxxQkFBcUIsRUFBRSxrQ0FBa0M7O0NBRTFELEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSwwREFBMEQsRUFBRSxDQUFDOztDQUU5RSxFQUFFO0NBQ0YsQ0FBQyx3QkFBd0IsRUFBRSxnQ0FBZ0M7O0NBRTNELEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSw2REFBNkQsRUFBRSxDQUFDOztDQUVqRixFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDO0FBQ0osQUF1QkE7Q0FDQSxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxZQUFZOztDQUU3QyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsMEZBQTBGLEVBQUUsQ0FBQzs7Q0FFN0csQ0FBQyxDQUFDOztDQUVGLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTlDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSw4REFBOEQsRUFBRSxDQUFDOztDQUVqRixDQUFDLENBQUM7QUFDRixBQU9BO0NBQ0E7O0NBRUEsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFOztDQUVqQyxDQUFDLGNBQWMsRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFbEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7Q0FDekgsRUFBRSxPQUFPLFdBQVcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7QUFDSixBQWNBO0NBQ0E7O0NBRUEsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFOztDQUUvQixDQUFDLE1BQU0sRUFBRSxXQUFXLGNBQWMsR0FBRzs7Q0FFckMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHlEQUF5RCxFQUFFLENBQUM7Q0FDNUUsRUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRTFDLEVBQUU7Q0FDRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0RBQXNELEVBQUUsQ0FBQztDQUN6RSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUV4QixFQUFFO0NBQ0YsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFckMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHdFQUF3RSxFQUFFLENBQUM7Q0FDM0YsRUFBRSxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRW5DLEVBQUU7Q0FDRixDQUFDLElBQUksRUFBRSxXQUFXLGNBQWMsR0FBRzs7Q0FFbkMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHFEQUFxRCxFQUFFLENBQUM7Q0FDeEUsRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRXhDLEVBQUU7Q0FDRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7O0NBRS9CLENBQUMsTUFBTSxFQUFFLFdBQVcsY0FBYyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUseURBQXlELEVBQUUsQ0FBQztDQUM1RSxFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFMUMsRUFBRTtDQUNGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxzREFBc0QsRUFBRSxDQUFDO0NBQ3pFLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRXhCLEVBQUU7Q0FDRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsR0FBRyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsd0VBQXdFLEVBQUUsQ0FBQztDQUMzRixFQUFFLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRTtDQUNGLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRTNDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSw4RUFBOEUsRUFBRSxDQUFDO0NBQ2pHLEVBQUUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpDLEVBQUU7Q0FDRixDQUFDLElBQUksRUFBRSxXQUFXLGNBQWMsR0FBRzs7Q0FFbkMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHFEQUFxRCxFQUFFLENBQUM7Q0FDeEUsRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRXhDLEVBQUU7Q0FDRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxXQUFXLGNBQWMsR0FBRzs7Q0FFckQsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLDBEQUEwRCxFQUFFLENBQUM7Q0FDNUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRXpDLENBQUMsQ0FBQzs7Q0FFRixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTs7Q0FFdEIsQ0FBQyxRQUFRLEVBQUUsWUFBWTs7Q0FFdkIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHlFQUF5RSxFQUFFLENBQUM7Q0FDNUYsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdkIsRUFBRTs7Q0FFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUV2QyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMEVBQTBFLEVBQUUsQ0FBQztDQUM3RixFQUFFLE9BQU8sS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFcEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHNFQUFzRSxFQUFFLENBQUM7Q0FDekYsRUFBRSxPQUFPLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXZDLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFOztDQUVsQyxDQUFDLG9CQUFvQixFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFbEQsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHFGQUFxRixFQUFFLENBQUM7Q0FDeEcsRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV2QyxFQUFFO0NBQ0YsQ0FBQyxlQUFlLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXRDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxnR0FBZ0csRUFBRSxDQUFDO0NBQ25ILEVBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVyQyxFQUFFO0NBQ0YsQ0FBQyxvQkFBb0IsRUFBRSxxQkFBcUI7O0NBRTVDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSwwREFBMEQsRUFBRSxDQUFDOztDQUU5RSxFQUFFO0NBQ0YsQ0FBQyxhQUFhLEVBQUUsV0FBVyxNQUFNLHlCQUF5Qjs7Q0FFMUQsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJHQUEyRyxFQUFFLENBQUM7Q0FDOUgsRUFBRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFL0MsRUFBRTtDQUNGLENBQUMsbUJBQW1CLEVBQUUseUNBQXlDOztDQUUvRCxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUseURBQXlELEVBQUUsQ0FBQzs7Q0FFN0UsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUU7O0NBRWxDLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVqQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsd0VBQXdFLEVBQUUsQ0FBQztDQUMzRixFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRTtDQUNGLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUVsRCxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUscUZBQXFGLEVBQUUsQ0FBQztDQUN4RyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXZDLEVBQUU7Q0FDRixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksRUFBRSxDQUFDOztDQUVULEVBQUUsT0FBTyxTQUFTLFdBQVcsR0FBRzs7Q0FFaEMsR0FBRyxLQUFLLEVBQUUsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDOUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7Q0FDMUgsR0FBRyxPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7Q0FDSixDQUFDLHlCQUF5QixFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUUzQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0dBQWdHLEVBQUUsQ0FBQztDQUNuSCxFQUFFLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5QyxFQUFFO0NBQ0YsQ0FBQyxlQUFlLEVBQUUsWUFBWTs7Q0FFOUIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHFEQUFxRCxFQUFFLENBQUM7O0NBRXhFLEVBQUU7Q0FDRixDQUFDLGVBQWUsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFdEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGdHQUFnRyxFQUFFLENBQUM7Q0FDbkgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXJDLEVBQUU7Q0FDRixDQUFDLGVBQWUsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFdEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGdHQUFnRyxFQUFFLENBQUM7Q0FDbkgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXJDLEVBQUU7Q0FDRixDQUFDLG9CQUFvQixFQUFFLHFCQUFxQjs7Q0FFNUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLDBEQUEwRCxFQUFFLENBQUM7O0NBRTlFLEVBQUU7Q0FDRixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGtHQUFrRyxFQUFFLENBQUM7Q0FDckgsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRS9CLEVBQUU7Q0FDRixDQUFDLFdBQVcsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFbEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDRGQUE0RixFQUFFLENBQUM7Q0FDL0csRUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXJDLEVBQUU7Q0FDRixDQUFDLFNBQVMsRUFBRSxZQUFZOztDQUV4QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsK0NBQStDLEVBQUUsQ0FBQzs7Q0FFbkUsRUFBRTtDQUNGLENBQUMsT0FBTyxFQUFFLFlBQVk7O0NBRXRCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSw2Q0FBNkMsRUFBRSxDQUFDOztDQUVqRSxFQUFFO0NBQ0YsQ0FBQyxPQUFPLEVBQUUsWUFBWTs7Q0FFdEIsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLDZDQUE2QyxFQUFFLENBQUM7O0NBRWpFLEVBQUU7Q0FDRixDQUFDLE9BQU8sRUFBRSxZQUFZOztDQUV0QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsNkNBQTZDLEVBQUUsQ0FBQzs7Q0FFakUsRUFBRTtDQUNGLENBQUMsWUFBWSxFQUFFLFlBQVk7O0NBRTNCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxrREFBa0QsRUFBRSxDQUFDOztDQUV0RSxFQUFFO0NBQ0YsQ0FBQyxhQUFhLEVBQUUsV0FBVyxNQUFNLHlCQUF5Qjs7Q0FFMUQsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJHQUEyRyxFQUFFLENBQUM7Q0FDOUgsRUFBRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFL0MsRUFBRTtDQUNGLENBQUMsbUJBQW1CLEVBQUUseUNBQXlDOztDQUUvRCxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUseURBQXlELEVBQUUsQ0FBQzs7Q0FFN0UsRUFBRTtDQUNGLENBQUMsV0FBVyxFQUFFLFdBQVcsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUc7O0NBRS9ELEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxzSEFBc0gsRUFBRSxDQUFDO0NBQ3pJLEVBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXJFLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosS0FBSyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLElBQUksR0FBRzs7Q0FFdkQsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLDJFQUEyRSxFQUFFLENBQUM7Q0FDN0YsQ0FBQyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXBDLENBQUMsQ0FBQzs7Q0FFRixVQUFVLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxXQUFXLE1BQU0sR0FBRzs7Q0FFM0QsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGlIQUFpSCxFQUFFLENBQUM7Q0FDbkksQ0FBQyxPQUFPLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZDLENBQUMsQ0FBQzs7Q0FFRixNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUU7O0NBRTlCLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRXJDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSx1RUFBdUUsRUFBRSxDQUFDO0NBQzFGLEVBQUUsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVuQyxFQUFFO0NBQ0YsQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJFQUEyRSxFQUFFLENBQUM7Q0FDOUYsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXZDLEVBQUU7Q0FDRixDQUFDLG9CQUFvQixFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUUzQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNkVBQTZFLEVBQUUsQ0FBQztDQUNoRyxFQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV6QyxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTs7Q0FFbkMsQ0FBQyxJQUFJLEVBQUUsWUFBWTs7Q0FFbkIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHlEQUF5RCxFQUFFLENBQUM7Q0FDNUUsRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRTtDQUNGLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUVoRCxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNEVBQTRFLEVBQUUsQ0FBQztDQUMvRixFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTVDLEVBQUU7Q0FDRixDQUFDLFFBQVEsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFL0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGlFQUFpRSxFQUFFLENBQUM7Q0FDcEYsRUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXBDLEVBQUU7Q0FDRixDQUFDLE1BQU0sRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFN0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDZEQUE2RCxFQUFFLENBQUM7Q0FDaEYsRUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWxDLEVBQUU7Q0FDRixDQUFDLEtBQUssRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFNUIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJEQUEyRCxFQUFFLENBQUM7Q0FDOUUsRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWpDLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7O0NBRXpCLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHOztDQUV6RCxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNEVBQTRFLEVBQUUsQ0FBQztDQUMvRixFQUFFLE9BQU8sUUFBUSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpELEVBQUU7Q0FDRixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRzs7Q0FFdEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDZEQUE2RCxFQUFFLENBQUM7Q0FDaEYsRUFBRSxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRS9DLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFOztDQUVoQyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsU0FBUyxHQUFHOztDQUUxQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0ZBQWtGLEVBQUUsQ0FBQztDQUNyRyxFQUFFLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFekMsRUFBRTtDQUNGLENBQUMsT0FBTyxFQUFFLFdBQVcsT0FBTyxHQUFHOztDQUUvQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMEVBQTBFLEVBQUUsQ0FBQztDQUM3RixFQUFFLE9BQU8sSUFBSSxlQUFlLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUU5QyxFQUFFO0NBQ0YsQ0FBQyxZQUFZLEVBQUUsV0FBVyxPQUFPLEdBQUc7O0NBRXBDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSw2RUFBNkUsRUFBRSxDQUFDO0NBQ2hHLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTVDLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFOztDQUVsQyxDQUFDLGFBQWEsRUFBRSxXQUFXLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV0RCxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNkVBQTZFLEVBQUUsQ0FBQztDQUNoRyxFQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTlELEVBQUU7Q0FDRixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsbUZBQW1GLEVBQUUsQ0FBQztDQUN0RyxFQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV2QyxFQUFFO0NBQ0YsQ0FBQyxlQUFlLEVBQUUsWUFBWTs7Q0FFOUIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJFQUEyRSxFQUFFLENBQUM7Q0FDOUYsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUU7O0NBRWxDLENBQUMsMEJBQTBCLEVBQUUsWUFBWTs7Q0FFekMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLDJHQUEyRyxFQUFFLENBQUM7O0NBRS9ILEVBQUU7Q0FDRixDQUFDLHNCQUFzQixFQUFFLFlBQVk7O0NBRXJDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxtR0FBbUcsRUFBRSxDQUFDOztDQUV2SCxFQUFFO0NBQ0YsQ0FBQyxxQkFBcUIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFdkMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHVGQUF1RixFQUFFLENBQUM7Q0FDMUcsRUFBRSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekMsRUFBRTtDQUNGLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXBDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxpRkFBaUYsRUFBRSxDQUFDO0NBQ3BHLEVBQUUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXRDLEVBQUU7Q0FDRixDQUFDLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFakQsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLG1GQUFtRixFQUFFLENBQUM7Q0FDdEcsRUFBRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRW5ELEVBQUU7Q0FDRixDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFakMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHFGQUFxRixFQUFFLENBQUM7Q0FDeEcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUU7Q0FDRixDQUFDLGFBQWEsRUFBRSxXQUFXLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV0RCxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNkVBQTZFLEVBQUUsQ0FBQztDQUNoRyxFQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTlELEVBQUU7Q0FDRixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsbUZBQW1GLEVBQUUsQ0FBQztDQUN0RyxFQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV2QyxFQUFFO0NBQ0YsQ0FBQyxlQUFlLEVBQUUsWUFBWTs7Q0FFOUIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJFQUEyRSxFQUFFLENBQUM7Q0FDOUYsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUU7O0NBRWxDLENBQUMsYUFBYSxFQUFFLFdBQVcsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXRELEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSw2RUFBNkUsRUFBRSxDQUFDO0NBQ2hHLEVBQUUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUQsRUFBRTtDQUNGLENBQUMsZUFBZSxFQUFFLFlBQVk7O0NBRTlCLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSwyRUFBMkUsRUFBRSxDQUFDO0NBQzlGLEVBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7O0NBRWhDLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7O0NBRUEsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFOztDQUVuQyxDQUFDLGVBQWUsRUFBRSxZQUFZOztDQUU5QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsc0RBQXNELEVBQUUsQ0FBQzs7Q0FFMUUsRUFBRTtDQUNGLENBQUMsb0JBQW9CLEVBQUUsWUFBWTs7Q0FFbkMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLDBHQUEwRyxFQUFFLENBQUM7O0NBRTlILEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFOztDQUVuQyxDQUFDLGNBQWMsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFbkMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJFQUEyRSxFQUFFLENBQUM7Q0FDOUYsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRDLEVBQUU7Q0FDRixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMkVBQTJFLEVBQUUsQ0FBQzs7Q0FFOUYsRUFBRTtDQUNGLENBQUMsU0FBUyxFQUFFLFdBQVcsUUFBUSxFQUFFLElBQUksR0FBRzs7Q0FFeEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGdHQUFnRyxFQUFFLENBQUM7Q0FDbkgsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVoRCxFQUFFO0NBQ0YsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZOztDQUUvQixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0hBQWdILEVBQUUsQ0FBQzs7Q0FFcEksRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTs7Q0FFN0MsQ0FBQyxVQUFVLEVBQUU7Q0FDYixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUscURBQXFELEVBQUUsQ0FBQztDQUN6RSxHQUFHLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0NBRTlCLEdBQUc7Q0FDSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHFEQUFxRCxFQUFFLENBQUM7Q0FDekUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRS9CLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxhQUFhLEVBQUU7Q0FDaEIsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLCtGQUErRixFQUFFLENBQUM7O0NBRW5ILEdBQUc7Q0FDSCxFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsK0ZBQStGLEVBQUUsQ0FBQzs7Q0FFbkgsR0FBRztDQUNILEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUU7O0NBRXhDLENBQUMsT0FBTyxFQUFFO0NBQ1YsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGtEQUFrRCxFQUFFLENBQUM7Q0FDdEUsR0FBRyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRXRCLEdBQUc7Q0FDSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKLE1BQU0sQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRTs7Q0FFL0QsQ0FBQyxHQUFHLEVBQUUsWUFBWTs7Q0FFbEIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLG9EQUFvRCxFQUFFLENBQUM7O0NBRXZFLEVBQUU7Q0FDRixDQUFDLEdBQUcsRUFBRSxZQUFZOztDQUVsQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsb0RBQW9ELEVBQUUsQ0FBQzs7Q0FFdkUsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUU7O0NBRWhFLENBQUMsR0FBRyxFQUFFLFlBQVk7O0NBRWxCLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxnRUFBZ0UsRUFBRSxDQUFDO0NBQ25GLEVBQUUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7O0NBRWpDLEVBQUU7Q0FDRixDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGdFQUFnRSxFQUFFLENBQUM7Q0FDbkYsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDOztDQUVsQyxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKOztDQUVBLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxXQUFXLEVBQUUsU0FBUyxHQUFHOztDQUUxRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaURBQWlEO0NBQ2hFLEdBQUcsOERBQThELEVBQUUsQ0FBQzs7Q0FFcEUsQ0FBQyxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7Q0FDM0QsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDOztDQUVwQyxDQUFDLENBQUM7O0NBRUY7O0NBRUEsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUU7Q0FDMUMsQ0FBQyxVQUFVLEVBQUU7Q0FDYixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNENBQTRDLEVBQUUsQ0FBQzs7Q0FFaEUsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLGVBQWUsRUFBRTtDQUNsQixFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDBEQUEwRCxFQUFFLENBQUM7Q0FDOUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDOztDQUVsQyxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsZ0JBQWdCLEVBQUU7Q0FDbkIsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSw0REFBNEQsRUFBRSxDQUFDO0NBQ2hGLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFbkMsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLGlCQUFpQixFQUFFO0NBQ3BCLEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsOERBQThELEVBQUUsQ0FBQztDQUNsRixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRXBDLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxlQUFlLEVBQUU7Q0FDbEIsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDO0NBQzlFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQzs7Q0FFbEMsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLGtCQUFrQixFQUFFO0NBQ3JCLEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0VBQWdFLEVBQUUsQ0FBQztDQUNwRixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRXJDLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxnQkFBZ0IsRUFBRTtDQUNuQixFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDREQUE0RCxFQUFFLENBQUM7Q0FDaEYsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUVuQyxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsZUFBZSxFQUFFO0NBQ2xCLEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQztDQUM5RSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7O0NBRWxDLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxtQkFBbUIsRUFBRTtDQUN0QixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0hBQWdILEVBQUUsQ0FBQzs7Q0FFcEksR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLFVBQVUsRUFBRTtDQUNiLEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsK0NBQStDLEVBQUUsQ0FBQztDQUNuRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFNUIsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLGNBQWMsRUFBRTtDQUNqQixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0RBQWdELEVBQUUsQ0FBQzs7Q0FFcEUsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLGNBQWMsRUFBRTtDQUNqQixFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDREQUE0RCxFQUFFLENBQUM7Q0FDaEYsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztDQUVyQyxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsZUFBZSxFQUFFO0NBQ2xCLEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsOERBQThELEVBQUUsQ0FBQztDQUNsRixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRXRDLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxFQUFFLENBQUM7O0NBRUo7O0NBRUEsTUFBTSxDQUFDLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUU7O0NBRXBELENBQUMsTUFBTSxFQUFFO0NBQ1QsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHlFQUF5RSxFQUFFLENBQUM7Q0FDN0YsR0FBRyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDOztDQUU1QixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCOztDQUU5QyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsOERBQThELEVBQUUsQ0FBQzs7Q0FFbEYsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUU7O0NBRXpDLENBQUMsUUFBUSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUU5QixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsb0VBQW9FLEVBQUUsQ0FBQztDQUN2RixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXpCLEVBQUU7Q0FDRixDQUFDLFdBQVcsRUFBRSxXQUFXLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxHQUFHOztDQUVyRCxFQUFFLEtBQUssV0FBVyxLQUFLLFNBQVMsR0FBRzs7Q0FFbkMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNFQUFzRSxFQUFFLENBQUM7O0NBRTFGLEdBQUc7Q0FDSCxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQztDQUM3RSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVoQyxFQUFFO0NBQ0YsQ0FBQyxjQUFjLEVBQUUsWUFBWTs7Q0FFN0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGdFQUFnRSxFQUFFLENBQUM7Q0FDbkYsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRXJCLEVBQUU7Q0FDRixDQUFDLGVBQWUsRUFBRSxZQUFZOztDQUU5QixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNERBQTRELEVBQUUsQ0FBQzs7Q0FFL0UsRUFBRTtDQUNGLENBQUMsY0FBYyxFQUFFLFlBQVk7O0NBRTdCLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSwyREFBMkQsRUFBRSxDQUFDOztDQUU5RSxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFOztDQUVuRCxDQUFDLFNBQVMsRUFBRTtDQUNaLEVBQUUsR0FBRyxFQUFFLFlBQVk7O0NBRW5CLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSwrREFBK0QsRUFBRSxDQUFDO0NBQ3BGLEdBQUcsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUV0QixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsT0FBTyxFQUFFO0NBQ1YsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDZEQUE2RCxFQUFFLENBQUM7Q0FDakYsR0FBRyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRXRCLEdBQUc7Q0FDSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKOztDQUVBLE1BQU0sQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsU0FBUyxFQUFFOztDQUVoRCxDQUFDLFNBQVMsRUFBRSxZQUFZOztDQUV4QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsNkRBQTZELEVBQUUsQ0FBQzs7Q0FFakYsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxZQUFZOztDQUUzQixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0VBQWdFLEVBQUUsQ0FBQzs7Q0FFcEYsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxZQUFZOztDQUV2QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsNERBQTRELEVBQUUsQ0FBQzs7Q0FFaEYsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjs7Q0FFQSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFNUMsQ0FBQyxPQUFPLEVBQUU7Q0FDVixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0ZBQWdGLEVBQUUsQ0FBQzs7Q0FFcEcsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLFFBQVEsRUFBRTtDQUNYLEVBQUUsS0FBSyxFQUFFLFlBQVk7O0NBRXJCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxtRkFBbUYsRUFBRSxDQUFDO0NBQ3ZHLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRztDQUNILEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7O0NBRUEsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUU7O0NBRTdDLENBQUMsVUFBVSxFQUFFO0NBQ2IsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLCtDQUErQyxFQUFFLENBQUM7O0NBRW5FLEdBQUc7Q0FDSCxFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsK0NBQStDLEVBQUUsQ0FBQzs7Q0FFbkUsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDLE9BQU8sRUFBRTtDQUNWLEVBQUUsR0FBRyxFQUFFLFlBQVk7O0NBRW5CLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSw0Q0FBNEMsRUFBRSxDQUFDO0NBQ2hFLEdBQUcsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDOztDQUV0QixHQUFHO0NBQ0gsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRTtDQUNWLEVBQUUsR0FBRyxFQUFFLFlBQVk7O0NBRW5CLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxvRUFBb0UsRUFBRSxDQUFDOztDQUVoSCxHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxvRUFBb0UsRUFBRSxDQUFDO0NBQy9HLEdBQUcsSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7O0NBRWhELEdBQUc7Q0FDSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUU7O0NBRXRELENBQUMsS0FBSyxFQUFFO0NBQ1IsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDJGQUEyRixFQUFFLENBQUM7Q0FDL0csR0FBRyxPQUFPLEtBQUssQ0FBQzs7Q0FFaEIsR0FBRztDQUNILEVBQUUsR0FBRyxFQUFFLFlBQVk7O0NBRW5CLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSwwRkFBMEYsRUFBRSxDQUFDOztDQUU5RyxHQUFHO0NBQ0gsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRTs7Q0FFbkQsQ0FBQyxXQUFXLEVBQUU7Q0FDZCxFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsK0VBQStFLEVBQUUsQ0FBQztDQUNuRyxHQUFHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7O0NBRXRDLEdBQUc7Q0FDSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGdGQUFnRixFQUFFLENBQUM7Q0FDcEcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0NBRXZDLEdBQUc7Q0FDSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKOztDQUVBLE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLFNBQVMsRUFBRTs7Q0FFeEMsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZOztDQUVyQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMkVBQTJFLEVBQUUsQ0FBQztDQUM5RixFQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOztDQUVoQyxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsWUFBWTs7Q0FFL0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLG1GQUFtRixFQUFFLENBQUM7Q0FDdEcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFOUMsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxZQUFZOztDQUUzQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0VBQXNFLEVBQUUsQ0FBQztDQUN6RixFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7O0NBRXJDLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsWUFBWTs7Q0FFM0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDZEQUE2RCxFQUFFLENBQUM7Q0FDaEYsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTVCLEVBQUU7O0NBRUYsQ0FBQyxxQkFBcUIsRUFBRSxZQUFZOztDQUVwQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0dBQWdHLEVBQUUsQ0FBQztDQUNuSCxFQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRTtDQUNGLENBQUMseUJBQXlCLEVBQUUsWUFBWTs7Q0FFeEMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHlHQUF5RyxFQUFFLENBQUM7Q0FDNUgsRUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLENBQUM7O0NBRXpELEVBQUU7Q0FDRixDQUFDLDJCQUEyQixFQUFFLFlBQVk7O0NBRTFDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSw2R0FBNkcsRUFBRSxDQUFDO0NBQ2hJLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsRUFBRSxDQUFDOztDQUUzRCxFQUFFO0NBQ0YsQ0FBQyw2QkFBNkIsRUFBRSxZQUFZOztDQUU1QyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsb0hBQW9ILEVBQUUsQ0FBQztDQUN2SSxFQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLEVBQUUsQ0FBQzs7Q0FFaEUsRUFBRTtDQUNGLENBQUMsOEJBQThCLEVBQUUsWUFBWTs7Q0FFN0MsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHNIQUFzSCxFQUFFLENBQUM7Q0FDekksRUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxFQUFFLENBQUM7O0NBRWpFLEVBQUU7Q0FDRixDQUFDLG1CQUFtQixFQUFFLFlBQVk7O0NBRWxDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSw2RkFBNkYsRUFBRSxDQUFDO0NBQ2hILEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDOztDQUVuRCxFQUFFO0NBQ0YsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZOztDQUVyQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUscUZBQXFGLEVBQUUsQ0FBQztDQUN4RyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7O0NBRTFDLEVBQUU7Q0FDRixDQUFDLHVCQUF1QixFQUFFLFlBQVk7O0NBRXRDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSx1R0FBdUcsRUFBRSxDQUFDO0NBQzFILEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxDQUFDOztDQUV6RCxFQUFFO0NBQ0YsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLE9BQU8sR0FBRzs7Q0FFekMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHFFQUFxRSxFQUFFLENBQUM7Q0FDeEYsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUVqQyxFQUFFO0NBQ0YsQ0FBQyxZQUFZLEVBQUUsWUFBWTs7Q0FFM0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLHdEQUF3RCxFQUFFLENBQUM7O0NBRTNFLEVBQUU7Q0FDRixDQUFDLFlBQVksRUFBRSxZQUFZOztDQUUzQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsd0RBQXdELEVBQUUsQ0FBQzs7Q0FFM0UsRUFBRTtDQUNGLENBQUMsYUFBYSxFQUFFLFlBQVk7O0NBRTVCLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSx5REFBeUQsRUFBRSxDQUFDOztDQUU1RSxFQUFFO0NBQ0YsQ0FBQyxlQUFlLEVBQUUsWUFBWTs7Q0FFOUIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDJEQUEyRCxFQUFFLENBQUM7O0NBRTlFLEVBQUU7Q0FDRixDQUFDLGNBQWMsRUFBRSxZQUFZOztDQUU3QixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQzs7Q0FFN0UsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLFNBQVMsRUFBRTs7Q0FFbEQsQ0FBQyxnQkFBZ0IsRUFBRTtDQUNuQixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7O0NBRWpDLEdBQUc7Q0FDSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLG1FQUFtRSxFQUFFLENBQUM7Q0FDdkYsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7O0NBRWxDLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxhQUFhLEVBQUU7Q0FDaEIsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDOztDQUU5QixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSw2REFBNkQsRUFBRSxDQUFDO0NBQ2pGLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUUvQixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsaUJBQWlCLEVBQUU7Q0FDcEIsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDRGQUE0RixFQUFFLENBQUM7Q0FDaEgsR0FBRyxPQUFPLFNBQVMsQ0FBQzs7Q0FFcEIsR0FBRztDQUNILEVBQUUsR0FBRyxFQUFFLHlCQUF5Qjs7Q0FFaEMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDRGQUE0RixFQUFFLENBQUM7O0NBRWhILEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUU7O0NBRW5ELENBQUMsUUFBUSxFQUFFO0NBQ1gsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDZGQUE2RixFQUFFLENBQUM7Q0FDakgsR0FBRyxPQUFPLFNBQVMsQ0FBQzs7Q0FFcEIsR0FBRztDQUNILEVBQUUsR0FBRyxFQUFFLDRCQUE0Qjs7Q0FFbkMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDZGQUE2RixFQUFFLENBQUM7O0NBRWpILEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxrQkFBa0IsRUFBRTtDQUNyQixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUdBQXVHLEVBQUUsQ0FBQztDQUMzSCxHQUFHLE9BQU8sU0FBUyxDQUFDOztDQUVwQixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHVHQUF1RyxFQUFFLENBQUM7O0NBRTNILEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxpQkFBaUIsRUFBRTtDQUNwQixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0dBQXNHLEVBQUUsQ0FBQztDQUMxSCxHQUFHLE9BQU8sU0FBUyxDQUFDOztDQUVwQixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7O0NBRTFILEdBQUc7Q0FDSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKOztDQUVBLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUU7O0NBRXRELENBQUMsS0FBSyxFQUFFO0NBQ1IsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHdEQUF3RCxFQUFFLENBQUM7Q0FDNUUsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDOztDQUU3QixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSx3REFBd0QsRUFBRSxDQUFDO0NBQzVFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztDQUU5QixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsS0FBSyxFQUFFO0NBQ1IsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHdEQUF3RCxFQUFFLENBQUM7Q0FDNUUsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDOztDQUU3QixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSx3REFBd0QsRUFBRSxDQUFDO0NBQzVFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztDQUU5QixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsU0FBUyxFQUFFO0NBQ1osRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGdFQUFnRSxFQUFFLENBQUM7Q0FDcEYsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDOztDQUVqQyxHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxnRUFBZ0UsRUFBRSxDQUFDO0NBQ3BGLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOztDQUVsQyxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsU0FBUyxFQUFFO0NBQ1osRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGdFQUFnRSxFQUFFLENBQUM7Q0FDcEYsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDOztDQUVqQyxHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxnRUFBZ0UsRUFBRSxDQUFDO0NBQ3BGLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOztDQUVsQyxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsVUFBVSxFQUFFO0NBQ2IsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGtFQUFrRSxFQUFFLENBQUM7Q0FDdEYsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDOztDQUVsQyxHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxrRUFBa0UsRUFBRSxDQUFDO0NBQ3RGLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDOztDQUVuQyxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsTUFBTSxFQUFFO0NBQ1QsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDBEQUEwRCxFQUFFLENBQUM7Q0FDOUUsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOztDQUU5QixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDO0NBQzlFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztDQUUvQixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsTUFBTSxFQUFFO0NBQ1QsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDBEQUEwRCxFQUFFLENBQUM7Q0FDOUUsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOztDQUU5QixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDO0NBQzlFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztDQUUvQixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsTUFBTSxFQUFFO0NBQ1QsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDBEQUEwRCxFQUFFLENBQUM7Q0FDOUUsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOztDQUU5QixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDO0NBQzlFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztDQUUvQixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsSUFBSSxFQUFFO0NBQ1AsRUFBRSxHQUFHLEVBQUUsWUFBWTs7Q0FFbkIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNEQUFzRCxFQUFFLENBQUM7Q0FDMUUsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDOztDQUU1QixHQUFHO0NBQ0gsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxzREFBc0QsRUFBRSxDQUFDO0NBQzFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUU3QixHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsZUFBZSxFQUFFO0NBQ2xCLEVBQUUsR0FBRyxFQUFFLFlBQVk7O0NBRW5CLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSw0RUFBNEUsRUFBRSxDQUFDO0NBQ2hHLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQzs7Q0FFdkMsR0FBRztDQUNILEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNEVBQTRFLEVBQUUsQ0FBQztDQUNoRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzs7Q0FFeEMsR0FBRztDQUNILEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7O0NBRUEsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUU7O0NBRWpELENBQUMsUUFBUSxFQUFFO0NBQ1gsRUFBRSxHQUFHLEVBQUUseUJBQXlCOztDQUVoQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaURBQWlELEVBQUUsQ0FBQzs7Q0FFckUsR0FBRztDQUNILEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7O0NBRUEsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxJQUFJLEdBQUc7O0NBRXpDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSx3RUFBd0UsRUFBRSxDQUFDO0NBQzFGLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0NBQ2xCLENBQUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztDQUNyQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUU3QyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTVCLEVBQUUsRUFBRSxDQUFDO0NBQ0wsQ0FBQyxPQUFPLElBQUksQ0FBQzs7Q0FFYixDQUFDLENBQUM7O0NBRUYsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTs7Q0FFOUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLDZEQUE2RCxFQUFFLENBQUM7Q0FDL0UsQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUVoQyxDQUFDLENBQUM7O0NBRUY7O0NBRUEsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsV0FBVyxRQUFRLEVBQUUsS0FBSyxHQUFHOztDQUVsRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0RBQXNELEVBQUUsQ0FBQztDQUN4RSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXZDLENBQUMsQ0FBQzs7Q0NybzVDRixzQkFBYyxHQUFHLFNBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQztHQUN0QyxJQUFJLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztHQUM1QixNQUFNLEdBQUcsTUFBTSxJQUFJLEtBQUk7Ozs7R0FJdkIsTUFBTSxDQUFDLEVBQUUsR0FBRyxTQUFTLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDO0tBQ25DLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFDO0tBQ3JELE9BQU8sTUFBTTtLQUNkOzs7O0dBSUQsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFTLElBQUksRUFBRSxJQUFJLENBQUM7S0FDL0IsSUFBSSxLQUFLLE1BQU0sR0FBRyxFQUFFLEVBQUM7S0FDckIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUs7U0FDNUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0tBQzdDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7S0FDakQsT0FBTyxNQUFNO0tBQ2Q7Ozs7R0FJRCxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxDQUFDO0tBQzFCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDdEYsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFDO0tBQ25FLE9BQU8sTUFBTTtJQUNkLENBQUM7RUFDSDs7Q0MzQkQ7QUFDQXpGLFFBQU8sQ0FBQ0EsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUV4QyxhQUEyQixFQUFFLENBQUMsQ0FBQzs7Q0NEdEUsSUFBSTJGLFNBQU8sR0FBR3JGLEtBQThCLENBQUMsTUFBTSxDQUFDO0NBQ3BELFVBQWMsR0FBRyxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0dBQ3JDLE9BQU9xRixTQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUM3QixDQUFDOztDQ0pGLFlBQWMsR0FBRzNGLE1BQTJDOztDQ0M1RCx1QkFBYyxHQUFHLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRTtHQUNuQyxJQUFJLENBQUNJLFNBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUM7R0FDdEcsT0FBTyxFQUFFLENBQUM7RUFDWCxDQUFDOztDQ0hGLElBQUlPLElBQUUsR0FBR1gsU0FBdUIsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Q0FVbkMsSUFBSSxPQUFPLEdBQUdNLEtBQWtCLENBQUMsT0FBTyxDQUFDOztDQUV6QyxJQUFJLElBQUksR0FBR2lELFlBQVcsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDOztDQUV2QyxJQUFJLFFBQVEsR0FBRyxVQUFVLElBQUksRUFBRSxHQUFHLEVBQUU7O0dBRWxDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUN6QixJQUFJLEtBQUssQ0FBQztHQUNWLElBQUksS0FBSyxLQUFLLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7O0dBRXpDLEtBQUssS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO0tBQzVDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUM7SUFDbEM7RUFDRixDQUFDOztDQUVGLHFCQUFjLEdBQUc7R0FDZixjQUFjLEVBQUUsVUFBVSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7S0FDdEQsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLFFBQVEsRUFBRTtPQUN4Q00sV0FBVSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ2hDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO09BQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRzlCLGFBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQztPQUNwQixJQUFJLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQztPQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO09BQ2YsSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFc0MsTUFBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO01BQ3ZFLENBQUMsQ0FBQztLQUNINkQsWUFBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7OztPQUd2QixLQUFLLEVBQUUsU0FBUyxLQUFLLEdBQUc7U0FDdEIsS0FBSyxJQUFJLElBQUksR0FBR0MsbUJBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO1dBQzdGLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1dBQ2YsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1dBQzdDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUN0QjtTQUNELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7U0FDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQjs7O09BR0QsUUFBUSxFQUFFLFVBQVUsR0FBRyxFQUFFO1NBQ3ZCLElBQUksSUFBSSxHQUFHQSxtQkFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNoQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDLElBQUksS0FBSyxFQUFFO1dBQ1QsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztXQUNuQixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1dBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7V0FDeEIsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7V0FDZixJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztXQUN4QixJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztXQUN4QixJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1dBQ3JDLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7V0FDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7VUFDZCxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNsQjs7O09BR0QsT0FBTyxFQUFFLFNBQVMsT0FBTyxDQUFDLFVBQVUsMkJBQTJCO1NBQzdEQSxtQkFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyQixJQUFJLENBQUMsR0FBR25ILElBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM1RSxJQUFJLEtBQUssQ0FBQztTQUNWLE9BQU8sS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUU7V0FDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7V0FFMUIsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztVQUMxQztRQUNGOzs7T0FHRCxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFO1NBQ3JCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQ21ILG1CQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDO01BQ0YsQ0FBQyxDQUFDO0tBQ0gsSUFBSTVFLFlBQVcsRUFBRTVDLElBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRTtPQUN2QyxHQUFHLEVBQUUsWUFBWTtTQUNmLE9BQU93SCxtQkFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQztNQUNGLENBQUMsQ0FBQztLQUNILE9BQU8sQ0FBQyxDQUFDO0lBQ1Y7R0FDRCxHQUFHLEVBQUUsVUFBVSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtLQUMvQixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ2hDLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQzs7S0FFaEIsSUFBSSxLQUFLLEVBQUU7T0FDVCxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQzs7TUFFakIsTUFBTTtPQUNMLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHO1NBQ2hCLENBQUMsRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7U0FDN0IsQ0FBQyxFQUFFLEdBQUc7U0FDTixDQUFDLEVBQUUsS0FBSztTQUNSLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7U0FDakIsQ0FBQyxFQUFFLFNBQVM7U0FDWixDQUFDLEVBQUUsS0FBSztRQUNULENBQUM7T0FDRixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztPQUM5QixJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztPQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7T0FFYixJQUFJLEtBQUssS0FBSyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7TUFDM0MsQ0FBQyxPQUFPLElBQUksQ0FBQztJQUNmO0dBQ0QsUUFBUSxFQUFFLFFBQVE7R0FDbEIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7OztLQUdwQ0MsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxRQUFRLEVBQUUsSUFBSSxFQUFFO09BQzdDLElBQUksQ0FBQyxFQUFFLEdBQUdELG1CQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ25DLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO09BQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7TUFDckIsRUFBRSxZQUFZO09BQ2IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO09BQ2hCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7T0FDbkIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7T0FFcEIsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzs7T0FFekMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFOztTQUVqRSxJQUFJLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQztTQUNwQixPQUFPMUYsU0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCOztPQUVELElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRSxPQUFPQSxTQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztPQUM1QyxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsT0FBT0EsU0FBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDOUMsT0FBT0EsU0FBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDcEMsRUFBRSxNQUFNLEdBQUcsU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQzs7O0tBR2pENEYsV0FBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCO0VBQ0YsQ0FBQzs7Q0M3SUYsSUFBSS9FLFNBQU8sR0FBR3RELElBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7O0NBRTNDLDRCQUFjLEdBQUcsVUFBVSxRQUFRLEVBQUU7R0FDbkMsSUFBSSxDQUFDLENBQUM7R0FDTixJQUFJMEYsUUFBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0tBQ3JCLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztLQUV6QixJQUFJLE9BQU8sQ0FBQyxJQUFJLFVBQVUsS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJQSxRQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztLQUNuRixJQUFJdEYsU0FBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO09BQ2YsQ0FBQyxHQUFHLENBQUMsQ0FBQ2tELFNBQU8sQ0FBQyxDQUFDO09BQ2YsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUM7TUFDL0I7SUFDRixDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQ3RDLENBQUM7O0NDZkY7OztDQUdBLHVCQUFjLEdBQUcsVUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFO0dBQzNDLE9BQU8sS0FBS1Msd0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7RUFDbkQsQ0FBQzs7Q0NMRjs7Ozs7Ozs7Ozs7O0NBWUEsaUJBQWMsR0FBRyxVQUFVLElBQUksRUFBRSxPQUFPLEVBQUU7R0FDeEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztHQUN2QixJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0dBQzFCLElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7R0FDeEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztHQUN6QixJQUFJLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0dBQzlCLElBQUksUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDO0dBQzFDLElBQUksTUFBTSxHQUFHLE9BQU8sSUFBSXVFLG1CQUFHLENBQUM7R0FDNUIsT0FBTyxVQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0tBQ3hDLElBQUksQ0FBQyxHQUFHcEcsU0FBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hCLElBQUksSUFBSSxHQUFHZixRQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEIsSUFBSSxDQUFDLEdBQUdILElBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2pDLElBQUksTUFBTSxHQUFHTSxTQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ25DLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztLQUNkLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztLQUN2RixJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUM7S0FDYixNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtPQUM1RCxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO09BQ2xCLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztPQUN2QixJQUFJLElBQUksRUFBRTtTQUNSLElBQUksTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7Y0FDM0IsSUFBSSxHQUFHLEVBQUUsUUFBUSxJQUFJO1dBQ3hCLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO1dBQ3BCLEtBQUssQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDO1dBQ25CLEtBQUssQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO1dBQ3JCLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7VUFDMUIsTUFBTSxJQUFJLFFBQVEsRUFBRSxPQUFPLEtBQUssQ0FBQztRQUNuQztNQUNGO0tBQ0QsT0FBTyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxJQUFJLFFBQVEsR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDO0lBQ3JFLENBQUM7RUFDSCxDQUFDOztDQ2hDRixJQUFJWCxJQUFFLEdBQUdYLFNBQXVCLENBQUMsQ0FBQyxDQUFDO0NBQ25DLElBQUksSUFBSSxHQUFHTSxhQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDOzs7Q0FHMUMsZUFBYyxHQUFHLFVBQVUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7R0FDMUUsSUFBSSxJQUFJLEdBQUdRLE9BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUN4QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7R0FDYixJQUFJLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztHQUNuQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztHQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDWCxJQUFJLENBQUN5QyxZQUFXLElBQUksT0FBTyxDQUFDLElBQUksVUFBVSxJQUFJLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQ2lCLE1BQUssQ0FBQyxZQUFZO0tBQzdGLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDLEVBQUU7O0tBRUgsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDeEQwRCxZQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNsQ0ssS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsTUFBTTtLQUNMLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxNQUFNLEVBQUUsUUFBUSxFQUFFO09BQ3RDMUUsV0FBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ2xDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztPQUN2QixJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUVRLE1BQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztNQUMzRSxDQUFDLENBQUM7S0FDSCxJQUFJLENBQUMsaUVBQWlFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxFQUFFO09BQ2hHLElBQUksUUFBUSxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQztPQUM1QyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFcEQsS0FBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtTQUN2RjRDLFdBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxJQUFJLENBQUN6RCxTQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLElBQUksS0FBSyxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDbEYsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUMsT0FBTyxRQUFRLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNqQyxDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7S0FDSCxPQUFPLElBQUlPLElBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRTtPQUNqQyxHQUFHLEVBQUUsWUFBWTtTQUNmLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDckI7TUFDRixDQUFDLENBQUM7SUFDSjs7R0FFRHNCLGVBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7O0dBRXhCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDWk8sT0FBTyxDQUFDQSxPQUFPLENBQUMsQ0FBQyxHQUFHQSxPQUFPLENBQUMsQ0FBQyxHQUFHQSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztHQUU5QyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzs7R0FFaEQsT0FBTyxDQUFDLENBQUM7RUFDVixDQUFDOztDQ3ZERixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7OztDQUdoQixXQUFjLEdBQUd4QyxXQUF3QixDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsRUFBRTtHQUM1RCxPQUFPLFNBQVMsR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDOUYsRUFBRTs7R0FFRCxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFO0tBQ3JCLElBQUksS0FBSyxHQUFHd0ksaUJBQU0sQ0FBQyxRQUFRLENBQUNMLG1CQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3RELE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekI7O0dBRUQsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7S0FDNUIsT0FBT0ssaUJBQU0sQ0FBQyxHQUFHLENBQUNMLG1CQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRTtFQUNGLEVBQUVLLGlCQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7O0NDaEJqQixzQkFBYyxHQUFHLFVBQVUsSUFBSSxFQUFFLFFBQVEsRUFBRTtHQUN6QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7R0FDaEJuRSxNQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztHQUNsRCxPQUFPLE1BQU0sQ0FBQztFQUNmLENBQUM7O0NDTkY7OztDQUdBLHFCQUFjLEdBQUcsVUFBVSxJQUFJLEVBQUU7R0FDL0IsT0FBTyxTQUFTLE1BQU0sR0FBRztLQUN2QixJQUFJekIsUUFBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUMsQ0FBQztLQUMzRSxPQUFPNkYsa0JBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDO0VBQ0gsQ0FBQzs7Q0NSRjs7O0FBR0FqRyxRQUFPLENBQUNBLE9BQU8sQ0FBQyxDQUFDLEdBQUdBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFeEMsaUJBQWdDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7OztDQ0MzRixvQkFBYyxHQUFHLFVBQVUsVUFBVSxFQUFFO0dBQ3JDd0MsT0FBTyxDQUFDQSxPQUFPLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRztLQUNqRCxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0tBQzlCLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCLE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMvQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEVBQUUsQ0FBQyxDQUFDO0VBQ04sQ0FBQzs7Q0NYRjtBQUNBeEMsaUJBQStCLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7Ozs7O0NDTXZDLHNCQUFjLEdBQUcsVUFBVSxVQUFVLEVBQUU7R0FDckN3QyxPQUFPLENBQUNBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxDQUFDLE1BQU0seUJBQXlCO0tBQ2xGLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6QixJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUN0QnJDLFVBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoQixPQUFPLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQztLQUM5QixJQUFJLE9BQU8sRUFBRUEsVUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzlCLElBQUksTUFBTSxJQUFJLFNBQVMsRUFBRSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7S0FDM0MsQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUNQLElBQUksT0FBTyxFQUFFO09BQ1gsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUNOLEVBQUUsR0FBR2EsSUFBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7T0FDakNxRCxNQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLFFBQVEsRUFBRTtTQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQztNQUNKLE1BQU07T0FDTEEsTUFBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNqQztLQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsRUFBRSxDQUFDLENBQUM7RUFDTixDQUFDOztDQzNCRjtBQUNBckUsbUJBQWlDLENBQUMsS0FBSyxDQUFDLENBQUM7O0NDTXpDLE9BQWMsR0FBR29FLEtBQTJCLENBQUMsR0FBRyxDQUFDOztDQ1BqRCxTQUFjLEdBQUdwRSxHQUFpQzs7Q0NJbEQsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztDQUMxQixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7O0NBRW5CLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7R0FDdEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRTtLQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztLQUU1RCxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxlQUFlLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN2RSxDQUFDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUNsQyxDQUFDOztDQUVGLFNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksa0JBQWtCO0dBQ3BFLElBQUksRUFBRSxHQUFHRyxVQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDekIsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7R0FDN0MsSUFBSSxLQUFLLEdBQUcseUJBQXlCO0tBQ25DLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBQ3ZELE9BQU8sSUFBSSxZQUFZLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUc2QyxPQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRixDQUFDO0dBQ0YsSUFBSTVDLFNBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO0dBQzNELE9BQU8sS0FBSyxDQUFDO0VBQ2QsQ0FBQzs7Q0N4QkY7Ozs7Ozs7O0NBUUEsSUFBSSxVQUFVLEdBQUcsQ0FBQ0osT0FBb0IsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLFNBQVMsQ0FBQzs7OztDQUloRSxJQUFJLGNBQWMsR0FBR3dFLE1BQUssQ0FBQyxZQUFZO0dBQ3JDLFNBQVMsQ0FBQyxHQUFHLGVBQWU7R0FDNUIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxZQUFZLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7RUFDdkUsQ0FBQyxDQUFDO0NBQ0gsSUFBSSxRQUFRLEdBQUcsQ0FBQ0EsTUFBSyxDQUFDLFlBQVk7R0FDaEMsVUFBVSxDQUFDLFlBQVksZUFBZSxDQUFDLENBQUM7RUFDekMsQ0FBQyxDQUFDOztBQUVIaEMsUUFBTyxDQUFDQSxPQUFPLENBQUMsQ0FBQyxHQUFHQSxPQUFPLENBQUMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUU7R0FDdkUsU0FBUyxFQUFFLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLG9CQUFvQjtLQUM1RHJDLFVBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNsQkssU0FBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2YsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHTCxVQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDeEUsSUFBSSxRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztLQUM1RSxJQUFJLE1BQU0sSUFBSSxTQUFTLEVBQUU7O09BRXZCLFFBQVEsSUFBSSxDQUFDLE1BQU07U0FDakIsS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1NBQzVCLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkMsS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JELEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0Q7O09BRUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUNuQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDOUIsT0FBTyxLQUFLdUksS0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUMxQzs7S0FFRCxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO0tBQ2hDLElBQUksUUFBUSxHQUFHM0csYUFBTSxDQUFDM0IsU0FBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbEUsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUN6RCxPQUFPQSxTQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUM3QztFQUNGLENBQUMsQ0FBQzs7Q0M3Q0gsZUFBYyxHQUFHRSxLQUE4QixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7O0NDRGxFLGVBQWMsR0FBR04sV0FBK0M7OztDQ0loRSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtHQUN2QyxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSTJJLFdBQWtCLEVBQUU7S0FDeEQsY0FBYyxHQUFHLFVBQVUsR0FBR0EsV0FBa0IsQ0FBQztJQUNsRCxNQUFNO0tBQ0wsY0FBYyxHQUFHLFVBQVUsR0FBRyxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtPQUNyRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO09BQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3RCLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztPQUMvQyxJQUFJLFFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO09BQ2pDLElBQUksS0FBSyxFQUFFekMsZ0JBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO09BQ3JELE9BQU8sUUFBUSxDQUFDO01BQ2pCLENBQUM7SUFDSDs7R0FFRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0VBQzFDOztDQUVELGNBQWMsR0FBRyxVQUFVOzs7O0NDWDNCLFNBQVMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO0dBQy9CLElBQUksTUFBTSxHQUFHLE9BQU8wQyxLQUFJLEtBQUssVUFBVSxHQUFHLElBQUlBLEtBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQzs7R0FFakUsY0FBYyxHQUFHLGdCQUFnQixHQUFHLFNBQVMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO0tBQ25FLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO09BQy9CLE1BQU0sSUFBSSxTQUFTLENBQUMsb0RBQW9ELENBQUMsQ0FBQztNQUMzRTs7S0FFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtPQUNqQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOztPQUVoRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztNQUM1Qjs7S0FFRCxTQUFTLE9BQU8sR0FBRyxFQUFFOztLQUVyQixPQUFPLENBQUMsU0FBUyxHQUFHQyxRQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtPQUNsRCxXQUFXLEVBQUU7U0FDWCxLQUFLLEVBQUUsT0FBTztTQUNkLFVBQVUsRUFBRSxLQUFLO1NBQ2pCLFFBQVEsRUFBRSxJQUFJO1NBQ2QsWUFBWSxFQUFFLElBQUk7UUFDbkI7TUFDRixDQUFDLENBQUM7S0FDSCxPQUFPM0MsZ0JBQWMsQ0FBQyxPQUFPLEVBQUVBLGdCQUFjLENBQUMsU0FBUyxLQUFLLEdBQUc7T0FDN0QsT0FBTzRDLFdBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFMUcsZ0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztNQUN0RSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDOztHQUVGLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7RUFDaEM7O0NBRUQsY0FBYyxHQUFHLGdCQUFnQjs7O0tDMUNwQjJHLGtCQUFiO0NBQUE7Q0FBQTtDQUNFLDRCQUFZQyxhQUFaLEVBQTJCQyxPQUEzQixFQUFvQ0MsU0FBcEMsRUFBK0M7Q0FBQTs7Q0FBQTs7Q0FDN0MscUdBQVVGLGFBQVYsZUFBNEJDLE9BQTVCOztDQUVBLFFBQU1FLGFBQWEsTUFBS0MsS0FBTCxDQUFXQyxLQUFYLENBQWlCLElBQWpCLENBQW5COztDQUNBRixlQUFXRyxNQUFYLENBQWtCLENBQWxCLEVBQXFCLENBQXJCO0NBRUEsVUFBS0YsS0FBTCxHQUFhRCxXQUFXSSxJQUFYLENBQWdCLElBQWhCLENBQWI7Q0FFQSxRQUFJQyxPQUFKLEVBQWFBLFFBQVFDLEtBQVIsQ0FBYyxZQUFkLEVBQTRCUCxTQUE1QjtDQUViLFVBQUtRLElBQUwsR0FBWSxrQkFBWjtDQVY2QztDQVc5Qzs7Q0FaSDs7Q0FBQTtDQUFBLGtCQUFzQ0MsS0FBdEM7QUFlQSxLQUFhQyxlQUFiO0NBQUE7Q0FBQTtDQUNFLDJCQUFZWixhQUFaLEVBQTJCQyxPQUEzQixFQUFvQ1ksWUFBcEMsRUFBNEU7Q0FBQTs7Q0FBQSxRQUExQkMsZ0JBQTBCLHVFQUFQLEtBQU87O0NBQUE7O0NBQzFFLHFHQUFVZCxhQUFWLGVBQTRCQyxPQUE1Qjs7Q0FFQSxRQUFNRSxhQUFhLE9BQUtDLEtBQUwsQ0FBV0MsS0FBWCxDQUFpQixJQUFqQixDQUFuQjs7Q0FDQUYsZUFBV0csTUFBWCxDQUFrQixDQUFsQixFQUFxQixDQUFyQjtDQUVBLFdBQUtGLEtBQUwsR0FBYUQsV0FBV0ksSUFBWCxDQUFnQixJQUFoQixDQUFiO0NBRUEsUUFBSUMsT0FBSixFQUFhQSxRQUFRQyxLQUFSLENBQWMsZ0JBQWQsRUFBZ0NJLFlBQWhDO0NBQ2IsUUFBSUwsV0FBV00sZ0JBQWYsRUFBaUNOLFFBQVFDLEtBQVIsQ0FBYyxpQ0FBZCxFQUFpREssZ0JBQWpEO0NBRWpDLFdBQUtKLElBQUwsR0FBWSxpQkFBWjtDQVgwRTtDQVkzRTs7Q0FiSDs7Q0FBQTtDQUFBLGtCQUFxQ0MsS0FBckM7QUFnQkEsS0FBYUksWUFBYjtDQUFBO0NBQUE7Q0FDRSx3QkFBWWYsYUFBWixFQUEyQkMsT0FBM0IsRUFBb0NDLFNBQXBDLEVBQXFFO0NBQUE7O0NBQUEsUUFBdEJXLFlBQXNCLHVFQUFQLEtBQU87O0NBQUE7O0NBQ25FLGtHQUFVYixhQUFWLGVBQTRCQyxPQUE1Qjs7Q0FFQSxRQUFNRSxhQUFhLE9BQUtDLEtBQUwsQ0FBV0MsS0FBWCxDQUFpQixJQUFqQixDQUFuQjs7Q0FDQUYsZUFBV0csTUFBWCxDQUFrQixDQUFsQixFQUFxQixDQUFyQjtDQUVBLFdBQUtGLEtBQUwsR0FBYUQsV0FBV0ksSUFBWCxDQUFnQixJQUFoQixDQUFiO0NBRUEsUUFBSUMsT0FBSixFQUFhQSxRQUFRQyxLQUFSLENBQWMsWUFBZCxFQUE0QlAsU0FBNUI7Q0FDYixRQUFJTSxXQUFXSyxZQUFmLEVBQTZCTCxRQUFRQyxLQUFSLENBQWMsZ0JBQWQsRUFBZ0NJLFlBQWhDO0NBRTdCLFdBQUtILElBQUwsR0FBWSxjQUFaO0NBWG1FO0NBWXBFOztDQWJIOztDQUFBO0NBQUEsa0JBQWtDQyxLQUFsQzs7Q0MxQkEsSUFBTUssV0FBVyxTQUFYQSxRQUFXLEdBQU07Q0FDckIsUUFBTSxJQUFJTCxLQUFKLENBQVUscUVBQVYsQ0FBTjtDQUNELENBRkQ7O0NBSUEsSUFBSTtDQUNGLE1BQUksQ0FBQ00sUUFBTCxFQUFlRDtDQUNoQixDQUZELENBRUUsT0FBT0UsR0FBUCxFQUFZO0NBQ1pGO0NBQ0Q7Q0FFRDs7Ozs7Ozs7Ozs7QUFTQSxLQUFhRyxZQUFiO0NBQUE7Q0FBQTtDQUFBO0NBQUE7O0NBQUE7Q0FBQTs7Q0FBQTtDQUFBO0NBQ0U7O0NBRUE7Ozs7Ozs7Q0FIRixxQ0FVbUJDLE1BVm5CLEVBVTJCO0NBQ3ZCLFVBQUksQ0FBQyxLQUFLQyxPQUFOLElBQWlCLENBQUNELE1BQXRCLEVBQThCO0NBQzlCLFVBQUlBLFVBQVVBLE9BQU9DLE9BQXJCLEVBQThCLEtBQUtBLE9BQUwsR0FBZUQsT0FBT0MsT0FBUCxDQUFlbkQsS0FBZixDQUFxQixDQUFyQixDQUFmOztDQUU5QixVQUFJLEtBQUttRCxPQUFULEVBQWtCO0NBQ2hCLGFBQUssSUFBSTlDLElBQUksQ0FBUixFQUFXQyxNQUFNLEtBQUs2QyxPQUFMLENBQWE1QyxNQUFuQyxFQUEyQ0YsSUFBSUMsR0FBL0MsRUFBb0RELEdBQXBEO0NBQ0UsZUFBSytDLFdBQUwsQ0FBaUIsS0FBS0QsT0FBTCxDQUFhOUMsQ0FBYixDQUFqQixFQUFrQyxLQUFsQztDQURGO0NBRUQ7O0NBRUQsVUFBSTZDLE1BQUosRUFBWSxLQUFLRyxXQUFMLENBQWlCO0NBQUNDLGdCQUFRSjtDQUFULE9BQWpCO0NBQ2IsS0FwQkg7O0NBd0JFOzs7Ozs7Ozs7Q0F4QkY7Q0FBQTtDQUFBLGtDQWdDOEI7Q0FBQSxVQUFoQkssU0FBZ0IsdUVBQUosRUFBSTtDQUFBLFVBQ25CSixPQURtQixHQUNSLElBRFEsQ0FDbkJBLE9BRG1CO0NBRTFCLFVBQUksQ0FBQ0EsT0FBTCxFQUFjLE9BQU9JLFNBQVA7O0NBRWQsV0FBSyxJQUFJbEQsSUFBSSxDQUFSLEVBQVdDLE1BQU02QyxRQUFRNUMsTUFBOUIsRUFBc0NGLElBQUlDLEdBQTFDLEVBQStDRCxHQUEvQyxFQUFvRDtDQUNsRCxhQUFLLElBQU1NLEdBQVgsSUFBa0I0QyxTQUFsQixFQUE2QjtDQUMzQixjQUFJQSxVQUFVNUMsR0FBVixDQUFKLEVBQW9CO0NBQ2xCLGdCQUFNNkMsU0FBU0wsUUFBUTlDLENBQVIsQ0FBZjtDQUVBLGdCQUFJbUQsVUFBVUEsT0FBT0MsTUFBakIsSUFBMkJELE9BQU9DLE1BQVAsQ0FBYzlDLEdBQWQsQ0FBL0IsRUFDRTRDLFVBQVU1QyxHQUFWLElBQWlCNkMsT0FBT0MsTUFBUCxDQUFjOUMsR0FBZCxFQUFtQitDLEtBQW5CLENBQXlCLElBQXpCLEVBQStCLENBQUNILFVBQVU1QyxHQUFWLENBQUQsRUFBaUI2QyxNQUFqQixDQUEvQixDQUFqQjtDQUNIO0NBQ0Y7Q0FDRjs7Q0FFRCxhQUFPRCxTQUFQO0NBQ0Q7Q0FFRDs7Ozs7Ozs7O0NBbERGO0NBQUE7Q0FBQSxpQ0EwRGVmLElBMURmLEVBMERrRjtDQUFBOztDQUFBLFVBQTdEbUIsRUFBNkQsdUVBQXhELFVBQUNDLElBQUQsRUFBT0MsV0FBUDtDQUFBLGVBQXVCRCxLQUFLRixLQUFMLENBQVcsS0FBWCxFQUFpQixDQUFDRyxXQUFELENBQWpCLENBQXZCO0NBQUEsT0FBd0Q7Q0FBQSxVQUN2RVYsT0FEdUUsR0FDNUQsSUFENEQsQ0FDdkVBLE9BRHVFO0NBRTlFLFVBQUksQ0FBQ0EsT0FBTCxFQUFjOztDQUVkLFdBQUssSUFBSTlDLElBQUksQ0FBUixFQUFXQyxNQUFNNkMsUUFBUTVDLE1BQTlCLEVBQXNDRixJQUFJQyxHQUExQyxFQUErQ0QsR0FBL0MsRUFBb0Q7Q0FDbEQsWUFBTW1ELFNBQVNMLFFBQVE5QyxDQUFSLENBQWY7Q0FDQSxZQUFJbUMsUUFBUWdCLE1BQVosRUFBb0JHLEdBQUdILE9BQU9oQixJQUFQLENBQUgsRUFBaUJnQixNQUFqQjtDQUNyQjtDQUNGO0NBRUQ7Ozs7Ozs7Ozs7OztDQXBFRjtDQUFBO0NBQUEsZ0NBK0VjQSxNQS9FZCxFQStFbUM7Q0FBQSxVQUFiTSxJQUFhLHVFQUFOLElBQU07Q0FDL0IsVUFBSSxDQUFDTixNQUFMLEVBQWE7Q0FDYixVQUFJTSxRQUFRLEtBQUtYLE9BQWpCLEVBQTBCLEtBQUtBLE9BQUwsQ0FBYVcsSUFBYixDQUFrQk4sTUFBbEIsRUFBMUIsS0FDSyxJQUFJTSxJQUFKLEVBQVUsS0FBS1gsT0FBTCxHQUFlLENBQUNLLE1BQUQsQ0FBZjtDQUVmLFVBQUksS0FBS08sT0FBVCxFQUFrQixLQUFLQSxPQUFMLENBQWFDLE1BQWIsQ0FBb0JSLE1BQXBCO0NBRWxCLFVBQUlBLE9BQU9PLE9BQVAsSUFBa0IsS0FBS0EsT0FBM0IsRUFBb0NQLE9BQU9PLE9BQVAsQ0FBZSxLQUFLQSxPQUFwQixFQUFwQyxLQUNLLElBQUlQLE9BQU9PLE9BQVgsRUFBb0I7Q0FDdkIsY0FBTSxJQUFJbEIsWUFBSixDQUNKLFdBREkseUVBR0osSUFISSxFQUdFVyxNQUhGLENBQU47Q0FLRDtDQUVELFVBQUlBLE9BQU9TLFNBQVgsRUFBc0JULE9BQU9TLFNBQVAsQ0FBaUJ6QyxJQUFqQixDQUFzQixJQUF0QixFQUE0QmdDLE1BQTVCO0NBRXRCLGFBQU9BLE1BQVA7Q0FDRDtDQUVEOzs7Ozs7O0NBcEdGO0NBQUE7Q0FBQSxxQ0EwR21CO0NBQ2YsYUFBTyxLQUFLTCxPQUFMLENBQWE1QyxNQUFwQjtDQUNFLGFBQUsyRCxhQUFMLENBQW1CLEtBQUtmLE9BQUwsQ0FBYSxDQUFiLENBQW5CO0NBREY7Q0FFRDtDQUVEOzs7Ozs7Ozs7Q0EvR0Y7Q0FBQTtDQUFBLGtDQXVIZ0JLLE1BdkhoQixFQXVId0I7Q0FDcEIsVUFBSSxDQUFDQSxNQUFMLEVBQWE7Q0FFYixXQUFLTCxPQUFMLENBQWFmLE1BQWIsQ0FBb0IsS0FBS2UsT0FBTCxDQUFhZ0IsT0FBYixDQUFxQlgsTUFBckIsQ0FBcEIsRUFBa0QsQ0FBbEQ7Q0FFQSxVQUFJQSxPQUFPWSxPQUFYLEVBQW9CWixPQUFPWSxPQUFQLENBQWU1QyxJQUFmLENBQW9CLElBQXBCLEVBQTBCZ0MsTUFBMUI7Q0FFcEIsYUFBT0EsTUFBUDtDQUNELEtBL0hIOztDQW1JRTs7Ozs7Ozs7Ozs7Ozs7O0NBbklGO0NBQUE7Q0FBQSwyQkFpSlNBLE9BakpULEVBaUppQjtDQUNiLFdBQUtKLFdBQUwsQ0FBaUJJLE9BQWpCO0NBQ0EsYUFBTyxJQUFQO0NBQ0Q7Q0FwSkg7O0NBQUE7O0NBQUE7Q0FBQSxFQUFrQ2Esa0JBQWxDOztDQ3hCQSxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUU7R0FDNUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0VBQ3BDOztDQUVELGtCQUFjLEdBQUcsZUFBZTs7Q0NGaEMsb0JBQWMsR0FBR3ZMLEtBQWtCLENBQUMsV0FBVyxHQUFHLFVBQVUsRUFBRSxFQUFFO0dBQzlELElBQUksTUFBTSxHQUFHd0wsc0JBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNyQixJQUFJLE9BQU8sTUFBTSxJQUFJLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztHQUMzRSxPQUFPaEwsU0FBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUNsQyxDQUFDOztDQ0pGLGVBQWMsR0FBR0QsZ0JBQXVDLENBQUM7O0NDRnpELGlCQUFjLEdBQUdQLFdBQTBDOztDQ0UzRCxTQUFTLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7R0FDckMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0dBQ2QsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO0dBQ2QsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO0dBQ2YsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDOztHQUVuQixJQUFJO0tBQ0YsS0FBSyxJQUFJLEVBQUUsR0FBR3lMLGFBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUU7T0FDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7O09BRXBCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU07TUFDbkM7SUFDRixDQUFDLE9BQU8sR0FBRyxFQUFFO0tBQ1osRUFBRSxHQUFHLElBQUksQ0FBQztLQUNWLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDVixTQUFTO0tBQ1IsSUFBSTtPQUNGLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztNQUNqRCxTQUFTO09BQ1IsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7TUFDbEI7SUFDRjs7R0FFRCxPQUFPLElBQUksQ0FBQztFQUNiOztDQUVELHdCQUFjLEdBQUcscUJBQXFCOztDQzVCdEMsU0FBUyxnQkFBZ0IsR0FBRztHQUMxQixNQUFNLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7RUFDN0U7O0NBRUQsbUJBQWMsR0FBRyxnQkFBZ0I7O0NDRWpDLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7R0FDOUIsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLGVBQWUsRUFBRSxDQUFDO0VBQ2pGOztDQUVELGlCQUFjLEdBQUcsY0FBYzs7Q0NWaEIsU0FBUyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUU7Q0FDdkQsQ0FBQyxJQUFJLE1BQU0sQ0FBQztDQUNaLENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFMUIsQ0FBQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRTtDQUNuQyxFQUFFLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtDQUN6QixHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO0NBQzlCLEdBQUcsTUFBTTtDQUNULEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0NBQzlCLEdBQUc7Q0FDSCxFQUFFLE1BQU07Q0FDUixFQUFFLE1BQU0sR0FBRyxjQUFjLENBQUM7Q0FDMUIsRUFBRTs7Q0FFRixDQUFDLE9BQU8sTUFBTSxDQUFDO0NBQ2YsQ0FBQzs7Q0NoQkQ7QUFDQSxBQUNBO0NBQ0EsSUFBSSxJQUFJLENBQUM7O0NBRVQsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUU7Q0FDakMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ2QsQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO0NBQzFDLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQztDQUNoQixDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7Q0FDMUMsRUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFDO0NBQ2hCLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtDQUMxQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUM7Q0FDaEIsQ0FBQyxNQUFNO0NBQ1AsRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsQ0FBQzs7Q0FFRCxJQUFJLE1BQU0sR0FBR0Msd0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Q0NmNUI7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0EsSUFBSSxXQUFXLEdBQUc7Q0FDbEIsRUFBRSxJQUFJLEVBQUUsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0NBQ3BGLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0NBQzFGLENBQUMsQ0FBQzs7Q0FFRixJQUFJLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRTtDQUNuRyxFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUM7Q0FDcEIsQ0FBQyxHQUFHLFVBQVUsR0FBRyxFQUFFO0NBQ25CLEVBQUUsT0FBTyxHQUFHLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsR0FBRyxPQUFPLEdBQUcsQ0FBQztDQUMvSCxDQUFDLENBQUM7QUFDRixBQWNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQSxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUU7Q0FDNUIsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRTNHLEVBQUUsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO0NBQ2xCLEVBQUUsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtDQUNoRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQ3pDLEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDO0NBQzlDLENBQUM7O0NBRUQ7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQSxTQUFTLFdBQVcsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRTtDQUN4RCxFQUFFLElBQUksS0FBSyxDQUFDOztDQUVaLEVBQUUsSUFBSSxPQUFPLGNBQWMsS0FBSyxVQUFVLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO0NBQy9FLElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQztDQUM5QixJQUFJLGNBQWMsR0FBRyxTQUFTLENBQUM7Q0FDL0IsR0FBRzs7Q0FFSCxFQUFFLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO0NBQ3ZDLElBQUksSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7Q0FDeEMsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7Q0FDakUsS0FBSzs7Q0FFTCxJQUFJLE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztDQUMxRCxHQUFHOztDQUVILEVBQUUsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUU7Q0FDckMsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7Q0FDOUQsR0FBRzs7Q0FFSCxFQUFFLElBQUksY0FBYyxHQUFHLE9BQU8sQ0FBQztDQUMvQixFQUFFLElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQztDQUNwQyxFQUFFLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0NBQzVCLEVBQUUsSUFBSSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7Q0FDdkMsRUFBRSxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7O0NBRTVCLEVBQUUsU0FBUyw0QkFBNEIsR0FBRztDQUMxQyxJQUFJLElBQUksYUFBYSxLQUFLLGdCQUFnQixFQUFFO0NBQzVDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0NBQy9DLEtBQUs7Q0FDTCxHQUFHOztDQUVIO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQSxFQUFFLFNBQVMsUUFBUSxHQUFHO0NBQ3RCLElBQUksSUFBSSxhQUFhLEVBQUU7Q0FDdkIsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxHQUFHLDZEQUE2RCxHQUFHLHlFQUF5RSxDQUFDLENBQUM7Q0FDeE8sS0FBSzs7Q0FFTCxJQUFJLE9BQU8sWUFBWSxDQUFDO0NBQ3hCLEdBQUc7O0NBRUg7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLEVBQUUsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFO0NBQy9CLElBQUksSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7Q0FDeEMsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7Q0FDakUsS0FBSzs7Q0FFTCxJQUFJLElBQUksYUFBYSxFQUFFO0NBQ3ZCLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsR0FBRyxzRkFBc0YsR0FBRyxvRkFBb0YsR0FBRyxvRkFBb0YsQ0FBQyxDQUFDO0NBQ3BXLEtBQUs7O0NBRUwsSUFBSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7O0NBRTVCLElBQUksNEJBQTRCLEVBQUUsQ0FBQztDQUNuQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7O0NBRWpDLElBQUksT0FBTyxTQUFTLFdBQVcsR0FBRztDQUNsQyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUU7Q0FDekIsUUFBUSxPQUFPO0NBQ2YsT0FBTzs7Q0FFUCxNQUFNLElBQUksYUFBYSxFQUFFO0NBQ3pCLFFBQVEsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsR0FBRyxvRkFBb0YsQ0FBQyxDQUFDO0NBQ2pNLE9BQU87O0NBRVAsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDOztDQUUzQixNQUFNLDRCQUE0QixFQUFFLENBQUM7Q0FDckMsTUFBTSxJQUFJLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0NBQ2xELE1BQU0sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDckMsS0FBSyxDQUFDO0NBQ04sR0FBRzs7Q0FFSDtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLEVBQUUsU0FBUyxRQUFRLENBQUMsTUFBTSxFQUFFO0NBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRTtDQUNoQyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsMENBQTBDLENBQUMsQ0FBQztDQUN0RyxLQUFLOztDQUVMLElBQUksSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO0NBQzVDLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsR0FBRyxpQ0FBaUMsQ0FBQyxDQUFDO0NBQ2pILEtBQUs7O0NBRUwsSUFBSSxJQUFJLGFBQWEsRUFBRTtDQUN2QixNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztDQUM1RCxLQUFLOztDQUVMLElBQUksSUFBSTtDQUNSLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztDQUMzQixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQzFELEtBQUssU0FBUztDQUNkLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQztDQUM1QixLQUFLOztDQUVMLElBQUksSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0NBQ3JELElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDL0MsTUFBTSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbEMsTUFBTSxRQUFRLEVBQUUsQ0FBQztDQUNqQixLQUFLOztDQUVMLElBQUksT0FBTyxNQUFNLENBQUM7Q0FDbEIsR0FBRzs7Q0FFSDtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLEVBQUUsU0FBUyxjQUFjLENBQUMsV0FBVyxFQUFFO0NBQ3ZDLElBQUksSUFBSSxPQUFPLFdBQVcsS0FBSyxVQUFVLEVBQUU7Q0FDM0MsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7Q0FDcEUsS0FBSzs7Q0FFTCxJQUFJLGNBQWMsR0FBRyxXQUFXLENBQUM7Q0FDakMsSUFBSSxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Q0FDNUMsR0FBRzs7Q0FFSDtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQSxFQUFFLFNBQVMsVUFBVSxHQUFHO0NBQ3hCLElBQUksSUFBSSxJQUFJLENBQUM7O0NBRWIsSUFBSSxJQUFJLGNBQWMsR0FBRyxTQUFTLENBQUM7Q0FDbkMsSUFBSSxPQUFPLElBQUksR0FBRztDQUNsQjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0EsTUFBTSxTQUFTLEVBQUUsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFO0NBQzlDLFFBQVEsSUFBSSxDQUFDLE9BQU8sUUFBUSxLQUFLLFdBQVcsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLFFBQVEsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO0NBQ25ILFVBQVUsTUFBTSxJQUFJLFNBQVMsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0NBQ3hFLFNBQVM7O0NBRVQsUUFBUSxTQUFTLFlBQVksR0FBRztDQUNoQyxVQUFVLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtDQUM3QixZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztDQUN0QyxXQUFXO0NBQ1gsU0FBUzs7Q0FFVCxRQUFRLFlBQVksRUFBRSxDQUFDO0NBQ3ZCLFFBQVEsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQ3ZELFFBQVEsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUM1QyxPQUFPO0NBQ1AsS0FBSyxFQUFFLElBQUksQ0FBQ0MsTUFBWSxDQUFDLEdBQUcsWUFBWTtDQUN4QyxNQUFNLE9BQU8sSUFBSSxDQUFDO0NBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUM7Q0FDWixHQUFHOztDQUVIO0NBQ0E7Q0FDQTtDQUNBLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDOztDQUV2QyxFQUFFLE9BQU8sS0FBSyxHQUFHO0NBQ2pCLElBQUksUUFBUSxFQUFFLFFBQVE7Q0FDdEIsSUFBSSxTQUFTLEVBQUUsU0FBUztDQUN4QixJQUFJLFFBQVEsRUFBRSxRQUFRO0NBQ3RCLElBQUksY0FBYyxFQUFFLGNBQWM7Q0FDbEMsR0FBRyxFQUFFLEtBQUssQ0FBQ0EsTUFBWSxDQUFDLEdBQUcsVUFBVSxFQUFFLEtBQUssQ0FBQztDQUM3QyxDQUFDOztDQUVEO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLFNBQVMsT0FBTyxDQUFDLE9BQU8sRUFBRTtDQUMxQjtDQUNBLEVBQUUsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRTtDQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Q0FDM0IsR0FBRztDQUNIO0NBQ0EsRUFBRSxJQUFJO0NBQ047Q0FDQTtDQUNBO0NBQ0EsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQzdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO0NBQ2hCLENBQUM7QUFDRCxBQW9RQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0EsU0FBUyxTQUFTLEdBQUcsRUFBRTs7Q0FFdkIsSUFBSSxTQUFvQixLQUFLLFlBQVksSUFBSSxPQUFPLFNBQVMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO0NBQ25ILEVBQUUsT0FBTyxDQUFDLDhFQUE4RSxHQUFHLHVFQUF1RSxHQUFHLG9GQUFvRixHQUFHLDRFQUE0RSxHQUFHLGdFQUFnRSxDQUFDLENBQUM7Q0FDN1ksQ0FBQzs7Q0N0a0JEOzs7Ozs7OztBQU9BLEtBQWFDLGFBQWI7Q0FBQTtDQUFBO0NBQ0UseUJBQVluRixNQUFaLEVBQW9CO0NBQUE7O0NBQ2xCLFNBQUtvRixPQUFMLEdBQWVwRixNQUFmO0NBQ0EsU0FBS3FGLGFBQUwsR0FBcUIsSUFBckI7Q0FFQSxTQUFLQyxLQUFMLEdBQWFDLFlBQVksWUFBOEI7Q0FBQSxVQUE3QkMsS0FBNkIsdUVBQXJCLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FBcUI7Q0FBQSxVQUFYQyxNQUFXO0NBQ3JERCxZQUFNLENBQU4sRUFBU0MsT0FBT3JFLEdBQWhCLElBQXVCcUUsT0FBT0MsSUFBOUI7Q0FDQUYsWUFBTSxDQUFOLElBQVdDLE9BQU9yRSxHQUFsQjtDQUVBLGFBQU9vRSxLQUFQO0NBQ0QsS0FMWSxDQUFiO0NBT0EsU0FBSzVCLE9BQUwsR0FBZSxFQUFmO0NBQ0Q7Q0FFRDs7Ozs7Ozs7O0NBZkY7Q0FBQTtDQUFBLDJCQXNCU0ssTUF0QlQsRUFzQmlCO0NBQ2IsV0FBS29CLGFBQUwsR0FBcUJwQixNQUFyQjtDQUNEO0NBRUQ7Ozs7Ozs7Q0ExQkY7Q0FBQTtDQUFBLDRCQWdDVTtDQUNOLFdBQUtvQixhQUFMLEdBQXFCLElBQXJCO0NBQ0Q7Q0FFRDs7Ozs7Ozs7Q0FwQ0Y7Q0FBQTtDQUFBLDJCQTJDU3BDLElBM0NULEVBMkNlO0NBQ1gsV0FBS1csT0FBTCxDQUFhWCxJQUFiLElBQXFCLEtBQUtvQyxhQUExQjtDQUNEO0NBRUQ7Ozs7Ozs7O0NBL0NGO0NBQUE7Q0FBQSx3QkFzRE1wQyxJQXRETixFQXNEWTtDQUNSLGFBQU8sS0FBS1csT0FBTCxDQUFhWCxJQUFiLENBQVA7Q0FDRDtDQUVEOzs7Ozs7Ozs7OztDQTFERjtDQUFBO0NBQUEsd0JBb0VNN0IsR0FwRU4sRUFvRVdzRSxJQXBFWCxFQW9FaUI7Q0FDYixXQUFLSixLQUFMLENBQVdLLFFBQVgsQ0FBb0I7Q0FDbEJDLGNBQU0sS0FEWTtDQUVsQnhFLGdCQUZrQjtDQUdsQnNFO0NBSGtCLE9BQXBCO0NBS0Q7Q0FFRDs7Ozs7Ozs7Ozs7O0NBNUVGO0NBQUE7Q0FBQSx3QkF1Rk10RSxHQXZGTixFQXVGVztDQUNQLFVBQUksQ0FBQyxLQUFLa0UsS0FBTCxDQUFXTyxRQUFYLEdBQXNCLENBQXRCLEVBQXlCekUsR0FBekIsQ0FBTCxFQUFvQztDQUNsQyxjQUFNLElBQUkrQixlQUFKLENBQ0osZUFESSw2QkFFZ0IvQixHQUZoQixtQkFHSixLQUFLaUUsYUFIRCxDQUFOO0NBS0Q7O0NBRUQsYUFBTyxLQUFLQyxLQUFMLENBQVdPLFFBQVgsR0FBc0IsQ0FBdEIsRUFBeUJ6RSxHQUF6QixDQUFQO0NBQ0Q7Q0FFRDs7Ozs7Ozs7Ozs7Q0FuR0Y7Q0FBQTtDQUFBLHdCQTZHTUEsR0E3R04sRUE2R1c7Q0FDUCxhQUFPMEUsUUFBUSxLQUFLUixLQUFMLENBQVdPLFFBQVgsR0FBc0IsQ0FBdEIsRUFBeUJ6RSxHQUF6QixDQUFSLENBQVA7Q0FDRDtDQUVEOzs7Ozs7OztDQWpIRjtDQUFBO0NBQUEsNkJBd0h1QjtDQUFBOztDQUFBLFVBQWQyRSxPQUFjLHVFQUFKLEVBQUk7Q0FDbkIsV0FBS1QsS0FBTCxDQUFXVSxTQUFYLENBQXFCLFlBQU07Q0FBQSxtQ0FDRSxNQUFLVixLQUFMLENBQVdPLFFBQVgsRUFERjtDQUFBO0NBQUEsWUFDbEJILElBRGtCO0NBQUEsWUFDWk8sVUFEWTs7Q0FFekIsWUFBTUMsV0FBV0gsUUFBUUUsVUFBUixDQUFqQjtDQUVBLFlBQUlDLFFBQUosRUFBY0EsU0FBU1IsS0FBS08sVUFBTCxDQUFUO0NBQ2YsT0FMRDtDQU1EO0NBRUQ7Ozs7OztDQWpJRjtDQUFBO0NBQUEsMEJBc0llO0NBQ1hsRCxjQUFRb0QsSUFBUixDQUFhLGlEQUFiO0NBQ0EsYUFBTyxLQUFLQyxHQUFMLHVCQUFQO0NBQ0Q7Q0FFRDs7Ozs7Ozs7O0NBM0lGO0NBQUE7Q0FBQSw0QkFtSlVuRCxJQW5KVixFQW1KZ0JvRCxjQW5KaEIsRUFtSmdDO0NBQzVCLFVBQUksS0FBS0MsR0FBTCxDQUFTckQsSUFBVCxNQUFtQjNDLFNBQXZCLEVBQWtDLEtBQUs4RSxPQUFMLENBQWF2QixXQUFiLENBQXlCd0MsZ0JBQXpCO0NBQ25DO0NBckpIOztDQUFBO0NBQUE7O0NDTEE7Ozs7Ozs7OztLQVFNRTs7O0NBQ0o7Ozs7Ozs7Ozs7Q0FjQTs7Ozs7OztDQVFBOzs7OztDQUtZOztDQUVaOzs7OztDQUtjOztDQUVkOzs7OztDQUtlO0NBRWYsdUJBQStGO0NBQUE7O0NBQUEsUUFBbkZDLE1BQW1GLHVFQUExRSxFQUEwRTtDQUFBLFFBQXRFQyxRQUFzRSx1RUFBM0RGLFVBQVVFLFFBQWlEO0NBQUEsUUFBdkN0RixZQUF1Qyx1RUFBeEJvRixVQUFVcEYsWUFBYzs7Q0FBQTs7Q0FDN0Ysb0ZBRDZGOztDQUFBLHFIQWhCdkYsRUFnQnVGLGNBVHJGLEVBU3FGLGVBRnBGLEVBRW9GOztDQUk3RixVQUFLcUYsTUFBTCxHQUFjekcsT0FBT21CLGNBQWNzRixNQUFkLEVBQXNCckYsWUFBdEIsQ0FBUCxFQUE0Q3NGLFFBQTVDLENBQWQ7Q0FDQSxRQUFJLE1BQUtELE1BQUwsQ0FBWWhDLE9BQWhCLEVBQXlCLE1BQUtBLE9BQUwsR0FBZSxJQUFJVyxhQUFKLHFEQUFmO0NBRXpCLFVBQUt2QixPQUFMLEdBQWUsTUFBSzRDLE1BQUwsQ0FBWTVDLE9BQTNCOztDQUVBLFVBQUs4QyxnQkFBTDs7Q0FUNkY7Q0FVOUY7Q0FFRDs7Ozs7Ozs7Ozs7OzBCQVFLQyxTQUFTO0NBQ1osVUFBSUEsT0FBSixFQUFhLEtBQUtDLEtBQUwsQ0FBV3JDLElBQVgsQ0FBZ0JvQyxPQUFoQjtDQUNiLGFBQU9oSyxRQUFRa0ssR0FBUixDQUFZLEtBQUtELEtBQWpCLENBQVA7Q0FDRDtDQUVEOzs7Ozs7Ozs7OzJCQU9NdkMsTUFBTTtDQUFBOztDQUNWLFVBQUksS0FBS3lDLFVBQVQsRUFBcUIsS0FBS0MsSUFBTCxHQUFZQyxJQUFaLENBQWlCO0NBQUEsZUFBTTNDLEtBQUssTUFBTCxDQUFOO0NBQUEsT0FBakIsRUFBckIsS0FDS0EsS0FBSyxJQUFMO0NBQ047O0NBSUQ7Ozs7Ozs7Ozs7b0NBTzBCO0NBQUEsVUFBYm1DLE1BQWEsdUVBQUosRUFBSTtDQUN4QixXQUFLQSxNQUFMLEdBQWN6RyxPQUFPeUcsTUFBUCxFQUFlLEtBQUtBLE1BQXBCLENBQWQ7Q0FDQSxhQUFPLEtBQUtBLE1BQVo7Q0FDRDs7Q0FJRDs7Ozs7Ozs7Ozs2QkFPUTtDQUNOLGFBQU8sSUFBSSxLQUFLakcsV0FBVCxDQUFxQixLQUFLaUcsTUFBMUIsRUFBa0NTLElBQWxDLENBQXVDLElBQXZDLENBQVA7Q0FDRDtDQUVEOzs7Ozs7Ozs7Ozs7MEJBU0t0RCxRQUFRdUQsV0FBVztDQUN0QixXQUFLVixNQUFMLG9CQUFrQjdDLE9BQU82QyxNQUF6QjtDQUVBLFVBQUk3QyxPQUFPd0QsTUFBWCxFQUFtQixLQUFLQSxNQUFMLEdBQWN4RCxPQUFPd0QsTUFBUCxDQUFjQyxLQUFkLENBQW9CekQsT0FBTzZDLE1BQTNCLENBQWQ7Q0FDbkIsVUFBSVUsU0FBSixFQUFlQTtDQUNmLFdBQUtSLGdCQUFMLENBQXNCL0MsTUFBdEI7Q0FFQSxhQUFPLElBQVA7Q0FDRDtDQUVEOzs7Ozs7Ozs7Ozs7Ozt5Q0FRVTNEOzs7OztzQkFDSkEsT0FBT3FIOzs7Ozs7d0JBQWNySCxPQUFPcUgsTUFBUCxDQUFjQyxNQUFkLENBQXFCdEgsTUFBckI7Ozs7d0JBRW5CLEtBQUsrRyxJQUFMOzs7O3dCQUNBL0csT0FBTytHLElBQVA7OztxQkFFRC9HLE9BQU9tSDs7Ozs7dUJBQ0osSUFBSTdFLGtCQUFKLENBQ0osV0FESSxFQUVKLDJCQUZJLEVBR0osSUFISTs7O0NBT1J0Qyx1QkFBT3FILE1BQVAsR0FBZ0IsSUFBaEI7O3dCQUNNLEtBQUt2RCxXQUFMLENBQWlCO0NBQUN5RCx5QkFBT3ZIO0NBQVIsaUJBQWpCLEVBQWtDdUg7OztDQUN4QyxxQkFBS0osTUFBTCxDQUFZSyxHQUFaLENBQWdCeEgsT0FBT21ILE1BQXZCO0NBQ0EscUJBQUtNLFFBQUwsQ0FBY2xELElBQWQsQ0FBbUJ2RSxNQUFuQjtrREFFT0E7Ozs7Ozs7Ozs7Ozs7O0NBR1Q7Ozs7Ozs7Ozs7Ozs7OzBDQVFhQTs7Ozs7dUJBQ1BBLE9BQU9xSCxNQUFQLEtBQWtCOzs7Ozs7Ozs7d0JBRWhCLEtBQUtOLElBQUw7Ozs7d0JBQ0EvRyxPQUFPK0csSUFBUDs7O0NBRU4vRyx1QkFBT3FILE1BQVAsR0FBZ0IsSUFBaEI7Q0FDQSxxQkFBS0YsTUFBTCxDQUFZRyxNQUFaLENBQW1CdEgsT0FBT21ILE1BQTFCO0NBQ0EscUJBQUtNLFFBQUwsQ0FBYzVFLE1BQWQsQ0FBcUIsS0FBSzRFLFFBQUwsQ0FBYzdDLE9BQWQsQ0FBc0I1RSxNQUF0QixDQUFyQixFQUFvRCxDQUFwRDs7Ozs7Ozs7Ozs7Ozs7Q0FHRjs7Ozs7Ozs7OzsyQkFPTUEsUUFBUTtDQUNaLGFBQU9BLE9BQU93SCxHQUFQLENBQVcsSUFBWCxDQUFQO0NBQ0Q7Ozt5QkFFR3BHLEtBQUs7Q0FDUCxhQUFPLEtBQUtvRCxPQUFMLENBQWFPLEdBQWIsQ0FBaUIzRCxHQUFqQixDQUFQO0NBQ0Q7Ozt5QkFFR0EsS0FBSztDQUNQLGFBQU8sS0FBS29ELE9BQUwsQ0FBYThCLEdBQWIsQ0FBaUJsRixHQUFqQixDQUFQO0NBQ0Q7Q0FFRDs7Ozs7Ozt5QkFJaUI7Q0FDZixhQUFPLEtBQUt3RixLQUFMLENBQVc1RixNQUFYLEdBQW9CLENBQTNCO0NBQ0Q7Q0FFRDs7Ozs7Ozs7eUJBS2M7Q0FDWixVQUFJLEtBQUswRyxRQUFULEVBQW1CLE9BQU8sS0FBS0EsUUFBWjtDQUVuQixZQUFNLElBQUlwRSxZQUFKLENBQ0osV0FESSw4RkFHSixJQUhJLENBQU47Q0FLRDt1QkFFV2tCLFNBQVM7Q0FDbkIsV0FBS2tELFFBQUwsR0FBZ0JsRCxPQUFoQjtDQUNEO0NBRUQ7Ozs7Ozs7eUJBSWE7Q0FDWCxhQUFPLEtBQUttRCxPQUFaO0NBQ0Q7dUJBRVVDLE1BQU07Q0FDZixXQUFLRCxPQUFMLEdBQWVDLElBQWY7Q0FDQSxXQUFLRCxPQUFMLENBQWFsRixTQUFiLEdBQXlCLElBQXpCO0NBQ0EsYUFBTyxLQUFLa0YsT0FBWjtDQUNEOzs7Ozs7R0ExT3FCakU7O21DQUFsQjZDLHVCQVVjO0NBQ2hCM0MsV0FBUyxJQURPO0NBRWhCWSxXQUFTO0NBRk8sb0JBV0k7O0NDbEN4Qjs7Ozs7Ozs7Q0FRQSxTQUFTLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxtQkFBbUI7R0FDakQsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUM1RCxJQUFJLElBQUksRUFBRSxLQUFLLENBQUM7R0FDaEIsSUFBSXpLLFNBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLEVBQUUsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7R0FDOUQsSUFBSSxJQUFJLEdBQUdvRSxXQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxPQUFPN0QsSUFBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7T0FDN0QsSUFBSSxDQUFDLEtBQUs7T0FDVixJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVM7U0FDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3ZCLFNBQVMsQ0FBQztHQUNoQixJQUFJWCxTQUFRLENBQUMsS0FBSyxHQUFHZ0MsVUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztFQUN4Rjs7QUFFREksUUFBTyxDQUFDQSxPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQ25CNUMsU0FBYyxHQUFHbEMsS0FBOEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDOztDQ0Q1RCxTQUFjLEdBQUdOLEtBQXlDOztDQ0UxRCxTQUFTLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFO0dBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0tBQzlELE1BQU0sR0FBR29DLGdCQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDaEMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLE1BQU07SUFDNUI7O0dBRUQsT0FBTyxNQUFNLENBQUM7RUFDZjs7Q0FFRCxpQkFBYyxHQUFHLGNBQWM7OztDQ0gvQixTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtHQUN4QyxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSWtNLEtBQVksRUFBRTtLQUNsRCxjQUFjLEdBQUcsSUFBSSxHQUFHQSxLQUFZLENBQUM7SUFDdEMsTUFBTTtLQUNMLGNBQWMsR0FBRyxJQUFJLEdBQUcsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7T0FDaEUsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztPQUMzQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU87O09BRWxCLElBQUksSUFBSSxHQUFHdkksMEJBQWdDLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDOztPQUU1RCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7U0FDWixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDOztPQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztNQUNuQixDQUFDO0lBQ0g7O0dBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLElBQUksTUFBTSxDQUFDLENBQUM7RUFDbkQ7O0NBRUQsY0FBYyxHQUFHLElBQUk7OztDQzdCZCxTQUFTd0ksVUFBVCxHQUFnQztDQUFBLG9DQUFUQyxPQUFTO0NBQVRBLFdBQVM7Q0FBQTs7Q0FDckMsU0FBTyxVQUFVQyxNQUFWLEVBQWtCO0NBQ3ZCLFNBQUssSUFBSWxILElBQUksQ0FBYixFQUFnQkEsSUFBSWlILFFBQVEvRyxNQUE1QixFQUFvQ0YsR0FBcEMsRUFBeUM7Q0FDdkMsVUFBTW1ILFNBQVNGLFFBQVFqSCxDQUFSLENBQWY7O0NBRUEsV0FBSyxJQUFJb0gsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRCxPQUFPRSxHQUFQLENBQVduSCxNQUEvQixFQUF1Q2tILEdBQXZDLEVBQTRDO0NBQzFDLFlBQU1FLFlBQVlILE9BQU9FLEdBQVAsQ0FBV0QsQ0FBWCxDQUFsQjtDQUVBL0gsZUFBT1osY0FBUCxDQUFzQnlJLE9BQU9LLFNBQTdCLEVBQXdDRCxTQUF4QyxFQUFtRDtDQUNqRHJELGVBQUtrRCxPQUFPSyxNQUFQLENBQWNGLFNBQWQsQ0FENEM7Q0FFakRoQyxlQUFLNkIsT0FBT00sTUFBUCxDQUFjSCxTQUFkLENBRjRDO0NBR2pESSx3QkFBY1AsT0FBT08sWUFINEI7Q0FJakRDLHNCQUFZUixPQUFPUTtDQUo4QixTQUFuRDtDQU1EO0NBQ0Y7Q0FDRixHQWZEO0NBZ0JEO0FBRUQsQ0FBTyxTQUFTeEIsSUFBVCxHQUFzQjtDQUFBLHFDQUFMa0IsR0FBSztDQUFMQSxPQUFLO0NBQUE7O0NBQzNCLFNBQU87Q0FDTEEsWUFESztDQUVMRyxVQUZLLGtCQUVFckYsSUFGRixFQUVRO0NBQ1gsYUFBTyxZQUFZO0NBQ2pCLGVBQU8sS0FBS2tFLE1BQUwsQ0FBWWxFLElBQVosQ0FBUDtDQUNELE9BRkQ7Q0FHRCxLQU5JO0NBT0xzRixVQVBLLGtCQU9FdEYsSUFQRixFQU9RO0NBQ1gsYUFBTyxVQUFVeUYsS0FBVixFQUFpQjtDQUN0QixhQUFLdkIsTUFBTCxDQUFZbEUsSUFBWixFQUFrQmdFLElBQWxCLENBQXVCeUIsS0FBdkI7Q0FDRCxPQUZEO0NBR0QsS0FYSTtDQVlMRixrQkFBYyxJQVpUO0NBYUxDLGdCQUFZO0NBYlAsR0FBUDtDQWVEO0FBRUQsQ0FBTyxTQUFTRSxNQUFULEdBQXdCO0NBQUEscUNBQUxSLEdBQUs7Q0FBTEEsT0FBSztDQUFBOztDQUM3QixTQUFPO0NBQ0xBLFlBREs7Q0FFTEcsVUFGSyxrQkFFRXJGLElBRkYsRUFFUTtDQUNYLGFBQU8sWUFBWTtDQUNqQixlQUFPLEtBQUtrRSxNQUFMLENBQVlsRSxJQUFaLENBQVA7Q0FDRCxPQUZEO0NBR0QsS0FOSTtDQU9Mc0YsVUFQSyxrQkFPRXRGLElBUEYsRUFPUTtDQUNYLGFBQU8sVUFBVXlGLEtBQVYsRUFBaUI7Q0FDdEIsYUFBS3ZCLE1BQUwsQ0FBWWxFLElBQVosSUFBb0J5RixLQUFwQjtDQUNELE9BRkQ7Q0FHRCxLQVhJO0NBWUxGLGtCQUFjLElBWlQ7Q0FhTEMsZ0JBQVk7Q0FiUCxHQUFQO0NBZUQ7Ozs7Q0MzQ0Q7Ozs7Ozs7O0NBUU1HLHdCQVpMZCxXQUNDYixLQUFLLFVBQUwsRUFBaUIsVUFBakIsRUFBNkIsWUFBN0IsRUFBMkMsT0FBM0MsQ0FERCxFQUVDMEIsT0FBTyxVQUFQLEVBQW1CLFVBQW5CLENBRkQ7Ozs7OztDQWFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxQ0E7Ozs7Ozs7Ozs7O0NBaUJBOzRCQUVjRSxNQUEwQjtDQUFBLFVBQXBCdEksV0FBb0IsdUVBQU51SSxJQUFNO0NBQ3RDO0NBQUE7Q0FBQTtDQUFBO0NBQUE7O0NBQUE7Q0FBQTs7Q0FBQTtDQUFBO0NBQUEsb0NBQzhCO0NBQUEsa0JBQXRCdEMsTUFBc0IsdUVBQWIsS0FBS0EsTUFBUTs7Q0FBQSxzQ0FDRyxLQUFLMUMsV0FBTCxDQUFpQjtDQUM1Q2lGLDBCQUFVRixJQURrQztDQUU1Q0csMEJBQVV4QyxPQUFPd0M7Q0FGMkIsZUFBakIsQ0FESDtDQUFBLGtCQUNuQkQsUUFEbUIscUJBQ25CQSxRQURtQjtDQUFBLGtCQUNUQyxRQURTLHFCQUNUQSxRQURTOztDQU0xQixxQkFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsc0JBQU0sSUFBSXJILFdBQUosQ0FBZ0J3SSxRQUFoQixFQUEwQkMsUUFBMUI7Q0FBUCxlQUFqQixFQUE4RHBCLElBQXJFO0NBQ0Q7Q0FSSDs7Q0FBQTs7Q0FBQTtDQUFBLFVBQXFCZ0IsYUFBckI7Q0FBQTtDQVVEOzs7NEJBRWFDLE1BQU1yQyxRQUFRakcsYUFBYTtDQUN2QyxhQUFPLEtBQUtxSSxjQUFjSyxNQUFkLENBQXFCSixJQUFyQixFQUEyQnRJLFdBQTNCLENBQUwsRUFBOENpRyxNQUE5QyxDQUFQO0NBQ0Q7OzswQkFFV29CLE1BQW1CO0NBQUEsVUFBYnBCLE1BQWEsdUVBQUosRUFBSTtDQUM3QkEsYUFBTzBDLEtBQVAsR0FBZSxLQUFmO0NBRUEsVUFBTXpHLFlBQVksSUFBSW1HLGFBQUosQ0FBa0JwQyxNQUFsQixDQUFsQjtDQUVBL0QsZ0JBQVUwRSxNQUFWLEdBQW1CUyxJQUFuQjtDQUNBbkYsZ0JBQVUwRyxJQUFWO0NBRUEsYUFBTzFHLFNBQVA7Q0FDRDs7O0NBRUQseUJBQVkrRCxNQUFaLEVBQWtHO0NBQUE7O0NBQUEsUUFBOUVDLFFBQThFLHVFQUFuRW1DLGNBQWNuQyxRQUFxRDtDQUFBLFFBQTNDdEYsWUFBMkMsdUVBQTVCeUgsY0FBY3pILFlBQWM7O0NBQUE7O0NBQ2hHLHVGQUFNcUYsTUFBTixFQUFjQyxRQUFkLEVBQXdCdEYsWUFBeEI7O0NBRUEsUUFBSSxNQUFLcUYsTUFBTCxDQUFZMEMsS0FBaEIsRUFBdUI7Q0FDckIsVUFBTUEsUUFBUSxNQUFLQSxLQUFMLENBQVcsTUFBSzFDLE1BQWhCLENBQWQ7O0NBRUEsVUFBSSxDQUFDMEMsS0FBTCxFQUFZO0NBQ1YsY0FBTSxJQUFJNUcsa0JBQUosQ0FDSixlQURJLEVBRUosMkZBRkksc0RBQU47Q0FLRDs7Q0FFRCxVQUFJNEcsaUJBQWlCdk0sT0FBckIsRUFBOEI7Q0FDNUIsY0FBS29LLElBQUwsQ0FBVW1DLEtBQVY7O0NBRUEsY0FBS25DLElBQUwsQ0FBVSxJQUFJcEssT0FBSixDQUFZLG1CQUFXO0NBQy9CdU0sZ0JBQU1sQyxJQUFOLENBQVcsa0JBQVU7Q0FDbkIsa0JBQUtHLE1BQUwsR0FBY0EsTUFBZDs7Q0FDQSxrQkFBS2dDLElBQUwsR0FBWW5DLElBQVosQ0FBaUJvQyxPQUFqQjtDQUNELFdBSEQ7Q0FJRCxTQUxTLENBQVY7Q0FNRCxPQVRELE1BU087Q0FDTCxjQUFLakMsTUFBTCxHQUFjK0IsS0FBZDs7Q0FDQSxjQUFLbkMsSUFBTCxDQUFVLE1BQUtvQyxJQUFMLEVBQVY7Q0FDRDtDQUNGOztDQUVELFVBQUtFLFlBQUwsQ0FBa0IsZUFBbEI7O0NBN0JnRztDQThCakc7O0NBSUQ7Ozs7Ozs7Ozs7NkJBTVE7Q0FDTixZQUFNLElBQUkvRyxrQkFBSixDQUNKLGVBREksRUFFSiwwQ0FGSSxFQUdKLElBSEksQ0FBTjtDQUtEO0NBRUQ7Ozs7Ozs7Ozs7NEJBT087Q0FBQTs7Q0FDTCxhQUFPLElBQUkzRixPQUFKLENBQVksbUJBQVc7Q0FDNUI7Q0FDQTtDQUY0Qiw0QkFHZ0IsT0FBSzZKLE1BSHJCO0NBQUEsWUFHckI4QyxRQUhxQixpQkFHckJBLFFBSHFCO0NBQUEsWUFHWEMsUUFIVyxpQkFHWEEsUUFIVztDQUFBLFlBR0RDLEtBSEMsaUJBR0RBLEtBSEM7Q0FBQSxZQUdNQyxNQUhOLGlCQUdNQSxNQUhOOztDQUs1QixlQUFLSCxRQUFMLENBQWNsRCxHQUFkLENBQWtCa0QsU0FBU0ksQ0FBM0IsRUFBOEJKLFNBQVNLLENBQXZDLEVBQTBDTCxTQUFTTSxDQUFuRDs7Q0FDQSxlQUFLTCxRQUFMLENBQWNuRCxHQUFkLENBQWtCbUQsU0FBU0csQ0FBM0IsRUFBOEJILFNBQVNJLENBQXZDLEVBQTBDSixTQUFTSyxDQUFuRDs7Q0FDQSxlQUFLSixLQUFMLENBQVdwRCxHQUFYLENBQWVvRCxNQUFNRSxDQUFyQixFQUF3QkYsTUFBTUcsQ0FBOUIsRUFBaUNILE1BQU1JLENBQXZDOztDQUVBLGVBQUt6QyxNQUFMLENBQVkwQyxVQUFaLEdBQXlCSixPQUFPSyxJQUFoQztDQUNBLGVBQUszQyxNQUFMLENBQVk0QyxhQUFaLEdBQTRCTixPQUFPTyxPQUFuQzs7Q0FFQSxlQUFLbEcsV0FBTCxDQUFpQjtDQUFDbUcsa0JBQVE7Q0FBVCxTQUFqQjs7Q0FFQWIsZ0JBQVEsTUFBUixFQWQ0QjtDQWdCN0IsT0FoQk0sQ0FBUDtDQWlCRDs7Q0FJRDs7Ozs7Ozs7Ozs2QkFPS3pGLFFBQVE7Q0FBQTs7Q0FDWCx1RkFBa0JBLE1BQWxCLEVBQTBCLFlBQU07Q0FDOUIsZUFBSzJGLFFBQUwsQ0FBY3JDLElBQWQsQ0FBbUJ0RCxPQUFPMkYsUUFBMUI7O0NBQ0EsZUFBS0MsUUFBTCxDQUFjdEMsSUFBZCxDQUFtQnRELE9BQU80RixRQUExQjs7Q0FDQSxlQUFLVyxVQUFMLENBQWdCakQsSUFBaEIsQ0FBcUJ0RCxPQUFPdUcsVUFBNUI7Q0FDRCxPQUpEO0NBS0Q7Q0FFRDs7Ozs7Ozs7OzsyQkFPTW5CLFVBQVVDLFVBQVU7Q0FDeEIsVUFBTW1CLE9BQU8sSUFBSSxLQUFLNUosV0FBVCxDQUFxQjtDQUFDMkksZUFBTztDQUFSLE9BQXJCLEVBQXFDakMsSUFBckMsQ0FBMEMsSUFBMUMsQ0FBYjtDQUVBLFVBQUk4QixRQUFKLEVBQWNvQixLQUFLcEIsUUFBTCxHQUFnQm9CLEtBQUtwQixRQUFMLENBQWMzQixLQUFkLEVBQWhCO0NBQ2QsVUFBSTRCLFFBQUosRUFBY21CLEtBQUtuQixRQUFMLEdBQWdCbUIsS0FBS25CLFFBQUwsQ0FBYzVCLEtBQWQsRUFBaEI7Q0FFZCxhQUFPK0MsSUFBUDtDQUNEOzs7Ozs7R0EvTHlCNUQ7O21DQUF0QnFDLDRDQXNCQ3JDLFVBQVVFO0NBRWJ5QyxTQUFPO0NBQ1BILFlBQVU7Q0FDVkMsWUFBVTtDQUVWUyxVQUFRO0NBQ05LLFVBQU0sSUFEQTtDQUVORSxhQUFTO0NBRkg7Q0FLUlYsWUFBVTtDQUFDSSxPQUFHLENBQUo7Q0FBT0MsT0FBRyxDQUFWO0NBQWFDLE9BQUc7Q0FBaEI7Q0FDVkwsWUFBVTtDQUFDRyxPQUFHLENBQUo7Q0FBT0MsT0FBRyxDQUFWO0NBQWFDLE9BQUc7Q0FBaEI7Q0FDVkosU0FBTztDQUFDRSxPQUFHLENBQUo7Q0FBT0MsT0FBRyxDQUFWO0NBQWFDLE9BQUc7Q0FBaEI7c0JBY2E7Q0FDcEJOLFlBQVUsQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsQ0FEVTtDQUVwQkMsWUFBVSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxDQUZVO0NBR3BCQyxTQUFPLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYO0NBSGE7Ozs7Q0MzRHhCOzs7Ozs7OztDQVFNWSwyQkFYTHRDLFdBQ0NiLEtBQUssVUFBTCxFQUFpQixVQUFqQixFQUE2QixZQUE3QixFQUEyQyxRQUEzQyxDQUREOzs7Ozs7Q0FZQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBbUVBOzs7Ozs7Ozs7OzBCQWVZb0QsT0FBdUM7Q0FBQSxVQUFoQzdELE1BQWdDLHVFQUF2QixFQUF1QjtDQUFBLFVBQW5COEQsVUFBbUIsdUVBQU4sSUFBTTtDQUNqRDlELGFBQU8wQyxLQUFQLEdBQWUsS0FBZjtDQUVBLFVBQU16RyxZQUFZLElBQUkySCxjQUFKLENBQW1CNUQsTUFBbkIsQ0FBbEI7Q0FFQS9ELGdCQUFVMEUsTUFBVixHQUFtQmtELEtBQW5CO0NBQ0E1SCxnQkFBVTBHLElBQVY7Q0FDQSxVQUFJbUIsVUFBSixFQUFnQjdILFVBQVU2SCxVQUFWO0NBRWhCLGFBQU83SCxTQUFQO0NBQ0Q7OztDQUVELDBCQUFZK0QsTUFBWixFQUFvRztDQUFBOztDQUFBLFFBQWhGQyxRQUFnRix1RUFBckUyRCxlQUFlM0QsUUFBc0Q7Q0FBQSxRQUE1Q3RGLFlBQTRDLHVFQUE3QmlKLGVBQWVqSixZQUFjOztDQUFBOztDQUNsRyx3RkFBTXFGLE1BQU4sRUFBY0MsUUFBZCxFQUF3QnRGLFlBQXhCOztDQUVBLFFBQUksTUFBS3FGLE1BQUwsQ0FBWTBDLEtBQWhCLEVBQXVCO0NBQ3JCLFVBQU1BLFFBQVEsTUFBS0EsS0FBTCxDQUFXLE1BQUsxQyxNQUFoQixDQUFkOztDQUVBLFVBQUksQ0FBQzBDLEtBQUwsRUFBWTtDQUNWLGNBQU0sSUFBSTVHLGtCQUFKLENBQ0osZ0JBREksRUFFSiwyRkFGSSxzREFBTjtDQUtEOztDQUVELFVBQUk0RyxpQkFBaUJ2TSxPQUFyQixFQUE4QjtDQUM1QnVNLGNBQU1sQyxJQUFOLENBQVcsa0JBQVU7Q0FDbkIsZ0JBQUtHLE1BQUwsR0FBY0EsTUFBZDtDQUNELFNBRkQ7Q0FHRCxPQUpELE1BSU8sTUFBS0EsTUFBTCxHQUFjK0IsS0FBZDs7Q0FFUCxZQUFLbkMsSUFBTCxDQUFVLE1BQUtvQyxJQUFMLEVBQVY7Q0FDRDs7Q0FFRCxVQUFLRSxZQUFMLENBQWtCLGVBQWxCOztDQXZCa0c7Q0F3Qm5HOztDQUlEOzs7Ozs7Ozs7Ozs2QkFPUTtDQUNOLFlBQU0sSUFBSS9HLGtCQUFKLENBQ0osZUFESSxFQUVKLDBDQUZJLEVBR0osSUFISSxDQUFOO0NBS0Q7Q0FFRDs7Ozs7Ozs7Ozs0QkFPTztDQUFBOztDQUNMLGFBQU8sSUFBSTNGLE9BQUosQ0FBWSxtQkFBVztDQUM1QixlQUFLNE4sS0FBTCxDQUFXLFlBQU07Q0FBQSw4QkFDYyxPQUFLL0QsTUFEbkI7Q0FBQSxjQUNSOEMsUUFEUSxpQkFDUkEsUUFEUTtDQUFBLGNBQ0VDLFFBREYsaUJBQ0VBLFFBREY7O0NBR2YsaUJBQUtELFFBQUwsQ0FBY2xELEdBQWQsQ0FBa0JrRCxTQUFTSSxDQUEzQixFQUE4QkosU0FBU0ssQ0FBdkMsRUFBMENMLFNBQVNNLENBQW5EOztDQUNBLGlCQUFLTCxRQUFMLENBQWNuRCxHQUFkLENBQWtCbUQsU0FBU0csQ0FBM0IsRUFBOEJILFNBQVNJLENBQXZDLEVBQTBDSixTQUFTSyxDQUFuRDs7Q0FFQSxpQkFBSzlGLFdBQUwsQ0FBaUI7Q0FBQ21HLG9CQUFRO0NBQVQsV0FBakI7O0NBRUFiLGtCQUFRLE1BQVI7Q0FDRCxTQVREO0NBVUQsT0FYTSxDQUFQO0NBWUQ7Q0FFRDs7Ozs7Ozs7O2tDQU1hO0NBQUEsVUFDSmpDLE1BREksR0FDd0IsSUFEeEIsQ0FDSkEsTUFESTtDQUFBLFVBQ2FzQyxNQURiLEdBQ3dCLElBRHhCLENBQ0lqRCxNQURKLENBQ2FpRCxNQURiO0NBR1h0QyxhQUFPMEMsVUFBUCxHQUFvQkosT0FBT0ssSUFBM0I7Q0FDQTNDLGFBQU9zQyxNQUFQLENBQWNlLE9BQWQsQ0FBc0JDLEtBQXRCLEdBQThCaEIsT0FBT2UsT0FBUCxDQUFlQyxLQUE3QztDQUNBdEQsYUFBT3NDLE1BQVAsQ0FBY2UsT0FBZCxDQUFzQkUsTUFBdEIsR0FBK0JqQixPQUFPZSxPQUFQLENBQWVFLE1BQTlDO0NBQ0F2RCxhQUFPc0MsTUFBUCxDQUFja0IsSUFBZCxHQUFxQmxCLE9BQU9rQixJQUE1QjtDQUNBeEQsYUFBT3NDLE1BQVAsQ0FBY21CLE1BQWQsR0FBdUJuQixPQUFPbUIsTUFBOUI7Q0FFQSxVQUFNQyxlQUFlMUQsT0FBT3NDLE1BQVAsQ0FBY3FCLE1BQW5DO0NBVFcsVUFVSkEsTUFWSSxHQVVNckIsTUFWTixDQVVKcUIsTUFWSTtDQVlYRCxtQkFBYUUsSUFBYixHQUFvQkQsT0FBT0MsSUFBM0I7Q0FDQUYsbUJBQWFHLEdBQWIsR0FBbUJGLE9BQU9FLEdBQTFCO0NBQ0FILG1CQUFhSSxHQUFiLEdBQW1CSCxPQUFPRyxHQUExQjtDQUVBSixtQkFBYUssSUFBYixHQUFvQkosT0FBT0ksSUFBM0I7Q0FDQUwsbUJBQWFNLEtBQWIsR0FBcUJMLE9BQU9LLEtBQTVCO0NBQ0FOLG1CQUFhTyxHQUFiLEdBQW1CTixPQUFPTSxHQUExQjtDQUNBUCxtQkFBYVEsTUFBYixHQUFzQlAsT0FBT08sTUFBN0I7Q0FDRDs7Q0FJRDs7Ozs7Ozs7Ozs2QkFPSzFILFFBQVE7Q0FBQTs7Q0FDWCx3RkFBa0JBLE1BQWxCLEVBQTBCLFlBQU07Q0FDOUIsWUFBSSxPQUFLcUUsTUFBVCxFQUFpQixPQUFLQSxNQUFMLENBQVlmLElBQVosQ0FBaUJ0RCxPQUFPcUUsTUFBUCxFQUFqQjs7Q0FFakIsZUFBS3NCLFFBQUwsQ0FBY3JDLElBQWQsQ0FBbUJ0RCxPQUFPMkYsUUFBMUI7O0NBQ0EsZUFBS0MsUUFBTCxDQUFjdEMsSUFBZCxDQUFtQnRELE9BQU80RixRQUExQjs7Q0FDQSxlQUFLVyxVQUFMLENBQWdCakQsSUFBaEIsQ0FBcUJ0RCxPQUFPdUcsVUFBNUI7Q0FDRCxPQU5EO0NBT0Q7Q0FFRDs7Ozs7Ozs7Ozs2QkFPUTtDQUNOLGFBQU8sSUFBSSxLQUFLM0osV0FBVCxDQUFxQjtDQUFDMkksZUFBTztDQUFSLE9BQXJCLEVBQXFDakMsSUFBckMsQ0FBMEMsSUFBMUMsQ0FBUDtDQUNEOzs7Ozs7R0F4TjBCVjs7bUNBQXZCNkQsNkNBcUNDN0QsVUFBVUU7Q0FFYnlDLFNBQU87Q0FFUE8sVUFBUTtDQUNOSyxVQUFNLElBREE7Q0FHTmEsVUFBTSxDQUhBO0NBSU5DLFlBQVEsQ0FKRjtDQU1OSixhQUFTO0NBQ1BDLGFBQU8sSUFEQTtDQUVQQyxjQUFRO0NBRkQsS0FOSDtDQVdOSSxZQUFRO0NBQ05DLFlBQU0sSUFEQTtDQUVOQyxXQUFLLEdBRkM7Q0FHTkMsV0FBSyxFQUhDO0NBS05HLFdBQUssR0FMQztDQU1OQyxjQUFRLENBQUMsR0FOSDtDQU9OSCxZQUFNLENBQUMsR0FQRDtDQVFOQyxhQUFPO0NBUkQ7Q0FYRjtDQXVCUjdCLFlBQVU7Q0FBQ0ksT0FBRyxDQUFKO0NBQU9DLE9BQUcsQ0FBVjtDQUFhQyxPQUFHO0NBQWhCO0NBQ1ZMLFlBQVU7Q0FBQ0csT0FBRyxDQUFKO0NBQU9DLE9BQUcsQ0FBVjtDQUFhQyxPQUFHO0NBQWhCO3NCQWFVO0NBQ3BCTixZQUFVLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLENBRFU7Q0FFcEJDLFlBQVUsQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVg7Q0FGVTs7OztDQ3RGeEI7Ozs7Ozs7O0NBUU0rQiw0QkFYTHhELFdBQ0NiLEtBQUssVUFBTCxFQUFpQixVQUFqQixFQUE2QixZQUE3QixFQUEyQyxRQUEzQyxDQUREOzs7Ozs7Q0FZQzs7Ozs7Ozs7Ozs7OztDQXFCQTs7Ozs7Ozs7Ozs7MEJBaUJZNkQsUUFBcUI7Q0FBQSxVQUFidEUsTUFBYSx1RUFBSixFQUFJO0NBQy9CQSxhQUFPMEMsS0FBUCxHQUFlLEtBQWY7Q0FFQSxVQUFNekcsWUFBWSxJQUFJNkksZUFBSixDQUFvQjlFLE1BQXBCLENBQWxCO0NBRUEvRCxnQkFBVTBFLE1BQVYsR0FBbUIyRCxNQUFuQjtDQUNBckksZ0JBQVUwRyxJQUFWO0NBRUEsYUFBTzFHLFNBQVA7Q0FDRDs7O0NBRUQsMkJBQVkrRCxNQUFaLEVBQXNHO0NBQUE7O0NBQUEsUUFBbEZDLFFBQWtGLHVFQUF2RTZFLGdCQUFnQjdFLFFBQXVEO0NBQUEsUUFBN0N0RixZQUE2Qyx1RUFBOUJtSyxnQkFBZ0JuSyxZQUFjOztDQUFBOztDQUNwRyx5RkFBTXFGLE1BQU4sRUFBY0MsUUFBZCxFQUF3QnRGLFlBQXhCOztDQUVBLFFBQUksTUFBS3FGLE1BQUwsQ0FBWTBDLEtBQWhCLEVBQXVCO0NBQ3JCLFVBQU1BLFFBQVEsTUFBS0EsS0FBTCxDQUFXLE1BQUsxQyxNQUFoQixDQUFkOztDQUVBLFVBQUksQ0FBQzBDLEtBQUwsRUFBWTtDQUNWLGNBQU0sSUFBSTVHLGtCQUFKLENBQ0osaUJBREksRUFFSiwyRkFGSSxzREFBTjtDQUtEOztDQUVELFVBQUk0RyxpQkFBaUJ2TSxPQUFyQixFQUE4QjtDQUM1QnVNLGNBQU1sQyxJQUFOLENBQVcsa0JBQVU7Q0FDbkIsZ0JBQUtHLE1BQUwsR0FBY0EsTUFBZDtDQUNELFNBRkQ7Q0FHRCxPQUpELE1BSU8sTUFBS0EsTUFBTCxHQUFjK0IsS0FBZDs7Q0FFUCxZQUFLbkMsSUFBTCxDQUFVLE1BQUtvQyxJQUFMLEVBQVY7Q0FDRDs7Q0FFRCxVQUFLRSxZQUFMLENBQWtCLGVBQWxCOztDQXZCb0c7Q0F3QnJHOztDQUlEOzs7Ozs7Ozs7Ozs2QkFPUTtDQUNOLFlBQU0sSUFBSS9HLGtCQUFKLENBQ0osaUJBREksRUFFSiwwQ0FGSSxFQUdKLElBSEksQ0FBTjtDQUtEO0NBRUQ7Ozs7Ozs7Ozs7NEJBT087Q0FBQTs7Q0FDTCxhQUFPLElBQUkzRixPQUFKLENBQVksbUJBQVc7Q0FDNUIsZUFBSzROLEtBQUwsQ0FBVyxZQUFNO0NBQ2YsaUJBQUtqQixRQUFMLENBQWNsRCxHQUFkLENBQWtCLE9BQUtJLE1BQUwsQ0FBWThDLFFBQVosQ0FBcUJJLENBQXZDLEVBQTBDLE9BQUtsRCxNQUFMLENBQVk4QyxRQUFaLENBQXFCSyxDQUEvRCxFQUFrRSxPQUFLbkQsTUFBTCxDQUFZOEMsUUFBWixDQUFxQk0sQ0FBdkY7O0NBQ0EsaUJBQUtMLFFBQUwsQ0FBY25ELEdBQWQsQ0FBa0IsT0FBS0ksTUFBTCxDQUFZK0MsUUFBWixDQUFxQkcsQ0FBdkMsRUFBMEMsT0FBS2xELE1BQUwsQ0FBWStDLFFBQVosQ0FBcUJJLENBQS9ELEVBQWtFLE9BQUtuRCxNQUFMLENBQVkrQyxRQUFaLENBQXFCSyxDQUF2Rjs7Q0FFQSxpQkFBSzlGLFdBQUwsQ0FBaUI7Q0FBQ21HLG9CQUFRO0NBQVQsV0FBakI7O0NBRUFiLGtCQUFRLE1BQVI7Q0FDRCxTQVBEO0NBUUQsT0FUTSxDQUFQO0NBVUQ7Q0FFRDs7Ozs7Ozs7Ozs2QkFPS3pGLFFBQVE7Q0FBQTs7Q0FDWCx5RkFBa0JBLE1BQWxCLEVBQTBCLFlBQU07Q0FDOUIsWUFBSSxPQUFLcUUsTUFBVCxFQUFpQixPQUFLQSxNQUFMLENBQVlmLElBQVosQ0FBaUJ0RCxPQUFPcUUsTUFBUCxFQUFqQjs7Q0FFakIsZUFBS3NCLFFBQUwsQ0FBY3JDLElBQWQsQ0FBbUJ0RCxPQUFPMkYsUUFBMUI7O0NBQ0EsZUFBS0MsUUFBTCxDQUFjdEMsSUFBZCxDQUFtQnRELE9BQU80RixRQUExQjs7Q0FDQSxlQUFLVyxVQUFMLENBQWdCakQsSUFBaEIsQ0FBcUJ0RCxPQUFPdUcsVUFBNUI7Q0FDRCxPQU5EO0NBT0Q7Q0FFRDs7Ozs7Ozs7Ozs2QkFPUTtDQUNOLGFBQU8sSUFBSSxLQUFLM0osV0FBVCxDQUFxQjtDQUFDMkksZUFBTztDQUFSLE9BQXJCLEVBQXFDakMsSUFBckMsQ0FBMEMsSUFBMUMsQ0FBUDtDQUNEOzs7Ozs7R0EzSTJCVjs7bUNBQXhCK0UsOENBY0MvRSxVQUFVRTtDQUVieUMsU0FBTztDQUVQSSxZQUFVO0NBQUNJLE9BQUcsQ0FBSjtDQUFPQyxPQUFHLENBQVY7Q0FBYUMsT0FBRztDQUFoQjtDQUNWTCxZQUFVO0NBQUNHLE9BQUcsQ0FBSjtDQUFPQyxPQUFHLENBQVY7Q0FBYUMsT0FBRztDQUFoQjtzQkFjVTtDQUNwQk4sWUFBVSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxDQURVO0NBRXBCQyxZQUFVLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLENBRlU7Q0FHcEJDLFNBQU8sQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVg7Q0FIYTs7OztDQ2pEakIsSUFBTStCLFNBQVM7Q0FDcEJDLFVBQVEsT0FBT0EsTUFBUCxLQUFrQixXQUFsQixHQUFnQ25SLE1BQWhDLEdBQXlDbVI7Q0FEN0IsQ0FBZjs7Q0NLUDs7Ozs7Ozs7O0tBUU1DOzs7Q0FDSjs7Ozs7O0NBT0E7Ozs7OztDQVFBLGlCQUEwQjtDQUFBOztDQUFBLFFBQWQ3SCxPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3hCYixZQUFRMkksR0FBUixtQkFBdUJDLE9BQXZCO0NBRUE7O0NBSHdCLHNHQVZoQixJQVVnQixZQUZsQixFQUVrQjs7Q0FJeEIsVUFBS25ILE9BQUwsR0FBZSxJQUFJVyxhQUFKLHFEQUFmO0NBQ0EsVUFBS3ZCLE9BQUwsR0FBZUEsT0FBZjs7Q0FFQSxVQUFLOEMsZ0JBQUw7O0NBUHdCO0NBUXpCOztDQUlEOzs7Ozs7Ozs7NkJBS1E7Q0FBQTs7Q0FDTixVQUFNa0YsbUJBQW9CLFlBQU07Q0FDOUIsZUFBT0wsT0FBT0MsTUFBUCxDQUFjSyxxQkFBZCxJQUNGTixPQUFPQyxNQUFQLENBQWNNLDJCQURaLElBRUZQLE9BQU9DLE1BQVAsQ0FBY08sd0JBRlosSUFHRixVQUFVN0YsUUFBVixFQUFvQjtDQUNyQnFGLGlCQUFPQyxNQUFQLENBQWNRLFVBQWQsQ0FBeUI5RixRQUF6QixFQUFtQyxPQUFPLEVBQTFDO0NBQ0QsU0FMSDtDQU1ELE9BUHdCLEVBQXpCOztDQVNBLFVBQU14SixVQUFVLFNBQVZBLE9BQVUsR0FBTTtDQUNwQixlQUFLdVAsT0FBTCxHQUFlTCxpQkFBaUI7Q0FBQSxpQkFBTWxQLFNBQU47Q0FBQSxTQUFqQixDQUFmO0NBQ0EsWUFBSSxDQUFDLE9BQUt3UCxPQUFWLEVBQW1COztDQUVuQixhQUFLLElBQUlwTCxJQUFJLENBQVIsRUFBV3FMLEtBQUssT0FBS0MsS0FBTCxDQUFXcEwsTUFBaEMsRUFBd0NGLElBQUlxTCxFQUE1QyxFQUFnRHJMLEdBQWhELEVBQXFEO0NBQ25ELGNBQU11TCxJQUFJLE9BQUtELEtBQUwsQ0FBV3RMLENBQVgsQ0FBVjtDQUNBLGNBQUl1TCxFQUFFSCxPQUFOLEVBQWVHLEVBQUVDLE9BQUYsQ0FBVUQsRUFBRUUsS0FBWjtDQUNoQjtDQUNGLE9BUkQ7O0NBVUEsV0FBS0wsT0FBTCxHQUFlLElBQWY7Q0FFQSxVQUFJLENBQUMsS0FBS0QsT0FBVixFQUNFdlA7Q0FDSDtDQUVEOzs7Ozs7Ozs0QkFLTztDQUNMLFdBQUt3UCxPQUFMLEdBQWUsS0FBZjtDQUNEO0NBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBZ0JRTSxNQUFNO0NBQUE7O0NBQ1osYUFBTyxJQUFJN1AsT0FBSixDQUFZLG1CQUFXO0NBQzVCLGVBQUt5UCxLQUFMLENBQVc3SCxJQUFYLENBQWdCaUksSUFBaEI7O0NBQ0FwRCxnQkFBUW9ELElBQVI7Q0FDRCxPQUhNLENBQVA7Q0FJRDtDQUVEOzs7Ozs7Ozs7O2dDQU9XQSxNQUFNO0NBQUE7O0NBQ2YsYUFBTyxJQUFJN1AsT0FBSixDQUFZLG1CQUFXO0NBQzVCLFlBQU04UCxRQUFRLE9BQUtMLEtBQUwsQ0FBV3hILE9BQVgsQ0FBbUI0SCxJQUFuQixDQUFkOztDQUNBLFlBQUlDLFVBQVUsQ0FBQyxDQUFmLEVBQWtCLE9BQUtMLEtBQUwsQ0FBV3ZKLE1BQVgsQ0FBa0I0SixLQUFsQixFQUF5QixDQUF6QjtDQUVsQnJELGdCQUFRb0QsSUFBUjtDQUNELE9BTE0sQ0FBUDtDQU1EOzs7eUJBRUdwTCxLQUFLO0NBQ1AsYUFBTyxLQUFLb0QsT0FBTCxDQUFhTyxHQUFiLENBQWlCM0QsR0FBakIsQ0FBUDtDQUNEOzs7eUJBRUdBLEtBQUs7Q0FDUCxhQUFPLEtBQUtvRCxPQUFMLENBQWE4QixHQUFiLENBQWlCbEYsR0FBakIsQ0FBUDtDQUNEOzs7Ozs7R0FqSGVzQzs7Q0NYbEI7Ozs7Ozs7O0tBT01nSjs7O0NBQ0osZ0JBQVlySSxJQUFaLEVBQW1DO0NBQUEsUUFBakJzSSxRQUFpQix1RUFBTixJQUFNOztDQUFBOztDQUNqQyxTQUFLdEksSUFBTCxHQUFZQSxJQUFaO0NBQ0EsU0FBS2tJLEtBQUwsR0FBYUksV0FBVyxJQUFJQyxLQUFKLEVBQVgsR0FBeUIsSUFBdEM7Q0FDQSxTQUFLVixPQUFMLEdBQWUsS0FBZjtDQUNEOztDQUlEOzs7Ozs7Ozs7OzsyQkFPTVcsT0FBTztDQUNYLFVBQUksS0FBS1gsT0FBVCxFQUFrQjtDQUVsQixVQUFJVyxLQUFKLEVBQVdBLE1BQU1DLE9BQU4sQ0FBYyxJQUFkO0NBRVgsVUFBSSxLQUFLUCxLQUFULEVBQWdCLEtBQUtBLEtBQUwsQ0FBV1EsS0FBWDtDQUNoQixXQUFLYixPQUFMLEdBQWUsSUFBZjtDQUNEO0NBRUQ7Ozs7Ozs7Ozs7MEJBT0tXLE9BQU87Q0FDVixVQUFJLENBQUMsS0FBS1gsT0FBVixFQUFtQjtDQUVuQixVQUFJLEtBQUtLLEtBQVQsRUFBZ0IsS0FBS0EsS0FBTCxDQUFXUyxJQUFYO0NBQ2hCLFdBQUtkLE9BQUwsR0FBZSxLQUFmO0NBRUEsVUFBSVcsS0FBSixFQUFXQSxNQUFNSSxVQUFOLENBQWlCLElBQWpCO0NBQ1o7O0NBSUQ7Ozs7Ozs7Ozs7K0JBT1U7Q0FDUixhQUFPLEtBQUs1SSxJQUFMLENBQVUsS0FBS2tJLEtBQWYsQ0FBUDtDQUNEOzs7Ozs7Q0M3REg7O0NDR0E7Ozs7Ozs7Ozs7Ozs7Ozs7S0FlTVc7OztDQVFKLDZCQUF5QjtDQUFBLFFBQWIxRyxNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQUEsd0ZBQ2pCQSxNQURpQixFQUNUMEcsZ0JBQWF6RyxRQURKO0NBRXhCOzs7OzZCQUVrQjtDQUFBLFVBQWJELE1BQWEsdUVBQUosRUFBSTtDQUNqQixhQUFPLEtBQUsxQyxXQUFMLENBQWlCO0NBQUN1RyxlQUFPLElBQUk4QyxZQUFKLENBQzlCM0csT0FBTzRHLEtBRHVCLEVBRTlCNUcsT0FBTzZHLFNBRnVCO0NBQVIsT0FBakIsRUFHSGhELEtBSEo7Q0FJRDs7Ozs7O0dBakJ3QkQ7O2tCQUFyQjhDLDZDQUVDOUMsZUFBZTNEO0NBRWxCMkcsU0FBTztDQUNQQyxhQUFXOzs7Q0NwQmY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQk1DOzs7Q0FRSixpQ0FBeUI7Q0FBQTs7Q0FBQSxRQUFiOUcsTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2Qiw2RkFBTUEsTUFBTixFQUFjOEcsb0JBQWlCN0csUUFBL0I7O0NBQ0EsVUFBSzZELFVBQUw7O0NBRnVCO0NBR3hCOzs7OzZCQUVrQjtDQUFBLFVBQWI5RCxNQUFhLHVFQUFKLEVBQUk7Q0FDakIsYUFBTyxLQUFLMUMsV0FBTCxDQUFpQjtDQUFDdUcsZUFBTyxJQUFJa0QsZ0JBQUosQ0FDOUIvRyxPQUFPNEcsS0FEdUIsRUFFOUI1RyxPQUFPNkcsU0FGdUI7Q0FBUixPQUFqQixFQUdIaEQsS0FISjtDQUlEOzs7Ozs7R0FsQjRCRDs7a0JBQXpCa0QsaURBRUNsRCxlQUFlM0Q7Q0FFbEIyRyxTQUFPO0NBQ1BDLGFBQVc7OztDQ3ZCZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaUJNRzs7O0NBU0osZ0NBQXlCO0NBQUEsUUFBYmhILE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FBQSwyRkFDakJBLE1BRGlCLEVBQ1RnSCxtQkFBZ0IvRyxRQURQO0NBRXhCOzs7OzZCQUVrQjtDQUFBLFVBQWJELE1BQWEsdUVBQUosRUFBSTtDQUNqQixhQUFPLEtBQUsxQyxXQUFMLENBQWlCO0NBQUN1RyxlQUFPLElBQUlvRCxlQUFKLENBQzlCakgsT0FBT2tILFFBRHVCLEVBRTlCbEgsT0FBT21ILFdBRnVCLEVBRzlCbkgsT0FBTzZHLFNBSHVCO0NBQVIsT0FBakIsRUFJSGhELEtBSko7Q0FLRDs7Ozs7O0dBbkIyQkQ7O2tCQUF4Qm9ELGdEQUVDcEQsZUFBZTNEO0NBRWxCaUgsWUFBVTtDQUNWQyxlQUFhO0NBQ2JOLGFBQVc7OztDQ3ZCZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaUJNTzs7O0NBVUosMkJBQXlCO0NBQUE7O0NBQUEsUUFBYnBILE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIsdUZBQU1BLE1BQU4sRUFBY29ILGNBQVduSCxRQUF6Qjs7Q0FDQSxVQUFLNkQsVUFBTDs7Q0FGdUI7Q0FHeEI7Ozs7NkJBRWtCO0NBQUEsVUFBYjlELE1BQWEsdUVBQUosRUFBSTtDQUNqQixhQUFPLEtBQUsxQyxXQUFMLENBQWlCO0NBQUN1RyxlQUFPLElBQUl3RCxVQUFKLENBQzlCckgsT0FBTzRHLEtBRHVCLEVBRTlCNUcsT0FBTzZHLFNBRnVCLEVBRzlCN0csT0FBT3NILFFBSHVCLEVBSTlCdEgsT0FBT3VILEtBSnVCO0NBQVIsT0FBakIsRUFLSDFELEtBTEo7Q0FNRDs7Ozs7O0dBdEJzQkQ7O2tCQUFuQndELDJDQUVDeEQsZUFBZTNEO0NBRWxCMkcsU0FBTztDQUNQQyxhQUFXO0NBQ1hTLFlBQVU7Q0FDVkMsU0FBTzs7O0NDeEJYOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FvQk1DOzs7Q0FZSiwwQkFBeUI7Q0FBQTs7Q0FBQSxRQUFieEgsTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2QixzRkFBTUEsTUFBTixFQUFjd0gsYUFBVXZILFFBQXhCOztDQUNBLFVBQUs2RCxVQUFMOztDQUZ1QjtDQUd4Qjs7Ozs2QkFFa0I7Q0FBQSxVQUFiOUQsTUFBYSx1RUFBSixFQUFJO0NBQ2pCLGFBQU8sS0FBSzFDLFdBQUwsQ0FBaUI7Q0FBQ3VHLGVBQU8sSUFBSTRELFNBQUosQ0FDOUJ6SCxPQUFPNEcsS0FEdUIsRUFFOUI1RyxPQUFPNkcsU0FGdUIsRUFHOUI3RyxPQUFPc0gsUUFIdUIsRUFJOUJ0SCxPQUFPMEgsS0FKdUIsRUFLOUIxSCxPQUFPMkgsUUFMdUIsRUFNOUIzSCxPQUFPdUgsS0FOdUI7Q0FBUixPQUFqQixFQU9IMUQsS0FQSjtDQVFEOzs7Ozs7R0ExQnFCRDs7a0JBQWxCNEQsMENBRUM1RCxlQUFlM0Q7Q0FFbEIyRyxTQUFPO0NBQ1BDLGFBQVc7Q0FDWFMsWUFBVTtDQUNWSSxTQUFPRSxLQUFLQyxFQUFMLEdBQVU7Q0FDakJGLFlBQVU7Q0FDVkosU0FBTzs7O0tDN0JMTzs7O0NBVUosdUJBQXlCO0NBQUEsUUFBYjlILE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FBQSxrRkFDakJBLE1BRGlCLEVBQ1Q4SCxVQUFVN0gsUUFERDtDQUV4Qjs7Ozs2QkFFa0I7Q0FBQSxVQUFiRCxNQUFhLHVFQUFKLEVBQUk7Q0FDakIsYUFBTyxLQUFLMUMsV0FBTCxDQUFpQjtDQUFDdUcsZUFBTyxJQUFJa0UsYUFBSixDQUM5Qi9ILE9BQU80RyxLQUR1QixFQUU5QjVHLE9BQU82RyxTQUZ1QixFQUc5QjdHLE9BQU9pRSxLQUh1QixFQUk5QmpFLE9BQU9rRSxNQUp1QjtDQUFSLE9BQWpCLEVBS0hMLEtBTEo7Q0FNRDs7Ozs7O0dBckJxQkQ7O2tCQUFsQmtFLHdDQUVDbEUsZUFBZTNEO0NBRWxCMkcsU0FBTztDQUNQQyxhQUFXO0NBQ1g1QyxTQUFPO0NBQ1BDLFVBQVE7OztDQ1ZaOztDQ0dBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXNCTThEOzs7Q0FFSjs7Ozs7Ozs7Ozs7OztDQXFCQSwyQkFBeUI7Q0FBQSxRQUFiaEksTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUFBLHNGQUNqQkEsTUFEaUIsRUFDVGdJLGNBQVcvSCxRQURGO0NBRXhCOzs7OzZCQUVrQjtDQUFBLFVBQWJELE1BQWEsdUVBQUosRUFBSTtDQUNqQixhQUFPLEtBQUsxQyxXQUFMLENBQWlCO0NBQUNnSCxnQkFBUSxJQUFJMkQsVUFBSixDQUMvQmpJLE9BQU91RSxJQUR3QixFQUUvQnZFLE9BQU93RSxHQUZ3QixFQUcvQnhFLE9BQU9rSSxjQUh3QjtDQUFULE9BQWpCLEVBSUg1RCxNQUpKO0NBS0Q7Ozs7OztHQWpDc0JROztrQkFBbkJrRCwyQ0FnQkNsRCxnQkFBZ0I3RTtDQUVuQnNFLFFBQU07Q0FDTkMsT0FBSztDQUNMMEQsa0JBQWdCOzs7Q0N6Q3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FvQk1DOzs7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Q0F5QkEsbUNBQXlCO0NBQUEsUUFBYm5JLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FBQSw4RkFDakJBLE1BRGlCLEVBQ1RtSSxzQkFBbUJsSSxRQURWO0NBRXhCOzs7OzZCQUVrQjtDQUFBLFVBQWJELE1BQWEsdUVBQUosRUFBSTtDQUNqQixhQUFPLEtBQUsxQyxXQUFMLENBQWlCO0NBQUNnSCxnQkFBUSxJQUFJOEQsa0JBQUosQ0FDL0JwSSxPQUFPMEUsSUFEd0IsRUFFL0IxRSxPQUFPMkUsS0FGd0IsRUFHL0IzRSxPQUFPNEUsR0FId0IsRUFJL0I1RSxPQUFPNkUsTUFKd0IsRUFLL0I3RSxPQUFPdUUsSUFMd0IsRUFNL0J2RSxPQUFPd0UsR0FOd0I7Q0FBVCxPQUFqQixFQU9IRixNQVBKO0NBUUQ7Ozs7OztHQXZDOEJROztrQkFBM0JxRCxtREFnQkNyRCxnQkFBZ0I3RTtDQUVuQnNFLFFBQU07Q0FDTkMsT0FBSztDQUNMRSxRQUFNSyxPQUFPQyxNQUFQLENBQWNxRCxVQUFkLEdBQTJCLENBQUM7Q0FDbEMxRCxTQUFPSSxPQUFPQyxNQUFQLENBQWNxRCxVQUFkLEdBQTJCO0NBQ2xDekQsT0FBS0csT0FBT0MsTUFBUCxDQUFjc0QsV0FBZCxHQUE0QjtDQUNqQ3pELFVBQVFFLE9BQU9DLE1BQVAsQ0FBY3NELFdBQWQsR0FBNEIsQ0FBQzs7O0NDM0N6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXFCTUM7OztDQUNKOzs7Ozs7Ozs7Ozs7Q0FxQkEsa0NBQXlCO0NBQUEsUUFBYnZJLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FBQSw2RkFDakJBLE1BRGlCLEVBQ1R1SSxxQkFBa0J0SSxRQURUO0NBRXhCOzs7OzZCQUVrQjtDQUFBLFVBQWJELE1BQWEsdUVBQUosRUFBSTtDQUNqQixhQUFPLEtBQUsxQyxXQUFMLENBQWlCO0NBQUNnSCxnQkFBUSxJQUFJa0UsaUJBQUosQ0FDL0J4SSxPQUFPeUUsR0FEd0IsRUFFL0J6RSxPQUFPeUksTUFGd0IsRUFHL0J6SSxPQUFPdUUsSUFId0IsRUFJL0J2RSxPQUFPd0UsR0FKd0I7Q0FBVCxPQUFqQixFQUtIRixNQUxKO0NBTUQ7Ozs7OztHQWpDNkJROztrQkFBMUJ5RCxrREFjQ3pELGdCQUFnQjdFO0NBRW5Cc0UsUUFBTTtDQUNOQyxPQUFLO0NBQ0xDLE9BQUs7Q0FDTGdFLFVBQVExRCxPQUFPQyxNQUFQLENBQWNxRCxVQUFkLEdBQTJCdEQsT0FBT0MsTUFBUCxDQUFjc0Q7OztDQzVDckQ7O0NDUUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBeUJNSTs7O0NBRUo7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNEJBOzs7Ozs7Q0FXQSxpQkFBeUI7Q0FBQSxRQUFiMUksTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUFBLDRFQUNqQkEsTUFEaUIsRUFDVDBJLElBQUl6SSxRQURLLEVBQ0t5SSxJQUFJL04sWUFEVDtDQUV4QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QnFGLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJa0IsSUFBSixDQUFTQyxRQUFULEVBQW1CQyxRQUFuQjtDQUFQLE9BQWpCLEVBQXVEcEIsSUFBOUQ7Q0FDRDs7O3FDQUUwQjtDQUFBLFVBQWJwQixNQUFhLHVFQUFKLEVBQUk7Q0FDekIsVUFBTXVDLFdBQVcsS0FBS3ZDLE9BQU80SSxNQUFQLEdBQWdCQyxpQkFBaEIsR0FBb0NDLFdBQXpDLEVBQ2Y5SSxPQUFPdUMsUUFBUCxDQUFnQjBCLEtBREQsRUFFZmpFLE9BQU91QyxRQUFQLENBQWdCMkIsTUFGRCxFQUdmbEUsT0FBT3VDLFFBQVAsQ0FBZ0J3RyxLQUhELEVBSWYvSSxPQUFPdUMsUUFBUCxDQUFnQnlHLGFBSkQsRUFLZmhKLE9BQU91QyxRQUFQLENBQWdCMEcsY0FMRCxFQU1makosT0FBT3VDLFFBQVAsQ0FBZ0IyRyxhQU5ELENBQWpCO0NBU0EsYUFBTzNHLFFBQVA7Q0FDRDs7Ozs7O0dBeEVlSDs7bUNBQVpzRyxrQ0FtQkN0RyxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1IwQixXQUFPLENBREM7Q0FFUkMsWUFBUSxDQUZBO0NBR1I2RSxXQUFPLENBSEM7Q0FJUkMsbUJBQWUsQ0FKUDtDQUtSQyxvQkFBZ0IsQ0FMUjtDQU1SQyxtQkFBZTtDQU5QO3VDQWlCUDlHLGNBQWN6SDtDQUNqQjRILFlBQVUsQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixPQUFwQixFQUE2QixlQUE3QixFQUE4QyxnQkFBOUMsRUFBZ0UsZ0JBQWhFOzs7Q0MvRGQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F3Qk00Rzs7O0NBRUo7Ozs7Ozs7Ozs7Ozs7OztDQXlCQTs7Ozs7O0NBV0Esb0JBQXlCO0NBQUEsUUFBYm5KLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FBQSwrRUFDakJBLE1BRGlCLEVBQ1RtSixPQUFPbEosUUFERSxFQUNRa0osT0FBT3hPLFlBRGY7Q0FFeEI7Q0FFRDs7Ozs7Ozs7Ozs7NkJBTzRCO0NBQUEsVUFBdEJxRixNQUFzQix1RUFBYixLQUFLQSxNQUFROztDQUFBLDhCQUNHLEtBQUsxQyxXQUFMLENBQWlCO0NBQzVDaUYsa0JBQVUsS0FBS29HLGFBQUwsQ0FBbUIzSSxNQUFuQixDQURrQztDQUU1Q3dDLGtCQUFVeEMsT0FBT3dDO0NBRjJCLE9BQWpCLENBREg7Q0FBQSxVQUNuQkQsUUFEbUIscUJBQ25CQSxRQURtQjtDQUFBLFVBQ1RDLFFBRFMscUJBQ1RBLFFBRFM7O0NBTTFCLGFBQU8sS0FBS2xGLFdBQUwsQ0FBaUI7Q0FBQzhELGNBQU0sSUFBSWtCLElBQUosQ0FBU0MsUUFBVCxFQUFtQkMsUUFBbkI7Q0FBUCxPQUFqQixFQUF1RHBCLElBQTlEO0NBQ0Q7OztxQ0FFMEI7Q0FBQSxVQUFicEIsTUFBYSx1RUFBSixFQUFJO0NBQ3pCLFVBQU11QyxXQUFXLEtBQUt2QyxPQUFPNEksTUFBUCxHQUFnQlEsb0JBQWhCLEdBQXVDQyxjQUE1QyxFQUNmckosT0FBT3VDLFFBQVAsQ0FBZ0I2QixNQURELEVBRWZwRSxPQUFPdUMsUUFBUCxDQUFnQitHLFFBRkQsRUFHZnRKLE9BQU91QyxRQUFQLENBQWdCZ0gsVUFIRCxFQUlmdkosT0FBT3VDLFFBQVAsQ0FBZ0JpSCxXQUpELENBQWpCO0NBT0EsYUFBT2pILFFBQVA7Q0FDRDs7Ozs7O0dBbkVrQkg7O21DQUFmK0cscUNBaUJDL0csY0FBY25DO0NBRWpCc0MsWUFBVTtDQUNSNkIsWUFBUSxFQURBO0NBRVJrRixjQUFVLENBRkY7Q0FHUkMsZ0JBQVksQ0FISjtDQUlSQyxpQkFBYTVCLEtBQUtDLEVBQUwsR0FBVTtDQUpmO3VDQWVQekYsY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUFDLFFBQUQsRUFBVyxVQUFYLEVBQXVCLFlBQXZCLEVBQXFDLGFBQXJDOzs7Q0MzRGQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTBCTWtIOzs7Q0FFSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBK0JBOzs7Ozs7Ozs7Ozs7Ozs7O0NBNkJBLGtCQUF5QjtDQUFBOztDQUFBLFFBQWJ6SixNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3ZCLDhFQUFNQSxNQUFOLEVBQWN5SixLQUFLeEosUUFBbkIsRUFBNkJ3SixLQUFLOU8sWUFBbEM7O0NBRUEsUUFBSXFGLE9BQU8wQyxLQUFYLEVBQWtCO0NBQ2hCLFlBQUtBLEtBQUwsQ0FBVzFDLE1BQVg7O0NBQ0E7Q0FDRDs7Q0FOc0I7Q0FPeEI7Q0FFRDs7Ozs7Ozs7Ozs7NkJBTzRCO0NBQUEsVUFBdEJBLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJa0IsSUFBSixDQUFTQyxRQUFULEVBQW1CQyxRQUFuQjtDQUFQLE9BQWpCLEVBQXVEcEIsSUFBOUQ7Q0FDRDs7O3FDQUUwQjtDQUFBLFVBQWJwQixNQUFhLHVFQUFKLEVBQUk7Q0FDekIsVUFBTXVDLFdBQVcsS0FBS3ZDLE9BQU80SSxNQUFQLEdBQWdCYyxrQkFBaEIsR0FBcUNDLFlBQTFDLEVBQ2YzSixPQUFPdUMsUUFBUCxDQUFnQjZCLE1BREQsRUFFZnBFLE9BQU91QyxRQUFQLENBQWdCMkIsTUFGRCxFQUdmbEUsT0FBT3VDLFFBQVAsQ0FBZ0JxSCxjQUhELEVBSWY1SixPQUFPdUMsUUFBUCxDQUFnQjBHLGNBSkQsRUFLZmpKLE9BQU91QyxRQUFQLENBQWdCc0gsU0FMRCxFQU1mN0osT0FBT3VDLFFBQVAsQ0FBZ0JnSCxVQU5ELEVBT2Z2SixPQUFPdUMsUUFBUCxDQUFnQmlILFdBUEQsQ0FBakI7Q0FVQSxhQUFPakgsUUFBUDtDQUNEOzs7Ozs7R0FuR2dCSDs7bUNBQWJxSCxtQ0FvQkNySCxjQUFjbkM7Q0FFakJzQyxZQUFVO0NBQ1I2QixZQUFRLEVBREE7Q0FFUkYsWUFBUSxHQUZBO0NBR1IwRixvQkFBZ0IsRUFIUjtDQUlSWCxvQkFBZ0IsQ0FKUjtDQUtSWSxlQUFXLEtBTEg7Q0FNUk4sZ0JBQVksQ0FOSjtDQU9SQyxpQkFBYTVCLEtBQUtDLEVBQUwsR0FBVTtDQVBmO3VDQTRCUHpGLGNBQWN6SDtDQUNqQjRILFlBQVUsQ0FDUixRQURRLEVBRVIsUUFGUSxFQUdSLGdCQUhRLEVBSVIsZ0JBSlEsRUFLUixXQUxRLEVBTVIsWUFOUSxFQU9SLGFBUFE7OztDQzdFZDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBMEJNdUg7OztDQUVKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBZ0NBOzs7Ozs7Ozs7Ozs7Ozs7OztDQStCQSxzQkFBeUI7Q0FBQTs7Q0FBQSxRQUFiOUosTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2QixrRkFBTUEsTUFBTixFQUFjOEosU0FBUzdKLFFBQXZCLEVBQWlDNkosU0FBU25QLFlBQTFDOztDQUVBLFFBQUlxRixPQUFPMEMsS0FBWCxFQUFrQjtDQUNoQixZQUFLQSxLQUFMLENBQVcxQyxNQUFYOztDQUNBO0NBQ0Q7O0NBTnNCO0NBT3hCO0NBRUQ7Ozs7Ozs7Ozs7OzZCQU80QjtDQUFBLFVBQXRCQSxNQUFzQix1RUFBYixLQUFLQSxNQUFROztDQUFBLDhCQUNHLEtBQUsxQyxXQUFMLENBQWlCO0NBQzVDaUYsa0JBQVUsS0FBS29HLGFBQUwsQ0FBbUIzSSxNQUFuQixDQURrQztDQUU1Q3dDLGtCQUFVeEMsT0FBT3dDO0NBRjJCLE9BQWpCLENBREg7Q0FBQSxVQUNuQkQsUUFEbUIscUJBQ25CQSxRQURtQjtDQUFBLFVBQ1RDLFFBRFMscUJBQ1RBLFFBRFM7O0NBTTFCLGFBQU8sS0FBS2xGLFdBQUwsQ0FBaUI7Q0FBQzhELGNBQU0sSUFBSWtCLElBQUosQ0FBU0MsUUFBVCxFQUFtQkMsUUFBbkI7Q0FBUCxPQUFqQixFQUF1RHBCLElBQTlEO0NBQ0Q7OztxQ0FFMEI7Q0FBQSxVQUFicEIsTUFBYSx1RUFBSixFQUFJO0NBQ3pCLFVBQU11QyxXQUFXLEtBQUt2QyxPQUFPNEksTUFBUCxHQUFnQm1CLHNCQUFoQixHQUF5Q0MsZ0JBQTlDLEVBQ2ZoSyxPQUFPdUMsUUFBUCxDQUFnQjBILFNBREQsRUFFZmpLLE9BQU91QyxRQUFQLENBQWdCMkgsWUFGRCxFQUdmbEssT0FBT3VDLFFBQVAsQ0FBZ0IyQixNQUhELEVBSWZsRSxPQUFPdUMsUUFBUCxDQUFnQnFILGNBSkQsRUFLZjVKLE9BQU91QyxRQUFQLENBQWdCMEcsY0FMRCxFQU1makosT0FBT3VDLFFBQVAsQ0FBZ0JzSCxTQU5ELEVBT2Y3SixPQUFPdUMsUUFBUCxDQUFnQmdILFVBUEQsRUFRZnZKLE9BQU91QyxRQUFQLENBQWdCaUgsV0FSRCxDQUFqQjtDQVdBLGFBQU9qSCxRQUFQO0NBQ0Q7Ozs7OztHQXZHb0JIOzttQ0FBakIwSCx1Q0FxQkMxSCxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1IwSCxlQUFXLENBREg7Q0FFUkMsa0JBQWMsQ0FGTjtDQUdSaEcsWUFBUSxDQUhBO0NBSVIwRixvQkFBZ0IsRUFKUjtDQUtSWCxvQkFBZ0IsQ0FMUjtDQU1SWSxlQUFXLEtBTkg7Q0FPUk4sZ0JBQVksQ0FQSjtDQVFSQyxpQkFBYTVCLEtBQUtDLEVBQUwsR0FBVTtDQVJmO3VDQThCUHpGLGNBQWN6SDtDQUNqQjRILFlBQVUsQ0FDUixXQURRLEVBRVIsY0FGUSxFQUdSLFFBSFEsRUFJUixnQkFKUSxFQUtSLGdCQUxRLEVBTVIsV0FOUSxFQU9SLFlBUFEsRUFRUixhQVJROzs7Q0MvRWQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNEJNNEg7OztDQUNKOzs7Ozs7Ozs7Ozs7Q0FtQkE7Ozs7Ozs7O0NBYUEsMEJBQXlCO0NBQUE7O0NBQUEsUUFBYm5LLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIsc0ZBQU1BLE1BQU4sRUFBY21LLGFBQWFsSyxRQUEzQixFQUFxQ2tLLGFBQWF4UCxZQUFsRDs7Q0FFQSxRQUFJcUYsT0FBTzBDLEtBQVgsRUFBa0I7Q0FDaEIsWUFBS0EsS0FBTCxDQUFXMUMsTUFBWDs7Q0FDQTtDQUNEOztDQU5zQjtDQU94QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QkEsTUFBc0IsdUVBQWIsS0FBS0EsTUFBUTs7Q0FBQSw4QkFDRyxLQUFLMUMsV0FBTCxDQUFpQjtDQUM1Q2lGLGtCQUFVLEtBQUtvRyxhQUFMLENBQW1CM0ksTUFBbkIsQ0FEa0M7Q0FFNUN3QyxrQkFBVXhDLE9BQU93QztDQUYyQixPQUFqQixDQURIO0NBQUEsVUFDbkJELFFBRG1CLHFCQUNuQkEsUUFEbUI7Q0FBQSxVQUNUQyxRQURTLHFCQUNUQSxRQURTOztDQU0xQixhQUFPLEtBQUtsRixXQUFMLENBQWlCO0NBQUM4RCxjQUFNLElBQUlrQixJQUFKLENBQVNDLFFBQVQsRUFBbUJDLFFBQW5CO0NBQVAsT0FBakIsRUFBdURwQixJQUE5RDtDQUNEOzs7cUNBRTBCO0NBQUEsVUFBYnBCLE1BQWEsdUVBQUosRUFBSTtDQUN6QixhQUFPLEtBQUtBLE9BQU80SSxNQUFQLEdBQWdCd0IsMEJBQWhCLEdBQTZDQyxvQkFBbEQsRUFDTHJLLE9BQU91QyxRQUFQLENBQWdCNkIsTUFEWCxFQUVMcEUsT0FBT3VDLFFBQVAsQ0FBZ0IrSCxNQUZYLENBQVA7Q0FJRDs7Ozs7O0dBL0R3QmxJOzttQ0FBckIrSCwyQ0FhQy9ILGNBQWNuQztDQUNqQnNDLFlBQVU7Q0FDUjZCLFlBQVEsQ0FEQTtDQUVSa0csWUFBUTtDQUZBO3VDQWVQbEksY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUFDLFFBQUQsRUFBVyxRQUFYOzs7Q0MxRGQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaURNZ0k7OztDQUNKOzs7Ozs7Ozs7Ozs7OztDQXFCQTs7Ozs7Ozs7OztDQWVBLHFCQUF5QjtDQUFBOztDQUFBLFFBQWJ2SyxNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3ZCLGlGQUFNQSxNQUFOLEVBQWN1SyxRQUFRdEssUUFBdEIsRUFBZ0NzSyxRQUFRNVAsWUFBeEM7O0NBRUEsUUFBSXFGLE9BQU8wQyxLQUFYLEVBQWtCO0NBQ2hCLFlBQUtBLEtBQUwsQ0FBVzFDLE1BQVg7O0NBQ0E7Q0FDRDs7Q0FOc0I7Q0FPeEI7Q0FFRDs7Ozs7Ozs7Ozs7NkJBTzRCO0NBQUEsVUFBdEJBLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJa0IsSUFBSixDQUFTQyxRQUFULEVBQW1CQyxRQUFuQjtDQUFQLE9BQWpCLEVBQXVEcEIsSUFBOUQ7Q0FDRDs7O3FDQUUwQjtDQUFBLFVBQWJwQixNQUFhLHVFQUFKLEVBQUk7Q0FDekIsVUFBTXVDLFdBQVcsSUFBSWlJLGVBQUosQ0FDZnhLLE9BQU91QyxRQUFQLENBQWdCa0ksTUFERCxFQUVmekssT0FBT3VDLFFBQVAsQ0FBZ0JtSSxPQUZELENBQWpCO0NBS0EsYUFBTzFLLE9BQU80SSxNQUFQLEdBQWdCLElBQUkrQixjQUFKLEdBQXFCQyxZQUFyQixDQUFrQ3JJLFFBQWxDLENBQWhCLEdBQThEQSxRQUFyRTtDQUNEOzs7Ozs7R0FyRW1CSDs7bUNBQWhCbUksc0NBZUNuSSxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1JrSSxZQUFRLEVBREE7Q0FFUkMsYUFBUztDQUZEO3VDQWlCUHRJLGNBQWN6SDtDQUNqQjRILFlBQVUsQ0FBQyxRQUFELEVBQVcsU0FBWDs7O0NDbkZkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXlCTXNJOzs7Q0FDSjs7Ozs7Ozs7Ozs7OztDQW9CQTs7Ozs7O0NBV0EseUJBQXlCO0NBQUE7O0NBQUEsUUFBYjdLLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIscUZBQU1BLE1BQU4sRUFBYzZLLFlBQVk1SyxRQUExQixFQUFvQzRLLFlBQVlsUSxZQUFoRDs7Q0FFQSxRQUFJcUYsT0FBTzBDLEtBQVgsRUFBa0I7Q0FDaEIsWUFBS0EsS0FBTCxDQUFXMUMsTUFBWDs7Q0FDQTtDQUNEOztDQU5zQjtDQU94QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QkEsTUFBc0IsdUVBQWIsS0FBS0EsTUFBUTs7Q0FBQSw4QkFDRyxLQUFLMUMsV0FBTCxDQUFpQjtDQUM1Q2lGLGtCQUFVLEtBQUtvRyxhQUFMLENBQW1CM0ksTUFBbkIsQ0FEa0M7Q0FFNUN3QyxrQkFBVXhDLE9BQU93QztDQUYyQixPQUFqQixDQURIO0NBQUEsVUFDbkJELFFBRG1CLHFCQUNuQkEsUUFEbUI7Q0FBQSxVQUNUQyxRQURTLHFCQUNUQSxRQURTOztDQU0xQixhQUFPLEtBQUtsRixXQUFMLENBQWlCO0NBQUM4RCxjQUFNLElBQUlrQixJQUFKLENBQVNDLFFBQVQsRUFBbUJDLFFBQW5CO0NBQVAsT0FBakIsRUFBdURwQixJQUE5RDtDQUNEOzs7cUNBRTBCO0NBQUEsVUFBYnBCLE1BQWEsdUVBQUosRUFBSTtDQUN6QixhQUFPLEtBQUtBLE9BQU80SSxNQUFQLEdBQWdCa0MseUJBQWhCLEdBQTRDQyxtQkFBakQsRUFDTC9LLE9BQU91QyxRQUFQLENBQWdCNkIsTUFEWCxFQUVMcEUsT0FBT3VDLFFBQVAsQ0FBZ0IrSCxNQUZYLENBQVA7Q0FJRDs7Ozs7O0dBOUR1QmxJOzttQ0FBcEJ5SSwwQ0FjQ3pJLGNBQWNuQztDQUNqQnNDLFlBQVU7Q0FDUjZCLFlBQVEsQ0FEQTtDQUVSa0csWUFBUTtDQUZBO3VDQWFQbEksY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUFDLFFBQUQsRUFBVyxRQUFYOzs7Q0N0RGQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXNDTXlJOzs7Q0FDSjs7Ozs7Ozs7Ozs7OztDQW1CQTs7Ozs7Ozs7O0NBY0EsbUJBQXlCO0NBQUE7O0NBQUEsUUFBYmhMLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIsK0VBQU1BLE1BQU4sRUFBY2dMLE1BQU0vSyxRQUFwQixFQUE4QitLLE1BQU1yUSxZQUFwQzs7Q0FFQSxRQUFJcUYsT0FBTzBDLEtBQVgsRUFBa0I7Q0FDaEIsWUFBS0EsS0FBTCxDQUFXMUMsTUFBWDs7Q0FDQTtDQUNEOztDQU5zQjtDQU94QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QkEsTUFBc0IsdUVBQWIsS0FBS0EsTUFBUTs7Q0FBQSw4QkFDRyxLQUFLMUMsV0FBTCxDQUFpQjtDQUM1Q2lGLGtCQUFVLEtBQUtvRyxhQUFMLENBQW1CM0ksTUFBbkIsQ0FEa0M7Q0FFNUN3QyxrQkFBVXhDLE9BQU93QztDQUYyQixPQUFqQixDQURIO0NBQUEsVUFDbkJELFFBRG1CLHFCQUNuQkEsUUFEbUI7Q0FBQSxVQUNUQyxRQURTLHFCQUNUQSxRQURTOztDQU0xQixhQUFPLEtBQUtsRixXQUFMLENBQWlCO0NBQUM4RCxjQUFNLElBQUlrQixJQUFKLENBQVNDLFFBQVQsRUFBbUJDLFFBQW5CO0NBQVAsT0FBakIsRUFBdURwQixJQUE5RDtDQUNEOzs7cUNBRTBCO0NBQUEsVUFBYnBCLE1BQWEsdUVBQUosRUFBSTtDQUN6QixhQUFPLEtBQUtBLE9BQU80SSxNQUFQLEdBQWdCcUMsbUJBQWhCLEdBQXNDQyxhQUEzQyxFQUNMbEwsT0FBT3VDLFFBQVAsQ0FBZ0I0SSxNQURYLENBQVA7Q0FHRDs7Ozs7O0dBL0RpQi9JOzttQ0FBZDRJLG9DQWNDNUksY0FBY25DO0NBQ2pCc0MsWUFBVTtDQUNSNEksWUFBUTtDQURBO3VDQWVQL0ksY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUFDLFFBQUQ7OztDQ2xFZDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQWtCTTZJOzs7Q0FDSjs7Ozs7Ozs7Ozs7O0NBa0JBOzs7Ozs7Ozs7Q0FjQSxtQkFBWXBMLE1BQVosRUFBb0I7Q0FBQTs7Q0FBQSxnRkFDWkEsTUFEWSxFQUNKb0wsUUFBS25MLFFBREQsRUFDV21MLFFBQUt6USxZQURoQjtDQUVuQjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QnFGLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJaUssSUFBSixDQUFlOUksUUFBZixFQUF5QkMsUUFBekI7Q0FBUCxPQUFqQixFQUE2RHBCLElBQXBFO0NBQ0Q7OztxQ0FFMEI7Q0FBQSxVQUFicEIsTUFBYSx1RUFBSixFQUFJO0NBQ3pCLFVBQU11QyxXQUFXdkMsT0FBTzRJLE1BQVAsR0FBZ0IsSUFBSStCLGNBQUosRUFBaEIsR0FBdUMsSUFBSVcsUUFBSixFQUF4RDs7Q0FFQSxVQUFJdEwsT0FBTzRJLE1BQVgsRUFBbUI7Q0FDakIsWUFBTTJDLEtBQUt2TCxPQUFPd0wsS0FBUCxDQUFhQyxTQUFiLENBQXVCekwsT0FBT21MLE1BQTlCLENBQVg7Q0FDQSxZQUFNTyxRQUFRLElBQUlDLFlBQUosQ0FBaUJKLEdBQUcvUSxNQUFILEdBQVksQ0FBN0IsQ0FBZDs7Q0FFQSxhQUFLLElBQUlGLElBQUksQ0FBUixFQUFXQyxNQUFNZ1IsR0FBRy9RLE1BQXpCLEVBQWlDRixJQUFJQyxHQUFyQyxFQUEwQ0QsR0FBMUMsRUFBK0M7Q0FDN0MsY0FBTXNSLEtBQUt0UixJQUFJLENBQWY7Q0FFQW9SLGdCQUFNRSxFQUFOLElBQVlMLEdBQUdqUixDQUFILEVBQU00SSxDQUFsQjtDQUNBd0ksZ0JBQU1FLEtBQUssQ0FBWCxJQUFnQkwsR0FBR2pSLENBQUgsRUFBTTZJLENBQXRCO0NBQ0F1SSxnQkFBTUUsS0FBSyxDQUFYLElBQWdCTCxHQUFHalIsQ0FBSCxFQUFNOEksQ0FBdEI7Q0FDRDs7Q0FFRGIsaUJBQVNzSixZQUFULENBQXNCLFVBQXRCLEVBQWtDLElBQUlDLGVBQUosQ0FBb0JKLEtBQXBCLEVBQTJCLENBQTNCLENBQWxDO0NBQ0QsT0FiRCxNQWFPbkosU0FBU3dKLFFBQVQsR0FBb0IvTCxPQUFPd0wsS0FBUCxDQUFhQyxTQUFiLENBQXVCekwsT0FBT21MLE1BQTlCLENBQXBCOztDQUVQLGFBQU81SSxRQUFQO0NBQ0Q7Ozs7OztHQXhFZ0JIOzttQ0FBYmdKLHFDQWFDaEosY0FBY25DO0NBRWpCdUwsU0FBTztDQUNQTCxVQUFRO3VDQWFML0ksY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUFDLE9BQUQsRUFBVSxRQUFWOzs7Q0NuRGQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQk15Sjs7Ozs7O0NBRUo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnREE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NEJBbUJjeFMsUUFBUXlTLFNBQVE7Q0FDNUIsVUFBTUMsZ0JBQWdCLFNBQWhCQSxhQUFnQixTQUFVO0NBQzlCMVMsZUFBT3lILFFBQVAsQ0FBZ0JrTCxPQUFoQixDQUF3QixVQUFDQyxFQUFELEVBQUtuRyxLQUFMLEVBQWU7Q0FDckMsY0FBSW1HLEdBQUduTCxRQUFQLEVBQWlCaUwsY0FBY0UsRUFBZDtDQUNqQixjQUFJLENBQUNILFFBQU9HLEVBQVAsQ0FBTCxFQUFpQjVTLE9BQU95SCxRQUFQLENBQWdCNUUsTUFBaEIsQ0FBdUI0SixLQUF2QixFQUE4QixDQUE5QjtDQUNsQixTQUhEO0NBS0EsZUFBT3pNLE1BQVA7Q0FDRCxPQVBEOztDQVNBLGFBQU8wUyxjQUFjMVMsTUFBZCxDQUFQO0NBQ0Q7OztDQUVELHNCQUF5QjtDQUFBLFFBQWJ3RyxNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQUEsaUZBQ2pCQSxNQURpQixFQUNUZ00sU0FBUy9MLFFBREEsRUFDVStMLFNBQVNyUixZQURuQixFQUNpQyxLQURqQztDQUV4QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPbUI7Q0FBQTs7Q0FBQSxVQUFicUYsTUFBYSx1RUFBSixFQUFJO0NBQ2pCLGFBQU8sSUFBSTdKLE9BQUosQ0FBWSxtQkFBVztDQUM1QixZQUFJNkosT0FBT3FNLFdBQVgsRUFBd0JyTSxPQUFPc00sTUFBUCxDQUFjQyxjQUFkLENBQTZCdk0sT0FBT3FNLFdBQXBDO0NBRXhCck0sZUFBT3NNLE1BQVAsQ0FBY0UsSUFBZCxDQUFtQnhNLE9BQU95TSxHQUExQixFQUErQixZQUFhO0NBQUEsNENBQVR2TixJQUFTO0NBQVRBLGdCQUFTO0NBQUE7O0NBQUU7Q0FDNUNjLGlCQUFPME0sTUFBUCxlQUFpQnhOLElBQWpCO0NBRUEsY0FBTTFGLFNBQVN3RyxPQUFPMk0sTUFBUCxDQUFjaFAsS0FBZCxDQUFvQixLQUFwQixFQUEwQnVCLElBQTFCLENBQWY7Q0FDQSxjQUFJYyxPQUFPd0MsUUFBWCxFQUFxQmhKLE9BQU9nSixRQUFQLEdBQWtCLE1BQUtsRixXQUFMLENBQWlCO0NBQUNrRixzQkFBVXhDLE9BQU93QztDQUFsQixXQUFqQixFQUE4Q0EsUUFBaEU7Q0FFckJJLGtCQUFRcEosTUFBUjtDQUNELFNBUEQsRUFPR3dHLE9BQU80TSxVQVBWLEVBT3NCNU0sT0FBTzZNLE9BUDdCO0NBUUQsT0FYTSxDQUFQO0NBWUQ7Ozs7OztHQTFHb0J6Szs7bUNBQWpCNEosdUNBd0JDNUosY0FBY25DO0NBRWpCd00sT0FBSztDQUNMSCxVQUFRLElBQUlRLFVBQUo7Q0FFUkosNEJBQVM7Q0FDVEUsb0NBQWE7Q0FDYjtDQUNBQyw4QkFBVTtDQUVWUixlQUFhO0NBQ2JVLHFCQUFtQjtDQUVuQkosMEJBQU9wSyxVQUFVQyxVQUFVO0NBQUEsNEJBQ2UsS0FBS2xGLFdBQUwsQ0FBaUI7Q0FBQ2lGLHdCQUFEO0NBQVdDO0NBQVgsS0FBakIsQ0FEZjtDQUFBLFFBQ1JILElBRFEscUJBQ2xCRSxRQURrQjtDQUFBLFFBQ1F5SyxHQURSLHFCQUNGeEssUUFERTs7Q0FHekIsV0FBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUN0QjhELFlBQU1pQixLQUFLNEssS0FBTCxHQUFhLElBQUlDLFdBQUosQ0FBZ0I3SyxJQUFoQixFQUFzQjJLLEdBQXRCLENBQWIsR0FBMEMsSUFBSTFLLElBQUosQ0FBU0QsSUFBVCxFQUFlMkssR0FBZjtDQUQxQixLQUFqQixFQUVKNUwsSUFGSDtDQUdEO3VDQUlFZ0IsY0FBY3pIOztDQ2pFckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTBCTXdTOzs7Q0FDSjs7Ozs7Ozs7Ozs7OztDQXFCQSx3QkFBeUI7Q0FBQTs7Q0FBQSxRQUFibk4sTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2QixvRkFBTUEsTUFBTixFQUFjbU4sV0FBV2xOLFFBQXpCLEVBQW1Da04sV0FBV3hTLFlBQTlDOztDQUVBLFFBQUlxRixPQUFPMEMsS0FBWCxFQUFrQjtDQUNoQixZQUFLQSxLQUFMLENBQVcxQyxNQUFYOztDQUNBO0NBQ0Q7O0NBTnNCO0NBT3hCO0NBRUQ7Ozs7Ozs7Ozs7OzZCQU80QjtDQUFBLFVBQXRCQSxNQUFzQix1RUFBYixLQUFLQSxNQUFROztDQUFBLDhCQUNHLEtBQUsxQyxXQUFMLENBQWlCO0NBQzVDaUYsa0JBQVUsS0FBS29HLGFBQUwsQ0FBbUIzSSxNQUFuQixDQURrQztDQUU1Q3dDLGtCQUFVeEMsT0FBT3dDO0NBRjJCLE9BQWpCLENBREg7Q0FBQSxVQUNuQkQsUUFEbUIscUJBQ25CQSxRQURtQjtDQUFBLFVBQ1RDLFFBRFMscUJBQ1RBLFFBRFM7O0NBTTFCLGFBQU8sS0FBS2xGLFdBQUwsQ0FBaUI7Q0FBQzhELGNBQU0sSUFBSWtCLElBQUosQ0FBU0MsUUFBVCxFQUFtQkMsUUFBbkI7Q0FBUCxPQUFqQixFQUF1RHBCLElBQTlEO0NBQ0Q7OztxQ0FFMEI7Q0FBQSxVQUFicEIsTUFBYSx1RUFBSixFQUFJO0NBQ3pCLGFBQU8sS0FBS0EsT0FBTzRJLE1BQVAsR0FBZ0J3RSx3QkFBaEIsR0FBMkNDLGtCQUFoRCxFQUNMck4sT0FBT3VDLFFBQVAsQ0FBZ0I2QixNQURYLEVBRUxwRSxPQUFPdUMsUUFBUCxDQUFnQitILE1BRlgsQ0FBUDtDQUlEOzs7Ozs7R0FwRHNCbEk7O2tCQUFuQitLLHlDQWVDL0ssY0FBY25DO0NBQ2pCc0MsWUFBVTtDQUNSNkIsWUFBUSxDQURBO0NBRVJrRyxZQUFRO0NBRkE7OztDQ3pDZDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQ01nRDs7O0NBQ0o7Ozs7Ozs7Ozs7Ozs7O0NBdUJBLHdCQUF5QjtDQUFBLFFBQWJ0TixNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQUEsbUZBQ2pCQSxNQURpQixFQUNUc04sV0FBV3JOLFFBREYsRUFDWXFOLFdBQVczUyxZQUR2QjtDQUV4QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QnFGLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJa0IsSUFBSixDQUFTQyxRQUFULEVBQW1CQyxRQUFuQjtDQUFQLE9BQWpCLEVBQXVEcEIsSUFBOUQ7Q0FDRDs7O3FDQUUwQjtDQUFBLFVBQWJwQixNQUFhLHVFQUFKLEVBQUk7Q0FDekIsYUFBTyxLQUFLQSxPQUFPNEksTUFBUCxHQUFnQjJFLHdCQUFoQixHQUEyQ0Msa0JBQWhELEVBQ0x4TixPQUFPdUMsUUFBUCxDQUFnQjFFLElBRFgsRUFFTG1DLE9BQU91QyxRQUFQLENBQWdCa0wsTUFGWCxFQUdMek4sT0FBT3VDLFFBQVAsQ0FBZ0JtTCxNQUhYLENBQVA7Q0FLRDs7Ozs7O0dBbERzQnRMOztrQkFBbkJrTCx5Q0FnQkNsTCxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1IxRSxVQUFNLGNBQUM4UCxDQUFELEVBQUlDLENBQUo7Q0FBQSxhQUFVLElBQUlDLE9BQUosQ0FBWUYsQ0FBWixFQUFlQyxDQUFmLEVBQWtCLENBQWxCLENBQVY7Q0FBQSxLQURFO0NBRVJILFlBQVEsRUFGQTtDQUdSQyxZQUFRO0NBSEE7OztDQ3BEZDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXFCTUk7OztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7O0NBeUJBOzs7Ozs7Ozs7O0NBZUEsc0JBQXlCO0NBQUE7O0NBQUEsUUFBYjlOLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIsa0ZBQU1BLE1BQU4sRUFBYzhOLFNBQU03TixRQUFwQixFQUE4QjZOLFNBQU1uVCxZQUFwQzs7Q0FFQSxRQUFJcUYsT0FBTzBDLEtBQVgsRUFBa0I7Q0FDaEIsWUFBS0EsS0FBTCxDQUFXMUMsTUFBWDs7Q0FDQTtDQUNEOztDQU5zQjtDQU94QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QkEsTUFBc0IsdUVBQWIsS0FBS0EsTUFBUTs7Q0FBQSw4QkFDRyxLQUFLMUMsV0FBTCxDQUFpQjtDQUM1Q2lGLGtCQUFVLEtBQUtvRyxhQUFMLENBQW1CM0ksTUFBbkIsQ0FEa0M7Q0FFNUN3QyxrQkFBVXhDLE9BQU93QztDQUYyQixPQUFqQixDQURIO0NBQUEsVUFDbkJELFFBRG1CLHFCQUNuQkEsUUFEbUI7Q0FBQSxVQUNUQyxRQURTLHFCQUNUQSxRQURTOztDQU0xQixhQUFPLEtBQUtsRixXQUFMLENBQWlCO0NBQUM4RCxjQUFNLElBQUlrQixJQUFKLENBQVNDLFFBQVQsRUFBbUJDLFFBQW5CO0NBQVAsT0FBakIsRUFBdURwQixJQUE5RDtDQUNEOzs7cUNBRTBCO0NBQUEsVUFBYnBCLE1BQWEsdUVBQUosRUFBSTtDQUN6QixVQUFNdUMsV0FBVyxLQUFLdkMsT0FBTzRJLE1BQVAsR0FBZ0JtRixtQkFBaEIsR0FBc0NDLGFBQTNDLEVBQ2ZoTyxPQUFPdUMsUUFBUCxDQUFnQjBCLEtBREQsRUFFZmpFLE9BQU91QyxRQUFQLENBQWdCMkIsTUFGRCxFQUdmbEUsT0FBT3VDLFFBQVAsQ0FBZ0IwTCxTQUhELEVBSWZqTyxPQUFPdUMsUUFBUCxDQUFnQjJMLFNBSkQsQ0FBakI7Q0FPQSxhQUFPM0wsUUFBUDtDQUNEOzs7Ozs7R0EzRWlCSDs7bUNBQWQwTCxzQ0FpQkMxTCxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1IwQixXQUFPLEVBREM7Q0FFUkMsWUFBUSxFQUZBO0NBR1IrSixlQUFXLENBSEg7Q0FJUkMsZUFBVztDQUpIO3VDQW1CUDlMLGNBQWN6SDtDQUNqQjRILFlBQVUsQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixXQUFwQixFQUFpQyxXQUFqQzs7O0tDM0RQNEwsaUJBQ0wsQ0FDRSxDQUFDLENBREgsRUFDTSxDQUFDLENBRFAsRUFDVSxDQUFDLENBRFgsRUFDYyxDQURkLEVBQ2lCLENBQUMsQ0FEbEIsRUFDcUIsQ0FBQyxDQUR0QixFQUN5QixDQUR6QixFQUM0QixDQUQ1QixFQUMrQixDQUFDLENBRGhDLEVBQ21DLENBQUMsQ0FEcEMsRUFDdUMsQ0FEdkMsRUFDMEMsQ0FBQyxDQUQzQyxFQUVFLENBQUMsQ0FGSCxFQUVNLENBQUMsQ0FGUCxFQUVVLENBRlYsRUFFYSxDQUZiLEVBRWdCLENBQUMsQ0FGakIsRUFFb0IsQ0FGcEIsRUFFdUIsQ0FGdkIsRUFFMEIsQ0FGMUIsRUFFNkIsQ0FGN0IsRUFFZ0MsQ0FBQyxDQUZqQyxFQUVvQyxDQUZwQyxFQUV1QyxDQUZ2QztLQURxQkMsaUJBS3JCLENBQ0UsQ0FERixFQUNLLENBREwsRUFDUSxDQURSLEVBQ1csQ0FEWCxFQUNjLENBRGQsRUFDaUIsQ0FEakIsRUFFRSxDQUZGLEVBRUssQ0FGTCxFQUVRLENBRlIsRUFFVyxDQUZYLEVBRWMsQ0FGZCxFQUVpQixDQUZqQixFQUdFLENBSEYsRUFHSyxDQUhMLEVBR1EsQ0FIUixFQUdXLENBSFgsRUFHYyxDQUhkLEVBR2lCLENBSGpCLEVBSUUsQ0FKRixFQUlLLENBSkwsRUFJUSxDQUpSLEVBSVcsQ0FKWCxFQUljLENBSmQsRUFJaUIsQ0FKakIsRUFLRSxDQUxGLEVBS0ssQ0FMTCxFQUtRLENBTFIsRUFLVyxDQUxYLEVBS2MsQ0FMZCxFQUtpQixDQUxqQixFQU1FLENBTkYsRUFNSyxDQU5MLEVBTVEsQ0FOUixFQU1XLENBTlgsRUFNYyxDQU5kLEVBTWlCLENBTmpCO0NBVUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F3Qk1DOzs7Q0FJSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFDQTs7Ozs7Ozs7OztDQWVBLHdCQUF5QjtDQUFBOztDQUFBLFFBQWJyTyxNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3ZCLG9GQUFNQSxNQUFOLEVBQWNxTyxXQUFXcE8sUUFBekIsRUFBbUNvTyxXQUFXMVQsWUFBOUM7O0NBRUEsUUFBSXFGLE9BQU8wQyxLQUFYLEVBQWtCO0NBQ2hCLFlBQUtBLEtBQUwsQ0FBVzFDLE1BQVg7O0NBQ0E7Q0FDRDs7Q0FOc0I7Q0FPeEI7Q0FFRDs7Ozs7Ozs7Ozs7NkJBTzRCO0NBQUEsVUFBdEJBLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJa0IsSUFBSixDQUFTQyxRQUFULEVBQW1CQyxRQUFuQjtDQUFQLE9BQWpCLEVBQXVEcEIsSUFBOUQ7Q0FDRDs7O3FDQUUwQjtDQUFBLFVBQWJwQixNQUFhLHVFQUFKLEVBQUk7Q0FDekIsYUFBTyxLQUFLQSxPQUFPNEksTUFBUCxHQUFnQjBGLHdCQUFoQixHQUEyQ0Msa0JBQWhELEVBQ0x2TyxPQUFPdUMsUUFBUCxDQUFnQjRMLGNBRFgsRUFFTG5PLE9BQU91QyxRQUFQLENBQWdCNkwsY0FGWCxFQUdMcE8sT0FBT3VDLFFBQVAsQ0FBZ0I2QixNQUhYLEVBSUxwRSxPQUFPdUMsUUFBUCxDQUFnQitILE1BSlgsQ0FBUDtDQU1EOzs7Ozs7R0F4RnNCbEk7O3FFQUFuQmlNLDhCQUNvQkYsbUNBQ0FDLDhDQThCbkJoTSxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1I0TCxrQ0FEUTtDQUVSQyxrQ0FGUTtDQUdSaEssWUFBUSxDQUhBO0NBSVJrRyxZQUFRO0NBSkE7dUNBbUJQbEksY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUFDLGdCQUFELEVBQW1CLGdCQUFuQixFQUFxQyxRQUFyQyxFQUErQyxRQUEvQzs7O0NDNUZkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTRCTWlNOzs7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNkJBOzs7Ozs7Ozs7Ozs7Ozs7OztDQTZCQSxrQkFBeUI7Q0FBQTs7Q0FBQSxRQUFieE8sTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2Qiw4RUFBTUEsTUFBTixFQUFjd08sS0FBS3ZPLFFBQW5CLEVBQTZCdU8sS0FBSzdULFlBQWxDOztDQUVBLFFBQUlxRixPQUFPMEMsS0FBWCxFQUFrQjtDQUNoQixZQUFLQSxLQUFMLENBQVcxQyxNQUFYOztDQUNBO0NBQ0Q7O0NBTnNCO0NBT3hCO0NBRUQ7Ozs7Ozs7Ozs7OzZCQU80QjtDQUFBLFVBQXRCQSxNQUFzQix1RUFBYixLQUFLQSxNQUFROztDQUFBLDhCQUNHLEtBQUsxQyxXQUFMLENBQWlCO0NBQzVDaUYsa0JBQVUsS0FBS29HLGFBQUwsQ0FBbUIzSSxNQUFuQixDQURrQztDQUU1Q3dDLGtCQUFVeEMsT0FBT3dDO0NBRjJCLE9BQWpCLENBREg7Q0FBQSxVQUNuQkQsUUFEbUIscUJBQ25CQSxRQURtQjtDQUFBLFVBQ1RDLFFBRFMscUJBQ1RBLFFBRFM7O0NBTTFCLGFBQU8sS0FBS2xGLFdBQUwsQ0FBaUI7Q0FBQzhELGNBQU0sSUFBSWtCLElBQUosQ0FBU0MsUUFBVCxFQUFtQkMsUUFBbkI7Q0FBUCxPQUFqQixFQUF1RHBCLElBQTlEO0NBQ0Q7OztxQ0FFMEI7Q0FBQSxVQUFicEIsTUFBYSx1RUFBSixFQUFJO0NBQ3pCLGFBQU8sS0FBS0EsT0FBTzRJLE1BQVAsR0FBZ0I2RixrQkFBaEIsR0FBcUNDLFlBQTFDLEVBQ0wxTyxPQUFPdUMsUUFBUCxDQUFnQm9NLFdBRFgsRUFFTDNPLE9BQU91QyxRQUFQLENBQWdCcU0sV0FGWCxFQUdMNU8sT0FBT3VDLFFBQVAsQ0FBZ0JzTSxhQUhYLEVBSUw3TyxPQUFPdUMsUUFBUCxDQUFnQnVNLFdBSlgsRUFLTDlPLE9BQU91QyxRQUFQLENBQWdCZ0gsVUFMWCxFQU1MdkosT0FBT3VDLFFBQVAsQ0FBZ0JpSCxXQU5YLENBQVA7Q0FRRDs7Ozs7O0dBN0ZnQnBIOzttQ0FBYm9NLG1DQW1CQ3BNLGNBQWNuQztDQUNqQnNDLFlBQVU7Q0FDUm9NLGlCQUFhLENBREw7Q0FFUkMsaUJBQWEsRUFGTDtDQUdSQyxtQkFBZSxDQUhQO0NBSVJDLGlCQUFhLENBSkw7Q0FLUnZGLGdCQUFZLENBTEo7Q0FNUkMsaUJBQWE1QixLQUFLQyxFQUFMLEdBQVU7Q0FOZjt1Q0E0QlB6RixjQUFjbkM7Q0FDakJzQyxZQUFVLENBQ1IsYUFEUSxFQUVSLGFBRlEsRUFHUixlQUhRLEVBSVIsYUFKUSxFQUtSLFlBTFEsRUFNUixhQU5ROzs7Q0M3RWQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FpQ013TTs7O0NBQ0o7Ozs7Ozs7Ozs7OztDQWtCQTs7Ozs7Ozs7OztDQWVBLHNCQUF5QjtDQUFBOztDQUFBLFFBQWIvTyxNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3ZCLGtGQUFNQSxNQUFOLEVBQWMrTyxTQUFNOU8sUUFBcEIsRUFBOEI4TyxTQUFNcFUsWUFBcEM7O0NBRUEsUUFBSXFGLE9BQU8wQyxLQUFYLEVBQWtCO0NBQ2hCLFlBQUtBLEtBQUwsQ0FBVzFDLE1BQVg7O0NBQ0E7Q0FDRDs7Q0FOc0I7Q0FPeEI7Q0FFRDs7Ozs7Ozs7Ozs7NkJBTzRCO0NBQUEsVUFBdEJBLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJa0IsSUFBSixDQUFTQyxRQUFULEVBQW1CQyxRQUFuQjtDQUFQLE9BQWpCLEVBQXVEcEIsSUFBOUQ7Q0FDRDs7O3FDQUUwQjtDQUFBLFVBQWJwQixNQUFhLHVFQUFKLEVBQUk7Q0FDekIsYUFBTyxLQUFLQSxPQUFPNEksTUFBUCxHQUFnQm9HLG1CQUFoQixHQUFzQ0MsYUFBM0MsRUFDTGpQLE9BQU91QyxRQUFQLENBQWdCa0ksTUFEWCxDQUFQO0NBR0Q7Ozs7OztHQS9EaUJySTs7bUNBQWQyTSxzQ0FhQzNNLGNBQWNuQztDQUNqQnNDLFlBQVU7Q0FDUmtJLFlBQVE7Q0FEQTt1Q0FnQlBySSxjQUFjekg7Q0FDakI0SCxZQUFVLENBQUMsUUFBRDs7O0NDaEVkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0E2Qk0yTTs7O0NBQ0o7Ozs7Ozs7Ozs7Ozs7O0NBc0JBOzs7Ozs7Ozs7O0NBZUEsdUJBQXlCO0NBQUEsUUFBYmxQLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FBQSxrRkFDakJBLE1BRGlCLEVBQ1RrUCxVQUFPalAsUUFERSxFQUNRaVAsVUFBT3ZVLFlBRGY7Q0FFeEI7Q0FFRDs7Ozs7Ozs7Ozs7NkJBTzRCO0NBQUEsVUFBdEJxRixNQUFzQix1RUFBYixLQUFLQSxNQUFROztDQUFBLDhCQUNHLEtBQUsxQyxXQUFMLENBQWlCO0NBQzVDaUYsa0JBQVUsS0FBS29HLGFBQUwsQ0FBbUIzSSxNQUFuQixDQURrQztDQUU1Q3dDLGtCQUFVeEMsT0FBT3dDO0NBRjJCLE9BQWpCLENBREg7Q0FBQSxVQUNuQkQsUUFEbUIscUJBQ25CQSxRQURtQjtDQUFBLFVBQ1RDLFFBRFMscUJBQ1RBLFFBRFM7O0NBTTFCLGFBQU8sS0FBS2xGLFdBQUwsQ0FBaUI7Q0FBQzhELGNBQU0sSUFBSWtCLElBQUosQ0FBU0MsUUFBVCxFQUFtQkMsUUFBbkI7Q0FBUCxPQUFqQixFQUF1RHBCLElBQTlEO0NBQ0Q7OztxQ0FFMEI7Q0FBQSxVQUFicEIsTUFBYSx1RUFBSixFQUFJO0NBQ3pCLFVBQU11QyxXQUFXLEtBQUt2QyxPQUFPNEksTUFBUCxHQUFnQnVHLG9CQUFoQixHQUF1Q0MsY0FBNUMsRUFDZnBQLE9BQU91QyxRQUFQLENBQWdCNkIsTUFERCxFQUVmcEUsT0FBT3VDLFFBQVAsQ0FBZ0J5RyxhQUZELEVBR2ZoSixPQUFPdUMsUUFBUCxDQUFnQjBHLGNBSEQsQ0FBakI7Q0FNQSxhQUFPMUcsUUFBUDtDQUNEOzs7Ozs7R0FsRWtCSDs7bUNBQWY4TSx1Q0FlQzlNLGNBQWNuQztDQUNqQnNDLFlBQVU7Q0FDUjZCLFlBQVEsQ0FEQTtDQUVSNEUsbUJBQWUsQ0FGUDtDQUdSQyxvQkFBZ0I7Q0FIUjt1Q0FrQlA3RyxjQUFjekg7Q0FDakI0SCxZQUFVLENBQUMsUUFBRCxFQUFXLGVBQVgsRUFBNEIsZ0JBQTVCOzs7Q0NoRWQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0E4Qk04TTs7O0NBQ0o7Ozs7Ozs7Ozs7Ozs7Q0FvQkE7Ozs7Ozs7Ozs7Q0FlQSx5QkFBeUI7Q0FBQTs7Q0FBQSxRQUFiclAsTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2QixxRkFBTUEsTUFBTixFQUFjcVAsWUFBWXBQLFFBQTFCLEVBQW9Db1AsWUFBWTFVLFlBQWhEOztDQUVBLFFBQUlxRixPQUFPMEMsS0FBWCxFQUFrQjtDQUNoQixZQUFLQSxLQUFMLENBQVcxQyxNQUFYOztDQUNBO0NBQ0Q7O0NBTnNCO0NBT3hCO0NBRUQ7Ozs7Ozs7Ozs7OzZCQU80QjtDQUFBLFVBQXRCQSxNQUFzQix1RUFBYixLQUFLQSxNQUFROztDQUFBLDhCQUNHLEtBQUsxQyxXQUFMLENBQWlCO0NBQzVDaUYsa0JBQVUsS0FBS29HLGFBQUwsQ0FBbUIzSSxNQUFuQixDQURrQztDQUU1Q3dDLGtCQUFVeEMsT0FBT3dDO0NBRjJCLE9BQWpCLENBREg7Q0FBQSxVQUNuQkQsUUFEbUIscUJBQ25CQSxRQURtQjtDQUFBLFVBQ1RDLFFBRFMscUJBQ1RBLFFBRFM7O0NBTTFCLGFBQU8sS0FBS2xGLFdBQUwsQ0FBaUI7Q0FBQzhELGNBQU0sSUFBSWtCLElBQUosQ0FBU0MsUUFBVCxFQUFtQkMsUUFBbkI7Q0FBUCxPQUFqQixFQUF1RHBCLElBQTlEO0NBQ0Q7OztxQ0FFMEI7Q0FBQSxVQUFicEIsTUFBYSx1RUFBSixFQUFJO0NBQ3pCLGFBQU8sS0FBS0EsT0FBTzRJLE1BQVAsR0FBZ0IwRyx5QkFBaEIsR0FBNENDLG1CQUFqRCxFQUNMdlAsT0FBT3VDLFFBQVAsQ0FBZ0I2QixNQURYLEVBRUxwRSxPQUFPdUMsUUFBUCxDQUFnQitILE1BRlgsQ0FBUDtDQUlEOzs7Ozs7R0FsRXVCbEk7O21DQUFwQmlOLDBDQWNDak4sY0FBY25DO0NBQ2pCc0MsWUFBVTtDQUNSNkIsWUFBUSxDQURBO0NBRVJrRyxZQUFRO0NBRkE7dUNBaUJQbEksY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUFDLFFBQUQsRUFBVyxRQUFYOzs7Q0M5RGQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FpQ01pTjs7Ozs7O0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F5Q0E7Ozs7Ozs7Q0FRQTs7Ozs7Ozs7MEJBUVlDLE1BQTRCO0NBQUEsVUFBdEJuRCxNQUFzQix1RUFBYmtELEtBQUtsRCxNQUFRO0NBQ3RDLGFBQU8sSUFBSW5XLE9BQUosQ0FBWSxtQkFBVztDQUM1Qm1XLGVBQU9FLElBQVAsQ0FBWWlELElBQVosRUFBa0I3TSxPQUFsQjtDQUNELE9BRk0sQ0FBUDtDQUdEOzs7Q0FFRCxrQkFBeUI7Q0FBQSxRQUFiNUMsTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUFBLDZFQUNqQkEsTUFEaUIsRUFDVHdQLEtBQUt2UCxRQURJLEVBQ011UCxLQUFLN1UsWUFEWDtDQUV4QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQTs7Q0FBQSxVQUF0QnFGLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7Q0FDMUIsVUFBTUcsVUFBVSxJQUFJaEssT0FBSixDQUFZLG1CQUFXO0NBQ3JDLFNBQUM2SixPQUFPMFAsSUFBUCxZQUF1QnZaLE9BQXZCLEdBQWlDNkosT0FBTzBQLElBQXhDLEdBQStDdlosUUFBUXlNLE9BQVIsQ0FBZ0I1QyxPQUFPMFAsSUFBdkIsQ0FBaEQsRUFDQ2xQLElBREQsQ0FDTSxnQkFBUTtDQUFBLGtDQUNpQixNQUFLbEQsV0FBTCxDQUFpQjtDQUM1Q2lGLHNCQUFVLElBQUlvTixZQUFKLENBQ1IzUCxPQUFPNFAsSUFEQyxFQUVSalcsT0FBT2tXLE1BQVAsQ0FDRTdQLE9BQU91QyxRQURULEVBRUU7Q0FBQ21OO0NBQUQsYUFGRixDQUZRLENBRGtDO0NBUzVDbE4sc0JBQVV4QyxPQUFPd0M7Q0FUMkIsV0FBakIsQ0FEakI7Q0FBQSxjQUNMRCxRQURLLHFCQUNMQSxRQURLO0NBQUEsY0FDS0MsUUFETCxxQkFDS0EsUUFETDs7Q0FhWkksa0JBQ0UsTUFBS3RGLFdBQUwsQ0FBaUI7Q0FDZjhELGtCQUFNLElBQUlrQixJQUFKLENBQVNDLFFBQVQsRUFBbUJDLFFBQW5CO0NBRFMsV0FBakIsRUFFR3BCLElBSEw7Q0FLRCxTQW5CRDtDQW9CRCxPQXJCZSxDQUFoQjs7Q0F1QkEsdUVBQVdqQixPQUFYOztDQUVBLGFBQU9BLE9BQVA7Q0FDRDs7Ozs7O0dBdEdnQmlDOztvREFBYm9OLG1DQXVCQ3BOLGNBQWNuQztDQUNqQjJQLFFBQU07Q0FDTkYsUUFBTTtDQUVObk4sWUFBVTtDQUNSdU4sVUFBTSxFQURFO0NBRVI1TCxZQUFRLEVBRkE7Q0FHUjZMLG1CQUFlLEVBSFA7Q0FJUkwsVUFBTSxJQUFJTSxJQUFKLEVBSkU7Q0FLUkMsa0JBQWMsS0FMTjtDQU1SQyxvQkFBZ0IsRUFOUjtDQU9SQyxlQUFXO0NBUEg7dUNBWVAvTixjQUFjekgsMEJBU0gsSUFBSXlWLFVBQUo7O0NDbkZsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F5Qk1DOzs7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EyQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EyQkEsbUJBQXlCO0NBQUE7O0NBQUEsUUFBYnJRLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIsK0VBQU1BLE1BQU4sRUFBY3FRLE1BQU1wUSxRQUFwQixFQUE4Qm9RLE1BQU0xVixZQUFwQzs7Q0FFQSxRQUFJcUYsT0FBTzBDLEtBQVgsRUFBa0I7Q0FDaEIsWUFBS0EsS0FBTCxDQUFXMUMsTUFBWDs7Q0FDQTtDQUNEOztDQU5zQjtDQU94QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QkEsTUFBc0IsdUVBQWIsS0FBS0EsTUFBUTs7Q0FBQSw4QkFDRyxLQUFLMUMsV0FBTCxDQUFpQjtDQUM1Q2lGLGtCQUFVLEtBQUtvRyxhQUFMLENBQW1CM0ksTUFBbkIsQ0FEa0M7Q0FFNUN3QyxrQkFBVXhDLE9BQU93QztDQUYyQixPQUFqQixDQURIO0NBQUEsVUFDbkJELFFBRG1CLHFCQUNuQkEsUUFEbUI7Q0FBQSxVQUNUQyxRQURTLHFCQUNUQSxRQURTOztDQU0xQixhQUFPLEtBQUtsRixXQUFMLENBQWlCO0NBQUM4RCxjQUFNLElBQUlrQixJQUFKLENBQVNDLFFBQVQsRUFBbUJDLFFBQW5CO0NBQVAsT0FBakIsRUFBdURwQixJQUE5RDtDQUNEOzs7cUNBRTBCO0NBQUEsVUFBYnBCLE1BQWEsdUVBQUosRUFBSTtDQUN6QixhQUFPLElBQUlzUSxhQUFKLENBQ0x0USxPQUFPdUMsUUFBUCxDQUFnQjZCLE1BRFgsRUFFTHBFLE9BQU91QyxRQUFQLENBQWdCZ08sSUFGWCxFQUdMdlEsT0FBT3VDLFFBQVAsQ0FBZ0JpTyxjQUhYLEVBSUx4USxPQUFPdUMsUUFBUCxDQUFnQmtPLGVBSlgsRUFLTHpRLE9BQU91QyxRQUFQLENBQWdCbU8sR0FMWCxDQUFQO0NBT0Q7Ozs7OztHQXhGaUJ0Tzs7bUNBQWRpTyxvQ0FrQkNqTyxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1I2QixZQUFRLEdBREE7Q0FFUm1NLFVBQU0sRUFGRTtDQUdSQyxvQkFBZ0IsQ0FIUjtDQUlSQyxxQkFBaUIsQ0FKVDtDQUtSQyxTQUFLOUksS0FBS0MsRUFBTCxHQUFVO0NBTFA7dUNBMEJQekYsY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUNSLFFBRFEsRUFFUixNQUZRLEVBR1IsZ0JBSFEsRUFJUixpQkFKUSxFQUtSLEtBTFE7OztDQ3RFZDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F5Qk1vTzs7O0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTZCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2QkEsdUJBQXlCO0NBQUE7O0NBQUEsUUFBYjNRLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIsbUZBQU1BLE1BQU4sRUFBYzJRLFVBQVUxUSxRQUF4QixFQUFrQzBRLFVBQVVoVyxZQUE1Qzs7Q0FFQSxRQUFJcUYsT0FBTzBDLEtBQVgsRUFBa0I7Q0FDaEIsWUFBS0EsS0FBTCxDQUFXMUMsTUFBWDs7Q0FDQTtDQUNEOztDQU5zQjtDQU94QjtDQUVEOzs7Ozs7Ozs7Ozs2QkFPNEI7Q0FBQSxVQUF0QkEsTUFBc0IsdUVBQWIsS0FBS0EsTUFBUTs7Q0FBQSw4QkFDRyxLQUFLMUMsV0FBTCxDQUFpQjtDQUM1Q2lGLGtCQUFVLEtBQUtvRyxhQUFMLENBQW1CM0ksTUFBbkIsQ0FEa0M7Q0FFNUN3QyxrQkFBVXhDLE9BQU93QztDQUYyQixPQUFqQixDQURIO0NBQUEsVUFDbkJELFFBRG1CLHFCQUNuQkEsUUFEbUI7Q0FBQSxVQUNUQyxRQURTLHFCQUNUQSxRQURTOztDQU0xQixhQUFPLEtBQUtsRixXQUFMLENBQWlCO0NBQUM4RCxjQUFNLElBQUlrQixJQUFKLENBQVNDLFFBQVQsRUFBbUJDLFFBQW5CO0NBQVAsT0FBakIsRUFBdURwQixJQUE5RDtDQUNEOzs7cUNBRTBCO0NBQUEsVUFBYnBCLE1BQWEsdUVBQUosRUFBSTtDQUN6QixVQUFNNFEsYUFBYTVRLE9BQU80SSxNQUFQLEdBQWdCaUksdUJBQWhCLEdBQTBDQyxpQkFBN0Q7Q0FFQSxhQUFPLElBQUlGLFVBQUosQ0FDTDVRLE9BQU91QyxRQUFQLENBQWdCNkIsTUFEWCxFQUVMcEUsT0FBT3VDLFFBQVAsQ0FBZ0JnTyxJQUZYLEVBR0x2USxPQUFPdUMsUUFBUCxDQUFnQmlPLGNBSFgsRUFJTHhRLE9BQU91QyxRQUFQLENBQWdCa08sZUFKWCxFQUtMelEsT0FBT3VDLFFBQVAsQ0FBZ0J3TyxDQUxYLEVBTUwvUSxPQUFPdUMsUUFBUCxDQUFnQnlPLENBTlgsQ0FBUDtDQVFEOzs7Ozs7R0EvRnFCNU87O21DQUFsQnVPLHdDQW1CQ3ZPLGNBQWNuQztDQUNqQnNDLFlBQVU7Q0FDUjZCLFlBQVEsR0FEQTtDQUVSbU0sVUFBTSxFQUZFO0NBR1JDLG9CQUFnQixFQUhSO0NBSVJDLHFCQUFpQixDQUpUO0NBS1JNLE9BQUcsQ0FMSztDQU1SQyxPQUFHO0NBTks7dUNBNEJQNU8sY0FBY3pIO0NBQ2pCNEgsWUFBVSxDQUNSLFFBRFEsRUFFUixNQUZRLEVBR1IsZ0JBSFEsRUFJUixpQkFKUSxFQUtSLEdBTFEsRUFNUixHQU5ROzs7Q0N4RWQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FvQ00wTzs7O0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMkJBOzs7Ozs7Ozs7Ozs7Ozs7O0NBMkJBLGtCQUF5QjtDQUFBOztDQUFBLFFBQWJqUixNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3ZCLDhFQUFNQSxNQUFOLEVBQWNpUixLQUFLaFIsUUFBbkIsRUFBNkJnUixLQUFLdFcsWUFBbEM7O0NBRUEsUUFBSXFGLE9BQU8wQyxLQUFYLEVBQWtCO0NBQ2hCLFlBQUtBLEtBQUwsQ0FBVzFDLE1BQVg7O0NBQ0E7Q0FDRDs7Q0FOc0I7Q0FPeEI7Q0FFRDs7Ozs7Ozs7Ozs7NkJBTzRCO0NBQUEsVUFBdEJBLE1BQXNCLHVFQUFiLEtBQUtBLE1BQVE7O0NBQUEsOEJBQ0csS0FBSzFDLFdBQUwsQ0FBaUI7Q0FDNUNpRixrQkFBVSxLQUFLb0csYUFBTCxDQUFtQjNJLE1BQW5CLENBRGtDO0NBRTVDd0Msa0JBQVV4QyxPQUFPd0M7Q0FGMkIsT0FBakIsQ0FESDtDQUFBLFVBQ25CRCxRQURtQixxQkFDbkJBLFFBRG1CO0NBQUEsVUFDVEMsUUFEUyxxQkFDVEEsUUFEUzs7Q0FNMUIsYUFBTyxLQUFLbEYsV0FBTCxDQUFpQjtDQUFDOEQsY0FBTSxJQUFJa0IsSUFBSixDQUFTQyxRQUFULEVBQW1CQyxRQUFuQjtDQUFQLE9BQWpCLEVBQXVEcEIsSUFBOUQ7Q0FDRDs7O3FDQUUwQjtDQUFBLFVBQWJwQixNQUFhLHVFQUFKLEVBQUk7Q0FDekIsVUFBTXVDLFdBQVcsS0FBS3ZDLE9BQU80SSxNQUFQLEdBQWdCc0ksa0JBQWhCLEdBQXFDQyxZQUExQyxFQUNmblIsT0FBT3VDLFFBQVAsQ0FBZ0JrTixJQURELEVBRWZ6UCxPQUFPdUMsUUFBUCxDQUFnQitHLFFBRkQsRUFHZnRKLE9BQU91QyxRQUFQLENBQWdCNkIsTUFIRCxFQUlmcEUsT0FBT3VDLFFBQVAsQ0FBZ0JxSCxjQUpELEVBS2Y1SixPQUFPdUMsUUFBUCxDQUFnQjZPLE1BTEQsQ0FBakI7Q0FRQSxhQUFPN08sUUFBUDtDQUNEOzs7Ozs7R0ExRmdCSDs7bUNBQWI2TyxtQ0FrQkM3TyxjQUFjbkM7Q0FDakJzQyxZQUFVO0NBQ1JrTixVQUFNLElBQUk0QixVQUFKLENBQWUsSUFBSXhELE9BQUosQ0FBWSxDQUFaLEVBQWUsQ0FBZixFQUFrQixDQUFsQixDQUFmLEVBQXFDLElBQUlBLE9BQUosQ0FBWSxDQUFaLEVBQWUsQ0FBZixFQUFrQixDQUFsQixDQUFyQyxDQURFO0NBRVJ2RSxjQUFVLEVBRkY7Q0FHUmxGLFlBQVEsQ0FIQTtDQUlSd0Ysb0JBQWdCLENBSlI7Q0FLUndILFlBQVE7Q0FMQTt1Q0EwQlBoUCxjQUFjekg7Q0FDakI0SCxZQUFVLENBQ1IsTUFEUSxFQUVSLFVBRlEsRUFHUixRQUhRLEVBSVIsZ0JBSlEsRUFLUixRQUxROzs7Q0N4RmQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FxQk0rTzs7O0NBQ0osc0JBQXdCO0NBQUE7O0NBQUE7O0NBQ3RCLGtGQUFNLEVBQU47O0NBRUEsU0FBSyxJQUFJaFgsSUFBSSxDQUFiLEVBQWdCQSxJQUFJLFVBQVFFLE1BQTVCLEVBQW9DRixHQUFwQyxFQUF5QztDQUN2QyxVQUFNaVgsTUFBY2pYLENBQWQsNEJBQWNBLENBQWQseUJBQWNBLENBQWQsQ0FBTjtDQUVBLFVBQUlpWCxlQUFleFIsU0FBbkIsRUFBOEJ3UixJQUFJQyxLQUFKLHNEQUE5QixLQUNLLElBQUlELGVBQWVFLFFBQW5CLEVBQTZCLE1BQUs5USxNQUFMLENBQVlLLEdBQVosQ0FBZ0J1USxHQUFoQjtDQUNuQzs7Q0FScUI7Q0FTdkI7Ozs7NkJBRU87Q0FDTixhQUFPLElBQUlFLFFBQUosRUFBUDtDQUNEOzs7Ozs7R0FkaUJyUDs7Q0N6QnBCOztDQ0FBOzs7Ozs7Ozs7O0FBVUEsS0FBYXNQLGFBQWI7Q0FBQTtDQUFBO0NBQ0UsMkJBQXVDO0NBQUEsUUFBM0JDLFNBQTJCLHVFQUFmdmUsU0FBU3dlLElBQU07O0NBQUE7O0NBQ3JDLFFBQUlELFVBQVVBLFNBQWQsRUFBeUI7Q0FDdkJwVixjQUFRb0QsSUFBUixDQUFhLHFGQUFiO0NBQ0EsV0FBS2dTLFNBQUwsR0FBaUJBLFVBQVVBLFNBQTNCO0NBQ0QsS0FIRCxNQUdPLEtBQUtBLFNBQUwsR0FBaUJBLFNBQWpCOztDQUVQLFNBQUtFLGFBQUw7Q0FDRDtDQUVEOzs7Ozs7OztDQVZGO0NBQUE7Q0FBQSxvQ0FnQmtCO0NBQ2QsV0FBS0MsT0FBTCxHQUFlOU0sT0FBTzVSLFFBQVAsQ0FBZ0J5ZSxhQUFoQixDQUE4QixLQUE5QixDQUFmO0NBRUEsV0FBS0MsT0FBTCxDQUFhQyxTQUFiLEdBQXlCLFNBQXpCO0NBQ0EsV0FBS0QsT0FBTCxDQUFhRSxLQUFiLENBQW1CL04sS0FBbkIsR0FBMkIsU0FBM0I7Q0FDQSxXQUFLNk4sT0FBTCxDQUFhRSxLQUFiLENBQW1COU4sTUFBbkIsR0FBNEIsU0FBNUI7Q0FDQSxXQUFLNE4sT0FBTCxDQUFhRSxLQUFiLENBQW1CbFAsUUFBbkIsR0FBOEIsVUFBOUI7Q0FDRDtDQXZCSDtDQUFBO0NBQUEsNEJBeUJVOUUsUUF6QlYsRUF5Qm1CO0NBQ2ZBLGVBQVE0QixHQUFSLENBQVksU0FBWixFQUF1QixLQUFLa1MsT0FBNUI7O0NBQ0E5VCxlQUFRNEIsR0FBUixDQUFZLFdBQVosRUFBeUIsS0FBSytSLFNBQTlCO0NBQ0Q7Q0E1Qkg7Q0FBQTtDQUFBLDhCQThCWU0sSUE5QlosRUE4QmtCO0NBQ2RBLFdBQUtOLFNBQUwsQ0FBZU8sV0FBZixDQUEyQkQsS0FBS0gsT0FBaEM7Q0FDRDtDQWhDSDs7Q0FBQTtDQUFBOztDQ0hBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxLQUFhSyxlQUFiO0NBQUE7Q0FBQTtDQUNFOzs7Ozs7OztDQWFBOzs7Ozs7Q0FRQSw2QkFBcUM7Q0FBQSxRQUF6Qm5TLE1BQXlCLHVFQUFoQixFQUFnQjtDQUFBLFFBQVpvUyxVQUFZOztDQUFBOztDQUFBLHNDQUYzQixJQUUyQjs7Q0FDbkMsU0FBS3BTLE1BQUwsR0FBY3JHLE9BQU9rVyxNQUFQLENBQWM7Q0FDMUI1TCxhQUFPZSxPQUFPcUQsVUFEWTtDQUUxQm5FLGNBQVFjLE9BQU9zRCxXQUZXO0NBSTFCK0osa0JBQVksSUFBSUMsT0FBSixDQUFZLENBQVosRUFBZSxDQUFmLENBSmM7Q0FLMUJDLGtCQUFZdk4sT0FBT3dOLGdCQUxPO0NBTzFCQyxlQUFTLFFBUGlCO0NBUTFCQyxpQkFBVyxDQVJlO0NBVTFCQyxnQkFBVSxFQVZnQjtDQVcxQkMsU0FYMEIsaUJBV3BCO0NBWG9CLEtBQWQsRUFZWDVTLE1BWlcsQ0FBZDtDQURtQyx1QkF3Qi9CLEtBQUtBLE1BeEIwQjtDQUFBLFFBZ0JqQ3lTLE9BaEJpQyxnQkFnQmpDQSxPQWhCaUM7Q0FBQSxRQWlCakNDLFNBakJpQyxnQkFpQmpDQSxTQWpCaUM7Q0FBQSxRQWtCakNDLFNBbEJpQyxnQkFrQmpDQSxRQWxCaUM7Q0FBQSxRQW1CakNKLFVBbkJpQyxnQkFtQmpDQSxVQW5CaUM7Q0FBQSxRQW9CakN0TyxLQXBCaUMsZ0JBb0JqQ0EsS0FwQmlDO0NBQUEsUUFxQmpDQyxNQXJCaUMsZ0JBcUJqQ0EsTUFyQmlDO0NBQUEsUUFzQmpDbU8sVUF0QmlDLGdCQXNCakNBLFVBdEJpQztDQUFBLFFBdUJqQ08sR0F2QmlDLGdCQXVCakNBLEdBdkJpQztDQTBCbkMsU0FBS0QsUUFBTCxHQUFnQixJQUFJRSxhQUFKLENBQWtCRixTQUFsQixDQUFoQjtDQUNBLFNBQUtHLE9BQUwsR0FBZSxFQUFmO0NBRUEsU0FBS0gsUUFBTCxDQUFjSSxhQUFkLENBQ0VOLE9BREYsRUFFRUMsU0FGRjtDQUtBLFFBQUlILFVBQUosRUFBZ0IsS0FBS0ksUUFBTCxDQUFjSyxhQUFkLENBQTRCVCxVQUE1QjtDQUVoQixTQUFLVSxPQUFMLENBQ0VDLE9BQU9qUCxRQUFRb08sV0FBV25QLENBQTFCLEVBQTZCaVEsT0FBN0IsRUFERixFQUVFRCxPQUFPaFAsU0FBU21PLFdBQVdsUCxDQUEzQixFQUE4QmdRLE9BQTlCLEVBRkY7O0NBS0EsU0FBSyxJQUFNdlksR0FBWCxJQUFrQndYLFVBQWxCO0NBQ0UsVUFBSUEsV0FBV3hYLEdBQVgsQ0FBSixFQUFxQixLQUFLd1ksZUFBTCxDQUFxQnhZLEdBQXJCO0NBRHZCOztDQUdBZ1ksUUFBSSxLQUFLRCxRQUFUO0NBQ0Q7Q0FFRDs7Ozs7Ozs7O0NBckVGO0NBQUE7Q0FBQSxvQ0E0RWtCbFcsSUE1RWxCLEVBNEV3QjtDQUNwQjBWLHNCQUFnQkMsVUFBaEIsQ0FBMkIzVixJQUEzQixFQUFpQ2tCLEtBQWpDLENBQXVDLElBQXZDLEVBQTZDLENBQUMsS0FBS2dWLFFBQU4sQ0FBN0M7Q0FDRDtDQUVEOzs7Ozs7Ozs7O0NBaEZGO0NBQUE7Q0FBQSxzQ0F5Rm9CYixPQXpGcEIsRUF5RjZCdUIsS0F6RjdCLEVBeUZvQy9PLE1BekZwQyxFQXlGNEM7Q0FBQTs7Q0FDeEMsV0FBSytPLEtBQUwsR0FBYUEsS0FBYjtDQUNBLFdBQUsvTyxNQUFMLEdBQWNBLE1BQWQ7Q0FDQSxXQUFLZ1AsY0FBTCxDQUFvQnhCLE9BQXBCO0NBRUEsYUFBTyxJQUFJNUwsSUFBSixDQUFTO0NBQUEsZUFBTSxNQUFLeU0sUUFBTCxDQUFjWSxNQUFkLENBQXFCLE1BQUtGLEtBQTFCLEVBQWlDLE1BQUsvTyxNQUF0QyxDQUFOO0NBQUEsT0FBVCxDQUFQO0NBQ0Q7Q0FFRDs7Ozs7Ozs7O0NBakdGO0NBQUE7Q0FBQSwyQkF5R1NrUCxPQXpHVCxFQTJHSztDQUFBOztDQUFBLFVBRllDLFVBRVosdUVBRnlCLFlBQU07Q0FDaENELGdCQUFPRCxNQUFQLENBQWMsT0FBS0YsS0FBbkIsRUFBMEIsT0FBSy9PLE1BQS9CO0NBQ0QsT0FBRTtDQUNELFdBQUtvUCxVQUFMLENBQWdCbE4sSUFBaEI7Q0FFQSxVQUFNc0osT0FBTyxLQUFLNkMsUUFBTCxDQUFjZ0IsT0FBZCxFQUFiOztDQUNBSCxjQUFPUCxPQUFQLENBQWVuRCxLQUFLN0wsS0FBcEIsRUFBMkI2TCxLQUFLNUwsTUFBaEM7O0NBRUEsVUFBTThCLE9BQU8sSUFBSUUsSUFBSixDQUFTdU4sVUFBVCxDQUFiO0NBRUEsV0FBS1gsT0FBTCxDQUFhL1UsSUFBYixDQUFrQmlJLElBQWxCO0NBQ0EsVUFBSSxLQUFLTixPQUFULEVBQWtCTSxLQUFLTyxLQUFMLENBQVcsS0FBS3FOLEdBQWhCO0NBRWxCLGFBQU8sSUFBUDtDQUNEO0NBRUQ7Ozs7Ozs7O0NBekhGO0NBQUE7Q0FBQSw0QkFnSVUzUCxLQWhJVixFQWdJaUJDLE1BaElqQixFQWdJeUI7Q0FDckIsVUFBSSxLQUFLeU8sUUFBVCxFQUFtQixLQUFLQSxRQUFMLENBQWNNLE9BQWQsQ0FBc0JoUCxLQUF0QixFQUE2QkMsTUFBN0I7Q0FDcEI7Q0FFRDs7Ozs7OztDQXBJRjtDQUFBO0NBQUEsbUNBMElpQjROLE9BMUlqQixFQTBJMEI7Q0FDdEIsVUFBTStCLFNBQVMsS0FBS2xCLFFBQUwsQ0FBY21CLFVBQTdCLENBRHNCOztDQUl0QmhDLGNBQVFJLFdBQVIsQ0FBb0IyQixNQUFwQjtDQUNBQSxhQUFPN0IsS0FBUCxDQUFhL04sS0FBYixHQUFxQixNQUFyQjtDQUNBNFAsYUFBTzdCLEtBQVAsQ0FBYTlOLE1BQWIsR0FBc0IsTUFBdEI7Q0FDRDtDQUVEOzs7Ozs7Q0FuSkY7Q0FBQTtDQUFBLDJCQXdKUztDQUNMLFdBQUt3QixPQUFMLEdBQWUsS0FBZjtDQUNBLFdBQUtnTyxVQUFMLENBQWdCbE4sSUFBaEI7Q0FDQSxXQUFLc00sT0FBTCxDQUFhM0csT0FBYixDQUFxQjtDQUFBLGVBQVFuRyxLQUFLUSxJQUFMLEVBQVI7Q0FBQSxPQUFyQjtDQUNEO0NBRUQ7Ozs7OztDQTlKRjtDQUFBO0NBQUEsMkJBbUtTO0NBQ0wsV0FBS2QsT0FBTCxHQUFlLElBQWY7Q0FDQSxXQUFLZ08sVUFBTCxDQUFnQm5OLEtBQWhCO0NBQ0EsV0FBS3VNLE9BQUwsQ0FBYTNHLE9BQWIsQ0FBcUI7Q0FBQSxlQUFRbkcsS0FBS08sS0FBTCxFQUFSO0NBQUEsT0FBckI7Q0FDRDtDQXZLSDtDQUFBO0NBQUEsNEJBeUtVdkksUUF6S1YsRUF5S21CO0NBQUE7O0NBQ2ZBLGVBQVErVixNQUFSLENBQWUsV0FBZjs7Q0FDQS9WLGVBQVE0QixHQUFSLENBQVksVUFBWixFQUF3QixLQUFLK1MsUUFBN0I7O0NBRUEsV0FBS2lCLEdBQUwsR0FBVzVWLFNBQVFZLE9BQW5CO0NBRUEsV0FBSzhVLFVBQUwsR0FBa0IsS0FBS00saUJBQUwsQ0FDaEJoVyxTQUFRTyxHQUFSLENBQVksU0FBWixDQURnQixFQUVoQlAsU0FBUU8sR0FBUixDQUFZLE9BQVosQ0FGZ0IsRUFHaEJQLFNBQVFPLEdBQVIsQ0FBWSxRQUFaLEVBQXNCb0MsTUFITixDQUFsQjs7Q0FNQTNDLGVBQVFpVyxNQUFSLENBQWU7Q0FDYm5DLGlCQUFTLDJCQUFXO0NBQ2xCLGlCQUFLd0IsY0FBTCxDQUFvQnhCLFFBQXBCO0NBQ0QsU0FIWTtDQUlidUIsZUFBTyx1QkFBUztDQUNkLGlCQUFLQSxLQUFMLEdBQWFBLE1BQWI7Q0FDRCxTQU5ZO0NBT2IvTyxnQkFBUSx5QkFBVTtDQUNoQixpQkFBS0EsTUFBTCxHQUFjQSxRQUFPM0QsTUFBckI7Q0FDRDtDQVRZLE9BQWY7Q0FXRDtDQWhNSDtDQUFBO0NBQUEsOEJBa01Zc1IsSUFsTVosRUFrTWtCO0NBQUE7O0NBQ2RBLFdBQUt5QixVQUFMLENBQWdCbk4sS0FBaEIsQ0FBc0IsSUFBdEI7Q0FDQTBMLFdBQUthLE9BQUwsQ0FBYTNHLE9BQWIsQ0FBcUI7Q0FBQSxlQUFRbkcsS0FBS08sS0FBTCxDQUFXLE1BQVgsQ0FBUjtDQUFBLE9BQXJCO0NBQ0Q7Q0FFRDs7Ozs7O0NBdk1GO0NBQUE7Q0FBQSw4QkE0TVk7Q0FDUixXQUFLQyxJQUFMO0NBQ0EsV0FBS21NLFFBQUwsQ0FBY3VCLGdCQUFkO0NBQ0Q7Q0EvTUg7O0NBQUE7Q0FBQTs7a0JBQWEvQiwrQkFRUztDQUNsQmxQLFFBRGtCLGtCQUNYMFAsUUFEVyxFQUNEO0NBQ2ZBLGFBQVN3QixTQUFULENBQW1Cek8sT0FBbkIsR0FBNkIsSUFBN0I7Q0FDRDtDQUhpQjs7Q0NqQ3RCLElBQU0wTyw0QkFBNEJDLE9BQU8sMkJBQVAsQ0FBbEM7Q0FFQTs7Ozs7OztBQU1BLEtBQWFDLFdBQWI7Q0FBQTtDQUFBO0NBQ0UseUJBQXlDO0NBQUEsUUFBN0JDLG1CQUE2Qix1RUFBUCxLQUFPOztDQUFBOztDQUN2QyxTQUFLbEIsS0FBTCxHQUFha0Isc0JBQXNCLElBQXRCLEdBQTZCLElBQUlDLEtBQUosRUFBMUM7Q0FDRDs7Q0FISDtDQUFBO0NBQUEsNEJBS1V4VyxRQUxWLEVBS21CO0NBQ2ZBLGVBQVE0QixHQUFSLENBQVksT0FBWixFQUFxQixLQUFLeVQsS0FBMUI7Q0FDRDtDQVBIO0NBQUE7Q0FBQSw4QkFTWXBCLElBVFosRUFTa0I7Q0FDZHRZLGFBQU9rVyxNQUFQLENBQ0UsSUFERixFQUVFO0NBQ1E3TyxXQURSO0NBQUE7Q0FBQTtDQUFBLDRDQUNZeEgsTUFEWjtDQUFBO0NBQUE7Q0FBQTtDQUFBO0NBQUEseUJBRVFBLE9BQU9xSCxNQUZmO0NBQUE7Q0FBQTtDQUFBOztDQUFBO0NBQUEsMkJBRTZCckgsT0FBT3FILE1BQVAsQ0FBY0MsTUFBZCxDQUFxQnRILE1BQXJCLENBRjdCOztDQUFBO0NBQUE7Q0FBQSwyQkFJVUEsT0FBTytHLElBQVAsRUFKVjs7Q0FBQTtDQUFBLHdCQU1TL0csT0FBT21ILE1BTmhCO0NBQUE7Q0FBQTtDQUFBOztDQUFBLDBCQU9ZLElBQUk3RSxnQkFBSixDQUNKLGFBREksRUFFSiwyQkFGSSxFQUdKLElBSEksQ0FQWjs7Q0FBQTtDQWNJdEMsMkJBQU9xSCxNQUFQLEdBQWdCLElBQWhCO0NBZEo7Q0FBQSwyQkFlVSxLQUFLdkQsV0FBTCxDQUFpQjtDQUFDeUQsNkJBQU92SDtDQUFSLHFCQUFqQixFQUFrQ3VILEtBZjVDOztDQUFBO0NBZ0JJa1IseUJBQUtvQixLQUFMLENBQVdyUyxHQUFYLENBQWV4SCxPQUFPbUgsTUFBdEI7Q0FDQSx5QkFBS00sUUFBTCxDQUFjbEQsSUFBZCxDQUFtQnZFLE1BQW5CO0NBakJKLHFEQW1CV0EsTUFuQlg7O0NBQUE7Q0FBQTtDQUFBO0NBQUE7Q0FBQTtDQUFBO0NBQUE7O0NBQUE7Q0FBQTtDQUFBO0NBQUE7Q0FxQlFzSCxjQXJCUjtDQUFBO0NBQUE7Q0FBQSw2Q0FxQmV0SCxNQXJCZjtDQUFBO0NBQUE7Q0FBQTtDQUFBO0NBQUEsMEJBc0JRQSxPQUFPcUgsTUFBUCxLQUFrQixJQXRCMUI7Q0FBQTtDQUFBO0NBQUE7O0NBQUE7O0NBQUE7Q0FBQTtDQUFBLDJCQXdCVXJILE9BQU8rRyxJQUFQLEVBeEJWOztDQUFBO0NBeUJJLHlCQUFLakQsV0FBTCxDQUFpQjtDQUFDbVgsZ0NBQVVqYjtDQUFYLHFCQUFqQjtDQUVBQSwyQkFBT3FILE1BQVAsR0FBZ0IsSUFBaEI7Q0FDQW9SLHlCQUFLb0IsS0FBTCxDQUFXdlMsTUFBWCxDQUFrQnRILE9BQU9tSCxNQUF6QjtDQUNBLHlCQUFLTSxRQUFMLENBQWM1RSxNQUFkLENBQXFCLEtBQUs0RSxRQUFMLENBQWM3QyxPQUFkLENBQXNCNUUsTUFBdEIsQ0FBckIsRUFBb0QsQ0FBcEQ7O0NBN0JKO0NBQUE7Q0FBQTtDQUFBO0NBQUE7Q0FBQTtDQUFBOztDQUFBO0NBQUE7Q0FBQTtDQUFBO0NBK0JFa2IsaUJBL0JGLHFCQStCWXJCLEtBL0JaLEVBK0JtQjtDQUNmLGVBQUtwUyxRQUFMLEdBQWdCb1MsTUFBTWUseUJBQU4sSUFBbUNmLE1BQU1lLHlCQUFOLEtBQW9DLEVBQXZGO0NBQ0FuQyxlQUFLb0IsS0FBTCxHQUFhQSxLQUFiO0NBQ0QsU0FsQ0g7Q0FtQ0VzQixnQkFuQ0Ysb0JBbUNXdEIsS0FuQ1gsRUFtQ2tCO0NBQ2QsZUFBS3FCLFNBQUwsQ0FBZXJCLEtBQWY7O0NBQ0EsZUFBS3JWLE9BQUwsQ0FBYTRCLEdBQWIsQ0FBaUIsT0FBakIsRUFBMEJ5VCxLQUExQjtDQUNELFNBdENIO0NBdUNFdUIsZ0JBdkNGLHNCQXVDYTtDQUNULGlCQUFPM0MsS0FBS29CLEtBQVo7Q0FDRDtDQXpDSCxPQUZGO0NBOENBLFVBQUlwQixLQUFLb0IsS0FBVCxFQUFnQixLQUFLcUIsU0FBTCxDQUFlekMsS0FBS29CLEtBQXBCO0NBQ2pCO0NBekRIOztDQUFBO0NBQUE7O0NDWkE7O0NBRUE7Ozs7OztBQU1BLEtBQWF3QixZQUFiO0NBQUE7Q0FBQTtDQUNFLDBCQUF5QjtDQUFBLFFBQWI3VSxNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3ZCLFNBQUtBLE1BQUwsR0FBY3JHLE9BQU9rVyxNQUFQLENBQWM7Q0FDMUJpRixZQUFNO0NBRG9CLEtBQWQsRUFFWDlVLE1BRlcsQ0FBZDtDQUlBLFNBQUsrVSxTQUFMLEdBQWlCLENBQUMsS0FBSzlCLE9BQUwsQ0FBYXhYLElBQWIsQ0FBa0IsSUFBbEIsQ0FBRCxDQUFqQjtDQUNEO0NBRUQ7Ozs7Ozs7Ozs7Q0FURjtDQUFBO0NBQUEsOEJBaUJpQztDQUFBLFVBQXZCd0ksS0FBdUIsdUVBQWYsQ0FBZTtDQUFBLFVBQVpDLE1BQVksdUVBQUgsQ0FBRztDQUM3QixXQUFLSSxNQUFMLENBQVkzRCxNQUFaLENBQW1COEgsTUFBbkIsR0FBNEJ4RSxRQUFRQyxNQUFwQztDQUNBLFdBQUtJLE1BQUwsQ0FBWTNELE1BQVosQ0FBbUJxVSxzQkFBbkI7Q0FFQSxVQUFJLEtBQUtDLFNBQVQsRUFBb0IsS0FBS0EsU0FBTCxDQUFlaEMsT0FBZixDQUF1QmhQLEtBQXZCLEVBQThCQyxNQUE5QjtDQUNyQjtDQUVEOzs7Ozs7OztDQXhCRjtDQUFBO0NBQUEsOEJBK0JZO0NBQUEsNEJBT0osSUFQSSxDQUVOeU4sU0FGTTtDQUFBLFVBR0p1RCxXQUhJLG1CQUdKQSxXQUhJO0NBQUEsVUFJSkMsWUFKSSxtQkFJSkEsWUFKSTtDQUFBLFVBTU45QyxVQU5NLEdBT0osSUFQSSxDQU1OQSxVQU5NO0NBU1IsVUFBTXBPLFFBQVFpUCxPQUFPZ0MsY0FBYzdDLFdBQVduUCxDQUFoQyxFQUFtQ2lRLE9BQW5DLEVBQWQ7Q0FDQSxVQUFNalAsU0FBU2dQLE9BQU9pQyxlQUFlOUMsV0FBV2xQLENBQWpDLEVBQW9DZ1EsT0FBcEMsRUFBZjtDQUVBLFdBQUs0QixTQUFMLENBQWU1SSxPQUFmLENBQXVCLGNBQU07Q0FDM0J2TyxXQUFHcUcsS0FBSCxFQUFVQyxNQUFWO0NBQ0QsT0FGRDtDQUdEO0NBRUQ7Ozs7Ozs7Q0FoREY7Q0FBQTtDQUFBLG9DQXNEa0I7Q0FDZCxXQUFLeU4sU0FBTCxHQUFpQixLQUFLeUQsWUFBTCxFQUFqQjtDQUNBLFdBQUsvQyxVQUFMLEdBQWtCLEtBQUtnRCxhQUFMLEVBQWxCO0NBRUEsVUFBSSxLQUFLclYsTUFBTCxDQUFZOFUsSUFBaEIsRUFBc0I5UCxPQUFPc1EsZ0JBQVAsQ0FBd0IsUUFBeEIsRUFBa0MsS0FBS0MsT0FBTCxDQUFhOVosSUFBYixDQUFrQixJQUFsQixDQUFsQztDQUN2QjtDQUVEOzs7Ozs7OztDQTdERjtDQUFBO0NBQUEsZ0NBb0Vjb0MsSUFwRWQsRUFvRW9CO0NBQ2hCLFdBQUtrWCxTQUFMLENBQWVoWCxJQUFmLENBQW9CRixJQUFwQjtDQUNEO0NBdEVIO0NBQUE7Q0FBQSw0QkF3RVVHLFFBeEVWLEVBd0VtQjtDQUFBOztDQUNmQSxlQUFRK1YsTUFBUixDQUFlLFFBQWY7O0NBRUEsV0FBS2tCLFNBQUwsR0FBaUJqWCxTQUFRTyxHQUFSLENBQVksVUFBWixDQUFqQjtDQUNBLFdBQUsrRixNQUFMLEdBQWN0RyxTQUFRTyxHQUFSLENBQVksUUFBWixDQUFkOztDQUVBLFdBQUs4VyxhQUFMLEdBQXFCO0NBQUEsZUFBTXJYLFNBQVE4QixHQUFSLENBQVksV0FBWixFQUF5QkUsTUFBekIsQ0FBZ0NxUyxVQUF0QztDQUFBLE9BQXJCOztDQUNBLFdBQUsrQyxZQUFMLEdBQW9CO0NBQUEsZUFBTXBYLFNBQVFPLEdBQVIsQ0FBWSxXQUFaLENBQU47Q0FBQSxPQUFwQjs7Q0FFQVAsZUFBUWlXLE1BQVIsQ0FBZTtDQUNidEMsbUJBQVcsK0JBQWE7Q0FDdEIsZ0JBQUtBLFNBQUwsR0FBaUJBLFVBQWpCO0NBQ0Q7Q0FIWSxPQUFmOztDQU1BLFdBQUs2RCxhQUFMO0NBQ0Q7Q0F4Rkg7O0NBQUE7Q0FBQTs7Q0NOQSxJQUFNQyxXQUFXLHNvQkFBakI7Q0FDQSxJQUFNQyxTQUFTLHFKQUFmO0NBRUE7Ozs7QUFJQSxLQUFhQywwQkFBYjtDQUFBO0NBQUE7Q0FFQzs7O0NBSUEsd0NBQWM7Q0FBQTs7Q0FBQSxtR0FFUDtDQUVMdlcsWUFBTSw0QkFGRDtDQUlMd1csZUFBUztDQUVSQyx1QkFBZTtDQUZQLE9BSko7Q0FVTEMsZ0JBQVU7Q0FFVEMsc0JBQWMsSUFBSUMsT0FBSixDQUFZLElBQVosQ0FGTDtDQUdUQyxxQkFBYSxJQUFJRCxPQUFKLENBQVksSUFBWixDQUhKO0NBSVRFLHNCQUFjLElBQUlGLE9BQUosQ0FBWSxJQUFaLENBSkw7Q0FLVEcsZUFBTyxJQUFJSCxPQUFKLENBQVksR0FBWixDQUxFO0NBTVRJLGFBQUssSUFBSUosT0FBSixDQUFZLEdBQVo7Q0FOSSxPQVZMO0NBb0JMSyxzQkFBZ0JaLFFBcEJYO0NBcUJMYSxvQkFBY1osTUFyQlQ7Q0F1QkxhLGtCQUFZLEtBdkJQO0NBd0JMQyxpQkFBVztDQXhCTixLQUZPO0NBOEJiOztDQXBDRjs7Q0FBQTtDQUFBLEVBQWdEQyxjQUFoRDs7Q0NQQSxJQUFNaEIsYUFBVyw2bEtBQWpCO0NBQ0EsSUFBTUMsV0FBUyxxSkFBZjtDQUVBOzs7Ozs7O0FBT0EsS0FBYWdCLGFBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7Ozs7Ozs7Q0FXQSx5QkFBWXBTLE1BQVosRUFBa0M7Q0FBQTs7Q0FBQSxRQUFkb0csT0FBYyx1RUFBSixFQUFJOztDQUFBOztDQUVqQyxRQUFNaU0sV0FBV2hkLE9BQU9rVyxNQUFQLENBQWM7Q0FDOUIrRyxhQUFPLEdBRHVCO0NBRTlCQyxXQUFLLElBRnlCO0NBRzlCQyxnQkFBVSxLQUhvQjtDQUk5QkMsZUFBUztDQUpxQixLQUFkLEVBS2RyTSxPQUxjLENBQWpCO0NBT0EsdUZBQU07Q0FFTHRMLFlBQU0sZUFGRDtDQUlMMFcsZ0JBQVU7Q0FFVGtCLG9CQUFZLElBQUloQixPQUFKLENBQVksR0FBWixDQUZIO0NBR1RpQixtQkFBVyxJQUFJakIsT0FBSixDQUFZLElBQVosQ0FIRjtDQUlUdk4sZ0JBQVEsSUFBSXVOLE9BQUosQ0FBWSxHQUFaLENBSkM7Q0FNVGtCLGtCQUFVLElBQUlsQixPQUFKLENBQVksSUFBWixDQU5EO0NBT1RtQixnQkFBUSxJQUFJbkIsT0FBSixDQUFZLElBQVosQ0FQQztDQVNUWSxlQUFPLElBQUlaLE9BQUosQ0FBWVcsU0FBU0MsS0FBckIsQ0FURTtDQVVUQyxhQUFLLElBQUliLE9BQUosQ0FBWVcsU0FBU0UsR0FBckIsQ0FWSTtDQVdUQyxrQkFBVSxJQUFJZCxPQUFKLENBQVlXLFNBQVNHLFFBQXJCLENBWEQ7Q0FZVEMsaUJBQVMsSUFBSWYsT0FBSixDQUFZVyxTQUFTSSxPQUFyQjtDQVpBLE9BSkw7Q0FvQkxWLHNCQUFnQlosVUFwQlg7Q0FxQkxhLG9CQUFjWixRQXJCVDtDQXVCTGEsa0JBQVksS0F2QlA7Q0F3QkxDLGlCQUFXO0NBeEJOLEtBQU47O0NBNEJBLFVBQUtZLG1CQUFMLENBQXlCOVMsTUFBekI7O0NBckNpQztDQXVDakM7Q0FFRDs7Ozs7OztDQXRERDtDQUFBO0NBQUEsMENBNERvQztDQUFBLFVBQWZBLE1BQWUsdUVBQU4sSUFBTTs7Q0FFbEMsVUFBR0EsV0FBVyxJQUFkLEVBQW9CO0NBRW5CLGFBQUt3UixRQUFMLENBQWNrQixVQUFkLENBQXlCOVUsS0FBekIsR0FBaUNvQyxPQUFPQyxJQUF4QztDQUNBLGFBQUt1UixRQUFMLENBQWNtQixTQUFkLENBQXdCL1UsS0FBeEIsR0FBZ0NvQyxPQUFPRSxHQUF2QztDQUNBLGFBQUtzUixRQUFMLENBQWNyTixNQUFkLENBQXFCdkcsS0FBckIsR0FBNkJvQyxPQUFPbUUsTUFBcEM7Q0FFQTtDQUVEO0NBdEVGOztDQUFBOztDQUFBO0NBQUEsRUFBbUNnTyxjQUFuQzs7Q0NWQSxJQUFNaEIsYUFBVyxpc0RBQWpCO0NBQ0EsSUFBTUMsV0FBUyxnaEJBQWY7Q0FFQTs7Ozs7O0FBTUEsS0FBYTJCLGtCQUFiO0NBQUE7Q0FBQTtDQUVDOzs7OztDQU1BLGdDQUF1QztDQUFBLFFBQTNCQyxTQUEyQix1RUFBZixJQUFJaEYsT0FBSixFQUFlOztDQUFBOztDQUFBLDJGQUVoQztDQUVMbFQsWUFBTSxvQkFGRDtDQUlMd1csZUFBUztDQUVSMkIsd0JBQWdCO0NBRlIsT0FKSjtDQVVMekIsZ0JBQVU7Q0FFVG9CLGtCQUFVLElBQUlsQixPQUFKLENBQVksSUFBWixDQUZEO0NBR1RzQixtQkFBVyxJQUFJdEIsT0FBSixDQUFZc0IsU0FBWjtDQUhGLE9BVkw7Q0FpQkxqQixzQkFBZ0JaLFVBakJYO0NBa0JMYSxvQkFBY1osUUFsQlQ7Q0FvQkxhLGtCQUFZLEtBcEJQO0NBcUJMQyxpQkFBVztDQXJCTixLQUZnQztDQTJCdEM7Q0FFRDs7Ozs7Ozs7Ozs7Ozs7OztDQXJDRDtDQUFBO0NBQUEsOENBb0QyQmdCLFNBcEQzQixFQW9Ec0M7Q0FFcEMsV0FBSzVCLE9BQUwsQ0FBYTJCLGNBQWIsR0FBOEJDLFVBQVVyRSxPQUFWLENBQWtCLEdBQWxCLENBQTlCO0NBRUEsV0FBS3NFLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQTFERjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQXdDaEIsY0FBeEM7O0NDVEEsSUFBTWhCLGFBQVcsNm5CQUFqQjtDQUNBLElBQU1DLFdBQVMscUpBQWY7Q0FFQTs7Ozs7Ozs7OztBQVVBLEtBQWFnQyxlQUFiO0NBQUE7Q0FBQTtDQUVDOzs7OztDQU1BLDZCQUFnQztDQUFBOztDQUFBLFFBQXBCQyxVQUFvQix1RUFBUCxLQUFPOztDQUFBOztDQUUvQix5RkFBTTtDQUVMdlksWUFBTSxpQkFGRDtDQUlMMFcsZ0JBQVU7Q0FFVDhCLGtCQUFVLElBQUk1QixPQUFKLENBQVksSUFBWixDQUZEO0NBR1Q2QixrQkFBVSxJQUFJN0IsT0FBSixDQUFZLElBQVosQ0FIRDtDQUtUOEIsa0JBQVUsSUFBSTlCLE9BQUosQ0FBWSxHQUFaLENBTEQ7Q0FNVCtCLGtCQUFVLElBQUkvQixPQUFKLENBQVksR0FBWjtDQU5ELE9BSkw7Q0FjTEssc0JBQWdCWixVQWRYO0NBZUxhLG9CQUFjWixRQWZUO0NBaUJMYSxrQkFBWSxLQWpCUDtDQWtCTEMsaUJBQVc7Q0FsQk4sS0FBTjs7Q0FzQkEsVUFBS3dCLG9CQUFMLENBQTBCTCxVQUExQjs7Q0F4QitCO0NBMEIvQjtDQUVEOzs7Ozs7O0NBcENEO0NBQUE7Q0FBQSx5Q0EwQ3NCalMsT0ExQ3RCLEVBMEMrQjtDQUU3QixVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhcUMsV0FBYixHQUEyQixHQUEzQjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBS3JDLE9BQUwsQ0FBYXFDLFdBQXBCO0NBRUE7O0NBRUQsV0FBS1IsV0FBTCxHQUFtQixJQUFuQjtDQUVBO0NBeERGOztDQUFBOztDQUFBO0NBQUEsRUFBcUNoQixjQUFyQzs7Q0NiQSxJQUFNaEIsYUFBVyxzbkJBQWpCO0NBQ0EsSUFBTUMsV0FBUyw0aEJBQWY7Q0FFQTs7Ozs7Ozs7Ozs7Ozs7QUFjQSxLQUFhd0MsbUJBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7O0NBTUEsaUNBQXVDO0NBQUE7O0NBQUEsUUFBM0JaLFNBQTJCLHVFQUFmLElBQUloRixPQUFKLEVBQWU7O0NBQUE7O0NBRXRDLDZGQUFNO0NBRUxsVCxZQUFNLHFCQUZEO0NBSUwwVyxnQkFBVTtDQUVUb0Isa0JBQVUsSUFBSWxCLE9BQUosQ0FBWSxJQUFaLENBRkQ7Q0FHVHNCLG1CQUFXLElBQUl0QixPQUFKLENBQVksSUFBSTFELE9BQUosRUFBWixDQUhGO0NBSVQ2Rix1QkFBZSxJQUFJbkMsT0FBSixDQUFZLElBQUkxRCxPQUFKLEVBQVosQ0FKTjtDQUtUOEYsZ0JBQVEsSUFBSXBDLE9BQUosQ0FBWSxHQUFaO0NBTEMsT0FKTDtDQWFMSyxzQkFBZ0JaLFVBYlg7Q0FjTGEsb0JBQWNaLFFBZFQ7Q0FnQkxhLGtCQUFZLEtBaEJQO0NBaUJMQyxpQkFBVztDQWpCTixLQUFOOztDQXFCQSxVQUFLNkIsWUFBTCxDQUFrQmYsVUFBVXBVLENBQTVCLEVBQStCb1UsVUFBVW5VLENBQXpDO0NBRUE7Ozs7Ozs7O0NBT0EsVUFBS21WLFVBQUwsR0FBa0JDLFdBQVdDLEtBQTdCO0NBaENzQztDQWtDdEM7Q0FFRDs7Ozs7OztDQTVDRDtDQUFBO0NBQUEsZ0NBa0RhO0NBRVgsYUFBT0MsY0FBYyxLQUFLSCxVQUFuQixDQUFQO0NBRUE7Q0FFRDs7Ozs7OztDQXhERDtDQUFBO0NBQUEsaUNBK0RjcFYsQ0EvRGQsRUErRGlCQyxDQS9EakIsRUErRG9CO0NBRWxCLFdBQUsyUyxRQUFMLENBQWN3QixTQUFkLENBQXdCcFYsS0FBeEIsQ0FBOEJ0QyxHQUE5QixDQUFrQ3NELENBQWxDLEVBQXFDQyxDQUFyQztDQUNBLFdBQUsyUyxRQUFMLENBQWNxQyxhQUFkLENBQTRCalcsS0FBNUIsQ0FBa0N0QyxHQUFsQyxDQUFzQ3NELENBQXRDLEVBQXlDQyxDQUF6QyxFQUE0Q3VWLGNBQTVDLENBQTJELEdBQTNEO0NBRUE7Q0FwRUY7O0NBQUE7O0NBQUE7Q0FBQSxFQUF5Q2pDLGNBQXpDO0NBd0VBOzs7Ozs7O0NBT0EsSUFBTWdDLGdCQUFnQixDQUNyQixJQUFJOU0sWUFBSixDQUFpQixDQUFDLEdBQUQsRUFBTSxHQUFOLENBQWpCLENBRHFCLEVBRXJCLElBQUlBLFlBQUosQ0FBaUIsQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsQ0FBakIsQ0FGcUIsRUFHckIsSUFBSUEsWUFBSixDQUFpQixDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFqQixDQUhxQixFQUlyQixJQUFJQSxZQUFKLENBQWlCLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCLEdBQWhCLEVBQXFCLEdBQXJCLENBQWpCLENBSnFCLEVBS3JCLElBQUlBLFlBQUosQ0FBaUIsQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsRUFBZ0IsR0FBaEIsRUFBcUIsR0FBckIsRUFBMEIsR0FBMUIsRUFBK0IsR0FBL0IsQ0FBakIsQ0FMcUIsRUFNckIsSUFBSUEsWUFBSixDQUFpQixDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixFQUFxQixHQUFyQixFQUEwQixHQUExQixFQUErQixHQUEvQixFQUFvQyxHQUFwQyxFQUF5QyxHQUF6QyxFQUE4QyxJQUE5QyxDQUFqQixDQU5xQixDQUF0QjtDQVNBOzs7Ozs7Ozs7Ozs7QUFZQSxDQUFPLElBQU00TSxhQUFhO0NBRXpCSSxjQUFZLENBRmE7Q0FHekJDLFNBQU8sQ0FIa0I7Q0FJekJDLFVBQVEsQ0FKaUI7Q0FLekJMLFNBQU8sQ0FMa0I7Q0FNekJNLGNBQVksQ0FOYTtDQU96QkMsUUFBTTtDQVBtQixDQUFuQjs7Q0NySFAsSUFBTXRELGFBQVcsdU1BQWpCO0NBQ0EsSUFBTUMsV0FBUyxxSkFBZjtDQUVBOzs7O0FBSUEsS0FBYXNELFlBQWI7Q0FBQTtDQUFBO0NBRUM7OztDQUlBLDBCQUFjO0NBQUE7O0NBQUEscUZBRVA7Q0FFTDVaLFlBQU0sY0FGRDtDQUlMMFcsZ0JBQVU7Q0FFVG9CLGtCQUFVLElBQUlsQixPQUFKLENBQVksSUFBWixDQUZEO0NBR1RpRCxpQkFBUyxJQUFJakQsT0FBSixDQUFZLEdBQVo7Q0FIQSxPQUpMO0NBV0xLLHNCQUFnQlosVUFYWDtDQVlMYSxvQkFBY1osUUFaVDtDQWNMYSxrQkFBWSxLQWRQO0NBZUxDLGlCQUFXO0NBZk4sS0FGTztDQXFCYjs7Q0EzQkY7O0NBQUE7Q0FBQSxFQUFrQ0MsY0FBbEM7O0NDUEEsSUFBTWhCLGFBQVcsczVCQUFqQjtDQUNBLElBQU1DLFdBQVMsd2ZBQWY7Q0FFQTs7OztBQUlBLEtBQWF3RCx1QkFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7O0NBT0EscUNBQXlDO0NBQUE7O0NBQUEsUUFBN0JDLFlBQTZCLHVFQUFkLElBQWM7Q0FBQSxRQUFSN1UsTUFBUTs7Q0FBQTs7Q0FFeEMsaUdBQU07Q0FFTGxGLFlBQU0seUJBRkQ7Q0FJTDBXLGdCQUFVO0NBRVRxQixnQkFBUSxJQUFJbkIsT0FBSixDQUFZbUQsWUFBWixDQUZDO0NBR1RuQyxvQkFBWSxJQUFJaEIsT0FBSixDQUFZLEdBQVosQ0FISDtDQUlUaUIsbUJBQVcsSUFBSWpCLE9BQUosQ0FBWSxJQUFaO0NBSkYsT0FKTDtDQVlMSyxzQkFBZ0JaLFVBWlg7Q0FhTGEsb0JBQWNaLFFBYlQ7Q0FlTGEsa0JBQVksS0FmUDtDQWdCTEMsaUJBQVcsS0FoQk47Q0FrQkw0QyxvQkFBYyxJQWxCVDtDQW1CTEMsZ0JBQVU7Q0FuQkwsS0FBTjs7Q0F1QkEsVUFBS2pDLG1CQUFMLENBQXlCOVMsTUFBekI7O0NBekJ3QztDQTJCeEM7Q0FFRDs7Ozs7OztDQXRDRDtDQUFBO0NBQUEsMENBNENvQztDQUFBLFVBQWZBLE1BQWUsdUVBQU4sSUFBTTs7Q0FFbEMsVUFBR0EsV0FBVyxJQUFkLEVBQW9CO0NBRW5CLGFBQUt3UixRQUFMLENBQWNrQixVQUFkLENBQXlCOVUsS0FBekIsR0FBaUNvQyxPQUFPQyxJQUF4QztDQUNBLGFBQUt1UixRQUFMLENBQWNtQixTQUFkLENBQXdCL1UsS0FBeEIsR0FBZ0NvQyxPQUFPRSxHQUF2Qzs7Q0FFQSxZQUFHRixrQkFBa0JpRSxpQkFBckIsRUFBd0M7Q0FFdkMsZUFBS3FOLE9BQUwsQ0FBYTBELGtCQUFiLEdBQWtDLEdBQWxDO0NBRUEsU0FKRCxNQUlPO0NBRU4saUJBQU8sS0FBSzFELE9BQUwsQ0FBYTBELGtCQUFwQjtDQUVBO0NBRUQ7Q0FFRDtDQS9ERjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQTZDN0MsY0FBN0M7O0NDUEEsSUFBTWhCLGFBQVcscXhCQUFqQjtDQUNBLElBQU1DLFdBQVMsNlFBQWY7Q0FFQTs7OztBQUlBLEtBQWE2RCxpQkFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Ozs7O0NBVUEsK0JBQTBCO0NBQUE7O0NBQUEsUUFBZDdPLE9BQWMsdUVBQUosRUFBSTs7Q0FBQTs7Q0FFekIsUUFBTWlNLFdBQVdoZCxPQUFPa1csTUFBUCxDQUFjO0NBQzlCMkosZUFBUyxLQURxQjtDQUU5QjlSLGFBQU8sSUFGdUI7Q0FHOUIxRSxhQUFPLEdBSHVCO0NBSTlCNkQsaUJBQVc7Q0FKbUIsS0FBZCxFQUtkNkQsT0FMYyxDQUFqQjtDQU9BLDJGQUFNO0NBRUx0TCxZQUFNLG1CQUZEO0NBSUwwVyxnQkFBVTtDQUVUb0Isa0JBQVUsSUFBSWxCLE9BQUosQ0FBWSxJQUFaLENBRkQ7Q0FJVHRPLGVBQU8sSUFBSXNPLE9BQUosQ0FBWVcsU0FBU2pQLEtBQXJCLENBSkU7Q0FLVDFFLGVBQU8sSUFBSWdULE9BQUosQ0FBWVcsU0FBUzNULEtBQXJCLENBTEU7Q0FNVDZELG1CQUFXLElBQUltUCxPQUFKLENBQVlXLFNBQVM5UCxTQUFyQixDQU5GO0NBUVQ0UyxzQkFBYyxJQUFJekQsT0FBSixDQUFZLElBQUkwRCxPQUFKLENBQVksR0FBWixFQUFpQixHQUFqQixFQUFzQixHQUF0QixFQUEyQixHQUEzQixDQUFaO0NBUkwsT0FKTDtDQWdCTHJELHNCQUFnQlosVUFoQlg7Q0FpQkxhLG9CQUFjWixRQWpCVDtDQW1CTGEsa0JBQVksS0FuQlA7Q0FvQkxDLGlCQUFXO0NBcEJOLEtBQU47O0NBd0JBLFVBQUttRCxpQkFBTCxDQUF1QmhELFNBQVM2QyxPQUFoQzs7Q0FqQ3lCO0NBbUN6QjtDQUVEOzs7Ozs7O0NBakREO0NBQUE7Q0FBQSxzQ0F1RG1COVQsT0F2RG5CLEVBdUQ0QjtDQUUxQixVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhZ0UsT0FBYixHQUF1QixHQUF2QjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBS2hFLE9BQUwsQ0FBYWdFLE9BQXBCO0NBRUE7O0NBRUQsV0FBS25DLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQXJFRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQXVDaEIsY0FBdkM7O0NDUEEsSUFBTWhCLGFBQVcseWdHQUFqQjtDQUNBLElBQU1DLFdBQVMscUpBQWY7Q0FFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxLQUFhbUUsWUFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxQkEsMEJBQTBCO0NBQUE7O0NBQUEsUUFBZG5QLE9BQWMsdUVBQUosRUFBSTs7Q0FBQTs7Q0FFekIsUUFBTWlNLFdBQVdoZCxPQUFPa1csTUFBUCxDQUFjO0NBRTlCOEgsa0JBQVksSUFGa0I7Q0FHOUJtQyxhQUFPLElBSHVCO0NBSTlCQyxpQkFBVyxJQUptQjtDQUs5QkMsWUFBTSxLQUx3QjtDQU85QkMsaUJBQVcsS0FQbUI7Q0FROUJDLGFBQU8sS0FSdUI7Q0FTOUJDLGdCQUFVLEtBVG9CO0NBVTlCQyxhQUFPLEtBVnVCO0NBWTlCQyxzQkFBZ0IsR0FaYztDQWE5QkMseUJBQW1CLElBYlc7Q0FjOUJDLHFCQUFlLEdBZGU7Q0FlOUJDLDBCQUFvQixHQWZVO0NBZ0I5QkMsc0JBQWdCLEdBaEJjO0NBa0I5QkMsc0JBQWdCLEdBbEJjO0NBbUI5QkMsd0JBQWtCO0NBbkJZLEtBQWQsRUFxQmRqUSxPQXJCYyxDQUFqQjtDQXVCQSxzRkFBTTtDQUVMdEwsWUFBTSxjQUZEO0NBSUwwVyxnQkFBVTtDQUVUb0Isa0JBQVUsSUFBSWxCLE9BQUosQ0FBWSxJQUFaLENBRkQ7Q0FHVDRFLGNBQU0sSUFBSTVFLE9BQUosQ0FBWSxHQUFaLENBSEc7Q0FLVHFFLHdCQUFnQixJQUFJckUsT0FBSixDQUFZVyxTQUFTMEQsY0FBckIsQ0FMUDtDQU1UQywyQkFBbUIsSUFBSXRFLE9BQUosQ0FBWVcsU0FBUzJELGlCQUFyQixDQU5WO0NBT1RDLHVCQUFlLElBQUl2RSxPQUFKLENBQVlXLFNBQVM0RCxhQUFyQixDQVBOO0NBU1RNLHVCQUFlLElBQUk3RSxPQUFKLENBQVksR0FBWixDQVROO0NBVVQ4RSxtQkFBVyxJQUFJOUUsT0FBSixDQUFZLElBQUkxRCxPQUFKLEVBQVosQ0FWRjtDQVdUeUksdUJBQWUsSUFBSS9FLE9BQUosQ0FBWSxHQUFaLENBWE47Q0FhVHdFLDRCQUFvQixJQUFJeEUsT0FBSixDQUFZVyxTQUFTNkQsa0JBQXJCLENBYlg7Q0FjVEMsd0JBQWdCLElBQUl6RSxPQUFKLENBQVlXLFNBQVM4RCxjQUFyQixDQWRQO0NBZ0JUQyx3QkFBZ0IsSUFBSTFFLE9BQUosQ0FBWVcsU0FBUytELGNBQXJCLENBaEJQO0NBaUJUQywwQkFBa0IsSUFBSTNFLE9BQUosQ0FBWVcsU0FBU2dFLGdCQUFyQjtDQWpCVCxPQUpMO0NBeUJMdEUsc0JBQWdCWixVQXpCWDtDQTBCTGEsb0JBQWNaLFFBMUJUO0NBNEJMYSxrQkFBWSxLQTVCUDtDQTZCTEMsaUJBQVc7Q0E3Qk4sS0FBTjs7Q0FpQ0EsVUFBS3dCLG9CQUFMLENBQTBCckIsU0FBU2dCLFVBQW5DOztDQUNBLFVBQUtxRCxlQUFMLENBQXFCckUsU0FBU21ELEtBQTlCOztDQUNBLFVBQUttQixtQkFBTCxDQUF5QnRFLFNBQVNvRCxTQUFsQzs7Q0FDQSxVQUFLbUIsY0FBTCxDQUFvQnZFLFNBQVNxRCxJQUE3Qjs7Q0FDQSxVQUFLbUIsbUJBQUwsQ0FBeUJ4RSxTQUFTc0QsU0FBbEM7O0NBQ0EsVUFBS21CLGVBQUwsQ0FBcUJ6RSxTQUFTdUQsS0FBOUI7O0NBQ0EsVUFBS21CLGtCQUFMLENBQXdCMUUsU0FBU3dELFFBQWpDOztDQUNBLFVBQUttQixlQUFMLENBQXFCM0UsU0FBU3lELEtBQTlCOztDQWpFeUI7Q0FtRXpCO0NBRUQ7Ozs7Ozs7Q0E1RkQ7Q0FBQTtDQUFBLHlDQWtHc0IxVSxPQWxHdEIsRUFrRytCO0NBRTdCLFVBQUdBLE9BQUgsRUFBWTtDQUVYLGFBQUtrUSxPQUFMLENBQWFxQyxXQUFiLEdBQTJCLEdBQTNCO0NBRUEsT0FKRCxNQUlPO0NBRU4sZUFBTyxLQUFLckMsT0FBTCxDQUFhcUMsV0FBcEI7Q0FFQTs7Q0FFRCxXQUFLUixXQUFMLEdBQW1CLElBQW5CO0NBRUE7Q0FFRDs7Ozs7O0NBbEhEO0NBQUE7Q0FBQSxvQ0F3SGlCL1IsT0F4SGpCLEVBd0gwQjtDQUV4QixVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhMkYsS0FBYixHQUFxQixHQUFyQjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBSzNGLE9BQUwsQ0FBYTJGLEtBQXBCO0NBRUE7O0NBRUQsV0FBSzlELFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQUVEOzs7Ozs7Q0F4SUQ7Q0FBQTtDQUFBLHdDQThJcUIvUixPQTlJckIsRUE4SThCO0NBRTVCLFVBQUdBLE9BQUgsRUFBWTtDQUVYLGFBQUtrUSxPQUFMLENBQWE0RixTQUFiLEdBQXlCLEdBQXpCO0NBRUEsT0FKRCxNQUlPO0NBRU4sZUFBTyxLQUFLNUYsT0FBTCxDQUFhNEYsU0FBcEI7Q0FFQTs7Q0FFRCxXQUFLL0QsV0FBTCxHQUFtQixJQUFuQjtDQUVBO0NBRUQ7Ozs7OztDQTlKRDtDQUFBO0NBQUEsbUNBb0tnQi9SLE9BcEtoQixFQW9LeUI7Q0FFdkIsVUFBR0EsT0FBSCxFQUFZO0NBRVgsYUFBS2tRLE9BQUwsQ0FBYTZGLElBQWIsR0FBb0IsR0FBcEI7Q0FFQSxPQUpELE1BSU87Q0FFTixlQUFPLEtBQUs3RixPQUFMLENBQWE2RixJQUFwQjtDQUVBOztDQUVELFdBQUtoRSxXQUFMLEdBQW1CLElBQW5CO0NBRUE7Q0FFRDs7Ozs7O0NBcExEO0NBQUE7Q0FBQSx3Q0EwTHFCL1IsT0ExTHJCLEVBMEw4QjtDQUU1QixVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhOEYsU0FBYixHQUF5QixHQUF6QjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBSzlGLE9BQUwsQ0FBYThGLFNBQXBCO0NBRUE7O0NBRUQsV0FBS2pFLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQUVEOzs7Ozs7Q0ExTUQ7Q0FBQTtDQUFBLG9DQWdOaUIvUixPQWhOakIsRUFnTjBCO0NBRXhCLFVBQUdBLE9BQUgsRUFBWTtDQUVYLGFBQUtrUSxPQUFMLENBQWErRixLQUFiLEdBQXFCLEdBQXJCO0NBRUEsT0FKRCxNQUlPO0NBRU4sZUFBTyxLQUFLL0YsT0FBTCxDQUFhK0YsS0FBcEI7Q0FFQTs7Q0FFRCxXQUFLbEUsV0FBTCxHQUFtQixJQUFuQjtDQUVBO0NBRUQ7Ozs7OztDQWhPRDtDQUFBO0NBQUEsdUNBc09vQi9SLE9BdE9wQixFQXNPNkI7Q0FFM0IsVUFBR0EsT0FBSCxFQUFZO0NBRVgsYUFBS2tRLE9BQUwsQ0FBYWdHLFFBQWIsR0FBd0IsR0FBeEI7Q0FFQSxPQUpELE1BSU87Q0FFTixlQUFPLEtBQUtoRyxPQUFMLENBQWFnRyxRQUFwQjtDQUVBOztDQUVELFdBQUtuRSxXQUFMLEdBQW1CLElBQW5CO0NBRUE7Q0FFRDs7Ozs7Ozs7Q0F0UEQ7Q0FBQTtDQUFBLG9DQThQaUIvUixPQTlQakIsRUE4UDBCO0NBRXhCLFVBQUdBLE9BQUgsRUFBWTtDQUVYLGFBQUtrUSxPQUFMLENBQWFpRyxLQUFiLEdBQXFCLEdBQXJCO0NBRUEsT0FKRCxNQUlPO0NBRU4sZUFBTyxLQUFLakcsT0FBTCxDQUFhaUcsS0FBcEI7Q0FFQTs7Q0FFRCxXQUFLcEUsV0FBTCxHQUFtQixJQUFuQjtDQUVBO0NBNVFGOztDQUFBOztDQUFBO0NBQUEsRUFBa0NoQixjQUFsQzs7Q0N6QkEsSUFBTWhCLGFBQVcsbTZEQUFqQjtDQUNBLElBQU1DLFdBQVMscUpBQWY7Q0FFQTs7Ozs7OztBQU9BLEtBQWFvRyxjQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Q0FJQSw0QkFBYztDQUFBOztDQUFBLHVGQUVQO0NBRUwxYyxZQUFNLGdCQUZEO0NBSUwwVyxnQkFBVTtDQUVUb0Isa0JBQVUsSUFBSWxCLE9BQUosQ0FBWSxJQUFaLENBRkQ7Q0FHVCtGLGtCQUFVLElBQUkvRixPQUFKLENBQVksSUFBWixDQUhEO0NBS1QvWCxnQkFBUSxJQUFJK1gsT0FBSixDQUFZLENBQVosQ0FMQztDQU9UZ0csZ0JBQVEsSUFBSWhHLE9BQUosQ0FBWSxHQUFaLENBUEM7Q0FRVHRPLGVBQU8sSUFBSXNPLE9BQUosQ0FBWSxJQUFaLENBUkU7Q0FTVGlHLGNBQU0sSUFBSWpHLE9BQUosQ0FBWSxJQUFaLENBVEc7Q0FVVGtHLGVBQU8sSUFBSWxHLE9BQUosQ0FBWSxJQUFaLENBVkU7Q0FXVG1HLGVBQU8sSUFBSW5HLE9BQUosQ0FBWSxJQUFaLENBWEU7Q0FZVG9HLHFCQUFhLElBQUlwRyxPQUFKLENBQVksR0FBWixDQVpKO0NBYVRxRyxxQkFBYSxJQUFJckcsT0FBSixDQUFZLEdBQVosQ0FiSjtDQWNUc0csY0FBTSxJQUFJdEcsT0FBSixDQUFZLElBQVo7Q0FkRyxPQUpMO0NBc0JMSyxzQkFBZ0JaLFVBdEJYO0NBdUJMYSxvQkFBY1osUUF2QlQ7Q0F5QkxhLGtCQUFZLEtBekJQO0NBMEJMQyxpQkFBVztDQTFCTixLQUZPO0NBZ0NiOztDQXRDRjs7Q0FBQTtDQUFBLEVBQW9DQyxjQUFwQzs7Q0NWQSxJQUFNaEIsY0FBVyx5dENBQWpCO0NBQ0EsSUFBTUMsWUFBUyxxSkFBZjtDQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLEtBQWE2RyxlQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7Ozs7O0NBV0EsNkJBQTBCO0NBQUEsUUFBZDdSLE9BQWMsdUVBQUosRUFBSTs7Q0FBQTs7Q0FFekIsUUFBTWlNLFdBQVdoZCxPQUFPa1csTUFBUCxDQUFjO0NBQzlCMk0sZ0JBQVUsR0FEb0I7Q0FFOUJDLGVBQVMsSUFGcUI7Q0FHOUJsVixhQUFPLElBSHVCO0NBSTlCbVYsY0FBUSxHQUpzQjtDQUs5QkMsZ0JBQVU7Q0FMb0IsS0FBZCxFQU1kalMsT0FOYyxDQUFqQjtDQUZ5Qix3RkFVbkI7Q0FFTHRMLFlBQU0saUJBRkQ7Q0FJTHdXLGVBQVM7Q0FFUmdILDJCQUFtQixNQUZYO0NBR1JDLHlCQUFpQjtDQUhULE9BSko7Q0FXTC9HLGdCQUFVO0NBRVRvQixrQkFBVSxJQUFJbEIsT0FBSixDQUFZLElBQVosQ0FGRDtDQUdUOEcsdUJBQWUsSUFBSTlHLE9BQUosQ0FBWSxJQUFaLENBSE47Q0FLVHdHLGtCQUFVLElBQUl4RyxPQUFKLENBQVlXLFNBQVM2RixRQUFyQixDQUxEO0NBTVRqVixlQUFPLElBQUl5TyxPQUFKLENBQVlXLFNBQVNwUCxLQUFyQixDQU5FO0NBT1RrVixpQkFBUyxJQUFJekcsT0FBSixDQUFZVyxTQUFTOEYsT0FBckIsQ0FQQTtDQVFUQyxnQkFBUSxJQUFJMUcsT0FBSixDQUFZVyxTQUFTK0YsTUFBckIsQ0FSQztDQVNUQyxrQkFBVSxJQUFJM0csT0FBSixDQUFZVyxTQUFTZ0csUUFBckI7Q0FURCxPQVhMO0NBd0JMdEcsc0JBQWdCWixXQXhCWDtDQXlCTGEsb0JBQWNaLFNBekJUO0NBMkJMYSxrQkFBWSxLQTNCUDtDQTRCTEMsaUJBQVc7Q0E1Qk4sS0FWbUI7Q0EwQ3pCOztDQXZERjs7Q0FBQTtDQUFBLEVBQXFDQyxjQUFyQzs7Q0NuQkEsSUFBTWhCLGNBQVcsNG5CQUFqQjtDQUNBLElBQU1DLFlBQVMscUpBQWY7Q0FFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsS0FBYXFILGtCQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7Q0FPQSxnQ0FBd0Q7Q0FBQTs7Q0FBQSxRQUE1Q0MsV0FBNEMsdUVBQTlCLEtBQThCO0NBQUEsUUFBdkJDLGNBQXVCLHVFQUFOLElBQU07O0NBQUE7O0NBRXZELFFBQU1DLGdCQUFpQkQsbUJBQW1CLElBQTFDO0NBRUEsNEZBQU07Q0FFTDdkLFlBQU0sb0JBRkQ7Q0FJTDBXLGdCQUFVO0NBRVRvQixrQkFBVSxJQUFJbEIsT0FBSixDQUFZLElBQVosQ0FGRDtDQUdUbUgscUJBQWEsSUFBSW5ILE9BQUosQ0FBWSxHQUFaLENBSEo7Q0FJVG9ILGVBQU8sSUFBSXBILE9BQUosQ0FBWWtILGdCQUFnQkQsY0FBaEIsR0FBaUMsSUFBSTNLLE9BQUosRUFBN0M7Q0FKRSxPQUpMO0NBWUwrRCxzQkFBZ0JaLFdBWlg7Q0FhTGEsb0JBQWNaO0NBYlQsS0FBTjs7Q0FpQkEsVUFBSzJILHFCQUFMLENBQTJCTCxXQUEzQjs7Q0FDQSxVQUFLTSx3QkFBTCxDQUE4QkosYUFBOUI7O0NBdEJ1RDtDQXdCdkQ7Q0FFRDs7Ozs7OztDQW5DRDtDQUFBO0NBQUEsMENBeUN1QnhYLE9BekN2QixFQXlDZ0M7Q0FFOUIsVUFBR0EsT0FBSCxFQUFZO0NBRVgsYUFBS2tRLE9BQUwsQ0FBYTJILEtBQWIsR0FBcUIsR0FBckI7Q0FFQSxPQUpELE1BSU87Q0FFTixlQUFPLEtBQUszSCxPQUFMLENBQWEySCxLQUFwQjtDQUVBOztDQUVELFdBQUs5RixXQUFMLEdBQW1CLElBQW5CO0NBRUE7Q0FFRDs7Ozs7O0NBekREO0NBQUE7Q0FBQSw2Q0ErRDBCL1IsT0EvRDFCLEVBK0RtQztDQUVqQyxVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhNEgsS0FBYixHQUFxQixHQUFyQjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBSzVILE9BQUwsQ0FBYTRILEtBQXBCO0NBRUE7O0NBRUQsV0FBSy9GLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQTdFRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQXdDaEIsY0FBeEM7O0NDdkJBLElBQU1oQixjQUFXLCt5Q0FBakI7Q0FDQSxJQUFNQyxZQUFTLGljQUFmO0NBRUE7Ozs7QUFJQSxLQUFhK0gsb0JBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7Ozs7Ozs7O0NBWUEsa0NBQTBCO0NBQUE7O0NBQUEsUUFBZC9TLE9BQWMsdUVBQUosRUFBSTs7Q0FBQTs7Q0FFekIsUUFBTWlNLFdBQVdoZCxPQUFPa1csTUFBUCxDQUFjO0NBQzlCNk4sb0JBQWMsR0FEZ0I7Q0FFOUJDLG9CQUFjLEdBRmdCO0NBRzlCQyx3QkFBa0IsUUFIWTtDQUk5QkMsdUJBQWlCLFFBSmE7Q0FLOUJDLHFCQUFlLEtBTGU7Q0FNOUJDLFlBQU07Q0FOd0IsS0FBZCxFQU9kclQsT0FQYyxDQUFqQjtDQVNBLDhGQUFNO0NBRUx0TCxZQUFNLHNCQUZEO0NBSUwwVyxnQkFBVTtDQUVUa0ksZUFBTyxJQUFJaEksT0FBSixDQUFZLEdBQVosQ0FGRTtDQUdUdk4sZ0JBQVEsSUFBSXVOLE9BQUosQ0FBWSxHQUFaLENBSEM7Q0FLVGtCLGtCQUFVLElBQUlsQixPQUFKLENBQVksSUFBWixDQUxEO0NBTVRpSSxlQUFPLElBQUlqSSxPQUFKLENBQVksSUFBWixDQU5FO0NBT1RrSSxnQkFBUSxJQUFJbEksT0FBSixDQUFZLElBQVosQ0FQQztDQVFUbUksa0JBQVUsSUFBSW5JLE9BQUosQ0FBWSxJQUFaLENBUkQ7Q0FVVDBILHNCQUFjLElBQUkxSCxPQUFKLENBQVlXLFNBQVMrRyxZQUFyQixDQVZMO0NBV1RDLHNCQUFjLElBQUkzSCxPQUFKLENBQVlXLFNBQVNnSCxZQUFyQixDQVhMO0NBYVRDLDBCQUFrQixJQUFJNUgsT0FBSixDQUFZLElBQUlvSSxLQUFKLENBQVV6SCxTQUFTaUgsZ0JBQW5CLENBQVosQ0FiVDtDQWNUQyx5QkFBaUIsSUFBSTdILE9BQUosQ0FBWSxJQUFJb0ksS0FBSixDQUFVekgsU0FBU2tILGVBQW5CLENBQVo7Q0FkUixPQUpMO0NBc0JMeEgsc0JBQWdCWixXQXRCWDtDQXVCTGEsb0JBQWNaLFNBdkJUO0NBeUJMYSxrQkFBWSxLQXpCUDtDQTBCTEMsaUJBQVc7Q0ExQk4sS0FBTjs7Q0E4QkEsVUFBSzZILHVCQUFMLENBQTZCMUgsU0FBU21ILGFBQXRDOztDQUNBLFVBQUtRLGNBQUwsQ0FBb0IzSCxTQUFTb0gsSUFBN0I7O0NBMUN5QjtDQTRDekI7Q0FFRDs7Ozs7OztDQTVERDtDQUFBO0NBQUEsNENBa0V5QnJZLE9BbEV6QixFQWtFa0M7Q0FFaEMsVUFBR0EsT0FBSCxFQUFZO0NBRVgsYUFBS2tRLE9BQUwsQ0FBYTJJLGNBQWIsR0FBOEIsR0FBOUI7Q0FFQSxPQUpELE1BSU87Q0FFTixlQUFPLEtBQUszSSxPQUFMLENBQWEySSxjQUFwQjtDQUVBOztDQUVELFdBQUs5RyxXQUFMLEdBQW1CLElBQW5CO0NBRUE7Q0FFRDs7Ozs7O0NBbEZEO0NBQUE7Q0FBQSxtQ0F3RmdCL1IsT0F4RmhCLEVBd0Z5QjtDQUV2QixVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhNEksS0FBYixHQUFxQixHQUFyQjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBSzVJLE9BQUwsQ0FBYTRJLEtBQXBCO0NBRUE7O0NBRUQsV0FBSy9HLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQUVEOzs7Ozs7Q0F4R0Q7Q0FBQTtDQUFBLHdDQThHbUM7Q0FBQSxVQUFoQmdILE9BQWdCLHVFQUFOLElBQU07O0NBRWpDLFVBQUdBLFlBQVksSUFBZixFQUFxQjtDQUVwQixhQUFLN0ksT0FBTCxDQUFhOEksV0FBYixHQUEyQixHQUEzQjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBSzlJLE9BQUwsQ0FBYThJLFdBQXBCO0NBRUE7O0NBRUQsV0FBSzVJLFFBQUwsQ0FBY3FJLFFBQWQsQ0FBdUJqYyxLQUF2QixHQUErQnVjLE9BQS9CO0NBQ0EsV0FBS2hILFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQTdIRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQTBDaEIsY0FBMUM7O0NDUEEsSUFBTWhCLGNBQVcsbW9CQUFqQjtDQUNBLElBQU1DLFlBQVMsNFpBQWY7Q0FFQTs7OztBQUlBLEtBQWFpSixvQkFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Q0FNQSxrQ0FBdUM7Q0FBQTs7Q0FBQSxRQUEzQnJILFNBQTJCLHVFQUFmLElBQUloRixPQUFKLEVBQWU7O0NBQUE7O0NBRXRDLDhGQUFNO0NBRUxsVCxZQUFNLHNCQUZEO0NBSUwwVyxnQkFBVTtDQUVUbUksZUFBTyxJQUFJakksT0FBSixDQUFZLElBQVosQ0FGRTtDQUdUc0IsbUJBQVcsSUFBSXRCLE9BQUosQ0FBWSxJQUFJMUQsT0FBSixFQUFaO0NBSEYsT0FKTDtDQVdMK0Qsc0JBQWdCWixXQVhYO0NBWUxhLG9CQUFjWixTQVpUO0NBY0xhLGtCQUFZLEtBZFA7Q0FlTEMsaUJBQVc7Q0FmTixLQUFOOztDQW1CQSxVQUFLNkIsWUFBTCxDQUFrQmYsVUFBVXBVLENBQTVCLEVBQStCb1UsVUFBVW5VLENBQXpDOztDQXJCc0M7Q0F1QnRDO0NBRUQ7Ozs7Ozs7O0NBakNEO0NBQUE7Q0FBQSxpQ0F3Q2NELENBeENkLEVBd0NpQkMsQ0F4Q2pCLEVBd0NvQjtDQUVsQixXQUFLMlMsUUFBTCxDQUFjd0IsU0FBZCxDQUF3QnBWLEtBQXhCLENBQThCdEMsR0FBOUIsQ0FBa0NzRCxDQUFsQyxFQUFxQ0MsQ0FBckM7Q0FFQTtDQTVDRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQTBDc1QsY0FBMUM7O0NDUEEsSUFBTWhCLGNBQVcsdWVBQWpCO0NBQ0EsSUFBTUMsWUFBUyxxSkFBZjtDQUVBOzs7Ozs7O0FBT0EsS0FBYWtKLGtCQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Q0FJQSxnQ0FBYztDQUFBOztDQUFBLDJGQUVQO0NBRUx4ZixZQUFNLG9CQUZEO0NBSUwwVyxnQkFBVTtDQUVUb0Isa0JBQVUsSUFBSWxCLE9BQUosQ0FBWSxJQUFaLENBRkQ7Q0FHVDZJLHFCQUFhLElBQUk3SSxPQUFKLENBQVksR0FBWixDQUhKO0NBSVQzRCxvQkFBWSxJQUFJMkQsT0FBSixDQUFZLElBQUkxRCxPQUFKLENBQVksR0FBWixFQUFpQixHQUFqQixDQUFaLENBSkg7Q0FLVHdNLFlBQUksSUFBSTlJLE9BQUosQ0FBWSxHQUFaLENBTEs7Q0FNVCtJLFlBQUksSUFBSS9JLE9BQUosQ0FBWSxHQUFaO0NBTkssT0FKTDtDQWNMSyxzQkFBZ0JaLFdBZFg7Q0FlTGEsb0JBQWNaLFNBZlQ7Q0FpQkxhLGtCQUFZLEtBakJQO0NBa0JMQyxpQkFBVztDQWxCTixLQUZPO0NBd0JiO0NBRUQ7Ozs7Ozs7Q0FoQ0Q7Q0FBQTs7Q0E2REM7Ozs7OztDQTdERCxrQ0FvRWV2UyxLQXBFZixFQW9Fc0JDLE1BcEV0QixFQW9FOEI7Q0FFNUIsV0FBSzRSLFFBQUwsQ0FBY3pELFVBQWQsQ0FBeUJuUSxLQUF6QixDQUErQnRDLEdBQS9CLENBQW1DcUUsS0FBbkMsRUFBMENDLE1BQTFDO0NBQ0EsV0FBSzJhLFdBQUwsR0FBbUIsS0FBS0EsV0FBeEI7Q0FFQTtDQXpFRjtDQUFBO0NBQUEsd0JBc0NtQjtDQUVqQixhQUFPLEtBQUsvSSxRQUFMLENBQWMrSSxXQUFkLENBQTBCM2MsS0FBakM7Q0FFQTtDQUVEOzs7OztDQTVDRDtDQUFBLHNCQWtEaUJnQixDQWxEakIsRUFrRG9CO0NBRWxCLFVBQU00UyxXQUFXLEtBQUtBLFFBQXRCO0NBQ0EsVUFBTXpELGFBQWF5RCxTQUFTekQsVUFBVCxDQUFvQm5RLEtBQXZDO0NBRUE0VCxlQUFTK0ksV0FBVCxDQUFxQjNjLEtBQXJCLEdBQTZCZ0IsQ0FBN0I7Q0FDQTRTLGVBQVNnSixFQUFULENBQVk1YyxLQUFaLEdBQW9CZ0IsSUFBSW1QLFdBQVduUCxDQUFuQztDQUNBNFMsZUFBU2lKLEVBQVQsQ0FBWTdjLEtBQVosR0FBb0JnQixJQUFJbVAsV0FBV2xQLENBQW5DO0NBRUE7Q0EzREY7O0NBQUE7O0NBQUE7Q0FBQSxFQUF3Q3NULGNBQXhDOztDQ1ZBLElBQU1oQixjQUFXLDQ4T0FBakI7Q0FDQSxJQUFNQyxZQUFTLHFKQUFmO0NBRUE7Ozs7Ozs7QUFPQSxLQUFhc0osc0JBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXNCQSxvQ0FBeUM7Q0FBQTs7Q0FBQSxRQUE3QjFhLE1BQTZCLHVFQUFwQixJQUFvQjtDQUFBLFFBQWRvRyxPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBRXhDLFFBQU1pTSxXQUFXaGQsT0FBT2tXLE1BQVAsQ0FBYztDQUM5QnlILGlCQUFXLElBRG1CO0NBRTlCMkgsYUFBTyxDQUZ1QjtDQUc5QkMsZUFBUyxDQUhxQjtDQUk5QkMsaUJBQVcsS0FKbUI7Q0FLOUJDLGlCQUFXLEtBTG1CO0NBTTlCakYsZ0JBQVUsS0FOb0I7Q0FPOUJrRixnQkFBVSxLQVBvQjtDQVE5QkMsbUJBQWEsSUFSaUI7Q0FTOUJ4RixhQUFPLElBVHVCO0NBVTlCL0MsZUFBUyxHQVZxQjtDQVc5QndJLDBCQUFvQixHQVhVO0NBWTlCQyxxQkFBZSxHQVplO0NBYTlCcmIsWUFBTSxHQWJ3QjtDQWM5QnNiLGNBQVEsR0Fkc0I7Q0FlOUJDLHNCQUFnQjtDQWZjLEtBQWQsRUFnQmRoVixPQWhCYyxDQUFqQjtDQWtCQSxnR0FBTTtDQUVMdEwsWUFBTSx3QkFGRDtDQUlMd1csZUFBUztDQUVSK0osbUJBQVdoSixTQUFTc0ksS0FBVCxDQUFlOUwsT0FBZixDQUF1QixDQUF2QixDQUZIO0NBR1J5TSxxQkFBYWpKLFNBQVNzSSxLQUFULENBQWU5TCxPQUFmLENBQXVCLENBQXZCLENBSEw7Q0FJUjBNLHFCQUFhbEosU0FBU3VJLE9BQVQsQ0FBaUIvTCxPQUFqQixDQUF5QixDQUF6QixDQUpMO0NBS1IyTSx1QkFBZW5KLFNBQVN1SSxPQUFULENBQWlCL0wsT0FBakIsQ0FBeUIsQ0FBekI7Q0FMUCxPQUpKO0NBYUwyQyxnQkFBVTtDQUVUb0Isa0JBQVUsSUFBSWxCLE9BQUosQ0FBWSxJQUFaLENBRkQ7Q0FHVG1CLGdCQUFRLElBQUluQixPQUFKLENBQVksSUFBWixDQUhDO0NBS1RzQixtQkFBVyxJQUFJdEIsT0FBSixDQUFZLElBQUkxRCxPQUFKLEVBQVosQ0FMRjtDQU1UNkYsdUJBQWUsSUFBSW5DLE9BQUosQ0FBWSxJQUFJMUQsT0FBSixFQUFaLENBTk47Q0FRVDBFLG9CQUFZLElBQUloQixPQUFKLENBQVksR0FBWixDQVJIO0NBU1RpQixtQkFBVyxJQUFJakIsT0FBSixDQUFZLElBQVosQ0FURjtDQVdUK0oscUJBQWEsSUFBSS9KLE9BQUosQ0FBWSxJQUFaLENBWEo7Q0FZVGdLLG1CQUFXLElBQUloSyxPQUFKLENBQVksR0FBWixDQVpGO0NBY1RlLGlCQUFTLElBQUlmLE9BQUosQ0FBWVcsU0FBU0ksT0FBckIsQ0FkQTtDQWVUd0ksNEJBQW9CLElBQUl2SixPQUFKLENBQVlXLFNBQVM0SSxrQkFBckIsQ0FmWDtDQWdCVEMsdUJBQWUsSUFBSXhKLE9BQUosQ0FBWVcsU0FBUzZJLGFBQXJCLENBaEJOO0NBaUJUcmIsY0FBTSxJQUFJNlIsT0FBSixDQUFZVyxTQUFTeFMsSUFBckIsQ0FqQkc7Q0FrQlRzYixnQkFBUSxJQUFJekosT0FBSixDQUFZVyxTQUFTOEksTUFBckIsQ0FsQkM7Q0FtQlRDLHdCQUFnQixJQUFJMUosT0FBSixDQUFZVyxTQUFTK0ksY0FBckIsQ0FuQlA7Q0FxQlRPLHFCQUFhLElBQUlqSyxPQUFKLENBQVksSUFBSTFELE9BQUosQ0FBWSxHQUFaLEVBQWlCLEdBQWpCLENBQVosQ0FyQko7Q0FzQlQ0TixvQkFBWSxJQUFJbEssT0FBSixDQUFZLEdBQVo7Q0F0QkgsT0FiTDtDQXVDTEssc0JBQWdCWixXQXZDWDtDQXdDTGEsb0JBQWNaLFNBeENUO0NBMENMYSxrQkFBWSxLQTFDUDtDQTJDTEMsaUJBQVc7Q0EzQ04sS0FBTjs7Q0ErQ0EsVUFBSzJKLG1CQUFMLENBQXlCeEosU0FBU3dJLFNBQWxDOztDQUNBLFVBQUtpQiw0QkFBTCxDQUFrQ3pKLFNBQVN5SSxTQUEzQzs7Q0FDQSxVQUFLL0Qsa0JBQUwsQ0FBd0IxRSxTQUFTd0QsUUFBakM7O0NBQ0EsVUFBS2tHLGtCQUFMLENBQXdCMUosU0FBUzBJLFFBQWpDOztDQUNBLFVBQUtpQixxQkFBTCxDQUEyQjNKLFNBQVMySSxXQUFwQzs7Q0FDQSxVQUFLdEUsZUFBTCxDQUFxQnJFLFNBQVNtRCxLQUE5Qjs7Q0FFQSxRQUFHbkQsU0FBU1csU0FBVCxLQUF1QixJQUExQixFQUFnQztDQUUvQixZQUFLZSxZQUFMLENBQWtCMUIsU0FBU1csU0FBVCxDQUFtQnBVLENBQXJDLEVBQXdDeVQsU0FBU1csU0FBVCxDQUFtQm5VLENBQTNEO0NBRUE7O0NBRUQsVUFBS2lVLG1CQUFMLENBQXlCOVMsTUFBekI7O0NBaEZ3QztDQWtGeEM7Q0FFRDs7Ozs7OztDQTVHRDtDQUFBO0NBQUEsd0NBa0hxQm9CLE9BbEhyQixFQWtIOEI7Q0FFNUIsVUFBR0EsT0FBSCxFQUFZO0NBRVgsYUFBS2tRLE9BQUwsQ0FBYTJLLFVBQWIsR0FBMEIsR0FBMUI7Q0FFQSxPQUpELE1BSU87Q0FFTixlQUFPLEtBQUszSyxPQUFMLENBQWEySyxVQUFwQjtDQUVBOztDQUVELFdBQUs5SSxXQUFMLEdBQW1CLElBQW5CO0NBRUE7Q0FFRDs7Ozs7O0NBbElEO0NBQUE7Q0FBQSxpREF3SThCL1IsT0F4STlCLEVBd0l1QztDQUVyQyxVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhNEssVUFBYixHQUEwQixHQUExQjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBSzVLLE9BQUwsQ0FBYTRLLFVBQXBCO0NBRUE7O0NBRUQsV0FBSy9JLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQUVEOzs7Ozs7Q0F4SkQ7Q0FBQTtDQUFBLHVDQThKb0IvUixPQTlKcEIsRUE4SjZCO0NBRTNCLFVBQUdBLE9BQUgsRUFBWTtDQUVYLGFBQUtrUSxPQUFMLENBQWFnRyxRQUFiLEdBQXdCLEdBQXhCO0NBRUEsT0FKRCxNQUlPO0NBRU4sZUFBTyxLQUFLaEcsT0FBTCxDQUFhZ0csUUFBcEI7Q0FFQTs7Q0FFRCxXQUFLbkUsV0FBTCxHQUFtQixJQUFuQjtDQUVBO0NBRUQ7Ozs7OztDQTlLRDtDQUFBO0NBQUEsdUNBb0xvQi9SLE9BcExwQixFQW9MNkI7Q0FFM0IsVUFBR0EsT0FBSCxFQUFZO0NBRVgsYUFBS2tRLE9BQUwsQ0FBYTZLLFFBQWIsR0FBd0IsR0FBeEI7Q0FFQSxPQUpELE1BSU87Q0FFTixlQUFPLEtBQUs3SyxPQUFMLENBQWE2SyxRQUFwQjtDQUVBOztDQUVELFdBQUtoSixXQUFMLEdBQW1CLElBQW5CO0NBRUE7Q0FFRDs7Ozs7O0NBcE1EO0NBQUE7Q0FBQSwwQ0EwTXVCL1IsT0ExTXZCLEVBME1nQztDQUU5QixVQUFHQSxPQUFILEVBQVk7Q0FFWCxhQUFLa1EsT0FBTCxDQUFhOEssWUFBYixHQUE0QixHQUE1QjtDQUVBLE9BSkQsTUFJTztDQUVOLGVBQU8sS0FBSzlLLE9BQUwsQ0FBYThLLFlBQXBCO0NBRUE7O0NBRUQsV0FBS2pKLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQUVEOzs7Ozs7Q0ExTkQ7Q0FBQTtDQUFBLG9DQWdPaUIvUixPQWhPakIsRUFnTzBCO0NBRXhCLFVBQUdBLE9BQUgsRUFBWTtDQUVYLGFBQUtrUSxPQUFMLENBQWEyRixLQUFiLEdBQXFCLEdBQXJCO0NBRUEsT0FKRCxNQUlPO0NBRU4sZUFBTyxLQUFLM0YsT0FBTCxDQUFhMkYsS0FBcEI7Q0FFQTs7Q0FFRCxXQUFLOUQsV0FBTCxHQUFtQixJQUFuQjtDQUVBO0NBRUQ7Ozs7Ozs7Q0FoUEQ7Q0FBQTtDQUFBLGlDQXVQY3ZVLENBdlBkLEVBdVBpQkMsQ0F2UGpCLEVBdVBvQjtDQUVsQixXQUFLMlMsUUFBTCxDQUFjd0IsU0FBZCxDQUF3QnBWLEtBQXhCLENBQThCdEMsR0FBOUIsQ0FBa0NzRCxDQUFsQyxFQUFxQ0MsQ0FBckM7Q0FDQSxXQUFLMlMsUUFBTCxDQUFjcUMsYUFBZCxDQUE0QmpXLEtBQTVCLENBQWtDdEMsR0FBbEMsQ0FBc0NzRCxDQUF0QyxFQUF5Q0MsQ0FBekMsRUFBNEN1VixjQUE1QyxDQUEyRCxHQUEzRDtDQUVBO0NBRUQ7Ozs7OztDQTlQRDtDQUFBO0NBQUEsd0NBb1FxQnBVLE1BcFFyQixFQW9RNkI7Q0FFM0IsVUFBR0EsV0FBVyxJQUFkLEVBQW9CO0NBRW5CLGFBQUt3UixRQUFMLENBQWNrQixVQUFkLENBQXlCOVUsS0FBekIsR0FBaUNvQyxPQUFPQyxJQUF4QztDQUNBLGFBQUt1UixRQUFMLENBQWNtQixTQUFkLENBQXdCL1UsS0FBeEIsR0FBZ0NvQyxPQUFPRSxHQUF2QztDQUNBLGFBQUtzUixRQUFMLENBQWNpSyxXQUFkLENBQTBCN2QsS0FBMUIsR0FBa0NvQyxPQUFPcWMsY0FBUCxFQUFsQyxDQUptQjtDQU1uQjtDQUVEO0NBOVFGOztDQUFBOztDQUFBO0NBQUEsRUFBNENsSyxjQUE1Qzs7Q0NWQSxJQUFNaEIsY0FBVywyL0JBQWpCO0NBQ0EsSUFBTUMsWUFBUyw2U0FBZjtDQUVBOzs7Ozs7O0FBT0EsS0FBYWtMLGlCQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7O0NBUUEsK0JBQTBCO0NBQUEsUUFBZGxXLE9BQWMsdUVBQUosRUFBSTs7Q0FBQTs7Q0FFekIsUUFBTWlNLFdBQVdoZCxPQUFPa1csTUFBUCxDQUFjO0NBQzlCZ1IsaUJBQVcsR0FEbUI7Q0FFOUJDLGdCQUFVLEdBRm9CO0NBRzlCQyxpQkFBVztDQUhtQixLQUFkLEVBSWRyVyxPQUpjLENBQWpCO0NBRnlCLDBGQVFuQjtDQUVMdEwsWUFBTSxtQkFGRDtDQUlMMFcsZ0JBQVU7Q0FFVG9CLGtCQUFVLElBQUlsQixPQUFKLENBQVksSUFBWixDQUZEO0NBSVRnTCxnQkFBUSxJQUFJaEwsT0FBSixDQUFZLElBQUkxRCxPQUFKLENBQVksR0FBWixFQUFpQixHQUFqQixDQUFaLENBSkM7Q0FLVDdKLGdCQUFRLElBQUl1TixPQUFKLENBQVksR0FBWixDQUxDO0NBTVRpTCx3QkFBZ0IsSUFBSWpMLE9BQUosQ0FBWSxHQUFaLENBTlA7Q0FRVGxHLGNBQU0sSUFBSWtHLE9BQUosQ0FBWSxHQUFaLENBUkc7Q0FTVDVSLGdCQUFRLElBQUk0UixPQUFKLENBQVksQ0FBQ1csU0FBU21LLFFBQXRCLENBVEM7Q0FVVEQsbUJBQVcsSUFBSTdLLE9BQUosQ0FBWVcsU0FBU2tLLFNBQXJCLENBVkY7Q0FXVEMsa0JBQVUsSUFBSTlLLE9BQUosQ0FBWVcsU0FBU21LLFFBQXJCLENBWEQ7Q0FZVEMsbUJBQVcsSUFBSS9LLE9BQUosQ0FBWVcsU0FBU29LLFNBQXJCO0NBWkYsT0FKTDtDQW9CTDFLLHNCQUFnQlosV0FwQlg7Q0FxQkxhLG9CQUFjWixTQXJCVDtDQXVCTGEsa0JBQVksS0F2QlA7Q0F3QkxDLGlCQUFXO0NBeEJOLEtBUm1CO0NBb0N6Qjs7Q0E5Q0Y7O0NBQUE7Q0FBQSxFQUF1Q0MsY0FBdkM7O0NDVkEsSUFBTWhCLGNBQVcsMHJEQUFqQjtDQUNBLElBQU1DLFlBQVMsMFRBQWY7Q0FFQTs7Ozs7O0FBTUEsS0FBYXdMLGlCQUFiO0NBQUE7Q0FBQTtDQUVDOzs7OztDQU1BLCtCQUF1QztDQUFBLFFBQTNCNUosU0FBMkIsdUVBQWYsSUFBSWhGLE9BQUosRUFBZTs7Q0FBQTs7Q0FBQSwwRkFFaEM7Q0FFTGxULFlBQU0sbUJBRkQ7Q0FJTDBXLGdCQUFVO0NBRVRvQixrQkFBVSxJQUFJbEIsT0FBSixDQUFZLElBQVosQ0FGRDtDQUdUbUwsa0JBQVUsSUFBSW5MLE9BQUosQ0FBWSxJQUFaLENBSEQ7Q0FJVHNCLG1CQUFXLElBQUl0QixPQUFKLENBQVlzQixTQUFaO0NBSkYsT0FKTDtDQVlMakIsc0JBQWdCWixXQVpYO0NBYUxhLG9CQUFjWixTQWJUO0NBZUxhLGtCQUFZLEtBZlA7Q0FnQkxDLGlCQUFXO0NBaEJOLEtBRmdDO0NBc0J0Qzs7Q0E5QkY7O0NBQUE7Q0FBQSxFQUF1Q0MsY0FBdkM7O0NDVEEsSUFBTWhCLGNBQVcsNitNQUFqQjtDQUNBLElBQU1DLFlBQVMsMHVCQUFmO0NBRUE7Ozs7OztBQU1BLEtBQWEwTCxtQkFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Q0FNQSxpQ0FBdUM7Q0FBQSxRQUEzQjlKLFNBQTJCLHVFQUFmLElBQUloRixPQUFKLEVBQWU7O0NBQUE7O0NBQUEsNEZBRWhDO0NBRUxsVCxZQUFNLHFCQUZEO0NBSUx3VyxlQUFTO0NBRVI7Q0FDQXlMLDhCQUFzQixHQUhkO0NBSVJDLGdDQUF3QixLQUpoQjtDQU1SO0NBQ0FDLDhCQUFzQixNQVBkO0NBUVJDLDRCQUFvQiw0QkFSWjtDQVNSQyw2QkFBcUIsYUFUYjtDQVVSQyx3QkFBZ0Isa0JBVlI7Q0FXUkMsK0JBQXVCO0NBWGYsT0FKSjtDQW1CTDdMLGdCQUFVO0NBRVRvQixrQkFBVSxJQUFJbEIsT0FBSixDQUFZLElBQVosQ0FGRDtDQUdUNEwsZUFBTyxJQUFJNUwsT0FBSixDQUFZLElBQVosQ0FIRTtDQUlUNkwsaUJBQVMsSUFBSTdMLE9BQUosQ0FBWSxJQUFaLENBSkE7Q0FLVHNCLG1CQUFXLElBQUl0QixPQUFKLENBQVlzQixTQUFaO0NBTEYsT0FuQkw7Q0E0QkxqQixzQkFBZ0JaLFdBNUJYO0NBNkJMYSxvQkFBY1osU0E3QlQ7Q0ErQkxhLGtCQUFZLEtBL0JQO0NBZ0NMQyxpQkFBVztDQWhDTixLQUZnQztDQXNDdEM7Q0FFRDs7Ozs7Ozs7Ozs7O0NBaEREO0NBQUE7Q0FBQSw2Q0EyRDBCc0wsS0EzRDFCLEVBMkRpQztDQUUvQixXQUFLbE0sT0FBTCxDQUFheUwsb0JBQWIsR0FBb0NTLE1BQU0zTyxPQUFOLENBQWMsR0FBZCxDQUFwQztDQUNBLFdBQUt5QyxPQUFMLENBQWEwTCxzQkFBYixHQUFzQ1EsTUFBTTNPLE9BQU4sQ0FBYyxHQUFkLENBQXRDO0NBRUEsV0FBS3NFLFdBQUwsR0FBbUIsSUFBbkI7Q0FFQTtDQWxFRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQXlDaEIsY0FBekM7O0NDVEEsSUFBTWhCLGNBQVcsbW9DQUFqQjtDQUNBLElBQU1DLFlBQVMscUpBQWY7Q0FFQTs7Ozs7Ozs7O0FBU0EsS0FBYXFNLG1CQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Q0FJQSxpQ0FBYztDQUFBOztDQUFBLDRGQUVQO0NBRUwzaUIsWUFBTSxxQkFGRDtDQUlMMFcsZ0JBQVU7Q0FFVG9CLGtCQUFVLElBQUlsQixPQUFKLENBQVksSUFBWixDQUZEO0NBR1RnTSxzQkFBYyxJQUFJaE0sT0FBSixDQUFZLElBQVosQ0FITDtDQUlUaU0sMEJBQWtCLElBQUlqTSxPQUFKLENBQVksR0FBWixDQUpUO0NBS1RrTSxzQkFBYyxJQUFJbE0sT0FBSixDQUFZLElBQVosQ0FMTDtDQU1UbU0sb0JBQVksSUFBSW5NLE9BQUosQ0FBWSxHQUFaO0NBTkgsT0FKTDtDQWNMSyxzQkFBZ0JaLFdBZFg7Q0FlTGEsb0JBQWNaLFNBZlQ7Q0FpQkxhLGtCQUFZLEtBakJQO0NBa0JMQyxpQkFBVztDQWxCTixLQUZPO0NBd0JiOztDQTlCRjs7Q0FBQTtDQUFBLEVBQXlDQyxjQUF6Qzs7Q0NkQTs7Ozs7O0NDRUE7Ozs7Ozs7Ozs7QUFVQSxLQUFhMkwsSUFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Ozs7Q0FTQSxrQkFLRTtDQUFBLFFBSkQzbEIsSUFJQyx1RUFKTSxNQUlOO0NBQUEsUUFIRDRXLEtBR0MsdUVBSE8sSUFBSW1CLEtBQUosRUFHUDtDQUFBLFFBRkRsUSxNQUVDLHVFQUZRLElBQUk2RCxrQkFBSixDQUF1QixDQUFDLENBQXhCLEVBQTJCLENBQTNCLEVBQThCLENBQTlCLEVBQWlDLENBQUMsQ0FBbEMsRUFBcUMsQ0FBckMsRUFBd0MsQ0FBeEMsQ0FFUjtDQUFBLFFBRERrYSxJQUNDLHVFQURNLElBQUkvZixJQUFKLENBQVMsSUFBSXlMLG1CQUFKLENBQXdCLENBQXhCLEVBQTJCLENBQTNCLENBQVQsRUFBd0MsSUFBeEMsQ0FDTjs7Q0FBQTs7Q0FFRDs7Ozs7Q0FNQSxTQUFLdFIsSUFBTCxHQUFZQSxJQUFaO0NBRUE7Ozs7Ozs7Q0FPQSxTQUFLNFcsS0FBTCxHQUFhQSxLQUFiO0NBRUE7Ozs7Ozs7Q0FPQSxTQUFLL08sTUFBTCxHQUFjQSxNQUFkO0NBRUE7Ozs7Ozs7Q0FPQSxTQUFLK2QsSUFBTCxHQUFZQSxJQUFaOztDQUVBLFFBQUcsS0FBS0EsSUFBTCxLQUFjLElBQWpCLEVBQXVCO0NBRXRCLFdBQUtBLElBQUwsQ0FBVUMsYUFBVixHQUEwQixLQUExQjs7Q0FFQSxVQUFHLEtBQUtqUCxLQUFMLEtBQWUsSUFBbEIsRUFBd0I7Q0FFdkIsYUFBS0EsS0FBTCxDQUFXclMsR0FBWCxDQUFlLEtBQUtxaEIsSUFBcEI7Q0FFQTtDQUVEO0NBRUQ7Ozs7Ozs7Q0FNQSxTQUFLRSxjQUFMLEdBQXNCLEtBQXRCO0NBRUE7Ozs7OztDQU1BLFNBQUs3YyxPQUFMLEdBQWUsSUFBZjtDQUVBOzs7Ozs7Ozs7O0NBVUEsU0FBSzhjLFNBQUwsR0FBaUIsSUFBakI7Q0FFQTtDQUVEOzs7Ozs7O0NBL0ZEO0NBQUE7O0NBNkhDOzs7Ozs7Ozs7Ozs7O0NBN0hELDJCQTJJUTdQLFFBM0lSLEVBMklrQjhQLFdBM0lsQixFQTJJK0JDLFlBM0kvQixFQTJJNkN2TSxLQTNJN0MsRUEySW9Ed00sV0EzSXBELEVBMklpRTtDQUUvRCxZQUFNLElBQUlqbUIsS0FBSixDQUFVLGdDQUFWLENBQU47Q0FFQTtDQUVEOzs7Ozs7Ozs7Ozs7OztDQWpKRDtDQUFBO0NBQUEsNEJBK0pTdUgsS0EvSlQsRUErSmdCQyxNQS9KaEIsRUErSndCO0NBRXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FqS0Q7Q0FBQTtDQUFBLCtCQW1MWXlPLFFBbkxaLEVBbUxzQmlRLEtBbkx0QixFQW1MNkI7Q0FFNUI7Ozs7Ozs7Ozs7Ozs7O0NBckxEO0NBQUE7Q0FBQSw4QkFtTVc7Q0FFVCxVQUFJaG9CLEdBQUo7O0NBRlMsaUJBSUVqQixPQUFPa3BCLElBQVAsQ0FBWSxJQUFaLENBSkY7O0NBSVQsK0NBQThCO0NBQTFCam9CLFdBQTBCOztDQUU3QixZQUFHLEtBQUtBLEdBQUwsTUFBYyxJQUFkLElBQXNCLE9BQU8sS0FBS0EsR0FBTCxFQUFVeUQsT0FBakIsS0FBNkIsVUFBdEQsRUFBa0U7Q0FFakUsZUFBS3pELEdBQUwsRUFBVXlELE9BQVY7Q0FDQSxlQUFLekQsR0FBTCxJQUFZLElBQVo7Q0FFQTtDQUVEOztDQUVELFVBQUcsS0FBSzRILFFBQUwsS0FBa0IsSUFBckIsRUFBMkI7Q0FFMUIsYUFBS0EsUUFBTCxDQUFjbkUsT0FBZDtDQUVBO0NBRUQ7Q0F4TkY7Q0FBQTtDQUFBLHdCQXFHZ0I7Q0FFZCxhQUFRLEtBQUtna0IsSUFBTCxLQUFjLElBQWYsR0FBdUIsS0FBS0EsSUFBTCxDQUFVN2YsUUFBakMsR0FBNEMsSUFBbkQ7Q0FFQTtDQUVEOzs7Ozs7O0NBM0dEO0NBQUEsc0JBbUhjTixLQW5IZCxFQW1IcUI7Q0FFbkIsVUFBRyxLQUFLbWdCLElBQUwsS0FBYyxJQUFqQixFQUF1QjtDQUV0QixhQUFLQSxJQUFMLENBQVU3ZixRQUFWLEdBQXFCTixLQUFyQjtDQUVBO0NBRUQ7Q0EzSEY7O0NBQUE7Q0FBQTs7Q0NSQTs7Ozs7O0FBTUEsS0FBYTRnQixRQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7O0NBUUEsc0JBQTBCO0NBQUE7O0NBQUEsUUFBZHBZLE9BQWMsdUVBQUosRUFBSTs7Q0FBQTs7Q0FFekIsa0ZBQU0sVUFBTjtDQUVBOzs7Ozs7O0NBT0EsVUFBS3FZLGFBQUwsR0FBcUIsSUFBSUMsaUJBQUosQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEI7Q0FDaERDLGlCQUFXQyxZQURxQztDQUVoREMsaUJBQVdELFlBRnFDO0NBR2hERSxxQkFBZSxLQUhpQztDQUloREMsbUJBQWE7Q0FKbUMsS0FBNUIsQ0FBckI7Q0FPQSxVQUFLTixhQUFMLENBQW1CdEUsT0FBbkIsQ0FBMkJoaUIsSUFBM0IsR0FBa0MsY0FBbEM7Q0FDQSxVQUFLc21CLGFBQUwsQ0FBbUJ0RSxPQUFuQixDQUEyQjZFLGVBQTNCLEdBQTZDLEtBQTdDO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLQyxhQUFMLEdBQXFCLE1BQUtSLGFBQUwsQ0FBbUJuaUIsS0FBbkIsRUFBckI7Q0FFQSxVQUFLMmlCLGFBQUwsQ0FBbUI5RSxPQUFuQixDQUEyQmhpQixJQUEzQixHQUFrQyxjQUFsQztDQUVBOzs7Ozs7Ozs7Q0FTQSxVQUFLK21CLGVBQUwsR0FBd0I5WSxRQUFROFksZUFBUixLQUE0QjFwQixTQUE3QixHQUEwQzRRLFFBQVE4WSxlQUFsRCxHQUFvRSxHQUEzRjtDQUVBOzs7Ozs7O0NBT0EsVUFBS0MsbUJBQUwsR0FBMkIsSUFBSXZMLG1CQUFKLEVBQTNCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLd0wsMkJBQUwsR0FBbUMsSUFBSXhMLG1CQUFKLEVBQW5DO0NBQ0EsVUFBS3dMLDJCQUFMLENBQWlDQyxTQUFqQyxHQUE2QyxJQUE3QztDQUVBOzs7Ozs7Q0FNQSxVQUFLQSxTQUFMLEdBQWlCLEtBQWpCO0NBRUEsVUFBS3JMLFVBQUwsR0FBa0I1TixRQUFRNE4sVUFBMUI7Q0F0RXlCO0NBd0V6QjtDQUVEOzs7Ozs7O0NBcEZEO0NBQUE7O0NBbUlDOzs7Ozs7Ozs7O0NBbklELDJCQThJUTNGLFFBOUlSLEVBOElrQjhQLFdBOUlsQixFQThJK0JDLFlBOUkvQixFQThJNkN2TSxLQTlJN0MsRUE4SW9Ed00sV0E5SXBELEVBOElpRTtDQUUvRCxVQUFNdFAsUUFBUSxLQUFLQSxLQUFuQjtDQUNBLFVBQU0vTyxTQUFTLEtBQUtBLE1BQXBCO0NBRUEsVUFBTXllLGdCQUFnQixLQUFLQSxhQUEzQjtDQUNBLFVBQU1RLGdCQUFnQixLQUFLQSxhQUEzQjtDQUVBLFVBQUkvZ0IsV0FBVyxLQUFLaWhCLG1CQUFwQjtDQUNBLFVBQUkzTixXQUFXdFQsU0FBU3NULFFBQXhCO0NBQ0EsVUFBTXNDLFNBQVM1VixTQUFTb2hCLFNBQVQsRUFBZjtDQUVBLFVBQUlDLFNBQVNwQixXQUFiO0NBQ0EsVUFBSXFCLE1BQUo7Q0FDQSxVQUFJeHBCLENBQUosRUFBT3lwQixDQUFQO0NBRUEsV0FBS3ZoQixRQUFMLEdBQWdCQSxRQUFoQixDQWhCK0Q7O0NBbUIvRCxXQUFJbEksSUFBSSxDQUFKLEVBQU95cEIsSUFBSTNMLE9BQU81ZCxNQUFQLEdBQWdCLENBQS9CLEVBQWtDRixJQUFJeXBCLENBQXRDLEVBQXlDLEVBQUV6cEIsQ0FBM0MsRUFBOEM7Q0FFN0M7Q0FDQXdwQixpQkFBV3hwQixJQUFJLENBQUwsS0FBWSxDQUFiLEdBQWtCeW9CLGFBQWxCLEdBQWtDUSxhQUEzQztDQUVBek4saUJBQVNzQyxNQUFULENBQWdCbFcsS0FBaEIsR0FBd0JrVyxPQUFPOWQsQ0FBUCxDQUF4QjtDQUNBd2IsaUJBQVNvQixRQUFULENBQWtCaFYsS0FBbEIsR0FBMEIyaEIsT0FBT3BGLE9BQWpDO0NBQ0E5TCxpQkFBU1ksTUFBVCxDQUFnQkYsS0FBaEIsRUFBdUIvTyxNQUF2QixFQUErQndmLE1BQS9CO0NBRUFELGlCQUFTQyxNQUFUO0NBRUE7O0NBRUQsVUFBRyxLQUFLSCxTQUFSLEVBQW1CO0NBRWxCbmhCLG1CQUFXLEtBQUtraEIsMkJBQWhCO0NBQ0E1TixtQkFBV3RULFNBQVNzVCxRQUFwQjtDQUNBLGFBQUt0VCxRQUFMLEdBQWdCQSxRQUFoQjtDQUVBOztDQUVEc1QsZUFBU3NDLE1BQVQsQ0FBZ0JsVyxLQUFoQixHQUF3QmtXLE9BQU85ZCxDQUFQLENBQXhCO0NBQ0F3YixlQUFTb0IsUUFBVCxDQUFrQmhWLEtBQWxCLEdBQTBCMmhCLE9BQU9wRixPQUFqQztDQUNBOUwsZUFBU1ksTUFBVCxDQUFnQkYsS0FBaEIsRUFBdUIvTyxNQUF2QixFQUErQixLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBNUQ7Q0FFQTtDQUVEOzs7Ozs7O0NBNUxEO0NBQUE7Q0FBQSw0QkFtTVN6ZSxLQW5NVCxFQW1NZ0JDLE1Bbk1oQixFQW1Nd0I7Q0FFdEJELGNBQVEyRCxLQUFLck4sR0FBTCxDQUFTLENBQVQsRUFBWXFOLEtBQUtvYyxLQUFMLENBQVcvZixRQUFRLEtBQUt1ZixlQUF4QixDQUFaLENBQVI7Q0FDQXRmLGVBQVMwRCxLQUFLck4sR0FBTCxDQUFTLENBQVQsRUFBWXFOLEtBQUtvYyxLQUFMLENBQVc5ZixTQUFTLEtBQUtzZixlQUF6QixDQUFaLENBQVQ7Q0FFQSxXQUFLVCxhQUFMLENBQW1COVAsT0FBbkIsQ0FBMkJoUCxLQUEzQixFQUFrQ0MsTUFBbEM7Q0FDQSxXQUFLcWYsYUFBTCxDQUFtQnRRLE9BQW5CLENBQTJCaFAsS0FBM0IsRUFBa0NDLE1BQWxDO0NBRUEsV0FBS3VmLG1CQUFMLENBQXlCcEwsWUFBekIsQ0FBc0MsTUFBTXBVLEtBQTVDLEVBQW1ELE1BQU1DLE1BQXpEO0NBQ0EsV0FBS3dmLDJCQUFMLENBQWlDckwsWUFBakMsQ0FBOEMsTUFBTXBVLEtBQXBELEVBQTJELE1BQU1DLE1BQWpFO0NBRUE7Q0FFRDs7Ozs7OztDQWhORDtDQUFBO0NBQUEsK0JBdU5ZeU8sUUF2TlosRUF1TnNCaVEsS0F2TnRCLEVBdU42QjtDQUUzQixVQUFHLENBQUNBLEtBQUosRUFBVztDQUVWLGFBQUtHLGFBQUwsQ0FBbUJ0RSxPQUFuQixDQUEyQndGLE1BQTNCLEdBQW9DQyxTQUFwQztDQUNBLGFBQUtYLGFBQUwsQ0FBbUI5RSxPQUFuQixDQUEyQndGLE1BQTNCLEdBQW9DQyxTQUFwQztDQUVBO0NBRUQ7Q0FoT0Y7Q0FBQTtDQUFBLHdCQTBGYTtDQUVYLGFBQU8sS0FBS25CLGFBQUwsQ0FBbUI5ZSxLQUExQjtDQUVBO0NBRUQ7Ozs7OztDQWhHRDtDQUFBO0NBQUEsd0JBc0djO0NBRVosYUFBTyxLQUFLOGUsYUFBTCxDQUFtQjdlLE1BQTFCO0NBRUE7Q0FFRDs7Ozs7O0NBNUdEO0NBQUE7Q0FBQSx3QkFrSGtCO0NBRWhCLGFBQU8sS0FBS3VmLG1CQUFMLENBQXlCbkwsVUFBaEM7Q0FFQTtDQUVEOzs7Q0F4SEQ7Q0FBQSx3QkE0SDBDO0NBQUEsVUFBMUJwVyxLQUEwQix1RUFBbEJxVyxXQUFXQyxLQUFPO0NBRXhDLFdBQUtpTCxtQkFBTCxDQUF5Qm5MLFVBQXpCLEdBQXNDcFcsS0FBdEM7Q0FDQSxXQUFLd2hCLDJCQUFMLENBQWlDcEwsVUFBakMsR0FBOENwVyxLQUE5QztDQUVBO0NBaklGOztDQUFBOztDQUFBO0NBQUEsRUFBOEJrZ0IsSUFBOUI7O0NDTEE7Ozs7Ozs7QUFPQSxLQUFhK0IsU0FBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Ozs7OztDQVdBLHVCQUEwQjtDQUFBOztDQUFBLFFBQWR6WixPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBRXpCLG1GQUFNLFdBQU47Q0FFQTs7Ozs7OztDQU9BLFVBQUswWixZQUFMLEdBQW9CLElBQUlwQixpQkFBSixDQUFzQixDQUF0QixFQUF5QixDQUF6QixFQUE0QjtDQUMvQ0MsaUJBQVdDLFlBRG9DO0NBRS9DQyxpQkFBV0QsWUFGb0M7Q0FHL0NFLHFCQUFlLEtBSGdDO0NBSS9DQyxtQkFBYTtDQUprQyxLQUE1QixDQUFwQjtDQU9BLFVBQUtlLFlBQUwsQ0FBa0IzRixPQUFsQixDQUEwQmhpQixJQUExQixHQUFpQyxjQUFqQztDQUNBLFVBQUsybkIsWUFBTCxDQUFrQjNGLE9BQWxCLENBQTBCNkUsZUFBMUIsR0FBNEMsS0FBNUM7Q0FFQTs7Ozs7OztDQU9BLFVBQUtlLFFBQUwsR0FBZ0IsSUFBSXZCLFFBQUosQ0FBYXBZLE9BQWIsQ0FBaEI7Q0FFQTs7Ozs7OztDQU9BLFVBQUs0WixlQUFMLEdBQXVCLElBQUk1TSxlQUFKLENBQXFCaE4sUUFBUWlOLFVBQVIsS0FBdUI3ZCxTQUF4QixHQUFxQzRRLFFBQVFpTixVQUE3QyxHQUEwRCxJQUE5RSxDQUF2QjtDQUVBLFVBQUs5USxTQUFMLEdBQWlCNkQsUUFBUTdELFNBQXpCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLMGQsa0JBQUwsR0FBMEIsSUFBSXhILGtCQUFKLENBQXVCLElBQXZCLENBQTFCO0NBRUEsVUFBS0ksV0FBTCxHQUFtQnpTLFFBQVF5UyxXQUEzQjtDQWxEeUI7Q0FvRHpCO0NBRUQ7Ozs7Ozs7Q0FuRUQ7Q0FBQTs7Q0E0TkM7Ozs7Ozs7OztDQTVORCwyQkFzT1F4SyxRQXRPUixFQXNPa0I4UCxXQXRPbEIsRUFzTytCQyxZQXRPL0IsRUFzTzZDdk0sS0F0TzdDLEVBc09vRHdNLFdBdE9wRCxFQXNPaUU7Q0FFL0QsVUFBTXRQLFFBQVEsS0FBS0EsS0FBbkI7Q0FDQSxVQUFNL08sU0FBUyxLQUFLQSxNQUFwQjtDQUNBLFVBQU0rZixXQUFXLEtBQUtBLFFBQXRCO0NBRUEsVUFBTUUscUJBQXFCLEtBQUtBLGtCQUFoQztDQUNBLFVBQU1ELGtCQUFrQixLQUFLQSxlQUE3QjtDQUNBLFVBQU1GLGVBQWUsS0FBS0EsWUFBMUIsQ0FSK0Q7O0NBVy9ELFdBQUs1aEIsUUFBTCxHQUFnQitoQixrQkFBaEI7Q0FDQUEseUJBQW1Cek8sUUFBbkIsQ0FBNEJvQixRQUE1QixDQUFxQ2hWLEtBQXJDLEdBQTZDdWdCLFlBQVloRSxPQUF6RDtDQUNBOUwsZUFBU1ksTUFBVCxDQUFnQkYsS0FBaEIsRUFBdUIvTyxNQUF2QixFQUErQjhmLFlBQS9CLEVBYitEOztDQWdCL0RDLGVBQVM5USxNQUFULENBQWdCWixRQUFoQixFQUEwQnlSLFlBQTFCLEVBQXdDQSxZQUF4Qzs7Q0FFQSxVQUFHLEtBQUtJLEtBQVIsRUFBZTtDQUVkO0NBQ0EsYUFBS2hpQixRQUFMLEdBQWdCOGhCLGVBQWhCO0NBQ0FBLHdCQUFnQnhPLFFBQWhCLENBQXlCOEIsUUFBekIsQ0FBa0MxVixLQUFsQyxHQUEwQ3VnQixZQUFZaEUsT0FBdEQ7Q0FDQTZGLHdCQUFnQnhPLFFBQWhCLENBQXlCK0IsUUFBekIsQ0FBa0MzVixLQUFsQyxHQUEwQ2tpQixhQUFhM0YsT0FBdkQ7Q0FFQTlMLGlCQUFTWSxNQUFULENBQWdCRixLQUFoQixFQUF1Qi9PLE1BQXZCLEVBQStCLEtBQUtpZSxjQUFMLEdBQXNCLElBQXRCLEdBQTZCRyxZQUE1RDtDQUVBO0NBRUQ7Q0FFRDs7Ozs7OztDQXJRRDtDQUFBO0NBQUEsNEJBNFFTemUsS0E1UVQsRUE0UWdCQyxNQTVRaEIsRUE0UXdCO0NBRXRCLFdBQUttZ0IsUUFBTCxDQUFjcFIsT0FBZCxDQUFzQmhQLEtBQXRCLEVBQTZCQyxNQUE3QjtDQUVBRCxjQUFRLEtBQUtvZ0IsUUFBTCxDQUFjcGdCLEtBQXRCO0NBQ0FDLGVBQVMsS0FBS21nQixRQUFMLENBQWNuZ0IsTUFBdkI7Q0FFQSxXQUFLa2dCLFlBQUwsQ0FBa0JuUixPQUFsQixDQUEwQmhQLEtBQTFCLEVBQWlDQyxNQUFqQztDQUVBO0NBRUQ7Ozs7Ozs7Q0F2UkQ7Q0FBQTtDQUFBLCtCQThSWXlPLFFBOVJaLEVBOFJzQmlRLEtBOVJ0QixFQThSNkI7Q0FFM0IsV0FBS3lCLFFBQUwsQ0FBY0ksVUFBZCxDQUF5QjlSLFFBQXpCLEVBQW1DaVEsS0FBbkM7O0NBRUEsVUFBRyxDQUFDQSxLQUFKLEVBQVc7Q0FFVixhQUFLd0IsWUFBTCxDQUFrQjNGLE9BQWxCLENBQTBCd0YsTUFBMUIsR0FBbUNDLFNBQW5DO0NBRUE7Q0FFRDtDQXhTRjtDQUFBO0NBQUEsd0JBeUV1QjtDQUVyQixhQUFPLEtBQUtHLFFBQUwsQ0FBY2IsZUFBckI7Q0FFQTtDQUVEOzs7OztDQS9FRDtDQUFBLHdCQXFGa0M7Q0FBQSxVQUFidGhCLEtBQWEsdUVBQUwsR0FBSztDQUVoQyxXQUFLbWlCLFFBQUwsQ0FBY2IsZUFBZCxHQUFnQ3RoQixLQUFoQztDQUVBO0NBRUQ7Ozs7OztDQTNGRDtDQUFBO0NBQUEsd0JBaUdrQjtDQUVoQixhQUFPLEtBQUttaUIsUUFBTCxDQUFjL0wsVUFBckI7Q0FFQTtDQUVEOzs7Q0F2R0Q7Q0FBQSx3QkEyRzBDO0NBQUEsVUFBMUJwVyxLQUEwQix1RUFBbEJxVyxXQUFXQyxLQUFPO0NBRXhDLFdBQUs2TCxRQUFMLENBQWMvTCxVQUFkLEdBQTJCcFcsS0FBM0I7Q0FFQTtDQUVEOzs7Ozs7Q0FqSEQ7Q0FBQTtDQUFBLHdCQXVIaUI7Q0FFZixhQUFPLEtBQUtvaUIsZUFBTCxDQUFxQnhPLFFBQXJCLENBQThCaUMsUUFBOUIsQ0FBdUM3VixLQUE5QztDQUVBO0NBRUQ7OztDQTdIRDtDQUFBLHdCQWlJNEI7Q0FBQSxVQUFiQSxLQUFhLHVFQUFMLEdBQUs7Q0FFMUIsV0FBS29pQixlQUFMLENBQXFCeE8sUUFBckIsQ0FBOEJpQyxRQUE5QixDQUF1QzdWLEtBQXZDLEdBQStDQSxLQUEvQztDQUVBO0NBRUQ7Ozs7OztDQXZJRDtDQUFBO0NBQUEsd0JBNkltQjtDQUVqQixhQUFPLEtBQUtxaUIsa0JBQUwsQ0FBd0J6TyxRQUF4QixDQUFpQ3FILFdBQWpDLENBQTZDamIsS0FBcEQ7Q0FFQTtDQUVEOzs7Q0FuSkQ7Q0FBQSx3QkF1SjhCO0NBQUEsVUFBYkEsS0FBYSx1RUFBTCxHQUFLO0NBRTVCLFdBQUtxaUIsa0JBQUwsQ0FBd0J6TyxRQUF4QixDQUFpQ3FILFdBQWpDLENBQTZDamIsS0FBN0MsR0FBcURBLEtBQXJEO0NBRUE7Q0FFRDs7Ozs7O0NBN0pEO0NBQUE7Q0FBQSx3QkFtS2lCO0NBRWYsYUFBTyxLQUFLbWlCLFFBQUwsQ0FBY1YsU0FBckI7Q0FFQTtDQUVEOzs7OztDQXpLRDtDQUFBLHNCQStLZXpoQixLQS9LZixFQStLc0I7Q0FFcEIsV0FBS21pQixRQUFMLENBQWNWLFNBQWQsR0FBMEJ6aEIsS0FBMUI7Q0FFQTtDQUVEOzs7Ozs7Q0FyTEQ7Q0FBQTtDQUFBLHdCQTJMYTtDQUVYLGFBQU8sS0FBS3NnQixTQUFaO0NBRUE7Q0FFRDs7Ozs7Ozs7Q0FqTUQ7Q0FBQSxzQkEwTVd0Z0IsS0ExTVgsRUEwTWtCO0NBRWhCLFdBQUtzZ0IsU0FBTCxHQUFpQnRnQixLQUFqQjtDQUVBO0NBRUQ7Ozs7OztDQWhORDtDQUFBO0NBQUEsd0JBc05lO0NBRWIsYUFBTyxLQUFLa2lCLFlBQUwsQ0FBa0IzRixPQUF6QjtDQUVBO0NBMU5GOztDQUFBOztDQUFBO0NBQUEsRUFBK0IyRCxJQUEvQjs7Q0NUQTs7Ozs7O0FBTUEsS0FBYXNDLFNBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7OztDQU9BLHFCQUFZcGdCLE1BQVosRUFBa0M7Q0FBQTs7Q0FBQSxRQUFkb0csT0FBYyx1RUFBSixFQUFJOztDQUFBOztDQUVqQyxtRkFBTSxXQUFOO0NBRUEsVUFBS2xJLFFBQUwsR0FBZ0IsSUFBSWtVLGFBQUosQ0FBa0JwUyxNQUFsQixFQUEwQm9HLE9BQTFCLENBQWhCO0NBSmlDO0NBTWpDO0NBRUQ7Ozs7Ozs7Ozs7O0NBakJEO0NBQUE7Q0FBQSwyQkEyQlFpSSxRQTNCUixFQTJCa0I4UCxXQTNCbEIsRUEyQitCQyxZQTNCL0IsRUEyQjZDdk0sS0EzQjdDLEVBMkJvRHdNLFdBM0JwRCxFQTJCaUU7Q0FFL0QsV0FBS25nQixRQUFMLENBQWNzVCxRQUFkLENBQXVCb0IsUUFBdkIsQ0FBZ0NoVixLQUFoQyxHQUF3Q3VnQixZQUFZaEUsT0FBcEQ7Q0FDQSxXQUFLamMsUUFBTCxDQUFjc1QsUUFBZCxDQUF1QnFCLE1BQXZCLENBQThCalYsS0FBOUIsR0FBc0N1Z0IsWUFBWXRKLFlBQWxEO0NBRUF4RyxlQUFTWSxNQUFULENBQWdCLEtBQUtGLEtBQXJCLEVBQTRCLEtBQUsvTyxNQUFqQyxFQUF5QyxLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBdEU7Q0FFQTtDQUVEOzs7Ozs7O0NBcENEO0NBQUE7Q0FBQSw0QkEyQ1N6ZSxLQTNDVCxFQTJDZ0JDLE1BM0NoQixFQTJDd0I7Q0FFdEIsV0FBSzFCLFFBQUwsQ0FBY3NULFFBQWQsQ0FBdUJyTixNQUF2QixDQUE4QnZHLEtBQTlCLEdBQXNDK0IsUUFBUUMsTUFBOUM7Q0FFQTtDQS9DRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQStCa2UsSUFBL0I7O0NDUEE7Ozs7QUFJQSxLQUFhdUMsYUFBYjtDQUFBO0NBQUE7Q0FFQzs7O0NBSUEsMkJBQWM7Q0FBQTs7Q0FBQTs7Q0FFYix1RkFBTSxlQUFOLEVBQXVCLElBQXZCLEVBQTZCLElBQTdCLEVBQW1DLElBQW5DO0NBRUEsVUFBS25DLFNBQUwsR0FBaUIsS0FBakI7Q0FKYTtDQU1iO0NBRUQ7Ozs7Ozs7Ozs7O0NBZEQ7Q0FBQTtDQUFBLDJCQXdCUTdQLFFBeEJSLEVBd0JrQjhQLFdBeEJsQixFQXdCK0JDLFlBeEIvQixFQXdCNkN2TSxLQXhCN0MsRUF3Qm9Ed00sV0F4QnBELEVBd0JpRTtDQUUvRGhRLGVBQVMzVCxLQUFULENBQWU0bEIsT0FBZixDQUF1QkMsT0FBdkIsQ0FBK0JDLE9BQS9CLENBQXVDLEtBQXZDO0NBRUE7Q0E1QkY7O0NBQUE7O0NBQUE7Q0FBQSxFQUFtQzFDLElBQW5DOztDQ0hBOzs7Ozs7O0NBT0EsSUFBTXhiLFFBQVEsSUFBSXdYLEtBQUosRUFBZDtDQUVBOzs7Ozs7OztBQVFBLEtBQWEyRyxTQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7O0NBUUEsdUJBQTBCO0NBQUE7O0NBQUEsUUFBZHJhLE9BQWMsdUVBQUosRUFBSTs7Q0FBQTs7Q0FFekIsbUZBQU0sV0FBTixFQUFtQixJQUFuQixFQUF5QixJQUF6QixFQUErQixJQUEvQjtDQUVBLFVBQUs4WCxTQUFMLEdBQWlCLEtBQWpCO0NBRUE7Ozs7OztDQU1BLFVBQUt3QyxVQUFMLEdBQW1CdGEsUUFBUXNhLFVBQVIsS0FBdUJsckIsU0FBeEIsR0FBcUM0USxRQUFRc2EsVUFBN0MsR0FBMEQsSUFBNUU7Q0FFQTs7Ozs7O0NBTUEsVUFBS0MsVUFBTCxHQUFtQnZhLFFBQVF1YSxVQUFSLEtBQXVCbnJCLFNBQXhCLEdBQXFDNFEsUUFBUXVhLFVBQTdDLEdBQTBELEdBQTVFO0NBcEJ5QjtDQXNCekI7Q0FFRDs7Ozs7Ozs7Ozs7Q0FsQ0Q7Q0FBQTtDQUFBLDJCQTRDUXRTLFFBNUNSLEVBNENrQjhQLFdBNUNsQixFQTRDK0JDLFlBNUMvQixFQTRDNkN2TSxLQTVDN0MsRUE0Q29Ed00sV0E1Q3BELEVBNENpRTtDQUUvRCxVQUFNcUMsYUFBYSxLQUFLQSxVQUF4QjtDQUVBLFVBQUlDLFVBQUo7O0NBRUEsVUFBR0QsZUFBZSxJQUFsQixFQUF3QjtDQUV2QnBlLGNBQU1uRyxJQUFOLENBQVdrUyxTQUFTdVMsYUFBVCxFQUFYO0NBQ0FELHFCQUFhdFMsU0FBU3dTLGFBQVQsRUFBYjtDQUNBeFMsaUJBQVNJLGFBQVQsQ0FBdUJpUyxVQUF2QixFQUFtQyxLQUFLQyxVQUF4QztDQUVBOztDQUVEdFMsZUFBU3lTLGVBQVQsQ0FBeUIsS0FBSzdDLGNBQUwsR0FBc0IsSUFBdEIsR0FBNkJFLFdBQXREO0NBQ0E5UCxlQUFTMFMsS0FBVDs7Q0FFQSxVQUFHTCxlQUFlLElBQWxCLEVBQXdCO0NBRXZCclMsaUJBQVNJLGFBQVQsQ0FBdUJuTSxLQUF2QixFQUE4QnFlLFVBQTlCO0NBRUE7Q0FFRDtDQW5FRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQStCN0MsSUFBL0I7O0NDakJBOzs7O0FBSUEsS0FBYWtELGFBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7Ozs7OztDQVVBLDJCQUEwQjtDQUFBOztDQUFBLFFBQWQ1YSxPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBRXpCLHVGQUFNLGVBQU47Q0FFQSxVQUFLbEksUUFBTCxHQUFnQixJQUFJK1csaUJBQUosQ0FBc0I3TyxPQUF0QixDQUFoQjtDQUp5QjtDQU16QjtDQUVEOzs7Ozs7Ozs7OztDQXBCRDtDQUFBO0NBQUEsMkJBOEJRaUksUUE5QlIsRUE4QmtCOFAsV0E5QmxCLEVBOEIrQkMsWUE5Qi9CLEVBOEI2Q3ZNLEtBOUI3QyxFQThCb0R3TSxXQTlCcEQsRUE4QmlFO0NBRS9ELFdBQUtuZ0IsUUFBTCxDQUFjc1QsUUFBZCxDQUF1Qm9CLFFBQXZCLENBQWdDaFYsS0FBaEMsR0FBd0N1Z0IsWUFBWWhFLE9BQXBEO0NBRUE5TCxlQUFTWSxNQUFULENBQWdCLEtBQUtGLEtBQXJCLEVBQTRCLEtBQUsvTyxNQUFqQyxFQUF5QyxLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBdEU7Q0FFQTtDQUVEOzs7Ozs7O0NBdENEO0NBQUE7Q0FBQSw0QkE2Q1N6ZSxLQTdDVCxFQTZDZ0JDLE1BN0NoQixFQTZDd0I7Q0FFdEJELGNBQVEyRCxLQUFLck4sR0FBTCxDQUFTLENBQVQsRUFBWTBKLEtBQVosQ0FBUjtDQUNBQyxlQUFTMEQsS0FBS3JOLEdBQUwsQ0FBUyxDQUFULEVBQVkySixNQUFaLENBQVQ7Q0FFQSxXQUFLMUIsUUFBTCxDQUFjc1QsUUFBZCxDQUF1QjJELFlBQXZCLENBQW9DdlgsS0FBcEMsQ0FBMENrQixDQUExQyxHQUE4Q2EsS0FBOUM7Q0FDQSxXQUFLekIsUUFBTCxDQUFjc1QsUUFBZCxDQUF1QjJELFlBQXZCLENBQW9DdlgsS0FBcEMsQ0FBMENxakIsQ0FBMUMsR0FBOENyaEIsTUFBOUM7Q0FFQTtDQXJERjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQW1Da2UsSUFBbkM7O0NDSkE7Ozs7OztBQU1BLEtBQWFvRCxRQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7OztDQVNBLHNCQUEwQjtDQUFBOztDQUFBLFFBQWQ5YSxPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBRXpCLGtGQUFNLFVBQU47Q0FFQSxVQUFLbEksUUFBTCxHQUFnQixJQUFJcVgsWUFBSixDQUFpQm5QLE9BQWpCLENBQWhCO0NBRUE7Ozs7Ozs7OztDQVNBLFVBQUsrYSxlQUFMLEdBQXdCL2EsUUFBUSthLGVBQVIsS0FBNEIzckIsU0FBN0IsR0FBMEMsSUFBMUMsR0FBaUQ0USxRQUFRK2EsZUFBaEY7Q0FFQTs7Ozs7Ozs7O0NBU0EsVUFBSzNLLFNBQUwsR0FBa0JwUSxRQUFRb1EsU0FBUixLQUFzQmhoQixTQUF2QixHQUFvQyxHQUFwQyxHQUEwQzhOLEtBQUtyTixHQUFMLENBQVNtUSxRQUFRb1EsU0FBakIsRUFBNEIsSUFBNUIsQ0FBM0Q7Q0FFQTs7Ozs7Ozs7O0NBU0EsVUFBS0MsYUFBTCxHQUFzQnJRLFFBQVFxUSxhQUFSLEtBQTBCamhCLFNBQTNCLEdBQXdDLEdBQXhDLEdBQThDOE4sS0FBS3JOLEdBQUwsQ0FBU21RLFFBQVFxUSxhQUFqQixFQUFnQyxHQUFoQyxDQUFuRTtDQXJDeUI7Q0F1Q3pCO0NBRUQ7Ozs7Ozs7Ozs7O0NBcEREO0NBQUE7Q0FBQSwyQkE4RFFwSSxRQTlEUixFQThEa0I4UCxXQTlEbEIsRUE4RCtCQyxZQTlEL0IsRUE4RDZDdk0sS0E5RDdDLEVBOERvRHdNLFdBOURwRCxFQThEaUU7Q0FFL0QsV0FBS25nQixRQUFMLENBQWNzVCxRQUFkLENBQXVCb0IsUUFBdkIsQ0FBZ0NoVixLQUFoQyxHQUF3Q3VnQixZQUFZaEUsT0FBcEQ7Q0FDQSxXQUFLamMsUUFBTCxDQUFjc1QsUUFBZCxDQUF1QjhFLElBQXZCLENBQTRCMVksS0FBNUIsSUFBcUNpVSxLQUFyQztDQUVBeEQsZUFBU1ksTUFBVCxDQUFnQixLQUFLRixLQUFyQixFQUE0QixLQUFLL08sTUFBakMsRUFBeUMsS0FBS2llLGNBQUwsR0FBc0IsSUFBdEIsR0FBNkJHLFlBQXRFO0NBRUE7Q0FFRDs7Ozs7OztDQXZFRDtDQUFBO0NBQUEsNEJBOEVTemUsS0E5RVQsRUE4RWdCQyxNQTlFaEIsRUE4RXdCO0NBRXRCLFVBQU11RSxTQUFTeEUsUUFBUUMsTUFBdkI7Q0FDQSxVQUFNNFcsWUFBWSxLQUFLQSxTQUFMLElBQWtCNVcsU0FBUyxLQUEzQixDQUFsQjtDQUVBLFdBQUsxQixRQUFMLENBQWNzVCxRQUFkLENBQXVCK0UsYUFBdkIsQ0FBcUMzWSxLQUFyQyxHQUE2QzBGLEtBQUs4ZCxLQUFMLENBQVd4aEIsU0FBUyxLQUFLdWhCLGVBQXpCLENBQTdDO0NBQ0EsV0FBS2pqQixRQUFMLENBQWNzVCxRQUFkLENBQXVCZ0YsU0FBdkIsQ0FBaUM1WSxLQUFqQyxDQUF1Q3RDLEdBQXZDLENBQTJDNkksU0FBU3FTLFNBQXBELEVBQStEQSxTQUEvRDtDQUNBLFdBQUt0WSxRQUFMLENBQWNzVCxRQUFkLENBQXVCaUYsYUFBdkIsQ0FBcUM3WSxLQUFyQyxHQUE4QzRZLFlBQVk1VyxNQUFiLEdBQXVCLEtBQUs2VyxhQUF6RTtDQUVBO0NBdkZGOztDQUFBOztDQUFBO0NBQUEsRUFBOEJxSCxJQUE5Qjs7Q0NMQTs7Ozs7Ozs7O0NBU0EsU0FBU3VELFNBQVQsQ0FBbUJDLEdBQW5CLEVBQXdCQyxJQUF4QixFQUE4QjtDQUU3QixTQUFPRCxNQUFNaGUsS0FBS29jLEtBQUwsQ0FBV3BjLEtBQUtrZSxNQUFMLE1BQWlCRCxPQUFPRCxHQUFQLEdBQWEsQ0FBOUIsQ0FBWCxDQUFiO0NBRUE7Q0FFRDs7Ozs7Ozs7OztDQVNBLFNBQVNHLFdBQVQsQ0FBcUJILEdBQXJCLEVBQTBCQyxJQUExQixFQUFnQztDQUUvQixTQUFPRCxNQUFNaGUsS0FBS2tlLE1BQUwsTUFBaUJELE9BQU9ELEdBQXhCLENBQWI7Q0FFQTtDQUVEOzs7OztBQUlBLEtBQWFJLFVBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7Ozs7Q0FRQSx3QkFBMEI7Q0FBQTs7Q0FBQSxRQUFkdGIsT0FBYyx1RUFBSixFQUFJOztDQUFBOztDQUV6QixvRkFBTSxZQUFOO0NBRUEsVUFBS2xJLFFBQUwsR0FBZ0IsSUFBSXNaLGNBQUosRUFBaEI7Q0FFQTs7Ozs7OztDQU9BLFVBQUsyQyxPQUFMLEdBQWUsSUFBZjtDQUVBLFVBQUt3SCxVQUFMLEdBQW1CdmIsUUFBUXViLFVBQVIsS0FBdUJuc0IsU0FBeEIsR0FBcUM0USxRQUFRdWIsVUFBN0MsR0FBMEQsTUFBS0Msa0JBQUwsQ0FBd0J4YixRQUFReWIsTUFBaEMsQ0FBNUU7Q0FDQSxVQUFLRixVQUFMLENBQWdCeHBCLElBQWhCLEdBQXVCLHFCQUF2QjtDQUNBLFVBQUt3cEIsVUFBTCxDQUFnQjNDLGVBQWhCLEdBQWtDLEtBQWxDO0NBRUE7Ozs7OztDQU1BLFVBQUs4QyxJQUFMLEdBQVlDLFdBQVdDLFFBQXZCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLQyxPQUFMLEdBQWUsQ0FBZjtDQUVBOzs7Ozs7O0NBT0EsVUFBS0MsVUFBTCxHQUFrQmIsVUFBVSxHQUFWLEVBQWUsR0FBZixDQUFsQjtDQTNDeUI7Q0E2Q3pCO0NBRUQ7Ozs7Ozs7Q0F6REQ7Q0FBQTs7Q0FrRkM7Ozs7OztDQWxGRCx5Q0F5RitCO0NBQUEsVUFBWDdWLElBQVcsdUVBQUosRUFBSTtDQUU3QixVQUFNMlcsU0FBUzNXLE9BQU9BLElBQXRCO0NBQ0EsVUFBTTVRLE9BQU8sSUFBSXlNLFlBQUosQ0FBaUI4YSxTQUFTLENBQTFCLENBQWI7Q0FFQSxVQUFJQyxLQUFLLEtBQUtULFVBQWQ7Q0FDQSxVQUFJM3JCLENBQUosRUFBTzRJLENBQVA7O0NBRUEsV0FBSTVJLElBQUksQ0FBUixFQUFXQSxJQUFJbXNCLE1BQWYsRUFBdUIsRUFBRW5zQixDQUF6QixFQUE0QjtDQUUzQjRJLFlBQUkwRSxLQUFLa2UsTUFBTCxFQUFKO0NBRUE1bUIsYUFBSzVFLElBQUksQ0FBVCxJQUFjNEksQ0FBZDtDQUNBaEUsYUFBSzVFLElBQUksQ0FBSixHQUFRLENBQWIsSUFBa0I0SSxDQUFsQjtDQUNBaEUsYUFBSzVFLElBQUksQ0FBSixHQUFRLENBQWIsSUFBa0I0SSxDQUFsQjtDQUVBOztDQUVELFVBQUd3akIsT0FBTyxJQUFWLEVBQWdCO0NBRWZBLFdBQUdyb0IsT0FBSDtDQUVBOztDQUVEcW9CLFdBQUssSUFBSUMsV0FBSixDQUFnQnpuQixJQUFoQixFQUFzQjRRLElBQXRCLEVBQTRCQSxJQUE1QixFQUFrQ29VLFNBQWxDLEVBQTZDMEMsU0FBN0MsQ0FBTDtDQUNBRixTQUFHalAsV0FBSCxHQUFpQixJQUFqQjtDQUVBLFdBQUt3TyxVQUFMLEdBQWtCUyxFQUFsQjtDQUVBLGFBQU9BLEVBQVA7Q0FFQTtDQUVEOzs7Ozs7Ozs7O0NBMUhEO0NBQUE7Q0FBQSwyQkFvSVEvVCxRQXBJUixFQW9Ja0I4UCxXQXBJbEIsRUFvSStCQyxZQXBJL0IsRUFvSTZDdk0sS0FwSTdDLEVBb0lvRHdNLFdBcElwRCxFQW9JaUU7Q0FFL0QsVUFBTXlELE9BQU8sS0FBS0EsSUFBbEI7Q0FDQSxVQUFNRyxVQUFVLEtBQUtBLE9BQXJCO0NBQ0EsVUFBTUMsYUFBYSxLQUFLQSxVQUF4QjtDQUNBLFVBQU0xUSxXQUFXLEtBQUt0VCxRQUFMLENBQWNzVCxRQUEvQjtDQUVBQSxlQUFTb0IsUUFBVCxDQUFrQmhWLEtBQWxCLEdBQTBCdWdCLFlBQVloRSxPQUF0QztDQUNBM0ksZUFBU21HLElBQVQsQ0FBYy9aLEtBQWQsR0FBc0IwRixLQUFLa2UsTUFBTCxFQUF0QjtDQUNBaFEsZUFBUzdYLE1BQVQsQ0FBZ0JpRSxLQUFoQixHQUF3QixJQUF4Qjs7Q0FFQSxVQUFHcWtCLFVBQVVDLFVBQVYsS0FBeUIsQ0FBekIsSUFBOEJKLFNBQVNDLFdBQVdRLGFBQXJELEVBQW9FO0NBRW5FL1EsaUJBQVNrRyxNQUFULENBQWdCOVosS0FBaEIsR0FBd0IwRixLQUFLa2UsTUFBTCxLQUFnQixJQUF4QztDQUNBaFEsaUJBQVNwTyxLQUFULENBQWV4RixLQUFmLEdBQXVCNmpCLFlBQVksQ0FBQ25lLEtBQUtDLEVBQWxCLEVBQXNCRCxLQUFLQyxFQUEzQixDQUF2QjtDQUNBaU8saUJBQVNvRyxLQUFULENBQWVoYSxLQUFmLEdBQXVCNmpCLFlBQVksQ0FBQyxHQUFiLEVBQWtCLEdBQWxCLENBQXZCO0NBQ0FqUSxpQkFBU3FHLEtBQVQsQ0FBZWphLEtBQWYsR0FBdUI2akIsWUFBWSxDQUFDLEdBQWIsRUFBa0IsR0FBbEIsQ0FBdkI7Q0FDQWpRLGlCQUFTc0csV0FBVCxDQUFxQmxhLEtBQXJCLEdBQTZCNmpCLFlBQVksR0FBWixFQUFpQixHQUFqQixDQUE3QjtDQUNBalEsaUJBQVN1RyxXQUFULENBQXFCbmEsS0FBckIsR0FBNkI2akIsWUFBWSxHQUFaLEVBQWlCLEdBQWpCLENBQTdCO0NBRUEsYUFBS1MsVUFBTCxHQUFrQmIsVUFBVSxHQUFWLEVBQWUsR0FBZixDQUFsQjtDQUNBLGFBQUtZLE9BQUwsR0FBZSxDQUFmO0NBRUEsT0FaRCxNQVlPO0NBRU4sWUFBR0EsVUFBVUMsVUFBVixHQUF1QkEsYUFBYSxDQUFwQyxJQUF5Q0osU0FBU0MsV0FBV1MsYUFBaEUsRUFBK0U7Q0FFOUVoUixtQkFBU2tHLE1BQVQsQ0FBZ0I5WixLQUFoQixHQUF3QjBGLEtBQUtrZSxNQUFMLEtBQWdCLElBQXhDO0NBQ0FoUSxtQkFBU3BPLEtBQVQsQ0FBZXhGLEtBQWYsR0FBdUI2akIsWUFBWSxDQUFDbmUsS0FBS0MsRUFBbEIsRUFBc0JELEtBQUtDLEVBQTNCLENBQXZCO0NBQ0FpTyxtQkFBU3NHLFdBQVQsQ0FBcUJsYSxLQUFyQixHQUE2QjZqQixZQUFZLEdBQVosRUFBaUIsR0FBakIsQ0FBN0I7Q0FDQWpRLG1CQUFTdUcsV0FBVCxDQUFxQm5hLEtBQXJCLEdBQTZCNmpCLFlBQVksR0FBWixFQUFpQixHQUFqQixDQUE3QjtDQUNBalEsbUJBQVNvRyxLQUFULENBQWVoYSxLQUFmLEdBQXVCNmpCLFlBQVksQ0FBQyxHQUFiLEVBQWtCLEdBQWxCLENBQXZCO0NBQ0FqUSxtQkFBU3FHLEtBQVQsQ0FBZWphLEtBQWYsR0FBdUI2akIsWUFBWSxDQUFDLEdBQWIsRUFBa0IsR0FBbEIsQ0FBdkI7Q0FFQSxTQVRELE1BU087Q0FFTjtDQUNBalEsbUJBQVM3WCxNQUFULENBQWdCaUUsS0FBaEIsR0FBd0IsS0FBeEI7Q0FFQTtDQUVEOztDQUVELFFBQUUsS0FBS3FrQixPQUFQO0NBRUE1VCxlQUFTWSxNQUFULENBQWdCLEtBQUtGLEtBQXJCLEVBQTRCLEtBQUsvTyxNQUFqQyxFQUF5QyxLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBdEU7Q0FFQTtDQW5MRjtDQUFBO0NBQUEsd0JBK0RrQjtDQUVoQixhQUFPLEtBQUtqRSxPQUFaO0NBRUE7Q0FFRDs7Ozs7Q0FyRUQ7Q0FBQSxzQkEyRWdCdmMsS0EzRWhCLEVBMkV1QjtDQUVyQixXQUFLdWMsT0FBTCxHQUFldmMsS0FBZjtDQUNBLFdBQUtNLFFBQUwsQ0FBY3NULFFBQWQsQ0FBdUJpRyxRQUF2QixDQUFnQzdaLEtBQWhDLEdBQXdDQSxLQUF4QztDQUVBO0NBaEZGOztDQUFBOztDQUFBO0NBQUEsRUFBZ0NrZ0IsSUFBaEM7Q0F1TEE7Ozs7Ozs7OztBQVNBLENBQU8sSUFBTWlFLGFBQWE7Q0FFekJDLFlBQVUsQ0FGZTtDQUd6QlEsaUJBQWUsQ0FIVTtDQUl6QkQsaUJBQWU7Q0FKVSxDQUFuQjs7Q0NuT1A7Ozs7O0FBS0EsS0FBYUUsVUFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Ozs7Ozs7O0NBYUEsc0JBQVkxVCxLQUFaLEVBQW1CL08sTUFBbkIsRUFBeUM7Q0FBQTs7Q0FBQSxRQUFkb0csT0FBYyx1RUFBSixFQUFJOztDQUFBOztDQUV4QyxvRkFBTSxZQUFOLEVBQW9CMkksS0FBcEIsRUFBMkIvTyxNQUEzQixFQUFtQyxJQUFuQztDQUVBLFVBQUtrZSxTQUFMLEdBQWlCLEtBQWpCO0NBRUE7Ozs7OztDQU1BLFVBQUt3RSxTQUFMLEdBQWlCLElBQUlqQyxTQUFKLENBQWNyYSxPQUFkLENBQWpCO0NBRUE7Ozs7OztDQU1BLFVBQUt1YyxnQkFBTCxHQUF5QnZjLFFBQVF1YyxnQkFBUixLQUE2Qm50QixTQUE5QixHQUEyQzRRLFFBQVF1YyxnQkFBbkQsR0FBc0UsSUFBOUY7Q0FFQTs7Ozs7O0NBTUEsVUFBS0MsVUFBTCxHQUFtQnhjLFFBQVF3YyxVQUFSLEtBQXVCcHRCLFNBQXhCLEdBQXFDNFEsUUFBUXdjLFVBQTdDLEdBQTBELEtBQTVFO0NBRUE7Ozs7Ozs7Ozs7Q0FVQSxVQUFLN0IsS0FBTCxHQUFjM2EsUUFBUTJhLEtBQVIsS0FBa0J2ckIsU0FBbkIsR0FBZ0M0USxRQUFRMmEsS0FBeEMsR0FBZ0QsSUFBN0Q7Q0F4Q3dDO0NBMEN4QztDQUVEOzs7Ozs7Ozs7OztDQTNERDtDQUFBO0NBQUEsMkJBcUVRMVMsUUFyRVIsRUFxRWtCOFAsV0FyRWxCLEVBcUUrQkMsWUFyRS9CLEVBcUU2Q3ZNLEtBckU3QyxFQXFFb0R3TSxXQXJFcEQsRUFxRWlFO0NBRS9ELFVBQU10UCxRQUFRLEtBQUtBLEtBQW5CO0NBQ0EsVUFBTStRLGVBQWUsS0FBSzdCLGNBQUwsR0FBc0IsSUFBdEIsR0FBNkJFLFdBQWxEO0NBQ0EsVUFBTXdFLG1CQUFtQjVULE1BQU00VCxnQkFBL0I7O0NBRUEsVUFBRyxLQUFLNUIsS0FBUixFQUFlO0NBRWQsYUFBSzJCLFNBQUwsQ0FBZXpFLGNBQWYsR0FBZ0MsS0FBS0EsY0FBckM7Q0FDQSxhQUFLeUUsU0FBTCxDQUFlelQsTUFBZixDQUFzQlosUUFBdEIsRUFBZ0M4UCxXQUFoQztDQUVBLE9BTEQsTUFLTyxJQUFHLEtBQUt5RSxVQUFSLEVBQW9CO0NBRTFCdlUsaUJBQVN5UyxlQUFULENBQXlCaEIsWUFBekI7Q0FDQXpSLGlCQUFTdVUsVUFBVDtDQUVBOztDQUVEN1QsWUFBTTRULGdCQUFOLEdBQXlCLEtBQUtBLGdCQUE5QjtDQUNBdFUsZUFBU1ksTUFBVCxDQUFnQkYsS0FBaEIsRUFBdUIsS0FBSy9PLE1BQTVCLEVBQW9DOGYsWUFBcEM7Q0FDQS9RLFlBQU00VCxnQkFBTixHQUF5QkEsZ0JBQXpCO0NBRUE7Q0EzRkY7O0NBQUE7O0NBQUE7Q0FBQSxFQUFnQzdFLElBQWhDOztDQ09BOzs7Ozs7Ozs7O0NBVUEsU0FBUytFLEtBQVQsQ0FBZWpsQixLQUFmLEVBQXNCL04sR0FBdEIsRUFBMkJvRyxHQUEzQixFQUFnQztDQUUvQixTQUFPcU4sS0FBS3JOLEdBQUwsQ0FBU3BHLEdBQVQsRUFBY3lULEtBQUt6VCxHQUFMLENBQVNvRyxHQUFULEVBQWMySCxLQUFkLENBQWQsQ0FBUDtDQUVBO0NBRUQ7Ozs7O0FBSUEsS0FBYWtsQixXQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQkEsdUJBQVkvVCxLQUFaLEVBQW1CL08sTUFBbkIsRUFBMkIraUIsV0FBM0IsRUFBc0Q7Q0FBQTs7Q0FBQSxRQUFkM2MsT0FBYyx1RUFBSixFQUFJOztDQUFBOztDQUVyRCxxRkFBTSxhQUFOO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLNGMsVUFBTCxHQUFrQixJQUFJOVMsS0FBSixFQUFsQjtDQUVBOzs7Ozs7O0NBT0EsVUFBSytTLFNBQUwsR0FBaUJsVSxLQUFqQjtDQUVBOzs7Ozs7O0NBT0EsVUFBS21VLFVBQUwsR0FBa0JsakIsTUFBbEI7Q0FFQTs7Ozs7OztDQU9BLFVBQUt5ZSxhQUFMLEdBQXFCLElBQUlDLGlCQUFKLENBQXNCLENBQXRCLEVBQXlCLENBQXpCLEVBQTRCO0NBQ2hEQyxpQkFBV0MsWUFEcUM7Q0FFaERDLGlCQUFXRCxZQUZxQztDQUdoREUscUJBQWUsS0FIaUM7Q0FJaERDLG1CQUFhO0NBSm1DLEtBQTVCLENBQXJCO0NBT0EsVUFBS04sYUFBTCxDQUFtQnRFLE9BQW5CLENBQTJCaGlCLElBQTNCLEdBQWtDLGlCQUFsQztDQUNBLFVBQUtzbUIsYUFBTCxDQUFtQnRFLE9BQW5CLENBQTJCNkUsZUFBM0IsR0FBNkMsS0FBN0M7Q0FFQTs7Ozs7OztDQU9BLFVBQUtDLGFBQUwsR0FBcUIsTUFBS1IsYUFBTCxDQUFtQm5pQixLQUFuQixFQUFyQjtDQUVBLFVBQUsyaUIsYUFBTCxDQUFtQjlFLE9BQW5CLENBQTJCaGlCLElBQTNCLEdBQWtDLGlCQUFsQztDQUVBOzs7Ozs7O0NBT0EsVUFBS2dyQixnQkFBTCxHQUF3QixJQUFJekUsaUJBQUosQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEI7Q0FDbkRDLGlCQUFXQyxZQUR3QztDQUVuREMsaUJBQVdEO0NBRndDLEtBQTVCLENBQXhCO0NBS0EsVUFBS3VFLGdCQUFMLENBQXNCaEosT0FBdEIsQ0FBOEJoaUIsSUFBOUIsR0FBcUMsY0FBckM7Q0FDQSxVQUFLZ3JCLGdCQUFMLENBQXNCaEosT0FBdEIsQ0FBOEI2RSxlQUE5QixHQUFnRCxLQUFoRDtDQUVBOzs7Ozs7O0NBT0EsVUFBS29FLGVBQUwsR0FBdUIsSUFBSVgsVUFBSixDQUFlLE1BQUtPLFVBQXBCLEVBQWdDLE1BQUtFLFVBQXJDLEVBQWlEO0NBQ3ZFeEMsa0JBQVksSUFBSTVHLEtBQUosQ0FBVSxRQUFWO0NBRDJELEtBQWpELENBQXZCO0NBSUE7Ozs7Ozs7Q0FPQSxVQUFLdUosY0FBTCxHQUFzQixJQUFJWixVQUFKLENBQWUsTUFBS1EsU0FBcEIsRUFBK0IsTUFBS0MsVUFBcEMsRUFBZ0Q7Q0FDckVQLHdCQUFrQixJQUFJVyxpQkFBSixDQUFzQjtDQUFFaGhCLGVBQU87Q0FBVCxPQUF0QjtDQURtRCxLQUFoRCxDQUF0QjtDQUlBLFVBQUsrZ0IsY0FBTCxDQUFvQnRDLEtBQXBCLEdBQTRCLEtBQTVCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLaEIsUUFBTCxHQUFnQixJQUFJdkIsUUFBSixDQUFhcFksT0FBYixDQUFoQjtDQUVBOzs7Ozs7Q0FNQSxVQUFLMmMsV0FBTCxHQUFtQkEsV0FBbkI7Q0FFQTs7Ozs7OztDQU9BLFVBQUtRLGNBQUwsR0FBc0IsSUFBSWhhLE9BQUosRUFBdEI7Q0FFQTs7Ozs7OztDQU9BLFVBQUtpYSxlQUFMLEdBQXVCLElBQUl2TCxlQUFKLENBQW9CN1IsT0FBcEIsQ0FBdkI7Q0FDQSxVQUFLb2QsZUFBTCxDQUFxQmhTLFFBQXJCLENBQThCZ0gsYUFBOUIsQ0FBNEM1YSxLQUE1QyxHQUFvRCxNQUFLMmxCLGNBQXpEO0NBRUEsVUFBSzNJLE9BQUwsR0FBZXhVLFFBQVF3VSxPQUF2QjtDQUVBOzs7Ozs7O0NBT0EsVUFBS29GLGVBQUwsR0FBdUIsSUFBSTVNLGVBQUosQ0FBcUJoTixRQUFRaU4sVUFBUixLQUF1QjdkLFNBQXhCLEdBQXFDNFEsUUFBUWlOLFVBQTdDLEdBQTBELElBQTlFLENBQXZCO0NBRUEsVUFBSzlRLFNBQUwsR0FBaUI2RCxRQUFRN0QsU0FBekI7Q0FqSnFEO0NBbUpyRDtDQUVEOzs7Ozs7O0NBMUtEO0NBQUE7O0NBK1VDOzs7Ozs7Ozs7Q0EvVUQsMkJBeVZROEwsUUF6VlIsRUF5VmtCOFAsV0F6VmxCLEVBeVYrQkMsWUF6Vi9CLEVBeVY2Q3ZNLEtBelY3QyxFQXlWb0R3TSxXQXpWcEQsRUF5VmlFO0NBRS9ELFVBQU10UCxRQUFRLEtBQUtBLEtBQW5CO0NBQ0EsVUFBTS9PLFNBQVMsS0FBS0EsTUFBcEI7Q0FDQSxVQUFNaWpCLFlBQVksS0FBS0EsU0FBdkI7Q0FFQSxVQUFNRixjQUFjLEtBQUtBLFdBQXpCO0NBQ0EsVUFBTVEsaUJBQWlCLEtBQUtBLGNBQTVCO0NBRUEsVUFBTUMsa0JBQWtCLEtBQUtBLGVBQTdCO0NBQ0EsVUFBTXhELGtCQUFrQixLQUFLQSxlQUE3QjtDQUVBLFVBQU1tRCxtQkFBbUIsS0FBS0EsZ0JBQTlCO0NBQ0EsVUFBTTFFLGdCQUFnQixLQUFLQSxhQUEzQjtDQUNBLFVBQU1RLGdCQUFnQixLQUFLQSxhQUEzQjtDQUVBLFVBQUl3RSxVQUFKLEVBQWdCbG5CLE1BQWhCLENBaEIrRDs7Q0FtQi9EZ25CLHFCQUFlcG5CLElBQWYsQ0FBb0I0bUIsWUFBWXZrQixRQUFoQyxFQUEwQ2tsQixPQUExQyxDQUFrRCxLQUFLUixVQUF2RDtDQUNBSyxxQkFBZTNrQixDQUFmLEdBQW1CaWtCLE1BQU0sQ0FBQ1UsZUFBZTNrQixDQUFmLEdBQW1CLEdBQXBCLElBQTJCLEdBQWpDLEVBQXNDLEdBQXRDLEVBQTJDLEdBQTNDLENBQW5CO0NBQ0Eya0IscUJBQWUxa0IsQ0FBZixHQUFtQmdrQixNQUFNLENBQUNVLGVBQWUxa0IsQ0FBZixHQUFtQixHQUFwQixJQUEyQixHQUFqQyxFQUFzQyxHQUF0QyxFQUEyQyxHQUEzQyxDQUFuQjtDQUVBdEMsZUFBU3dtQixZQUFZeG1CLE1BQXJCO0NBQ0FrbkIsbUJBQWFSLFVBQVVRLFVBQXZCO0NBQ0FSLGdCQUFVUSxVQUFWLEdBQXVCLElBQXZCO0NBQ0EsV0FBS1QsVUFBTCxDQUFnQnRtQixHQUFoQixDQUFvQnFtQixXQUFwQjtDQUVBOzs7Q0FFQSxXQUFLSyxlQUFMLENBQXFCblUsTUFBckIsQ0FBNEJaLFFBQTVCLEVBQXNDOFUsZ0JBQXRDO0NBQ0EsV0FBS0UsY0FBTCxDQUFvQnBVLE1BQXBCLENBQTJCWixRQUEzQixFQUFxQzhVLGdCQUFyQzs7Q0FFQSxVQUFHNW1CLFdBQVcsSUFBZCxFQUFvQjtDQUVuQkEsZUFBT0csR0FBUCxDQUFXcW1CLFdBQVg7Q0FFQTs7Q0FFREUsZ0JBQVVRLFVBQVYsR0FBdUJBLFVBQXZCLENBdkMrRDs7Q0EwQy9ELFdBQUsxRCxRQUFMLENBQWM5USxNQUFkLENBQXFCWixRQUFyQixFQUErQixLQUFLOFUsZ0JBQXBDLEVBQXNEMUUsYUFBdEQsRUExQytEOztDQTZDL0QsV0FBS3ZnQixRQUFMLEdBQWdCc2xCLGVBQWhCO0NBQ0FBLHNCQUFnQmhTLFFBQWhCLENBQXlCb0IsUUFBekIsQ0FBa0NoVixLQUFsQyxHQUEwQzZnQixjQUFjdEUsT0FBeEQ7Q0FDQTlMLGVBQVNZLE1BQVQsQ0FBZ0JGLEtBQWhCLEVBQXVCL08sTUFBdkIsRUFBK0JpZixhQUEvQjs7Q0FFQSxVQUFHLEtBQUtpQixLQUFSLEVBQWU7Q0FFZDtDQUNBLGFBQUtoaUIsUUFBTCxHQUFnQjhoQixlQUFoQjtDQUNBQSx3QkFBZ0J4TyxRQUFoQixDQUF5QjhCLFFBQXpCLENBQWtDMVYsS0FBbEMsR0FBMEN1Z0IsWUFBWWhFLE9BQXREO0NBQ0E2Rix3QkFBZ0J4TyxRQUFoQixDQUF5QitCLFFBQXpCLENBQWtDM1YsS0FBbEMsR0FBMENxaEIsY0FBYzlFLE9BQXhEO0NBRUE5TCxpQkFBU1ksTUFBVCxDQUFnQkYsS0FBaEIsRUFBdUIvTyxNQUF2QixFQUErQixLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBNUQ7Q0FFQTtDQUVEO0NBRUQ7Ozs7Ozs7Q0F2WkQ7Q0FBQTtDQUFBLDRCQThaU3plLEtBOVpULEVBOFpnQkMsTUE5WmhCLEVBOFp3QjtDQUV0QixXQUFLd2pCLGVBQUwsQ0FBcUJ6VSxPQUFyQixDQUE2QmhQLEtBQTdCLEVBQW9DQyxNQUFwQztDQUNBLFdBQUt5akIsY0FBTCxDQUFvQjFVLE9BQXBCLENBQTRCaFAsS0FBNUIsRUFBbUNDLE1BQW5DO0NBQ0EsV0FBS21nQixRQUFMLENBQWNwUixPQUFkLENBQXNCaFAsS0FBdEIsRUFBNkJDLE1BQTdCO0NBRUFELGNBQVEsS0FBS29nQixRQUFMLENBQWNwZ0IsS0FBdEI7Q0FDQUMsZUFBUyxLQUFLbWdCLFFBQUwsQ0FBY25nQixNQUF2QjtDQUVBLFdBQUt1akIsZ0JBQUwsQ0FBc0J4VSxPQUF0QixDQUE4QmhQLEtBQTlCLEVBQXFDQyxNQUFyQztDQUNBLFdBQUs2ZSxhQUFMLENBQW1COVAsT0FBbkIsQ0FBMkJoUCxLQUEzQixFQUFrQ0MsTUFBbEM7Q0FDQSxXQUFLcWYsYUFBTCxDQUFtQnRRLE9BQW5CLENBQTJCaFAsS0FBM0IsRUFBa0NDLE1BQWxDO0NBRUE7Q0FFRDs7Ozs7OztDQTdhRDtDQUFBO0NBQUEsK0JBb2JZeU8sUUFwYlosRUFvYnNCaVEsS0FwYnRCLEVBb2I2QjtDQUUzQixXQUFLOEUsZUFBTCxDQUFxQmpELFVBQXJCLENBQWdDOVIsUUFBaEMsRUFBMENpUSxLQUExQztDQUNBLFdBQUsrRSxjQUFMLENBQW9CbEQsVUFBcEIsQ0FBK0I5UixRQUEvQixFQUF5Q2lRLEtBQXpDO0NBQ0EsV0FBS3lCLFFBQUwsQ0FBY0ksVUFBZCxDQUF5QjlSLFFBQXpCLEVBQW1DaVEsS0FBbkM7O0NBRUEsVUFBRyxDQUFDQSxLQUFKLEVBQVc7Q0FFVixhQUFLNkUsZ0JBQUwsQ0FBc0JoSixPQUF0QixDQUE4QndGLE1BQTlCLEdBQXVDQyxTQUF2QztDQUNBLGFBQUtuQixhQUFMLENBQW1CdEUsT0FBbkIsQ0FBMkJ3RixNQUEzQixHQUFvQ0MsU0FBcEM7Q0FDQSxhQUFLWCxhQUFMLENBQW1COUUsT0FBbkIsQ0FBMkJ3RixNQUEzQixHQUFvQ0MsU0FBcEM7Q0FFQTtDQUVEO0NBbGNGO0NBQUE7Q0FBQSx3QkFnTHVCO0NBRXJCLGFBQU8sS0FBS0csUUFBTCxDQUFjYixlQUFyQjtDQUVBO0NBRUQ7Ozs7O0NBdExEO0NBQUEsd0JBNExrQztDQUFBLFVBQWJ0aEIsS0FBYSx1RUFBTCxHQUFLO0NBRWhDLFdBQUttaUIsUUFBTCxDQUFjYixlQUFkLEdBQWdDdGhCLEtBQWhDO0NBRUE7Q0FFRDs7Ozs7O0NBbE1EO0NBQUE7Q0FBQSx3QkF3TWtCO0NBRWhCLGFBQU8sS0FBS21pQixRQUFMLENBQWMvTCxVQUFyQjtDQUVBO0NBRUQ7OztDQTlNRDtDQUFBLHdCQWtOMEM7Q0FBQSxVQUExQnBXLEtBQTBCLHVFQUFsQnFXLFdBQVdDLEtBQU87Q0FFeEMsV0FBSzZMLFFBQUwsQ0FBYy9MLFVBQWQsR0FBMkJwVyxLQUEzQjtDQUVBO0NBRUQ7Ozs7OztDQXhORDtDQUFBO0NBQUEsd0JBOE5pQjtDQUVmLGFBQU8sS0FBS29pQixlQUFMLENBQXFCeE8sUUFBckIsQ0FBOEJpQyxRQUE5QixDQUF1QzdWLEtBQTlDO0NBRUE7Q0FFRDs7O0NBcE9EO0NBQUEsd0JBd080QjtDQUFBLFVBQWJBLEtBQWEsdUVBQUwsR0FBSztDQUUxQixXQUFLb2lCLGVBQUwsQ0FBcUJ4TyxRQUFyQixDQUE4QmlDLFFBQTlCLENBQXVDN1YsS0FBdkMsR0FBK0NBLEtBQS9DO0NBRUE7Q0FFRDs7Ozs7O0NBOU9EO0NBQUE7Q0FBQSx3QkFvUGU7Q0FFYixhQUFPZ1IsT0FBTytVLFFBQVAsQ0FBZ0IsS0FBS0gsZUFBTCxDQUFxQmxTLE9BQXJCLENBQTZCaUgsZUFBN0MsQ0FBUDtDQUVBO0NBRUQ7Ozs7OztDQTFQRDtDQUFBLHdCQWlReUI7Q0FBQSxVQUFaM2EsS0FBWSx1RUFBSixFQUFJO0NBRXZCQSxjQUFRMEYsS0FBS29jLEtBQUwsQ0FBVzloQixLQUFYLENBQVI7Q0FFQSxXQUFLNGxCLGVBQUwsQ0FBcUJsUyxPQUFyQixDQUE2QmdILGlCQUE3QixHQUFpRDFhLE1BQU1pUixPQUFOLENBQWMsQ0FBZCxDQUFqRDtDQUNBLFdBQUsyVSxlQUFMLENBQXFCbFMsT0FBckIsQ0FBNkJpSCxlQUE3QixHQUErQzNhLE1BQU1pUixPQUFOLENBQWMsQ0FBZCxDQUEvQztDQUNBLFdBQUsyVSxlQUFMLENBQXFCclEsV0FBckIsR0FBbUMsSUFBbkM7Q0FFQTtDQUVEOzs7Ozs7Q0EzUUQ7Q0FBQTtDQUFBLHdCQWlSaUI7Q0FFZixhQUFPLEtBQUtxUSxlQUFMLENBQXFCbkUsU0FBNUI7Q0FFQTtDQUVEOzs7OztDQXZSRDtDQUFBLHNCQTZSZXpoQixLQTdSZixFQTZSc0I7Q0FFcEIsVUFBRyxLQUFLeWhCLFNBQUwsS0FBbUJ6aEIsS0FBdEIsRUFBNkI7Q0FFNUIsYUFBSzRsQixlQUFMLENBQXFCbkUsU0FBckIsR0FBaUN6aEIsS0FBakM7Q0FDQSxhQUFLNGxCLGVBQUwsQ0FBcUJyUSxXQUFyQixHQUFtQyxJQUFuQztDQUVBO0NBRUQ7Q0FFRDs7Ozs7O0NBeFNEO0NBQUE7Q0FBQSx3QkE4U2E7Q0FFWCxhQUFPLEtBQUsrSyxTQUFaO0NBRUE7Q0FFRDs7Ozs7Ozs7Q0FwVEQ7Q0FBQSxzQkE2VFd0Z0IsS0E3VFgsRUE2VGtCO0NBRWhCLFdBQUtzZ0IsU0FBTCxHQUFpQnRnQixLQUFqQjtDQUVBO0NBRUQ7Ozs7OztDQW5VRDtDQUFBO0NBQUEsd0JBeVVlO0NBRWIsYUFBTyxLQUFLcWhCLGFBQUwsQ0FBbUI5RSxPQUExQjtDQUVBO0NBN1VGOztDQUFBOztDQUFBO0NBQUEsRUFBaUMyRCxJQUFqQzs7Q0NqQ0E7Ozs7QUFJQSxLQUFhOEYsUUFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7O0NBT0Esb0JBQVk3VSxLQUFaLEVBQW1CL08sTUFBbkIsRUFBMkI7Q0FBQTs7Q0FBQTs7Q0FFMUIsa0ZBQU0sVUFBTixFQUFrQitPLEtBQWxCLEVBQXlCL08sTUFBekIsRUFBaUMsSUFBakM7Q0FFQSxVQUFLa2UsU0FBTCxHQUFpQixLQUFqQjtDQUVBOzs7Ozs7Q0FNQSxVQUFLMkYsT0FBTCxHQUFlLEtBQWY7Q0FFQTs7Ozs7O0NBTUEsVUFBS0MsWUFBTCxHQUFvQixJQUFwQjtDQXBCMEI7Q0FzQjFCO0NBRUQ7Ozs7Ozs7Ozs7O0NBakNEO0NBQUE7Q0FBQSwyQkEyQ1F6VixRQTNDUixFQTJDa0I4UCxXQTNDbEIsRUEyQytCQyxZQTNDL0IsRUEyQzZDdk0sS0EzQzdDLEVBMkNvRHdNLFdBM0NwRCxFQTJDaUU7Q0FFL0QsVUFBTTBGLFVBQVUxVixTQUFTMFYsT0FBekI7Q0FDQSxVQUFNcnBCLFFBQVEyVCxTQUFTM1QsS0FBdkI7Q0FFQSxVQUFNcVUsUUFBUSxLQUFLQSxLQUFuQjtDQUNBLFVBQU0vTyxTQUFTLEtBQUtBLE1BQXBCO0NBRUEsVUFBTWdrQixhQUFhLEtBQUtILE9BQUwsR0FBZSxDQUFmLEdBQW1CLENBQXRDO0NBQ0EsVUFBTUksYUFBYSxJQUFJRCxVQUF2QixDQVQrRDs7Q0FZL0R0cEIsWUFBTTRsQixPQUFOLENBQWNoZSxLQUFkLENBQW9CNGhCLE9BQXBCLENBQTRCLEtBQTVCO0NBQ0F4cEIsWUFBTTRsQixPQUFOLENBQWM3YixLQUFkLENBQW9CeWYsT0FBcEIsQ0FBNEIsS0FBNUIsRUFiK0Q7O0NBZ0IvRHhwQixZQUFNNGxCLE9BQU4sQ0FBY2hlLEtBQWQsQ0FBb0I2aEIsU0FBcEIsQ0FBOEIsSUFBOUI7Q0FDQXpwQixZQUFNNGxCLE9BQU4sQ0FBYzdiLEtBQWQsQ0FBb0IwZixTQUFwQixDQUE4QixJQUE5QixFQWpCK0Q7O0NBb0IvRHpwQixZQUFNNGxCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQkMsT0FBdEIsQ0FBOEIsSUFBOUI7Q0FDQTlsQixZQUFNNGxCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQjZELEtBQXRCLENBQTRCTCxRQUFRTSxPQUFwQyxFQUE2Q04sUUFBUU0sT0FBckQsRUFBOEROLFFBQVFNLE9BQXRFO0NBQ0EzcEIsWUFBTTRsQixPQUFOLENBQWNDLE9BQWQsQ0FBc0IrRCxPQUF0QixDQUE4QlAsUUFBUVEsTUFBdEMsRUFBOENQLFVBQTlDLEVBQTBELFVBQTFEO0NBQ0F0cEIsWUFBTTRsQixPQUFOLENBQWNDLE9BQWQsQ0FBc0JpRSxRQUF0QixDQUErQlAsVUFBL0IsRUF2QitEOztDQTBCL0QsVUFBRyxLQUFLSCxZQUFSLEVBQXNCO0NBRXJCLFlBQUcsS0FBSzdGLGNBQVIsRUFBd0I7Q0FFdkI1UCxtQkFBU3lTLGVBQVQsQ0FBeUIsSUFBekI7Q0FDQXpTLG1CQUFTeVYsWUFBVDtDQUVBLFNBTEQsTUFLTztDQUVOelYsbUJBQVN5UyxlQUFULENBQXlCM0MsV0FBekI7Q0FDQTlQLG1CQUFTeVYsWUFBVDtDQUVBelYsbUJBQVN5UyxlQUFULENBQXlCMUMsWUFBekI7Q0FDQS9QLG1CQUFTeVYsWUFBVDtDQUVBO0NBRUQsT0EzQzhEOzs7Q0E4Qy9ELFVBQUcsS0FBSzdGLGNBQVIsRUFBd0I7Q0FFdkI1UCxpQkFBU1ksTUFBVCxDQUFnQkYsS0FBaEIsRUFBdUIvTyxNQUF2QixFQUErQixJQUEvQjtDQUVBLE9BSkQsTUFJTztDQUVOcU8saUJBQVNZLE1BQVQsQ0FBZ0JGLEtBQWhCLEVBQXVCL08sTUFBdkIsRUFBK0JtZSxXQUEvQjtDQUNBOVAsaUJBQVNZLE1BQVQsQ0FBZ0JGLEtBQWhCLEVBQXVCL08sTUFBdkIsRUFBK0JvZSxZQUEvQjtDQUVBLE9BdkQ4RDs7O0NBMEQvRDFqQixZQUFNNGxCLE9BQU4sQ0FBY2hlLEtBQWQsQ0FBb0I2aEIsU0FBcEIsQ0FBOEIsS0FBOUI7Q0FDQXpwQixZQUFNNGxCLE9BQU4sQ0FBYzdiLEtBQWQsQ0FBb0IwZixTQUFwQixDQUE4QixLQUE5QixFQTNEK0Q7O0NBOEQvRHpwQixZQUFNNGxCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQitELE9BQXRCLENBQThCUCxRQUFRVSxLQUF0QyxFQUE2QyxDQUE3QyxFQUFnRCxVQUFoRDtDQUNBL3BCLFlBQU00bEIsT0FBTixDQUFjQyxPQUFkLENBQXNCNkQsS0FBdEIsQ0FBNEJMLFFBQVFXLElBQXBDLEVBQTBDWCxRQUFRVyxJQUFsRCxFQUF3RFgsUUFBUVcsSUFBaEU7Q0FFQTtDQTVHRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQThCNUcsSUFBOUI7O0NDSkE7Ozs7OztBQU1BLEtBQWE2RyxVQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7Q0FPQSxzQkFBWXptQixRQUFaLEVBQThDO0NBQUE7O0NBQUEsUUFBeEIwbUIsU0FBd0IsdUVBQVosVUFBWTs7Q0FBQTs7Q0FFN0Msb0ZBQU0sWUFBTjtDQUVBLFVBQUsxbUIsUUFBTCxHQUFnQkEsUUFBaEI7Q0FFQTs7Ozs7O0NBTUEsVUFBSzBtQixTQUFMLEdBQWlCQSxTQUFqQjtDQVo2QztDQWM3QztDQUVEOzs7Ozs7Ozs7OztDQXpCRDtDQUFBO0NBQUEsMkJBbUNRdlcsUUFuQ1IsRUFtQ2tCOFAsV0FuQ2xCLEVBbUMrQkMsWUFuQy9CLEVBbUM2Q3ZNLEtBbkM3QyxFQW1Db0R3TSxXQW5DcEQsRUFtQ2lFO0NBRS9ELFVBQUcsS0FBS25nQixRQUFMLENBQWNzVCxRQUFkLENBQXVCLEtBQUtvVCxTQUE1QixNQUEyQ3B2QixTQUE5QyxFQUF5RDtDQUV4RCxhQUFLMEksUUFBTCxDQUFjc1QsUUFBZCxDQUF1QixLQUFLb1QsU0FBNUIsRUFBdUNobkIsS0FBdkMsR0FBK0N1Z0IsWUFBWWhFLE9BQTNEO0NBRUE7O0NBRUQ5TCxlQUFTWSxNQUFULENBQWdCLEtBQUtGLEtBQXJCLEVBQTRCLEtBQUsvTyxNQUFqQyxFQUF5QyxLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBdEU7Q0FFQTtDQTdDRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQWdDTixJQUFoQzs7Q0NjQTs7OztBQUlBLEtBQWErRyxXQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7Ozs7Q0FVQSx1QkFBWTlWLEtBQVosRUFBbUIvTyxNQUFuQixFQUF5QztDQUFBOztDQUFBLFFBQWRvRyxPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBRXhDLHFGQUFNLGFBQU47Q0FFQTs7Ozs7OztDQU9BLFVBQUs2YyxTQUFMLEdBQWlCbFUsS0FBakI7Q0FFQTs7Ozs7OztDQU9BLFVBQUttVSxVQUFMLEdBQWtCbGpCLE1BQWxCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLOGtCLGlCQUFMLEdBQXlCLElBQUlwRyxpQkFBSixDQUFzQixDQUF0QixFQUF5QixDQUF6QixFQUE0QjtDQUNwREMsaUJBQVdDLFlBRHlDO0NBRXBEQyxpQkFBV0Q7Q0FGeUMsS0FBNUIsQ0FBekI7Q0FLQSxVQUFLa0csaUJBQUwsQ0FBdUIzSyxPQUF2QixDQUErQmhpQixJQUEvQixHQUFzQyxlQUF0QztDQUNBLFVBQUsyc0IsaUJBQUwsQ0FBdUIzSyxPQUF2QixDQUErQjZFLGVBQS9CLEdBQWlELEtBQWpEO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLbUUsZ0JBQUwsR0FBd0IsTUFBSzJCLGlCQUFMLENBQXVCeG9CLEtBQXZCLEVBQXhCO0NBRUEsVUFBSzZtQixnQkFBTCxDQUFzQmhKLE9BQXRCLENBQThCd0YsTUFBOUIsR0FBdUNDLFNBQXZDO0NBQ0EsVUFBS3VELGdCQUFMLENBQXNCaEosT0FBdEIsQ0FBOEJoaUIsSUFBOUIsR0FBcUMsY0FBckM7Q0FFQTs7Ozs7OztDQU9BLFVBQUs0c0IsaUJBQUwsR0FBeUIsSUFBSXJHLGlCQUFKLENBQXNCLENBQXRCLEVBQXlCLENBQXpCLEVBQTRCO0NBQ3BEQyxpQkFBV0MsWUFEeUM7Q0FFcERDLGlCQUFXRCxZQUZ5QztDQUdwREUscUJBQWUsS0FIcUM7Q0FJcERDLG1CQUFhLEtBSnVDO0NBS3BEWSxjQUFRQztDQUw0QyxLQUE1QixDQUF6QjtDQVFBLFVBQUttRixpQkFBTCxDQUF1QjVLLE9BQXZCLENBQStCaGlCLElBQS9CLEdBQXNDLGVBQXRDO0NBQ0EsVUFBSzRzQixpQkFBTCxDQUF1QjVLLE9BQXZCLENBQStCNkUsZUFBL0IsR0FBaUQsS0FBakQ7Q0FFQTs7Ozs7OztDQU9BLFVBQUtnRyx3QkFBTCxHQUFnQyxNQUFLRCxpQkFBTCxDQUF1QnpvQixLQUF2QixFQUFoQztDQUVBLFVBQUswb0Isd0JBQUwsQ0FBOEI3SyxPQUE5QixDQUFzQ2hpQixJQUF0QyxHQUE2QyxzQkFBN0M7Q0FFQTs7Ozs7OztDQU9BLFVBQUs4c0IsZUFBTCxHQUF1QixJQUFJeEMsVUFBSixDQUFlLE1BQUtRLFNBQXBCLEVBQStCLE1BQUtDLFVBQXBDLEVBQWdEO0NBQ3RFUCx3QkFBa0IsSUFBSXVDLGlCQUFKLENBQXNCO0NBQ3ZDQyxzQkFBY0MsZ0JBRHlCO0NBRXZDdFEsc0JBQWMsSUFGeUI7Q0FHdkNDLGtCQUFVO0NBSDZCLE9BQXRCLENBRG9EO0NBTXRFMkwsa0JBQVksSUFBSTVHLEtBQUosQ0FBVSxRQUFWLENBTjBEO0NBT3RFNkcsa0JBQVk7Q0FQMEQsS0FBaEQsQ0FBdkI7Q0FVQTs7Ozs7OztDQU9BLFVBQUswQyxjQUFMLEdBQXNCLElBQUlaLFVBQUosQ0FBZSxNQUFLUSxTQUFwQixFQUErQixNQUFLQyxVQUFwQyxFQUFnRDtDQUNyRVAsd0JBQWtCLElBQUkvTix1QkFBSixDQUE0QixNQUFLa1EsaUJBQUwsQ0FBdUIzSyxPQUFuRCxFQUE0RCxNQUFLK0ksVUFBakUsQ0FEbUQ7Q0FFckV4QyxrQkFBWSxJQUFJNUcsS0FBSixDQUFVLFFBQVYsQ0FGeUQ7Q0FHckU2RyxrQkFBWTtDQUh5RCxLQUFoRCxDQUF0QjtDQU1BOzs7Ozs7O0NBT0EsVUFBS1osUUFBTCxHQUFnQixJQUFJdkIsUUFBSixDQUFhcFksT0FBYixDQUFoQjtDQUVBLFVBQUs0TixVQUFMLEdBQWtCNU4sUUFBUTROLFVBQTFCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLcVIsUUFBTCxHQUFnQixJQUFJVixVQUFKLENBQWUsSUFBSWpRLFlBQUosRUFBZixDQUFoQjtDQUNBLFVBQUsyUSxRQUFMLENBQWNwSCxjQUFkLEdBQStCLElBQS9CO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLcUgsb0JBQUwsR0FBNEIsSUFBSWpMLG9CQUFKLENBQXlCalUsT0FBekIsQ0FBNUI7Q0FDQSxVQUFLa2Ysb0JBQUwsQ0FBMEI5VCxRQUExQixDQUFtQ21JLEtBQW5DLENBQXlDL2IsS0FBekMsR0FBaUQsTUFBS3VsQixnQkFBTCxDQUFzQmhKLE9BQXZFO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLb0wsb0JBQUwsR0FBNEIsSUFBSXBNLG9CQUFKLENBQXlCL1MsT0FBekIsQ0FBNUI7Q0FDQSxVQUFLbWYsb0JBQUwsQ0FBMEIvVCxRQUExQixDQUFtQ21JLEtBQW5DLENBQXlDL2IsS0FBekMsR0FBaUQsTUFBS3VsQixnQkFBTCxDQUFzQmhKLE9BQXZFO0NBRUEsVUFBS3FMLElBQUwsR0FBYXBmLFFBQVFvZixJQUFSLEtBQWlCaHdCLFNBQWxCLEdBQStCNFEsUUFBUW9mLElBQXZDLEdBQThDLElBQTFEO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLQyxTQUFMLEdBQWlCLEVBQWpCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLblAsSUFBTCxHQUFZLEdBQVo7Q0FFQTs7Ozs7O0NBTUEsVUFBS29QLFVBQUwsR0FBbUJ0ZixRQUFRc2YsVUFBUixLQUF1Qmx3QixTQUF4QixHQUFxQzRRLFFBQVFzZixVQUE3QyxHQUEwRCxHQUE1RTtDQUVBOzs7Ozs7Ozs7Q0FTQSxVQUFLQyxjQUFMLEdBQXNCLEVBQXRCO0NBMUx3QztDQTRMeEM7Q0FFRDs7Ozs7OztDQTFNRDtDQUFBOztDQWlWQzs7Ozs7Q0FqVkQsd0NBdVZtQztDQUFBLFVBQWhCeEwsT0FBZ0IsdUVBQU4sSUFBTTtDQUVqQyxXQUFLb0wsb0JBQUwsQ0FBMEJLLGlCQUExQixDQUE0Q3pMLE9BQTVDO0NBRUE7Q0FFRDs7Ozs7OztDQTdWRDtDQUFBO0NBQUEsaUNBb1djMEwsT0FwV2QsRUFvV3VCO0NBRXJCLFVBQU1KLFlBQVlJLFFBQVFsd0IsS0FBUixDQUFjLENBQWQsQ0FBbEI7Q0FDQSxVQUFNZ3dCLGlCQUFpQixLQUFLQSxjQUE1QjtDQUVBLFVBQUkzdkIsQ0FBSixFQUFPeXBCLENBQVA7Q0FFQSxXQUFLcUcsY0FBTDs7Q0FFQSxXQUFJOXZCLElBQUksQ0FBSixFQUFPeXBCLElBQUlnRyxVQUFVdnZCLE1BQXpCLEVBQWlDRixJQUFJeXBCLENBQXJDLEVBQXdDLEVBQUV6cEIsQ0FBMUMsRUFBNkM7Q0FFNUN5dkIsa0JBQVV6dkIsQ0FBVixFQUFhK3ZCLE1BQWIsQ0FBb0JDLE1BQXBCLENBQTJCTCxjQUEzQjtDQUVBOztDQUVELFdBQUtGLFNBQUwsR0FBaUJBLFNBQWpCO0NBRUEsYUFBTyxJQUFQO0NBRUE7Q0FFRDs7Ozs7O0NBelhEO0NBQUE7Q0FBQSxxQ0ErWGtCO0NBRWhCLFVBQU1BLFlBQVksS0FBS0EsU0FBdkI7Q0FDQSxVQUFNRSxpQkFBaUIsS0FBS0EsY0FBNUI7Q0FFQSxVQUFJM3ZCLENBQUosRUFBT3lwQixDQUFQOztDQUVBLFdBQUl6cEIsSUFBSSxDQUFKLEVBQU95cEIsSUFBSWdHLFVBQVV2dkIsTUFBekIsRUFBaUNGLElBQUl5cEIsQ0FBckMsRUFBd0MsRUFBRXpwQixDQUExQyxFQUE2QztDQUU1Q3l2QixrQkFBVXp2QixDQUFWLEVBQWErdkIsTUFBYixDQUFvQkUsT0FBcEIsQ0FBNEJOLGNBQTVCO0NBRUE7O0NBRUQsV0FBS0YsU0FBTCxHQUFpQixFQUFqQjtDQUNBLFdBQUtuUCxJQUFMLEdBQVksR0FBWjtDQUVBLGFBQU8sSUFBUDtDQUVBO0NBRUQ7Ozs7Ozs7Q0FuWkQ7Q0FBQTtDQUFBLGlDQTBaY3BoQixNQTFaZCxFQTBac0I7Q0FFcEJBLGFBQU82d0IsTUFBUCxDQUFjQyxNQUFkLENBQXFCLEtBQUtMLGNBQTFCO0NBQ0EsV0FBS0YsU0FBTCxDQUFlaHNCLElBQWYsQ0FBb0J2RSxNQUFwQjtDQUVBLGFBQU8sSUFBUDtDQUVBO0NBRUQ7Ozs7Ozs7Q0FuYUQ7Q0FBQTtDQUFBLG1DQTBhZ0JBLE1BMWFoQixFQTBhd0I7Q0FFdEIsVUFBTXV3QixZQUFZLEtBQUtBLFNBQXZCO0NBQ0EsVUFBTTlqQixRQUFROGpCLFVBQVUzckIsT0FBVixDQUFrQjVFLE1BQWxCLENBQWQ7O0NBRUEsVUFBR3lNLFNBQVMsQ0FBWixFQUFlO0NBRWQ4akIsa0JBQVU5akIsS0FBVixFQUFpQm9rQixNQUFqQixDQUF3QkUsT0FBeEIsQ0FBZ0MsS0FBS04sY0FBckM7Q0FDQUYsa0JBQVUxdEIsTUFBVixDQUFpQjRKLEtBQWpCLEVBQXdCLENBQXhCOztDQUVBLFlBQUc4akIsVUFBVXZ2QixNQUFWLEtBQXFCLENBQXhCLEVBQTJCO0NBRTFCLGVBQUtvZ0IsSUFBTCxHQUFZLEdBQVo7Q0FFQTtDQUVEOztDQUVELGFBQU8sSUFBUDtDQUVBO0NBRUQ7Ozs7Ozs7Q0FoY0Q7Q0FBQTtDQUFBLHdDQXVjcUI0UCxPQXZjckIsRUF1YzhCO0NBRTVCLFVBQU1ULFlBQVksS0FBS0EsU0FBdkI7Q0FFQSxVQUFJenZCLENBQUosRUFBT3lwQixDQUFQOztDQUVBLFdBQUl6cEIsSUFBSSxDQUFKLEVBQU95cEIsSUFBSWdHLFVBQVV2dkIsTUFBekIsRUFBaUNGLElBQUl5cEIsQ0FBckMsRUFBd0MsRUFBRXpwQixDQUExQyxFQUE2QztDQUU1QyxZQUFHa3dCLE9BQUgsRUFBWTtDQUVYVCxvQkFBVXp2QixDQUFWLEVBQWErdkIsTUFBYixDQUFvQkMsTUFBcEIsQ0FBMkIsQ0FBM0I7Q0FFQSxTQUpELE1BSU87Q0FFTlAsb0JBQVV6dkIsQ0FBVixFQUFhK3ZCLE1BQWIsQ0FBb0JFLE9BQXBCLENBQTRCLENBQTVCO0NBRUE7Q0FFRDtDQUVEO0NBRUQ7Ozs7Ozs7Ozs7Q0E3ZEQ7Q0FBQTtDQUFBLDJCQXVlUTVYLFFBdmVSLEVBdWVrQjhQLFdBdmVsQixFQXVlK0JDLFlBdmUvQixFQXVlNkN2TSxLQXZlN0MsRUF1ZW9Ed00sV0F2ZXBELEVBdWVpRTtDQUUvRCxVQUFNNEUsWUFBWSxLQUFLQSxTQUF2QjtDQUNBLFVBQU1DLGFBQWEsS0FBS0EsVUFBeEI7Q0FDQSxVQUFNeEosUUFBUSxLQUFLNkwsb0JBQUwsQ0FBMEIvVCxRQUExQixDQUFtQ2tJLEtBQWpEO0NBRUEsVUFBSStKLFVBQUosRUFBZ0IwQyxJQUFoQjs7Q0FFQSxVQUFHLEtBQUtWLFNBQUwsQ0FBZXZ2QixNQUFmLEdBQXdCLENBQTNCLEVBQThCO0NBRTdCdXRCLHFCQUFhUixVQUFVUSxVQUF2QjtDQUNBMEMsZUFBT2pELFdBQVc2QyxNQUFYLENBQWtCSSxJQUF6QjtDQUNBbEQsa0JBQVVRLFVBQVYsR0FBdUIsSUFBdkI7Q0FFQS9KLGNBQU05YixLQUFOLEdBQWMsR0FBZDs7Q0FFQSxZQUFHLEtBQUs4bkIsVUFBTCxHQUFrQixHQUFyQixFQUEwQjtDQUV6QmhNLGdCQUFNOWIsS0FBTixHQUFjLFFBQVEwRixLQUFLOGlCLEdBQUwsQ0FBUyxLQUFLOVAsSUFBTCxHQUFZLEtBQUtvUCxVQUFqQixHQUE4QixJQUF2QyxJQUErQyxLQUFyRTtDQUNBLGVBQUtwUCxJQUFMLElBQWF6RSxLQUFiO0NBRUEsU0FiNEI7OztDQWdCN0IsYUFBS3dVLG1CQUFMLENBQXlCLEtBQXpCO0NBQ0EsYUFBS3BCLGVBQUwsQ0FBcUJoVyxNQUFyQixDQUE0QlosUUFBNUIsRUFBc0MsS0FBS3lXLGlCQUEzQztDQUNBLGFBQUt1QixtQkFBTCxDQUF5QixJQUF6QixFQWxCNkI7O0NBcUI3Qm5ELG1CQUFXNkMsTUFBWCxDQUFrQkksSUFBbEIsR0FBeUIsS0FBSyxLQUFLUixjQUFuQztDQUNBLGFBQUt0QyxjQUFMLENBQW9CcFUsTUFBcEIsQ0FBMkJaLFFBQTNCLEVBQXFDLEtBQUs4VSxnQkFBMUMsRUF0QjZCOztDQXlCN0JELG1CQUFXNkMsTUFBWCxDQUFrQkksSUFBbEIsR0FBeUJBLElBQXpCO0NBQ0FsRCxrQkFBVVEsVUFBVixHQUF1QkEsVUFBdkIsQ0ExQjZCOztDQTZCN0IsYUFBS3ZsQixRQUFMLEdBQWdCLEtBQUtvbkIsb0JBQXJCO0NBQ0FqWCxpQkFBU1ksTUFBVCxDQUFnQixLQUFLRixLQUFyQixFQUE0QixLQUFLL08sTUFBakMsRUFBeUMsS0FBSytrQixpQkFBOUM7O0NBRUEsWUFBRyxLQUFLaEYsUUFBTCxDQUFjM2UsT0FBakIsRUFBMEI7Q0FFekI7Q0FDQSxlQUFLMmUsUUFBTCxDQUFjOVEsTUFBZCxDQUFxQlosUUFBckIsRUFBK0IsS0FBSzBXLGlCQUFwQyxFQUF1RCxLQUFLQyx3QkFBNUQ7Q0FFQTs7Q0FFRCxZQUFHLEtBQUs5RSxLQUFSLEVBQWU7Q0FFZDtDQUNBLGVBQUtoaUIsUUFBTCxHQUFnQixLQUFLcW5CLG9CQUFyQjtDQUNBLGVBQUtBLG9CQUFMLENBQTBCL1QsUUFBMUIsQ0FBbUNvQixRQUFuQyxDQUE0Q2hWLEtBQTVDLEdBQW9EdWdCLFlBQVloRSxPQUFoRTtDQUNBOUwsbUJBQVNZLE1BQVQsQ0FBZ0IsS0FBS0YsS0FBckIsRUFBNEIsS0FBSy9PLE1BQWpDLEVBQXlDLEtBQUtpZSxjQUFMLEdBQXNCLElBQXRCLEdBQTZCLEtBQUtHLFlBQTNFO0NBRUE7Q0FFRCxPQWhERCxNQWdETyxJQUFHLEtBQUtILGNBQVIsRUFBd0I7Q0FFOUI7Q0FDQSxhQUFLb0gsUUFBTCxDQUFjcFcsTUFBZCxDQUFxQlosUUFBckIsRUFBK0I4UCxXQUEvQjtDQUVBO0NBRUQ7Q0FFRDs7Ozs7OztDQXhpQkQ7Q0FBQTtDQUFBLDRCQStpQlN4ZSxLQS9pQlQsRUEraUJnQkMsTUEvaUJoQixFQStpQndCO0NBRXRCLFdBQUtrbEIsaUJBQUwsQ0FBdUJuVyxPQUF2QixDQUErQmhQLEtBQS9CLEVBQXNDQyxNQUF0QztDQUNBLFdBQUt1akIsZ0JBQUwsQ0FBc0J4VSxPQUF0QixDQUE4QmhQLEtBQTlCLEVBQXFDQyxNQUFyQztDQUVBLFdBQUtxbEIsZUFBTCxDQUFxQnRXLE9BQXJCLENBQTZCaFAsS0FBN0IsRUFBb0NDLE1BQXBDO0NBQ0EsV0FBS3lqQixjQUFMLENBQW9CMVUsT0FBcEIsQ0FBNEJoUCxLQUE1QixFQUFtQ0MsTUFBbkM7Q0FDQSxXQUFLbWdCLFFBQUwsQ0FBY3BSLE9BQWQsQ0FBc0JoUCxLQUF0QixFQUE2QkMsTUFBN0I7Q0FFQUQsY0FBUSxLQUFLb2dCLFFBQUwsQ0FBY3BnQixLQUF0QjtDQUNBQyxlQUFTLEtBQUttZ0IsUUFBTCxDQUFjbmdCLE1BQXZCO0NBRUEsV0FBS21sQixpQkFBTCxDQUF1QnBXLE9BQXZCLENBQStCaFAsS0FBL0IsRUFBc0NDLE1BQXRDO0NBQ0EsV0FBS29sQix3QkFBTCxDQUE4QnJXLE9BQTlCLENBQXNDaFAsS0FBdEMsRUFBNkNDLE1BQTdDO0NBRUEsV0FBSzJsQixvQkFBTCxDQUEwQi9ULFFBQTFCLENBQW1Dck4sTUFBbkMsQ0FBMEN2RyxLQUExQyxHQUFrRCtCLFFBQVFDLE1BQTFEO0NBQ0EsV0FBSzBsQixvQkFBTCxDQUEwQnZSLFlBQTFCLENBQXVDLE1BQU1wVSxLQUE3QyxFQUFvRCxNQUFNQyxNQUExRDtDQUVBO0NBRUQ7Ozs7Ozs7Q0Fua0JEO0NBQUE7Q0FBQSwrQkEwa0JZeU8sUUExa0JaLEVBMGtCc0JpUSxLQTFrQnRCLEVBMGtCNkI7Q0FFM0IsV0FBSzJHLGVBQUwsQ0FBcUI5RSxVQUFyQixDQUFnQzlSLFFBQWhDLEVBQTBDaVEsS0FBMUM7Q0FDQSxXQUFLK0UsY0FBTCxDQUFvQmxELFVBQXBCLENBQStCOVIsUUFBL0IsRUFBeUNpUSxLQUF6QztDQUNBLFdBQUt5QixRQUFMLENBQWNJLFVBQWQsQ0FBeUI5UixRQUF6QixFQUFtQ2lRLEtBQW5DO0NBRUE7Q0FobEJGO0NBQUE7Q0FBQSx3QkFnTnVCO0NBRXJCLGFBQU8sS0FBS3lCLFFBQUwsQ0FBY2IsZUFBckI7Q0FFQTtDQUVEOzs7OztDQXRORDtDQUFBLHdCQTROa0M7Q0FBQSxVQUFidGhCLEtBQWEsdUVBQUwsR0FBSztDQUVoQyxXQUFLbWlCLFFBQUwsQ0FBY2IsZUFBZCxHQUFnQ3RoQixLQUFoQztDQUVBO0NBRUQ7Ozs7OztDQWxPRDtDQUFBO0NBQUEsd0JBd09rQjtDQUVoQixhQUFPLEtBQUttaUIsUUFBTCxDQUFjL0wsVUFBckI7Q0FFQTtDQUVEOzs7Q0E5T0Q7Q0FBQSx3QkFrUCtDO0NBQUEsVUFBL0JwVyxLQUErQix1RUFBdkJxVyxXQUFXSSxVQUFZO0NBRTdDLFdBQUswTCxRQUFMLENBQWMvTCxVQUFkLEdBQTJCcFcsS0FBM0I7Q0FFQTtDQUVEOzs7Ozs7Q0F4UEQ7Q0FBQTtDQUFBLHdCQThQWTtDQUVWLGFBQU8sS0FBS21pQixRQUFMLENBQWMzZSxPQUFyQjtDQUVBO0NBRUQ7OztDQXBRRDtDQUFBLHNCQXdRVXhELEtBeFFWLEVBd1FpQjtDQUVmLFdBQUttaUIsUUFBTCxDQUFjM2UsT0FBZCxHQUF3QnhELEtBQXhCO0NBRUEsV0FBSzJuQixvQkFBTCxDQUEwQi9ULFFBQTFCLENBQW1Db0ksTUFBbkMsQ0FBMENoYyxLQUExQyxHQUFrREEsUUFDakQsS0FBS29uQix3QkFBTCxDQUE4QjdLLE9BRG1CLEdBRWpELEtBQUs0SyxpQkFBTCxDQUF1QjVLLE9BRnhCO0NBSUE7Q0FFRDs7Ozs7O0NBbFJEO0NBQUE7Q0FBQSx3QkF3UmlCO0NBRWYsYUFBTyxLQUFLNEYsUUFBTCxDQUFjVixTQUFyQjtDQUVBO0NBRUQ7Ozs7O0NBOVJEO0NBQUEsc0JBb1NlemhCLEtBcFNmLEVBb1NzQjtDQUVwQixXQUFLbWlCLFFBQUwsQ0FBY1YsU0FBZCxHQUEwQnpoQixLQUExQjtDQUVBO0NBRUQ7Ozs7OztDQTFTRDtDQUFBO0NBQUEsd0JBZ1RhO0NBRVgsYUFBTyxLQUFLc2dCLFNBQVo7Q0FFQTtDQUVEOzs7Ozs7OztDQXRURDtDQUFBLHNCQStUV3RnQixLQS9UWCxFQStUa0I7Q0FFaEIsV0FBS3NnQixTQUFMLEdBQWlCdGdCLEtBQWpCO0NBRUE7Q0FFRDs7Ozs7O0NBclVEO0NBQUE7Q0FBQSx3QkEyVWU7Q0FFYixhQUFPLEtBQUsybkIsb0JBQUwsQ0FBMEIvVCxRQUExQixDQUFtQ29JLE1BQW5DLENBQTBDaGMsS0FBakQ7Q0FFQTtDQS9VRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQWlDa2dCLElBQWpDOztDQ3ZCQTs7OztBQUlBLEtBQWF3SSxjQUFiO0NBQUE7Q0FBQTtDQUVDOzs7OztDQU1BLDRCQUFnQztDQUFBOztDQUFBLFFBQXBCL0wsV0FBb0IsdUVBQU4sSUFBTTs7Q0FBQTs7Q0FFL0Isd0ZBQU0sZ0JBQU47Q0FFQSxVQUFLcmMsUUFBTCxHQUFnQixJQUFJb2Msa0JBQUosRUFBaEI7Q0FFQSxVQUFLQyxXQUFMLEdBQW1CQSxXQUFuQjtDQU4rQjtDQVEvQjtDQUVEOzs7Ozs7O0NBbEJEO0NBQUE7O0NBa0RDOzs7Ozs7Ozs7Q0FsREQsMkJBNERRbE0sUUE1RFIsRUE0RGtCOFAsV0E1RGxCLEVBNEQrQkMsWUE1RC9CLEVBNEQ2Q3ZNLEtBNUQ3QyxFQTREb0R3TSxXQTVEcEQsRUE0RGlFO0NBRS9ELFdBQUtuZ0IsUUFBTCxDQUFjc1QsUUFBZCxDQUF1Qm9CLFFBQXZCLENBQWdDaFYsS0FBaEMsR0FBd0N1Z0IsWUFBWWhFLE9BQXBEO0NBRUE5TCxlQUFTWSxNQUFULENBQWdCLEtBQUtGLEtBQXJCLEVBQTRCLEtBQUsvTyxNQUFqQyxFQUF5QyxLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBdEU7Q0FFQTtDQUVEOzs7Ozs7O0NBcEVEO0NBQUE7Q0FBQSw0QkEyRVN6ZSxLQTNFVCxFQTJFZ0JDLE1BM0VoQixFQTJFd0I7Q0FFdEIsV0FBSzFCLFFBQUwsQ0FBY3FvQixhQUFkLENBQTRCNW1CLEtBQTVCLEVBQW1DQyxNQUFuQztDQUVBO0NBL0VGO0NBQUE7Q0FBQSx3QkF3Qm1CO0NBRWpCLGFBQU8sS0FBSzFCLFFBQUwsQ0FBY3FjLFdBQXJCO0NBRUE7Q0FFRDs7Ozs7Q0E5QkQ7Q0FBQSx3QkFvQzZCO0NBQUEsVUFBWjNjLEtBQVksdUVBQUosRUFBSTtDQUUzQkEsY0FBUTBGLEtBQUtvYyxLQUFMLENBQVc5aEIsS0FBWCxDQUFSOztDQUVBLFVBQUdBLFFBQVEsQ0FBUixHQUFZLENBQWYsRUFBa0I7Q0FFakJBLGlCQUFTLENBQVQ7Q0FFQTs7Q0FFRCxXQUFLTSxRQUFMLENBQWNxYyxXQUFkLEdBQTRCM2MsS0FBNUI7Q0FFQTtDQWhERjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQW9Da2dCLElBQXBDOztDQ0pBOzs7Ozs7OztBQVFBLEtBQWEwSSxrQkFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7O0NBT0EsOEJBQVl4bUIsTUFBWixFQUFrQztDQUFBOztDQUFBLFFBQWRvRyxPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBRWpDLDRGQUFNLG9CQUFOO0NBRUEsVUFBS2xJLFFBQUwsR0FBZ0IsSUFBSXdjLHNCQUFKLENBQTJCMWEsTUFBM0IsRUFBbUNvRyxPQUFuQyxDQUFoQjtDQUppQztDQU1qQztDQUVEOzs7Ozs7Ozs7OztDQWpCRDtDQUFBO0NBQUEsMkJBMkJRaUksUUEzQlIsRUEyQmtCOFAsV0EzQmxCLEVBMkIrQkMsWUEzQi9CLEVBMkI2Q3ZNLEtBM0I3QyxFQTJCb0R3TSxXQTNCcEQsRUEyQmlFO0NBRS9ELFdBQUtuZ0IsUUFBTCxDQUFjc1QsUUFBZCxDQUF1Qm9CLFFBQXZCLENBQWdDaFYsS0FBaEMsR0FBd0N1Z0IsWUFBWWhFLE9BQXBEO0NBQ0EsV0FBS2pjLFFBQUwsQ0FBY3NULFFBQWQsQ0FBdUJxQixNQUF2QixDQUE4QmpWLEtBQTlCLEdBQXNDdWdCLFlBQVl0SixZQUFsRDtDQUVBeEcsZUFBU1ksTUFBVCxDQUFnQixLQUFLRixLQUFyQixFQUE0QixLQUFLL08sTUFBakMsRUFBeUMsS0FBS2llLGNBQUwsR0FBc0IsSUFBdEIsR0FBNkJHLFlBQXRFO0NBRUE7Q0FFRDs7Ozs7OztDQXBDRDtDQUFBO0NBQUEsNEJBMkNTemUsS0EzQ1QsRUEyQ2dCQyxNQTNDaEIsRUEyQ3dCO0NBRXRCLFdBQUsxQixRQUFMLENBQWM2VixZQUFkLENBQTJCLE1BQU1wVSxLQUFqQyxFQUF3QyxNQUFNQyxNQUE5QztDQUVBO0NBL0NGOztDQUFBOztDQUFBO0NBQUEsRUFBd0NrZSxJQUF4Qzs7Q0NQQTs7OztBQUlBLEtBQWEySSxRQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7Q0FPQSxvQkFBWTNHLFlBQVosRUFBeUM7Q0FBQTs7Q0FBQSxRQUFmNEcsTUFBZSx1RUFBTixJQUFNOztDQUFBOztDQUV4QyxrRkFBTSxVQUFOO0NBRUEsVUFBS3hvQixRQUFMLEdBQWdCLElBQUl3VyxZQUFKLEVBQWhCO0NBRUEsVUFBS3dKLFNBQUwsR0FBaUIsS0FBakI7Q0FFQTs7Ozs7O0NBTUEsVUFBSzRCLFlBQUwsR0FBcUJBLGlCQUFpQnRxQixTQUFsQixHQUErQnNxQixZQUEvQixHQUE4QyxJQUFJcEIsaUJBQUosQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEI7Q0FDN0ZDLGlCQUFXQyxZQURrRjtDQUU3RkMsaUJBQVdELFlBRmtGO0NBRzdGRSxxQkFBZSxLQUg4RTtDQUk3RkMsbUJBQWE7Q0FKZ0YsS0FBNUIsQ0FBbEU7Q0FPQSxVQUFLZSxZQUFMLENBQWtCM0YsT0FBbEIsQ0FBMEJoaUIsSUFBMUIsR0FBaUMsYUFBakM7Q0FDQSxVQUFLMm5CLFlBQUwsQ0FBa0IzRixPQUFsQixDQUEwQjZFLGVBQTFCLEdBQTRDLEtBQTVDO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLMEgsTUFBTCxHQUFjQSxNQUFkO0NBL0J3QztDQWlDeEM7Q0FFRDs7Ozs7Ozs7Ozs7Q0E1Q0Q7Q0FBQTtDQUFBLDJCQXNEUXJZLFFBdERSLEVBc0RrQjhQLFdBdERsQixFQXNEK0JDLFlBdEQvQixFQXNENkN2TSxLQXREN0MsRUFzRG9Ed00sV0F0RHBELEVBc0RpRTtDQUUvRCxXQUFLbmdCLFFBQUwsQ0FBY3NULFFBQWQsQ0FBdUJvQixRQUF2QixDQUFnQ2hWLEtBQWhDLEdBQXdDdWdCLFlBQVloRSxPQUFwRDtDQUVBOUwsZUFBU1ksTUFBVCxDQUFnQixLQUFLRixLQUFyQixFQUE0QixLQUFLL08sTUFBakMsRUFBeUMsS0FBSzhmLFlBQTlDO0NBRUE7Q0FFRDs7Ozs7OztDQTlERDtDQUFBO0NBQUEsNEJBcUVTbmdCLEtBckVULEVBcUVnQkMsTUFyRWhCLEVBcUV3QjtDQUV0QixVQUFHLEtBQUs4bUIsTUFBUixFQUFnQjtDQUVmL21CLGdCQUFRMkQsS0FBS3JOLEdBQUwsQ0FBUyxDQUFULEVBQVkwSixLQUFaLENBQVI7Q0FDQUMsaUJBQVMwRCxLQUFLck4sR0FBTCxDQUFTLENBQVQsRUFBWTJKLE1BQVosQ0FBVDtDQUVBLGFBQUtrZ0IsWUFBTCxDQUFrQm5SLE9BQWxCLENBQTBCaFAsS0FBMUIsRUFBaUNDLE1BQWpDO0NBRUE7Q0FFRDtDQUVEOzs7Ozs7O0NBbEZEO0NBQUE7Q0FBQSwrQkF5Rll5TyxRQXpGWixFQXlGc0JpUSxLQXpGdEIsRUF5RjZCO0NBRTNCLFVBQUcsQ0FBQ0EsS0FBSixFQUFXO0NBRVYsYUFBS3dCLFlBQUwsQ0FBa0IzRixPQUFsQixDQUEwQndGLE1BQTFCLEdBQW1DQyxTQUFuQztDQUVBO0NBRUQ7Q0FqR0Y7O0NBQUE7O0NBQUE7Q0FBQSxFQUE4QjlCLElBQTlCOztDQ0pBOzs7Ozs7O0NBT0EsSUFBTTZJLFVBQVVyakIsS0FBS0MsRUFBTCxHQUFVLEdBQTFCO0NBRUE7Ozs7Ozs7Q0FPQSxJQUFNK0YsSUFBSSxJQUFJQyxPQUFKLEVBQVY7Q0FFQTs7Ozs7OztDQU9BLElBQU1xZCxLQUFLLElBQUlyZCxPQUFKLEVBQVg7Q0FFQTs7OztBQUlBLEtBQWFzZCxhQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7Ozs7OztDQVlBLHlCQUFZN21CLE1BQVosRUFBNkQ7Q0FBQTs7Q0FBQSxRQUF6QzhtQixTQUF5Qyx1RUFBN0IsSUFBSXZkLE9BQUosRUFBNkI7Q0FBQSxRQUFkbkQsT0FBYyx1RUFBSixFQUFJOztDQUFBOztDQUU1RCx1RkFBTSxlQUFOO0NBRUE7Ozs7OztDQU1BLFVBQUs4YyxVQUFMLEdBQWtCbGpCLE1BQWxCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLOG1CLFNBQUwsR0FBaUJBLFNBQWpCO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLdkQsY0FBTCxHQUFzQixJQUFJaGEsT0FBSixFQUF0QjtDQUVBOzs7Ozs7Q0FNQSxVQUFLd2QsS0FBTCxHQUFjM2dCLFFBQVEyZ0IsS0FBUixLQUFrQnZ4QixTQUFuQixHQUFnQzRRLFFBQVEyZ0IsS0FBeEMsR0FBZ0QsR0FBN0Q7Q0FFQTs7Ozs7OztDQU9BLFVBQUt6USxJQUFMLEdBQVksR0FBWjtDQUVBOzs7Ozs7O0NBT0EsVUFBSzNjLE1BQUwsR0FBYyxLQUFkO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLcXRCLGlCQUFMLEdBQXlCLElBQUkxSyxpQkFBSixDQUFzQmxXLE9BQXRCLENBQXpCO0NBRUEsVUFBSzRnQixpQkFBTCxDQUF1QnhWLFFBQXZCLENBQWdDa0wsTUFBaEMsQ0FBdUM5ZSxLQUF2QyxHQUErQyxNQUFLMmxCLGNBQXBEO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLMEQsWUFBTCxHQUFvQixJQUFJdlMsWUFBSixFQUFwQjtDQTFFNEQ7Q0E0RTVEO0NBRUQ7Ozs7O0NBNUZEO0NBQUE7Q0FBQSw4QkFnR1c7Q0FFVCxXQUFLNEIsSUFBTCxHQUFZLEdBQVo7Q0FDQSxXQUFLM2MsTUFBTCxHQUFjLElBQWQ7Q0FFQTtDQUVEOzs7Ozs7Ozs7O0NBdkdEO0NBQUE7Q0FBQSwyQkFpSFEwVSxRQWpIUixFQWlIa0I4UCxXQWpIbEIsRUFpSCtCQyxZQWpIL0IsRUFpSDZDdk0sS0FqSDdDLEVBaUhvRHdNLFdBakhwRCxFQWlIaUU7Q0FFL0QsVUFBTXlJLFlBQVksS0FBS0EsU0FBdkI7Q0FDQSxVQUFNNUQsYUFBYSxLQUFLQSxVQUF4QjtDQUNBLFVBQU1LLGlCQUFpQixLQUFLQSxjQUE1QjtDQUVBLFVBQU15RCxvQkFBb0IsS0FBS0EsaUJBQS9CO0NBQ0EsVUFBTXhWLFdBQVd3VixrQkFBa0J4VixRQUFuQztDQUNBLFVBQU1rTCxTQUFTbEwsU0FBU2tMLE1BQXhCO0NBQ0EsVUFBTTVjLFNBQVMwUixTQUFTMVIsTUFBeEI7Q0FDQSxVQUFNeWMsWUFBWS9LLFNBQVMrSyxTQUEzQjtDQUNBLFVBQU1DLFdBQVdoTCxTQUFTZ0wsUUFBMUI7Q0FFQSxXQUFLeUssWUFBTCxDQUFrQnpWLFFBQWxCLENBQTJCb0IsUUFBM0IsQ0FBb0NoVixLQUFwQyxHQUE0Q3VnQixZQUFZaEUsT0FBeEQ7Q0FDQSxXQUFLamMsUUFBTCxHQUFnQixLQUFLK29CLFlBQXJCOztDQUVBLFVBQUcsS0FBS3R0QixNQUFSLEVBQWdCO0NBRWY7Q0FDQXVwQixtQkFBV2dFLGlCQUFYLENBQTZCNWQsQ0FBN0I7Q0FDQXNkLFdBQUd6cUIsSUFBSCxDQUFRK21CLFdBQVcxa0IsUUFBbkIsRUFBNkIyb0IsR0FBN0IsQ0FBaUNMLFNBQWpDLEVBSmU7O0NBT2YsWUFBR3hkLEVBQUU4ZCxPQUFGLENBQVVSLEVBQVYsSUFBZ0JELE9BQW5CLEVBQTRCO0NBRTNCO0NBQ0FuVixtQkFBU21MLGNBQVQsQ0FBd0IvZSxLQUF4QixHQUFnQ3NsQixXQUFXMWtCLFFBQVgsQ0FBb0I2b0IsVUFBcEIsQ0FBK0JQLFNBQS9CLENBQWhDLENBSDJCOztDQU0zQnZELHlCQUFlcG5CLElBQWYsQ0FBb0IycUIsU0FBcEIsRUFBK0JwRCxPQUEvQixDQUF1Q1IsVUFBdkM7Q0FDQXhHLGlCQUFPOWUsS0FBUCxDQUFhZ0IsQ0FBYixHQUFpQixDQUFDMmtCLGVBQWUza0IsQ0FBZixHQUFtQixHQUFwQixJQUEyQixHQUE1QztDQUNBOGQsaUJBQU85ZSxLQUFQLENBQWFpQixDQUFiLEdBQWlCLENBQUMwa0IsZUFBZTFrQixDQUFmLEdBQW1CLEdBQXBCLElBQTJCLEdBQTVDO0NBRUEyUyxtQkFBU29CLFFBQVQsQ0FBa0JoVixLQUFsQixHQUEwQnVnQixZQUFZaEUsT0FBdEM7Q0FDQSxlQUFLamMsUUFBTCxHQUFnQjhvQixpQkFBaEI7Q0FFQSxTQXBCYzs7O0NBdUJmLGFBQUsxUSxJQUFMLElBQWF6RSxRQUFRLEtBQUtrVixLQUExQjtDQUNBam5CLGVBQU9sQyxLQUFQLEdBQWUsS0FBSzBZLElBQUwsR0FBWWtHLFNBQVM1ZSxLQUFwQzs7Q0FFQSxZQUFHa0MsT0FBT2xDLEtBQVAsSUFBZ0IsQ0FBQzJlLFVBQVUzZSxLQUFWLEdBQWtCNGUsU0FBUzVlLEtBQTVCLElBQXFDLENBQXhELEVBQTJEO0NBRTFELGVBQUtqRSxNQUFMLEdBQWMsS0FBZDtDQUVBO0NBRUQ7O0NBRUQwVSxlQUFTWSxNQUFULENBQWdCLEtBQUtGLEtBQXJCLEVBQTRCLEtBQUsvTyxNQUFqQyxFQUF5QyxLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBdEU7Q0FFQTtDQUVEOzs7Ozs7O0NBdktEO0NBQUE7Q0FBQSw0QkE4S1N6ZSxLQTlLVCxFQThLZ0JDLE1BOUtoQixFQThLd0I7Q0FFdEIsV0FBS29uQixpQkFBTCxDQUF1QnhWLFFBQXZCLENBQWdDck4sTUFBaEMsQ0FBdUN2RyxLQUF2QyxHQUErQytCLFFBQVFDLE1BQXZEO0NBRUE7Q0FsTEY7O0NBQUE7O0NBQUE7Q0FBQSxFQUFtQ2tlLElBQW5DOztDQ25DQTtBQUNBLDBCQUFlLCtLQUFmOztDQ0RBO0FBQ0Esd0JBQWUsNHRpRUFBZjs7Q0NnQkE7Ozs7Ozs7QUFPQSxLQUFhd0osUUFBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7O0NBT0Esb0JBQVlDLFdBQVosRUFBeUJDLFNBQXpCLEVBQW9DO0NBQUE7O0NBQUE7O0NBRW5DLGtGQUFNLFVBQU47Q0FFQTs7Ozs7OztDQU9BLFVBQUs5RSxTQUFMLEdBQWlCLElBQUlqQyxTQUFKLENBQWM7Q0FDOUJDLGtCQUFZLElBQUk1RyxLQUFKLENBQVUsUUFBVixDQURrQjtDQUU5QjZHLGtCQUFZO0NBRmtCLEtBQWQsQ0FBakI7Q0FLQTs7Ozs7OztDQU9BLFVBQUs4RyxzQkFBTCxHQUE4QixJQUFJL0ksaUJBQUosQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEI7Q0FDekRDLGlCQUFXQyxZQUQ4QztDQUV6RGUsY0FBUUMsU0FGaUQ7Q0FHekRkLHFCQUFlLEtBSDBDO0NBSXpEQyxtQkFBYTtDQUo0QyxLQUE1QixDQUE5QjtDQU9BLFVBQUswSSxzQkFBTCxDQUE0QnROLE9BQTVCLENBQW9DaGlCLElBQXBDLEdBQTJDLGlCQUEzQztDQUNBLFVBQUtzdkIsc0JBQUwsQ0FBNEJ0TixPQUE1QixDQUFvQzZFLGVBQXBDLEdBQXNELEtBQXREO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLMEksbUJBQUwsR0FBMkIsTUFBS0Qsc0JBQUwsQ0FBNEJuckIsS0FBNUIsRUFBM0I7Q0FFQSxVQUFLb3JCLG1CQUFMLENBQXlCdk4sT0FBekIsQ0FBaUNoaUIsSUFBakMsR0FBd0MsY0FBeEM7Q0FDQSxVQUFLdXZCLG1CQUFMLENBQXlCdk4sT0FBekIsQ0FBaUN3RixNQUFqQyxHQUEwQ2dJLFVBQTFDO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLQyxrQkFBTCxHQUEwQixJQUFJN1Usa0JBQUosRUFBMUI7Q0FFQTs7Ozs7OztDQU9BLFVBQUs4VSxlQUFMLEdBQXVCLElBQUkvSyxtQkFBSixFQUF2QjtDQUVBLFVBQUsrSyxlQUFMLENBQXFCclcsUUFBckIsQ0FBOEJvQixRQUE5QixDQUF1Q2hWLEtBQXZDLEdBQStDLE1BQUs2cEIsc0JBQUwsQ0FBNEJ0TixPQUEzRTtDQUVBOzs7Ozs7O0NBT0EsVUFBSzJOLGFBQUwsR0FBcUIsSUFBSUMsT0FBSixDQUFZUixXQUFaLENBQXJCO0NBRUEsVUFBS08sYUFBTCxDQUFtQjN2QixJQUFuQixHQUEwQixhQUExQjtDQUNBLFVBQUsydkIsYUFBTCxDQUFtQmpKLFNBQW5CLEdBQStCbUosYUFBL0I7Q0FDQSxVQUFLRixhQUFMLENBQW1CbkosU0FBbkIsR0FBK0JxSixhQUEvQjtDQUNBLFVBQUtGLGFBQUwsQ0FBbUJuSSxNQUFuQixHQUE0QmdJLFVBQTVCO0NBQ0EsVUFBS0csYUFBTCxDQUFtQjlJLGVBQW5CLEdBQXFDLEtBQXJDO0NBQ0EsVUFBSzhJLGFBQUwsQ0FBbUIzVSxXQUFuQixHQUFpQyxJQUFqQztDQUNBLFVBQUsyVSxhQUFMLENBQW1CRyxLQUFuQixHQUEyQixLQUEzQjtDQUVBLFVBQUtKLGVBQUwsQ0FBcUJyVyxRQUFyQixDQUE4QitMLE9BQTlCLENBQXNDM2YsS0FBdEMsR0FBOEMsTUFBS2txQixhQUFuRDtDQUVBOzs7Ozs7O0NBT0EsVUFBS0ksV0FBTCxHQUFtQixJQUFJSCxPQUFKLENBQVlQLFNBQVosQ0FBbkI7Q0FFQSxVQUFLVSxXQUFMLENBQWlCL3ZCLElBQWpCLEdBQXdCLFdBQXhCO0NBQ0EsVUFBSyt2QixXQUFMLENBQWlCdkosU0FBakIsR0FBNkJDLFlBQTdCO0NBQ0EsVUFBS3NKLFdBQUwsQ0FBaUJ2SSxNQUFqQixHQUEwQmdJLFVBQTFCO0NBQ0EsVUFBS08sV0FBTCxDQUFpQmxKLGVBQWpCLEdBQW1DLEtBQW5DO0NBQ0EsVUFBS2tKLFdBQUwsQ0FBaUIvVSxXQUFqQixHQUErQixJQUEvQjtDQUNBLFVBQUsrVSxXQUFMLENBQWlCRCxLQUFqQixHQUF5QixLQUF6QjtDQUVBLFVBQUtKLGVBQUwsQ0FBcUJyVyxRQUFyQixDQUE4QjhMLEtBQTlCLENBQW9DMWYsS0FBcEMsR0FBNEMsTUFBS3NxQixXQUFqRDtDQUVBOzs7Ozs7O0NBT0EsVUFBS0MsYUFBTCxHQUFxQixJQUFJdkwsaUJBQUosRUFBckI7Q0FFQSxVQUFLdUwsYUFBTCxDQUFtQjNXLFFBQW5CLENBQTRCcUwsUUFBNUIsQ0FBcUNqZixLQUFyQyxHQUE2QyxNQUFLOHBCLG1CQUFMLENBQXlCdk4sT0FBdEU7Q0EvR21DO0NBaUhuQztDQUVEOzs7Ozs7Ozs7OztDQTVIRDtDQUFBO0NBQUEsMkJBc0lROUwsUUF0SVIsRUFzSWtCOFAsV0F0SWxCLEVBc0krQkMsWUF0SS9CLEVBc0k2Q3ZNLEtBdEk3QyxFQXNJb0R3TSxXQXRJcEQsRUFzSWlFO0NBRS9EO0NBQ0EsV0FBS25nQixRQUFMLEdBQWdCLEtBQUswcEIsa0JBQXJCO0NBQ0EsV0FBS0Esa0JBQUwsQ0FBd0JwVyxRQUF4QixDQUFpQ29CLFFBQWpDLENBQTBDaFYsS0FBMUMsR0FBa0R1Z0IsWUFBWWhFLE9BQTlEO0NBQ0EsV0FBS3VJLFNBQUwsQ0FBZXpULE1BQWYsQ0FBc0JaLFFBQXRCLEVBQWdDLEtBQUtvWixzQkFBckM7Q0FDQXBaLGVBQVNZLE1BQVQsQ0FBZ0IsS0FBS0YsS0FBckIsRUFBNEIsS0FBSy9PLE1BQWpDLEVBQXlDLEtBQUt5bkIsc0JBQTlDLEVBTitEOztDQVMvRCxXQUFLdnBCLFFBQUwsR0FBZ0IsS0FBSzJwQixlQUFyQjtDQUNBeFosZUFBU1ksTUFBVCxDQUFnQixLQUFLRixLQUFyQixFQUE0QixLQUFLL08sTUFBakMsRUFBeUMsS0FBSzBuQixtQkFBOUMsRUFWK0Q7O0NBYS9ELFdBQUt4cEIsUUFBTCxHQUFnQixLQUFLaXFCLGFBQXJCO0NBQ0EsV0FBS0EsYUFBTCxDQUFtQjNXLFFBQW5CLENBQTRCb0IsUUFBNUIsQ0FBcUNoVixLQUFyQyxHQUE2Q3VnQixZQUFZaEUsT0FBekQ7Q0FFQTlMLGVBQVNZLE1BQVQsQ0FBZ0IsS0FBS0YsS0FBckIsRUFBNEIsS0FBSy9PLE1BQWpDLEVBQXlDLEtBQUtpZSxjQUFMLEdBQXNCLElBQXRCLEdBQTZCRyxZQUF0RTtDQUVBO0NBRUQ7Ozs7Ozs7Q0ExSkQ7Q0FBQTtDQUFBLDRCQWlLU3plLEtBaktULEVBaUtnQkMsTUFqS2hCLEVBaUt3QjtDQUV0QixXQUFLNm5CLHNCQUFMLENBQTRCOVksT0FBNUIsQ0FBb0NoUCxLQUFwQyxFQUEyQ0MsTUFBM0M7Q0FDQSxXQUFLOG5CLG1CQUFMLENBQXlCL1ksT0FBekIsQ0FBaUNoUCxLQUFqQyxFQUF3Q0MsTUFBeEM7Q0FFQSxXQUFLZ29CLGtCQUFMLENBQXdCcFcsUUFBeEIsQ0FBaUN3QixTQUFqQyxDQUEyQ3BWLEtBQTNDLENBQWlEekIsSUFBakQsQ0FDQyxLQUFLMHJCLGVBQUwsQ0FBcUJyVyxRQUFyQixDQUE4QndCLFNBQTlCLENBQXdDcFYsS0FBeEMsQ0FBOEN6QixJQUE5QyxDQUNDLEtBQUtnc0IsYUFBTCxDQUFtQjNXLFFBQW5CLENBQTRCd0IsU0FBNUIsQ0FBc0NwVixLQUF0QyxDQUE0Q3RDLEdBQTVDLENBQ0MsTUFBTXFFLEtBRFAsRUFDYyxNQUFNQyxNQURwQixDQURELENBREQ7Q0FLQTtDQUVEOzs7Ozs7Ozs7Ozs7O0NBN0tEO0NBQUE7Q0FBQSx3QkEwTGlDO0NBRS9CLGFBQU93b0Isa0JBQVA7Q0FFQTtDQUVEOzs7Ozs7Ozs7Ozs7O0NBaE1EO0NBQUE7Q0FBQSx3QkE2TStCO0NBRTdCLGFBQU9DLGdCQUFQO0NBRUE7Q0FqTkY7O0NBQUE7O0NBQUE7Q0FBQSxFQUE4QnZLLElBQTlCOztDQ3JCQTs7OztBQUlBLEtBQWF3SyxXQUFiO0NBQUE7Q0FBQTtDQUVDOzs7Ozs7O0NBUUEsdUJBQVluTyxPQUFaLEVBQXVEO0NBQUE7O0NBQUEsUUFBbEN4RixPQUFrQyx1RUFBeEIsR0FBd0I7Q0FBQSxRQUFuQnRCLFVBQW1CLHVFQUFOLElBQU07O0NBQUE7O0NBRXRELHFGQUFNLGFBQU47Q0FFQSxVQUFLblYsUUFBTCxHQUFnQixJQUFJa1YsZUFBSixDQUFvQkMsVUFBcEIsQ0FBaEI7Q0FFQSxVQUFLOEcsT0FBTCxHQUFlQSxPQUFmO0NBQ0EsVUFBS29PLGFBQUwsR0FBcUI1VCxPQUFyQjtDQVBzRDtDQVN0RDtDQUVEOzs7Ozs7O0NBckJEO0NBQUE7O0NBMkZDOzs7Ozs7Ozs7Q0EzRkQsMkJBcUdRdEcsUUFyR1IsRUFxR2tCOFAsV0FyR2xCLEVBcUcrQkMsWUFyRy9CLEVBcUc2Q3ZNLEtBckc3QyxFQXFHb0R3TSxXQXJHcEQsRUFxR2lFO0NBRS9ELFdBQUtuZ0IsUUFBTCxDQUFjc1QsUUFBZCxDQUF1QjhCLFFBQXZCLENBQWdDMVYsS0FBaEMsR0FBd0N1Z0IsWUFBWWhFLE9BQXBEO0NBQ0E5TCxlQUFTWSxNQUFULENBQWdCLEtBQUtGLEtBQXJCLEVBQTRCLEtBQUsvTyxNQUFqQyxFQUF5QyxLQUFLaWUsY0FBTCxHQUFzQixJQUF0QixHQUE2QkcsWUFBdEU7Q0FFQTtDQTFHRjtDQUFBO0NBQUEsd0JBMkJlO0NBRWIsYUFBTyxLQUFLbGdCLFFBQUwsQ0FBY3NULFFBQWQsQ0FBdUIrQixRQUF2QixDQUFnQzNWLEtBQXZDO0NBRUE7Q0FFRDs7O0NBakNEO0NBQUEsc0JBcUNhQSxLQXJDYixFQXFDb0I7Q0FFbEIsV0FBS00sUUFBTCxDQUFjc1QsUUFBZCxDQUF1QitCLFFBQXZCLENBQWdDM1YsS0FBaEMsR0FBd0NBLEtBQXhDO0NBRUE7Q0FFRDs7Ozs7Ozs7Q0EzQ0Q7Q0FBQTtDQUFBLHdCQW1EMEI7Q0FFeEIsYUFBTyxLQUFLTSxRQUFMLENBQWNzVCxRQUFkLENBQXVCZ0MsUUFBdkIsQ0FBZ0M1VixLQUF2QztDQUVBO0NBRUQ7OztDQXpERDtDQUFBLHdCQTZEcUM7Q0FBQSxVQUFiQSxLQUFhLHVFQUFMLEdBQUs7Q0FFbkMsV0FBS00sUUFBTCxDQUFjc1QsUUFBZCxDQUF1QmdDLFFBQXZCLENBQWdDNVYsS0FBaEMsR0FBd0NBLEtBQXhDO0NBRUE7Q0FFRDs7Ozs7Ozs7Q0FuRUQ7Q0FBQTtDQUFBLHdCQTJFcUI7Q0FFbkIsYUFBTyxLQUFLTSxRQUFMLENBQWNzVCxRQUFkLENBQXVCaUMsUUFBdkIsQ0FBZ0M3VixLQUF2QztDQUVBO0NBRUQ7OztDQWpGRDtDQUFBLHdCQXFGZ0M7Q0FBQSxVQUFiQSxLQUFhLHVFQUFMLEdBQUs7Q0FFOUIsV0FBS00sUUFBTCxDQUFjc1QsUUFBZCxDQUF1QmlDLFFBQXZCLENBQWdDN1YsS0FBaEMsR0FBd0NBLEtBQXhDO0NBRUE7Q0F6RkY7O0NBQUE7O0NBQUE7Q0FBQSxFQUFpQ2tnQixJQUFqQzs7Q0NVQTs7Ozs7Ozs7Ozs7O0FBWUEsS0FBYTBLLGVBQWI7Q0FBQTtDQUFBO0NBRUM7Ozs7Ozs7O0NBU0EsNkJBQTBCO0NBQUE7O0NBQUEsUUFBZHBpQixPQUFjLHVFQUFKLEVBQUk7O0NBQUE7O0NBRXpCLHlGQUFNLGlCQUFOO0NBRUE7Ozs7Ozs7O0NBUUEsVUFBS3FpQixzQkFBTCxHQUE4QixJQUFJL0osaUJBQUosQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEI7Q0FDekRDLGlCQUFXK0osd0JBRDhDO0NBRXpEN0osaUJBQVdELFlBRjhDO0NBR3pEZSxjQUFRQyxTQUhpRDtDQUl6RGQscUJBQWUsS0FKMEM7Q0FLekRDLG1CQUFhO0NBTDRDLEtBQTVCLENBQTlCO0NBUUEsVUFBSzBKLHNCQUFMLENBQTRCdE8sT0FBNUIsQ0FBb0NoaUIsSUFBcEMsR0FBMkMsd0JBQTNDO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLd3dCLG1CQUFMLEdBQTJCLE1BQUtGLHNCQUFMLENBQTRCbnNCLEtBQTVCLEVBQTNCO0NBRUEsVUFBS3FzQixtQkFBTCxDQUF5QnhPLE9BQXpCLENBQWlDaGlCLElBQWpDLEdBQXdDLCtCQUF4QztDQUNBLFVBQUt3d0IsbUJBQUwsQ0FBeUJ4TyxPQUF6QixDQUFpQzZFLGVBQWpDLEdBQW1ELEtBQW5EO0NBQ0EsVUFBSzJKLG1CQUFMLENBQXlCeE8sT0FBekIsQ0FBaUN3RSxTQUFqQyxHQUE2Q0MsWUFBN0M7Q0FFQTs7Ozs7OztDQU9BLFVBQUtnSyxvQkFBTCxHQUE0QixNQUFLRCxtQkFBTCxDQUF5QnJzQixLQUF6QixFQUE1QjtDQUVBLFVBQUtzc0Isb0JBQUwsQ0FBMEJ6TyxPQUExQixDQUFrQ2hpQixJQUFsQyxHQUF5QyxnQ0FBekM7Q0FFQTs7Ozs7OztDQU9BLFVBQUs4dUIsWUFBTCxHQUFvQixJQUFJdlMsWUFBSixFQUFwQjtDQUVBOzs7Ozs7O0NBT0EsVUFBS3VMLGtCQUFMLEdBQTBCLElBQUl4SCxrQkFBSixFQUExQjtDQUVBLFVBQUt3SCxrQkFBTCxDQUF3QnpPLFFBQXhCLENBQWlDcUgsV0FBakMsQ0FBNkNqYixLQUE3QyxHQUFzRHdJLFFBQVF5UyxXQUFSLEtBQXdCcmpCLFNBQXpCLEdBQXNDNFEsUUFBUXlTLFdBQTlDLEdBQTRELEdBQWpIO0NBRUE7Ozs7Ozs7Q0FPQSxVQUFLZ1EsMEJBQUwsR0FBa0MsSUFBSXhYLDBCQUFKLEVBQWxDO0NBRUEsVUFBS3RELFVBQUwsR0FBa0IzSCxRQUFRMkgsVUFBMUI7Q0FFQTs7Ozs7OztDQU9BLFVBQUsrYSxtQkFBTCxHQUEyQixJQUFJckwsbUJBQUosRUFBM0I7Q0FFQSxVQUFLc0wsUUFBTCxHQUFnQjNpQixRQUFRMmlCLFFBQXhCO0NBdEZ5QjtDQXdGekI7Q0FFRDs7Ozs7OztDQXJHRDtDQUFBOztDQXdNQzs7Ozs7Ozs7O0NBeE1ELDJCQWtOUTFhLFFBbE5SLEVBa05rQjhQLFdBbE5sQixFQWtOK0JDLFlBbE4vQixFQWtONkN2TSxLQWxON0MsRUFrTm9Ed00sV0FsTnBELEVBa05pRTtDQUUvRCxVQUFNdFAsUUFBUSxLQUFLQSxLQUFuQjtDQUNBLFVBQU0vTyxTQUFTLEtBQUtBLE1BQXBCO0NBRUEsVUFBTTZvQiw2QkFBNkIsS0FBS0EsMEJBQXhDO0NBQ0EsVUFBTTVJLHFCQUFxQixLQUFLQSxrQkFBaEM7Q0FDQSxVQUFNNkksc0JBQXNCLEtBQUtBLG1CQUFqQztDQUNBLFVBQU03QixlQUFlLEtBQUtBLFlBQTFCO0NBRUEsVUFBTTJCLHVCQUF1QixLQUFLQSxvQkFBbEM7Q0FDQSxVQUFNSCx5QkFBeUIsS0FBS0Esc0JBQXBDO0NBQ0EsVUFBTUUsc0JBQXNCLEtBQUtBLG1CQUFqQzs7Q0FFQSxVQUFHLEtBQUtJLFFBQVIsRUFBa0I7Q0FFakI7Q0FDQSxhQUFLN3FCLFFBQUwsR0FBZ0IraEIsa0JBQWhCO0NBQ0FBLDJCQUFtQnpPLFFBQW5CLENBQTRCb0IsUUFBNUIsQ0FBcUNoVixLQUFyQyxHQUE2Q3VnQixZQUFZaEUsT0FBekQ7Q0FDQTlMLGlCQUFTWSxNQUFULENBQWdCRixLQUFoQixFQUF1Qi9PLE1BQXZCLEVBQStCeW9CLHNCQUEvQixFQUxpQjs7Q0FRakIsYUFBS3ZxQixRQUFMLEdBQWdCMnFCLDBCQUFoQjtDQUNBQSxtQ0FBMkJyWCxRQUEzQixDQUFvQ0ssS0FBcEMsQ0FBMENqVSxLQUExQyxHQUFrRGlVLEtBQWxEO0NBQ0FnWCxtQ0FBMkJyWCxRQUEzQixDQUFvQ0MsWUFBcEMsQ0FBaUQ3VCxLQUFqRCxHQUF5RGdyQixxQkFBcUJ6TyxPQUE5RTtDQUNBME8sbUNBQTJCclgsUUFBM0IsQ0FBb0NHLFdBQXBDLENBQWdEL1QsS0FBaEQsR0FBd0Q2cUIsdUJBQXVCdE8sT0FBL0U7Q0FDQTlMLGlCQUFTWSxNQUFULENBQWdCRixLQUFoQixFQUF1Qi9PLE1BQXZCLEVBQStCMm9CLG1CQUEvQixFQVppQjs7Q0FlakIsYUFBS3pxQixRQUFMLEdBQWdCK29CLFlBQWhCO0NBQ0FBLHFCQUFhelYsUUFBYixDQUFzQm9CLFFBQXRCLENBQStCaFYsS0FBL0IsR0FBdUMrcUIsb0JBQW9CeE8sT0FBM0Q7Q0FDQTlMLGlCQUFTWSxNQUFULENBQWdCRixLQUFoQixFQUF1Qi9PLE1BQXZCLEVBQStCNG9CLG9CQUEvQjtDQUVBLE9BakM4RDs7O0NBb0MvRCxXQUFLMXFCLFFBQUwsR0FBZ0I0cUIsbUJBQWhCO0NBQ0FBLDBCQUFvQnRYLFFBQXBCLENBQTZCb0IsUUFBN0IsQ0FBc0NoVixLQUF0QyxHQUE4Q3VnQixZQUFZaEUsT0FBMUQ7Q0FFQTlMLGVBQVNZLE1BQVQsQ0FBZ0IsS0FBS0YsS0FBckIsRUFBNEIsS0FBSy9PLE1BQWpDLEVBQXlDLEtBQUtpZSxjQUFMLEdBQXNCLElBQXRCLEdBQTZCRyxZQUF0RTtDQUVBO0NBRUQ7Ozs7Ozs7Q0E3UEQ7Q0FBQTtDQUFBLCtCQW9RWS9QLFFBcFFaLEVBb1FzQmlRLEtBcFF0QixFQW9RNkI7Q0FFM0IsV0FBS3BnQixRQUFMLEdBQWdCLElBQUlvbEIsaUJBQUosQ0FBc0I7Q0FBRWhoQixlQUFPO0NBQVQsT0FBdEIsQ0FBaEI7Q0FDQStMLGVBQVNZLE1BQVQsQ0FBZ0IsS0FBS0YsS0FBckIsRUFBNEIsS0FBSy9PLE1BQWpDLEVBQXlDLEtBQUs0b0Isb0JBQTlDO0NBQ0EsV0FBSzFxQixRQUFMLENBQWNuRSxPQUFkO0NBRUE7Q0ExUUY7Q0FBQTtDQUFBLHdCQTJHa0I7Q0FFaEIsYUFBTyxLQUFLMHVCLHNCQUFMLENBQTRCOW9CLEtBQW5DO0NBRUE7Q0FFRDs7Ozs7Q0FqSEQ7Q0FBQSx3QkF1SDZCO0NBQUEsVUFBYi9CLEtBQWEsdUVBQUwsR0FBSztDQUUzQjtDQUNBLFVBQU15RixXQUFXQyxLQUFLck4sR0FBTCxDQUFTLENBQVQsRUFBWXFOLEtBQUswbEIsSUFBTCxDQUFVMWxCLEtBQUsybEIsSUFBTCxDQUFVcnJCLEtBQVYsQ0FBVixDQUFaLENBQWpCO0NBQ0FBLGNBQVEwRixLQUFLNGxCLEdBQUwsQ0FBUyxDQUFULEVBQVk3bEIsUUFBWixDQUFSO0NBRUEsV0FBS29sQixzQkFBTCxDQUE0QjlaLE9BQTVCLENBQW9DL1EsS0FBcEMsRUFBMkNBLEtBQTNDO0NBQ0EsV0FBS2dyQixvQkFBTCxDQUEwQmphLE9BQTFCLENBQWtDL1EsS0FBbEMsRUFBeUNBLEtBQXpDO0NBQ0EsV0FBSytxQixtQkFBTCxDQUF5QmhhLE9BQXpCLENBQWlDL1EsS0FBakMsRUFBd0NBLEtBQXhDO0NBRUEsV0FBS2lyQiwwQkFBTCxDQUFnQ3ZYLE9BQWhDLENBQXdDQyxhQUF4QyxHQUF3RGxPLFNBQVN3TCxPQUFULENBQWlCLENBQWpCLENBQXhEO0NBQ0EsV0FBS2dhLDBCQUFMLENBQWdDMVYsV0FBaEMsR0FBOEMsSUFBOUM7Q0FFQTtDQUVEOzs7Ozs7O0NBdElEO0NBQUE7Q0FBQSx3QkE2SWdCO0NBRWQsYUFBUSxLQUFLMlYsbUJBQUwsQ0FBeUJ4WCxPQUF6QixDQUFpQzZYLGlCQUFqQyxLQUF1RDN6QixTQUEvRDtDQUVBO0NBRUQ7Ozs7O0NBbkpEO0NBQUEsd0JBeUo0QjtDQUFBLFVBQWRvSSxLQUFjLHVFQUFOLElBQU07O0NBRTFCLFVBQUdBLEtBQUgsRUFBVTtDQUVULGFBQUtrckIsbUJBQUwsQ0FBeUJ4WCxPQUF6QixDQUFpQzZYLGlCQUFqQyxHQUFxRCxHQUFyRDtDQUNBLGFBQUtMLG1CQUFMLENBQXlCdFgsUUFBekIsQ0FBa0NrTSxZQUFsQyxDQUErQzlmLEtBQS9DLEdBQXVELEtBQUsrcUIsbUJBQUwsQ0FBeUJ4TyxPQUFoRjtDQUVBLE9BTEQsTUFLTztDQUVOLGVBQU8sS0FBSzJPLG1CQUFMLENBQXlCeFgsT0FBekIsQ0FBaUM2WCxpQkFBeEM7Q0FDQSxhQUFLTCxtQkFBTCxDQUF5QnRYLFFBQXpCLENBQWtDa00sWUFBbEMsQ0FBK0M5ZixLQUEvQyxHQUF1RCxJQUF2RDtDQUVBOztDQUVELFdBQUtrckIsbUJBQUwsQ0FBeUIzVixXQUF6QixHQUF1QyxJQUF2QztDQUVBO0NBRUQ7Ozs7OztDQTNLRDtDQUFBO0NBQUEsd0JBaUxpQjtDQUVmLGFBQU8sS0FBSzJWLG1CQUFMLENBQXlCekosU0FBaEM7Q0FFQTtDQUVEOzs7OztDQXZMRDtDQUFBLHNCQTZMZXpoQixLQTdMZixFQTZMc0I7Q0FFcEIsVUFBRyxLQUFLeWhCLFNBQUwsS0FBbUJ6aEIsS0FBdEIsRUFBNkI7Q0FFNUIsYUFBS2tyQixtQkFBTCxDQUF5QnpKLFNBQXpCLEdBQXFDemhCLEtBQXJDO0NBQ0EsYUFBS2tyQixtQkFBTCxDQUF5QjNWLFdBQXpCLEdBQXVDLElBQXZDO0NBRUE7Q0FFRDtDQXRNRjs7Q0FBQTs7Q0FBQTtDQUFBLEVBQXFDMkssSUFBckM7O0NDN0JBOzs7Ozs7Q0NhQTs7Ozs7Ozs7Ozs7Ozs7QUFjQSxLQUFhc0wsY0FBYjtDQUFBO0NBQUE7Q0FFQzs7Ozs7Ozs7O0NBVUEsNEJBQTJDO0NBQUEsUUFBL0IvYSxRQUErQix1RUFBcEIsSUFBb0I7Q0FBQSxRQUFkakksT0FBYyx1RUFBSixFQUFJOztDQUFBOztDQUUxQzs7Ozs7Ozs7Q0FTQSxTQUFLaUksUUFBTCxHQUFnQkEsUUFBaEI7Q0FFQTs7Ozs7Ozs7OztDQVVBLFNBQUs4UCxXQUFMLEdBQW1CLElBQW5CO0NBRUE7Ozs7Ozs7Q0FPQSxTQUFLQyxZQUFMLEdBQW9CLElBQXBCOztDQUVBLFFBQUcsS0FBSy9QLFFBQUwsS0FBa0IsSUFBckIsRUFBMkI7Q0FFMUIsV0FBS0EsUUFBTCxDQUFjZ2IsU0FBZCxHQUEwQixLQUExQjtDQUVBLFdBQUtsTCxXQUFMLEdBQW1CLEtBQUttTCxZQUFMLENBQ2pCbGpCLFFBQVEyWSxXQUFSLEtBQXdCdnBCLFNBQXpCLEdBQXNDNFEsUUFBUTJZLFdBQTlDLEdBQTRELElBRDFDLEVBRWpCM1ksUUFBUTBZLGFBQVIsS0FBMEJ0cEIsU0FBM0IsR0FBd0M0USxRQUFRMFksYUFBaEQsR0FBZ0UsS0FGOUMsRUFHakIxWSxRQUFReU8sWUFBUixLQUF5QnJmLFNBQTFCLEdBQXVDNFEsUUFBUXlPLFlBQS9DLEdBQThELEtBSDVDLENBQW5CO0NBTUEsV0FBS3VKLFlBQUwsR0FBb0IsS0FBS0QsV0FBTCxDQUFpQjdoQixLQUFqQixFQUFwQjtDQUVBO0NBRUQ7Ozs7Ozs7O0NBT0EsU0FBSytvQixRQUFMLEdBQWdCLElBQUlWLFVBQUosQ0FBZSxJQUFJalEsWUFBSixFQUFmLENBQWhCO0NBRUE7Ozs7Ozs7Q0FPQSxTQUFLNlUsTUFBTCxHQUFjLEVBQWQ7Q0FFQTtDQUVEOzs7Ozs7O0NBaEZEO0NBQUE7O0NBK0dDOzs7Ozs7Ozs7Ozs7O0NBL0dELG9DQTZIaUJsYixRQTdIakIsRUE2SDJCO0NBRXpCLFVBQU1tYixjQUFjLEtBQUtuYixRQUF6QjtDQUVBLFVBQUk5UixNQUFKLEVBQVlrdEIsT0FBWixFQUFxQkMsT0FBckI7O0NBRUEsVUFBR0YsZ0JBQWdCLElBQWhCLElBQXdCQSxnQkFBZ0JuYixRQUEzQyxFQUFxRDtDQUVwRCxhQUFLQSxRQUFMLEdBQWdCQSxRQUFoQjtDQUNBLGFBQUtBLFFBQUwsQ0FBY2diLFNBQWQsR0FBMEIsS0FBMUI7Q0FFQTlzQixpQkFBU2l0QixZQUFZaGEsVUFBWixDQUF1Qm1hLFVBQWhDO0NBQ0FGLGtCQUFVRCxZQUFZbmEsT0FBWixFQUFWO0NBQ0FxYSxrQkFBVXJiLFNBQVNnQixPQUFULEVBQVY7O0NBRUEsWUFBRzlTLFdBQVcsSUFBZCxFQUFvQjtDQUVuQkEsaUJBQU9xdEIsV0FBUCxDQUFtQkosWUFBWWhhLFVBQS9CO0NBQ0FqVCxpQkFBT3FSLFdBQVAsQ0FBbUJTLFNBQVNtQixVQUE1QjtDQUVBOztDQUVELFlBQUdpYSxRQUFROXBCLEtBQVIsS0FBa0IrcEIsUUFBUS9wQixLQUExQixJQUFtQzhwQixRQUFRN3BCLE1BQVIsS0FBbUI4cEIsUUFBUTlwQixNQUFqRSxFQUF5RTtDQUV4RSxlQUFLK08sT0FBTDtDQUVBO0NBRUQ7O0NBRUQsYUFBTzZhLFdBQVA7Q0FFQTtDQUVEOzs7Ozs7Ozs7Ozs7O0NBL0pEO0NBQUE7Q0FBQSxpQ0E0S2N6SyxXQTVLZCxFQTRLMkJELGFBNUszQixFQTRLMENqSyxZQTVLMUMsRUE0S3dEO0NBRXRELFVBQU1nVixvQkFBb0IsS0FBS3hiLFFBQUwsQ0FBY3liLG9CQUFkLEVBQTFCO0NBQ0EsVUFBTXhMLFFBQVEsS0FBS2pRLFFBQUwsQ0FBYzBWLE9BQWQsQ0FBc0JnRyxvQkFBdEIsR0FBNkN6TCxLQUEzRDtDQUVBLFVBQU13QixlQUFlLElBQUlwQixpQkFBSixDQUFzQm1MLGtCQUFrQmxxQixLQUF4QyxFQUErQ2txQixrQkFBa0JqcUIsTUFBakUsRUFBeUU7Q0FDN0YrZSxtQkFBV0MsWUFEa0Y7Q0FFN0ZDLG1CQUFXRCxZQUZrRjtDQUc3RmUsZ0JBQVFyQixRQUFRcUosVUFBUixHQUFxQi9ILFNBSGdFO0NBSTdGYixxQkFBYUEsV0FKZ0Y7Q0FLN0ZELHVCQUFlQSxhQUw4RTtDQU03RmpLLHNCQUFjQSxlQUFlLElBQUltVixZQUFKLEVBQWYsR0FBb0M7Q0FOMkMsT0FBekUsQ0FBckI7O0NBU0EsVUFBR25WLGdCQUFnQmlLLGFBQW5CLEVBQWtDO0NBRWpDZ0IscUJBQWFqTCxZQUFiLENBQTBCOEssTUFBMUIsR0FBbUNzSyxrQkFBbkM7Q0FDQW5LLHFCQUFhakwsWUFBYixDQUEwQi9aLElBQTFCLEdBQWlDb3ZCLGtCQUFqQztDQUVBOztDQUVEcEssbUJBQWEzRixPQUFiLENBQXFCaGlCLElBQXJCLEdBQTRCLHVCQUE1QjtDQUNBMm5CLG1CQUFhM0YsT0FBYixDQUFxQjZFLGVBQXJCLEdBQXVDLEtBQXZDO0NBRUEsYUFBT2MsWUFBUDtDQUVBO0NBRUQ7Ozs7Ozs7Q0F4TUQ7Q0FBQTtDQUFBLDRCQStNU3FLLElBL01ULEVBK01leG9CLEtBL01mLEVBK01zQjtDQUVwQixVQUFNME0sV0FBVyxLQUFLQSxRQUF0QjtDQUNBLFVBQU13YixvQkFBb0J4YixTQUFTeWIsb0JBQVQsRUFBMUI7Q0FFQUssV0FBS3hiLE9BQUwsQ0FBYWtiLGtCQUFrQmxxQixLQUEvQixFQUFzQ2txQixrQkFBa0JqcUIsTUFBeEQ7Q0FDQXVxQixXQUFLaEssVUFBTCxDQUFnQjlSLFFBQWhCLEVBQTBCQSxTQUFTMFYsT0FBVCxDQUFpQmdHLG9CQUFqQixHQUF3Q3pMLEtBQWxFOztDQUVBLFVBQUczYyxVQUFVbk0sU0FBYixFQUF3QjtDQUV2QixhQUFLK3pCLE1BQUwsQ0FBWXh4QixNQUFaLENBQW1CNEosS0FBbkIsRUFBMEIsQ0FBMUIsRUFBNkJ3b0IsSUFBN0I7Q0FFQSxPQUpELE1BSU87Q0FFTixhQUFLWixNQUFMLENBQVk5dkIsSUFBWixDQUFpQjB3QixJQUFqQjtDQUVBO0NBRUQ7Q0FFRDs7Ozs7O0NBbk9EO0NBQUE7Q0FBQSwrQkF5T1lBLElBek9aLEVBeU9rQjtDQUVoQixXQUFLWixNQUFMLENBQVl4eEIsTUFBWixDQUFtQixLQUFLd3hCLE1BQUwsQ0FBWXp2QixPQUFaLENBQW9CcXdCLElBQXBCLENBQW5CLEVBQThDLENBQTlDO0NBRUE7Q0FFRDs7Ozs7O0NBL09EO0NBQUE7Q0FBQSwyQkFxUFF0WSxLQXJQUixFQXFQZTtDQUViLFVBQU0wWCxTQUFTLEtBQUtBLE1BQXBCO0NBQ0EsVUFBTWxFLFdBQVcsS0FBS0EsUUFBdEI7Q0FDQSxVQUFNaFgsV0FBVyxLQUFLQSxRQUF0QjtDQUVBLFVBQUk4UCxjQUFjLEtBQUtBLFdBQXZCO0NBQ0EsVUFBSUMsZUFBZSxLQUFLQSxZQUF4QjtDQUVBLFVBQUlDLGNBQWMsS0FBbEI7Q0FDQSxVQUFJOEwsSUFBSixFQUFVcEcsT0FBVixFQUFtQnJwQixLQUFuQixFQUEwQjRKLE1BQTFCO0NBQ0EsVUFBSXRPLENBQUosRUFBT3lwQixDQUFQOztDQUVBLFdBQUl6cEIsSUFBSSxDQUFKLEVBQU95cEIsSUFBSThKLE9BQU9yekIsTUFBdEIsRUFBOEJGLElBQUl5cEIsQ0FBbEMsRUFBcUMsRUFBRXpwQixDQUF2QyxFQUEwQztDQUV6Q20wQixlQUFPWixPQUFPdnpCLENBQVAsQ0FBUDs7Q0FFQSxZQUFHbTBCLEtBQUsvb0IsT0FBUixFQUFpQjtDQUVoQitvQixlQUFLbGIsTUFBTCxDQUFZWixRQUFaLEVBQXNCOFAsV0FBdEIsRUFBbUNDLFlBQW5DLEVBQWlEdk0sS0FBakQsRUFBd0R3TSxXQUF4RDs7Q0FFQSxjQUFHOEwsS0FBS2pNLFNBQVIsRUFBbUI7Q0FFbEIsZ0JBQUdHLFdBQUgsRUFBZ0I7Q0FFZmdILHVCQUFTcEgsY0FBVCxHQUEwQmtNLEtBQUtsTSxjQUEvQjtDQUVBOEYsd0JBQVUxVixTQUFTMFYsT0FBbkI7Q0FDQXJwQixzQkFBUTJULFNBQVMzVCxLQUFqQixDQUxlOztDQVFmQSxvQkFBTTRsQixPQUFOLENBQWNDLE9BQWQsQ0FBc0IrRCxPQUF0QixDQUE4QlAsUUFBUXFHLFFBQXRDLEVBQWdELENBQWhELEVBQW1ELFVBQW5EO0NBQ0EvRSx1QkFBU3BXLE1BQVQsQ0FBZ0JaLFFBQWhCLEVBQTBCOFAsV0FBMUIsRUFBdUNDLFlBQXZDLEVBQXFEdk0sS0FBckQsRUFBNER3TSxXQUE1RDtDQUNBM2pCLG9CQUFNNGxCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQitELE9BQXRCLENBQThCUCxRQUFRVSxLQUF0QyxFQUE2QyxDQUE3QyxFQUFnRCxVQUFoRDtDQUVBOztDQUVEbmdCLHFCQUFTNlosV0FBVDtDQUNBQSwwQkFBY0MsWUFBZDtDQUNBQSwyQkFBZTlaLE1BQWY7Q0FFQTs7Q0FFRCxjQUFHNmxCLGdCQUFnQnZHLFFBQW5CLEVBQTZCO0NBRTVCdkYsMEJBQWMsSUFBZDtDQUVBLFdBSkQsTUFJTyxJQUFHOEwsZ0JBQWdCOUosYUFBbkIsRUFBa0M7Q0FFeENoQywwQkFBYyxLQUFkO0NBRUE7Q0FFRDtDQUVEO0NBRUQ7Q0FFRDs7Ozs7Ozs7Ozs7OztDQWhURDtDQUFBO0NBQUEsNEJBNlRTMWUsS0E3VFQsRUE2VGdCQyxNQTdUaEIsRUE2VHdCO0NBRXRCLFVBQU0ycEIsU0FBUyxLQUFLQSxNQUFwQjtDQUNBLFVBQU1sYixXQUFXLEtBQUtBLFFBQXRCO0NBRUEsVUFBSTdDLElBQUosRUFBVXFlLGlCQUFWO0NBQ0EsVUFBSTd6QixDQUFKLEVBQU95cEIsQ0FBUDs7Q0FFQSxVQUFHOWYsVUFBVW5LLFNBQVYsSUFBdUJvSyxXQUFXcEssU0FBckMsRUFBZ0Q7Q0FFL0NnVyxlQUFPNkMsU0FBU2dCLE9BQVQsRUFBUDtDQUNBMVAsZ0JBQVE2TCxLQUFLN0wsS0FBYjtDQUNBQyxpQkFBUzRMLEtBQUs1TCxNQUFkO0NBRUEsT0FkcUI7OztDQWlCdEJ5TyxlQUFTTSxPQUFULENBQWlCaFAsS0FBakIsRUFBd0JDLE1BQXhCLEVBakJzQjs7Q0FvQnRCaXFCLDBCQUFvQnhiLFNBQVN5YixvQkFBVCxFQUFwQjtDQUVBLFdBQUszTCxXQUFMLENBQWlCeFAsT0FBakIsQ0FBeUJrYixrQkFBa0JscUIsS0FBM0MsRUFBa0RrcUIsa0JBQWtCanFCLE1BQXBFO0NBQ0EsV0FBS3dlLFlBQUwsQ0FBa0J6UCxPQUFsQixDQUEwQmtiLGtCQUFrQmxxQixLQUE1QyxFQUFtRGtxQixrQkFBa0JqcUIsTUFBckU7O0NBRUEsV0FBSTVKLElBQUksQ0FBSixFQUFPeXBCLElBQUk4SixPQUFPcnpCLE1BQXRCLEVBQThCRixJQUFJeXBCLENBQWxDLEVBQXFDLEVBQUV6cEIsQ0FBdkMsRUFBMEM7Q0FFekN1ekIsZUFBT3Z6QixDQUFQLEVBQVUyWSxPQUFWLENBQWtCa2Isa0JBQWtCbHFCLEtBQXBDLEVBQTJDa3FCLGtCQUFrQmpxQixNQUE3RDtDQUVBO0NBRUQ7Q0FFRDs7OztDQTlWRDtDQUFBO0NBQUEsNEJBa1dTO0NBRVAsVUFBTWtnQixlQUFlLEtBQUt3SixZQUFMLENBQ3BCLEtBQUtuTCxXQUFMLENBQWlCWSxXQURHLEVBRXBCLEtBQUtaLFdBQUwsQ0FBaUJXLGFBRkcsRUFHbkIsS0FBS1gsV0FBTCxDQUFpQnRKLFlBQWpCLEtBQWtDLElBSGYsQ0FBckI7Q0FNQSxXQUFLOWEsT0FBTCxHQVJPOztDQVdQLFdBQUtva0IsV0FBTCxHQUFtQjJCLFlBQW5CO0NBQ0EsV0FBSzFCLFlBQUwsR0FBb0IwQixhQUFheGpCLEtBQWIsRUFBcEI7Q0FDQSxXQUFLK29CLFFBQUwsR0FBZ0IsSUFBSVYsVUFBSixDQUFlLElBQUlqUSxZQUFKLEVBQWYsQ0FBaEI7Q0FFQTtDQUVEOzs7Ozs7O0NBblhEO0NBQUE7Q0FBQSw4QkEwWFc7Q0FFVCxVQUFNNlUsU0FBUyxLQUFLQSxNQUFwQjtDQUVBLFVBQUl2ekIsQ0FBSixFQUFPeXBCLENBQVA7O0NBRUEsV0FBSXpwQixJQUFJLENBQUosRUFBT3lwQixJQUFJOEosT0FBT3J6QixNQUF0QixFQUE4QkYsSUFBSXlwQixDQUFsQyxFQUFxQyxFQUFFenBCLENBQXZDLEVBQTBDO0NBRXpDdXpCLGVBQU92ekIsQ0FBUCxFQUFVK0QsT0FBVjtDQUVBOztDQUVELFdBQUt3dkIsTUFBTCxHQUFjLEVBQWQ7O0NBRUEsVUFBRyxLQUFLcEwsV0FBTCxLQUFxQixJQUF4QixFQUE4QjtDQUU3QixhQUFLQSxXQUFMLENBQWlCcGtCLE9BQWpCO0NBQ0EsYUFBS29rQixXQUFMLEdBQW1CLElBQW5CO0NBRUE7O0NBRUQsVUFBRyxLQUFLQyxZQUFMLEtBQXNCLElBQXpCLEVBQStCO0NBRTlCLGFBQUtBLFlBQUwsQ0FBa0Jya0IsT0FBbEI7Q0FDQSxhQUFLcWtCLFlBQUwsR0FBb0IsSUFBcEI7Q0FFQTs7Q0FFRCxXQUFLaUgsUUFBTCxDQUFjdHJCLE9BQWQ7Q0FFQTtDQXhaRjtDQUFBO0NBQUEsd0JBc0ZvQjtDQUVsQixhQUFPLEtBQUtva0IsV0FBTCxDQUFpQnRKLFlBQXhCO0NBRUE7Q0FFRDs7Ozs7Ozs7Ozs7Q0E1RkQ7Q0FBQSxzQkF3R2tCalcsQ0F4R2xCLEVBd0dxQjtDQUVuQixXQUFLdWYsV0FBTCxDQUFpQnRKLFlBQWpCLEdBQWdDalcsQ0FBaEM7Q0FDQSxXQUFLd2YsWUFBTCxDQUFrQnZKLFlBQWxCLEdBQWlDalcsQ0FBakM7Q0FFQTtDQTdHRjs7Q0FBQTtDQUFBOztDQ3JCQSxJQUFNeXJCLFdBQVcsU0FBWEEsUUFBVyxDQUFDbjFCLE1BQUQsRUFBU28xQixNQUFULEVBQXFDO0NBQUEsTUFBcEJDLFFBQW9CLHVFQUFULElBQVM7Q0FDcEQsTUFBSXIxQixPQUFPbzFCLE1BQVAsQ0FBSixFQUFvQjtDQUNwQixNQUFJQyxRQUFKLEVBQWN0eUIsUUFBUW9ELElBQVIsc0NBQTJDaXZCLE1BQTNDLHdCQUFzRXAxQixNQUF0RTs7Q0FDZEEsU0FBT28xQixNQUFQLElBQWlCLFlBQU0sRUFBdkI7Q0FDRCxDQUpEO0NBTUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLEtBQWFFLG1CQUFiO0NBQUE7Q0FBQTtDQVdFLGlDQUFtRDtDQUFBOztDQUFBLFFBQXZDOXVCLE1BQXVDLHVFQUE5Qjh1QixvQkFBb0I3dUIsUUFBVTs7Q0FBQTs7Q0FBQSwyREFWckMsSUFVcUMsWUFSM0MsSUFBSTlKLE9BQUosQ0FBWSxtQkFBVztDQUM3QixZQUFLeU0sT0FBTCxHQUFlQSxPQUFmO0NBQ0QsS0FGTyxDQVEyQzs7Q0FDakQsU0FBS21zQixLQUFMLEdBQWEvdUIsT0FBTyt1QixLQUFwQjtDQUNBLFNBQUsvdUIsTUFBTCxHQUFjQSxNQUFkO0NBQ0Q7O0NBZEg7Q0FBQTtDQUFBLDRCQWdCVWhDLFFBaEJWLEVBZ0JtQjtDQUFBOztDQUNmQSxlQUFRK1YsTUFBUixDQUFlLGVBQWY7O0NBRUEsV0FBS2pCLE9BQUwsR0FBZTlVLFNBQVE4QixHQUFSLENBQVksV0FBWixFQUF5QmdULE9BQXhDO0NBQ0EsV0FBS0gsUUFBTCxHQUFnQjNVLFNBQVFPLEdBQVIsQ0FBWSxVQUFaLENBQWhCO0NBQ0EsV0FBSzhVLEtBQUwsR0FBYXJWLFNBQVFPLEdBQVIsQ0FBWSxPQUFaLENBQWI7Q0FDQSxXQUFLK0YsTUFBTCxHQUFjdEcsU0FBUU8sR0FBUixDQUFZLFFBQVosQ0FBZDtDQUVBLFdBQUt5d0IsUUFBTCxHQUFnQixJQUFJdEIsY0FBSixDQUFtQixLQUFLL2EsUUFBeEIsRUFBa0MsS0FBSzNTLE1BQXZDLENBQWhCOztDQUVBaEMsZUFBUThCLEdBQVIsQ0FBWSxXQUFaLEVBQXlCMEcsSUFBekI7O0NBRUEsVUFBTXdvQixXQUFXLEtBQUtBLFFBQXRCO0NBQ0EsV0FBS3RiLFVBQUwsR0FBa0IsSUFBSXhOLElBQUosQ0FBUztDQUFBLGVBQVM4b0IsU0FBU3piLE1BQVQsQ0FBZ0J4TixNQUFNa3BCLFFBQU4sRUFBaEIsQ0FBVDtDQUFBLE9BQVQsRUFBcUQxb0IsS0FBckQsQ0FBMkR2SSxTQUFRWSxPQUFuRSxDQUFsQjs7Q0FFQVosZUFBUWlXLE1BQVIsQ0FBZTtDQUNidEIsa0JBQVUsNkJBQVk7Q0FDcEIsaUJBQUtxYyxRQUFMLENBQWNFLGVBQWQsQ0FBOEJ2YyxTQUE5QjtDQUNELFNBSFk7Q0FLYlUsZUFBTyx1QkFBUztDQUNkLGlCQUFLQSxLQUFMLEdBQWFBLE1BQWI7Q0FDRCxTQVBZO0NBU2IvTyxnQkFBUSx5QkFBVTtDQUNoQixpQkFBS0EsTUFBTCxHQUFjQSxPQUFkO0NBQ0Q7Q0FYWSxPQUFmOztDQWNBLFdBQUsxQixPQUFMO0NBQ0Q7Q0FFRDs7Ozs7OztDQWhERjtDQUFBO0NBQUEsNkJBc0RXO0NBQUE7O0NBQ1AsV0FBS21CLEtBQUwsQ0FBV3ZELElBQVgsQ0FBZ0IsWUFBTTtDQUNwQixZQUFNaXVCLE9BQU8sSUFBSTFILFVBQUosQ0FBZSxPQUFLMVQsS0FBcEIsRUFBMkIsT0FBSy9PLE1BQUwsQ0FBWTNELE1BQXZDLENBQWIsQ0FEb0I7O0NBS3BCLGVBQUtxdUIsUUFBTCxDQUFjRyxPQUFkLENBQXNCVixJQUF0Qjs7Q0FDQSxlQUFLVyxXQUFMLEdBQW1CWCxJQUFuQjtDQUNELE9BUEQ7Q0FTQSxhQUFPLElBQVA7Q0FDRDtDQUVEOzs7Ozs7OztDQW5FRjtDQUFBO0NBQUEseUJBMEVPQSxLQTFFUCxFQTBFYTtDQUFBOztDQUNULFdBQUsxcUIsS0FBTCxDQUFXdkQsSUFBWCxDQUFnQixZQUFNO0NBQ3BCbXVCLGlCQUFTRixLQUFULEVBQWUsU0FBZixFQUEwQixPQUFLTSxLQUEvQjtDQUNBSixpQkFBU0YsS0FBVCxFQUFlLFlBQWYsRUFBNkIsT0FBS00sS0FBbEM7O0NBRUEsZUFBS0MsUUFBTCxDQUFjRyxPQUFkLENBQXNCVixLQUF0Qjs7Q0FDQSxlQUFLVyxXQUFMLEdBQW1CWCxLQUFuQjtDQUNELE9BTkQ7Q0FRQSxhQUFPLElBQVA7Q0FDRDtDQUVEOzs7Ozs7Ozs7Q0F0RkY7Q0FBQTtDQUFBLDJCQThGU2pzQixRQTlGVCxFQThGNkM7Q0FBQTs7Q0FBQSxVQUExQjBtQixTQUEwQix1RUFBZCxZQUFjO0NBQ3pDLFdBQUtubEIsS0FBTCxDQUFXdkQsSUFBWCxDQUFnQixZQUFNO0NBQ3BCLFlBQUksQ0FBQ2dDLFNBQVNzVCxRQUFULENBQWtCb1QsU0FBbEIsQ0FBTCxFQUNFMW1CLFNBQVNzVCxRQUFULENBQWtCb1QsU0FBbEIsSUFBK0I7Q0FBQ2huQixpQkFBTztDQUFSLFNBQS9CO0NBRUYsWUFBTXVzQixPQUFPLElBQUl4RixVQUFKLENBQWV6bUIsUUFBZixFQUF5QjBtQixTQUF6QixDQUFiOztDQUVBLGVBQUs4RixRQUFMLENBQWNHLE9BQWQsQ0FBc0JWLElBQXRCOztDQUNBLGVBQUtXLFdBQUwsR0FBbUJYLElBQW5CO0NBQ0QsT0FSRDtDQVVBLGFBQU8sSUFBUDtDQUNEO0NBRUQ7Ozs7Ozs7O0NBNUdGO0NBQUE7Q0FBQSx3QkFtSE1oeUIsSUFuSE4sRUFtSFk7Q0FDUixhQUFPQSxPQUNILEtBQUt1eUIsUUFBTCxDQUFjbkIsTUFBZCxDQUFxQjVoQixNQUFyQixDQUE0QjtDQUFBLGVBQVF3aUIsS0FBS2h5QixJQUFMLEtBQWNBLElBQXRCO0NBQUEsT0FBNUIsRUFBd0QsQ0FBeEQsQ0FERyxHQUVILEtBQUsyeUIsV0FGVDtDQUdEO0NBRUQ7Ozs7Ozs7O0NBekhGO0NBQUE7Q0FBQSxxQ0FnSThCO0NBQUE7O0NBQUEsVUFBYkMsSUFBYSx1RUFBTixJQUFNO0NBQzFCLFdBQUt0ckIsS0FBTCxDQUFXdkQsSUFBWCxDQUFnQixZQUFNO0NBQ3BCLGVBQUs0dUIsV0FBTCxDQUFpQjdNLGNBQWpCLEdBQWtDOE0sSUFBbEM7Q0FDRCxPQUZEO0NBSUEsYUFBTyxJQUFQO0NBQ0Q7Q0F0SUg7O0NBQUE7Q0FBQTs7a0JBQWFQLGlDQU9PO0NBQ2hCQyxTQUFPO0NBRFM7O0NDM0NwQjs7Ozs7O0FBTUEsS0FBYU8saUJBQWI7Q0FBQTtDQUFBO0NBQUE7Q0FBQTtDQUFBOztDQUFBO0NBQUE7Q0FBQSw0QkFDVXR4QixRQURWLEVBQ21CO0NBQ2ZBLGVBQVErVixNQUFSLENBQWUsUUFBZjs7Q0FDQSxXQUFLakMsT0FBTCxHQUFlOVQsU0FBUU8sR0FBUixDQUFZLFVBQVosRUFBd0J1VixVQUF2QztDQUNEO0NBRUQ7Ozs7Ozs7OztDQU5GO0NBQUE7Q0FBQSxnQ0FjY3liLFlBZGQsRUFjNEQ7Q0FBQSxVQUFoQ0MsVUFBZ0MsdUVBQW5CLElBQW1CO0NBQUEsVUFBYkMsTUFBYSx1RUFBSixFQUFJO0NBQ3hEQSxhQUFPdGpCLE9BQVAsQ0FBZTtDQUFBLGVBQ2JvakIsYUFBYWphLGdCQUFiLENBQThCb2EsS0FBOUIsRUFBcUM7Q0FBQSxpQkFBS0YsV0FBV0csSUFBWCxDQUFnQkQsS0FBaEIsRUFBdUI3cEIsQ0FBdkIsQ0FBTDtDQUFBLFNBQXJDLENBRGE7Q0FBQSxPQUFmO0NBR0Q7Q0FsQkg7Q0FBQTtDQUFBLDhCQW9CWW9NLElBcEJaLEVBb0JrQjtDQUFBLFVBQ1BILE9BRE8sR0FDaUJHLElBRGpCLENBQ1BILE9BRE87Q0FBQSxVQUNFOGQsV0FERixHQUNpQjNkLElBRGpCLENBQ0UyZCxXQURGO0NBR2RBLGtCQUFZOWQsT0FBWixFQUFxQixJQUFyQixFQUEyQixDQUN6QixXQUR5QixFQUV6QixTQUZ5QixFQUd6QixhQUh5QixFQUl6QixXQUp5QixFQUt6QixPQUx5QixFQU16QixPQU55QixFQU96QixZQVB5QixFQVF6QixVQVJ5QixFQVN6QixXQVR5QixFQVV6QixTQVZ5QixFQVd6QixPQVh5QixFQVl6QixVQVp5QixDQUEzQjtDQWNEO0NBckNIOztDQUFBO0NBQUE7O0NDSUE7Ozs7Ozs7O0FBT0EsS0FBYStkLGtCQUFiO0NBQUE7Q0FBQTtDQU9FLGdDQUFvQztDQUFBOztDQUFBLFFBQXhCQyxjQUF3Qix1RUFBUCxLQUFPOztDQUFBOztDQUNsQzs7Q0FEa0MsdUpBTjVCLElBQUl4ZCxPQUFKLEVBTTRCLGdCQUx4QixJQUFJeWQsU0FBSixFQUt3QixZQUo1QixJQUk0QixhQUgzQixJQUcyQixzQkFGbEIsSUFBSWppQixLQUFKLENBQVUsSUFBSUQsT0FBSixDQUFZLENBQVosRUFBZSxDQUFmLEVBQWtCLENBQWxCLENBQVYsRUFBZ0MsQ0FBaEMsQ0FFa0I7O0NBRWxDLFVBQUtpaUIsY0FBTCxHQUFzQkEsY0FBdEI7Q0FGa0M7Q0FHbkM7O0NBVkg7Q0FBQTtDQUFBLDJCQVlTanFCLENBWlQsRUFZWW1xQixPQVpaLEVBWXFCQyxPQVpyQixFQVk4QjtDQUMxQixVQUFNQyxPQUFPLEtBQUtyYyxNQUFMLENBQVlzYyxxQkFBWixFQUFiO0NBRUEsVUFBTWp0QixJQUFJOHNCLFdBQVducUIsRUFBRXVxQixPQUF2QjtDQUNBLFVBQU1qdEIsSUFBSThzQixXQUFXcHFCLEVBQUV3cUIsT0FBdkI7Q0FFQSxXQUFLQyxLQUFMLENBQVdwdEIsQ0FBWCxHQUFnQixDQUFDQSxJQUFJZ3RCLEtBQUt4ckIsSUFBVixLQUFtQndyQixLQUFLdnJCLEtBQUwsR0FBYXVyQixLQUFLeHJCLElBQXJDLENBQUQsR0FBK0MsQ0FBL0MsR0FBbUQsQ0FBbEU7Q0FDQSxXQUFLNHJCLEtBQUwsQ0FBV250QixDQUFYLEdBQWUsRUFBRSxDQUFDQSxJQUFJK3NCLEtBQUt0ckIsR0FBVixLQUFrQnNyQixLQUFLcnJCLE1BQUwsR0FBY3FyQixLQUFLdHJCLEdBQXJDLENBQUYsSUFBK0MsQ0FBL0MsR0FBbUQsQ0FBbEU7Q0FFQSxXQUFLMnJCLGVBQUwsQ0FBcUJDLE1BQXJCLENBQTRCL3ZCLElBQTVCLENBQWlDLEtBQUs2RCxNQUFMLENBQVlrbkIsaUJBQVosRUFBakM7Q0FFQSxXQUFLaUYsU0FBTCxDQUFlQyxhQUFmLENBQTZCLEtBQUtKLEtBQWxDLEVBQXlDLEtBQUtoc0IsTUFBOUM7Q0FDQSxXQUFLcXJCLElBQUwsQ0FBVSxNQUFWO0NBQ0Q7Q0F6Qkg7Q0FBQTtDQUFBLDRCQTJCVTN4QixRQTNCVixFQTJCbUI7Q0FDZkEsZUFBUStWLE1BQVIsQ0FBZSxPQUFmOztDQUNBL1YsZUFBUTJ5QixPQUFSLENBQWdCLFFBQWhCLEVBQTBCO0NBQUEsZUFBTSxJQUFJckIsaUJBQUosRUFBTjtDQUFBLE9BQTFCOztDQUVBLFdBQUt6YixNQUFMLEdBQWM3VixTQUFRTyxHQUFSLENBQVksVUFBWixFQUF3QnVWLFVBQXRDO0NBQ0EsV0FBS3hQLE1BQUwsR0FBY3RHLFNBQVFPLEdBQVIsQ0FBWSxRQUFaLEVBQXNCb0MsTUFBcEM7Q0FDRDtDQWpDSDtDQUFBO0NBQUEsOEJBbUNZc1IsSUFuQ1osRUFtQ2tCO0NBQUE7O0NBQ2QsT0FDRSxPQURGLEVBRUUsV0FGRixFQUdFLFNBSEYsRUFJRSxXQUpGLEVBS0U5RixPQUxGLENBS1U7Q0FBQSxlQUFNLE9BQUt5a0IsRUFBTCxDQUFRQyxFQUFSLEVBQVk7Q0FBQSxpQkFBSzVlLEtBQUswZCxJQUFMLENBQVVrQixFQUFWLEVBQWNockIsQ0FBZCxDQUFMO0NBQUEsU0FBWixDQUFOO0NBQUEsT0FMVjtDQU9Bb00sV0FBSzZlLE9BQUwsR0FBZSxDQUFmO0NBQ0E3ZSxXQUFLOGUsT0FBTCxHQUFlLENBQWY7Q0FFQSxXQUFLSCxFQUFMLENBQVEsV0FBUixFQUFxQixhQUFLO0NBQ3hCLFlBQUl4OUIsU0FBUzQ5QixrQkFBVCxLQUFnQyxJQUFwQyxFQUEwQztDQUN4Qy9lLGVBQUs2ZSxPQUFMLElBQWdCanJCLEVBQUVvckIsU0FBbEI7Q0FDQWhmLGVBQUs4ZSxPQUFMLElBQWdCbHJCLEVBQUVxckIsU0FBbEI7Q0FFQWpmLGVBQUtnQyxNQUFMLENBQVlwTyxDQUFaLEVBQWVvTSxLQUFLNmUsT0FBcEIsRUFBNkI3ZSxLQUFLOGUsT0FBbEM7Q0FDRCxTQUxELE1BS085ZSxLQUFLZ0MsTUFBTCxDQUFZcE8sQ0FBWjtDQUNSLE9BUEQ7Q0FRRDtDQUVEOzs7Ozs7OztDQXhERjtDQUFBO0NBQUEsMEJBK0RRNUosU0EvRFIsRUErRGtDO0NBQUE7O0NBQUEsVUFBZmsxQixNQUFlLHVFQUFOLElBQU07Q0FDOUIsVUFBSUMsWUFBWSxLQUFoQjtDQUVBLFdBQUtSLEVBQUwsQ0FBUSxNQUFSLEVBQWdCLFlBQU07Q0FDcEIsWUFBSSxPQUFLUyxNQUFMLENBQVlwMUIsU0FBWixFQUF1QmsxQixNQUF2QixDQUFKLEVBQW9DO0NBQ2xDLGNBQUlDLFNBQUosRUFBZW4xQixVQUFVMHpCLElBQVYsQ0FBZSxXQUFmLEVBQWYsS0FDSztDQUNIMXpCLHNCQUFVMHpCLElBQVYsQ0FBZSxXQUFmO0NBQ0F5Qix3QkFBWSxJQUFaO0NBQ0Q7Q0FDRixTQU5ELE1BTU8sSUFBSUEsU0FBSixFQUFlO0NBQ3BCbjFCLG9CQUFVMHpCLElBQVYsQ0FBZSxVQUFmO0NBQ0F5QixzQkFBWSxLQUFaO0NBQ0Q7Q0FDRixPQVhEO0NBYUEsV0FBS1IsRUFBTCxDQUFRLE9BQVIsRUFBaUIsWUFBTTtDQUNyQixZQUFJUSxTQUFKLEVBQWVuMUIsVUFBVTB6QixJQUFWLENBQWUsT0FBZixFQUFmLEtBQ0sxekIsVUFBVTB6QixJQUFWLENBQWUsVUFBZjtDQUNOLE9BSEQ7Q0FLQSxXQUFLaUIsRUFBTCxDQUFRLFdBQVIsRUFBcUIsWUFBTTtDQUN6QixZQUFJUSxTQUFKLEVBQWVuMUIsVUFBVTB6QixJQUFWLENBQWUsV0FBZjtDQUNoQixPQUZEO0NBSUEsV0FBS2lCLEVBQUwsQ0FBUSxTQUFSLEVBQW1CLFlBQU07Q0FDdkIsWUFBSVEsU0FBSixFQUFlbjFCLFVBQVUwekIsSUFBVixDQUFlLFNBQWY7Q0FDaEIsT0FGRDtDQUdEO0NBRUQ7Ozs7Ozs7OztDQTdGRjtDQUFBO0NBQUEsdUNBcUd3QztDQUFBLFVBQXhCaHZCLE1BQXdCLFFBQXhCQSxNQUF3QjtDQUFBLFVBQWZ3d0IsTUFBZSx1RUFBTixJQUFNOztDQUNwQyxVQUFJeHdCLE9BQU9NLFFBQVAsQ0FBZ0J6RyxNQUFoQixHQUF5QixDQUF6QixJQUE4QjIyQixNQUFsQyxFQUEwQztDQUN4QyxZQUFNaEgsVUFBVSxFQUFoQjtDQUNBeHBCLGVBQU8yd0IsUUFBUCxDQUFnQjtDQUFBLGlCQUFTbkgsUUFBUXBzQixJQUFSLENBQWF3ekIsS0FBYixDQUFUO0NBQUEsU0FBaEI7Q0FFQSxlQUFPLEtBQUtkLFNBQUwsQ0FBZWUsZ0JBQWYsQ0FBZ0NySCxPQUFoQyxDQUFQO0NBQ0Q7O0NBRUQsYUFBTyxLQUFLc0csU0FBTCxDQUFlZ0IsZUFBZixDQUErQjl3QixNQUEvQixDQUFQO0NBQ0Q7Q0FFRDs7Ozs7Ozs7O0NBaEhGO0NBQUE7Q0FBQSw4QkF3SGdEO0NBQUEsVUFBdEMrd0IsS0FBc0MsdUVBQTlCLEtBQUtuQixlQUF5QjtDQUFBLFVBQVIvdUIsTUFBUTtDQUM1QyxhQUFPLEtBQUtpdkIsU0FBTCxDQUFla0IsR0FBZixDQUFtQkMsY0FBbkIsQ0FBa0NGLEtBQWxDLEVBQXlDbHdCLE1BQXpDLENBQVA7Q0FDRDtDQUVEOzs7Ozs7Ozs7Q0E1SEY7Q0FBQTtDQUFBLDJCQW9JU3ZGLFNBcElULEVBb0ltQztDQUFBLFVBQWZrMUIsTUFBZSx1RUFBTixJQUFNO0NBQy9CLGFBQU8sS0FBS1UsWUFBTCxDQUFrQjUxQixTQUFsQixFQUE2QmsxQixNQUE3QixFQUFxQzMyQixNQUFyQyxHQUE4QyxDQUFyRDtDQUNEO0NBRUQ7Ozs7OztDQXhJRjtDQUFBO0NBQUEsd0JBNklZO0NBQ1IsYUFBTyxLQUFLaTJCLFNBQUwsQ0FBZWtCLEdBQXRCO0NBQ0Q7Q0FFRDs7Ozs7O0NBakpGO0NBQUE7Q0FBQSx3QkFzSlU7Q0FDTixhQUFPLEtBQUtyQixLQUFMLENBQVdwdEIsQ0FBbEI7Q0FDRDtDQUVEOzs7Ozs7Q0ExSkY7Q0FBQTtDQUFBLHdCQStKVTtDQUNOLGFBQU8sS0FBS290QixLQUFMLENBQVdudEIsQ0FBbEI7Q0FDRDtDQWpLSDs7Q0FBQTs7Q0FBQTtDQUFBLEVBQXdDN0Usa0JBQXhDOztDQ2RBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkEsS0FBYXd6QixjQUFiO0NBQUE7Q0FBQTtDQUFBO0NBQUE7Q0FBQSx5QkFDY0MsUUFEZCxFQUN3QjtDQUNwQixhQUFPLElBQUlELGNBQUosQ0FBbUI7Q0FBQ0M7Q0FBRCxPQUFuQixDQUFQO0NBQ0Q7Q0FISDs7Q0FLRSw0QkFBeUI7Q0FBQSxRQUFiL3hCLE1BQWEsdUVBQUosRUFBSTs7Q0FBQTs7Q0FDdkIsU0FBS0EsTUFBTCxHQUFjckcsT0FBT2tXLE1BQVAsQ0FBYztDQUMxQmtpQixnQkFBVSxLQURnQjtDQUUxQm5mLFdBQUs7Q0FBQSxlQUFZbWYsUUFBWjtDQUFBLE9BRnFCO0NBSTFCOWQsWUFKMEIsa0JBSW5CK2QsQ0FKbUIsRUFJaEI7Q0FDUixhQUFLRCxRQUFMLENBQWM5ZCxNQUFkLENBQXFCK2QsRUFBRS9DLFFBQUYsRUFBckI7Q0FDRDtDQU55QixLQUFkLEVBT1hqdkIsTUFQVyxDQUFkO0NBU0EsU0FBSyt4QixRQUFMLEdBQWdCLEtBQUsveEIsTUFBTCxDQUFZK3hCLFFBQTVCO0NBQ0EsU0FBSzlkLE1BQUwsR0FBYyxLQUFLalUsTUFBTCxDQUFZaVUsTUFBMUI7Q0FDRDs7Q0FqQkg7Q0FBQTtDQUFBLDRCQW1CVWpXLFFBbkJWLEVBbUJtQjtDQUNmQSxlQUFRK1YsTUFBUixDQUFlLFVBQWY7O0NBQ0EvVixlQUFRMnlCLE9BQVIsQ0FBZ0IsUUFBaEIsRUFBMEI7Q0FBQSxlQUFNLElBQUlyQixpQkFBSixFQUFOO0NBQUEsT0FBMUI7Q0FDRDtDQUVEOzs7Ozs7OztDQXhCRjtDQUFBO0NBQUEsZ0NBK0JjeUMsUUEvQmQsRUErQndCO0NBQ3BCLFdBQUtBLFFBQUwsR0FBZ0JBLFFBQWhCO0NBQ0EsYUFBTyxJQUFQO0NBQ0Q7Q0FFRDs7Ozs7Ozs7Q0FwQ0Y7Q0FBQTtDQUFBLDhCQTJDWTlkLE1BM0NaLEVBMkNvQjtDQUNoQixXQUFLQSxNQUFMLEdBQWNBLE1BQWQ7Q0FDQSxhQUFPLElBQVA7Q0FDRDtDQTlDSDtDQUFBO0NBQUEsOEJBZ0RZaEMsSUFoRFosRUFnRGtCO0NBQ2RBLFdBQUtnZ0IsVUFBTCxHQUFrQixJQUFJL3JCLElBQUosQ0FBUytMLEtBQUtnQyxNQUFMLENBQVl4WSxJQUFaLENBQWlCd1csSUFBakIsQ0FBVCxDQUFsQjtDQUNBQSxXQUFLZ2dCLFVBQUwsQ0FBZ0IxckIsS0FBaEIsQ0FBc0IsSUFBdEI7Q0FDRDtDQW5ESDs7Q0FBQTtDQUFBOztDQ2ZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxLQUFhMnJCLFNBQWI7Q0FBQTtDQUFBO0NBQ0UsdUJBQStCO0NBQUEsUUFBbkJseUIsTUFBbUIsdUVBQVYsRUFBVTtDQUFBLFFBQU5aLElBQU07O0NBQUE7O0NBQzdCLFNBQUtZLE1BQUwsR0FBY3JHLE9BQU9rVyxNQUFQLENBQWM7Q0FDMUJqSixhQUFPLFFBRG1CO0NBRTFCNlYsZUFBUyxLQUZpQjtDQUcxQmxZLFlBQU0sRUFIb0I7Q0FJMUJDLFdBQUs7Q0FKcUIsS0FBZCxFQUtYeEUsTUFMVyxDQUFkO0NBTUEsUUFBSSxDQUFDWixJQUFELElBQVNBLFNBQVMsTUFBdEIsRUFBOEIsS0FBSyt5QixHQUFMLEdBQVcsSUFBSUMsT0FBSixDQUFZLEtBQUtweUIsTUFBTCxDQUFZNEcsS0FBeEIsRUFBK0IsS0FBSzVHLE1BQUwsQ0FBWXljLE9BQTNDLENBQVgsQ0FBOUIsS0FDSyxJQUFJcmQsU0FBUyxRQUFiLEVBQXVCLEtBQUsreUIsR0FBTCxHQUFXLElBQUlFLEdBQUosQ0FBUSxLQUFLcnlCLE1BQUwsQ0FBWTRHLEtBQXBCLEVBQTJCLEtBQUs1RyxNQUFMLENBQVl1RSxJQUF2QyxFQUE2QyxLQUFLdkUsTUFBTCxDQUFZd0UsR0FBekQsQ0FBWDtDQUM3Qjs7Q0FWSDtDQUFBO0NBQUEsNEJBWVV4RyxRQVpWLEVBWW1CO0NBQ2ZBLGVBQVE0QixHQUFSLENBQVksS0FBWixFQUFtQixLQUFLdXlCLEdBQXhCOztDQUNBbjBCLGVBQVFPLEdBQVIsQ0FBWSxPQUFaLEVBQXFCNHpCLEdBQXJCLEdBQTJCLEtBQUtBLEdBQWhDO0NBQ0Q7Q0FmSDs7Q0FBQTtDQUFBOztDQ3RCQSxJQUFNRyxpQkFBaUIsU0FBakJBLGNBQWlCLENBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFVO0NBQy9CLE1BQUlELE1BQU1DLENBQVYsRUFBYSxPQUFPLElBQVAsQ0FBYixLQUNLLElBQUlELEtBQUtBLEVBQUVFLE1BQVAsSUFBaUJGLEVBQUVFLE1BQUYsQ0FBU0QsQ0FBVCxDQUFyQixFQUFrQyxPQUFPLElBQVA7Q0FFdkMsU0FBTyxLQUFQO0NBQ0QsQ0FMRDtDQU9BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsS0FBYUUsV0FBYjtDQUFBO0NBQUE7Q0FBQTtDQUFBO0NBQUEsbUNBQ3dCQyxPQUR4QixFQUNpQztDQUM3QixhQUFPLFlBQW1DO0NBQUEsWUFBbEMzekIsS0FBa0MsdUVBQTFCLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FBMEI7O0NBQUE7Q0FBQSxZQUFmcEUsR0FBZSxRQUFmQSxHQUFlO0NBQUEsWUFBVnNFLElBQVUsUUFBVkEsSUFBVTs7Q0FDeEMsWUFBSXl6QixRQUFRM3pCLE1BQU0sQ0FBTixFQUFTcEUsR0FBVCxDQUFSLEVBQXVCc0UsSUFBdkIsQ0FBSixFQUFrQyxPQUFPRixLQUFQO0NBRWxDQSxjQUFNLENBQU4sRUFBU3BFLEdBQVQsSUFBZ0JzRSxJQUFoQjtDQUNBRixjQUFNLENBQU4sSUFBV3BFLEdBQVg7Q0FFQSxlQUFPb0UsS0FBUDtDQUNELE9BUEQ7Q0FRRDtDQVZIOztDQVlFLHlCQUF5QztDQUFBLFFBQTdCNHpCLFVBQTZCLHVFQUFoQk4sY0FBZ0I7O0NBQUE7O0NBQ3ZDLFNBQUt4ekIsS0FBTCxHQUFhQyxZQUNYMnpCLFlBQVlHLGNBQVosQ0FBMkJELFVBQTNCLENBRFcsQ0FBYjtDQUlBLFNBQUtFLGFBQUwsR0FBcUIsRUFBckI7Q0FDQSxTQUFLQyxhQUFMLEdBQXFCLFNBQXJCO0NBQ0EsU0FBS0MsVUFBTCxHQUFrQixTQUFsQjtDQUNEO0NBRUQ7Ozs7Ozs7Ozs7Ozs7Q0F0QkY7Q0FBQTtDQUFBLDZCQWlDVTl6QixJQWpDVixFQWlDZ0I7Q0FDWixXQUFLK3pCLE1BQUwsQ0FBWTtDQUFDQyxpQkFBU2gwQjtDQUFWLE9BQVo7Q0FDQSxhQUFPLElBQVA7Q0FDRDtDQUVEOzs7Ozs7O0NBdENGO0NBQUE7Q0FBQSxrQ0E0Q2dCckIsSUE1Q2hCLEVBNENzQjtDQUNsQixXQUFLaUIsS0FBTCxDQUFXcTBCLGNBQVgsQ0FDRVQsWUFBWUcsY0FBWixDQUEyQmgxQixJQUEzQixDQURGO0NBR0Q7Q0FoREg7Q0FBQTtDQUFBLDRCQWtEVUcsUUFsRFYsRUFrRG1CO0NBQ2ZBLGVBQVErVixNQUFSLENBQWUsT0FBZjtDQUNEO0NBRUQ7Ozs7Ozs7Ozs7Ozs7O0NBdERGO0NBQUE7Q0FBQSwyQkFtRVNxZixPQW5FVCxFQW1Fa0I7Q0FDZCxXQUFLLElBQU14NEIsR0FBWCxJQUFrQnc0QixPQUFsQixFQUEyQjtDQUN6QixZQUFJeDRCLEdBQUosRUFBUztDQUNQLGVBQUtrNEIsYUFBTCxDQUFtQmw0QixHQUFuQixJQUEwQkEsUUFBUSxTQUFSLEdBQ3RCdzRCLFFBQVF4NEIsR0FBUixDQURzQixHQUV0QmpCLE9BQU9rVyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLaWpCLGFBQUwsQ0FBbUJJLE9BQXJDLEVBQThDRSxRQUFReDRCLEdBQVIsQ0FBOUMsQ0FGSjtDQUdEO0NBQ0Y7Q0FDRjtDQUVEOzs7Ozs7Ozs7OztDQTdFRjtDQUFBO0NBQUEsNkJBdUZ1QjtDQUFBOztDQUFBLFVBQWR5NEIsT0FBYyx1RUFBSixFQUFJO0NBQ25CLFdBQUt2MEIsS0FBTCxDQUFXVSxTQUFYLENBQXFCLFlBQU07Q0FBQSxtQ0FDRSxNQUFLVixLQUFMLENBQVdPLFFBQVgsRUFERjtDQUFBO0NBQUEsWUFDbEJILElBRGtCO0NBQUEsWUFDWk8sVUFEWTs7Q0FFekIsWUFBTUMsV0FBVzJ6QixRQUFRNXpCLFVBQVIsQ0FBakI7Q0FFQSxZQUFJQyxRQUFKLEVBQWNBLFNBQVNSLEtBQUtPLFVBQUwsQ0FBVDtDQUNmLE9BTEQ7Q0FNRDtDQUVEOzs7Ozs7Ozs7Q0FoR0Y7Q0FBQTtDQUFBLHVCQXdHSzZ6QixVQXhHTCxFQXdHaUI7Q0FDYixXQUFLTixVQUFMLEdBQWtCLEtBQUtELGFBQXZCO0NBQ0EsV0FBS0EsYUFBTCxHQUFxQk8sVUFBckI7Q0FFQSxVQUFNTCxTQUFTLEtBQUtILGFBQUwsQ0FBbUJRLFVBQW5CLElBQ1gsS0FBS1IsYUFBTCxDQUFtQlEsVUFBbkIsQ0FEVyxHQUVYLEtBQUtSLGFBQUwsQ0FBbUJJLE9BRnZCO0NBSUEsV0FBS3R6QixHQUFMLENBQVNxekIsTUFBVDtDQUNEO0NBRUQ7Ozs7Ozs7Ozs7O0NBbkhGO0NBQUE7Q0FBQSx3QkE2SE0vekIsSUE3SE4sRUE2SFk7Q0FDUixXQUFLLElBQU10RSxHQUFYLElBQWtCc0UsSUFBbEI7Q0FDRSxZQUFJdEUsR0FBSixFQUFTLEtBQUtrRSxLQUFMLENBQVdLLFFBQVgsQ0FBb0I7Q0FBQ0MsZ0JBQU0sS0FBUDtDQUFjeEUsa0JBQWQ7Q0FBbUJzRSxnQkFBTUEsS0FBS3RFLEdBQUw7Q0FBekIsU0FBcEI7Q0FEWDtDQUVEO0NBRUQ7Ozs7Ozs7OztDQWxJRjtDQUFBO0NBQUEsd0JBMElNQSxHQTFJTixFQTBJVztDQUNQLGFBQU8sS0FBS2tFLEtBQUwsQ0FBV08sUUFBWCxHQUFzQixDQUF0QixFQUF5QnpFLEdBQXpCLENBQVA7Q0FDRDtDQUVEOzs7Ozs7Ozs7Q0E5SUY7Q0FBQTtDQUFBLHlCQXNKT3E0QixNQXRKUCxFQXNKZU0sT0F0SmYsRUFzSndCQyxRQXRKeEIsRUFzSmtDO0NBQzlCLGFBQU8sS0FBS1IsVUFBTCxLQUFvQkMsTUFBcEIsR0FBNkJNLE9BQTdCLEdBQXVDQyxRQUE5QztDQUNEO0NBRUQ7Ozs7Ozs7OztDQTFKRjtDQUFBO0NBQUEsNEJBa0tVUCxNQWxLVixFQWtLa0JNLE9BbEtsQixFQWtLMkJDLFFBbEszQixFQWtLcUM7Q0FDakMsYUFBTyxLQUFLVCxhQUFMLEtBQXVCRSxNQUF2QixHQUFnQ00sT0FBaEMsR0FBMENDLFFBQWpEO0NBQ0Q7Q0FwS0g7O0NBQUE7Q0FBQTs7Q0NiQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztBQUVBLEtBQWFDLGtCQUFiO0NBQUE7Q0FBQTtDQUNFLDhCQUFZajZCLE1BQVosRUFBb0JzYSxVQUFwQixFQUFnQzRmLFlBQWhDLEVBQThDO0NBQUE7O0NBQUE7O0NBQzVDO0NBRUEsVUFBS2w2QixNQUFMLEdBQWNBLE1BQWQ7Q0FFQSxVQUFLc2EsVUFBTCxHQUFtQkEsZUFBZWhhLFNBQWhCLEdBQTZCMUcsUUFBN0IsR0FBd0MwZ0IsVUFBMUQ7Q0FDQSxVQUFLNGYsWUFBTCxHQUFvQkEsWUFBcEIsQ0FONEM7O0NBUzVDLFVBQUtodUIsT0FBTCxHQUFlLElBQWYsQ0FUNEM7O0NBWTVDLFVBQUtsRSxNQUFMLEdBQWMsSUFBSXFNLE9BQUosRUFBZCxDQVo0Qzs7Q0FlNUMsVUFBSzhsQixXQUFMLEdBQW1CLENBQW5CO0NBQ0EsVUFBS0MsV0FBTCxHQUFtQkMsUUFBbkIsQ0FoQjRDOztDQW1CNUMsVUFBS0MsT0FBTCxHQUFlLENBQWY7Q0FDQSxVQUFLQyxPQUFMLEdBQWVGLFFBQWYsQ0FwQjRDO0NBdUI1Qzs7Q0FDQSxVQUFLRyxhQUFMLEdBQXFCLENBQXJCLENBeEI0Qzs7Q0F5QjVDLFVBQUtDLGFBQUwsR0FBcUJyc0IsS0FBS0MsRUFBMUIsQ0F6QjRDO0NBMkI1QztDQUNBOztDQUNBLFVBQUtxc0IsZUFBTCxHQUF1QixDQUFDTCxRQUF4QixDQTdCNEM7O0NBOEI1QyxVQUFLTSxlQUFMLEdBQXVCTixRQUF2QixDQTlCNEM7Q0FnQzVDO0NBQ0E7O0NBQ0EsVUFBS08sYUFBTCxHQUFxQixLQUFyQjtDQUNBLFVBQUtDLGFBQUwsR0FBcUIsSUFBckIsQ0FuQzRDO0NBc0M1Qzs7Q0FDQSxVQUFLQyxVQUFMLEdBQWtCLElBQWxCO0NBQ0EsVUFBS0MsU0FBTCxHQUFpQixHQUFqQixDQXhDNEM7O0NBMkM1QyxVQUFLQyxZQUFMLEdBQW9CLElBQXBCO0NBQ0EsVUFBS0MsV0FBTCxHQUFtQixHQUFuQixDQTVDNEM7O0NBK0M1QyxVQUFLQyxTQUFMLEdBQWlCLElBQWpCO0NBQ0EsVUFBS0MsV0FBTCxHQUFtQixHQUFuQixDQWhENEM7Q0FrRDVDO0NBQ0E7O0NBQ0EsVUFBS0MsVUFBTCxHQUFrQixLQUFsQjtDQUNBLFVBQUtDLGVBQUwsR0FBdUIsR0FBdkIsQ0FyRDRDO0NBdUQ1Qzs7Q0FDQSxVQUFLQyxVQUFMLEdBQWtCLElBQWxCLENBeEQ0Qzs7Q0EyRDVDLFVBQUtqUyxJQUFMLEdBQVk7Q0FBQ2tTLFlBQU0sRUFBUDtDQUFXQyxVQUFJLEVBQWY7Q0FBbUJDLGFBQU8sRUFBMUI7Q0FBOEJDLGNBQVE7Q0FBdEMsS0FBWixDQTNENEM7O0NBOEQ1QyxVQUFLQyxZQUFMLEdBQW9CO0NBQUNDLGFBQU9DLE1BQU1OLElBQWQ7Q0FBb0JPLFlBQU1ELE1BQU1FLE1BQWhDO0NBQXdDQyxXQUFLSCxNQUFNSjtDQUFuRCxLQUFwQixDQTlENEM7O0NBaUU1QyxVQUFLUSxPQUFMLEdBQWUsTUFBS2owQixNQUFMLENBQVlaLEtBQVosRUFBZjtDQUNBLFVBQUs4MEIsU0FBTCxHQUFpQixNQUFLbDhCLE1BQUwsQ0FBWXNKLFFBQVosQ0FBcUJsQyxLQUFyQixFQUFqQjtDQUNBLFVBQUsrMEIsS0FBTCxHQUFhLE1BQUtuOEIsTUFBTCxDQUFZbzhCLElBQXpCLENBbkU0QztDQXNFNUM7Q0FDQTs7Q0FFQSxVQUFLQyxhQUFMLEdBQXFCLFlBQU07Q0FDekIsYUFBT0MsVUFBVUMsR0FBakI7Q0FDRCxLQUZEOztDQUlBLFVBQUtDLGlCQUFMLEdBQXlCLFlBQU07Q0FDN0IsYUFBT0YsVUFBVUcsS0FBakI7Q0FDRCxLQUZEOztDQUlBLFVBQUtDLEtBQUwsR0FBYSxZQUFNO0NBQ2pCLFlBQUsxMEIsTUFBTCxDQUFZZixJQUFaLENBQWlCLE1BQUtnMUIsT0FBdEI7O0NBQ0EsWUFBS2o4QixNQUFMLENBQVlzSixRQUFaLENBQXFCckMsSUFBckIsQ0FBMEIsTUFBS2kxQixTQUEvQjs7Q0FDQSxZQUFLbDhCLE1BQUwsQ0FBWW84QixJQUFaLEdBQW1CLE1BQUtELEtBQXhCOztDQUVBLFlBQUtuOEIsTUFBTCxDQUFZd2Isc0JBQVo7O0NBQ0EsWUFBS21oQixhQUFMLENBQW1CQyxXQUFuQjs7Q0FFQSxZQUFLbmlCLE1BQUw7O0NBRUFqVixjQUFRcTNCLE1BQU1DLElBQWQ7Q0FDRCxLQVhELENBakY0Qzs7O0NBK0Y1QyxVQUFLcmlCLE1BQUwsR0FBYyxZQUFNO0NBQ2xCLFVBQU1zaUIsU0FBUyxJQUFJMW9CLE9BQUosRUFBZixDQURrQjs7Q0FJbEIsVUFBTTJvQixPQUFPLElBQUlDLFVBQUosR0FBaUJDLGtCQUFqQixDQUFvQ2w5QixPQUFPbTlCLEVBQTNDLEVBQStDLElBQUk5b0IsT0FBSixDQUFZLENBQVosRUFBZSxDQUFmLEVBQWtCLENBQWxCLENBQS9DLENBQWI7Q0FDQSxVQUFNK29CLGNBQWNKLEtBQUs1MUIsS0FBTCxHQUFhdW5CLE9BQWIsRUFBcEI7Q0FFQSxVQUFNME8sZUFBZSxJQUFJaHBCLE9BQUosRUFBckI7Q0FDQSxVQUFNaXBCLGlCQUFpQixJQUFJTCxVQUFKLEVBQXZCO0NBRUEsYUFBUSxZQUFNO0NBQ1osWUFBTTN6QixXQUFXLE1BQUt0SixNQUFMLENBQVlzSixRQUE3QjtDQUVBeXpCLGVBQU85MUIsSUFBUCxDQUFZcUMsUUFBWixFQUFzQjJvQixHQUF0QixDQUEwQixNQUFLanFCLE1BQS9CLEVBSFk7O0NBTVorMEIsZUFBT1EsZUFBUCxDQUF1QlAsSUFBdkIsRUFOWTs7Q0FTWlYsa0JBQVVrQixjQUFWLENBQXlCVCxNQUF6QjtDQUVBLFlBQUksTUFBSzNCLFVBQUwsSUFBbUI1MUIsVUFBVXEzQixNQUFNQyxJQUF2QyxFQUNFVyxXQUFXQyxzQkFBWDtDQUVGcEIsa0JBQVVHLEtBQVYsSUFBbUJrQixlQUFlbEIsS0FBbEM7Q0FDQUgsa0JBQVVDLEdBQVYsSUFBaUJvQixlQUFlcEIsR0FBaEMsQ0FmWTs7Q0FrQlpELGtCQUFVRyxLQUFWLEdBQWtCcnVCLEtBQUtyTixHQUFMLENBQVMsTUFBSzI1QixlQUFkLEVBQStCdHNCLEtBQUt6VCxHQUFMLENBQVMsTUFBS2dnQyxlQUFkLEVBQStCMkIsVUFBVUcsS0FBekMsQ0FBL0IsQ0FBbEIsQ0FsQlk7O0NBcUJaSCxrQkFBVUMsR0FBVixHQUFnQm51QixLQUFLck4sR0FBTCxDQUFTLE1BQUt5NUIsYUFBZCxFQUE2QnBzQixLQUFLelQsR0FBTCxDQUFTLE1BQUs4L0IsYUFBZCxFQUE2QjZCLFVBQVVDLEdBQXZDLENBQTdCLENBQWhCO0NBRUFELGtCQUFVc0IsUUFBVjtDQUVBdEIsa0JBQVUxeEIsTUFBVixJQUFvQnBCLEtBQXBCLENBekJZOztDQTRCWjh5QixrQkFBVTF4QixNQUFWLEdBQW1Cd0QsS0FBS3JOLEdBQUwsQ0FBUyxNQUFLbzVCLFdBQWQsRUFBMkIvckIsS0FBS3pULEdBQUwsQ0FBUyxNQUFLeS9CLFdBQWQsRUFBMkJrQyxVQUFVMXhCLE1BQXJDLENBQTNCLENBQW5CLENBNUJZOztDQStCWixjQUFLNUMsTUFBTCxDQUFZUixHQUFaLENBQWdCcTJCLFNBQWhCOztDQUVBZCxlQUFPZSxnQkFBUCxDQUF3QnhCLFNBQXhCLEVBakNZOztDQW9DWlMsZUFBT1EsZUFBUCxDQUF1QkgsV0FBdkI7Q0FFQTl6QixpQkFBU3JDLElBQVQsQ0FBYyxNQUFLZSxNQUFuQixFQUEyQlIsR0FBM0IsQ0FBK0J1MUIsTUFBL0I7O0NBRUEsY0FBSy84QixNQUFMLENBQVkrOUIsTUFBWixDQUFtQixNQUFLLzFCLE1BQXhCOztDQUVBLFlBQUksTUFBSzR5QixhQUFMLEtBQXVCLElBQTNCLEVBQWlDO0NBQy9CK0MseUJBQWVsQixLQUFmLElBQXlCLElBQUksTUFBSzVCLGFBQWxDO0NBQ0E4Qyx5QkFBZXBCLEdBQWYsSUFBdUIsSUFBSSxNQUFLMUIsYUFBaEM7Q0FDRCxTQUhELE1BSUU4QyxlQUFldjNCLEdBQWYsQ0FBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekI7O0NBRUZvRCxnQkFBUSxDQUFSO0NBQ0FxMEIsa0JBQVV6M0IsR0FBVixDQUFjLENBQWQsRUFBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsRUFqRFk7Q0FvRFo7Q0FDQTs7Q0FFQSxZQUFJNDNCLGVBQ0NYLGFBQWFZLGlCQUFiLENBQStCLE1BQUtqK0IsTUFBTCxDQUFZc0osUUFBM0MsSUFBdUQ0MEIsR0FEeEQsSUFFQyxLQUFLLElBQUlaLGVBQWVhLEdBQWYsQ0FBbUIsTUFBS24rQixNQUFMLENBQVlrSyxVQUEvQixDQUFULElBQXVEZzBCLEdBRjVELEVBRWlFO0NBQy9ELGdCQUFLdkIsYUFBTCxDQUFtQkMsV0FBbkI7O0NBRUFTLHVCQUFhcDJCLElBQWIsQ0FBa0IsTUFBS2pILE1BQUwsQ0FBWXNKLFFBQTlCO0NBQ0FnMEIseUJBQWVyMkIsSUFBZixDQUFvQixNQUFLakgsTUFBTCxDQUFZa0ssVUFBaEM7Q0FDQTh6Qix3QkFBYyxLQUFkO0NBRUEsaUJBQU8sSUFBUDtDQUNEOztDQUVELGVBQU8sS0FBUDtDQUNELE9BcEVNLEVBQVA7Q0FxRUQsS0EvRUQ7O0NBaUZBLFVBQUtuNUIsT0FBTCxHQUFlLFlBQU07Q0FDbkIsWUFBS3lWLFVBQUwsQ0FBZ0I4akIsbUJBQWhCLENBQW9DLGFBQXBDLEVBQW1EQyxhQUFuRCxFQUFrRSxLQUFsRTs7Q0FDQSxZQUFLL2pCLFVBQUwsQ0FBZ0I4akIsbUJBQWhCLENBQW9DLFdBQXBDLEVBQWlERSxXQUFqRCxFQUE4RCxLQUE5RDs7Q0FDQSxZQUFLaGtCLFVBQUwsQ0FBZ0I4akIsbUJBQWhCLENBQW9DLE9BQXBDLEVBQTZDRyxZQUE3QyxFQUEyRCxLQUEzRDs7Q0FFQSxZQUFLamtCLFVBQUwsQ0FBZ0I4akIsbUJBQWhCLENBQW9DLFlBQXBDLEVBQWtESSxZQUFsRCxFQUFnRSxLQUFoRTs7Q0FDQSxZQUFLbGtCLFVBQUwsQ0FBZ0I4akIsbUJBQWhCLENBQW9DLFVBQXBDLEVBQWdESyxVQUFoRCxFQUE0RCxLQUE1RDs7Q0FDQSxZQUFLbmtCLFVBQUwsQ0FBZ0I4akIsbUJBQWhCLENBQW9DLFdBQXBDLEVBQWlETSxXQUFqRCxFQUE4RCxLQUE5RDs7Q0FFQTlrQyxlQUFTd2tDLG1CQUFULENBQTZCLFdBQTdCLEVBQTBDTyxXQUExQyxFQUF1RCxLQUF2RDtDQUNBL2tDLGVBQVN3a0MsbUJBQVQsQ0FBNkIsU0FBN0IsRUFBd0NRLFNBQXhDLEVBQW1ELEtBQW5EO0NBRUFwekIsYUFBTzR5QixtQkFBUCxDQUEyQixTQUEzQixFQUFzQ1MsU0FBdEMsRUFBaUQsS0FBakQsRUFabUI7Q0FlcEIsS0FmRCxDQWhMNEM7Q0FrTTVDO0NBQ0E7OztDQUVBLFFBQU1qQyxjQUFjO0NBQUNoM0IsWUFBTTtDQUFQLEtBQXBCO0NBQ0EsUUFBTWs1QixhQUFhO0NBQUNsNUIsWUFBTTtDQUFQLEtBQW5CO0NBQ0EsUUFBTW01QixXQUFXO0NBQUNuNUIsWUFBTTtDQUFQLEtBQWpCO0NBRUEsUUFBTWkzQixRQUFRO0NBQUNDLFlBQU0sQ0FBQyxDQUFSO0NBQVdrQyxjQUFRLENBQW5CO0NBQXNCQyxhQUFPLENBQTdCO0NBQWdDakQsV0FBSyxDQUFyQztDQUF3Q2tELG9CQUFjLENBQXREO0NBQXlEQyxtQkFBYSxDQUF0RTtDQUF5RUMsaUJBQVc7Q0FBcEYsS0FBZDtDQUVBLFFBQUk1NUIsUUFBUXEzQixNQUFNQyxJQUFsQjtDQUVBLFFBQU1vQixNQUFNLFFBQVosQ0E3TTRDOztDQWdONUMsUUFBTTVCLFlBQVksSUFBSStDLFNBQUosRUFBbEI7Q0FDQSxRQUFNMUIsaUJBQWlCLElBQUkwQixTQUFKLEVBQXZCO0NBRUEsUUFBSTcxQixRQUFRLENBQVo7Q0FDQSxRQUFNcTBCLFlBQVksSUFBSXhwQixPQUFKLEVBQWxCO0NBQ0EsUUFBSTJwQixjQUFjLEtBQWxCO0NBRUEsUUFBTXNCLGNBQWMsSUFBSXhtQixPQUFKLEVBQXBCO0NBQ0EsUUFBTXltQixZQUFZLElBQUl6bUIsT0FBSixFQUFsQjtDQUNBLFFBQU0wbUIsY0FBYyxJQUFJMW1CLE9BQUosRUFBcEI7Q0FFQSxRQUFNMm1CLFdBQVcsSUFBSTNtQixPQUFKLEVBQWpCO0NBQ0EsUUFBTTRtQixTQUFTLElBQUk1bUIsT0FBSixFQUFmO0NBQ0EsUUFBTTZtQixXQUFXLElBQUk3bUIsT0FBSixFQUFqQjtDQUVBLFFBQU04bUIsYUFBYSxJQUFJOW1CLE9BQUosRUFBbkI7Q0FDQSxRQUFNK21CLFdBQVcsSUFBSS9tQixPQUFKLEVBQWpCO0NBQ0EsUUFBTWduQixhQUFhLElBQUlobkIsT0FBSixFQUFuQjs7Q0FFQSxRQUFNNGtCLHVCQUF1QixTQUF2QkEsb0JBQXVCLEdBQU07Q0FDakMsYUFBTyxJQUFJdHZCLEtBQUtDLEVBQVQsR0FBYyxFQUFkLEdBQW1CLEVBQW5CLEdBQXdCLE1BQUtndEIsZUFBcEM7Q0FDRCxLQUZEOztDQUlBLFFBQU0wRSxlQUFlLFNBQWZBLFlBQWUsR0FBTTtDQUN6QixhQUFPM3hCLEtBQUs0bEIsR0FBTCxDQUFTLElBQVQsRUFBZSxNQUFLK0csU0FBcEIsQ0FBUDtDQUNELEtBRkQ7O0NBSUEsUUFBTTBDLGFBQWEsU0FBYkEsVUFBYSxRQUFTO0NBQzFCRSxxQkFBZWxCLEtBQWYsSUFBd0J2dUIsS0FBeEI7Q0FDRCxLQUZEOztDQUlBLFFBQU04eEIsV0FBVyxTQUFYQSxRQUFXLFFBQVM7Q0FDeEJyQyxxQkFBZXBCLEdBQWYsSUFBc0JydUIsS0FBdEI7Q0FDRCxLQUZEOztDQUlBLFFBQU0reEIsVUFBVyxZQUFNO0NBQ3JCLFVBQU03ckIsSUFBSSxJQUFJQyxPQUFKLEVBQVY7Q0FFQSxhQUFPLFVBQUN2RyxRQUFELEVBQVdveUIsWUFBWCxFQUE0QjtDQUNqQzlyQixVQUFFK3JCLG1CQUFGLENBQXNCRCxZQUF0QixFQUFvQyxDQUFwQyxFQURpQzs7Q0FFakM5ckIsVUFBRThLLGNBQUYsQ0FBaUIsQ0FBQ3BSLFFBQWxCO0NBQ0ErdkIsa0JBQVVyMkIsR0FBVixDQUFjNE0sQ0FBZDtDQUNELE9BSkQ7Q0FLRCxLQVJlLEVBQWhCOztDQVVBLFFBQU1nc0IsUUFBUyxZQUFNO0NBQ25CLFVBQU1oc0IsSUFBSSxJQUFJQyxPQUFKLEVBQVY7Q0FFQSxhQUFPLFVBQUN2RyxRQUFELEVBQVdveUIsWUFBWCxFQUE0QjtDQUNqQzlyQixVQUFFK3JCLG1CQUFGLENBQXNCRCxZQUF0QixFQUFvQyxDQUFwQyxFQURpQzs7Q0FFakM5ckIsVUFBRThLLGNBQUYsQ0FBaUJwUixRQUFqQjtDQUNBK3ZCLGtCQUFVcjJCLEdBQVYsQ0FBYzRNLENBQWQ7Q0FDRCxPQUpEO0NBS0QsS0FSYSxFQUFkLENBN1A0Qzs7O0NBd1E1QyxRQUFNaXNCLE1BQU8sWUFBTTtDQUNqQixVQUFNdEQsU0FBUyxJQUFJMW9CLE9BQUosRUFBZjtDQUVBLGFBQU8sVUFBQ2lzQixNQUFELEVBQVNDLE1BQVQsRUFBb0I7Q0FDekIsWUFBTWpvQixVQUFVLE1BQUtnQyxVQUFMLEtBQW9CMWdCLFFBQXBCLEdBQStCLE1BQUswZ0IsVUFBTCxDQUFnQmxDLElBQS9DLEdBQXNELE1BQUtrQyxVQUEzRTs7Q0FFQSxZQUFJLE1BQUt0YSxNQUFMLFlBQXVCK08saUJBQTNCLEVBQThDO0NBQzVDO0NBQ0EsY0FBTXpGLFdBQVcsTUFBS3RKLE1BQUwsQ0FBWXNKLFFBQTdCO0NBQ0F5ekIsaUJBQU85MUIsSUFBUCxDQUFZcUMsUUFBWixFQUFzQjJvQixHQUF0QixDQUEwQixNQUFLanFCLE1BQS9CO0NBQ0EsY0FBSXc0QixpQkFBaUJ6RCxPQUFPLzdCLE1BQVAsRUFBckIsQ0FKNEM7O0NBTzVDdy9CLDRCQUFrQnB5QixLQUFLcXlCLEdBQUwsQ0FBVSxNQUFLemdDLE1BQUwsQ0FBWWlMLEdBQVosR0FBa0IsQ0FBbkIsR0FBd0JtRCxLQUFLQyxFQUE3QixHQUFrQyxLQUEzQyxDQUFsQixDQVA0Qzs7Q0FVNUM0eEIsa0JBQVEsSUFBSUssTUFBSixHQUFhRSxjQUFiLEdBQThCbG9CLFFBQVFvb0IsWUFBOUMsRUFBNEQsTUFBSzFnQyxNQUFMLENBQVkyZ0MsTUFBeEU7Q0FDQVAsZ0JBQU0sSUFBSUcsTUFBSixHQUFhQyxjQUFiLEdBQThCbG9CLFFBQVFvb0IsWUFBNUMsRUFBMEQsTUFBSzFnQyxNQUFMLENBQVkyZ0MsTUFBdEU7Q0FDRCxTQVpELE1BWU8sSUFBSSxNQUFLM2dDLE1BQUwsWUFBdUIyTyxrQkFBM0IsRUFBK0M7Q0FDcEQ7Q0FDQXN4QixrQkFBUUssVUFBVSxNQUFLdGdDLE1BQUwsQ0FBWW1MLEtBQVosR0FBb0IsTUFBS25MLE1BQUwsQ0FBWWtMLElBQTFDLElBQWtELE1BQUtsTCxNQUFMLENBQVlvOEIsSUFBOUQsR0FBcUU5akIsUUFBUXNvQixXQUFyRixFQUFrRyxNQUFLNWdDLE1BQUwsQ0FBWTJnQyxNQUE5RztDQUNBUCxnQkFBTUcsVUFBVSxNQUFLdmdDLE1BQUwsQ0FBWW9MLEdBQVosR0FBa0IsTUFBS3BMLE1BQUwsQ0FBWXFMLE1BQXhDLElBQWtELE1BQUtyTCxNQUFMLENBQVlvOEIsSUFBOUQsR0FBcUU5akIsUUFBUW9vQixZQUFuRixFQUFpRyxNQUFLMWdDLE1BQUwsQ0FBWTJnQyxNQUE3RztDQUNELFNBSk0sTUFJQTtDQUNMO0NBQ0E1OUIsa0JBQVFvRCxJQUFSLENBQWEsb0ZBQWI7Q0FDQSxnQkFBSyswQixTQUFMLEdBQWlCLEtBQWpCO0NBQ0Q7Q0FDRixPQXhCRDtDQXlCRCxLQTVCVyxFQUFaOztDQThCQSxRQUFNMkYsVUFBVSxTQUFWQSxPQUFVLGFBQWM7Q0FDNUIsVUFBSSxNQUFLN2dDLE1BQUwsWUFBdUIrTyxpQkFBM0IsRUFDRXZGLFNBQVNzM0IsVUFBVCxDQURGLEtBR0ssSUFBSSxNQUFLOWdDLE1BQUwsWUFBdUIyTyxrQkFBM0IsRUFBK0M7Q0FDbEQsY0FBSzNPLE1BQUwsQ0FBWW84QixJQUFaLEdBQW1CaHVCLEtBQUtyTixHQUFMLENBQVMsTUFBS3U1QixPQUFkLEVBQXVCbHNCLEtBQUt6VCxHQUFMLENBQVMsTUFBSzQvQixPQUFkLEVBQXVCLE1BQUt2NkIsTUFBTCxDQUFZbzhCLElBQVosR0FBbUIwRSxVQUExQyxDQUF2QixDQUFuQjs7Q0FDQSxjQUFLOWdDLE1BQUwsQ0FBWXdiLHNCQUFaOztDQUNBd2lCLHNCQUFjLElBQWQ7Q0FDRCxPQUpJLE1BSUU7Q0FDTGo3QixnQkFBUW9ELElBQVIsQ0FBYSwyRkFBYjtDQUNBLGNBQUsyMEIsVUFBTCxHQUFrQixLQUFsQjtDQUNEO0NBQ0YsS0FaRDs7Q0FjQSxRQUFNaUcsV0FBVyxTQUFYQSxRQUFXLGFBQWM7Q0FDN0IsVUFBSSxNQUFLL2dDLE1BQUwsWUFBdUIrTyxpQkFBM0IsRUFDRXZGLFNBQVNzM0IsVUFBVCxDQURGLEtBR0ssSUFBSSxNQUFLOWdDLE1BQUwsWUFBdUIyTyxrQkFBM0IsRUFBK0M7Q0FDbEQsY0FBSzNPLE1BQUwsQ0FBWW84QixJQUFaLEdBQW1CaHVCLEtBQUtyTixHQUFMLENBQVMsTUFBS3U1QixPQUFkLEVBQXVCbHNCLEtBQUt6VCxHQUFMLENBQVMsTUFBSzQvQixPQUFkLEVBQXVCLE1BQUt2NkIsTUFBTCxDQUFZbzhCLElBQVosR0FBbUIwRSxVQUExQyxDQUF2QixDQUFuQjs7Q0FDQSxjQUFLOWdDLE1BQUwsQ0FBWXdiLHNCQUFaOztDQUNBd2lCLHNCQUFjLElBQWQ7Q0FDRCxPQUpJLE1BSUU7Q0FDTGo3QixnQkFBUW9ELElBQVIsQ0FBYSwyRkFBYjtDQUNBLGNBQUsyMEIsVUFBTCxHQUFrQixLQUFsQjtDQUNEO0NBQ0YsS0FaRCxDQXBUNEM7Q0FtVTVDO0NBQ0E7OztDQUVBLFFBQU1rRyx3QkFBd0IsU0FBeEJBLHFCQUF3QixRQUFTO0NBQ3JDO0NBRUExQixrQkFBWWw1QixHQUFaLENBQWdCOHZCLE1BQU1VLE9BQXRCLEVBQStCVixNQUFNVyxPQUFyQztDQUNELEtBSkQ7O0NBTUEsUUFBTW9LLHVCQUF1QixTQUF2QkEsb0JBQXVCLFFBQVM7Q0FDcEM7Q0FFQXJCLGlCQUFXeDVCLEdBQVgsQ0FBZTh2QixNQUFNVSxPQUFyQixFQUE4QlYsTUFBTVcsT0FBcEM7Q0FDRCxLQUpEOztDQU1BLFFBQU1xSyxxQkFBcUIsU0FBckJBLGtCQUFxQixRQUFTO0NBQ2xDO0NBRUF6QixlQUFTcjVCLEdBQVQsQ0FBYTh2QixNQUFNVSxPQUFuQixFQUE0QlYsTUFBTVcsT0FBbEM7Q0FDRCxLQUpEOztDQU1BLFFBQU1zSyx3QkFBd0IsU0FBeEJBLHFCQUF3QixRQUFTO0NBQ3JDO0NBRUE1QixnQkFBVW41QixHQUFWLENBQWM4dkIsTUFBTVUsT0FBcEIsRUFBNkJWLE1BQU1XLE9BQW5DO0NBQ0EySSxrQkFBWTRCLFVBQVosQ0FBdUI3QixTQUF2QixFQUFrQ0QsV0FBbEM7Q0FFQSxVQUFNaG5CLFVBQVUsTUFBS2dDLFVBQUwsS0FBb0IxZ0IsUUFBcEIsR0FBK0IsTUFBSzBnQixVQUFMLENBQWdCbEMsSUFBL0MsR0FBc0QsTUFBS2tDLFVBQTNFLENBTnFDOztDQVNyQ21qQixpQkFBVyxJQUFJcnZCLEtBQUtDLEVBQVQsR0FBY214QixZQUFZOTFCLENBQTFCLEdBQThCNE8sUUFBUXNvQixXQUF0QyxHQUFvRCxNQUFLM0YsV0FBcEUsRUFUcUM7O0NBWXJDK0UsZUFBUyxJQUFJNXhCLEtBQUtDLEVBQVQsR0FBY214QixZQUFZNzFCLENBQTFCLEdBQThCMk8sUUFBUW9vQixZQUF0QyxHQUFxRCxNQUFLekYsV0FBbkU7Q0FFQXFFLGtCQUFZcjRCLElBQVosQ0FBaUJzNEIsU0FBakI7O0NBRUEsWUFBSzlrQixNQUFMO0NBQ0QsS0FqQkQ7O0NBbUJBLFFBQU00bUIsdUJBQXVCLFNBQXZCQSxvQkFBdUIsUUFBUztDQUNwQztDQUVBeEIsZUFBU3o1QixHQUFULENBQWE4dkIsTUFBTVUsT0FBbkIsRUFBNEJWLE1BQU1XLE9BQWxDO0NBRUFpSixpQkFBV3NCLFVBQVgsQ0FBc0J2QixRQUF0QixFQUFnQ0QsVUFBaEM7Q0FFQSxVQUFJRSxXQUFXbjJCLENBQVgsR0FBZSxDQUFuQixFQUNFazNCLFFBQVFkLGNBQVIsRUFERixLQUdLLElBQUlELFdBQVduMkIsQ0FBWCxHQUFlLENBQW5CLEVBQ0hvM0IsU0FBU2hCLGNBQVQ7Q0FFRkgsaUJBQVczNEIsSUFBWCxDQUFnQjQ0QixRQUFoQjs7Q0FFQSxZQUFLcGxCLE1BQUw7Q0FDRCxLQWhCRDs7Q0FrQkEsUUFBTTZtQixxQkFBcUIsU0FBckJBLGtCQUFxQixRQUFTO0NBQ2xDO0NBRUE1QixhQUFPdDVCLEdBQVAsQ0FBVzh2QixNQUFNVSxPQUFqQixFQUEwQlYsTUFBTVcsT0FBaEM7Q0FFQThJLGVBQVN5QixVQUFULENBQW9CMUIsTUFBcEIsRUFBNEJELFFBQTVCO0NBRUFZLFVBQUlWLFNBQVNqMkIsQ0FBYixFQUFnQmkyQixTQUFTaDJCLENBQXpCO0NBRUE4MUIsZUFBU3g0QixJQUFULENBQWN5NEIsTUFBZDs7Q0FFQSxZQUFLamxCLE1BQUw7Q0FDRCxLQVpEOztDQWtCQSxRQUFNOG1CLG1CQUFtQixTQUFuQkEsZ0JBQW1CLFFBQVM7Q0FDaEM7Q0FFQSxVQUFJckwsTUFBTXFLLE1BQU4sR0FBZSxDQUFuQixFQUNFUSxTQUFTaEIsY0FBVCxFQURGLEtBR0ssSUFBSTdKLE1BQU1xSyxNQUFOLEdBQWUsQ0FBbkIsRUFDSE0sUUFBUWQsY0FBUjs7Q0FFRixZQUFLdGxCLE1BQUw7Q0FDRCxLQVZEOztDQVlBLFFBQU0rbUIsZ0JBQWdCLFNBQWhCQSxhQUFnQixRQUFTO0NBQzdCO0NBRUEsY0FBUXRMLE1BQU11TCxPQUFkO0NBQ0UsYUFBSyxNQUFLcFksSUFBTCxDQUFVbVMsRUFBZjtDQUNFNkUsY0FBSSxDQUFKLEVBQU8sTUFBS2xGLFdBQVo7O0NBQ0EsZ0JBQUsxZ0IsTUFBTDs7Q0FDQTs7Q0FFRixhQUFLLE1BQUs0TyxJQUFMLENBQVVxUyxNQUFmO0NBQ0UyRSxjQUFJLENBQUosRUFBTyxDQUFDLE1BQUtsRixXQUFiOztDQUNBLGdCQUFLMWdCLE1BQUw7O0NBQ0E7O0NBRUYsYUFBSyxNQUFLNE8sSUFBTCxDQUFVa1MsSUFBZjtDQUNFOEUsY0FBSSxNQUFLbEYsV0FBVCxFQUFzQixDQUF0Qjs7Q0FDQSxnQkFBSzFnQixNQUFMOztDQUNBOztDQUVGLGFBQUssTUFBSzRPLElBQUwsQ0FBVW9TLEtBQWY7Q0FDRTRFLGNBQUksQ0FBQyxNQUFLbEYsV0FBVixFQUF1QixDQUF2Qjs7Q0FDQSxnQkFBSzFnQixNQUFMOztDQUNBO0NBbkJKO0NBc0JELEtBekJEOztDQTJCQSxRQUFNaW5CLHlCQUF5QixTQUF6QkEsc0JBQXlCLFFBQVM7Q0FDdEM7Q0FFQXBDLGtCQUFZbDVCLEdBQVosQ0FBZ0I4dkIsTUFBTXlMLE9BQU4sQ0FBYyxDQUFkLEVBQWlCQyxLQUFqQyxFQUF3QzFMLE1BQU15TCxPQUFOLENBQWMsQ0FBZCxFQUFpQkUsS0FBekQ7Q0FDRCxLQUpEOztDQU1BLFFBQU1DLHdCQUF3QixTQUF4QkEscUJBQXdCLFFBQVM7Q0FDckM7Q0FFQSxVQUFNeGMsS0FBSzRRLE1BQU15TCxPQUFOLENBQWMsQ0FBZCxFQUFpQkMsS0FBakIsR0FBeUIxTCxNQUFNeUwsT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQXJEO0NBQ0EsVUFBTXJjLEtBQUsyUSxNQUFNeUwsT0FBTixDQUFjLENBQWQsRUFBaUJFLEtBQWpCLEdBQXlCM0wsTUFBTXlMLE9BQU4sQ0FBYyxDQUFkLEVBQWlCRSxLQUFyRDtDQUVBLFVBQU0vekIsV0FBV00sS0FBSzJ6QixJQUFMLENBQVV6YyxLQUFLQSxFQUFMLEdBQVVDLEtBQUtBLEVBQXpCLENBQWpCO0NBRUFxYSxpQkFBV3g1QixHQUFYLENBQWUsQ0FBZixFQUFrQjBILFFBQWxCO0NBQ0QsS0FURDs7Q0FXQSxRQUFNazBCLHNCQUFzQixTQUF0QkEsbUJBQXNCLFFBQVM7Q0FDbkM7Q0FFQXZDLGVBQVNyNUIsR0FBVCxDQUFhOHZCLE1BQU15TCxPQUFOLENBQWMsQ0FBZCxFQUFpQkMsS0FBOUIsRUFBcUMxTCxNQUFNeUwsT0FBTixDQUFjLENBQWQsRUFBaUJFLEtBQXREO0NBQ0QsS0FKRDs7Q0FNQSxRQUFNSSx3QkFBd0IsU0FBeEJBLHFCQUF3QixRQUFTO0NBQ3JDO0NBRUExQyxnQkFBVW41QixHQUFWLENBQWM4dkIsTUFBTXlMLE9BQU4sQ0FBYyxDQUFkLEVBQWlCQyxLQUEvQixFQUFzQzFMLE1BQU15TCxPQUFOLENBQWMsQ0FBZCxFQUFpQkUsS0FBdkQ7Q0FDQXJDLGtCQUFZNEIsVUFBWixDQUF1QjdCLFNBQXZCLEVBQWtDRCxXQUFsQztDQUVBLFVBQU1obkIsVUFBVSxNQUFLZ0MsVUFBTCxLQUFvQjFnQixRQUFwQixHQUErQixNQUFLMGdCLFVBQUwsQ0FBZ0JsQyxJQUEvQyxHQUFzRCxNQUFLa0MsVUFBM0UsQ0FOcUM7O0NBU3JDbWpCLGlCQUFXLElBQUlydkIsS0FBS0MsRUFBVCxHQUFjbXhCLFlBQVk5MUIsQ0FBMUIsR0FBOEI0TyxRQUFRc29CLFdBQXRDLEdBQW9ELE1BQUszRixXQUFwRSxFQVRxQzs7Q0FZckMrRSxlQUFTLElBQUk1eEIsS0FBS0MsRUFBVCxHQUFjbXhCLFlBQVk3MUIsQ0FBMUIsR0FBOEIyTyxRQUFRb29CLFlBQXRDLEdBQXFELE1BQUt6RixXQUFuRTtDQUVBcUUsa0JBQVlyNEIsSUFBWixDQUFpQnM0QixTQUFqQjs7Q0FFQSxZQUFLOWtCLE1BQUw7Q0FDRCxLQWpCRDs7Q0FtQkEsUUFBTXluQix1QkFBdUIsU0FBdkJBLG9CQUF1QixRQUFTO0NBQ3BDO0NBRUEsVUFBTTVjLEtBQUs0USxNQUFNeUwsT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQWpCLEdBQXlCMUwsTUFBTXlMLE9BQU4sQ0FBYyxDQUFkLEVBQWlCQyxLQUFyRDtDQUNBLFVBQU1yYyxLQUFLMlEsTUFBTXlMLE9BQU4sQ0FBYyxDQUFkLEVBQWlCRSxLQUFqQixHQUF5QjNMLE1BQU15TCxPQUFOLENBQWMsQ0FBZCxFQUFpQkUsS0FBckQ7Q0FFQSxVQUFNL3pCLFdBQVdNLEtBQUsyekIsSUFBTCxDQUFVemMsS0FBS0EsRUFBTCxHQUFVQyxLQUFLQSxFQUF6QixDQUFqQjtDQUVBc2EsZUFBU3o1QixHQUFULENBQWEsQ0FBYixFQUFnQjBILFFBQWhCO0NBRUFneUIsaUJBQVdzQixVQUFYLENBQXNCdkIsUUFBdEIsRUFBZ0NELFVBQWhDO0NBRUEsVUFBSUUsV0FBV24yQixDQUFYLEdBQWUsQ0FBbkIsRUFDRW8zQixTQUFTaEIsY0FBVCxFQURGLEtBR0ssSUFBSUQsV0FBV24yQixDQUFYLEdBQWUsQ0FBbkIsRUFDSGszQixRQUFRZCxjQUFSO0NBRUZILGlCQUFXMzRCLElBQVgsQ0FBZ0I0NEIsUUFBaEI7O0NBRUEsWUFBS3BsQixNQUFMO0NBQ0QsS0FyQkQ7O0NBdUJBLFFBQU0wbkIscUJBQXFCLFNBQXJCQSxrQkFBcUIsUUFBUztDQUNsQztDQUVBekMsYUFBT3Q1QixHQUFQLENBQVc4dkIsTUFBTXlMLE9BQU4sQ0FBYyxDQUFkLEVBQWlCQyxLQUE1QixFQUFtQzFMLE1BQU15TCxPQUFOLENBQWMsQ0FBZCxFQUFpQkUsS0FBcEQ7Q0FFQWxDLGVBQVN5QixVQUFULENBQW9CMUIsTUFBcEIsRUFBNEJELFFBQTVCO0NBRUFZLFVBQUlWLFNBQVNqMkIsQ0FBYixFQUFnQmkyQixTQUFTaDJCLENBQXpCO0NBRUE4MUIsZUFBU3g0QixJQUFULENBQWN5NEIsTUFBZDs7Q0FFQSxZQUFLamxCLE1BQUw7Q0FDRCxLQVpEO0NBbUJBO0NBQ0E7OztDQUVBLFFBQU02akIsY0FBYyxTQUFkQSxXQUFjLFFBQVM7Q0FDM0IsVUFBSSxNQUFLcHlCLE9BQUwsS0FBaUIsS0FBckIsRUFBNEI7Q0FFNUJncUIsWUFBTWtNLGNBQU47O0NBRUEsVUFBSWxNLE1BQU1tTSxNQUFOLEtBQWlCLE1BQUsxRyxZQUFMLENBQWtCQyxLQUF2QyxFQUE4QztDQUM1QyxZQUFJLE1BQUtaLFlBQUwsS0FBc0IsS0FBMUIsRUFBaUM7Q0FFakNnRyw4QkFBc0I5SyxLQUF0QjtDQUVBMXdCLGdCQUFRcTNCLE1BQU1tQyxNQUFkO0NBQ0QsT0FORCxNQU1PLElBQUk5SSxNQUFNbU0sTUFBTixLQUFpQixNQUFLMUcsWUFBTCxDQUFrQkcsSUFBdkMsRUFBNkM7Q0FDbEQsWUFBSSxNQUFLaEIsVUFBTCxLQUFvQixLQUF4QixFQUErQjtDQUUvQm1HLDZCQUFxQi9LLEtBQXJCO0NBRUExd0IsZ0JBQVFxM0IsTUFBTW9DLEtBQWQ7Q0FDRCxPQU5NLE1BTUEsSUFBSS9JLE1BQU1tTSxNQUFOLEtBQWlCLE1BQUsxRyxZQUFMLENBQWtCSyxHQUF2QyxFQUE0QztDQUNqRCxZQUFJLE1BQUtkLFNBQUwsS0FBbUIsS0FBdkIsRUFBOEI7Q0FFOUJnRywyQkFBbUJoTCxLQUFuQjtDQUVBMXdCLGdCQUFRcTNCLE1BQU1iLEdBQWQ7Q0FDRDs7Q0FFRCxVQUFJeDJCLFVBQVVxM0IsTUFBTUMsSUFBcEIsRUFBMEI7Q0FDeEIsY0FBSzVDLFlBQUwsQ0FBa0I5QyxFQUFsQixDQUFxQixXQUFyQixFQUFrQ3VILFdBQWxDLEVBQStDLEtBQS9DOztDQUNBLGNBQUt6RSxZQUFMLENBQWtCOUMsRUFBbEIsQ0FBcUIsU0FBckIsRUFBZ0N3SCxTQUFoQyxFQUEyQyxLQUEzQzs7Q0FFQSxjQUFLakMsYUFBTCxDQUFtQm1DLFVBQW5CO0NBQ0Q7Q0FDRixLQS9CRDs7Q0FpQ0EsUUFBTUgsY0FBYyxTQUFkQSxXQUFjLFFBQVM7Q0FDM0IsVUFBSSxNQUFLenlCLE9BQUwsS0FBaUIsS0FBckIsRUFBNEI7Q0FFNUJncUIsWUFBTWtNLGNBQU47O0NBRUEsVUFBSTU4QixVQUFVcTNCLE1BQU1tQyxNQUFwQixFQUE0QjtDQUMxQixZQUFJLE1BQUtoRSxZQUFMLEtBQXNCLEtBQTFCLEVBQWlDO0NBRWpDbUcsOEJBQXNCakwsS0FBdEI7Q0FDRCxPQUpELE1BSU8sSUFBSTF3QixVQUFVcTNCLE1BQU1vQyxLQUFwQixFQUEyQjtDQUNoQyxZQUFJLE1BQUtuRSxVQUFMLEtBQW9CLEtBQXhCLEVBQStCO0NBRS9CdUcsNkJBQXFCbkwsS0FBckI7Q0FDRCxPQUpNLE1BSUEsSUFBSTF3QixVQUFVcTNCLE1BQU1iLEdBQXBCLEVBQXlCO0NBQzlCLFlBQUksTUFBS2QsU0FBTCxLQUFtQixLQUF2QixFQUE4QjtDQUU5Qm9HLDJCQUFtQnBMLEtBQW5CO0NBQ0Q7Q0FDRixLQWxCRDs7Q0FvQkEsUUFBTTBJLFlBQVksU0FBWkEsU0FBWSxRQUFTO0NBQ3pCLFVBQUksTUFBSzF5QixPQUFMLEtBQWlCLEtBQXJCLEVBQTRCO0FBRTVCbzJCLENBRUExb0MsZUFBU3drQyxtQkFBVCxDQUE2QixXQUE3QixFQUEwQ08sV0FBMUMsRUFBdUQsS0FBdkQ7Q0FDQS9rQyxlQUFTd2tDLG1CQUFULENBQTZCLFNBQTdCLEVBQXdDUSxTQUF4QyxFQUFtRCxLQUFuRDs7Q0FFQSxZQUFLakMsYUFBTCxDQUFtQm9DLFFBQW5COztDQUVBdjVCLGNBQVFxM0IsTUFBTUMsSUFBZDtDQUNELEtBWEQ7O0NBYUEsUUFBTXlCLGVBQWUsU0FBZkEsWUFBZSxRQUFTO0NBQzVCLFVBQUksTUFBS3J5QixPQUFMLEtBQWlCLEtBQWpCLElBQTBCLE1BQUs0dUIsVUFBTCxLQUFvQixLQUE5QyxJQUF3RHQxQixVQUFVcTNCLE1BQU1DLElBQWhCLElBQXdCdDNCLFVBQVVxM0IsTUFBTW1DLE1BQXBHLEVBQTZHO0NBRTdHOUksWUFBTWtNLGNBQU47Q0FDQWxNLFlBQU1xTSxlQUFOO0NBRUFoQix1QkFBaUJyTCxLQUFqQjs7Q0FFQSxZQUFLeUcsYUFBTCxDQUFtQm1DLFVBQW5CLEVBUjRCOzs7Q0FTNUIsWUFBS25DLGFBQUwsQ0FBbUJvQyxRQUFuQjtDQUNELEtBVkQ7O0NBWUEsUUFBTUYsWUFBWSxTQUFaQSxTQUFZLFFBQVM7Q0FDekIsVUFBSSxNQUFLM3lCLE9BQUwsS0FBaUIsS0FBakIsSUFBMEIsTUFBS292QixVQUFMLEtBQW9CLEtBQTlDLElBQXVELE1BQUtKLFNBQUwsS0FBbUIsS0FBOUUsRUFBcUY7Q0FFckZzRyxvQkFBY3RMLEtBQWQ7Q0FDRCxLQUpEOztDQU1BLFFBQU1zSSxlQUFlLFNBQWZBLFlBQWUsUUFBUztDQUM1QixVQUFJLE1BQUt0eUIsT0FBTCxLQUFpQixLQUFyQixFQUE0Qjs7Q0FFNUIsY0FBUWdxQixNQUFNeUwsT0FBTixDQUFjM2dDLE1BQXRCO0NBQ0UsYUFBSyxDQUFMO0NBQVE7Q0FFTixjQUFJLE1BQUtnNkIsWUFBTCxLQUFzQixLQUExQixFQUFpQztDQUVqQzBHLGlDQUF1QnhMLEtBQXZCO0NBRUExd0Isa0JBQVFxM0IsTUFBTXFDLFlBQWQ7Q0FFQTs7Q0FFRixhQUFLLENBQUw7Q0FBUTtDQUVOLGNBQUksTUFBS3BFLFVBQUwsS0FBb0IsS0FBeEIsRUFBK0I7Q0FFL0JnSCxnQ0FBc0I1TCxLQUF0QjtDQUVBMXdCLGtCQUFRcTNCLE1BQU1zQyxXQUFkO0NBRUE7O0NBRUYsYUFBSyxDQUFMO0NBQVE7Q0FFTixjQUFJLE1BQUtqRSxTQUFMLEtBQW1CLEtBQXZCLEVBQThCO0NBRTlCOEcsOEJBQW9COUwsS0FBcEI7Q0FFQTF3QixrQkFBUXEzQixNQUFNdUMsU0FBZDtDQUVBOztDQUVGO0NBRUU1NUIsa0JBQVFxM0IsTUFBTUMsSUFBZDtDQWpDSjs7Q0FxQ0EsVUFBSXQzQixVQUFVcTNCLE1BQU1DLElBQXBCLEVBQ0UsTUFBS0gsYUFBTCxDQUFtQm1DLFVBQW5CO0NBQ0gsS0ExQ0Q7O0NBNENBLFFBQU1KLGNBQWMsU0FBZEEsV0FBYyxRQUFTO0NBQzNCLFVBQUksTUFBS3h5QixPQUFMLEtBQWlCLEtBQXJCLEVBQTRCO0NBRTVCZ3FCLFlBQU1rTSxjQUFOO0NBQ0FsTSxZQUFNcU0sZUFBTjs7Q0FFQSxjQUFRck0sTUFBTXlMLE9BQU4sQ0FBYzNnQyxNQUF0QjtDQUNFLGFBQUssQ0FBTDtDQUFRO0NBRU4sY0FBSSxNQUFLZzZCLFlBQUwsS0FBc0IsS0FBMUIsRUFBaUM7Q0FDakMsY0FBSXgxQixVQUFVcTNCLE1BQU1xQyxZQUFwQixFQUFrQyxPQUhwQzs7Q0FLRStDLGdDQUFzQi9MLEtBQXRCO0NBRUE7O0NBRUYsYUFBSyxDQUFMO0NBQVE7Q0FFTixjQUFJLE1BQUs0RSxVQUFMLEtBQW9CLEtBQXhCLEVBQStCO0NBQy9CLGNBQUl0MUIsVUFBVXEzQixNQUFNc0MsV0FBcEIsRUFBaUMsT0FIbkM7O0NBS0UrQywrQkFBcUJoTSxLQUFyQjtDQUVBOztDQUVGLGFBQUssQ0FBTDtDQUFRO0NBRU4sY0FBSSxNQUFLZ0YsU0FBTCxLQUFtQixLQUF2QixFQUE4QjtDQUM5QixjQUFJMTFCLFVBQVVxM0IsTUFBTXVDLFNBQXBCLEVBQStCLE9BSGpDOztDQUtFK0MsNkJBQW1Cak0sS0FBbkI7Q0FFQTs7Q0FFRjtDQUVFMXdCLGtCQUFRcTNCLE1BQU1DLElBQWQ7Q0E5Qko7Q0FpQ0QsS0F2Q0Q7O0NBeUNBLFFBQU0yQixhQUFhLFNBQWJBLFVBQWEsUUFBUztDQUMxQixVQUFJLE1BQUt2eUIsT0FBTCxLQUFpQixLQUFyQixFQUE0QjtBQUU1QnMyQjtDQUVBLFlBQUs3RixhQUFMLENBQW1Cb0MsUUFBbkI7O0NBRUF2NUIsY0FBUXEzQixNQUFNQyxJQUFkO0NBQ0QsS0FSRDs7Q0FVQSxRQUFNdUIsZ0JBQWdCLFNBQWhCQSxhQUFnQixRQUFTO0NBQzdCbkksWUFBTWtNLGNBQU47Q0FDRCxLQUZELENBaHNCNEM7OztDQXNzQjVDLFVBQUtsSSxZQUFMLENBQWtCOUMsRUFBbEIsQ0FBcUIsYUFBckIsRUFBb0NpSCxhQUFwQyxFQUFtRCxLQUFuRDs7Q0FFQSxVQUFLbkUsWUFBTCxDQUFrQjlDLEVBQWxCLENBQXFCLFdBQXJCLEVBQWtDa0gsV0FBbEMsRUFBK0MsS0FBL0M7O0NBQ0EsVUFBS3BFLFlBQUwsQ0FBa0I5QyxFQUFsQixDQUFxQixPQUFyQixFQUE4Qm1ILFlBQTlCLEVBQTRDLEtBQTVDOztDQUVBLFVBQUtyRSxZQUFMLENBQWtCOUMsRUFBbEIsQ0FBcUIsWUFBckIsRUFBbUNvSCxZQUFuQyxFQUFpRCxLQUFqRDs7Q0FDQSxVQUFLdEUsWUFBTCxDQUFrQjlDLEVBQWxCLENBQXFCLFVBQXJCLEVBQWlDcUgsVUFBakMsRUFBNkMsS0FBN0M7O0NBQ0EsVUFBS3ZFLFlBQUwsQ0FBa0I5QyxFQUFsQixDQUFxQixXQUFyQixFQUFrQ3NILFdBQWxDLEVBQStDLEtBQS9DOztDQUVBLFVBQUt4RSxZQUFMLENBQWtCOUMsRUFBbEIsQ0FBcUIsU0FBckIsRUFBZ0N5SCxTQUFoQyxFQUEyQyxLQUEzQyxFQS9zQjRDOzs7Q0FtdEI1QyxVQUFLcGtCLE1BQUw7O0NBbnRCNEM7Q0FvdEI3Qzs7Q0FydEJIO0NBQUE7Q0FBQSx3QkF1dEJlO0NBQ1gxWCxjQUFRb0QsSUFBUixDQUFhLG9EQUFiO0NBQ0EsYUFBTyxLQUFLNkIsTUFBWjtDQUNEO0NBMXRCSDtDQUFBO0NBQUEsd0JBNHRCZTtDQUNYakYsY0FBUW9ELElBQVIsQ0FBYSxzRUFBYjtDQUNBLGFBQU8sQ0FBQyxLQUFLMjBCLFVBQWI7Q0FDRCxLQS90Qkg7Q0FBQSxzQkFpdUJhcHlCLEtBanVCYixFQWl1Qm9CO0NBQ2hCM0YsY0FBUW9ELElBQVIsQ0FBYSxzRUFBYjtDQUNBLFdBQUsyMEIsVUFBTCxHQUFrQixDQUFDcHlCLEtBQW5CO0NBQ0Q7Q0FwdUJIO0NBQUE7Q0FBQSx3QkFzdUJpQjtDQUNiM0YsY0FBUW9ELElBQVIsQ0FBYSwwRUFBYjtDQUNBLGFBQU8sQ0FBQyxLQUFLNjBCLFlBQWI7Q0FDRCxLQXp1Qkg7Q0FBQSxzQkEydUJldHlCLEtBM3VCZixFQTJ1QnNCO0NBQ2xCM0YsY0FBUW9ELElBQVIsQ0FBYSwwRUFBYjtDQUNBLFdBQUs2MEIsWUFBTCxHQUFvQixDQUFDdHlCLEtBQXJCO0NBQ0Q7Q0E5dUJIO0NBQUE7Q0FBQSx3QkFndkJjO0NBQ1YzRixjQUFRb0QsSUFBUixDQUFhLG9FQUFiO0NBQ0EsYUFBTyxDQUFDLEtBQUsrMEIsU0FBYjtDQUNELEtBbnZCSDtDQUFBLHNCQXF2Qll4eUIsS0FydkJaLEVBcXZCbUI7Q0FDZjNGLGNBQVFvRCxJQUFSLENBQWEsb0VBQWI7Q0FDQSxXQUFLKzBCLFNBQUwsR0FBaUIsQ0FBQ3h5QixLQUFsQjtDQUNEO0NBeHZCSDtDQUFBO0NBQUEsd0JBMHZCZTtDQUNYM0YsY0FBUW9ELElBQVIsQ0FBYSxzRUFBYjtDQUNBLGFBQU8sQ0FBQyxLQUFLbTFCLFVBQWI7Q0FDRCxLQTd2Qkg7Q0FBQSxzQkErdkJhNXlCLEtBL3ZCYixFQSt2Qm9CO0NBQ2hCM0YsY0FBUW9ELElBQVIsQ0FBYSxzRUFBYjtDQUNBLFdBQUttMUIsVUFBTCxHQUFrQixDQUFDNXlCLEtBQW5CO0NBQ0Q7Q0Fsd0JIO0NBQUE7Q0FBQSx3QkFvd0JxQjtDQUNqQjNGLGNBQVFvRCxJQUFSLENBQWEsK0VBQWI7Q0FDQSxhQUFPLENBQUMsS0FBS3kwQixhQUFiO0NBQ0QsS0F2d0JIO0NBQUEsc0JBeXdCbUJseUIsS0F6d0JuQixFQXl3QjBCO0NBQ3RCM0YsY0FBUW9ELElBQVIsQ0FBYSwrRUFBYjtDQUNBLFdBQUt5MEIsYUFBTCxHQUFxQixDQUFDbHlCLEtBQXRCO0NBQ0Q7Q0E1d0JIO0NBQUE7Q0FBQSx3QkE4d0I2QjtDQUN6QjNGLGNBQVFvRCxJQUFSLENBQWEsb0ZBQWI7Q0FDQSxhQUFPLEtBQUswMEIsYUFBWjtDQUNELEtBanhCSDtDQUFBLHNCQW14QjJCbnlCLEtBbnhCM0IsRUFteEJrQztDQUM5QjNGLGNBQVFvRCxJQUFSLENBQWEsb0ZBQWI7Q0FDQSxXQUFLMDBCLGFBQUwsR0FBcUJueUIsS0FBckI7Q0FDRDtDQXR4Qkg7O0NBQUE7O0NBQUE7Q0FBQSxFQUF3Qys1QixlQUF4Qzs7Q0NiQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLEtBQWFDLG1CQUFiO0NBQUE7Q0FBQTtDQUNFLGlDQUF5QjtDQUFBOztDQUFBLFFBQWJsOEIsTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2Qiw2RkFBTUEsTUFBTjtDQUVBLFVBQUtBLE1BQUwsR0FBY3JHLE9BQU9rVyxNQUFQLENBQWM7Q0FDMUJzc0IsY0FBUSxLQURrQjtDQUUxQjNpQyxjQUFRLElBRmtCO0NBRzFCZ0ksY0FBUSxJQUFJcU0sT0FBSjtDQUhrQixLQUFkLEVBSVg3TixNQUpXLENBQWQ7Q0FIdUI7Q0FReEI7O0NBVEg7Q0FBQTtDQUFBLDRCQVdVaEMsUUFYVixFQVdtQjtDQUNmLHlGQUFjQSxRQUFkOztDQURlLHlCQUd1QixLQUFLZ0MsTUFINUI7Q0FBQSxVQUdBdVIsR0FIQSxnQkFHUi9YLE1BSFE7Q0FBQSxVQUdLMmlDLE1BSEwsZ0JBR0tBLE1BSEw7Q0FBQSxVQUdhMzZCLE1BSGIsZ0JBR2FBLE1BSGI7Q0FJZixVQUFNaEksU0FBUytYLE1BQU1BLElBQUk1USxNQUFWLEdBQW1CM0MsU0FBUU8sR0FBUixDQUFZLFFBQVosRUFBc0JvQyxNQUF4RDtDQUVBLFVBQU1veEIsV0FBVyxJQUFJMEIsa0JBQUosQ0FDZmo2QixNQURlLEVBRWZ3RSxTQUFRTyxHQUFSLENBQVksU0FBWixDQUZlLEVBR2ZQLFNBQVFZLE9BSE8sQ0FBakI7Q0FNQSxVQUFNdzlCLGtCQUFrQkQsU0FBUyxhQUFLO0NBQ3BDcEssaUJBQVM5ZCxNQUFULENBQWdCK2QsRUFBRS9DLFFBQUYsRUFBaEI7Q0FDQThDLGlCQUFTdndCLE1BQVQsQ0FBZ0JmLElBQWhCLENBQXFCZSxNQUFyQjtDQUNELE9BSHVCLEdBR3BCLGFBQUs7Q0FDUHV3QixpQkFBUzlkLE1BQVQsQ0FBZ0IrZCxFQUFFL0MsUUFBRixFQUFoQjtDQUNELE9BTEQ7Q0FPQSxXQUFLb04sV0FBTCxDQUFpQnRLLFFBQWpCO0NBQ0EsV0FBS3VLLFNBQUwsQ0FBZUYsZUFBZjs7Q0FFQXArQixlQUFRaVcsTUFBUixDQUFlO0NBQ2IzUCxnQkFBUSx5QkFBVTtDQUNoQixjQUFJaU4sR0FBSixFQUFTO0NBQ1R3Z0IsbUJBQVN2NEIsTUFBVCxHQUFrQjhLLFFBQU8zRCxNQUF6QjtDQUNELFNBSlk7Q0FLYm1SLGlCQUFTLDJCQUFXO0NBQ2xCaWdCLG1CQUFTamUsVUFBVCxHQUFzQmhDLFFBQXRCO0NBQ0Q7Q0FQWSxPQUFmOztDQVVBaWdCLGVBQVN2d0IsTUFBVCxDQUFnQmYsSUFBaEIsQ0FBcUJlLE1BQXJCO0NBQ0Q7Q0E1Q0g7O0NBQUE7O0NBQUE7Q0FBQSxFQUF5Q3N3QixjQUF6Qzs7Q0N6QkE7O0NDQUE7O0NDQUE7Ozs7Ozs7QUFPQSxLQUFheUsscUJBQWI7Q0FBQTtDQUFBO0NBQ0UsbUNBQXlCO0NBQUEsUUFBYnY4QixNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQ3ZCLFNBQUtBLE1BQUwsR0FBY3JHLE9BQU9rVyxNQUFQLENBQWM7Q0FDMUJ2TyxrQkFBWTtDQURjLEtBQWQsRUFFWHRCLE1BRlcsQ0FBZDtDQUdEOztDQUxIO0NBQUE7Q0FBQSw4QkFPWWlTLElBUFosRUFPa0I7Q0FBQTs7Q0FDZCxVQUFNalMsU0FBU2lTLEtBQUtqUyxNQUFwQjs7Q0FFQSxXQUFLdzhCLEVBQUwsR0FBVSxZQUF1QjtDQUFBLFlBQWJ4OEIsTUFBYSx1RUFBSixFQUFJOztDQUMvQixZQUFJLEtBQUsySSxhQUFULEVBQXdCO0NBQ3RCLGVBQUtoSSxNQUFMLENBQVk0QixRQUFaLEdBQXVCLEtBQUtvRyxhQUFMLENBQ3JCLEtBQUs4ekIsWUFBTCxDQUFrQjtDQUFDbDZCLHNCQUFVdkM7Q0FBWCxXQUFsQixDQURxQixDQUF2QjtDQUdEO0NBQ0YsT0FORDs7Q0FRQSxVQUFJQSxPQUFPc0IsVUFBWCxFQUF1QjtDQUFBLG1DQUNWMUcsR0FEVTtDQUVuQixjQUFJQSxHQUFKLEVBQVM7Q0FDUGpCLG1CQUFPWixjQUFQLENBQXNCLEtBQXRCLGNBQWlDNkIsR0FBakMsR0FBd0M7Q0FDdEMyRCxpQkFEc0MsaUJBQ2hDO0NBQ0osdUJBQU8sS0FBS29DLE1BQUwsQ0FBWTRCLFFBQVosQ0FBcUJtNkIsVUFBckIsQ0FBZ0M5aEMsR0FBaEMsQ0FBUDtDQUNELGVBSHFDO0NBSXRDZ0YsaUJBSnNDLGVBSWxDc0MsS0FKa0MsRUFJM0I7Q0FDVCxxQkFBS3ZCLE1BQUwsQ0FBWTRCLFFBQVosR0FBdUIsS0FBS29HLGFBQUwsQ0FBbUIsS0FBSzh6QixZQUFMLENBQWtCO0NBQUNsNkIsaURBQVkzSCxHQUFaLEVBQWtCc0gsS0FBbEI7Q0FBRCxpQkFBbEIsQ0FBbkIsQ0FBdkI7Q0FDRCxlQU5xQztDQU90Q0YsNEJBQWMsSUFQd0I7Q0FRdENDLDBCQUFZO0NBUjBCLGFBQXhDO0NBVUQ7Q0Fia0I7O0NBQ3JCLGFBQUssSUFBTXJILEdBQVgsSUFBa0IsS0FBS29GLE1BQUwsQ0FBWXVDLFFBQTlCLEVBQXdDO0NBQUEsZ0JBQTdCM0gsR0FBNkI7Q0FhdkM7Q0FDRjtDQUNGO0NBbENIOztDQUFBO0NBQUE7O0NDRUEsSUFBTTBSLFNBQVMsSUFBSXF3QixhQUFKLEVBQWY7Q0FFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLEtBQWFDLGFBQWI7Q0FBQTtDQUFBO0NBQUE7Q0FBQTtDQUFBLHlCQUNjbndCLEdBRGQsRUFDbUI7Q0FDZixhQUFPLElBQUltd0IsYUFBSixDQUFrQjtDQUFDbndCO0NBQUQsT0FBbEIsRUFBeUJvd0IsUUFBekIsQ0FBa0MsQ0FBbEMsRUFBcUMsQ0FBckMsQ0FBUDtDQUNEO0NBSEg7O0NBT0UsMkJBQXlCO0NBQUE7O0NBQUE7O0NBQUEsd0RBRmQsRUFFYyxhQThCaEI7Q0FDUHI2QixjQURPLG9CQUNFQSxTQURGLEVBQ1l5UCxJQURaLEVBQ2tCO0NBQ3ZCQSxhQUFLNHFCLFFBQUwsQ0FBYzF3QixPQUFkLENBQXNCLG1CQUFXO0NBQy9CM0osb0JBQVNpYyxRQUFRLENBQVIsQ0FBVCxJQUF1QkEsUUFBUSxDQUFSLENBQXZCO0NBQ0QsU0FGRDtDQUlBamMsa0JBQVNpVixXQUFULEdBQXVCLElBQXZCO0NBQ0EsZUFBT2pWLFNBQVA7Q0FDRDtDQVJNLEtBOUJnQjs7Q0FBQSxzQ0FBVnE2QixRQUFVO0NBQVZBLGNBQVU7Q0FBQTs7Q0FDdkJBLGFBQVMxd0IsT0FBVCxDQUFpQixnQkFRWDtDQUFBLFVBUEpNLEdBT0ksUUFQSkEsR0FPSTtDQUFBLDJCQU5Kck4sSUFNSTtDQUFBLFVBTkpBLElBTUksMEJBTkcsS0FNSDtDQUFBLDZCQUxKbTNCLE1BS0k7Q0FBQSxVQUxKQSxNQUtJLDRCQUxLLElBQUlqa0IsT0FBSixDQUFZLENBQVosRUFBZSxDQUFmLENBS0w7Q0FBQSw2QkFKSndxQixNQUlJO0NBQUEsVUFKSkEsTUFJSSw0QkFKSyxJQUFJeHFCLE9BQUosQ0FBWSxDQUFaLEVBQWUsQ0FBZixDQUlMO0NBQUEsMkJBSEozUCxJQUdJO0NBQUEsVUFISkEsSUFHSSwwQkFIR282QixjQUdIO0NBQUEsOEJBRkpDLE9BRUk7Q0FBQSxVQUZKQSxPQUVJLDZCQUZNQyxTQUVOO0NBQUEsMEJBREpycUIsR0FDSTtDQUFBLFVBREpBLEdBQ0kseUJBREU7Q0FBQSxlQUFPc3FCLEdBQVA7Q0FBQSxPQUNGO0NBQ0osVUFBTXplLFVBQVVuUyxPQUFPRSxJQUFQLENBQVlDLEdBQVosQ0FBaEI7O0NBRUEsVUFBSTlKLEtBQUtuSSxNQUFMLEdBQWMsQ0FBbEIsRUFBcUI7Q0FDbkJpa0IsZ0JBQVEwZSxLQUFSLEdBQWdCeDZCLEtBQUssQ0FBTCxDQUFoQjtDQUNBOGIsZ0JBQVEyZSxLQUFSLEdBQWdCejZCLEtBQUssQ0FBTCxDQUFoQjtDQUNELE9BSEQsTUFJRThiLFFBQVEwZSxLQUFSLEdBQWdCMWUsUUFBUTJlLEtBQVIsR0FBZ0J6NkIsSUFBaEM7O0NBRUY4YixjQUFRdWUsT0FBUixHQUFrQkEsT0FBbEI7Q0FFQXZlLGNBQVE4WCxNQUFSLENBQWU5MUIsSUFBZixDQUFvQjgxQixNQUFwQjtDQUNBOVgsY0FBUXFlLE1BQVIsQ0FBZXI4QixJQUFmLENBQW9CcThCLE1BQXBCO0NBRUFyZSxjQUFRMEUsU0FBUixHQUFvQm1KLGFBQXBCO0NBQ0E3TixjQUFRd0UsU0FBUixHQUFvQitKLHdCQUFwQjs7Q0FFQSxZQUFLNlAsUUFBTCxDQUFjOStCLElBQWQsQ0FBbUIsQ0FBQ3FCLElBQUQsRUFBT3dULElBQUk2TCxPQUFKLENBQVAsQ0FBbkI7Q0FDRCxLQTFCRDtDQTJCRDs7Q0FuQ0g7Q0FBQTs7Q0NqQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdDQSxLQUFhNGUsZUFBYjtDQUFBO0NBQUE7Q0FDRSwyQkFBWXpwQixHQUFaLEVBQWlCMHBCLFVBQWpCLEVBQTBDO0NBQUEsUUFBYnQ5QixNQUFhLHVFQUFKLEVBQUk7O0NBQUE7O0NBQUEscUNBMENqQztDQUNQb0IsVUFETyxnQkFDRkEsS0FERSxFQUNJNlEsSUFESixFQUNVO0NBQ2Y3USxjQUFLbUIsUUFBTCxDQUFjZzdCLFFBQWQsR0FBeUJuOEIsTUFBS204QixRQUE5QjtDQUVBdHJCLGFBQUt1ckIsS0FBTCxHQUFhLElBQUlDLGNBQUosQ0FBbUJyOEIsTUFBS21CLFFBQXhCLENBQWI7Q0FDQTBQLGFBQUt5ckIsS0FBTCxHQUFhdDhCLE1BQUttQixRQUFMLENBQWNvN0IsVUFBM0I7Q0FFQSxlQUFPdjhCLEtBQVA7Q0FDRDtDQVJNLEtBMUNpQzs7Q0FDeEMsU0FBS3BCLE1BQUwsR0FBY3JHLE9BQU9rVyxNQUFQLENBQWM7Q0FDMUJ3YixhQUFPO0NBRG1CLEtBQWQsRUFFWHJyQixNQUZXLENBQWQ7Q0FJQSxTQUFLNFQsR0FBTCxHQUFXQSxHQUFYO0NBQ0EsU0FBSzBwQixVQUFMLEdBQWtCQSxVQUFsQjtDQUNEO0NBRUQ7Ozs7Ozs7Ozs7Q0FWRjtDQUFBO0NBQUEseUJBa0JPTSxRQWxCUCxFQWtCaUI7Q0FDYixVQUFNQyxPQUFPQyxjQUFjQyxVQUFkLENBQXlCLEtBQUtMLEtBQTlCLEVBQXFDRSxRQUFyQyxDQUFiO0NBQ0EsYUFBTyxLQUFLSixLQUFMLENBQVdRLFVBQVgsQ0FBc0JILElBQXRCLEVBQTRCSSxJQUE1QixFQUFQO0NBQ0Q7Q0FFRDs7Ozs7OztDQXZCRjtDQUFBO0NBQUEsMkJBNkJTbDRCLEtBN0JULEVBNkJnQjtDQUNaLFVBQUksS0FBS3kzQixLQUFULEVBQWdCLEtBQUtBLEtBQUwsQ0FBV3ZwQixNQUFYLENBQWtCbE8sTUFBTWtwQixRQUFOLEtBQW1CLEtBQUtqdkIsTUFBTCxDQUFZcXJCLEtBQWpEO0NBQ2pCO0NBL0JIO0NBQUE7Q0FBQSw4QkFpQ1lwWixJQWpDWixFQWlDa0I7Q0FDZEEsV0FBS2pNLElBQUwsR0FBWSxJQUFJRSxJQUFKLENBQVMsVUFBQ0gsS0FBRDtDQUFBLGVBQVdrTSxLQUFLZ0MsTUFBTCxDQUFZbE8sS0FBWixDQUFYO0NBQUEsT0FBVCxDQUFaO0NBRUEsVUFBSSxDQUFDa00sS0FBS3FyQixVQUFWLEVBQXNCcnJCLEtBQUtqTSxJQUFMLENBQVVPLEtBQVYsQ0FBZ0IwTCxLQUFLMkIsR0FBckI7Q0FDdkI7Q0FyQ0g7Q0FBQTtDQUFBLDRCQXVDVTVWLFFBdkNWLEVBdUNtQjtDQUNmQSxlQUFRK1YsTUFBUixDQUFlLFdBQWY7Q0FDRDtDQXpDSDs7Q0FBQTtDQUFBOztDQ3ZDQTs7Q0NBQTs7Ozs7Ozs7Ozs7O0FBWUEsS0FBYW1xQixZQUFiO0NBQUE7Q0FBQTtDQUNFLHdCQUFZemhDLElBQVosRUFBa0J5QyxJQUFsQixFQUF3QjtDQUFBOztDQUN0QixTQUFLekMsSUFBTCxHQUFZQSxJQUFaO0NBQ0EsU0FBS3lDLElBQUwsR0FBWUEsSUFBWjtDQUNEOztDQUpIO0NBQUE7Q0FBQSw0QkFNVWxCLFFBTlYsRUFNbUI7Q0FDZkEsZUFBUTRCLEdBQVIsQ0FBWSxLQUFLbkQsSUFBakIsRUFBdUIsS0FBS3lDLElBQTVCO0NBQ0Q7Q0FSSDs7Q0FBQTtDQUFBOztDQ1pBOztLQ0dhaS9CLEtBQWI7Q0FBQTtDQUFBO0NBQ0UsaUJBQVluK0IsTUFBWixFQUFtQztDQUFBOztDQUFBOztDQUNqQ3pELFlBQVFvRCxJQUFSLENBQWEsNENBQWI7O0NBRUEsUUFBSUssT0FBT3VDLFFBQVgsRUFBcUI7Q0FDbkJ2QyxhQUFPeU0sR0FBUCxHQUFhek0sT0FBT3VDLFFBQVAsQ0FBZ0JrTixJQUE3QjtDQUNBelAsYUFBT3NNLE1BQVAsR0FBZ0J0TSxPQUFPdUMsUUFBUCxDQUFnQitKLE1BQWhDO0NBQ0Q7O0NBTmdDLHNDQUFaOEYsVUFBWTtDQUFaQSxnQkFBWTtDQUFBOztDQUFBLDRIQVEzQnBTLE1BUjJCLFNBUWhCb1MsVUFSZ0I7Q0FTbEM7O0NBVkg7O0NBQUE7Q0FBQSxFQUEyQnBHLFFBQTNCO0FBYUEsS0FBYW95QixZQUFiO0NBQUE7Q0FBQTtDQUNFLDBCQUF5QjtDQUFBLFFBQWJwK0IsTUFBYSx1RUFBSixFQUFJOztDQUFBOztDQUN2QnpELFlBQVFvRCxJQUFSLENBQWEsdURBQWI7Q0FDQSxTQUFLMkUsTUFBTCxHQUFjLElBQUlpRSxtQkFBSixDQUFzQnZJLE1BQXRCLENBQWQ7Q0FDRDs7Q0FKSDtDQUFBO0NBQUEsOEJBTVlpUyxJQU5aLEVBTWtCO0NBQ2QsV0FBS2pSLEdBQUwsQ0FBU2lSLEtBQUszTixNQUFkO0NBQ0Q7Q0FSSDtDQUFBO0NBQUEsNEJBVVV0RyxRQVZWLEVBVW1CO0NBQ2ZBLGVBQVE0QixHQUFSLENBQVksUUFBWixFQUFzQixLQUFLMEUsTUFBM0I7Q0FDRDtDQVpIOztDQUFBO0NBQUE7O0NDaEJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9 diff --git a/lib/whs.js.map b/lib/whs.js.map new file mode 100644 index 0000000..844a14c --- /dev/null +++ b/lib/whs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"whs.js","sources":["../node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js","../node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime-module.js","../node_modules/@babel/runtime/regenerator/index.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-integer.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_defined.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_string-at.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_library.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_global.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_core.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_a-function.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_ctx.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_is-object.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_an-object.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_fails.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_descriptors.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_dom-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_ie8-dom-define.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-primitive.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-dp.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_property-desc.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_hide.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_has.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_export.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_redefine.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iterators.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_cof.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iobject.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-iobject.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-length.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-absolute-index.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-includes.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_shared.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_uid.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_shared-key.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-keys-internal.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_enum-bug-keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-dps.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_html.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_wks.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-to-string-tag.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-object.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gpo.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-define.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.string.iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-step.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.array.iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/web.dom.iterable.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_classof.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_an-instance.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-call.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_is-array-iter.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/core.get-iterator-method.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_for-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_species-constructor.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_invoke.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_task.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_microtask.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_new-promise-capability.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_perform.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_user-agent.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_promise-resolve.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_redefine-all.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-species.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-detect.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.promise.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.promise.finally.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.promise.try.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/promise.js","../node_modules/@babel/runtime/core-js/promise.js","../node_modules/@babel/runtime/helpers/asyncToGenerator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-pie.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gopd.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-sap.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/get-own-property-descriptor.js","../node_modules/@babel/runtime/core-js/object/get-own-property-descriptor.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_meta.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_wks-ext.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_wks-define.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gops.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_enum-keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_is-array.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gopn.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gopn-ext.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.symbol.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/get-own-property-symbols.js","../node_modules/@babel/runtime/core-js/object/get-own-property-symbols.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/keys.js","../node_modules/@babel/runtime/core-js/object/keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.define-property.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/define-property.js","../node_modules/@babel/runtime/core-js/object/define-property.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/@babel/runtime/helpers/objectSpread.js","../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-proto.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.set-prototype-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/set-prototype-of.js","../node_modules/@babel/runtime/core-js/object/set-prototype-of.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/symbol/iterator.js","../node_modules/@babel/runtime/core-js/symbol/iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.symbol.async-iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.symbol.observable.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/symbol/index.js","../node_modules/@babel/runtime/core-js/symbol.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.get-prototype-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/get-prototype-of.js","../node_modules/@babel/runtime/core-js/object/get-prototype-of.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../src/utils/extend.js","../src/utils/transformData.js","../node_modules/three/build/three.module.js","../node_modules/minivents/dist/minivents.commonjs.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.create.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/create.js","../node_modules/@babel/runtime/core-js/object/create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_validate-collection.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_collection-strong.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-species-constructor.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-species-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-methods.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_collection.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.map.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-from-iterable.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_collection-to-json.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.map.to-json.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-collection-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.map.of.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-collection-from.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.map.from.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/map.js","../node_modules/@babel/runtime/core-js/map.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_bind.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.reflect.construct.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/reflect/construct.js","../node_modules/@babel/runtime/core-js/reflect/construct.js","../node_modules/@babel/runtime/helpers/construct.js","../node_modules/@babel/runtime/helpers/wrapNativeSuper.js","../src/core/errors.js","../src/core/ModuleSystem.js","../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/core.get-iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/get-iterator.js","../node_modules/@babel/runtime/core-js/get-iterator.js","../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../node_modules/@babel/runtime/helpers/nonIterableRest.js","../node_modules/@babel/runtime/helpers/slicedToArray.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../src/core/ModuleManager.js","../src/core/Component.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.reflect.get.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/reflect/get.js","../node_modules/@babel/runtime/core-js/reflect/get.js","../node_modules/@babel/runtime/helpers/superPropBase.js","../node_modules/@babel/runtime/helpers/get.js","../src/core/prototype/attributes.js","../src/core/MeshComponent.js","../src/core/LightComponent.js","../src/core/CameraComponent.js","../src/polyfill.js","../src/core/App.js","../src/core/Loop.js","../src/core/index.js","../src/components/lights/AmbientLight.js","../src/components/lights/DirectionalLight.js","../src/components/lights/HemisphereLight.js","../src/components/lights/PointLight.js","../src/components/lights/SpotLight.js","../src/components/lights/AreaLight.js","../src/components/lights/index.js","../src/components/cameras/CubeCamera.js","../src/components/cameras/OrthographicCamera.js","../src/components/cameras/PerspectiveCamera.js","../src/components/cameras/index.js","../src/components/meshes/Box.js","../src/components/meshes/Circle.js","../src/components/meshes/Cone.js","../src/components/meshes/Cylinder.js","../src/components/meshes/Dodecahedron.js","../src/components/meshes/Extrude.js","../src/components/meshes/Icosahedron.js","../src/components/meshes/Lathe.js","../src/components/meshes/Line.js","../src/components/meshes/Importer.js","../src/components/meshes/Octahedron.js","../src/components/meshes/Parametric.js","../src/components/meshes/Plane.js","../src/components/meshes/Polyhedron.js","../src/components/meshes/Ring.js","../src/components/meshes/Shape.js","../src/components/meshes/Sphere.js","../src/components/meshes/Tetrahedron.js","../src/components/meshes/Text.js","../src/components/meshes/Torus.js","../src/components/meshes/Torusknot.js","../src/components/meshes/Tube.js","../src/components/meshes/Group.js","../src/components/meshes/index.js","../src/modules/app/ElementModule.js","../src/modules/app/RenderingModule.js","../src/modules/app/SceneModule.js","../src/modules/app/ResizeModule.js","../node_modules/postprocessing/src/materials/AdaptiveLuminosityMaterial.js","../node_modules/postprocessing/src/materials/BokehMaterial.js","../node_modules/postprocessing/src/materials/ColorEdgesMaterial.js","../node_modules/postprocessing/src/materials/CombineMaterial.js","../node_modules/postprocessing/src/materials/ConvolutionMaterial.js","../node_modules/postprocessing/src/materials/CopyMaterial.js","../node_modules/postprocessing/src/materials/DepthComparisonMaterial.js","../node_modules/postprocessing/src/materials/DotScreenMaterial.js","../node_modules/postprocessing/src/materials/FilmMaterial.js","../node_modules/postprocessing/src/materials/GlitchMaterial.js","../node_modules/postprocessing/src/materials/GodRaysMaterial.js","../node_modules/postprocessing/src/materials/LuminosityMaterial.js","../node_modules/postprocessing/src/materials/OutlineBlendMaterial.js","../node_modules/postprocessing/src/materials/OutlineEdgesMaterial.js","../node_modules/postprocessing/src/materials/PixelationMaterial.js","../node_modules/postprocessing/src/materials/RealisticBokehMaterial.js","../node_modules/postprocessing/src/materials/ShockWaveMaterial.js","../node_modules/postprocessing/src/materials/SMAABlendMaterial.js","../node_modules/postprocessing/src/materials/SMAAWeightsMaterial.js","../node_modules/postprocessing/src/materials/ToneMappingMaterial.js","../node_modules/postprocessing/src/materials/index.js","../node_modules/postprocessing/src/passes/Pass.js","../node_modules/postprocessing/src/passes/BlurPass.js","../node_modules/postprocessing/src/passes/BloomPass.js","../node_modules/postprocessing/src/passes/BokehPass.js","../node_modules/postprocessing/src/passes/ClearMaskPass.js","../node_modules/postprocessing/src/passes/ClearPass.js","../node_modules/postprocessing/src/passes/DotScreenPass.js","../node_modules/postprocessing/src/passes/FilmPass.js","../node_modules/postprocessing/src/passes/GlitchPass.js","../node_modules/postprocessing/src/passes/RenderPass.js","../node_modules/postprocessing/src/passes/GodRaysPass.js","../node_modules/postprocessing/src/passes/MaskPass.js","../node_modules/postprocessing/src/passes/ShaderPass.js","../node_modules/postprocessing/src/passes/OutlinePass.js","../node_modules/postprocessing/src/passes/PixelationPass.js","../node_modules/postprocessing/src/passes/RealisticBokehPass.js","../node_modules/postprocessing/src/passes/SavePass.js","../node_modules/postprocessing/src/passes/ShockWavePass.js","../node_modules/postprocessing/src/materials/images/smaa/searchImageDataURL.js","../node_modules/postprocessing/src/materials/images/smaa/areaImageDataURL.js","../node_modules/postprocessing/src/passes/SMAAPass.js","../node_modules/postprocessing/src/passes/TexturePass.js","../node_modules/postprocessing/src/passes/ToneMappingPass.js","../node_modules/postprocessing/src/passes/index.js","../node_modules/postprocessing/src/core/EffectComposer.js","../src/modules/app/PostProcessorModule.js","../src/modules/app/EventsPatchModule.js","../src/modules/app/VirtualMouseModule.js","../src/modules/app/ControlsModule.js","../src/modules/app/FogModule.js","../src/modules/app/StateModule.js","../src/modules/app/controls/lib/ThreeOrbitControls.js","../src/modules/app/controls/OrbitControlsModule.js","../src/modules/app/controls/index.js","../src/modules/app/index.js","../src/modules/mesh/DynamicGeometryModule.js","../src/modules/mesh/TextureModule.js","../src/modules/mesh/AnimationModule.js","../src/modules/mesh/index.js","../src/modules/DefineModule.js","../src/modules/index.js","../src/deprecation.js","../src/index.js"],"sourcesContent":["/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = require(\"./runtime\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n","module.exports = require(\"regenerator-runtime\");\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","module.exports = true;\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.6' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","module.exports = require('./_hide');\n","module.exports = {};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","require('./es6.array.iterator');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar TO_STRING_TAG = require('./_wks')('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var hide = require('./_hide');\nmodule.exports = function (target, src, safe) {\n for (var key in src) {\n if (safe && target[key]) target[key] = src[key];\n else hide(target, key, src[key]);\n } return target;\n};\n","'use strict';\nvar global = require('./_global');\nvar core = require('./_core');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = require('./_export');\nvar core = require('./_core');\nvar global = require('./_global');\nvar speciesConstructor = require('./_species-constructor');\nvar promiseResolve = require('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n","'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = require('./_export');\nvar newPromiseCapability = require('./_new-promise-capability');\nvar perform = require('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapability.f(this);\n var result = perform(callbackfn);\n (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n return promiseCapability.promise;\n} });\n","require('../modules/es6.object.to-string');\nrequire('../modules/es6.string.iterator');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.promise');\nrequire('../modules/es7.promise.finally');\nrequire('../modules/es7.promise.try');\nmodule.exports = require('../modules/_core').Promise;\n","module.exports = require(\"core-js/library/fn/promise\");","var _Promise = require(\"../core-js/promise\");\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new _Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function step(key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n _Promise.resolve(value).then(_next, _throw);\n }\n }\n\n function _next(value) {\n step(\"next\", value);\n }\n\n function _throw(err) {\n step(\"throw\", err);\n }\n\n _next();\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","require('../../modules/es6.object.get-own-property-descriptor');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function getOwnPropertyDescriptor(it, key) {\n return $Object.getOwnPropertyDescriptor(it, key);\n};\n","module.exports = require(\"core-js/library/fn/object/get-own-property-descriptor\");","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","exports.f = Object.getOwnPropertySymbols;\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","require('../../modules/es6.symbol');\nmodule.exports = require('../../modules/_core').Object.getOwnPropertySymbols;\n","module.exports = require(\"core-js/library/fn/object/get-own-property-symbols\");","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;\n","module.exports = require(\"core-js/library/fn/object/keys\");","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\n","require('../../modules/es6.object.define-property');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc) {\n return $Object.defineProperty(it, key, desc);\n};\n","module.exports = require(\"core-js/library/fn/object/define-property\");","var _Object$defineProperty = require(\"../core-js/object/define-property\");\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n _Object$defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;","var _Object$getOwnPropertyDescriptor = require(\"../core-js/object/get-own-property-descriptor\");\n\nvar _Object$getOwnPropertySymbols = require(\"../core-js/object/get-own-property-symbols\");\n\nvar _Object$keys = require(\"../core-js/object/keys\");\n\nvar defineProperty = require(\"./defineProperty\");\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n var ownKeys = _Object$keys(source);\n\n if (typeof _Object$getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(_Object$getOwnPropertySymbols(source).filter(function (sym) {\n return _Object$getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nmodule.exports = _objectSpread;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./_export');\n$export($export.S, 'Object', { setPrototypeOf: require('./_set-proto').set });\n","require('../../modules/es6.object.set-prototype-of');\nmodule.exports = require('../../modules/_core').Object.setPrototypeOf;\n","module.exports = require(\"core-js/library/fn/object/set-prototype-of\");","var _Object$setPrototypeOf = require(\"../core-js/object/set-prototype-of\");\n\nfunction _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = _Object$setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n setPrototypeOf(subClass.prototype, superClass && superClass.prototype);\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","var _Object$defineProperty = require(\"../core-js/object/define-property\");\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n\n _Object$defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","require('../../modules/es6.string.iterator');\nrequire('../../modules/web.dom.iterable');\nmodule.exports = require('../../modules/_wks-ext').f('iterator');\n","module.exports = require(\"core-js/library/fn/symbol/iterator\");","require('./_wks-define')('asyncIterator');\n","require('./_wks-define')('observable');\n","require('../../modules/es6.symbol');\nrequire('../../modules/es6.object.to-string');\nrequire('../../modules/es7.symbol.async-iterator');\nrequire('../../modules/es7.symbol.observable');\nmodule.exports = require('../../modules/_core').Symbol;\n","module.exports = require(\"core-js/library/fn/symbol\");","var _Symbol$iterator = require(\"../core-js/symbol/iterator\");\n\nvar _Symbol = require(\"../core-js/symbol\");\n\nfunction _typeof2(obj) { if (typeof _Symbol === \"function\" && typeof _Symbol$iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof _Symbol === \"function\" && obj.constructor === _Symbol && obj !== _Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof _Symbol === \"function\" && _typeof2(_Symbol$iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof _Symbol === \"function\" && obj.constructor === _Symbol && obj !== _Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","require('../../modules/es6.object.get-prototype-of');\nmodule.exports = require('../../modules/_core').Object.getPrototypeOf;\n","module.exports = require(\"core-js/library/fn/object/get-prototype-of\");","var _Object$getPrototypeOf = require(\"../core-js/object/get-prototype-of\");\n\nfunction _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = _Object$getPrototypeOf || function _getPrototypeOf(o) {\n return o.__proto__;\n };\n\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","export const extend = (object, ...extensions) => { // $.extend alternative, ... is the spread operator.\n for (const extension of extensions) {\n // console.log(extension);\n // console.log(typeof extension);\n\n if (!extension)\n continue; // Ignore null and undefined objects and parameters.\n\n for (const prop of Object.getOwnPropertyNames(extension)) { // Do not traverse the prototype chain.\n if (object[prop] !== undefined && extension[prop]\n && object[prop].toString() === '[object Object]'\n && extension[prop].toString() === '[object Object]') {\n // Goes deep only if object[prop] and extension[prop] are both objects !\n if (object[prop].constructor === Object) extend(object[prop], extension[prop]);\n } else\n object[prop] = typeof object[prop] === 'undefined' ? extension[prop] : object[prop];\n\n if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop].slice(); // Add values that do not already exist.\n else if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop];\n }\n }\n\n return object;\n};\n","export const instruct = (array, instArray) => {\n const tempObject = {};\n\n for (let i = 0, max = instArray.length; i < max; i++) {\n const guide = instArray[i];\n\n tempObject[guide] = array[i];\n }\n\n return tempObject;\n};\n\nexport const transformData = (object, instructions) => {\n for (const key in instructions) {\n if (Array.isArray(object[key]))\n object[key] = instruct(object[key], instructions[key]);\n else if (object[key] instanceof Object && !(Array.isArray(instructions[key])))\n object[key] = transformData(object[key], instructions[key]);\n }\n\n return object;\n};\n\nexport const toArray = (object, instruction) => {\n const tempArray = [];\n\n for (let i = 0, max = instruction.length; i < max; i++) {\n const guide = instruction[i];\n\n tempArray[i] = object[guide];\n }\n\n return tempArray;\n};\n","// 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 = '92';\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 to range \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 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 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\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\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\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\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// last column\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// bottom row\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 ( q ) {\n\n\t\tvar te = this.elements;\n\n\t\tvar x = q._x, y = q._y, z = q._z, w = q._w;\n\t\tvar x2 = x + x, y2 = 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\tte[ 0 ] = 1 - ( yy + zz );\n\t\tte[ 4 ] = xy - wz;\n\t\tte[ 8 ] = xz + wy;\n\n\t\tte[ 1 ] = xy + wz;\n\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\tte[ 9 ] = yz - wx;\n\n\t\tte[ 2 ] = xz - wy;\n\t\tte[ 6 ] = yz + wx;\n\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t// last column\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// bottom row\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\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\tthis.makeRotationFromQuaternion( quaternion );\n\t\tthis.scale( scale );\n\t\tthis.setPosition( position );\n\n\t\treturn 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.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 () {\n\n\t\tvar points = [\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3()\n\t\t];\n\n\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t// transform of empty box is an empty box.\n\t\t\tif ( this.isEmpty() ) return this;\n\n\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t\treturn this;\n\n\t\t};\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\\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 );\\t\\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\\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\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\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 \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar distanceRGBA_frag = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\\n\";\n\nvar equirect_frag = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldPosition;\\n#include \\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 \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\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 \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\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 \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\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 \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\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 \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\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 \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\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 \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar shadow_frag = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n}\\n\";\n\nvar shadow_vert = \"#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\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 () {\n\n\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\tthis.r = r * r;\n\t\tthis.g = g * g;\n\t\tthis.b = b * b;\n\n\t\treturn this;\n\n\t},\n\n\tconvertLinearToGamma: function () {\n\n\t\tthis.r = Math.sqrt( this.r );\n\t\tthis.g = Math.sqrt( this.g );\n\t\tthis.b = Math.sqrt( this.b );\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 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\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}\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\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\treturn;\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;\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\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\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\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\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\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\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: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * depthTest: ,\n * depthWrite: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: \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: ,\n * vertexShader: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * lights: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \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\t\t\t\tintersection.faceIndex = a;\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 indices 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 ) intersects.push( intersection );\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, geometries, 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\tgeometries.update( boxMesh.geometry );\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\tgeometries.update( planeMesh.geometry );\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\tvar position = geometry.attributes.position;\n\n\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\tcount = position.data.count;\n\n\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t} else {\n\n\t\t\textension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount );\n\n\t\t}\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 );\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\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\tgl.uniform1f( this.addr, v );\n\n}\n\nfunction setValue1i( gl, v ) {\n\n\tgl.uniform1i( this.addr, v );\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValue2fv( gl, v ) {\n\n\tif ( v.x === undefined ) {\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t} else {\n\n\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n}\n\nfunction setValue3fv( gl, v ) {\n\n\tif ( v.x !== undefined ) {\n\n\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t} else {\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n}\n\nfunction setValue4fv( gl, v ) {\n\n\tif ( v.x === undefined ) {\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t} else {\n\n\t\t gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n}\n\n// Single matrix (from flat array or MatrixN)\n\nfunction setValue2fm( gl, v ) {\n\n\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n}\n\nfunction setValue3fm( gl, v ) {\n\n\tif ( v.elements === undefined ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t} else {\n\n\t\tmat3array.set( v.elements );\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t}\n\n}\n\nfunction setValue4fm( gl, v ) {\n\n\tif ( v.elements === undefined ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t} else {\n\n\t\tmat4array.set( v.elements );\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t}\n\n}\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, renderer ) {\n\n\tvar unit = renderer.allocTextureUnit();\n\tgl.uniform1i( this.addr, unit );\n\trenderer.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, renderer ) {\n\n\tvar unit = renderer.allocTextureUnit();\n\tgl.uniform1i( this.addr, unit );\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\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValue3iv( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValue4iv( gl, v ) {\n\n\tgl.uniform4iv( this.addr, 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\tgl.uniform1fv( this.addr, v );\n\n}\nfunction setValue1iv( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of vectors (flat or from THREE classes)\n\nfunction setValueV2a( gl, v ) {\n\n\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n}\n\nfunction setValueV3a( gl, v ) {\n\n\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n}\n\nfunction setValueV4a( gl, v ) {\n\n\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n}\n\n// Array of matrices (flat or from THREE clases)\n\nfunction setValueM2a( gl, v ) {\n\n\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n}\n\nfunction setValueM3a( gl, v ) {\n\n\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n}\n\nfunction setValueM4a( gl, v ) {\n\n\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n}\n\n// Array of textures (2D / Cube)\n\nfunction setValueT1a( gl, v, renderer ) {\n\n\tvar n = v.length,\n\t\tunits = allocTexUnits( renderer, n );\n\n\tgl.uniform1iv( this.addr, units );\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 n = v.length,\n\t\tunits = allocTexUnits( renderer, n );\n\n\tgl.uniform1iv( this.addr, units );\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.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.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\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\tfor ( ; ; ) {\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 : '',\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: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \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: ,\n * nearDistance: ,\n * farDistance: ,\n *\n * skinning: ,\n * morphTargets: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: \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;\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\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 ] !== 0 ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t}\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} else if ( scope.enabled ) {\n\n\t\t\trenderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio );\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};\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.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 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_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, geometries, _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 = 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\tvar device = vr.getDevice();\n\n\t\tif ( device && device.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\tstopAnimation();\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 isAnimating = false;\n\tvar onAnimationFrame = null;\n\n\tfunction startAnimation() {\n\n\t\tif ( isAnimating ) return;\n\n\t\trequestAnimationLoopFrame();\n\n\t\tisAnimating = true;\n\n\t}\n\n\tfunction stopAnimation() {\n\n\t\tisAnimating = false;\n\n\t}\n\n\tfunction requestAnimationLoopFrame() {\n\n\t\tvar device = vr.getDevice();\n\n\t\tif ( device && device.isPresenting ) {\n\n\t\t\tdevice.requestAnimationFrame( animationLoop );\n\n\t\t} else {\n\n\t\t\twindow.requestAnimationFrame( animationLoop );\n\n\t\t}\n\n\t}\n\n\tfunction animationLoop( time ) {\n\n\t\tif ( isAnimating === false ) return;\n\n\t\tonAnimationFrame( time );\n\n\t\trequestAnimationLoopFrame();\n\n\t}\n\n\tthis.animate = function ( callback ) {\n\n\t\tonAnimationFrame = callback;\n\t\tonAnimationFrame !== null ? startAnimation() : stopAnimation();\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\tvar bounds = camera2.bounds;\n\n\t\t\t\t\t\tvar x = bounds.x * _width;\n\t\t\t\t\t\tvar y = bounds.y * _height;\n\t\t\t\t\t\tvar width = bounds.z * _width;\n\t\t\t\t\t\tvar height = bounds.w * _height;\n\n\t\t\t\t\t\tstate.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );\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\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\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\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\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\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\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\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 = null;\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\t\tvar pixels = srcTexture.isDataTexture ? srcTexture.image.data : srcTexture.image;\n\n\t\tthis.setTexture2D( dstTexture, 0 );\n\n\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, pixels );\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.getHex(), 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.getHex(), 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: ,\n * opacity: ,\n * map: new THREE.Texture( ),\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: ,\n * opacity: ,\n *\n * linewidth: ,\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: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * size: ,\n * sizeAttenuation: \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.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\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\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: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * amount: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline is bevel\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // 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\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, options );\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 amount = options.amount !== undefined ? options.amount : 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//\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, amount / 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, amount + 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, amount + 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\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\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: , // font\n *\n * size: , // size of the text\n * height: , // thickness to extrude text\n * curveSegments: , // number of points on the curves\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into text bevel goes\n * bevelSize: // 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.amount = 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( 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( shapes, data );\n\n};\n\n//\n\nfunction toJSON( 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 = 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: \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: ,\n * roughness: ,\n * metalness: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * roughnessMap: new THREE.Texture( ),\n *\n * metalnessMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * envMapIntensity: \n *\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \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: \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: ,\n * specular: ,\n * shininess: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \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( )\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: ,\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \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: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \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: ,\n * opacity: ,\n *\n * linewidth: ,\n *\n * scale: ,\n * dashSize: ,\n * gapSize: \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 = 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 ) {\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 if ( 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\tconsole.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\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\timage.addEventListener( 'load', function () {\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}, false );\n\n\t\t/*\n\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t}, false );\n\t\t*/\n\n\t\timage.addEventListener( 'error', function ( event ) {\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}, 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\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\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();\nvar py = new CubicPoly();\nvar 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 = 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 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\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\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\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\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\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 clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t},\n\n\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\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 load( 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\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\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 = String( text ).split( '' );\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\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'\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' 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.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;\nvar 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\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","module.exports = function Events(target){\n var events = {}, empty = [];\n target = target || this\n /**\n * On: listen to events\n */\n target.on = function(type, func, ctx){\n (events[type] = events[type] || []).push([func, ctx])\n return target\n }\n /**\n * Off: stop listening to event / specific callback\n */\n target.off = function(type, func){\n type || (events = {})\n var list = events[type] || empty,\n i = list.length = func ? list.length : 0;\n while(i--) func == list[i][0] && list.splice(i,1)\n return target\n }\n /** \n * Emit: send event, callbacks will be triggered\n */\n target.emit = function(type){\n var e = events[type] || empty, list = e.length > 0 ? e.slice(0, e.length) : e, i=0, j;\n while(j=list[i++]) j[0].apply(j[1], empty.slice.call(arguments, 1))\n return target\n };\n};","var $export = require('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: require('./_object-create') });\n","require('../../modules/es6.object.create');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function create(P, D) {\n return $Object.create(P, D);\n};\n","module.exports = require(\"core-js/library/fn/object/create\");","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar meta = require('./_meta');\nvar fails = require('./_fails');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar setToStringTag = require('./_set-to-string-tag');\nvar dP = require('./_object-dp').f;\nvar each = require('./_array-methods')(0);\nvar DESCRIPTORS = require('./_descriptors');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME, '_c');\n target._c = new Base();\n if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target);\n });\n each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) {\n var IS_ADDER = KEY == 'add' || KEY == 'set';\n if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) {\n anInstance(this, C, KEY);\n if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;\n var result = this._c[KEY](a === 0 ? 0 : a, b);\n return IS_ADDER ? this : result;\n });\n });\n IS_WEAK || dP(C.prototype, 'size', {\n get: function () {\n return this._c.size;\n }\n });\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F, O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","var forOf = require('./_for-of');\n\nmodule.exports = function (iter, ITERATOR) {\n var result = [];\n forOf(iter, false, result.push, result, ITERATOR);\n return result;\n};\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar classof = require('./_classof');\nvar from = require('./_array-from-iterable');\nmodule.exports = function (NAME) {\n return function toJSON() {\n if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n return from(this);\n };\n};\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Map', { toJSON: require('./_collection-to-json')('Map') });\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { of: function of() {\n var length = arguments.length;\n var A = new Array(length);\n while (length--) A[length] = arguments[length];\n return new this(A);\n } });\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\nrequire('./_set-collection-of')('Map');\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar ctx = require('./_ctx');\nvar forOf = require('./_for-of');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n var mapFn = arguments[1];\n var mapping, A, n, cb;\n aFunction(this);\n mapping = mapFn !== undefined;\n if (mapping) aFunction(mapFn);\n if (source == undefined) return new this();\n A = [];\n if (mapping) {\n n = 0;\n cb = ctx(mapFn, arguments[2], 2);\n forOf(source, false, function (nextItem) {\n A.push(cb(nextItem, n++));\n });\n } else {\n forOf(source, false, A.push, A);\n }\n return new this(A);\n } });\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\nrequire('./_set-collection-from')('Map');\n","require('../modules/es6.object.to-string');\nrequire('../modules/es6.string.iterator');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.map');\nrequire('../modules/es7.map.to-json');\nrequire('../modules/es7.map.of');\nrequire('../modules/es7.map.from');\nmodule.exports = require('../modules/_core').Map;\n","module.exports = require(\"core-js/library/fn/map\");","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","require('../../modules/es6.reflect.construct');\nmodule.exports = require('../../modules/_core').Reflect.construct;\n","module.exports = require(\"core-js/library/fn/reflect/construct\");","var _Reflect$construct = require(\"../core-js/reflect/construct\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _construct(Parent, args, Class) {\n if (typeof Reflect !== \"undefined\" && _Reflect$construct) {\n module.exports = _construct = _Reflect$construct;\n } else {\n module.exports = _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Parent.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nmodule.exports = _construct;","var _Object$create = require(\"../core-js/object/create\");\n\nvar _Map = require(\"../core-js/map\");\n\nvar getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar construct = require(\"./construct\");\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof _Map === \"function\" ? new _Map() : undefined;\n\n module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {}\n\n Wrapper.prototype = _Object$create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, setPrototypeOf(function Super() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }, Class));\n };\n\n return _wrapNativeSuper(Class);\n}\n\nmodule.exports = _wrapNativeSuper;","export class CompositionError extends Error {\n constructor(classInstance, message, component) {\n super(`@${classInstance}: ${message}`);\n\n const stackArray = this.stack.split('\\n');\n stackArray.splice(1, 2);\n\n this.stack = stackArray.join('\\n');\n\n if (console) console.error('Component:', component);\n\n this.name = 'CompositionError';\n }\n}\n\nexport class DependencyError extends Error {\n constructor(classInstance, message, activeModule, dependencyModule = false) {\n super(`@${classInstance}: ${message}`);\n\n const stackArray = this.stack.split('\\n');\n stackArray.splice(1, 2);\n\n this.stack = stackArray.join('\\n');\n\n if (console) console.error('Active module:', activeModule);\n if (console && dependencyModule) console.error('Dependency published by module:', dependencyModule);\n\n this.name = 'DependencyError';\n }\n}\n\nexport class ManagerError extends Error {\n constructor(classInstance, message, component, activeModule = false) {\n super(`@${classInstance}: ${message}`);\n\n const stackArray = this.stack.split('\\n');\n stackArray.splice(1, 2);\n\n this.stack = stackArray.join('\\n');\n\n if (console) console.error('Component:', component);\n if (console && activeModule) console.error('Active module:', activeModule);\n\n this.name = 'ManagerError';\n }\n}\n","import {REVISION} from 'three';\nimport Events from 'minivents';\nimport {ManagerError} from './errors';\n\n// Check for Three.js\nconst warnDeps = () => {\n throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/');\n};\n\ntry {\n if (!REVISION) warnDeps();\n} catch (err) {\n warnDeps();\n}\n\n/**\n * @class ModuleSystem\n * @category core\n * @description Provides API for classes that will use Modules.
\n * This class includes basic event system with those supported methods:\n *
.on()
.off()
.emit()
\n * @extends Events\n * @memberof module:core\n */\nexport class ModuleSystem extends Events {\n // INTEGRATING\n\n /**\n * @method integrateModules\n * @instance\n * @description This method applies all modules from .modules collection.\n * @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules.\n * @memberof module:core.ModuleSystem\n */\n integrateModules(source) {\n if (!this.modules && !source) return;\n if (source && source.modules) this.modules = source.modules.slice(0);\n\n if (this.modules) {\n for (let i = 0, max = this.modules.length; i < max; i++)\n this.applyModule(this.modules[i], false);\n }\n\n if (source) this.applyBridge({onCopy: source});\n }\n\n // APPLYING MODULE (...and a \"bridge\" for module)\n\n /**\n * @method applyBridge\n * @instance\n * @description Makes component-specific API to work with modules.\n * @param {Object} bridgeMap\n * @return {Object} Returns object with modified values.\n * @memberof module:core.ModuleSystem\n */\n applyBridge(bridgeMap = {}) {\n const {modules} = this;\n if (!modules) return bridgeMap;\n\n for (let i = 0, max = modules.length; i < max; i++) {\n for (const key in bridgeMap) {\n if (bridgeMap[key]) {\n const module = modules[i];\n\n if (module && module.bridge && module.bridge[key])\n bridgeMap[key] = module.bridge[key].apply(this, [bridgeMap[key], module]);\n }\n }\n }\n\n return bridgeMap;\n }\n\n /**\n * @method applyCommand\n * @instance\n * @description .applyCommand runs a method called `name` on all modules.\n * @param {String} name the method name.\n * @param {Function} [cb=(func, moduleScope) => func.apply(this, [moduleScope])] How the function is wrapped/\n * @memberof module:core.ModuleSystem\n */\n applyCommand(name, cb = (func, moduleScope) => func.apply(this, [moduleScope])) {\n const {modules} = this;\n if (!modules) return;\n\n for (let i = 0, max = modules.length; i < max; i++) {\n const module = modules[i];\n if (name in module) cb(module[name], module);\n }\n }\n\n /**\n * @method applyModule\n * @instance\n * @description .applyModule is also used in .integrateModules() function.\n * It does exactly what its name says (applies module to component or app).\n * @param {Object} module the module to apply\n * @param {Boolean} [push=true]\n * @return {Object} Returns module that was applied.\n * @throws {ManagerError}\n * @memberof module:core.ModuleSystem\n */\n applyModule(module, push = true) {\n if (!module) return;\n if (push && this.modules) this.modules.push(module);\n else if (push) this.modules = [module];\n\n if (this.manager) this.manager.active(module);\n\n if (module.manager && this.manager) module.manager(this.manager);\n else if (module.manager) {\n throw new ManagerError(\n 'Component',\n `Module requires ModuleManager that is turned off for this component`,\n this, module\n );\n }\n\n if (module.integrate) module.integrate.bind(this)(module);\n\n return module;\n }\n\n /**\n * @method disposeModules\n * @instance\n * @description Disposes of all modules\n * @memberof module:core.ModuleSystem\n */\n disposeModules() {\n while (this.modules.length)\n this.disposeModule(this.modules[0]);\n }\n\n /**\n * @method disposeModule\n * @instance\n * @description Disposes of the given module\n * @param {Object} module the module to dispose\n * @return {Module} Returns module that was removed.\n * @memberof module:core.ModuleSystem\n */\n disposeModule(module) {\n if (!module) return;\n\n this.modules.splice(this.modules.indexOf(module), 1);\n\n if (module.dispose) module.dispose.bind(this)(module);\n\n return module;\n }\n\n // PIPED METHOD\n\n /**\n * @method module\n * @instance\n * @description piped version of .applyModule().\n * @param {Object} module the module to apply\n * @return {this} returns this - app/component\n * @throws {ManagerError}\n * @memberof module:core.ModuleSystem\n * @example Piped modules\n * component\n * .module(new Module1())\n * .module(new Module2())\n * .module(new Module3())\n */\n module(module) {\n this.applyModule(module);\n return this;\n }\n}\n","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","var anObject = require('./_an-object');\nvar get = require('./core.get-iterator-method');\nmodule.exports = require('./_core').getIterator = function (it) {\n var iterFn = get(it);\n if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');\n return anObject(iterFn.call(it));\n};\n","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.get-iterator');\n","module.exports = require(\"core-js/library/fn/get-iterator\");","var _getIterator = require(\"../core-js/get-iterator\");\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = _getIterator(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","export default function symbolObservablePonyfill(root) {\n\tvar result;\n\tvar Symbol = root.Symbol;\n\n\tif (typeof Symbol === 'function') {\n\t\tif (Symbol.observable) {\n\t\t\tresult = Symbol.observable;\n\t\t} else {\n\t\t\tresult = Symbol('observable');\n\t\t\tSymbol.observable = result;\n\t\t}\n\t} else {\n\t\tresult = '@@observable';\n\t}\n\n\treturn result;\n};\n","/* global window */\nimport ponyfill from './ponyfill.js';\n\nvar root;\n\nif (typeof self !== 'undefined') {\n root = self;\n} else if (typeof window !== 'undefined') {\n root = window;\n} else if (typeof global !== 'undefined') {\n root = global;\n} else if (typeof module !== 'undefined') {\n root = module;\n} else {\n root = Function('return this')();\n}\n\nvar result = ponyfill(root);\nexport default result;\n","import $$observable from 'symbol-observable';\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar ActionTypes = {\n INIT: '@@redux/INIT' + Math.random().toString(36).substring(7).split('').join('.'),\n REPLACE: '@@redux/REPLACE' + Math.random().toString(36).substring(7).split('').join('.')\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) return false;\n\n var proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error('Expected the enhancer to be a function.');\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error('Expected the reducer to be a function.');\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n function getState() {\n if (isDispatching) {\n throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error('Expected the listener to be a function.');\n }\n\n if (isDispatching) {\n throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');\n }\n\n var isSubscribed = true;\n\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');\n }\n\n isSubscribed = false;\n\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error('Actions may not have an undefined \"type\" property. ' + 'Have you misspelled a constant?');\n }\n\n if (isDispatching) {\n throw new Error('Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error('Expected the nextReducer to be a function.');\n }\n\n currentReducer = nextReducer;\n dispatch({ type: ActionTypes.REPLACE });\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if ((typeof observer === 'undefined' ? 'undefined' : _typeof(observer)) !== 'object' || observer === null) {\n throw new TypeError('Expected the observer to be an object.');\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return { unsubscribe: unsubscribe };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch({ type: ActionTypes.INIT });\n\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n}\n\nfunction getUndefinedStateErrorMessage(key, action) {\n var actionType = action && action.type;\n var actionDescription = actionType && 'action \"' + String(actionType) + '\"' || 'an action';\n\n return 'Given ' + actionDescription + ', reducer \"' + key + '\" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state. ' + 'If you want this reducer to hold no value, you can return null instead of undefined.';\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return 'The ' + argumentName + ' has unexpected type of \"' + {}.toString.call(inputState).match(/\\s([a-z|A-Z]+)/)[1] + '\". Expected argument to be an object with the following ' + ('keys: \"' + reducerKeys.join('\", \"') + '\"');\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('\"' + unexpectedKeys.join('\", \"') + '\" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('\"' + reducerKeys.join('\", \"') + '\". Unexpected keys will be ignored.');\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, { type: ActionTypes.INIT });\n\n if (typeof initialState === 'undefined') {\n throw new Error('Reducer \"' + key + '\" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined. If you don\\'t want to set a value for this reducer, ' + 'you can use null instead of undefined.');\n }\n\n var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');\n if (typeof reducer(undefined, { type: type }) === 'undefined') {\n throw new Error('Reducer \"' + key + '\" returned undefined when probed with a random type. ' + ('Don\\'t try to handle ' + ActionTypes.INIT + ' or other actions in \"redux/*\" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined, but can be null.');\n }\n });\n}\n\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning('No reducer provided for key \"' + key + '\"');\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n var finalReducerKeys = Object.keys(finalReducers);\n\n var unexpectedKeyCache = void 0;\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError = void 0;\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination() {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var action = arguments[1];\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n if (typeof nextStateForKey === 'undefined') {\n var errorMessage = getUndefinedStateErrorMessage(_key, action);\n throw new Error(errorMessage);\n }\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass a single function as the first argument,\n * and get a function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if ((typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) !== 'object' || actionCreators === null) {\n throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) + '. ' + 'Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');\n }\n\n var keys = Object.keys(actionCreators);\n var boundActionCreators = {};\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var actionCreator = actionCreators[key];\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\n\nfunction compose() {\n for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(undefined, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var store = createStore.apply(undefined, args);\n var _dispatch = function dispatch() {\n throw new Error('Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(undefined, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(undefined, chain)(store.dispatch);\n\n return _extends({}, store, {\n dispatch: _dispatch\n });\n };\n };\n}\n\n/*\n * This is a dummy function to check if the function name has been altered by minification.\n * If the function has been minified and NODE_ENV !== 'production', warn the user.\n */\nfunction isCrushed() {}\n\nif (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {\n warning(\"You are currently using minified code outside of NODE_ENV === 'production'. \" + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');\n}\n\nexport { createStore, combineReducers, bindActionCreators, applyMiddleware, compose, ActionTypes as __DO_NOT_USE__ActionTypes };\n","import {createStore} from 'redux';\nimport {DependencyError} from './errors';\n\n/**\n * @class ModuleManager\n * @category core\n * @param {Object} object handler\n * @description Solves modules dependencies\n * @memberof module:core\n */\nexport class ModuleManager {\n constructor(object) {\n this.handler = object;\n this.currentModule = null;\n\n this.store = createStore((state = [{}, ''], action) => {\n state[0][action.key] = action.data;\n state[1] = action.key;\n\n return state;\n });\n\n this.modules = {};\n }\n\n /**\n * @method active\n * @instance\n * @description Sets .currentModule to provided module.\n * @param {Object} module the module to make current\n * @memberof module:core.ModuleManager\n */\n active(module) {\n this.currentModule = module;\n }\n\n /**\n * @method reset\n * @instance\n * @description Set's .currentModule to null.\n * @memberof module:core.ModuleManager\n */\n reset() {\n this.currentModule = null;\n }\n\n /**\n * @method define\n * @instance\n * @description Define the module in manager\n * @param name The module name\n * @memberof module:core.ModuleManager\n */\n define(name) {\n this.modules[name] = this.currentModule;\n }\n\n /**\n * @method use\n * @instance\n * @description Get the defined module from manager\n * @param name The module name\n * @memberof module:core.ModuleManager\n */\n use(name) {\n return this.modules[name];\n }\n\n /**\n * @method set\n * @instance\n * @description An alias for .add()

\n * Use this method if you know that you will overwrite existing dependency.
\n * Use it in your app, but not in module that you provide to other people.\n * @param {String} key the key of the dependency\n * @param {Object} data the value of the dependency\n * @memberof module:core.ModuleManager\n */\n set(key, data) {\n this.store.dispatch({\n type: 'ADD',\n key,\n data\n });\n }\n\n /**\n * @method get\n * @instance\n * @description Returns dependency in store object, by key.\n * @param {String} key the key of the dependency\n * @memberof module:core.ModuleManager\n * @return {Object|Module}\n * @throws {DependencyError} if dependency is not in the store\n * @example Get the 'hello' dependency\n * manager.get('hello'); // -> {world: true}\n */\n get(key) {\n if (!this.store.getState()[0][key]) {\n throw new DependencyError(\n 'ModuleManager',\n `Module requires '${key}' dependency`,\n this.currentModule\n );\n }\n\n return this.store.getState()[0][key];\n }\n\n /**\n * @method has\n * @instance\n * @description Returns whether manager has a dependency with the given key\n * @param {String} key the key of the dependency\n * @memberof module:core.ModuleManager\n * @return {Boolean} Promise that is resolved when all promises completed.\n * @example Check whether the store has the 'hello' dependency\n * manager.has('hello'); // -> true\n */\n has(key) {\n return Boolean(this.store.getState()[0][key]);\n }\n\n /**\n * @method update\n * @instance\n * @description Updates deps\n * @param {Object} [depsMap={}]\n * @memberof module:core.ModuleManager\n */\n update(depsMap = {}) {\n this.store.subscribe(() => {\n const [data, changedKey] = this.store.getState();\n const callback = depsMap[changedKey];\n\n if (callback) callback(data[changedKey]);\n });\n }\n\n /**\n * @method add\n * @alias module:core.ModuleManager#set\n * @memberof module:core.ModuleManager\n */\n add(...data) {\n console.warn('.add() method is deprecated. Use .set() instead');\n return this.set(...data);\n }\n\n /**\n * @method require\n * @instance\n * @description Require module\n * @param {String} name Defined name\n * @param {Function} moduleExecutor Function that returns applied module\n * @memberof module:core.ModuleManager\n */\n require(name, moduleExecutor) {\n if (this.use(name) === undefined) this.handler.applyModule(moduleExecutor());\n }\n}\n","import {extend, transformData} from '../utils';\nimport {ModuleSystem} from './ModuleSystem';\nimport {ModuleManager} from './ModuleManager';\nimport {ManagerError, CompositionError} from './errors';\n\n/**\n * @class Component\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends ModuleSystem\n * @memberof module:core\n */\nclass Component extends ModuleSystem {\n /**\n * Default values for parameters\n * @member {Object} module:core.Component#defaults\n * @static\n * @default {\n * modules: [],\n * manager: true\n * }\n */\n static defaults = {\n modules: null,\n manager: true\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.Component#instructions\n * @static\n * @default {}\n */\n static instructions = {};\n\n /**\n * Array of promises that should be resolved before Component is ready.\n * @member {Array} module:core.Component#_wait\n * @private\n */\n _wait = []; // Collection of promises;\n\n /**\n * Collection of `modules`.\n * @member {Array} module:core.Component#modules\n * @public\n */\n modules = []; // Collection of modules;\n\n /**\n * Collection of `child` Components.\n * @member {Array} module:core.Component#children\n * @public\n */\n children = []; // For keeping children components;\n\n constructor(params = {}, defaults = Component.defaults, instructions = Component.instructions) {\n super();\n\n // Apply polyfilled parameters to .params;\n this.params = extend(transformData(params, instructions), defaults);\n if (this.params.manager) this.manager = new ModuleManager(this);\n\n this.modules = this.params.modules;\n\n this.integrateModules();\n }\n\n /**\n * @method wait\n * @instance\n * @description Wait for a promise.\n * @param {Promise} [promise] - The promise that should be added to a queue.\n * @return {Promise} Promise that is resolved when all promises completed.\n * @memberof module:core.Component\n */\n wait(promise) {\n if (promise) this._wait.push(promise);\n return Promise.all(this._wait);\n }\n\n /**\n * @method defer\n * @instance\n * @description Execute `func` (Callback) when Component is ready.\n * @param {Function} func - Callback.\n * @memberof module:core.Component\n */\n defer(func) {\n if (this.isDeffered) this.wait().then(() => func(this));\n else func(this);\n }\n\n // PARAMETERS\n\n /**\n * @method updateParams\n * @instance\n * @description Updates parameters of the Component.\n * @return {Object} Params of this Component\n * @memberof module:core.Component\n */\n updateParams(params = {}) {\n this.params = extend(params, this.params);\n return this.params;\n }\n\n // COPYING & CLONING\n\n /**\n * @method clone\n * @instance\n * @description Clone this component\n * @return {object} a cloned component with all its source component' params copied.\n * @memberof module:core.Component\n */\n clone() {\n return new this.constructor(this.params).copy(this);\n }\n\n /**\n * @method copy\n * @instance\n * @description Copy source native and integrate `modules` to it.\n * @param {Component} source - Source component that is used for `copy()` action.\n * @param {Function} [customize] - Callback executed before modules integration process.\n * @return {this} Component\n * @memberof module:core.Component\n */\n copy(source, customize) {\n this.params = {...source.params};\n\n if (source.native) this.native = source.native.clone(source.params);\n if (customize) customize();\n this.integrateModules(source);\n\n return this;\n }\n\n /**\n * @method add\n * @instance\n * @description Add a child `Component`.\n * @param {Component} object - Component that should be added as a `child`.\n * @return {Promise} Resolved when action is done.\n * @memberof module:core.Component\n */\n async add(object) {\n if (object.parent) await object.parent.remove(object);\n\n await this.wait();\n await object.wait();\n\n if (!object.native) {\n throw new CompositionError(\n 'Component',\n 'there is no object.native',\n this\n );\n }\n\n object.parent = this;\n await this.applyBridge({onAdd: object}).onAdd;\n this.native.add(object.native);\n this.children.push(object);\n\n return object;\n }\n\n /**\n * @method remove\n * @instance\n * @description Remove a child `Component`.\n * @param {Component} object - Component that should be a **child** of this Component.\n * @return {Promise} Resolved when action is done.\n * @memberof module:core.Component\n */\n async remove(object) {\n if (object.parent !== this) return;\n\n await this.wait();\n await object.wait();\n\n object.parent = null;\n this.native.remove(object.native);\n this.children.splice(this.children.indexOf(object), 1);\n }\n\n /**\n * @method addTo\n * @instance\n * @description Adds `this` Component to specified `App`/`Component`.\n * @param {Component} object - Component that will be a parent of `this`.\n * @memberof module:core.Component\n */\n addTo(object) {\n return object.add(this);\n }\n\n get(key) {\n return this.manager.get(key);\n }\n\n use(key) {\n return this.manager.use(key);\n }\n\n /**\n * Returns whether the object is `async` (`wait` promises are more than `0`).\n * @member {Boolean} module:core.Component#isDeffered\n */\n get isDeffered() {\n return this._wait.length > 0;\n }\n\n /**\n * Returns the `ModuleManager` used for this component.\n * @member {ModuleManager} module:core.Component#manager\n * @throws {ManagerError}\n */\n get manager() {\n if (this._manager) return this._manager;\n\n throw new ManagerError(\n 'Component',\n `ModuleManager is not used in this component. 'manager' parameter should be set as 'true'`,\n this\n );\n }\n\n set manager(manager) {\n this._manager = manager;\n }\n\n /**\n * Returns the `native` object used for this component.\n * @member {Object} module:core.Component#native\n */\n get native() {\n return this._native;\n }\n\n set native(mesh) {\n this._native = mesh;\n this._native.component = this;\n return this._native;\n }\n}\n\nexport {\n Component\n};\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","require('../../modules/es6.reflect.get');\nmodule.exports = require('../../modules/_core').Reflect.get;\n","module.exports = require(\"core-js/library/fn/reflect/get\");","var getPrototypeOf = require(\"./getPrototypeOf\");\n\nfunction _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n}\n\nmodule.exports = _superPropBase;","var _Object$getOwnPropertyDescriptor = require(\"../core-js/object/get-own-property-descriptor\");\n\nvar _Reflect$get = require(\"../core-js/reflect/get\");\n\nvar getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar superPropBase = require(\"./superPropBase\");\n\nfunction _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && _Reflect$get) {\n module.exports = _get = _Reflect$get;\n } else {\n module.exports = _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n\n var desc = _Object$getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}\n\nmodule.exports = _get;","export function attributes(...mappers) {\n return function (target) {\n for (let i = 0; i < mappers.length; i++) {\n const mapper = mappers[i];\n\n for (let k = 0; k < mapper.map.length; k++) {\n const attribute = mapper.map[k];\n\n Object.defineProperty(target.prototype, attribute, {\n get: mapper.getter(attribute),\n set: mapper.setter(attribute),\n configurable: mapper.configurable,\n enumerable: mapper.enumerable\n });\n }\n }\n };\n}\n\nexport function copy(...map) {\n return {\n map,\n getter(name) {\n return function () {\n return this.native[name];\n };\n },\n setter(name) {\n return function (value) {\n this.native[name].copy(value);\n };\n },\n configurable: true,\n enumerable: true\n };\n}\n\nexport function mirror(...map) {\n return {\n map,\n getter(name) {\n return function () {\n return this.native[name];\n };\n },\n setter(name) {\n return function (value) {\n this.native[name] = value;\n };\n },\n configurable: true,\n enumerable: true\n };\n}\n","import {Mesh} from 'three';\nimport {Component} from './Component';\n\nimport {attributes, copy, mirror} from './prototype/attributes';\nimport {CompositionError} from './errors';\n\n@attributes(\n copy('position', 'rotation', 'quaternion', 'scale'),\n mirror('material', 'geometry')\n)\n/**\n * @class MeshComponent\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends module:core.Component\n * @memberof module:core\n */\nclass MeshComponent extends Component {\n /**\n * Default values for parameters\n * @member {Object} module:core.MeshComponent#defaults\n * @static\n * @default\n * {\n * build: true,\n * geometry: {},\n * material: false,\n *\n * shadow: {\n * cast: true,\n * receive: true\n * },\n *\n * position: {x: 0, y: 0, z: 0},\n * rotation: {x: 0, y: 0, z: 0},\n * scale: {x: 1, y: 1, z: 1}\n * }\n */\n static defaults = {\n ...Component.defaults,\n\n build: true,\n geometry: {},\n material: false,\n\n shadow: {\n cast: true,\n receive: true\n },\n\n position: {x: 0, y: 0, z: 0},\n rotation: {x: 0, y: 0, z: 0},\n scale: {x: 1, y: 1, z: 1}\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.MeshComponent#instructions\n * @static\n * @default\n * {\n * position: ['x', 'y', 'z'],\n * rotation: ['x', 'y', 'z'],\n * scale: ['x', 'y', 'z']\n * }\n */\n static instructions = {\n position: ['x', 'y', 'z'],\n rotation: ['x', 'y', 'z'],\n scale: ['x', 'y', 'z']\n };\n\n // CUSTOM GEOMETRY HANDLING\n\n static custom(geom, constructor = Mesh) {\n return class extends MeshComponent {\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: geom,\n material: params.material\n });\n\n return this.applyBridge({mesh: new constructor(geometry, material)}).mesh;\n }\n };\n }\n\n static create(geom, params, constructor) {\n return new (MeshComponent.custom(geom, constructor))(params);\n }\n\n static from(mesh, params = {}) {\n params.build = false;\n\n const component = new MeshComponent(params);\n\n component.native = mesh;\n component.wrap();\n\n return component;\n }\n\n constructor(params, defaults = MeshComponent.defaults, instructions = MeshComponent.instructions) {\n super(params, defaults, instructions);\n\n if (this.params.build) {\n const build = this.build(this.params);\n\n if (!build) {\n throw new CompositionError(\n 'MeshComponent',\n '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',\n this\n );\n }\n\n if (build instanceof Promise) {\n this.wait(build);\n\n this.wait(new Promise(resolve => {\n build.then(native => {\n this.native = native;\n this.wrap().then(resolve);\n });\n }));\n } else {\n this.native = build;\n this.wait(this.wrap());\n }\n }\n\n this.applyCommand('postIntegrate');\n }\n\n // BUILDING & WRAPPING\n\n /**\n * @method build\n * @description Build livecycle should return a native object.\n * @throws {CompositionError}\n * @memberof module:core.MeshComponent\n */\n build() {\n throw new CompositionError(\n 'MeshComponent',\n 'Instance should have it\\'s own .build().',\n this\n );\n }\n\n /**\n * @method wrap\n * @instance\n * @description Wraps transforms (`position` & `rotation`)\n * @return {Promise} Resolved when action is completed\n * @memberof module:core.MeshComponent\n */\n wrap() {\n return new Promise(resolve => {\n // TODO: Fix defer with physics\n // this.defer(() => {\n const {position, rotation, scale, shadow} = this.params;\n\n this.position.set(position.x, position.y, position.z);\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n this.scale.set(scale.x, scale.y, scale.z);\n\n this.native.castShadow = shadow.cast;\n this.native.receiveShadow = shadow.receive;\n\n this.applyBridge({onWrap: 1});\n\n resolve(this);\n // });\n });\n }\n\n // COPYING & CLONING\n\n /**\n * @method copy\n * @instance\n * @description Copy source transforms & execute `Component.copy()`\n * @return {this} MeshComponent\n * @memberof module:core.MeshComponent\n */\n copy(source) {\n return super.copy(source, () => {\n this.position.copy(source.position);\n this.rotation.copy(source.rotation);\n this.quaternion.copy(source.quaternion);\n });\n }\n\n /**\n * @method clone\n * @instance\n * @description Make a clone of this MeshComponent using `.copy()`\n * @return {MeshComponent} clone of this object\n * @memberof module:core.MeshComponent\n */\n clone(geometry, material) {\n const dest = new this.constructor({build: false}).copy(this);\n\n if (geometry) dest.geometry = dest.geometry.clone();\n if (material) dest.material = dest.material.clone();\n\n return dest;\n }\n}\n\nexport {\n MeshComponent\n};\n","import {Component} from './Component';\n\nimport {attributes, copy} from './prototype/attributes';\nimport {CompositionError} from './errors';\n\n@attributes(\n copy('position', 'rotation', 'quaternion', 'target')\n)\n/**\n * @class LightComponent\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends module:core.Component\n * @memberof module:core\n */\nclass LightComponent extends Component {\n /**\n * Default values for parameters\n * @member {Object} module:core.LightComponent#defaults\n * @static\n * @default\n * {\n * build: true,\n *\n * shadow: {\n * cast: true,\n *\n * bias: 0,\n * radius: 1,\n *\n * mapSize: {\n * width: 1024,\n * height: 1024\n * },\n *\n * camera: {\n * near: true,\n * far: 400,\n * fov: 90,\n *\n * top: 200,\n * bottom: -200,\n * left: -200,\n * right: 200\n * }\n * },\n *\n * position: {x: 0, y: 0, z: 0},\n * rotation: {x: 0, y: 0, z: 0}\n * }\n */\n static defaults = {\n ...Component.defaults,\n\n build: true,\n\n shadow: {\n cast: true,\n\n bias: 0,\n radius: 1,\n\n mapSize: {\n width: 1024,\n height: 1024\n },\n\n camera: {\n near: true,\n far: 400,\n fov: 90,\n\n top: 200,\n bottom: -200,\n left: -200,\n right: 200\n }\n },\n\n position: {x: 0, y: 0, z: 0},\n rotation: {x: 0, y: 0, z: 0}\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.LightComponent#instructions\n * @static\n * @default\n * {\n * position: ['x', 'y', 'z'],\n * rotation: ['x', 'y', 'z']\n * }\n */\n static instructions = {\n position: ['x', 'y', 'z'],\n rotation: ['x', 'y', 'z']\n };\n\n static from(light, params = {}, wrapShadow = true) {\n params.build = false;\n\n const component = new LightComponent(params);\n\n component.native = light;\n component.wrap();\n if (wrapShadow) component.wrapShadow();\n\n return component;\n }\n\n constructor(params, defaults = LightComponent.defaults, instructions = LightComponent.instructions) {\n super(params, defaults, instructions);\n\n if (this.params.build) {\n const build = this.build(this.params);\n\n if (!build) {\n throw new CompositionError(\n 'LightComponent',\n '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',\n this\n );\n }\n\n if (build instanceof Promise) {\n build.then(native => {\n this.native = native;\n });\n } else this.native = build;\n\n this.wait(this.wrap());\n }\n\n this.applyCommand('postIntegrate');\n }\n\n // BUILDING & WRAPPING\n\n /**\n * @method build\n * @instance\n * @description Build livecycle should return a native object.\n * @throws {CompositionError}\n * @memberof module:core.LightComponent\n */\n build() {\n throw new CompositionError(\n 'MeshComponent',\n 'Instance should have it\\'s own .build().',\n this\n );\n }\n\n /**\n * @method wrap\n * @instance\n * @description Wraps transforms (`position` & `rotation`)\n * @return {Promise} Resolved when action is completed\n * @memberof module:core.LightComponent\n */\n wrap() {\n return new Promise(resolve => {\n this.defer(() => {\n const {position, rotation} = this.params;\n\n this.position.set(position.x, position.y, position.z);\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n\n this.applyBridge({onWrap: 1});\n\n resolve(this);\n });\n });\n }\n\n /**\n * @method wrapShadow\n * @instance\n * @description Wraps shadow properties\n * @memberof module:core.LightComponent\n */\n wrapShadow() {\n const {native, params: {shadow}} = this;\n\n native.castShadow = shadow.cast;\n native.shadow.mapSize.width = shadow.mapSize.width;\n native.shadow.mapSize.height = shadow.mapSize.height;\n native.shadow.bias = shadow.bias;\n native.shadow.radius = shadow.radius;\n\n const shadowCamera = native.shadow.camera;\n const {camera} = shadow;\n\n shadowCamera.near = camera.near;\n shadowCamera.far = camera.far;\n shadowCamera.fov = camera.fov;\n\n shadowCamera.left = camera.left;\n shadowCamera.right = camera.right;\n shadowCamera.top = camera.top;\n shadowCamera.bottom = camera.bottom;\n }\n\n // COPYING & CLONING\n\n /**\n * @method copy\n * @instance\n * @description Copy source transforms & execute `Component.copy()`\n * @return {this} LightComponent\n * @memberof module:core.LightComponent\n */\n copy(source) {\n return super.copy(source, () => {\n if (this.target) this.target.copy(source.target());\n\n this.position.copy(source.position);\n this.rotation.copy(source.rotation);\n this.quaternion.copy(source.quaternion);\n });\n }\n\n /**\n * @method clone\n * @instance\n * @description Make a clone of this LightComponent using `.copy()`\n * @return {LightComponent} clone of this object\n * @memberof module:core.LightComponent\n */\n clone() {\n return new this.constructor({build: false}).copy(this);\n }\n}\n\nexport {\n LightComponent\n};\n","import {Component} from './Component';\n\nimport {attributes, copy} from './prototype/attributes';\nimport {CompositionError} from './errors';\n\n@attributes(\n copy('position', 'rotation', 'quaternion', 'target')\n)\n/**\n * @class CameraComponent\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends module:core.Component\n * @memberof module:core\n */\nclass CameraComponent extends Component {\n /**\n * Default values for parameters\n * @member {Object} module:core.CameraComponent#defaults\n * @static\n * @default\n * {\n * build: true,\n *\n * position: {x: 0, y: 0, z: 0},\n * rotation: {x: 0, y: 0, z: 0}\n * }\n */\n static defaults = {\n ...Component.defaults,\n\n build: true,\n\n position: {x: 0, y: 0, z: 0},\n rotation: {x: 0, y: 0, z: 0}\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.CameraComponent#instructions\n * @static\n * @default\n * {\n * position: ['x', 'y', 'z'],\n * rotation: ['x', 'y', 'z'],\n * scale: ['x', 'y', 'z']\n * }\n */\n static instructions = {\n position: ['x', 'y', 'z'],\n rotation: ['x', 'y', 'z'],\n scale: ['x', 'y', 'z']\n };\n\n static from(camera, params = {}) {\n params.build = false;\n\n const component = new CameraComponent(params);\n\n component.native = camera;\n component.wrap();\n\n return component;\n }\n\n constructor(params, defaults = CameraComponent.defaults, instructions = CameraComponent.instructions) {\n super(params, defaults, instructions);\n\n if (this.params.build) {\n const build = this.build(this.params);\n\n if (!build) {\n throw new CompositionError(\n 'CameraComponent',\n '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',\n this\n );\n }\n\n if (build instanceof Promise) {\n build.then(native => {\n this.native = native;\n });\n } else this.native = build;\n\n this.wait(this.wrap());\n }\n\n this.applyCommand('postIntegrate');\n }\n\n // BUILDING & WRAPPING\n\n /**\n * @method build\n * @instance\n * @description Build livecycle should return a native object.\n * @throws {CompositionError}\n * @memberof module:core.CameraComponent\n */\n build() {\n throw new CompositionError(\n 'CameraComponent',\n 'Instance should have it\\'s own .build().',\n this\n );\n }\n\n /**\n * @method wrap\n * @instance\n * @description Wraps transforms (`position` & `rotation`)\n * @return {Promise} Resolved when action is completed\n * @memberof module:core.CameraComponent\n */\n wrap() {\n return new Promise(resolve => {\n this.defer(() => {\n this.position.set(this.params.position.x, this.params.position.y, this.params.position.z);\n this.rotation.set(this.params.rotation.x, this.params.rotation.y, this.params.rotation.z);\n\n this.applyBridge({onWrap: 1});\n\n resolve(this);\n });\n });\n }\n\n /**\n * @method copy\n * @instance\n * @description Copy source transforms & execute `Component.copy()`\n * @return {this} CameraComponent\n * @memberof module:core.CameraComponent\n */\n copy(source) {\n return super.copy(source, () => {\n if (this.target) this.target.copy(source.target());\n\n this.position.copy(source.position);\n this.rotation.copy(source.rotation);\n this.quaternion.copy(source.quaternion);\n });\n }\n\n /**\n * @method clone\n * @instance\n * @description Make a clone of this CameraComponent using `.copy()`\n * @return {CameraComponent} clone of this object\n * @memberof module:core.CameraComponent\n */\n clone() {\n return new this.constructor({build: false}).copy(this);\n }\n}\n\nexport {\n CameraComponent\n};\n","export const system = {\n window: typeof window === 'undefined' ? global : window\n};\n","import {version} from '../../package.json';\nimport {system} from '../polyfill';\nimport {ModuleSystem} from './ModuleSystem';\nimport {ModuleManager} from './ModuleManager';\n\n/**\n * @class App\n * @category core\n * @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes.\n * @param {Array} [modules=[]] - Array of Modules\n * @extends ModuleSystem\n * @memberof module:core\n */\nclass App extends ModuleSystem {\n /**\n * @description Defines whether the scene should render or not\n * @member {Boolean} module:core.App#enabled\n * @public\n */\n enabled = true;\n\n /**\n * Loops in this app\n * @description Array of loops that are executed by this app.\n * @member {Array} module:core.App#loops\n * @public\n */\n loops = [];\n\n constructor(modules = []) {\n console.log(`WHS.App ${version}`);\n\n super();\n this.manager = new ModuleManager(this);\n this.modules = modules;\n\n this.integrateModules();\n }\n\n // CONTROLS & UPDATING\n\n /**\n * @method start\n * @description Start rendering loop and physics simulation (if you use version with physics).\n * @memberof module:core.App\n */\n start() {\n const requestAnimFrame = (() => {\n return system.window.requestAnimationFrame\n || system.window.webkitRequestAnimationFrame\n || system.window.mozRequestAnimationFrame\n || function (callback) {\n system.window.setTimeout(callback, 1000 / 60);\n };\n })();\n\n const {loops, enabled} = this;\n\n function process() {\n requestAnimFrame(process);\n if (!enabled) return;\n\n for (let i = 0, ll = loops.length; i < ll; i++) {\n const e = loops[i];\n if (e.enabled) e.execute(e.clock);\n }\n }\n\n this.enabled = true;\n process();\n }\n\n /**\n * @method stop\n * @description Stops rendering loops\n * @memberof module:core.App\n */\n stop() {\n this.enabled = false;\n }\n\n /**\n * @method addLoop\n * @description Adds loop to this app.\n * @param {Object} loop - the loop to add\n * @return {Promise} Promise that is resolved when promises completed.\n * @memberof module:core.App\n * @example Adding a loop to an app\n * const loop = new Loop(() => {\n * // ...\n * });\n *\n * const app = new App();\n *\n * app.addLoop(loop);\n * loop.start();\n */\n addLoop(loop) {\n return new Promise(resolve => {\n this.loops.push(loop);\n resolve(loop);\n });\n }\n\n /**\n * @method removeLoop\n * @description Removes loop from this app.\n * @param {Object} loop - the loop to remove\n * @return {Promise} Promise that is resolved when promises completed.\n * @memberof module:core.App\n */\n removeLoop(loop) {\n return new Promise(resolve => {\n const index = this.loops.indexOf(loop);\n if (index !== -1) this.loops.splice(index, 1);\n\n resolve(loop);\n });\n }\n\n get(key) {\n return this.manager.get(key);\n }\n\n use(key) {\n return this.manager.use(key);\n }\n}\n\nexport {\n App\n};\n","import {Clock} from 'three';\n\n/**\n * @class Loop\n * @category core\n * @param {Function} func function to execute on each animation frame\n * @param {Boolean} [useClock=true] passes a Clock to the function when called, if true\n * @memberof module:core\n */\nclass Loop {\n constructor(func, useClock = true) {\n this.func = func;\n this.clock = useClock ? new Clock() : null;\n this.enabled = false;\n }\n\n // CONTROLS\n\n /**\n * @method start\n * @instance\n * @description Starts this loop, clock if it has one. Won't do anything if loop enabled already.\n * @param {Component} [world] app to add this loop to, if provided.\n * @memberof module:core.Loop\n */\n start(world) {\n if (this.enabled) return;\n\n if (world) world.addLoop(this);\n\n if (this.clock) this.clock.start();\n this.enabled = true;\n }\n\n /**\n * @method stop\n * @instance\n * @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled)\n * @param {Component} [world] app to remove this loop from, if provided.\n * @memberof module:core.Loop\n */\n stop(world) {\n if (!this.enabled) return;\n\n if (this.clock) this.clock.stop();\n this.enabled = false;\n\n if (world) world.removeLoop(this);\n }\n\n // EXECUTION\n\n /**\n * @method execute\n * @instance\n * @description Executes the function of this loop\n * @memberof module:core.Loop\n * @returns {*} whatever the function of this loop returns\n */\n execute() {\n return this.func(this.clock);\n }\n}\n\nexport {\n Loop\n};\n","/** @module core */\nexport * from './Component';\nexport * from './MeshComponent';\nexport * from './LightComponent';\nexport * from './CameraComponent';\nexport * from './App';\nexport * from './Loop';\nexport * from './ModuleManager';\n","import {AmbientLight as AmbientLightNative} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class AmbientLight\n * @category components/lights\n * @description AmbientLight is a simple class, it extends Light and inherits all its methods.\n * AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target.\n * It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light.\n * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating an AmbientLight \n * new AmbientLight({\n * color: 0xffffff,\n * intensity: 0.2\n * }).addTo(world);\n */\nclass AmbientLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1\n };\n\n constructor(params = {}) {\n super(params, AmbientLight.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({light: new AmbientLightNative(\n params.color,\n params.intensity\n )}).light;\n }\n}\n\nexport {\n AmbientLight\n};\n","import {DirectionalLight as DirectionalLightNative, DirectionalLightHelper} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class DirectionalLight\n * @category components/lights\n * @description DirectinalLight creates a light that shines from a specific direction not from a specific position.

\n * This light will behave as though it is infinitely far away and the rays produced from it are all parallel.

\n * The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.

\n * It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters.\n * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0)\n * new DirectionalLight({\n * color: 0xffffff,\n * intensity: 0.2,\n *\n * position: [10, 20, 10]\n * }).addTo(app);\n */\nclass DirectionalLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1\n };\n\n constructor(params = {}) {\n super(params, DirectionalLight.defaults);\n this.wrapShadow();\n }\n\n build(params = {}) {\n return this.applyBridge({light: new DirectionalLightNative(\n params.color,\n params.intensity\n )}).light;\n }\n}\n\nexport {\n DirectionalLight\n};\n","import {HemisphereLight as HemisphereLightNative, HemisphereLightHelper} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class HemisphereLight\n * @category components/lights\n * @description HemisphereLight is a light source positioned directly above the scene.
\n * It also doesn't need position and target properties.\n * @classDesc\n * \n * @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating a HemisphereLight\n * new HemisphereLight({\n * skyColor: 0xff0000,\n * groundColor: 0x0000ff,\n * intensity: 0.2\n * }).addTo(app);\n */\nclass HemisphereLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n skyColor: 0xffffff,\n groundColor: 0xffffff,\n intensity: 1\n }\n\n constructor(params = {}) {\n super(params, HemisphereLight.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({light: new HemisphereLightNative(\n params.skyColor,\n params.groundColor,\n params.intensity\n )}).light;\n }\n}\n\nexport {\n HemisphereLight\n};\n","import {PointLight as PointLightNative, PointLightHelper} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class PointLight\n * @category components/lights\n * @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)

\n * It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.
\n * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params.\n * @extends LightComponent\n * @memberof module:components/lights\n * @example Creating a PointLight\n * new PointLight( {\n * color: 0xff0000,\n * intensity: 2,\n * distance: 300\n *\n * position: [10, 20, 10]\n * }).addTo(app);\n */\nclass PointLight extends LightComponent {\n static defaults= {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1,\n distance: 100,\n decay: 1\n }\n\n constructor(params = {}) {\n super(params, PointLight.defaults);\n this.wrapShadow();\n }\n\n build(params = {}) {\n return this.applyBridge({light: new PointLightNative(\n params.color,\n params.intensity,\n params.distance,\n params.decay\n )}).light;\n }\n}\n\nexport {\n PointLight\n};\n","import {SpotLight as SpotLightNative} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class SpotLight\n * @category components/lights\n * @description SpotLight creates spot light that can cast shadow in one direction.

\n * It has the same parameters as AmbientLight in light, but it also supports pos and target.

\n * SpotLight affects meshes with lambert and phong material.\n * @classDesc\n * \n * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0)\n * new SpotLight({\n * color: 0x00ff00,\n * intensity: 3,\n * distance: 1000\n *\n * position: [10, 20, 10]\n * }).addTo(app);\n */\nclass SpotLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1,\n distance: 100,\n angle: Math.PI / 3,\n exponent: 0,\n decay: 1\n };\n\n constructor(params = {}) {\n super(params, SpotLight.defaults);\n this.wrapShadow();\n }\n\n build(params = {}) {\n return this.applyBridge({light: new SpotLightNative(\n params.color,\n params.intensity,\n params.distance,\n params.angle,\n params.exponent,\n params.decay\n )}).light;\n }\n}\n\nexport {\n SpotLight\n};\n","import {RectAreaLight as RectAreaLightNative} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\nclass AreaLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1,\n width: 10,\n height: 10\n };\n\n constructor(params = {}) {\n super(params, AreaLight.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({light: new RectAreaLightNative(\n params.color,\n params.intensity,\n params.width,\n params.height\n )}).light;\n }\n}\n\nexport {\n AreaLight\n};\n","/** @module components/lights */\nexport * from './AmbientLight';\nexport * from './DirectionalLight';\nexport * from './HemisphereLight';\nexport * from './PointLight';\nexport * from './SpotLight';\nexport * from './AreaLight';\n","import {CubeCamera as CubeCameraNative} from 'three';\nimport {CameraComponent} from '../../core/CameraComponent';\n\n/**\n * @class CubeCamera\n * @category components/cameras\n * @description Creates 6 cameras that render to a WebGLRenderTargetCube\n * @param {Object} [params] - The parameters object.\n * @memberof module:components/cameras\n * @extends module:core.CameraComponent\n * @example Creates a CubeCamera and set it as app's camera\n * const camera = new CubeCamera({\n * camera: {\n * cubeResolution: 256\n * },\n *\n * position: {\n * x: 0,\n * y: 100,\n * z: 0\n * }\n * });\n *\n * app.camera = camera;\n */\nclass CubeCamera extends CameraComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/cameras.CubeCamera#defaults\n * @static\n * @default
\n   * {\n   *   camera: {\n   *     near: 1,\n   *     far: 1000,\n   *     cubeResolution: 128\n   *   }\n   * }
\n */\n static defaults = {\n ...CameraComponent.defaults,\n\n near: 1,\n far: 1000,\n cubeResolution: 128\n };\n\n constructor(params = {}) {\n super(params, CubeCamera.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({camera: new CubeCameraNative(\n params.near,\n params.far,\n params.cubeResolution\n )}).camera;\n }\n}\n\nexport {\n CubeCamera\n};\n","import {OrthographicCamera as OrthographicCameraNative} from 'three';\nimport {CameraComponent} from '../../core/CameraComponent';\nimport {system} from '../../polyfill';\n\n/**\n * @class OrthographicCamera\n * @category components/cameras\n * @description Camera with orthographic projection.\n * @param {Object} [params] - The parameters object.\n * @memberof module:components/cameras\n * @extends module:core.CameraComponent\n * @example Create an OrthographicCamera and set it as app's camera\n * const camera = new OrthographicCamera({\n * camera: {\n * far: 10000\n * },\n *\n * position: {\n * y: 50\n * }\n * });\n *\n * app.camera = camera;\n */\nclass OrthographicCamera extends CameraComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/cameras.OrthographicCamera#defaults\n * @static\n * @default
\n   * {\n   *   near: 1,\n   *   far: 1000,\n   *   left: system.window.innerWidth / -2,\n   *   right: system.window.innerWidth / 2,\n   *   top: system.window.innerHeight / 2,\n   *   bottom: system.window.innerHeight / -2\n   * }
\n */\n static defaults = {\n ...CameraComponent.defaults,\n\n near: 1,\n far: 1000,\n left: system.window.innerWidth / -2,\n right: system.window.innerWidth / 2,\n top: system.window.innerHeight / 2,\n bottom: system.window.innerHeight / -2\n };\n\n constructor(params = {}) {\n super(params, OrthographicCamera.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({camera: new OrthographicCameraNative(\n params.left,\n params.right,\n params.top,\n params.bottom,\n params.near,\n params.far\n )}).camera;\n }\n}\n\nexport {\n OrthographicCamera\n};\n","import {PerspectiveCamera as PerspectiveCameraNative} from 'three';\nimport {CameraComponent} from '../../core/CameraComponent';\nimport {system} from '../../polyfill';\n\n/**\n * @class PerspectiveCamera\n * @description Camera with perspective projection.\n * @category components/cameras\n * @param {Object} [params] - The parameters object.\n * @memberof module:components/cameras\n * @extends module:core.CameraComponent\n * @example Create an PerspectiveCamera and set it as app's camera\n * const camera = new PerspectiveCamera({\n * fov: 75,\n * aspect: window.innerWidth / window.innerHeight,\n *\n * position: {\n * x: 0,\n * y: 100,\n * z: 0\n * }\n * });\n *\n * app.camera = camera;\n */\nclass PerspectiveCamera extends CameraComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/cameras.PerspectiveCamera#defaults\n * @static\n * @default
\n   * {\n   *   near: 1,\n   *   far: 1000,\n   *   fov: 75,\n   *   aspect: system.window.innerWidth / system.window.innerHeight\n   * }
\n */\n static defaults = {\n ...CameraComponent.defaults,\n\n near: 1,\n far: 1000,\n fov: 75,\n aspect: system.window.innerWidth / system.window.innerHeight\n };\n\n constructor(params = {}) {\n super(params, PerspectiveCamera.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({camera: new PerspectiveCameraNative(\n params.fov,\n params.aspect,\n params.near,\n params.far\n )}).camera;\n }\n}\n\nexport {\n PerspectiveCamera\n};\n","/** @module components/cameras */\nexport * from './CubeCamera';\nexport * from './OrthographicCamera';\nexport * from './PerspectiveCamera';\n","import {\n Mesh,\n BoxBufferGeometry,\n BoxGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Box\n * @category components/meshes\n * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to\n * pass specific parameters to build this mesh as a geometry object.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Box, and adding to app\n * new Box({\n * geometry: {\n * width: 2,\n * height: 2,\n * depth: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [50, 60, 70]\n * }).addTo(app);\n */\nclass Box extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Box#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     width: 1,\n   *     height: 1,\n   *     depth: 1,\n   *     widthSegments: 1,\n   *     heightSegments: 1,\n   *     depthSegments: 1\n   *   }\n   * }
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n width: 1,\n height: 1,\n depth: 1,\n widthSegments: 1,\n heightSegments: 1,\n depthSegments: 1\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Box#instructions\n * @static\n * @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements']\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements']\n };\n\n constructor(params = {}) {\n super(params, Box.defaults, Box.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Box\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? BoxBufferGeometry : BoxGeometry)(\n params.geometry.width,\n params.geometry.height,\n params.geometry.depth,\n params.geometry.widthSegments,\n params.geometry.heightSegments,\n params.geometry.depthSegments\n );\n\n return geometry;\n }\n}\n\nexport {\n Box\n};\n","import {\n Mesh,\n CircleBufferGeometry,\n CircleGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Circle\n * @category components/meshes\n * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to\n * pass specific parameters to build this mesh as a geometry object.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Circle, and adding to app\n * new Circle({\n * geometry: {\n * radius: 4,\n * segments: 16\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [50, 60, 70]\n * }).addTo(app);\n */\nclass Circle extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Circle#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 50,\n   *     segments: 8,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }
\n */\n static defaults = {\n ...MeshComponent.defaults,\n\n geometry: {\n radius: 50,\n segments: 8,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Circle#instructions\n * @static\n * @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength']\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'segments', 'thetaStart', 'thetaLength']\n };\n\n constructor(params = {}) {\n super(params, Circle.defaults, Circle.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Circle\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? CircleBufferGeometry : CircleGeometry)(\n params.geometry.radius,\n params.geometry.segments,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n\n return geometry;\n }\n}\n\nexport {\n Circle\n};\n","import {\n Mesh,\n ConeBufferGeometry,\n ConeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Cone\n * @category components/meshes\n * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

\n * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
\n * The surface area and the volume of a cylinder have been known since deep antiquity.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Cone, and adding to app\n * new Cone({\n * geometry: {\n * radiusTop: 2,\n * radiusBottom: 4,\n * height: 5\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * pos: [0, 100, 0]\n * }).addTo(app);\n */\nclass Cone extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Cone#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 20,\n   *     height: 100,\n   *     radiusSegments: 32,\n   *     heightSegments: 1,\n   *     openEnded: false,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }
\n */\n static defaults = {\n ...MeshComponent.defaults,\n\n geometry: {\n radius: 20,\n height: 100,\n radiusSegments: 32,\n heightSegments: 1,\n openEnded: false,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Cone#instructions\n * @static\n * @default
\n   * geometry: [\n   *   'radius',\n   *   'height',\n   *   'radiusSegments',\n   *   'heightSegments',\n   *   'openEnded',\n   *   'thetaStart',\n   *   'thetaLength'\n   * ]\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radius',\n 'height',\n 'radiusSegments',\n 'heightSegments',\n 'openEnded',\n 'thetaStart',\n 'thetaLength'\n ]\n };\n\n constructor(params = {}) {\n super(params, Cone.defaults, Cone.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Cone\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? ConeBufferGeometry : ConeGeometry)(\n params.geometry.radius,\n params.geometry.height,\n params.geometry.radiusSegments,\n params.geometry.heightSegments,\n params.geometry.openEnded,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n\n return geometry;\n }\n}\n\nexport {\n Cone\n};\n","import {\n Mesh,\n CylinderBufferGeometry,\n CylinderGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Cylinder\n * @category components/meshes\n * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

\n * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
\n * The surface area and the volume of a cylinder have been known since deep antiquity.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Cylinder, and adding to app\n * new Cylinder({\n * geometry: {\n * radiusTop: 2,\n * radiusBottom: 4,\n * height: 5\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * pos: [0, 100, 0]\n * }).addTo(app);\n */\nclass Cylinder extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Cylinder#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radiusTop: 20,\n   *     radiusBottom: 20,\n   *     height: 100,\n   *     radiusSegments: 32,\n   *     heightSegments: 1,\n   *     openEnded: false,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radiusTop: 0,\n radiusBottom: 1,\n height: 1,\n radiusSegments: 32,\n heightSegments: 1,\n openEnded: false,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Cylinder#instructions\n * @static\n * @default
\n   * geometry: [\n   *   'radiusTop',\n   *   'radiusBottom',\n   *   'height',\n   *   'radiusSegments',\n   *   'heightSegments',\n   *   'openEnded',\n   *   'thetaStart',\n   *   'thetaLength'\n   * ]\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radiusTop',\n 'radiusBottom',\n 'height',\n 'radiusSegments',\n 'heightSegments',\n 'openEnded',\n 'thetaStart',\n 'thetaLength'\n ]\n };\n\n constructor(params = {}) {\n super(params, Cylinder.defaults, Cylinder.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Cylinder\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? CylinderBufferGeometry : CylinderGeometry)(\n params.geometry.radiusTop,\n params.geometry.radiusBottom,\n params.geometry.height,\n params.geometry.radiusSegments,\n params.geometry.heightSegments,\n params.geometry.openEnded,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n\n return geometry;\n }\n}\n\nexport {\n Cylinder\n};\n","import {\n Mesh,\n DodecahedronBufferGeometry,\n DodecahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Dodecahedron\n * @category components/meshes\n * @description In geometry, a dodecahedron is any polyhedron with twelve flat faces.

\n * The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid.
\n * There are also three regular star dodecahedra, which are constructed as stellations of the convex form.
\n * All of these have icosahedral symmetry, order 120.\n * Dodecahedron creates Dodecahedron object by it's radius and detail.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Dodecahedron, and adding to app\n * new Dodecahedron({\n * geometry: {\n * radius: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * y: 10\n * }\n * }).addTo(app);\n */\nclass Dodecahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Dodecahedron#defaults\n * @static\n * @default
\n   * geometry: {\n   *   radius: 1,\n   *   detail: 0\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Dodecahedron#instructions\n * @static\n * @default
\n   * geometry: ['radius', 'detail']\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Dodecahedron.defaults, Dodecahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Dodecahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? DodecahedronBufferGeometry : DodecahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Dodecahedron\n};\n","import {\n Mesh,\n BufferGeometry,\n ExtrudeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Extrude\n * @category components/meshes\n * @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on THREE.Vector2.
\n * Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.

\n * You can also find some interesting examples made using three.js which is a core of whs.js, such as:\n * - Webgl geometry extrude\n * - Extrude shapes from geodata\n * - Extrude splines\n *\n * Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with THREE.Shape to get extrude effect of shape defined by 2D vectors.\n * This class is similar to THREE.ExtrudeGeometry,\n * but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot).\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a shape, then an Extrude from it\n * const shape = new THREE.Shape([\n * new THREE.Vector2(-4,-4),\n * new THREE.Vector2(-2,0),\n * new THREE.Vector2(-4,4),\n * new THREE.Vector2(0,2),\n * new THREE.Vector2(4,4),\n * new THREE.Vector2(2,0),\n * new THREE.Vector2(4,-4),\n * new THREE.Vector2(0,-2)\n * ]);\n *\n * const extrude = new Extrude({\n * geometry: {\n * shapes: shape,\n * options: {\n * bevelEnabled: false,\n * bevelSize: 0,\n * amount: 2\n * }\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * });\n *\n * extrude.addTo(app);\n */\nclass Extrude extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Extrude#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     shapes: [],\n   *     options: {}\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n shapes: [],\n options: {}\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Extrude#instructions\n * @static\n * @default
\n   * {\n   *   geometry: ['shapes', 'options']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['shapes', 'options']\n };\n\n constructor(params = {}) {\n super(params, Extrude.defaults, Extrude.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Extrude\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new ExtrudeGeometry(\n params.geometry.shapes,\n params.geometry.options\n );\n\n return params.buffer ? new BufferGeometry().fromGeometry(geometry) : geometry;\n }\n}\n\nexport {\n Extrude\n};\n","import {\n Mesh,\n IcosahedronBufferGeometry,\n IcosahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Icosahedron\n * @category components/meshes\n * @description In geometry, an icosahedron is a polyhedron with 20 faces.
\n * There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.
\n * `Icosahedron` creates an Icosahedron object by its radius and detail.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Icosahedron, and adding to app\n * new Icosahedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Icosahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Icosahedron#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     detail: 0\n   *   }\n   * }
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Icosahedron#instructions\n * @static\n * @default {geometry: ['radius', 'detail']}\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Icosahedron.defaults, Icosahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Icosahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? IcosahedronBufferGeometry : IcosahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Icosahedron\n};\n","import {\n Mesh,\n LatheBufferGeometry,\n LatheGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Lathe\n * @category components/meshes\n * @description A `LatheGeometry` allows you to create shapes from a smooth curve.\n * This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.

\n * In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis.\n * The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees.\n * The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry.

\n * The following example shows a geometry which can be generated using `Lathe` class.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Lath, and adding to app\n * const points = [];\n *\n * for (let i = 0; i < 10; i++) {\n * points.push(\n * new THREE.Vector2(\n * (Math.sin(i * 0.7) * 15 + 50) / 10,\n * (i - 5) * 0.2\n * )\n * );\n * }\n *\n * const lathe = new Lathe({\n * geometry: {\n * points: points\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 50, 10]\n * }).addTo(app);\n */\nclass Lathe extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Lathe#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     points: []\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n points: []\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Lathe#instructions\n * @static\n * @default
{\n   *   geometry: ['points']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['points']\n };\n\n constructor(params = {}) {\n super(params, Lathe.defaults, Lathe.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Lathe\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? LatheBufferGeometry : LatheGeometry)(\n params.geometry.points\n );\n }\n}\n\nexport {\n Lathe\n};\n","import {\n Line as LineNative,\n BufferGeometry,\n Geometry,\n BufferAttribute,\n LineCurve3,\n Vector3\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Line\n * @category components/meshes\n * @description Line component is generated from a curve/line and amount of vectors that should be used (points).\n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Line, and adding to app\n * new Line({\n * geometry: {\n * curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0))\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Line extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Line#defaults\n * @static\n * @default
\n   * {\n   *   curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),\n   *   points: 50\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n\n curve: null,\n points: 50\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Line#instructions\n * @static\n * @default
{\n   *   geometry: ['curve', 'points']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['curve', 'points']\n };\n\n constructor(params) {\n super(params, Line.defaults, Line.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Line\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new LineNative(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = params.buffer ? new BufferGeometry() : new Geometry();\n\n if (params.buffer) {\n const pp = params.curve.getPoints(params.points);\n const verts = new Float32Array(pp.length * 3);\n\n for (let i = 0, max = pp.length; i < max; i++) {\n const i3 = i * 3;\n\n verts[i3] = pp[i].x;\n verts[i3 + 1] = pp[i].y;\n verts[i3 + 2] = pp[i].z;\n }\n\n geometry.addAttribute('position', new BufferAttribute(verts, 3));\n } else geometry.vertices = params.curve.getPoints(params.points);\n\n return geometry;\n }\n}\n\nexport {\n Line\n};\n","import {\n Mesh,\n JSONLoader,\n SkinnedMesh\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Importer\n * @category components/meshes\n * @description Importer is a loader for meshes and any other data to your scene\n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Importer, and adding to app\n * new Importer({\n * loader: new THREE.OBJLoader(),\n *\n * parser(geometry, material) { // data from loader\n * return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case)\n * },\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Importer extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Importer#defaults\n * @static\n * @default
\n   * {\n   *   url: '',\n   *   loader: new JSONLoader(),\n   *\n   *   onLoad() {},\n   *   onProgress() {},\n   *   onError() {},\n   *\n   *   texturePath: null,\n   *   useCustomMaterial: false,\n   *\n   *   parser(geometry, materials) {\n   *     return new Mesh(geometry, materials);\n   *   }\n   * }
\n */\n static defaults = {\n ...MeshComponent.defaults,\n\n url: '',\n loader: new JSONLoader(),\n\n onLoad() {},\n onProgress() {},\n // TODO add onComplete?\n onError() {},\n\n texturePath: null,\n useCustomMaterial: false,\n\n parser(geometry, material) {\n const {geometry: geom, material: mat} = this.applyBridge({geometry, material});\n\n return this.applyBridge({\n mesh: geom.bones ? new SkinnedMesh(geom, mat) : new Mesh(geom, mat)\n }).mesh;\n }\n };\n\n static instructions = {\n ...MeshComponent.instructions\n };\n\n /**\n * @method filter\n * @description Default values for filter\n * @static\n * @param {THREE.Mesh} object Instance for iterating through it's children.\n * @param {Function} filter Function with child as argument, should return a boolean whether include the child or not.\n * @return {THREE.Mesh} object with children\n * @memberof module:components/meshes.Importer\n * @example Removing unnecessary lights from children\n * new Importer({\n * loader: new THREE.OBJLoader(),\n *\n * parse(group) { // data from loader\n * return Importer.filter(group, child => !child.isLight); // remove lights\n * },\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\n static filter(object, filter) {\n const processFilter = object => {\n object.children.forEach((el, index) => {\n if (el.children) processFilter(el);\n if (!filter(el)) object.children.splice(index, 1);\n });\n\n return object;\n };\n\n return processFilter(object);\n }\n\n constructor(params = {}) {\n super(params, Importer.defaults, Importer.instructions, false);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Importer\n */\n build(params = {}) {\n return new Promise(resolve => {\n if (params.texturePath) params.loader.setTexturePath(params.texturePath);\n\n params.loader.load(params.url, (...data) => { // geometry, materials\n params.onLoad(...data);\n\n const object = params.parser.apply(this, data);\n if (params.material) object.material = this.applyBridge({material: params.material}).material;\n\n resolve(object);\n }, params.onProgress, params.onError);\n });\n }\n}\n\nexport {\n Importer\n};\n","import {\n Mesh,\n OctahedronBufferGeometry,\n OctahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Octahedron\n * @category components/meshes\n * @description In geometry, an octahedron is a polyhedron with eight faces.\n * A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex.\n *

\n * `Octahedron` creates an Octahedron object by its `radius` and `detail`.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating an Octahedron, and adding to app\n * new Octahedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Octahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Octahedron#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     detail: 0\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n }\n\n constructor(params = {}) {\n super(params, Octahedron.defaults, Octahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Octahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? OctahedronBufferGeometry : OctahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Octahedron\n};\n","import {\n Mesh,\n ParametricBufferGeometry,\n ParametricGeometry,\n Vector3\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Parametric\n * @category components/meshes\n * @description `Parametric` generates a geometry representing a Parametric surface\n *

\n * It is usually used to develop different kinds of highfields or visualize a math function.\n *
\n * - Parametric surface\n * - \"Graphulus\"\n *

\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`.\n * We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`.\n * const createParametric = (u, v) => {\n * return new THREE.Vector3(u * 30, Math.random() * 5, v * 30);\n * }\n *\n * new Parametric({\n * geometry: {\n * func: createParametric\n * },\n *\n * material: new THREE.MeshLambertMaterial({\n * color: 0xffffff,\n * side: THREE.DoubleSide\n * }),\n *\n * position: [0, 100, -100]\n * }).addTo(app);\n */\nclass Parametric extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Parametric#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     func: (u, v) => new Vector3(u, v, 0),\n   *     slices: 10,\n   *     tacks: 10\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n func: (u, v) => new Vector3(u, v, 0),\n slices: 10,\n stacks: 10\n }\n }\n\n constructor(params = {}) {\n super(params, Parametric.defaults, Parametric.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Parametric\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? ParametricBufferGeometry : ParametricGeometry)(\n params.geometry.func,\n params.geometry.slices,\n params.geometry.stacks\n );\n }\n}\n\nexport {\n Parametric\n};\n","import {\n Mesh,\n PlaneBufferGeometry,\n PlaneGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Plane\n * @category components/meshes\n * @description `Plane` is used for creating planes given some `width` and `height`.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Plane, and adding to app\n * new Plane({\n * geometry: {\n * width: 20,\n * height: 30\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Plane extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Plane#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     width: 10,\n   *     height: 10,\n   *     wSegments: 1,\n   *     hSegments: 1\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n width: 10,\n height: 10,\n wSegments: 1,\n hSegments: 1\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Plane#instructions\n * @static\n * @default
\n   * {\n   *   geometry: ['width', 'height', 'wSegments', 'hSegments']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['width', 'height', 'wSegments', 'hSegments']\n };\n\n constructor(params = {}) {\n super(params, Plane.defaults, Plane.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Plane\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? PlaneBufferGeometry : PlaneGeometry)(\n params.geometry.width,\n params.geometry.height,\n params.geometry.wSegments,\n params.geometry.hSegments\n );\n\n return geometry;\n }\n}\n\nexport {\n Plane\n};\n","import {\n Mesh,\n PolyhedronBufferGeometry,\n PolyhedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\nconst [verticesOfCube, indicesOfFaces] = [\n [\n -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1\n ],\n [\n 2, 1, 0, 0, 3, 2,\n 0, 4, 7, 7, 3, 0,\n 0, 1, 5, 5, 4, 0,\n 1, 2, 6, 6, 5, 1,\n 2, 3, 7, 7, 6, 2,\n 4, 5, 6, 6, 7, 4\n ]\n];\n\n/**\n * @class Polyhedron\n * @category components/meshes\n * @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices.\n *

\n * `Polyhedron` creates a Polyhedron by its `radius` and `detail`.\n *

\n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating an Polyhedron, and adding to app\n * new Polyhedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Polyhedron extends MeshComponent {\n static verticesOfCube = verticesOfCube;\n static indicesOfFaces = indicesOfFaces;\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Polyhedron#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     verticesOfCube: [\n   *       -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n   *       -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1\n   *     ],\n   *\n   *     indicesOfFaces: [\n   *       2, 1, 0, 0, 3, 2,\n   *       0, 4, 7, 7, 3, 0,\n   *       0, 1, 5, 5, 4, 0,\n   *       1, 2, 6, 6, 5, 1,\n   *       2, 3, 7, 7, 6, 2,\n   *       4, 5, 6, 6, 7, 4\n   *     ],\n   *\n   *     radius: 6,\n   *     detail: 2\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n verticesOfCube,\n indicesOfFaces,\n radius: 6,\n detail: 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Polyhedron#instructions\n * @static\n * @default
\n   * {\n   *   geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Polyhedron.defaults, Polyhedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Polyhedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? PolyhedronBufferGeometry : PolyhedronGeometry)(\n params.geometry.verticesOfCube,\n params.geometry.indicesOfFaces,\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Polyhedron\n};\n","import {\n Mesh,\n RingGeometry,\n RingBufferGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Ring\n * @category components/meshes\n * @description Ring class creates a circle or just 2D Torus. Does not support physics.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Ring, and adding to app\n * new Ring({\n * geometry: {\n * innerRadius: 5,\n * outerRadius: 2\n * },\n *\n * material: new THREE.MeshLambertMaterial({\n * color: 0xffffff,\n * side THREE.DoubleSide\n * }),\n *\n * position: [0, 8, 0],\n *\n * rotation: {\n * x: Math.PI/4\n * }\n * }).addTo(app);\n */\nclass Ring extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Ring#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     innerRadius: 0,\n   *     outerRadius: 50,\n   *     thetaSegments: 8,\n   *     phiSegments: 8,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n innerRadius: 0,\n outerRadius: 50,\n thetaSegments: 8,\n phiSegments: 8,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Ring#instructions\n * @static\n * @default
\n   * {\n   *   geometry: [\n   *     'innerRadius',\n   *     'outerRadius',\n   *     'thetaSegments',\n   *     'phiSegments',\n   *     'thetaStart',\n   *     'thetaLength'\n   *   ]\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.defaults,\n geometry: [\n 'innerRadius',\n 'outerRadius',\n 'thetaSegments',\n 'phiSegments',\n 'thetaStart',\n 'thetaLength'\n ]\n };\n\n constructor(params = {}) {\n super(params, Ring.defaults, Ring.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Ring\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? RingBufferGeometry : RingGeometry)(\n params.geometry.innerRadius,\n params.geometry.outerRadius,\n params.geometry.thetaSegments,\n params.geometry.phiSegments,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n }\n}\n\nexport {\n Ring\n};\n","import {\n Mesh,\n ShapeBufferGeometry,\n ShapeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Shape\n * @category components/meshes\n * @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.
\n * Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero.\n *

\n * `Shape` consists of shapes that are in its shapes parameter.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a plane looking Shape from a THREE.Shape, and adding it to app\n * const rectWidth = 10,\n * rectLength = 5;\n *\n * const rectShape = new THREE.Shape();\n * rectShape.moveTo(0,0);\n * rectShape.lineTo(0, rectWidth);\n * rectShape.lineTo(rectLength, rectWidth);\n * rectShape.lineTo(rectLength, 0);\n * rectShape.lineTo(0, 0);\n *\n * const plane = new Shape({\n * geometry: {\n * shape: rectShape\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Shape extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Shape#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     shapes: []\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n shapes: []\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Shape#instructions\n * @static\n * @default
\n   * {\n   *   geometry: ['shapes']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['shapes']\n };\n\n constructor(params = {}) {\n super(params, Shape.defaults, Shape.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Shape\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? ShapeBufferGeometry : ShapeGeometry)(\n params.geometry.shapes\n );\n }\n}\n\nexport {\n Shape\n};\n","import {\n Mesh,\n SphereBufferGeometry,\n SphereGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Sphere\n * @category components/meshes\n * @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality.\n *

\n * It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot).\n *

\n * Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations.\n * This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution).\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Sphere, and adding it to app\n * new Sphere({\n * geometry: {\n * radius: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * y: 100\n * }\n * }).addTo(app);\n */\nclass Sphere extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Sphere#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     widthSegments: 8,\n   *     heightSegments: 6\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n widthSegments: 8,\n heightSegments: 6\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Sphere#instructions\n * @static\n * @default
\n   * {\n   *   geometry: ['radius', 'widthSegments', 'heightSegments']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'widthSegments', 'heightSegments']\n };\n\n constructor(params = {}) {\n super(params, Sphere.defaults, Sphere.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Sphere\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? SphereBufferGeometry : SphereGeometry)(\n params.geometry.radius,\n params.geometry.widthSegments,\n params.geometry.heightSegments\n );\n\n return geometry;\n }\n}\n\nexport {\n Sphere\n};\n","import {\n Mesh,\n TetrahedronBufferGeometry,\n TetrahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Tetrahedron\n * @category components/meshes\n * @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners.\n * The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces.\n *

\n * `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail`\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Tetrahedron, and adding it to app\n * new Tetrahedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * x: 0,\n * y: 100,\n * z: 0\n * }\n * }).addTo(app);\n */\nclass Tetrahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Tetrahedron#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     detail: 0\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Tetrahedron#instructions\n * @static\n * @default
\n   * {\n   *   geometry: ['radius', 'detail']\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Tetrahedron.defaults, Tetrahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Tetrahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? TetrahedronBufferGeometry : TetrahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Tetrahedron\n};\n","import {\n Font,\n Mesh,\n TextGeometry,\n FontLoader\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Text\n * @category components/meshes\n * @description Text class is made for creating 3D text objects.\n * @classDesc\n * \n *

\n * Physics text object can be convex or concave. By default it's convex but you can also switch to concave.\n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Text, and adding it to app\n * new Text({\n * text: 'Some text',\n * parameters: {\n * font: 'path/to/font.typeface.js',\n * size: 20,\n * height: 5,\n * curveSegments: 6\n * }\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * x: -40,\n * y: 20,\n * z: 0\n * }\n * }).addTo(app);\n */\nclass Text extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Text#defaults\n * @static\n * @default
\n   * {\n   *   text: 'Hello World!',\n   *   font: null,\n   *\n   *   geometry: {\n   *     size: 12,\n   *     height: 50,\n   *     curveSegments: 12,\n   *     font: new Font(),\n   *     bevelEnabled: false,\n   *     bevelThickness: 10,\n   *     bevelSize: 8\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n text: 'Hello World!',\n font: null,\n\n geometry: {\n size: 12,\n height: 50,\n curveSegments: 12,\n font: new Font(),\n bevelEnabled: false,\n bevelThickness: 10,\n bevelSize: 8\n }\n };\n\n static instructions = {\n ...MeshComponent.instructions\n };\n\n /**\n * Default FontLoader\n * @member {Object} module:components/meshes.Text#loader\n * @static\n * @default new FontLoader()\n */\n static loader = new FontLoader();\n\n /**\n * @method load\n * @static\n * @description load() preloads a Font object and returns a Promise with it.\n * @param {String} path Path to the font\n * @return {Promise} A promise resolved with a font\n * @memberof module:components/meshes.Text\n */\n static load(path, loader = Text.loader) {\n return new Promise(resolve => {\n loader.load(path, resolve);\n });\n }\n\n constructor(params = {}) {\n super(params, Text.defaults, Text.instructions);\n }\n\n /**\n * @method build\n * @description Build is called as part of the lifecycle to create a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Text\n */\n build(params = this.params) {\n const promise = new Promise(resolve => {\n (params.font instanceof Promise ? params.font : Promise.resolve(params.font))\n .then(font => {\n const {geometry, material} = this.applyBridge({\n geometry: new TextGeometry(\n params.text,\n Object.assign(\n params.geometry,\n {font}\n )\n ),\n\n material: params.material\n });\n\n resolve(\n this.applyBridge({\n mesh: new Mesh(geometry, material)\n }).mesh\n );\n });\n });\n\n super.wait(promise);\n\n return promise;\n }\n}\n\nexport {\n Text\n};\n","import {\n Mesh,\n TorusGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Torus\n * @category components/meshes\n * @description Torus class makes a torus figure. A donut is a torus.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Torus, and adding it to app\n * new Torus({\n * geometry: {\n * radius: 5,\n * tube: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * y: 35\n * }\n * }).addTo(app);\n */\nclass Torus extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Torus#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 100,\n   *     tube: 40,\n   *     radialSegments: 8,\n   *     tubularSegments: 6,\n   *     arc: Math.PI * 2\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 100,\n tube: 40,\n radialSegments: 8,\n tubularSegments: 6,\n arc: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Torus#instructions\n * @static\n * @default
\n   * {\n   *   geometry: [\n   *     'radius',\n   *     'tube',\n   *     'radialSegments',\n   *     'tubularSegments',\n   *     'arc'\n   *   ]\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radius',\n 'tube',\n 'radialSegments',\n 'tubularSegments',\n 'arc'\n ]\n };\n\n constructor(params = {}) {\n super(params, Torus.defaults, Torus.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Torus\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new TorusGeometry(\n params.geometry.radius,\n params.geometry.tube,\n params.geometry.radialSegments,\n params.geometry.tubularSegments,\n params.geometry.arc\n );\n }\n}\n\nexport {\n Torus\n};\n","import {\n Mesh,\n TorusKnotBufferGeometry,\n TorusKnotGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Torusknot\n * @category components/meshes\n * @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Torusknot, and adding it to app\n * new Torusknot({\n * geometry: {\n * radius:5,\n * tube: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * pos: {\n * y: 100\n * }\n * }).addTo(app);\n */\nclass Torusknot extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Torusknot#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     radius: 100,\n   *     tube: 40,\n   *     radialSegments: 64,\n   *     tubularSegments: 8,\n   *     p: 2,\n   *     q: 3\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 100,\n tube: 40,\n radialSegments: 64,\n tubularSegments: 8,\n p: 2,\n q: 3\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Torusknot#instructions\n * @static\n * @default
\n   * {\n   *   geometry: [\n   *     'radius',\n   *     'tube',\n   *     'radialSegments',\n   *     'tubularSegments',\n   *     'p',\n   *     'q'\n   *   ]\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radius',\n 'tube',\n 'radialSegments',\n 'tubularSegments',\n 'p',\n 'q'\n ]\n };\n\n constructor(params = {}) {\n super(params, Torusknot.defaults, Torusknot.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Torusknot\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const GConstruct = params.buffer ? TorusKnotBufferGeometry : TorusKnotGeometry;\n\n return new GConstruct(\n params.geometry.radius,\n params.geometry.tube,\n params.geometry.radialSegments,\n params.geometry.tubularSegments,\n params.geometry.p,\n params.geometry.q\n );\n }\n}\n\nexport {\n Torusknot\n};\n","import {\n Mesh,\n LineCurve3,\n Vector3,\n TubeBufferGeometry,\n TubeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Tube\n * @category components/meshes\n * @description Tube class makes a tube that extrudes along a 3d curve.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Tube from a three.js Curve, and adding it to app\n * const CustomSinCurve = THREE.Curve.create(\n * function (scale) { // custom curve constructor\n * this.scale = (scale === undefined) ? 1 : scale;\n * },\n *\n * function (t) { // getPoint: t is between 0-1\n * const tx = t * 3 - 1.5,\n * ty = Math.sin( 2 * Math.PI * t ),\n * tz = 0;\n *\n * return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n * }\n * );\n *\n * const path = new CustomSinCurve(10);\n *\n * new Tube({\n * geometry: {\n * path: path\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Tube extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Tube#defaults\n * @static\n * @default
\n   * {\n   *   geometry: {\n   *     path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),\n   *     segments: 20,\n   *     radius: 2,\n   *     radiusSegments: 8,\n   *     closed: false\n   *   }\n   * }\n   * 
\n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n path: new LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),\n segments: 20,\n radius: 2,\n radiusSegments: 8,\n closed: false\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Tube#instructions\n * @static\n * @default
\n   * {\n   *   geometry: [\n   *     'path',\n   *     'segments',\n   *     'radius',\n   *     'radiusSegments',\n   *     'closed'\n   *   ]\n   * }\n   * 
\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'path',\n 'segments',\n 'radius',\n 'radiusSegments',\n 'closed'\n ]\n };\n\n constructor(params = {}) {\n super(params, Tube.defaults, Tube.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Tube\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? TubeBufferGeometry : TubeGeometry)(\n params.geometry.path,\n params.geometry.segments,\n params.geometry.radius,\n params.geometry.radiusSegments,\n params.geometry.closed\n );\n\n return geometry;\n }\n}\n\nexport {\n Tube\n};\n","import {Object3D} from 'three';\nimport {MeshComponent} from '../../core/MeshComponent';\nimport {Component} from '../../core/Component';\n\n/**\n * @class Group\n * @category components/meshes\n * @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).
\n * In Three.js you make it using `THREE.Object3D` and it's children.

\n * In whs.js we have `Group`\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Approach 2 - Adding objects to an empty group\n * const sphere = new Sphere();\n * const box = new Box();\n * const group = new Group();\n *\n * sphere.addTo(group);\n * box.addTo(group);\n* @example Approach 2 - Making a group from objects\n * const sphere = new Sphere();\n * const box = new Box();\n * const group = new Group(box, sphere);\n * // OR: const group = new Group([box, sphere]);\n */\nclass Group extends MeshComponent {\n constructor(...objects) {\n super({});\n\n for (let i = 0; i < objects.length; i++) {\n const obj = objects[i];\n\n if (obj instanceof Component) obj.addTo(this);\n else if (obj instanceof Object3D) this.native.add(obj);\n }\n }\n\n build() {\n return new Object3D();\n }\n}\n\nexport {\n Group\n};\n","/** @module components/meshes */\nexport * from './Box';\nexport * from './Circle';\nexport * from './Cone';\nexport * from './Cylinder';\nexport * from './Dodecahedron';\nexport * from './Extrude';\nexport * from './Icosahedron';\nexport * from './Lathe';\nexport * from './Line';\nexport * from './Importer';\nexport * from './Octahedron';\nexport * from './Parametric';\nexport * from './Plane';\nexport * from './Polyhedron';\nexport * from './Ring';\nexport * from './Shape';\nexport * from './Sphere';\nexport * from './Tetrahedron';\nexport * from './Text';\nexport * from './Torus';\nexport * from './Torusknot';\nexport * from './Tube';\nexport * from './Group';\n","/**\n * @class ElementModule\n * @category modules/app\n * @param {Object} [container=document.body] container is the DOM object to which application's canvas will be added to.\n * @memberof module:modules/app\n * @example Creating an element module, passing it to the App\n * new App([\n * new ElementModule(document.getElementById('app'))\n * ]);\n */\nexport class ElementModule {\n constructor(container = document.body) {\n if (container.container) {\n console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.');\n this.container = container.container;\n } else this.container = container;\n\n this.createElement();\n }\n\n /**\n * @method createElement\n * @instance\n * @description Creates a canvas element.\n * @memberof module:modules/app.ElementModule\n */\n createElement() {\n this.element = window.document.createElement('div');\n\n this.element.className = 'whs-app';\n this.element.style.width = 'inherit';\n this.element.style.height = 'inherit';\n this.element.style.position = 'relative';\n }\n\n manager(manager) {\n manager.set('element', this.element);\n manager.set('container', this.container);\n }\n\n integrate(self) {\n self.container.appendChild(self.element);\n }\n}\n","import {\n WebGLRenderer,\n Vector2\n} from 'three';\n\nimport {Loop} from '../../core/Loop';\n\n/**\n * @class RenderingModule\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule({\n * bgColor: 0x162129,\n *\n * renderer: {\n * antialias: true\n * }\n * }, {shadow: true})\n * ]);\n */\nexport class RenderingModule {\n /**\n * additional\n * @description collection of additional scripts\n * @static\n * @member {Object} module:core.App#additional\n * @public\n */\n static additional = {\n shadow(renderer) {\n renderer.shadowMap.enabled = true;\n }\n }\n\n /**\n * enabled\n * @static\n * @member {Boolean} module:core.App#enabled\n * @public\n */\n enabled = true;\n\n constructor(params = {}, additional) {\n this.params = Object.assign({\n width: window.innerWidth,\n height: window.innerHeight,\n\n resolution: new Vector2(1, 1),\n pixelRatio: window.devicePixelRatio,\n\n bgColor: 0x000000,\n bgOpacity: 1,\n\n renderer: {},\n fix() {}\n }, params);\n\n const {\n bgColor,\n bgOpacity,\n renderer,\n pixelRatio,\n width,\n height,\n resolution,\n fix\n } = this.params;\n\n this.renderer = new WebGLRenderer(renderer);\n this.effects = [];\n\n this.renderer.setClearColor(\n bgColor,\n bgOpacity\n );\n\n if (pixelRatio) this.renderer.setPixelRatio(pixelRatio);\n\n this.setSize(\n Number(width * resolution.x).toFixed(),\n Number(height * resolution.y).toFixed()\n );\n\n for (const key in additional)\n if (additional[key]) this.applyAdditional(key);\n\n fix(this.renderer);\n }\n\n /**\n * @method applyAdditional\n * @description Apply additional script from RenderingModule.additional\n * @param {Stirng} name Script name\n * @return {this}\n * @memberof module:modules/app.RenderingModule\n */\n applyAdditional(name) {\n RenderingModule.additional[name].apply(this, [this.renderer]);\n }\n\n /**\n * @method integrateRenderer\n * @description Integrate renderer\n * @param {NodeElement} element DOM object\n * @param {THREE.Scene} scene used scene\n * @param {THREE.Camera} camera used camera\n * @return {Loop} renderLoop\n * @memberof module:modules/app.RenderingModule\n */\n integrateRenderer(element, scene, camera) {\n this.scene = scene;\n this.camera = camera;\n this.attachToCanvas(element);\n\n return new Loop(() => this.renderer.render(this.scene, this.camera));\n }\n\n /**\n * @method effect\n * @description Add three.js effect\n * @param {Object} effect three.js effect\n * @param {function} effectLoop update function for effect\n * @return {this}\n * @memberof module:modules/app.RenderingModule\n */\n effect(effect, effectLoop = () => {\n effect.render(this.scene, this.camera);\n }) {\n this.renderLoop.stop();\n\n const size = this.renderer.getSize();\n effect.setSize(size.width, size.height);\n\n const loop = new Loop(effectLoop);\n\n this.effects.push(loop);\n if (this.enabled) loop.start(this.app);\n\n return this;\n }\n\n /**\n * @method setSize\n * @description Update render target width and height.\n * @param {Number} width\n * @param {Number} height\n * @memberof module:modules/app.RenderingModule\n */\n setSize(width, height) {\n if (this.renderer) this.renderer.setSize(width, height);\n }\n\n /**\n * @method attachToCanvas\n * @description Attach renderer.domElement to element\n * @param {NodeElement} element DOM object\n * @memberof module:modules/app.RenderingModule\n */\n attachToCanvas(element) {\n const canvas = this.renderer.domElement;\n\n // attach to new parent world dom\n element.appendChild(canvas);\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n }\n\n /**\n * @method stop\n * @description Stops renderLoop and effect loops\n * @memberof module:modules/app.RenderingModule\n */\n stop() {\n this.enabled = false;\n this.renderLoop.stop();\n this.effects.forEach(loop => loop.stop());\n }\n\n /**\n * @method play\n * @description Resumes renderLoop and effect loops\n * @memberof module:modules/app.RenderingModule\n */\n play() {\n this.enabled = true;\n this.renderLoop.start();\n this.effects.forEach(loop => loop.start());\n }\n\n manager(manager) {\n manager.define('rendering');\n manager.set('renderer', this.renderer);\n\n this.app = manager.handler;\n\n this.renderLoop = this.integrateRenderer(\n manager.get('element'),\n manager.get('scene'),\n manager.get('camera').native\n );\n\n manager.update({\n element: element => {\n this.attachToCanvas(element);\n },\n scene: scene => {\n this.scene = scene;\n },\n camera: camera => {\n this.camera = camera.native;\n }\n });\n }\n\n integrate(self) {\n self.renderLoop.start(this);\n self.effects.forEach(loop => loop.start(this));\n }\n\n /**\n * @method dispose\n * @description Dispose rendering context\n * @memberof module:modules/app.RenderingModule\n */\n dispose() {\n this.stop();\n this.renderer.forceContextLoss();\n }\n}\n","import {\n Scene,\n} from 'three';\n\nconst SYMBOL_CHILDREN_FOR_SCENE = Symbol('SYMBOL_CHILDREN_FOR_SCENE')\n\n/**\n * @class SceneModule\n * @category modules/app\n * @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one.\n * @memberof module:modules/app\n */\nexport class SceneModule {\n constructor(willSceneBeReplaced = false) {\n this.scene = willSceneBeReplaced ? null : new Scene();\n }\n\n manager(manager) {\n manager.set('scene', this.scene);\n }\n\n integrate(self) {\n Object.assign(\n this,\n {\n async add(object) {\n if (object.parent) await object.parent.remove(object);\n \n await object.wait();\n \n if (!object.native) {\n throw new CompositionError(\n 'SceneModule',\n 'there is no object.native',\n this\n );\n }\n \n object.parent = this;\n await this.applyBridge({onAdd: object}).onAdd;\n self.scene.add(object.native);\n this.children.push(object);\n \n return object;\n },\n async remove(object) {\n if (object.parent !== this) return;\n \n await object.wait();\n this.applyBridge({onRemove: object});\n \n object.parent = null;\n self.scene.remove(object.native);\n this.children.splice(this.children.indexOf(object), 1);\n },\n _setScene(scene) {\n this.children = scene[SYMBOL_CHILDREN_FOR_SCENE] = scene[SYMBOL_CHILDREN_FOR_SCENE] || []\n self.scene = scene;\n },\n setScene(scene) {\n this._setScene(scene);\n this.manager.set('scene', scene);\n },\n getScene() {\n return self.scene;\n },\n },\n );\n if (self.scene) this._setScene(self.scene);\n }\n}\n","// import {addResizeListener} from 'detect-element-resize';\n\n/**\n * @class ResizeModule\n * @category modules/app\n * @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes\n * @memberof module:modules/app\n */\nexport class ResizeModule {\n constructor(params = {}) {\n this.params = Object.assign({\n auto: true\n }, params);\n\n this.callbacks = [this.setSize.bind(this)];\n }\n\n /**\n * @function setSize\n * @instance\n * @description This function sets the provided width & height to the renderer object.\n * @param {Number} [width=1] - The promise that should be added to a queue.\n * @param {Number} [height=1] - that is resolved when all promises completed.\n * @memberof module:modules/app.ResizeModule\n */\n setSize(width = 1, height = 1) {\n this.camera.native.aspect = width / height;\n this.camera.native.updateProjectionMatrix();\n\n if (this.rendering) this.rendering.setSize(width, height);\n }\n\n /**\n * @method trigger\n * @instance\n * @description Triggers resize when called. width & height are determined automatically\n * This invokes each callbacks with the new width and height as params\n * @memberof module:modules/app.ResizeModule\n */\n trigger() {\n const {\n container: {\n offsetWidth,\n offsetHeight\n },\n resolution\n } = this;\n\n const width = Number(offsetWidth * resolution.x).toFixed();\n const height = Number(offsetHeight * resolution.y).toFixed();\n\n this.callbacks.forEach(cb => {\n cb(width, height);\n });\n }\n\n /**\n * @method addAutoresize\n * @instance\n * @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize\n * @memberof module:modules/app.ResizeModule\n */\n addAutoresize() {\n this.container = this.getContainer();\n this.resolution = this.getResolution();\n\n if (this.params.auto) window.addEventListener('resize', this.trigger.bind(this));\n }\n\n /**\n * @method addCallback\n * @instance\n * @description Adds a call back function to the existing callbacks list.\n * @param {Function} func - The callback function to add\n * @memberof module:modules/app.ResizeModule\n */\n addCallback(func) {\n this.callbacks.push(func);\n }\n\n manager(manager) {\n manager.define('resize');\n\n this.rendering = manager.get('renderer');\n this.camera = manager.get('camera');\n\n this.getResolution = () => manager.use('rendering').params.resolution;\n this.getContainer = () => manager.get('container');\n\n manager.update({\n container: container => {\n this.container = container;\n }\n });\n\n this.addAutoresize();\n }\n}\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tPreviousLum;\\r\\nuniform sampler2D tCurrentLum;\\r\\nuniform float minLuminance;\\r\\nuniform float delta;\\r\\nuniform float tau;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\\r\\n\\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\\r\\n\\r\\n\\tpreviousLum = max(minLuminance, previousLum);\\r\\n\\tcurrentLum = max(minLuminance, currentLum);\\r\\n\\r\\n\\t// Adapt the luminance using Pattanaik's technique.\\r\\n\\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\\r\\n\\r\\n\\tgl_FragColor.r = adaptedLum;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An adaptive luminosity shader material.\r\n */\r\n\r\nexport class AdaptiveLuminosityMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new adaptive luminosity material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"AdaptiveLuminosityMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tMIP_LEVEL_1X1: \"0.0\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttPreviousLum: new Uniform(null),\r\n\t\t\t\ttCurrentLum: new Uniform(null),\r\n\t\t\t\tminLuminance: new Uniform(0.01),\r\n\t\t\t\tdelta: new Uniform(0.0),\r\n\t\t\t\ttau: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tDepth;\\r\\n\\r\\nuniform float focus;\\r\\nuniform float dof;\\r\\nuniform float aspect;\\r\\nuniform float aperture;\\r\\nuniform float maxBlur;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\n#ifndef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\tuniform float cameraNear;\\r\\n\\tuniform float cameraFar;\\r\\n\\r\\n\\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\\r\\n\\r\\n\\t\\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\\r\\n\\t\\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t\\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 aspectCorrection = vec2(1.0, aspect);\\r\\n\\r\\n\\t#ifdef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t\\tfloat depth = texture2D(tDepth, vUv).x;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat depth = readDepth(tDepth, vUv);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\\r\\n\\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\\r\\n\\r\\n\\t// Calculate a DoF mask.\\r\\n\\tfloat low = step(depth, focusNear);\\r\\n\\tfloat high = step(focusFar, depth);\\r\\n\\r\\n\\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\\r\\n\\r\\n\\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\\r\\n\\r\\n\\tvec2 dofblur9 = dofBlur * 0.9;\\r\\n\\tvec2 dofblur7 = dofBlur * 0.7;\\r\\n\\tvec2 dofblur4 = dofBlur * 0.4;\\r\\n\\r\\n\\tvec4 color = vec4(0.0);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\\r\\n\\r\\n\\tgl_FragColor = color / 41.0;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Depth of Field shader (Bokeh).\r\n *\r\n * Original shader code by Martins Upitis:\r\n * http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\r\n */\r\n\r\nexport class BokehMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh material.\r\n\t *\r\n\t * @param {PerspectiveCamera} [camera] - A camera.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth.\r\n\t * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp.\r\n\t * @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field.\r\n\t * @param {Number} [options.maxBlur=1.0] - Maximum blur strength.\r\n\t */\r\n\r\n\tconstructor(camera, options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\tfocus: 1.0,\r\n\t\t\tdof: 0.02,\r\n\t\t\taperture: 0.025,\r\n\t\t\tmaxBlur: 1.0\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"BokehMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\tcameraNear: new Uniform(0.1),\r\n\t\t\t\tcameraFar: new Uniform(2000),\r\n\t\t\t\taspect: new Uniform(1.0),\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttDepth: new Uniform(null),\r\n\r\n\t\t\t\tfocus: new Uniform(settings.focus),\r\n\t\t\t\tdof: new Uniform(settings.dof),\r\n\t\t\t\taperture: new Uniform(settings.aperture),\r\n\t\t\t\tmaxBlur: new Uniform(settings.maxBlur)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.adoptCameraSettings(camera);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adopts the settings of the given camera.\r\n\t *\r\n\t * @param {PerspectiveCamera} [camera=null] - A camera.\r\n\t */\r\n\r\n\tadoptCameraSettings(camera = null) {\r\n\r\n\t\tif(camera !== null) {\r\n\r\n\t\t\tthis.uniforms.cameraNear.value = camera.near;\r\n\t\t\tthis.uniforms.cameraFar.value = camera.far;\r\n\t\t\tthis.uniforms.aspect.value = camera.aspect;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\\r\\n\\r\\n\\t// Calculate color deltas.\\r\\n\\tvec4 delta;\\r\\n\\tvec3 c = texture2D(tDiffuse, vUv).rgb;\\r\\n\\r\\n\\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\\r\\n\\tvec3 t = abs(c - cLeft);\\r\\n\\tdelta.x = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\\r\\n\\tt = abs(c - cTop);\\r\\n\\tdelta.y = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\t// We do the usual threshold.\\r\\n\\tvec2 edges = step(threshold, delta.xy);\\r\\n\\r\\n\\t// Then discard if there is no edge.\\r\\n\\tif(dot(edges, vec2(1.0)) == 0.0) {\\r\\n\\r\\n\\t\\tdiscard;\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\t// Calculate right and bottom deltas.\\r\\n\\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\\r\\n\\tt = abs(c - cRight);\\r\\n\\tdelta.z = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\\r\\n\\tt = abs(c - cBottom);\\r\\n\\tdelta.w = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\t// Calculate the maximum delta in the direct neighborhood.\\r\\n\\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\\r\\n\\r\\n\\t// Calculate left-left and top-top deltas.\\r\\n\\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\\r\\n\\tt = abs(c - cLeftLeft);\\r\\n\\tdelta.z = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\\r\\n\\tt = abs(c - cTopTop);\\r\\n\\tdelta.w = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\t// Calculate the final maximum delta.\\r\\n\\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\\r\\n\\r\\n\\t// Local contrast adaptation in action.\\r\\n\\tedges.xy *= step(0.5 * maxDelta, delta.xy);\\r\\n\\r\\n\\tgl_FragColor = vec4(edges, 0.0, 0.0);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\\r\\n\\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\\r\\n\\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A material that detects edges in a color texture.\r\n *\r\n * Mainly used for Subpixel Morphological Antialiasing.\r\n */\r\n\r\nexport class ColorEdgesMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new color edges material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ColorEdgesMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tEDGE_THRESHOLD: \"0.1\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(texelSize)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the edge detection sensitivity.\r\n\t *\r\n\t * A lower value results in more edges being detected at the expense of\r\n\t * performance.\r\n\t *\r\n\t * 0.1 is a reasonable value, and allows to catch most visible edges.\r\n\t * 0.05 is a rather overkill value, that allows to catch 'em all.\r\n\t *\r\n\t * If temporal supersampling is used, 0.2 could be a reasonable value,\r\n\t * as low contrast edges are properly filtered by just 2x.\r\n\t *\r\n\t * @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5].\r\n\t */\r\n\r\n\tsetEdgeDetectionThreshold(threshold) {\r\n\r\n\t\tthis.defines.EDGE_THRESHOLD = threshold.toFixed(\"2\");\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D texture1;\\r\\nuniform sampler2D texture2;\\r\\n\\r\\nuniform float opacity1;\\r\\nuniform float opacity2;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\\r\\n\\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\\r\\n\\r\\n\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\\r\\n\\t\\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\\r\\n\\r\\n\\t\\tvec4 color = vec4(\\r\\n\\t\\t\\tvec3(1.0) - invTexel1 * invTexel2,\\r\\n\\t\\t\\ttexel1.a + texel2.a\\r\\n\\t\\t);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tvec4 color = texel1 + texel2;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A material for combining two textures.\r\n *\r\n * This material supports the two blend modes Add and Screen.\r\n *\r\n * In Screen mode, the two textures are effectively projected on a white screen\r\n * simultaneously. In Add mode, the textures are simply added together which\r\n * often produces undesired, washed out results.\r\n */\r\n\r\nexport class CombineMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new combine material.\r\n\t *\r\n\t * @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used.\r\n\t */\r\n\r\n\tconstructor(screenMode = false) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"CombineMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttexture1: new Uniform(null),\r\n\t\t\t\ttexture2: new Uniform(null),\r\n\r\n\t\t\t\topacity1: new Uniform(1.0),\r\n\t\t\t\topacity2: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setScreenModeEnabled(screenMode);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Screen blend mode.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Screen blend mode should be enabled.\r\n\t */\r\n\r\n\tsetScreenModeEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SCREEN_MODE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SCREEN_MODE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t// Sample top left texel.\\r\\n\\tvec4 sum = texture2D(tDiffuse, vUv0);\\r\\n\\r\\n\\t// Sample top right texel.\\r\\n\\tsum += texture2D(tDiffuse, vUv1);\\r\\n\\r\\n\\t// Sample bottom right texel.\\r\\n\\tsum += texture2D(tDiffuse, vUv2);\\r\\n\\r\\n\\t// Sample bottom left texel.\\r\\n\\tsum += texture2D(tDiffuse, vUv3);\\r\\n\\r\\n\\t// Compute the average.\\r\\n\\tgl_FragColor = sum * 0.25;\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\nuniform vec2 halfTexelSize;\\r\\nuniform float kernel;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\\r\\n\\r\\n\\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\\r\\n\\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\\r\\n\\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\\r\\n\\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An optimised convolution shader material.\r\n *\r\n * This material supports dithering.\r\n *\r\n * Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games:\r\n * Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless)\r\n * and an article by Filip Strugar, Intel:\r\n * An investigation of fast real-time GPU-based image blur algorithms\r\n *\r\n * Further modified according to Apple's\r\n * [Best Practices for Shaders](https://goo.gl/lmRoM5).\r\n */\r\n\r\nexport class ConvolutionMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new convolution material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ConvolutionMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(new Vector2()),\r\n\t\t\t\thalfTexelSize: new Uniform(new Vector2()),\r\n\t\t\t\tkernel: new Uniform(0.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setTexelSize(texelSize.x, texelSize.y);\r\n\r\n\t\t/**\r\n\t\t * The current kernel size.\r\n\t\t *\r\n\t\t * @type {KernelSize}\r\n\t\t * @default KernelSize.LARGE\r\n\t\t */\r\n\r\n\t\tthis.kernelSize = KernelSize.LARGE;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the kernel.\r\n\t *\r\n\t * @return {Float32Array} The kernel.\r\n\t */\r\n\r\n\tgetKernel() {\r\n\r\n\t\treturn kernelPresets[this.kernelSize];\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the texel size.\r\n\t *\r\n\t * @param {Number} x - The texel width.\r\n\t * @param {Number} y - The texel height.\r\n\t */\r\n\r\n\tsetTexelSize(x, y) {\r\n\r\n\t\tthis.uniforms.texelSize.value.set(x, y);\r\n\t\tthis.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5);\r\n\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * The Kawase blur kernel presets.\r\n *\r\n * @type {Float32Array[]}\r\n * @private\r\n */\r\n\r\nconst kernelPresets = [\r\n\tnew Float32Array([0.0, 0.0]),\r\n\tnew Float32Array([0.0, 1.0, 1.0]),\r\n\tnew Float32Array([0.0, 1.0, 1.0, 2.0]),\r\n\tnew Float32Array([0.0, 1.0, 2.0, 2.0, 3.0]),\r\n\tnew Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 4.0, 5.0]),\r\n\tnew Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 7.0, 8.0, 9.0, 10.0])\r\n];\r\n\r\n/**\r\n * A kernel size enumeration.\r\n *\r\n * @type {Object}\r\n * @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel.\r\n * @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel.\r\n * @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel.\r\n * @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel.\r\n * @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel.\r\n * @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel.\r\n */\r\n\r\nexport const KernelSize = {\r\n\r\n\tVERY_SMALL: 0,\r\n\tSMALL: 1,\r\n\tMEDIUM: 2,\r\n\tLARGE: 3,\r\n\tVERY_LARGE: 4,\r\n\tHUGE: 5\r\n\r\n};\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform float opacity;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tgl_FragColor = opacity * texel;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A simple copy shader material.\r\n */\r\n\r\nexport class CopyMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new copy material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"CopyMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\topacity: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { PerspectiveCamera, ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDepth;\\r\\nuniform float cameraNear;\\r\\nuniform float cameraFar;\\r\\n\\r\\nvarying float vViewZ;\\r\\nvarying vec4 vProjTexCoord;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\t// Transform into Cartesian coordinate (not mirrored).\\r\\n\\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\\r\\n\\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\\r\\n\\r\\n\\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\\r\\n\\r\\n\\t#ifdef PERSPECTIVE_CAMERA\\r\\n\\r\\n\\t\\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\\r\\n\\r\\n\\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"#include \\r\\n#include \\r\\n#include \\r\\n#include \\r\\n\\r\\nvarying float vViewZ;\\r\\nvarying vec4 vProjTexCoord;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\t#include \\r\\n\\t#include \\r\\n\\t#include \\r\\n\\t#include \\r\\n\\r\\n\\tvViewZ = mvPosition.z;\\r\\n\\tvProjTexCoord = gl_Position;\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A depth comparison shader material.\r\n */\r\n\r\nexport class DepthComparisonMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new depth comparison material.\r\n\t *\r\n\t * @param {Texture} [depthTexture=null] - A depth texture.\r\n\t * @param {PerspectiveCamera} [camera] - A camera.\r\n\t */\r\n\r\n\tconstructor(depthTexture = null, camera) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"DepthComparisonMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDepth: new Uniform(depthTexture),\r\n\t\t\t\tcameraNear: new Uniform(0.1),\r\n\t\t\t\tcameraFar: new Uniform(2000)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false,\r\n\r\n\t\t\tmorphTargets: true,\r\n\t\t\tskinning: true\r\n\r\n\t\t});\r\n\r\n\t\tthis.adoptCameraSettings(camera);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adopts the settings of the given camera.\r\n\t *\r\n\t * @param {Camera} [camera=null] - A camera.\r\n\t */\r\n\r\n\tadoptCameraSettings(camera = null) {\r\n\r\n\t\tif(camera !== null) {\r\n\r\n\t\t\tthis.uniforms.cameraNear.value = camera.near;\r\n\t\t\tthis.uniforms.cameraFar.value = camera.far;\r\n\r\n\t\t\tif(camera instanceof PerspectiveCamera) {\r\n\r\n\t\t\t\tthis.defines.PERSPECTIVE_CAMERA = \"1\";\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tdelete this.defines.PERSPECTIVE_CAMERA;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector4 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\n\\r\\nuniform float angle;\\r\\nuniform float scale;\\r\\nuniform float intensity;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec2 vUvPattern;\\r\\n\\r\\nfloat pattern() {\\r\\n\\r\\n\\tfloat s = sin(angle);\\r\\n\\tfloat c = cos(angle);\\r\\n\\r\\n\\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\\r\\n\\r\\n\\treturn (sin(point.x) * sin(point.y)) * 4.0;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tvec3 color = texel.rgb;\\r\\n\\r\\n\\t#ifdef AVERAGE\\r\\n\\r\\n\\t\\tcolor = vec3((color.r + color.g + color.b) / 3.0);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tcolor = vec3(color * 10.0 - 5.0 + pattern());\\r\\n\\tcolor = texel.rgb + (color - texel.rgb) * intensity;\\r\\n\\r\\n\\tgl_FragColor = vec4(color, texel.a);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec4 offsetRepeat;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec2 vUvPattern;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A dot screen shader material.\r\n */\r\n\r\nexport class DotScreenMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new dot screen material.\r\n\t *\r\n\t * @param {Boolean} [options] - The options.\r\n\t * @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white).\r\n\t * @param {Boolean} [options.angle=1.57] - The angle of the dot pattern.\r\n\t * @param {Boolean} [options.scale=1.0] - The scale of the dot pattern.\r\n\t * @param {Boolean} [options.intensity=1.0] - The intensity of the effect.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\taverage: false,\r\n\t\t\tangle: 1.57,\r\n\t\t\tscale: 1.0,\r\n\t\t\tintensity: 1.0\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"DotScreenMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\r\n\t\t\t\tangle: new Uniform(settings.angle),\r\n\t\t\t\tscale: new Uniform(settings.scale),\r\n\t\t\t\tintensity: new Uniform(settings.intensity),\r\n\r\n\t\t\t\toffsetRepeat: new Uniform(new Vector4(0.5, 0.5, 1.0, 1.0))\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setAverageEnabled(settings.average);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Screen blend mode.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Screen blend mode should be enabled.\r\n\t */\r\n\r\n\tsetAverageEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.AVERAGE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.AVERAGE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform float time;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\n#ifdef NOISE\\r\\n\\r\\n\\tuniform float noiseIntensity;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef SCANLINES\\r\\n\\r\\n\\tuniform float scanlineIntensity;\\r\\n\\tuniform float scanlineCount;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef GRID\\r\\n\\r\\n\\tuniform float gridIntensity;\\r\\n\\tuniform vec2 gridScale;\\r\\n\\tuniform float gridLineWidth;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef GREYSCALE\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\tuniform float greyscaleIntensity;\\r\\n\\r\\n#elif defined(SEPIA)\\r\\n\\r\\n\\tuniform float sepiaIntensity;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef VIGNETTE\\r\\n\\r\\n\\tuniform float vignetteOffset;\\r\\n\\tuniform float vignetteDarkness;\\r\\n\\r\\n#endif\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tvec3 color = texel.rgb;\\r\\n\\r\\n\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\tvec3 invColor;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef NOISE\\r\\n\\r\\n\\t\\tfloat x = vUv.x * vUv.y * time * 1000.0;\\r\\n\\t\\tx = mod(x, 13.0) * mod(x, 123.0);\\r\\n\\t\\tx = mod(x, 0.01);\\r\\n\\r\\n\\t\\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\\r\\n\\r\\n\\t\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\t\\tinvColor = vec3(1.0) - color;\\r\\n\\t\\t\\tvec3 invNoise = vec3(1.0) - noise;\\r\\n\\r\\n\\t\\t\\tcolor = vec3(1.0) - invColor * invNoise;\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tcolor += noise;\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef SCANLINES\\r\\n\\r\\n\\t\\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\\r\\n\\t\\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\\r\\n\\r\\n\\t\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\t\\tinvColor = vec3(1.0) - color;\\r\\n\\t\\t\\tvec3 invScanlines = vec3(1.0) - scanlines;\\r\\n\\r\\n\\t\\t\\tcolor = vec3(1.0) - invColor * invScanlines;\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tcolor += scanlines;\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef GRID\\r\\n\\r\\n\\t\\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\\r\\n\\t\\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef GREYSCALE\\r\\n\\r\\n\\t\\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\\r\\n\\r\\n\\t#elif defined(SEPIA)\\r\\n\\r\\n\\t\\tvec3 c = color.rgb;\\r\\n\\r\\n\\t\\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\\r\\n\\t\\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\\r\\n\\t\\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef VIGNETTE\\r\\n\\r\\n\\t\\tconst vec2 center = vec2(0.5);\\r\\n\\r\\n\\t\\t#ifdef ESKIL\\r\\n\\r\\n\\t\\t\\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\\r\\n\\t\\t\\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tfloat dist = distance(vUv, center);\\r\\n\\t\\t\\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\\r\\n\\r\\n\\t\\t#endif\\t\\t\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A cinematic shader that provides the following effects:\r\n * - Film Grain\r\n * - Scanlines\r\n * - Vignette\r\n * - Greyscale\r\n * - Sepia\r\n *\r\n * Original scanlines algorithm by Pat \"Hawthorne\" Shearon.\r\n * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\r\n *\r\n * Optimised scanlines and noise with intensity scaling by Georg \"Leviathan\"\r\n * Steinrohder. This version was provided under a Creative Commons Attribution\r\n * 3.0 License: http://creativecommons.org/licenses/by/3.0.\r\n *\r\n * The sepia effect is based on:\r\n * https://github.com/evanw/glfx.js\r\n *\r\n * The vignette code is based on PaintEffect postprocess from ro.me:\r\n * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\r\n */\r\n\r\nexport class FilmMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new film material.\r\n\t *\r\n\t * @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance.\r\n\t * @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive.\r\n\t * @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive.\r\n\t * @param {Boolean} [options.vignette=false] - Apply vignette effect.\r\n\t * @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out.\r\n\t * @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently.\r\n\t * @param {Boolean} [options.noise=true] - Show noise-based film grain.\r\n\t * @param {Boolean} [options.scanlines=true] - Show scanlines.\r\n\t * @param {Boolean} [options.grid=true] - Show a grid.\r\n\t * @param {Number} [options.noiseIntensity=0.5] - The noise intensity.\r\n\t * @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity.\r\n\t * @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0.\r\n\t * @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0.\r\n\t * @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0.\r\n\t * @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0.\r\n\t * @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\r\n\t\t\tscreenMode: true,\r\n\t\t\tnoise: true,\r\n\t\t\tscanlines: true,\r\n\t\t\tgrid: false,\r\n\r\n\t\t\tgreyscale: false,\r\n\t\t\tsepia: false,\r\n\t\t\tvignette: false,\r\n\t\t\teskil: false,\r\n\r\n\t\t\tnoiseIntensity: 0.5,\r\n\t\t\tscanlineIntensity: 0.05,\r\n\t\t\tgridIntensity: 1.0,\r\n\t\t\tgreyscaleIntensity: 1.0,\r\n\t\t\tsepiaIntensity: 1.0,\r\n\r\n\t\t\tvignetteOffset: 1.0,\r\n\t\t\tvignetteDarkness: 1.0\r\n\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"FilmMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttime: new Uniform(0.0),\r\n\r\n\t\t\t\tnoiseIntensity: new Uniform(settings.noiseIntensity),\r\n\t\t\t\tscanlineIntensity: new Uniform(settings.scanlineIntensity),\r\n\t\t\t\tgridIntensity: new Uniform(settings.gridIntensity),\r\n\r\n\t\t\t\tscanlineCount: new Uniform(0.0),\r\n\t\t\t\tgridScale: new Uniform(new Vector2()),\r\n\t\t\t\tgridLineWidth: new Uniform(0.0),\r\n\r\n\t\t\t\tgreyscaleIntensity: new Uniform(settings.greyscaleIntensity),\r\n\t\t\t\tsepiaIntensity: new Uniform(settings.sepiaIntensity),\r\n\r\n\t\t\t\tvignetteOffset: new Uniform(settings.vignetteOffset),\r\n\t\t\t\tvignetteDarkness: new Uniform(settings.vignetteDarkness)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setScreenModeEnabled(settings.screenMode);\r\n\t\tthis.setNoiseEnabled(settings.noise);\r\n\t\tthis.setScanlinesEnabled(settings.scanlines);\r\n\t\tthis.setGridEnabled(settings.grid);\r\n\t\tthis.setGreyscaleEnabled(settings.greyscale);\r\n\t\tthis.setSepiaEnabled(settings.sepia);\r\n\t\tthis.setVignetteEnabled(settings.vignette);\r\n\t\tthis.setEskilEnabled(settings.eskil);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Screen blend mode.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Screen blend mode should be enabled.\r\n\t */\r\n\r\n\tsetScreenModeEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SCREEN_MODE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SCREEN_MODE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the noise effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the noise effect should be enabled.\r\n\t */\r\n\r\n\tsetNoiseEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.NOISE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.NOISE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the scanlines effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the scanlines effect should be enabled.\r\n\t */\r\n\r\n\tsetScanlinesEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SCANLINES = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SCANLINES;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the grid effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the grid effect should be enabled.\r\n\t */\r\n\r\n\tsetGridEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.GRID = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.GRID;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the greyscale effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the greyscale effect should be enabled.\r\n\t */\r\n\r\n\tsetGreyscaleEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.GREYSCALE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.GREYSCALE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the sepia effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the sepia effect should be enabled.\r\n\t */\r\n\r\n\tsetSepiaEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SEPIA = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SEPIA;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Vignette effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Vignette effect should be enabled.\r\n\t */\r\n\r\n\tsetVignetteEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.VIGNETTE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.VIGNETTE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Eskil Vignette effect.\r\n\t *\r\n\t * Has no effect if Vignette is disabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled.\r\n\t */\r\n\r\n\tsetEskilEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.ESKIL = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.ESKIL;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tPerturb;\\r\\n\\r\\nuniform bool active;\\r\\n\\r\\nuniform float amount;\\r\\nuniform float angle;\\r\\nuniform float seed;\\r\\nuniform float seedX;\\r\\nuniform float seedY;\\r\\nuniform float distortionX;\\r\\nuniform float distortionY;\\r\\nuniform float colS;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nfloat rand(vec2 tc) {\\r\\n\\r\\n\\tconst float a = 12.9898;\\r\\n\\tconst float b = 78.233;\\r\\n\\tconst float c = 43758.5453;\\r\\n\\r\\n\\tfloat dt = dot(tc, vec2(a, b));\\r\\n\\tfloat sn = mod(dt, 3.14);\\r\\n\\r\\n\\treturn fract(sin(sn) * c);\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 coord = vUv;\\r\\n\\r\\n\\tfloat xs, ys;\\r\\n\\tvec4 normal;\\r\\n\\r\\n\\tvec2 offset;\\r\\n\\tvec4 cr, cga, cb;\\r\\n\\tvec4 snow, color;\\r\\n\\r\\n\\tfloat sx, sy;\\r\\n\\r\\n\\tif(active) {\\r\\n\\r\\n\\t\\txs = floor(gl_FragCoord.x / 0.5);\\r\\n\\t\\tys = floor(gl_FragCoord.y / 0.5);\\r\\n\\r\\n\\t\\tnormal = texture2D(tPerturb, coord * seed * seed);\\r\\n\\r\\n\\t\\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\\r\\n\\r\\n\\t\\t\\tsx = clamp(ceil(seedX), 0.0, 1.0);\\r\\n\\t\\t\\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\\r\\n\\r\\n\\t\\t\\tsy = clamp(ceil(seedY), 0.0, 1.0);\\r\\n\\t\\t\\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tcoord.x += normal.x * seedX * (seed / 5.0);\\r\\n\\t\\tcoord.y += normal.y * seedY * (seed / 5.0);\\r\\n\\r\\n\\t\\toffset = amount * vec2(cos(angle), sin(angle));\\r\\n\\r\\n\\t\\tcr = texture2D(tDiffuse, coord + offset);\\r\\n\\t\\tcga = texture2D(tDiffuse, coord);\\r\\n\\t\\tcb = texture2D(tDiffuse, coord - offset);\\r\\n\\r\\n\\t\\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\\r\\n\\t\\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\\r\\n\\t\\tcolor += snow;\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A glitch shader material.\r\n *\r\n * Reference:\r\n * https://github.com/staffantan/unityglitch\r\n */\r\n\r\nexport class GlitchMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new glitch material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"GlitchMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttPerturb: new Uniform(null),\r\n\r\n\t\t\t\tactive: new Uniform(1),\r\n\r\n\t\t\t\tamount: new Uniform(0.8),\r\n\t\t\t\tangle: new Uniform(0.02),\r\n\t\t\t\tseed: new Uniform(0.02),\r\n\t\t\t\tseedX: new Uniform(0.02),\r\n\t\t\t\tseedY: new Uniform(0.02),\r\n\t\t\t\tdistortionX: new Uniform(0.5),\r\n\t\t\t\tdistortionY: new Uniform(0.6),\r\n\t\t\t\tcolS: new Uniform(0.05)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform vec3 lightPosition;\\r\\n\\r\\nuniform float exposure;\\r\\nuniform float decay;\\r\\nuniform float density;\\r\\nuniform float weight;\\r\\nuniform float clampMax;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 texCoord = vUv;\\r\\n\\r\\n\\t// Calculate vector from pixel to light source in screen space.\\r\\n\\tvec2 deltaTexCoord = texCoord - lightPosition.st;\\r\\n\\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\\r\\n\\r\\n\\t// A decreasing illumination factor.\\r\\n\\tfloat illuminationDecay = 1.0;\\r\\n\\r\\n\\tvec4 sample;\\r\\n\\tvec4 color = vec4(0.0);\\r\\n\\r\\n\\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\\r\\n\\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\\r\\n\\r\\n\\t\\ttexCoord -= deltaTexCoord;\\r\\n\\t\\tsample = texture2D(tDiffuse, texCoord);\\r\\n\\r\\n\\t\\t// Apply sample attenuation scale/decay factors.\\r\\n\\t\\tsample *= illuminationDecay * weight;\\r\\n\\r\\n\\t\\tcolor += sample;\\r\\n\\r\\n\\t\\t// Update exponential decay factor.\\r\\n\\t\\tilluminationDecay *= decay;\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A crepuscular rays shader material.\r\n *\r\n * This material supports dithering.\r\n *\r\n * References:\r\n *\r\n * Thibaut Despoulain, 2012:\r\n * [(WebGL) Volumetric Light Approximation in Three.js](\r\n * http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html)\r\n *\r\n * Nvidia, GPU Gems 3, 2008:\r\n * [Chapter 13. Volumetric Light Scattering as a Post-Process](\r\n * https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html)\r\n */\r\n\r\nexport class GodRaysMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new god rays material.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.density=0.96] - The density of the light rays.\r\n\t * @param {Number} [options.decay=0.93] - An illumination decay factor.\r\n\t * @param {Number} [options.weight=0.4] - A light ray weight factor.\r\n\t * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.\r\n\t * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\texposure: 0.6,\r\n\t\t\tdensity: 0.93,\r\n\t\t\tdecay: 0.96,\r\n\t\t\tweight: 0.4,\r\n\t\t\tclampMax: 1.0\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"GodRaysMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tNUM_SAMPLES_FLOAT: \"60.0\",\r\n\t\t\t\tNUM_SAMPLES_INT: \"60\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tlightPosition: new Uniform(null),\r\n\r\n\t\t\t\texposure: new Uniform(settings.exposure),\r\n\t\t\t\tdecay: new Uniform(settings.decay),\r\n\t\t\t\tdensity: new Uniform(settings.density),\r\n\t\t\t\tweight: new Uniform(settings.weight),\r\n\t\t\t\tclampMax: new Uniform(settings.clampMax)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform float distinction;\\r\\nuniform vec2 range;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tfloat l = linearToRelativeLuminance(texel.rgb);\\r\\n\\r\\n\\t#ifdef RANGE\\r\\n\\r\\n\\t\\tfloat low = step(range.x, l);\\r\\n\\t\\tfloat high = step(l, range.y);\\r\\n\\r\\n\\t\\t// Apply the mask.\\r\\n\\t\\tl *= low * high;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tl = pow(abs(l), distinction);\\r\\n\\r\\n\\t#ifdef COLOR\\r\\n\\r\\n\\t\\tgl_FragColor = vec4(texel.rgb * l, texel.a);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tgl_FragColor = vec4(l, l, l, texel.a);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A luminosity shader material.\r\n *\r\n * This shader produces a greyscale luminance map that describes the absolute\r\n * amount of light emitted by a scene. It can also be configured to output\r\n * colours that are scaled with their respective luminance value. Additionally,\r\n * a range may be provided to mask out undesired texels.\r\n *\r\n * The alpha channel will remain unaffected in all cases.\r\n *\r\n * On luminance coefficients:\r\n * http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9\r\n *\r\n * Coefficients for different colour spaces:\r\n * https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png\r\n *\r\n * Luminance range reference:\r\n * https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z\r\n */\r\n\r\nexport class LuminosityMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new luminosity material.\r\n\t *\r\n\t * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value.\r\n\t * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range.\r\n\t */\r\n\r\n\tconstructor(colorOutput = false, luminanceRange = null) {\r\n\r\n\t\tconst maskLuminance = (luminanceRange !== null);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"LuminosityMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tdistinction: new Uniform(1.0),\r\n\t\t\t\trange: new Uniform(maskLuminance ? luminanceRange : new Vector2())\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex\r\n\r\n\t\t});\r\n\r\n\t\tthis.setColorOutputEnabled(colorOutput);\r\n\t\tthis.setLuminanceRangeEnabled(maskLuminance);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables color output.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether color output should be enabled.\r\n\t */\r\n\r\n\tsetColorOutputEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.COLOR = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.COLOR;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the luminance mask.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the luminance mask should be enabled.\r\n\t */\r\n\r\n\tsetLuminanceRangeEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.RANGE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.RANGE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { Color, ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tMask;\\r\\nuniform sampler2D tEdges;\\r\\n\\r\\nuniform vec3 visibleEdgeColor;\\r\\nuniform vec3 hiddenEdgeColor;\\r\\nuniform float pulse;\\r\\nuniform float edgeStrength;\\r\\n\\r\\n#ifdef USE_PATTERN\\r\\n\\r\\n\\tuniform sampler2D tPattern;\\r\\n\\tvarying vec2 vPatternCoord;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 color = texture2D(tDiffuse, vUv);\\r\\n\\tvec2 edge = texture2D(tEdges, vUv).rg;\\r\\n\\tvec2 mask = texture2D(tMask, vUv).rg;\\r\\n\\r\\n\\t#ifndef X_RAY\\r\\n\\r\\n\\t\\tedge.y = 0.0;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tedge *= (edgeStrength * mask.x * pulse);\\r\\n\\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\\r\\n\\r\\n\\t#ifdef ALPHA_BLENDING\\r\\n\\r\\n\\t\\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tcolor.rgb += outlineColor;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef USE_PATTERN\\r\\n\\r\\n\\t\\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\\r\\n\\r\\n\\t\\t#ifdef X_RAY\\r\\n\\r\\n\\t\\t\\tfloat hiddenFactor = 0.5;\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tfloat hiddenFactor = 0.0;\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t\\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\\r\\n\\r\\n\\t\\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"#ifdef USE_PATTERN\\r\\n\\r\\n\\tuniform float aspect;\\r\\n\\tuniform float patternScale;\\r\\n\\tvarying vec2 vPatternCoord;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#ifdef USE_PATTERN\\r\\n\\r\\n\\t\\tvec2 aspectCorrection = vec2(aspect, 1.0);\\r\\n\\t\\tvPatternCoord = uv * aspectCorrection * patternScale;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An outline blend shader material.\r\n */\r\n\r\nexport class OutlineBlendMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new outline blend material.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.edgeStrength=1.0] - The edge strength.\r\n\t * @param {Number} [options.patternScale=1.0] - The scale of the pattern texture.\r\n\t * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges.\r\n\t * @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges.\r\n\t * @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha.\r\n\t * @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\tedgeStrength: 1.0,\r\n\t\t\tpatternScale: 1.0,\r\n\t\t\tvisibleEdgeColor: 0xffffff,\r\n\t\t\thiddenEdgeColor: 0x22090A,\r\n\t\t\talphaBlending: false,\r\n\t\t\txRay: true\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"OutlineBlendMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\tpulse: new Uniform(1.0),\r\n\t\t\t\taspect: new Uniform(1.0),\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttMask: new Uniform(null),\r\n\t\t\t\ttEdges: new Uniform(null),\r\n\t\t\t\ttPattern: new Uniform(null),\r\n\r\n\t\t\t\tedgeStrength: new Uniform(settings.edgeStrength),\r\n\t\t\t\tpatternScale: new Uniform(settings.patternScale),\r\n\r\n\t\t\t\tvisibleEdgeColor: new Uniform(new Color(settings.visibleEdgeColor)),\r\n\t\t\t\thiddenEdgeColor: new Uniform(new Color(settings.hiddenEdgeColor))\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setAlphaBlendingEnabled(settings.alphaBlending);\r\n\t\tthis.setXRayEnabled(settings.xRay);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the alpha blending.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the alpha blending should be enabled.\r\n\t */\r\n\r\n\tsetAlphaBlendingEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.ALPHA_BLENDING = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.ALPHA_BLENDING;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether hidden parts of selected objects should be visible.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether hidden parts of selected objects should be visible.\r\n\t */\r\n\r\n\tsetXRayEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.X_RAY = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.X_RAY;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a pattern texture to use as overlay.\r\n\t *\r\n\t * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.\r\n\t */\r\n\r\n\tsetPatternTexture(texture = null) {\r\n\r\n\t\tif(texture !== null) {\r\n\r\n\t\t\tthis.defines.USE_PATTERN = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.USE_PATTERN;\r\n\r\n\t\t}\r\n\r\n\t\tthis.uniforms.tPattern.value = texture;\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tMask;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 c0 = texture2D(tMask, vUv0).rg;\\r\\n\\tvec2 c1 = texture2D(tMask, vUv1).rg;\\r\\n\\tvec2 c2 = texture2D(tMask, vUv2).rg;\\r\\n\\tvec2 c3 = texture2D(tMask, vUv3).rg;\\r\\n\\r\\n\\tfloat d0 = (c0.x - c1.x) * 0.5;\\r\\n\\tfloat d1 = (c2.x - c3.x) * 0.5;\\r\\n\\tfloat d = length(vec2(d0, d1));\\r\\n\\r\\n\\tfloat a0 = min(c0.y, c1.y);\\r\\n\\tfloat a1 = min(c2.y, c3.y);\\r\\n\\tfloat visibilityFactor = min(a0, a1);\\r\\n\\r\\n\\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\\r\\n\\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\\r\\n\\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\\r\\n\\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An outline edge detection shader material.\r\n */\r\n\r\nexport class OutlineEdgesMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new outline edge detection material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"OutlineEdgesMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttMask: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(new Vector2())\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setTexelSize(texelSize.x, texelSize.y);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the texel size.\r\n\t *\r\n\t * @param {Number} x - The texel width.\r\n\t * @param {Number} y - The texel height.\r\n\t */\r\n\r\n\tsetTexelSize(x, y) {\r\n\r\n\t\tthis.uniforms.texelSize.value.set(x, y);\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform float granularity;\\r\\nuniform float dx;\\r\\nuniform float dy;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel;\\r\\n\\r\\n\\tif(granularity > 0.0) {\\r\\n\\r\\n\\t\\tvec2 coord = vec2(\\r\\n\\t\\t\\tdx * (floor(vUv.x / dx) + 0.5),\\r\\n\\t\\t\\tdy * (floor(vUv.y / dy) + 0.5)\\r\\n\\t\\t);\\r\\n\\r\\n\\t\\ttexel = texture2D(tDiffuse, coord);\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\ttexel = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = texel;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A pixelation shader material.\r\n *\r\n * Original shader code by Robert Casanova:\r\n * https://github.com/robertcasanova/pixelate-shader\r\n */\r\n\r\nexport class PixelationMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new pixelation material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"PixelationMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tgranularity: new Uniform(1.0),\r\n\t\t\t\tresolution: new Uniform(new Vector2(1.0, 1.0)),\r\n\t\t\t\tdx: new Uniform(1.0),\r\n\t\t\t\tdy: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The pixel granularity.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget granularity() {\r\n\r\n\t\treturn this.uniforms.granularity.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * A higher value yields coarser visuals.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset granularity(x) {\r\n\r\n\t\tconst uniforms = this.uniforms;\r\n\t\tconst resolution = uniforms.resolution.value;\r\n\r\n\t\tuniforms.granularity.value = x;\r\n\t\tuniforms.dx.value = x / resolution.x;\r\n\t\tuniforms.dy.value = x / resolution.y;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the resolution.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetResolution(width, height) {\r\n\r\n\t\tthis.uniforms.resolution.value.set(width, height);\r\n\t\tthis.granularity = this.granularity;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform sampler2D tDepth;\\r\\n\\r\\nuniform vec2 texelSize;\\r\\nuniform vec2 halfTexelSize;\\r\\n\\r\\nuniform float cameraNear;\\r\\nuniform float cameraFar;\\r\\n\\r\\nuniform float focalLength;\\r\\nuniform float focalStop;\\r\\n\\r\\nuniform float maxBlur;\\r\\nuniform float luminanceThreshold;\\r\\nuniform float luminanceGain;\\r\\nuniform float bias;\\r\\nuniform float fringe;\\r\\nuniform float ditherStrength;\\r\\n\\r\\n#ifdef SHADER_FOCUS\\r\\n\\r\\n\\tuniform vec2 focusCoords;\\r\\n\\r\\n#else\\r\\n\\r\\n\\tuniform float focalDepth;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\n#ifndef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\\r\\n\\r\\n\\t\\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\\r\\n\\t\\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t\\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef PENTAGON\\r\\n\\r\\n\\tfloat penta(vec2 coords) {\\r\\n\\r\\n\\t\\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\\r\\n\\r\\n\\t\\tconst vec4 ONE = vec4(1.0);\\r\\n\\r\\n\\t\\tconst float P_FEATHER = 0.4;\\r\\n\\t\\tconst float N_FEATHER = -P_FEATHER;\\r\\n\\r\\n\\t\\tfloat inOrOut = -4.0;\\r\\n\\r\\n\\t\\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\\r\\n\\r\\n\\t\\tvec4 dist = vec4(\\r\\n\\t\\t\\tdot(P, HS0),\\r\\n\\t\\t\\tdot(P, HS1),\\r\\n\\t\\t\\tdot(P, HS2),\\r\\n\\t\\t\\tdot(P, HS3)\\r\\n\\t\\t);\\r\\n\\r\\n\\t\\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\\r\\n\\r\\n\\t\\tinOrOut += dot(dist, ONE);\\r\\n\\r\\n\\t\\tdist.x = dot(P, HS4);\\r\\n\\t\\tdist.y = HS5.w - abs(P.z);\\r\\n\\r\\n\\t\\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\\r\\n\\t\\tinOrOut += dist.x;\\r\\n\\r\\n\\t\\treturn clamp(inOrOut, 0.0, 1.0);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef SHOW_FOCUS\\r\\n\\r\\n\\tvec3 debugFocus(vec3 c, float blur, float depth) {\\r\\n\\r\\n\\t\\tfloat edge = 0.002 * depth;\\r\\n\\t\\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\\r\\n\\t\\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\\r\\n\\r\\n\\t\\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\\r\\n\\t\\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\\r\\n\\r\\n\\t\\treturn c;\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef VIGNETTE\\r\\n\\r\\n\\tfloat vignette() {\\r\\n\\r\\n\\t\\tconst vec2 CENTER = vec2(0.5);\\r\\n\\r\\n\\t\\tconst float VIGNETTE_OUT = 1.3;\\r\\n\\t\\tconst float VIGNETTE_IN = 0.0;\\r\\n\\t\\tconst float VIGNETTE_FADE = 22.0; \\r\\n\\r\\n\\t\\tfloat d = distance(vUv, CENTER);\\r\\n\\t\\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\\r\\n\\r\\n\\t\\treturn clamp(d, 0.0, 1.0);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\nvec2 rand2(vec2 coord) {\\r\\n\\r\\n\\tvec2 noise;\\r\\n\\r\\n\\t#ifdef NOISE\\r\\n\\r\\n\\t\\tconst float a = 12.9898;\\r\\n\\t\\tconst float b = 78.233;\\r\\n\\t\\tconst float c = 43758.5453;\\r\\n\\r\\n\\t\\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\\r\\n\\t\\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\\r\\n\\t\\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\treturn noise;\\r\\n\\r\\n}\\r\\n\\r\\nvec3 processTexel(vec2 coords, float blur) {\\r\\n\\r\\n\\tvec3 c;\\r\\n\\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\\r\\n\\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\\r\\n\\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\\r\\n\\r\\n\\t// Calculate the luminance of the constructed colour.\\r\\n\\tfloat luminance = linearToRelativeLuminance(c);\\r\\n\\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\\r\\n\\r\\n\\treturn c + mix(vec3(0.0), c, threshold * blur);\\r\\n\\r\\n}\\r\\n\\r\\nfloat linearize(float depth) {\\r\\n\\r\\n\\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\\r\\n\\r\\n}\\r\\n\\r\\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\\r\\n\\r\\n\\tconst float TWO_PI = 6.28318531;\\r\\n\\r\\n\\tfloat step = TWO_PI / ringSamples;\\r\\n\\tfloat pw = cos(j * step) * i;\\r\\n\\tfloat ph = sin(j * step) * i;\\r\\n\\r\\n\\t#ifdef PENTAGON\\r\\n\\r\\n\\t\\tfloat p = penta(vec2(pw, ph));\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat p = 1.0;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\\r\\n\\r\\n\\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#ifdef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t\\tfloat depth = linearize(texture2D(tDepth, vUv).x);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat depth = linearize(readDepth(tDepth, vUv));\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef SHADER_FOCUS\\r\\n\\r\\n\\t\\t#ifdef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t\\t\\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat fDepth = focalDepth;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef MANUAL_DOF\\r\\n\\r\\n\\t\\tconst float nDoFStart = 1.0; \\r\\n\\t\\tconst float nDoFDist = 2.0;\\r\\n\\t\\tconst float fDoFStart = 1.0;\\r\\n\\t\\tconst float fDoFDist = 3.0;\\r\\n\\r\\n\\t\\tfloat focalPlane = depth - fDepth;\\r\\n\\t\\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\\r\\n\\t\\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\\r\\n\\r\\n\\t\\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\\r\\n\\r\\n\\t\\tfloat focalPlaneMM = fDepth * 1000.0;\\r\\n\\t\\tfloat depthMM = depth * 1000.0;\\r\\n\\r\\n\\t\\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\\r\\n\\t\\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\\r\\n\\t\\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\\r\\n\\r\\n\\t\\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tblur = clamp(blur, 0.0, 1.0);\\r\\n\\r\\n\\t// Dithering.\\r\\n\\tvec2 noise = rand2(vUv) * ditherStrength * blur;\\r\\n\\r\\n\\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\\r\\n\\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\\r\\n\\r\\n\\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\\r\\n\\r\\n\\t// Calculation of final color.\\r\\n\\tvec4 color;\\r\\n\\r\\n\\tif(blur < 0.05) {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t\\tfloat s = 1.0;\\r\\n\\t\\tint ringSamples;\\r\\n\\r\\n\\t\\tfor(int i = 1; i <= RINGS_INT; ++i) {\\r\\n\\r\\n\\t\\t\\tringSamples = i * SAMPLES_INT;\\r\\n\\r\\n\\t\\t\\t// Constant loop.\\r\\n\\t\\t\\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\\r\\n\\r\\n\\t\\t\\t\\t// Break earlier.\\r\\n\\t\\t\\t\\tif(j >= ringSamples) { break; }\\r\\n\\r\\n\\t\\t\\t\\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\\r\\n\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tcolor.rgb /= s; // Divide by sample count.\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\t#ifdef SHOW_FOCUS\\r\\n\\r\\n\\t\\tcolor.rgb = debugFocus(color.rgb, blur, depth);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef VIGNETTE\\r\\n\\r\\n\\t\\tcolor.rgb *= vignette();\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Depth of Field shader v2.4.\r\n *\r\n * Original shader code by Martins Upitis:\r\n * http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update)\r\n */\r\n\r\nexport class RealisticBokehMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh2 material.\r\n\t *\r\n\t * @param {PerspectiveCamera} [camera] - The main camera.\r\n\t * @param {Object} [options] - Additional options.\r\n\t * @param {Vector2} [options.texelSize] - The absolute screen texel size.\r\n\t * @param {Boolean} [options.rings=3] - The number of blurring iterations.\r\n\t * @param {Boolean} [options.samples=2] - The amount of samples taken per ring.\r\n\t * @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted.\r\n\t * @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur.\r\n\t * @param {Boolean} [options.vignette=false] - Enables a vignette effect.\r\n\t * @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels.\r\n\t * @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!).\r\n\t * @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering.\r\n\t * @param {Number} [options.maxBlur=1.0] - The maximum blur strength.\r\n\t * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold.\r\n\t * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor.\r\n\t * @param {Number} [options.bias=0.5] - A blur bias.\r\n\t * @param {Number} [options.fringe=0.7] - A blur offset.\r\n\t * @param {Number} [options.ditherStrength=0.0001] - The dither strength.\r\n\t */\r\n\r\n\tconstructor(camera = null, options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\ttexelSize: null,\r\n\t\t\trings: 3,\r\n\t\t\tsamples: 2,\r\n\t\t\tshowFocus: false,\r\n\t\t\tmanualDoF: false,\r\n\t\t\tvignette: false,\r\n\t\t\tpentagon: false,\r\n\t\t\tshaderFocus: true,\r\n\t\t\tnoise: true,\r\n\t\t\tmaxBlur: 1.0,\r\n\t\t\tluminanceThreshold: 0.5,\r\n\t\t\tluminanceGain: 2.0,\r\n\t\t\tbias: 0.5,\r\n\t\t\tfringe: 0.7,\r\n\t\t\tditherStrength: 0.0001\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"RealisticBokehMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tRINGS_INT: settings.rings.toFixed(0),\r\n\t\t\t\tRINGS_FLOAT: settings.rings.toFixed(1),\r\n\t\t\t\tSAMPLES_INT: settings.samples.toFixed(0),\r\n\t\t\t\tSAMPLES_FLOAT: settings.samples.toFixed(1)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttDepth: new Uniform(null),\r\n\r\n\t\t\t\ttexelSize: new Uniform(new Vector2()),\r\n\t\t\t\thalfTexelSize: new Uniform(new Vector2()),\r\n\r\n\t\t\t\tcameraNear: new Uniform(0.1),\r\n\t\t\t\tcameraFar: new Uniform(2000),\r\n\r\n\t\t\t\tfocalLength: new Uniform(24.0),\r\n\t\t\t\tfocalStop: new Uniform(0.9),\r\n\r\n\t\t\t\tmaxBlur: new Uniform(settings.maxBlur),\r\n\t\t\t\tluminanceThreshold: new Uniform(settings.luminanceThreshold),\r\n\t\t\t\tluminanceGain: new Uniform(settings.luminanceGain),\r\n\t\t\t\tbias: new Uniform(settings.bias),\r\n\t\t\t\tfringe: new Uniform(settings.fringe),\r\n\t\t\t\tditherStrength: new Uniform(settings.ditherStrength),\r\n\r\n\t\t\t\tfocusCoords: new Uniform(new Vector2(0.5, 0.5)),\r\n\t\t\t\tfocalDepth: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setShowFocusEnabled(settings.showFocus);\r\n\t\tthis.setManualDepthOfFieldEnabled(settings.manualDoF);\r\n\t\tthis.setVignetteEnabled(settings.vignette);\r\n\t\tthis.setPentagonEnabled(settings.pentagon);\r\n\t\tthis.setShaderFocusEnabled(settings.shaderFocus);\r\n\t\tthis.setNoiseEnabled(settings.noise);\r\n\r\n\t\tif(settings.texelSize !== null) {\r\n\r\n\t\t\tthis.setTexelSize(settings.texelSize.x, settings.texelSize.y);\r\n\r\n\t\t}\r\n\r\n\t\tthis.adoptCameraSettings(camera);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the focus should be shown.\r\n\t *\r\n\t * @param {Boolean} enabled - True if the focus should be shown, false otherwise.\r\n\t */\r\n\r\n\tsetShowFocusEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SHOW_FOCUS = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SHOW_FOCUS;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether manual Depth of Field should be enabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether manual DoF should be enabled.\r\n\t */\r\n\r\n\tsetManualDepthOfFieldEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.MANUAL_DOF = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.MANUAL_DOF;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the Vignette effect should be enabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Vignette effect should be enabled.\r\n\t */\r\n\r\n\tsetVignetteEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.VIGNETTE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.VIGNETTE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the pentagonal blur effect should be enabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled.\r\n\t */\r\n\r\n\tsetPentagonEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.PENTAGON = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.PENTAGON;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the automatic shader focus.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the shader focus should be enabled.\r\n\t */\r\n\r\n\tsetShaderFocusEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SHADER_FOCUS = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SHADER_FOCUS;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the dithering should compute noise.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether noise-based dithering should be enabled.\r\n\t */\r\n\r\n\tsetNoiseEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.NOISE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.NOISE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the texel size.\r\n\t *\r\n\t * @param {Number} x - The texel width.\r\n\t * @param {Number} y - The texel height.\r\n\t */\r\n\r\n\tsetTexelSize(x, y) {\r\n\r\n\t\tthis.uniforms.texelSize.value.set(x, y);\r\n\t\tthis.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adopts the near and far plane and the focal length of the given camera.\r\n\t *\r\n\t * @param {PerspectiveCamera} camera - The main camera.\r\n\t */\r\n\r\n\tadoptCameraSettings(camera) {\r\n\r\n\t\tif(camera !== null) {\r\n\r\n\t\t\tthis.uniforms.cameraNear.value = camera.near;\r\n\t\t\tthis.uniforms.cameraFar.value = camera.far;\r\n\t\t\tthis.uniforms.focalLength.value = camera.getFocalLength(); // unit: mm.\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform vec2 center;\\r\\nuniform float aspect;\\r\\nuniform float waveSize;\\r\\nuniform float radius;\\r\\nuniform float maxRadius;\\r\\nuniform float amplitude;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying float vSize;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 aspectCorrection = vec2(aspect, 1.0);\\r\\n\\r\\n\\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\\r\\n\\tfloat distance = sqrt(dot(difference, difference)) * vSize;\\r\\n\\r\\n\\tvec2 displacement = vec2(0.0);\\r\\n\\r\\n\\tif(distance > radius) {\\r\\n\\r\\n\\t\\tif(distance < radius + waveSize) {\\r\\n\\r\\n\\t\\t\\tfloat angle = (distance - radius) * PI2 / waveSize;\\r\\n\\t\\t\\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\\r\\n\\r\\n\\t\\t\\tfloat extent = maxRadius + waveSize;\\r\\n\\t\\t\\tfloat decay = max(extent - distance * distance, 0.0) / extent;\\r\\n\\r\\n\\t\\t\\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform float size;\\r\\nuniform float scale;\\r\\nuniform float cameraDistance;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying float vSize;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tvSize = (0.1 * cameraDistance) / size;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A shock wave shader material.\r\n *\r\n * Based on a Gist by Jean-Philippe Sarda:\r\n * https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda\r\n */\r\n\r\nexport class ShockWaveMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new shock wave material.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.waveSize=0.2] - The wave size.\r\n\t * @param {Number} [options.amplitude=0.05] - The distortion amplitude.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\tmaxRadius: 1.0,\r\n\t\t\twaveSize: 0.2,\r\n\t\t\tamplitude: 0.05\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ShockWaveMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\r\n\t\t\t\tcenter: new Uniform(new Vector2(0.5, 0.5)),\r\n\t\t\t\taspect: new Uniform(1.0),\r\n\t\t\t\tcameraDistance: new Uniform(1.0),\r\n\r\n\t\t\t\tsize: new Uniform(1.0),\r\n\t\t\t\tradius: new Uniform(-settings.waveSize),\r\n\t\t\t\tmaxRadius: new Uniform(settings.maxRadius),\r\n\t\t\t\twaveSize: new Uniform(settings.waveSize),\r\n\t\t\t\tamplitude: new Uniform(settings.amplitude)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tWeights;\\r\\n\\r\\nuniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t// Fetch the blending weights for current pixel.\\r\\n\\tvec4 a;\\r\\n\\ta.xz = texture2D(tWeights, vUv).xz;\\r\\n\\ta.y = texture2D(tWeights, vOffset.zw).g;\\r\\n\\ta.w = texture2D(tWeights, vOffset.xy).a;\\r\\n\\r\\n\\tvec4 color;\\r\\n\\r\\n\\t// Check if there is any blending weight with a value greater than 0.0.\\r\\n\\tif(dot(a, vec4(1.0)) < 1e-5) {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv, 0.0);\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\t/* Up to four lines can be crossing a pixel (one through each edge).\\r\\n\\t\\t * The line with the maximum weight for each direction is favoured.\\r\\n\\t\\t */\\r\\n\\r\\n\\t\\tvec2 offset;\\r\\n\\t\\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\\r\\n\\t\\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\\r\\n\\r\\n\\t\\t// Go in the direction with the maximum weight (horizontal vs. vertical).\\r\\n\\t\\tif(abs(offset.x) > abs(offset.y)) {\\r\\n\\r\\n\\t\\t\\toffset.y = 0.0;\\r\\n\\r\\n\\t\\t} else {\\r\\n\\r\\n\\t\\t\\toffset.x = 0.0;\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t// Fetch the opposite color and lerp by hand.\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv, 0.0);\\r\\n\\t\\tvec2 coord = vUv + sign(offset) * texelSize;\\r\\n\\t\\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\\r\\n\\t\\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\\r\\n\\r\\n\\t\\t// Gamma correction.\\r\\n\\t\\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\\r\\n\\t\\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\\r\\n\\t\\tcolor = mix(color, oppositeColor, s);\\r\\n\\t\\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Subpixel Morphological Antialiasing.\r\n *\r\n * This material is used to render the final antialiasing.\r\n */\r\n\r\nexport class SMAABlendMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new SMAA blend material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"SMAABlendMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttWeights: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(texelSize)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform sampler2D tArea;\\r\\nuniform sampler2D tSearch;\\r\\n\\r\\nuniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\nvarying vec2 vPixCoord;\\r\\n\\r\\nvec2 round(vec2 x) {\\r\\n\\r\\n\\treturn sign(x) * floor(abs(x) + 0.5);\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchLength(vec2 e, float bias, float scale) {\\r\\n\\r\\n\\t// Not required if tSearch accesses are set to point.\\r\\n\\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\\r\\n\\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\\r\\n\\r\\n\\te.r = bias + e.r * scale;\\r\\n\\r\\n\\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchXLeft(vec2 texCoord, float end) {\\r\\n\\r\\n\\t/* @PSEUDO_GATHER4\\r\\n\\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\\r\\n\\t * sample between edge, thus fetching four edges in a row.\\r\\n\\t * Sampling with different offsets in each direction allows to disambiguate\\r\\n\\t * which edges are active from the four fetched ones.\\r\\n\\t */\\r\\n\\r\\n\\tvec2 e = vec2(0.0, 1.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord -= vec2(2.0, 0.0) * texelSize;\\r\\n\\r\\n\\t\\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\t// Correct the previously applied offset (-0.25, -0.125).\\r\\n\\ttexCoord.x += 0.25 * texelSize.x;\\r\\n\\r\\n\\t// The searches are biased by 1, so adjust the coords accordingly.\\r\\n\\ttexCoord.x += texelSize.x;\\r\\n\\r\\n\\t// Disambiguate the length added by the last step.\\r\\n\\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\\r\\n\\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\\r\\n\\r\\n\\treturn texCoord.x;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchXRight(vec2 texCoord, float end) {\\r\\n\\r\\n\\tvec2 e = vec2(0.0, 1.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord += vec2(2.0, 0.0) * texelSize;\\r\\n\\r\\n\\t\\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\ttexCoord.x -= 0.25 * texelSize.x;\\r\\n\\ttexCoord.x -= texelSize.x;\\r\\n\\ttexCoord.x -= 2.0 * texelSize.x;\\r\\n\\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\\r\\n\\r\\n\\treturn texCoord.x;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchYUp(vec2 texCoord, float end) {\\r\\n\\r\\n\\tvec2 e = vec2(1.0, 0.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\\r\\n\\r\\n\\t\\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y -= texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\\r\\n\\r\\n\\treturn texCoord.y;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchYDown(vec2 texCoord, float end) {\\r\\n\\r\\n\\tvec2 e = vec2(1.0, 0.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\\r\\n\\r\\n\\t\\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y += texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\\r\\n\\r\\n\\treturn texCoord.y;\\r\\n\\r\\n}\\r\\n\\r\\nvec2 area(vec2 dist, float e1, float e2, float offset) {\\r\\n\\r\\n\\t// Rounding prevents precision errors of bilinear filtering.\\r\\n\\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\\r\\n\\r\\n\\t// Scale and bias for texel space translation.\\r\\n\\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\\r\\n\\r\\n\\t// Move to proper place, according to the subpixel offset.\\r\\n\\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\\r\\n\\r\\n\\treturn texture2D(tArea, texCoord, 0.0).rg;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 weights = vec4(0.0);\\r\\n\\tvec4 subsampleIndices = vec4(0.0);\\r\\n\\tvec2 e = texture2D(tDiffuse, vUv).rg;\\r\\n\\r\\n\\tif(e.g > 0.0) {\\r\\n\\r\\n\\t\\t// Edge at north.\\r\\n\\t\\tvec2 d;\\r\\n\\r\\n\\t\\t// Find the distance to the left.\\r\\n\\t\\tvec2 coords;\\r\\n\\t\\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\\r\\n\\t\\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\\r\\n\\t\\td.x = coords.x;\\r\\n\\r\\n\\t\\t/* Now fetch the left crossing edges, two at a time using bilinear\\r\\n\\t\\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\\r\\n\\t\\tvalue each edge has. */\\r\\n\\t\\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\\r\\n\\r\\n\\t\\t// Find the distance to the right.\\r\\n\\t\\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\\r\\n\\t\\td.y = coords.x;\\r\\n\\r\\n\\t\\t/* Translate distances to pixel units for better interleave arithmetic and\\r\\n\\t\\tmemory accesses. */\\r\\n\\t\\td = d / texelSize.x - vPixCoord.x;\\r\\n\\r\\n\\t\\t// The area texture is compressed quadratically.\\r\\n\\t\\tvec2 sqrtD = sqrt(abs(d));\\r\\n\\r\\n\\t\\t// Fetch the right crossing edges.\\r\\n\\t\\tcoords.y -= texelSize.y; // WebGL port note: Added.\\r\\n\\t\\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\\r\\n\\r\\n\\t\\t// Pattern recognised, now get the actual area.\\r\\n\\t\\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tif(e.r > 0.0) {\\r\\n\\r\\n\\t\\t// Edge at west.\\r\\n\\t\\tvec2 d;\\r\\n\\r\\n\\t\\t// Find the distance to the top.\\r\\n\\t\\tvec2 coords;\\r\\n\\t\\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\\r\\n\\t\\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\\r\\n\\t\\td.x = coords.y;\\r\\n\\r\\n\\t\\t// Fetch the top crossing edges.\\r\\n\\t\\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\\r\\n\\r\\n\\t\\t// Find the distance to the bottom.\\r\\n\\t\\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\\r\\n\\t\\td.y = coords.y;\\r\\n\\r\\n\\t\\t// Distances in pixel units.\\r\\n\\t\\td = d / texelSize.y - vPixCoord.y;\\r\\n\\r\\n\\t\\t// The area texture is compressed quadratically.\\r\\n\\t\\tvec2 sqrtD = sqrt(abs(d));\\r\\n\\r\\n\\t\\t// Fetch the bottom crossing edges.\\r\\n\\t\\tcoords.y -= texelSize.y; // WebGL port note: Added.\\r\\n\\t\\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\\r\\n\\r\\n\\t\\t// Get the area for this direction.\\r\\n\\t\\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = weights;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\nvarying vec2 vPixCoord;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tvPixCoord = uv / texelSize;\\r\\n\\r\\n\\t// Offsets for the searches (see @PSEUDO_GATHER4).\\r\\n\\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\\r\\n\\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\\r\\n\\r\\n\\t// This indicates the ends of the loops.\\r\\n\\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Subpixel Morphological Antialiasing.\r\n *\r\n * This material computes weights for detected edges.\r\n */\r\n\r\nexport class SMAAWeightsMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new SMAA weights material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"SMAAWeightsMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\t// Configurable settings:\r\n\t\t\t\tMAX_SEARCH_STEPS_INT: \"8\",\r\n\t\t\t\tMAX_SEARCH_STEPS_FLOAT: \"8.0\",\r\n\r\n\t\t\t\t// Non-configurable settings:\r\n\t\t\t\tAREATEX_MAX_DISTANCE: \"16.0\",\r\n\t\t\t\tAREATEX_PIXEL_SIZE: \"(1.0 / vec2(160.0, 560.0))\",\r\n\t\t\t\tAREATEX_SUBTEX_SIZE: \"(1.0 / 7.0)\",\r\n\t\t\t\tSEARCHTEX_SIZE: \"vec2(66.0, 33.0)\",\r\n\t\t\t\tSEARCHTEX_PACKED_SIZE: \"vec2(64.0, 16.0)\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttArea: new Uniform(null),\r\n\t\t\t\ttSearch: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(texelSize)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the maximum amount of steps performed in the horizontal/vertical\r\n\t * pattern searches, at each side of the pixel.\r\n\t *\r\n\t * In number of pixels, it's actually the double. So the maximum line length\r\n\t * perfectly handled by, for example 16, is 64 (perfectly means that longer\r\n\t * lines won't look as good, but are still antialiased).\r\n\t *\r\n\t * @param {Number} steps - The search steps. Range: [0, 112].\r\n\t */\r\n\r\n\tsetOrthogonalSearchSteps(steps) {\r\n\r\n\t\tthis.defines.MAX_SEARCH_STEPS_INT = steps.toFixed(\"0\");\r\n\t\tthis.defines.MAX_SEARCH_STEPS_FLOAT = steps.toFixed(\"1\");\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform float middleGrey;\\r\\nuniform float maxLuminance;\\r\\n\\r\\n#ifdef ADAPTED_LUMINANCE\\r\\n\\r\\n\\tuniform sampler2D luminanceMap;\\r\\n\\r\\n#else\\r\\n\\r\\n\\tuniform float averageLuminance;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvec3 toneMap(vec3 c) {\\r\\n\\r\\n\\t#ifdef ADAPTED_LUMINANCE\\r\\n\\r\\n\\t\\t// Get the calculated average luminance by sampling the center.\\r\\n\\t\\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat lumAvg = averageLuminance;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t// Calculate the luminance of the current pixel.\\r\\n\\tfloat lumPixel = linearToRelativeLuminance(c);\\r\\n\\r\\n\\t// Apply the modified operator (Reinhard Eq. 4).\\r\\n\\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\\r\\n\\r\\n\\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\\r\\n\\r\\n\\treturn lumCompressed * c;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Full-screen tone-mapping shader material.\r\n *\r\n * This material supports dithering.\r\n *\r\n * Reference:\r\n * http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf\r\n */\r\n\r\nexport class ToneMappingMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new tone mapping material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ToneMappingMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tluminanceMap: new Uniform(null),\r\n\t\t\t\taverageLuminance: new Uniform(1.0),\r\n\t\t\t\tmaxLuminance: new Uniform(16.0),\r\n\t\t\t\tmiddleGrey: new Uniform(0.6)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","/**\r\n * A collection of shader materials that are used in the post processing passes.\r\n *\r\n * @module postprocessing/materials\r\n */\r\n\r\nexport { AdaptiveLuminosityMaterial } from \"./AdaptiveLuminosityMaterial.js\";\r\nexport { BokehMaterial } from \"./BokehMaterial.js\";\r\nexport { ColorEdgesMaterial } from \"./ColorEdgesMaterial.js\";\r\nexport { CombineMaterial } from \"./CombineMaterial.js\";\r\nexport { ConvolutionMaterial, KernelSize } from \"./ConvolutionMaterial.js\";\r\nexport { CopyMaterial } from \"./CopyMaterial.js\";\r\nexport { DepthComparisonMaterial } from \"./DepthComparisonMaterial.js\";\r\nexport { DotScreenMaterial } from \"./DotScreenMaterial.js\";\r\nexport { FilmMaterial } from \"./FilmMaterial.js\";\r\nexport { GlitchMaterial } from \"./GlitchMaterial.js\";\r\nexport { GodRaysMaterial } from \"./GodRaysMaterial.js\";\r\nexport { LuminosityMaterial } from \"./LuminosityMaterial.js\";\r\nexport { OutlineBlendMaterial } from \"./OutlineBlendMaterial.js\";\r\nexport { OutlineEdgesMaterial } from \"./OutlineEdgesMaterial.js\";\r\nexport { PixelationMaterial } from \"./PixelationMaterial.js\";\r\nexport { RealisticBokehMaterial } from \"./RealisticBokehMaterial.js\";\r\nexport { ShockWaveMaterial } from \"./ShockWaveMaterial.js\";\r\nexport { SMAABlendMaterial } from \"./SMAABlendMaterial.js\";\r\nexport { SMAAWeightsMaterial } from \"./SMAAWeightsMaterial.js\";\r\nexport { ToneMappingMaterial } from \"./ToneMappingMaterial.js\";\r\n","import { Scene, Mesh, OrthographicCamera, PlaneBufferGeometry } from \"three\";\r\n\r\n/**\r\n * An abstract pass.\r\n *\r\n * Passes that do not rely on the depth buffer should explicitly disable the\r\n * depth test and depth write in their respective shader materials.\r\n *\r\n * @implements {Resizable}\r\n * @implements {Disposable}\r\n */\r\n\r\nexport class Pass {\r\n\r\n\t/**\r\n\t * Constructs a new pass.\r\n\t *\r\n\t * @param {String} [name] - The name of this pass.\r\n\t * @param {Scene} [scene] - The scene to render.\r\n\t * @param {Camera} [camera] - The camera.\r\n\t * @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}).\r\n\t */\r\n\r\n\tconstructor(\r\n\t\tname = \"Pass\",\r\n\t\tscene = new Scene(),\r\n\t\tcamera = new OrthographicCamera(-1, 1, 1, -1, 0, 1),\r\n\t\tquad = new Mesh(new PlaneBufferGeometry(2, 2), null)\r\n\t) {\r\n\r\n\t\t/**\r\n\t\t * The name of this pass.\r\n\t\t *\r\n\t\t * @type {String}\r\n\t\t */\r\n\r\n\t\tthis.name = name;\r\n\r\n\t\t/**\r\n\t\t * The scene to render.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @protected\r\n\t\t */\r\n\r\n\t\tthis.scene = scene;\r\n\r\n\t\t/**\r\n\t\t * The camera.\r\n\t\t *\r\n\t\t * @type {Camera}\r\n\t\t * @protected\r\n\t\t */\r\n\r\n\t\tthis.camera = camera;\r\n\r\n\t\t/**\r\n\t\t * A quad mesh that fills the screen.\r\n\t\t *\r\n\t\t * @type {Mesh}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.quad = quad;\r\n\r\n\t\tif(this.quad !== null) {\r\n\r\n\t\t\tthis.quad.frustumCulled = false;\r\n\r\n\t\t\tif(this.scene !== null) {\r\n\r\n\t\t\t\tthis.scene.add(this.quad);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Indicates whether this pass should render to screen.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.renderToScreen = false;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether this pass should be executed.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.enabled = true;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the {@link EffectComposer} should swap the frame\r\n\t\t * buffers after this pass has finished rendering.\r\n\t\t *\r\n\t\t * Set this to `false` if this pass doesn't render to the output buffer or\r\n\t\t * the screen. Otherwise, the contents of the input buffer will be lost.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.needsSwap = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The fullscreen material.\r\n\t *\r\n\t * @type {Material}\r\n\t */\r\n\r\n\tget material() {\r\n\r\n\t\treturn (this.quad !== null) ? this.quad.material : null;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the fullscreen material.\r\n\t *\r\n\t * The material will be assigned to the quad mesh that fills the screen.\r\n\t *\r\n\t * @type {Material}\r\n\t */\r\n\r\n\tset material(value) {\r\n\r\n\t\tif(this.quad !== null) {\r\n\r\n\t\t\tthis.quad.material = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * This is an abstract method that must be overridden.\r\n\t *\r\n\t * @abstract\r\n\t * @throws {Error} An error is thrown if the method is not overridden.\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthrow new Error(\"Render method not implemented!\");\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates this pass with the renderer's size.\r\n\t *\r\n\t * You may override this method in case you want to be informed about the main\r\n\t * render size.\r\n\t *\r\n\t * The {@link EffectComposer} calls this method before this pass is\r\n\t * initialized and every time its own size is updated.\r\n\t *\r\n\t * @param {Number} width - The renderer's width.\r\n\t * @param {Number} height - The renderer's height.\r\n\t * @example this.myRenderTarget.setSize(width, height);\r\n\t */\r\n\r\n\tsetSize(width, height) {}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * By overriding this method you gain access to the renderer. You'll also be\r\n\t * able to configure your custom render targets to use the appropriate format\r\n\t * (RGB or RGBA).\r\n\t *\r\n\t * The provided renderer can be used to warm up special off-screen render\r\n\t * targets by performing a preliminary render operation.\r\n\t *\r\n\t * The {@link EffectComposer} calls this method when this pass is added to its\r\n\t * queue, but not before its size has been set.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t * @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; }\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {}\r\n\r\n\t/**\r\n\t * Performs a shallow search for properties that define a dispose method and\r\n\t * deletes them. The pass will be inoperative after this method was called!\r\n\t *\r\n\t * Disposable objects:\r\n\t * - render targets\r\n\t * - materials\r\n\t * - textures\r\n\t *\r\n\t * The {@link EffectComposer} calls this method when it is being destroyed.\r\n\t * You may, however, use it independently to free memory when you are certain\r\n\t * that you don't need this pass anymore.\r\n\t */\r\n\r\n\tdispose() {\r\n\r\n\t\tlet key;\r\n\r\n\t\tfor(key of Object.keys(this)) {\r\n\r\n\t\t\tif(this[key] !== null && typeof this[key].dispose === \"function\") {\r\n\r\n\t\t\t\tthis[key].dispose();\r\n\t\t\t\tthis[key] = null;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif(this.material !== null) {\r\n\r\n\t\t\tthis.material.dispose();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { LinearFilter, RGBFormat, WebGLRenderTarget } from \"three\";\r\nimport { ConvolutionMaterial, KernelSize } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * An efficient, incremental blur pass.\r\n *\r\n * Note: This pass allows the input and output buffer to be the same.\r\n */\r\n\r\nexport class BlurPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new blur pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.\r\n\t * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"BlurPass\");\r\n\r\n\t\t/**\r\n\t\t * A render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetX = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetX.texture.name = \"Blur.TargetX\";\r\n\t\tthis.renderTargetX.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A second render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetY = this.renderTargetX.clone();\r\n\r\n\t\tthis.renderTargetY.texture.name = \"Blur.TargetY\";\r\n\r\n\t\t/**\r\n\t\t * The resolution scale.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.resolutionScale = (options.resolutionScale !== undefined) ? options.resolutionScale : 0.5;\r\n\r\n\t\t/**\r\n\t\t * A convolution shader material.\r\n\t\t *\r\n\t\t * @type {ConvolutionMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.convolutionMaterial = new ConvolutionMaterial();\r\n\r\n\t\t/**\r\n\t\t * A convolution shader material that uses dithering.\r\n\t\t *\r\n\t\t * @type {ConvolutionMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.ditheredConvolutionMaterial = new ConvolutionMaterial();\r\n\t\tthis.ditheredConvolutionMaterial.dithering = true;\r\n\r\n\t\t/**\r\n\t\t * Whether the blurred result should also be dithered using noise.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.dithering = false;\r\n\r\n\t\tthis.kernelSize = options.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The absolute width of the internal render targets.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget width() {\r\n\r\n\t\treturn this.renderTargetX.width;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The absolute height of the internal render targets.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget height() {\r\n\r\n\t\treturn this.renderTargetX.height;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.convolutionMaterial.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.LARGE) {\r\n\r\n\t\tthis.convolutionMaterial.kernelSize = value;\r\n\t\tthis.ditheredConvolutionMaterial.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Blurs the input buffer and writes the result to the output buffer. The\r\n\t * input buffer remains intact, unless its also the output buffer.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\r\n\t\tconst renderTargetX = this.renderTargetX;\r\n\t\tconst renderTargetY = this.renderTargetY;\r\n\r\n\t\tlet material = this.convolutionMaterial;\r\n\t\tlet uniforms = material.uniforms;\r\n\t\tconst kernel = material.getKernel();\r\n\r\n\t\tlet lastRT = inputBuffer;\r\n\t\tlet destRT;\r\n\t\tlet i, l;\r\n\r\n\t\tthis.material = material;\r\n\r\n\t\t// Apply the multi-pass blur.\r\n\t\tfor(i = 0, l = kernel.length - 1; i < l; ++i) {\r\n\r\n\t\t\t// Alternate between targets.\r\n\t\t\tdestRT = ((i % 2) === 0) ? renderTargetX : renderTargetY;\r\n\r\n\t\t\tuniforms.kernel.value = kernel[i];\r\n\t\t\tuniforms.tDiffuse.value = lastRT.texture;\r\n\t\t\trenderer.render(scene, camera, destRT);\r\n\r\n\t\t\tlastRT = destRT;\r\n\r\n\t\t}\r\n\r\n\t\tif(this.dithering) {\r\n\r\n\t\t\tmaterial = this.ditheredConvolutionMaterial;\r\n\t\t\tuniforms = material.uniforms;\r\n\t\t\tthis.material = material;\r\n\r\n\t\t}\r\n\r\n\t\tuniforms.kernel.value = kernel[i];\r\n\t\tuniforms.tDiffuse.value = lastRT.texture;\r\n\t\trenderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\twidth = Math.max(1, Math.floor(width * this.resolutionScale));\r\n\t\theight = Math.max(1, Math.floor(height * this.resolutionScale));\r\n\r\n\t\tthis.renderTargetX.setSize(width, height);\r\n\t\tthis.renderTargetY.setSize(width, height);\r\n\r\n\t\tthis.convolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);\r\n\t\tthis.ditheredConvolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTargetX.texture.format = RGBFormat;\r\n\t\t\tthis.renderTargetY.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { LinearFilter, RGBFormat, WebGLRenderTarget } from \"three\";\r\nimport { CombineMaterial, KernelSize, LuminosityMaterial } from \"../materials\";\r\nimport { BlurPass } from \"./BlurPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A bloom pass.\r\n *\r\n * This pass renders a scene with superimposed blur by utilizing the fast Kawase\r\n * convolution approach.\r\n */\r\n\r\nexport class BloomPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new bloom pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.\r\n\t * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.\r\n\t * @param {Number} [options.intensity=1.0] - The strength of the bloom effect.\r\n\t * @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene.\r\n\t * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"BloomPass\");\r\n\r\n\t\t/**\r\n\t\t * A render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTarget = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTarget.texture.name = \"Bloom.Target\";\r\n\t\tthis.renderTarget.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A blur pass.\r\n\t\t *\r\n\t\t * @type {BlurPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blurPass = new BlurPass(options);\r\n\r\n\t\t/**\r\n\t\t * A combine shader material.\r\n\t\t *\r\n\t\t * @type {CombineMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.combineMaterial = new CombineMaterial((options.screenMode !== undefined) ? options.screenMode : true);\r\n\r\n\t\tthis.intensity = options.intensity;\r\n\r\n\t\t/**\r\n\t\t * A luminosity shader material.\r\n\t\t *\r\n\t\t * @type {LuminosityMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.luminosityMaterial = new LuminosityMaterial(true);\r\n\r\n\t\tthis.distinction = options.distinction;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution scale.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolutionScale() {\r\n\r\n\t\treturn this.blurPass.resolutionScale;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * You need to call {@link EffectComposer#setSize} after changing this value.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolutionScale(value = 0.5) {\r\n\r\n\t\tthis.blurPass.resolutionScale = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The blur kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.blurPass.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.LARGE) {\r\n\r\n\t\tthis.blurPass.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The overall intensity of the effect.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget intensity() {\r\n\r\n\t\treturn this.combineMaterial.uniforms.opacity2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset intensity(value = 1.0) {\r\n\r\n\t\tthis.combineMaterial.uniforms.opacity2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The luminance distinction factor.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget distinction() {\r\n\r\n\t\treturn this.luminosityMaterial.uniforms.distinction.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset distinction(value = 1.0) {\r\n\r\n\t\tthis.luminosityMaterial.uniforms.distinction.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.blurPass.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tthis.blurPass.dithering = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the effect should be applied to the input buffer.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blend() {\r\n\r\n\t\treturn this.needsSwap;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If disabled, the input buffer will remain unaffected.\r\n\t *\r\n\t * You may use the {@link BloomPass#overlay} texture to apply the effect to\r\n\t * your scene.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blend(value) {\r\n\r\n\t\tthis.needsSwap = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The effect overlay texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget overlay() {\r\n\r\n\t\treturn this.renderTarget.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\t\tconst blurPass = this.blurPass;\r\n\r\n\t\tconst luminosityMaterial = this.luminosityMaterial;\r\n\t\tconst combineMaterial = this.combineMaterial;\r\n\t\tconst renderTarget = this.renderTarget;\r\n\r\n\t\t// Luminance filter.\r\n\t\tthis.material = luminosityMaterial;\r\n\t\tluminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\trenderer.render(scene, camera, renderTarget);\r\n\r\n\t\t// Convolution phase.\r\n\t\tblurPass.render(renderer, renderTarget, renderTarget);\r\n\r\n\t\tif(this.blend) {\r\n\r\n\t\t\t// Render the original scene with superimposed blur.\r\n\t\t\tthis.material = combineMaterial;\r\n\t\t\tcombineMaterial.uniforms.texture1.value = inputBuffer.texture;\r\n\t\t\tcombineMaterial.uniforms.texture2.value = renderTarget.texture;\r\n\r\n\t\t\trenderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.blurPass.setSize(width, height);\r\n\r\n\t\twidth = this.blurPass.width;\r\n\t\theight = this.blurPass.height;\r\n\r\n\t\tthis.renderTarget.setSize(width, height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.blurPass.initialize(renderer, alpha);\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTarget.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { BokehMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A Depth of Field (DoF) pass using a bokeh shader.\r\n *\r\n * This pass requires a {@link EffectComposer#depthTexture}.\r\n */\r\n\r\nexport class BokehPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh pass.\r\n\t *\r\n\t * @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings.\r\n\t * @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details.\r\n\t */\r\n\r\n\tconstructor(camera, options = {}) {\r\n\r\n\t\tsuper(\"BokehPass\");\r\n\r\n\t\tthis.material = new BokehMaterial(camera, options);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material.uniforms.tDepth.value = inputBuffer.depthTexture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.material.uniforms.aspect.value = width / height;\r\n\r\n\t}\r\n\r\n}\r\n","import { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that disables the stencil test.\r\n */\r\n\r\nexport class ClearMaskPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new clear mask pass.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper(\"ClearMaskPass\", null, null, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Disables the global stencil test.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\trenderer.state.buffers.stencil.setTest(false);\r\n\r\n\t}\r\n\r\n}\r\n","import { Color } from \"three\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Used for saving the original clear color of the renderer.\r\n *\r\n * @type {Color}\r\n * @private\r\n */\r\n\r\nconst color = new Color();\r\n\r\n/**\r\n * A pass that clears the input buffer or the screen.\r\n *\r\n * You can prevent specific bits from being cleared by setting either the\r\n * autoClearColor, autoClearStencil or autoClearDepth properties of the renderer\r\n * to false.\r\n */\r\n\r\nexport class ClearPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new clear pass.\r\n\t *\r\n\t * @param {Object} [options] - Additional options.\r\n\t * @param {Color} [options.clearColor=null] - An override clear color.\r\n\t * @param {Number} [options.clearAlpha=0.0] - An override clear alpha.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"ClearPass\", null, null, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * The clear color.\r\n\t\t *\r\n\t\t * @type {Color}\r\n\t\t */\r\n\r\n\t\tthis.clearColor = (options.clearColor !== undefined) ? options.clearColor : null;\r\n\r\n\t\t/**\r\n\t\t * The clear alpha.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.clearAlpha = (options.clearAlpha !== undefined) ? options.clearAlpha : 0.0;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the input buffer or the screen.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst clearColor = this.clearColor;\r\n\r\n\t\tlet clearAlpha;\r\n\r\n\t\tif(clearColor !== null) {\r\n\r\n\t\t\tcolor.copy(renderer.getClearColor());\r\n\t\t\tclearAlpha = renderer.getClearAlpha();\r\n\t\t\trenderer.setClearColor(clearColor, this.clearAlpha);\r\n\r\n\t\t}\r\n\r\n\t\trenderer.setRenderTarget(this.renderToScreen ? null : inputBuffer);\r\n\t\trenderer.clear();\r\n\r\n\t\tif(clearColor !== null) {\r\n\r\n\t\t\trenderer.setClearColor(color, clearAlpha);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { DotScreenMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A dot screen pass.\r\n */\r\n\r\nexport class DotScreenPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new dot screen pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white).\r\n\t * @param {Number} [options.angle=1.57] - The angle of the pattern.\r\n\t * @param {Number} [options.scale=1.0] - The scale of the overall effect.\r\n\t * @param {Number} [options.intensity=1.0] - The intensity of the effect.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"DotScreenPass\");\r\n\r\n\t\tthis.material = new DotScreenMaterial(options);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\twidth = Math.max(1, width);\r\n\t\theight = Math.max(1, height);\r\n\r\n\t\tthis.material.uniforms.offsetRepeat.value.z = width;\r\n\t\tthis.material.uniforms.offsetRepeat.value.w = height;\r\n\r\n\t}\r\n\r\n}\r\n","import { FilmMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A film pass.\r\n *\r\n * Provides various cinematic effects.\r\n */\r\n\r\nexport class FilmPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new film pass.\r\n\t *\r\n\t * @param {Object} [options] - The options. See {@link FilmMaterial} for more options.\r\n\t * @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height.\r\n\t * @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height.\r\n\t * @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"FilmPass\");\r\n\r\n\t\tthis.material = new FilmMaterial(options);\r\n\r\n\t\t/**\r\n\t\t * The amount of scanlines, relative to the screen height.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.scanlineDensity = (options.scanlineDensity === undefined) ? 1.25 : options.scanlineDensity;\r\n\r\n\t\t/**\r\n\t\t * The grid scale, relative to the screen height.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.gridScale = (options.gridScale === undefined) ? 1.0 : Math.max(options.gridScale, 1e-6);\r\n\r\n\t\t/**\r\n\t\t * The grid line width.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.gridLineWidth = (options.gridLineWidth === undefined) ? 0.0 : Math.max(options.gridLineWidth, 0.0);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material.uniforms.time.value += delta;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tconst aspect = width / height;\r\n\t\tconst gridScale = this.gridScale * (height * 0.125);\r\n\r\n\t\tthis.material.uniforms.scanlineCount.value = Math.round(height * this.scanlineDensity);\r\n\t\tthis.material.uniforms.gridScale.value.set(aspect * gridScale, gridScale);\r\n\t\tthis.material.uniforms.gridLineWidth.value = (gridScale / height) + this.gridLineWidth;\r\n\r\n\t}\r\n\r\n}\r\n","import { DataTexture, RGBFormat, FloatType } from \"three\";\r\nimport { GlitchMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Returns a random integer in the specified range.\r\n *\r\n * @private\r\n * @param {Number} low - The lowest possible value.\r\n * @param {Number} high - The highest possible value.\r\n * @return {Number} The random value.\r\n */\r\n\r\nfunction randomInt(low, high) {\r\n\r\n\treturn low + Math.floor(Math.random() * (high - low + 1));\r\n\r\n}\r\n\r\n/**\r\n * Returns a random float in the specified range.\r\n *\r\n * @private\r\n * @param {Number} low - The lowest possible value.\r\n * @param {Number} high - The highest possible value.\r\n * @return {Number} The random value.\r\n */\r\n\r\nfunction randomFloat(low, high) {\r\n\r\n\treturn low + Math.random() * (high - low);\r\n\r\n}\r\n\r\n/**\r\n * A glitch pass.\r\n */\r\n\r\nexport class GlitchPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new glitch pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created.\r\n\t * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"GlitchPass\");\r\n\r\n\t\tthis.material = new GlitchMaterial();\r\n\r\n\t\t/**\r\n\t\t * A perturbation map.\r\n\t\t *\r\n\t\t * @type {Texture}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.texture = null;\r\n\r\n\t\tthis.perturbMap = (options.perturbMap !== undefined) ? options.perturbMap : this.generatePerturbMap(options.dtSize);\r\n\t\tthis.perturbMap.name = \"Glitch.Perturbation\";\r\n\t\tthis.perturbMap.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * The effect mode.\r\n\t\t *\r\n\t\t * @type {GlitchMode}\r\n\t\t */\r\n\r\n\t\tthis.mode = GlitchMode.SPORADIC;\r\n\r\n\t\t/**\r\n\t\t * A counter for the glitch activation and deactivation.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.counter = 0;\r\n\r\n\t\t/**\r\n\t\t * A random break point for the sporadic glitch activation.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.breakPoint = randomInt(120, 240);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The current perturbation map.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget perturbMap() {\r\n\r\n\t\treturn this.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Assigning a new perturbation map does not destroy the current one!\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tset perturbMap(value) {\r\n\r\n\t\tthis.texture = value;\r\n\t\tthis.material.uniforms.tPerturb.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Destroys the current perturbation map and replaces it with a new one.\r\n\t *\r\n\t * @param {Number} [size=64] - The texture size.\r\n\t * @return {DataTexture} The perturbation texture.\r\n\t */\r\n\r\n\tgeneratePerturbMap(size = 64) {\r\n\r\n\t\tconst pixels = size * size;\r\n\t\tconst data = new Float32Array(pixels * 3);\r\n\r\n\t\tlet dt = this.perturbMap;\r\n\t\tlet i, x;\r\n\r\n\t\tfor(i = 0; i < pixels; ++i) {\r\n\r\n\t\t\tx = Math.random();\r\n\r\n\t\t\tdata[i * 3] = x;\r\n\t\t\tdata[i * 3 + 1] = x;\r\n\t\t\tdata[i * 3 + 2] = x;\r\n\r\n\t\t}\r\n\r\n\t\tif(dt !== null) {\r\n\r\n\t\t\tdt.dispose();\r\n\r\n\t\t}\r\n\r\n\t\tdt = new DataTexture(data, size, size, RGBFormat, FloatType);\r\n\t\tdt.needsUpdate = true;\r\n\r\n\t\tthis.perturbMap = dt;\r\n\r\n\t\treturn dt;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst mode = this.mode;\r\n\t\tconst counter = this.counter;\r\n\t\tconst breakPoint = this.breakPoint;\r\n\t\tconst uniforms = this.material.uniforms;\r\n\r\n\t\tuniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tuniforms.seed.value = Math.random();\r\n\t\tuniforms.active.value = true;\r\n\r\n\t\tif(counter % breakPoint === 0 || mode === GlitchMode.CONSTANT_WILD) {\r\n\r\n\t\t\tuniforms.amount.value = Math.random() / 30.0;\r\n\t\t\tuniforms.angle.value = randomFloat(-Math.PI, Math.PI);\r\n\t\t\tuniforms.seedX.value = randomFloat(-1.0, 1.0);\r\n\t\t\tuniforms.seedY.value = randomFloat(-1.0, 1.0);\r\n\t\t\tuniforms.distortionX.value = randomFloat(0.0, 1.0);\r\n\t\t\tuniforms.distortionY.value = randomFloat(0.0, 1.0);\r\n\r\n\t\t\tthis.breakPoint = randomInt(120, 240);\r\n\t\t\tthis.counter = 0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif(counter % breakPoint < breakPoint / 5 || mode === GlitchMode.CONSTANT_MILD) {\r\n\r\n\t\t\t\tuniforms.amount.value = Math.random() / 90.0;\r\n\t\t\t\tuniforms.angle.value = randomFloat(-Math.PI, Math.PI);\r\n\t\t\t\tuniforms.distortionX.value = randomFloat(0.0, 1.0);\r\n\t\t\t\tuniforms.distortionY.value = randomFloat(0.0, 1.0);\r\n\t\t\t\tuniforms.seedX.value = randomFloat(-0.3, 0.3);\r\n\t\t\t\tuniforms.seedY.value = randomFloat(-0.3, 0.3);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Sporadic.\r\n\t\t\t\tuniforms.active.value = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t++this.counter;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * A glitch mode enumeration.\r\n *\r\n * @type {Object}\r\n * @property {Number} SPORADIC - Sporadic glitches.\r\n * @property {Number} CONSTANT_MILD - Constant mild glitches.\r\n * @property {Number} CONSTANT_WILD - Constant wild glitches.\r\n */\r\n\r\nexport const GlitchMode = {\r\n\r\n\tSPORADIC: 0,\r\n\tCONSTANT_MILD: 1,\r\n\tCONSTANT_WILD: 2\r\n\r\n};\r\n","import { ClearPass } from \"./ClearPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that renders a given scene directly on screen or into the read buffer\r\n * for further processing.\r\n */\r\n\r\nexport class RenderPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new render pass.\r\n\t *\r\n\t * @param {Scene} scene - The scene to render.\r\n\t * @param {Camera} camera - The camera to use to render the scene.\r\n\t * @param {Object} [options] - Additional options.\r\n\t * @param {Material} [options.overrideMaterial=null] - An override material for the scene.\r\n\t * @param {Color} [options.clearColor=null] - An override clear color.\r\n\t * @param {Number} [options.clearAlpha=1.0] - An override clear alpha.\r\n\t * @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly.\r\n\t * @param {Boolean} [options.clear=true] - Whether all buffers should be cleared.\r\n\t */\r\n\r\n\tconstructor(scene, camera, options = {}) {\r\n\r\n\t\tsuper(\"RenderPass\", scene, camera, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * A clear pass.\r\n\t\t *\r\n\t\t * @type {ClearPass}\r\n\t\t */\r\n\r\n\t\tthis.clearPass = new ClearPass(options);\r\n\r\n\t\t/**\r\n\t\t * An override material.\r\n\t\t *\r\n\t\t * @type {Material}\r\n\t\t */\r\n\r\n\t\tthis.overrideMaterial = (options.overrideMaterial !== undefined) ? options.overrideMaterial : null;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the depth buffer should be cleared explicitly.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.clearDepth = (options.clearDepth !== undefined) ? options.clearDepth : false;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the color, depth and stencil buffers should be cleared.\r\n\t\t *\r\n\t\t * Even with clear set to true you can prevent specific buffers from being\r\n\t\t * cleared by setting either the autoClearColor, autoClearStencil or\r\n\t\t * autoClearDepth properties of the renderer to false.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.clear = (options.clear !== undefined) ? options.clear : true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the scene.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst renderTarget = this.renderToScreen ? null : inputBuffer;\r\n\t\tconst overrideMaterial = scene.overrideMaterial;\r\n\r\n\t\tif(this.clear) {\r\n\r\n\t\t\tthis.clearPass.renderToScreen = this.renderToScreen;\r\n\t\t\tthis.clearPass.render(renderer, inputBuffer);\r\n\r\n\t\t} else if(this.clearDepth) {\r\n\r\n\t\t\trenderer.setRenderTarget(renderTarget);\r\n\t\t\trenderer.clearDepth();\r\n\r\n\t\t}\r\n\r\n\t\tscene.overrideMaterial = this.overrideMaterial;\r\n\t\trenderer.render(scene, this.camera, renderTarget);\r\n\t\tscene.overrideMaterial = overrideMaterial;\r\n\r\n\t}\r\n\r\n}\r\n","import {\r\n\tColor,\r\n\tLinearFilter,\r\n\tMeshBasicMaterial,\r\n\tRGBFormat,\r\n\tScene,\r\n\tVector3,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport { CombineMaterial, GodRaysMaterial, KernelSize } from \"../materials\";\r\nimport { RenderPass } from \"./RenderPass.js\";\r\nimport { BlurPass } from \"./BlurPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Clamps a given value.\r\n *\r\n * @private\r\n * @param {Number} value - The value to clamp.\r\n * @param {Number} min - The lowest possible value.\r\n * @param {Number} max - The highest possible value.\r\n * @return {Number} The clamped value.\r\n */\r\n\r\nfunction clamp(value, min, max) {\r\n\r\n\treturn Math.max(min, Math.min(max, value));\r\n\r\n}\r\n\r\n/**\r\n * A crepuscular rays pass.\r\n */\r\n\r\nexport class GodRaysPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new god rays pass.\r\n\t *\r\n\t * @param {Scene} scene - The main scene.\r\n\t * @param {Camera} camera - The main camera.\r\n\t * @param {Object3D} lightSource - The main light source.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.density=0.96] - The density of the light rays.\r\n\t * @param {Number} [options.decay=0.93] - An illumination decay factor.\r\n\t * @param {Number} [options.weight=0.4] - A light ray weight factor.\r\n\t * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.\r\n\t * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.\r\n\t * @param {Number} [options.intensity=1.0] - A constant factor for additive blending.\r\n\t * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.\r\n\t * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.\r\n\t * @param {Number} [options.samples=60] - The number of samples per pixel.\r\n\t * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors.\r\n\t */\r\n\r\n\tconstructor(scene, camera, lightSource, options = {}) {\r\n\r\n\t\tsuper(\"GodRaysPass\");\r\n\r\n\t\t/**\r\n\t\t * A scene that only contains the light source.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.lightScene = new Scene();\r\n\r\n\t\t/**\r\n\t\t * The main scene.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainScene = scene;\r\n\r\n\t\t/**\r\n\t\t * The main camera.\r\n\t\t *\r\n\t\t * @type {Camera}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainCamera = camera;\r\n\r\n\t\t/**\r\n\t\t * A render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetX = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetX.texture.name = \"GodRays.TargetX\";\r\n\t\tthis.renderTargetX.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A second render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetY = this.renderTargetX.clone();\r\n\r\n\t\tthis.renderTargetY.texture.name = \"GodRays.TargetY\";\r\n\r\n\t\t/**\r\n\t\t * A render target for the masked light scene.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetMask = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter\r\n\t\t});\r\n\r\n\t\tthis.renderTargetMask.texture.name = \"GodRays.Mask\";\r\n\t\tthis.renderTargetMask.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A pass that only renders the light source.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassLight = new RenderPass(this.lightScene, this.mainCamera, {\r\n\t\t\tclearColor: new Color(0x000000)\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A pass that renders the masked scene over the light.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassMask = new RenderPass(this.mainScene, this.mainCamera, {\r\n\t\t\toverrideMaterial: new MeshBasicMaterial({ color: 0x000000 })\r\n\t\t});\r\n\r\n\t\tthis.renderPassMask.clear = false;\r\n\r\n\t\t/**\r\n\t\t * A blur pass.\r\n\t\t *\r\n\t\t * @type {BlurPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blurPass = new BlurPass(options);\r\n\r\n\t\t/**\r\n\t\t * The light source.\r\n\t\t *\r\n\t\t * @type {Object3D}\r\n\t\t */\r\n\r\n\t\tthis.lightSource = lightSource;\r\n\r\n\t\t/**\r\n\t\t * The light position in screen space.\r\n\t\t *\r\n\t\t * @type {Vector3}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.screenPosition = new Vector3();\r\n\r\n\t\t/**\r\n\t\t * A god rays shader material.\r\n\t\t *\r\n\t\t * @type {GodRaysMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.godRaysMaterial = new GodRaysMaterial(options);\r\n\t\tthis.godRaysMaterial.uniforms.lightPosition.value = this.screenPosition;\r\n\r\n\t\tthis.samples = options.samples;\r\n\r\n\t\t/**\r\n\t\t * A combine shader material.\r\n\t\t *\r\n\t\t * @type {CombineMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.combineMaterial = new CombineMaterial((options.screenMode !== undefined) ? options.screenMode : true);\r\n\r\n\t\tthis.intensity = options.intensity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution scale.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolutionScale() {\r\n\r\n\t\treturn this.blurPass.resolutionScale;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * You need to call {@link EffectComposer#setSize} after changing this value.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolutionScale(value = 0.5) {\r\n\r\n\t\tthis.blurPass.resolutionScale = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The blur kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.blurPass.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.LARGE) {\r\n\r\n\t\tthis.blurPass.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The overall intensity of the effect.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget intensity() {\r\n\r\n\t\treturn this.combineMaterial.uniforms.opacity2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset intensity(value = 1.0) {\r\n\r\n\t\tthis.combineMaterial.uniforms.opacity2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The number of samples per pixel.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget samples() {\r\n\r\n\t\treturn Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This value must be carefully chosen. A higher value directly increases the\r\n\t * GPU load.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset samples(value = 60) {\r\n\r\n\t\tvalue = Math.floor(value);\r\n\r\n\t\tthis.godRaysMaterial.defines.NUM_SAMPLES_FLOAT = value.toFixed(1);\r\n\t\tthis.godRaysMaterial.defines.NUM_SAMPLES_INT = value.toFixed(0);\r\n\t\tthis.godRaysMaterial.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.godRaysMaterial.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tif(this.dithering !== value) {\r\n\r\n\t\t\tthis.godRaysMaterial.dithering = value;\r\n\t\t\tthis.godRaysMaterial.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the effect should be applied to the input buffer.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blend() {\r\n\r\n\t\treturn this.needsSwap;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If disabled, the input buffer will remain unaffected.\r\n\t *\r\n\t * You may use the {@link BloomPass#overlay} texture to apply the effect to\r\n\t * your scene.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blend(value) {\r\n\r\n\t\tthis.needsSwap = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The effect overlay texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget overlay() {\r\n\r\n\t\treturn this.renderTargetY.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\t\tconst mainScene = this.mainScene;\r\n\r\n\t\tconst lightSource = this.lightSource;\r\n\t\tconst screenPosition = this.screenPosition;\r\n\r\n\t\tconst godRaysMaterial = this.godRaysMaterial;\r\n\t\tconst combineMaterial = this.combineMaterial;\r\n\r\n\t\tconst renderTargetMask = this.renderTargetMask;\r\n\t\tconst renderTargetX = this.renderTargetX;\r\n\t\tconst renderTargetY = this.renderTargetY;\r\n\r\n\t\tlet background, parent;\r\n\r\n\t\t// Compute the screen light position and translate it to [0.0, 1.0].\r\n\t\tscreenPosition.copy(lightSource.position).project(this.mainCamera);\r\n\t\tscreenPosition.x = clamp((screenPosition.x + 1.0) * 0.5, 0.0, 1.0);\r\n\t\tscreenPosition.y = clamp((screenPosition.y + 1.0) * 0.5, 0.0, 1.0);\r\n\r\n\t\tparent = lightSource.parent;\r\n\t\tbackground = mainScene.background;\r\n\t\tmainScene.background = null;\r\n\t\tthis.lightScene.add(lightSource);\r\n\r\n\t\t/* First, render the light source. Then render the scene into the same\r\n\t\tbuffer using a mask override material with depth test enabled. */\r\n\t\tthis.renderPassLight.render(renderer, renderTargetMask);\r\n\t\tthis.renderPassMask.render(renderer, renderTargetMask);\r\n\r\n\t\tif(parent !== null) {\r\n\r\n\t\t\tparent.add(lightSource);\r\n\r\n\t\t}\r\n\r\n\t\tmainScene.background = background;\r\n\r\n\t\t// Blur the masked scene to reduce artifacts.\r\n\t\tthis.blurPass.render(renderer, this.renderTargetMask, renderTargetX);\r\n\r\n\t\t// Blur the masked scene along radial lines towards the light source.\r\n\t\tthis.material = godRaysMaterial;\r\n\t\tgodRaysMaterial.uniforms.tDiffuse.value = renderTargetX.texture;\r\n\t\trenderer.render(scene, camera, renderTargetY);\r\n\r\n\t\tif(this.blend) {\r\n\r\n\t\t\t// Combine the god rays with the scene colors.\r\n\t\t\tthis.material = combineMaterial;\r\n\t\t\tcombineMaterial.uniforms.texture1.value = inputBuffer.texture;\r\n\t\t\tcombineMaterial.uniforms.texture2.value = renderTargetY.texture;\r\n\r\n\t\t\trenderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.renderPassLight.setSize(width, height);\r\n\t\tthis.renderPassMask.setSize(width, height);\r\n\t\tthis.blurPass.setSize(width, height);\r\n\r\n\t\twidth = this.blurPass.width;\r\n\t\theight = this.blurPass.height;\r\n\r\n\t\tthis.renderTargetMask.setSize(width, height);\r\n\t\tthis.renderTargetX.setSize(width, height);\r\n\t\tthis.renderTargetY.setSize(width, height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.renderPassLight.initialize(renderer, alpha);\r\n\t\tthis.renderPassMask.initialize(renderer, alpha);\r\n\t\tthis.blurPass.initialize(renderer, alpha);\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTargetMask.texture.format = RGBFormat;\r\n\t\t\tthis.renderTargetX.texture.format = RGBFormat;\r\n\t\t\tthis.renderTargetY.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A mask pass.\r\n */\r\n\r\nexport class MaskPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new mask pass.\r\n\t *\r\n\t * @param {Scene} scene - The scene to render.\r\n\t * @param {Camera} camera - The camera to use.\r\n\t */\r\n\r\n\tconstructor(scene, camera) {\r\n\r\n\t\tsuper(\"MaskPass\", scene, camera, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * Inverse flag.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.inverse = false;\r\n\r\n\t\t/**\r\n\t\t * Stencil buffer clear flag.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.clearStencil = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst context = renderer.context;\r\n\t\tconst state = renderer.state;\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\r\n\t\tconst writeValue = this.inverse ? 0 : 1;\r\n\t\tconst clearValue = 1 - writeValue;\r\n\r\n\t\t// Don't update color or depth.\r\n\t\tstate.buffers.color.setMask(false);\r\n\t\tstate.buffers.depth.setMask(false);\r\n\r\n\t\t// Lock the buffers.\r\n\t\tstate.buffers.color.setLocked(true);\r\n\t\tstate.buffers.depth.setLocked(true);\r\n\r\n\t\t// Configure the stencil.\r\n\t\tstate.buffers.stencil.setTest(true);\r\n\t\tstate.buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE);\r\n\t\tstate.buffers.stencil.setFunc(context.ALWAYS, writeValue, 0xffffffff);\r\n\t\tstate.buffers.stencil.setClear(clearValue);\r\n\r\n\t\t// Clear the stencil.\r\n\t\tif(this.clearStencil) {\r\n\r\n\t\t\tif(this.renderToScreen) {\r\n\r\n\t\t\t\trenderer.setRenderTarget(null);\r\n\t\t\t\trenderer.clearStencil();\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\trenderer.setRenderTarget(inputBuffer);\r\n\t\t\t\trenderer.clearStencil();\r\n\r\n\t\t\t\trenderer.setRenderTarget(outputBuffer);\r\n\t\t\t\trenderer.clearStencil();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Draw the mask.\r\n\t\tif(this.renderToScreen) {\r\n\r\n\t\t\trenderer.render(scene, camera, null);\r\n\r\n\t\t} else {\r\n\r\n\t\t\trenderer.render(scene, camera, inputBuffer);\r\n\t\t\trenderer.render(scene, camera, outputBuffer);\r\n\r\n\t\t}\r\n\r\n\t\t// Unlock the buffers.\r\n\t\tstate.buffers.color.setLocked(false);\r\n\t\tstate.buffers.depth.setLocked(false);\r\n\r\n\t\t// Only render where the stencil is set to 1.\r\n\t\tstate.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff);\r\n\t\tstate.buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP);\r\n\r\n\t}\r\n\r\n}\r\n","import { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A shader pass.\r\n *\r\n * Used to render any shader material as a 2D filter.\r\n */\r\n\r\nexport class ShaderPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new shader pass.\r\n\t *\r\n\t * @param {ShaderMaterial} material - The shader material to use.\r\n\t * @param {String} [textureID=\"tDiffuse\"] - The texture uniform identifier.\r\n\t */\r\n\r\n\tconstructor(material, textureID = \"tDiffuse\") {\r\n\r\n\t\tsuper(\"ShaderPass\");\r\n\r\n\t\tthis.material = material;\r\n\r\n\t\t/**\r\n\t\t * The name of the color sampler uniform of the given material.\r\n\t\t *\r\n\t\t * @type {String}\r\n\t\t */\r\n\r\n\t\tthis.textureID = textureID;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tif(this.material.uniforms[this.textureID] !== undefined) {\r\n\r\n\t\t\tthis.material.uniforms[this.textureID].value = inputBuffer.texture;\r\n\r\n\t\t}\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n}\r\n","import {\r\n\tColor,\r\n\tLinearFilter,\r\n\tMeshDepthMaterial,\r\n\tRGBADepthPacking,\r\n\tRGBFormat,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport {\r\n\tCopyMaterial,\r\n\tDepthComparisonMaterial,\r\n\tOutlineBlendMaterial,\r\n\tOutlineEdgesMaterial,\r\n\tKernelSize\r\n} from \"../materials\";\r\n\r\nimport { BlurPass } from \"./BlurPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\nimport { RenderPass } from \"./RenderPass.js\";\r\nimport { ShaderPass } from \"./ShaderPass.js\";\r\n\r\n/**\r\n * An outline pass.\r\n */\r\n\r\nexport class OutlinePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new outline pass.\r\n\t *\r\n\t * @param {Scene} scene - The main scene.\r\n\t * @param {Camera} camera - The main camera.\r\n\t * @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details.\r\n\t * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect.\r\n\t * @param {Boolean} [options.blur=true] - Whether the outline should be blurred.\r\n\t */\r\n\r\n\tconstructor(scene, camera, options = {}) {\r\n\r\n\t\tsuper(\"OutlinePass\");\r\n\r\n\t\t/**\r\n\t\t * The main scene.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainScene = scene;\r\n\r\n\t\t/**\r\n\t\t * The main camera.\r\n\t\t *\r\n\t\t * @type {Camera}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainCamera = camera;\r\n\r\n\t\t/**\r\n\t\t * A render target for depth information.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetDepth = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter\r\n\t\t});\r\n\r\n\t\tthis.renderTargetDepth.texture.name = \"Outline.Depth\";\r\n\t\tthis.renderTargetDepth.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A render target for the outline mask.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetMask = this.renderTargetDepth.clone();\r\n\r\n\t\tthis.renderTargetMask.texture.format = RGBFormat;\r\n\t\tthis.renderTargetMask.texture.name = \"Outline.Mask\";\r\n\r\n\t\t/**\r\n\t\t * A render target for the edge detection.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetEdges = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false,\r\n\t\t\tformat: RGBFormat\r\n\t\t});\r\n\r\n\t\tthis.renderTargetEdges.texture.name = \"Outline.Edges\";\r\n\t\tthis.renderTargetEdges.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A render target for the blurred outline overlay.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetBlurredEdges = this.renderTargetEdges.clone();\r\n\r\n\t\tthis.renderTargetBlurredEdges.texture.name = \"Outline.BlurredEdges\";\r\n\r\n\t\t/**\r\n\t\t * A depth pass.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassDepth = new RenderPass(this.mainScene, this.mainCamera, {\r\n\t\t\toverrideMaterial: new MeshDepthMaterial({\r\n\t\t\t\tdepthPacking: RGBADepthPacking,\r\n\t\t\t\tmorphTargets: true,\r\n\t\t\t\tskinning: true\r\n\t\t\t}),\r\n\t\t\tclearColor: new Color(0xffffff),\r\n\t\t\tclearAlpha: 1.0\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A depth comparison mask pass.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassMask = new RenderPass(this.mainScene, this.mainCamera, {\r\n\t\t\toverrideMaterial: new DepthComparisonMaterial(this.renderTargetDepth.texture, this.mainCamera),\r\n\t\t\tclearColor: new Color(0xffffff),\r\n\t\t\tclearAlpha: 1.0\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A blur pass.\r\n\t\t *\r\n\t\t * @type {BlurPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blurPass = new BlurPass(options);\r\n\r\n\t\tthis.kernelSize = options.kernelSize;\r\n\r\n\t\t/**\r\n\t\t * A copy pass that renders the read buffer to screen if needed.\r\n\t\t *\r\n\t\t * @type {ShaderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyPass = new ShaderPass(new CopyMaterial());\r\n\t\tthis.copyPass.renderToScreen = true;\r\n\r\n\t\t/**\r\n\t\t * An outline edge detection material.\r\n\t\t *\r\n\t\t * @type {OutlineEdgesMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.outlineEdgesMaterial = new OutlineEdgesMaterial(options);\r\n\t\tthis.outlineEdgesMaterial.uniforms.tMask.value = this.renderTargetMask.texture;\r\n\r\n\t\t/**\r\n\t\t * An outline blend material.\r\n\t\t *\r\n\t\t * @type {OutlineBlendMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.outlineBlendMaterial = new OutlineBlendMaterial(options);\r\n\t\tthis.outlineBlendMaterial.uniforms.tMask.value = this.renderTargetMask.texture;\r\n\r\n\t\tthis.blur = (options.blur !== undefined) ? options.blur : true;\r\n\r\n\t\t/**\r\n\t\t * A list of objects to outline.\r\n\t\t *\r\n\t\t * @type {Object3D[]}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.selection = [];\r\n\r\n\t\t/**\r\n\t\t * The current animation time.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.time = 0.0;\r\n\r\n\t\t/**\r\n\t\t * The pulse speed. A value of zero disables the pulse effect.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.pulseSpeed = (options.pulseSpeed !== undefined) ? options.pulseSpeed : 0.0;\r\n\r\n\t\t/**\r\n\t\t * A dedicated render layer for selected objects.\r\n\t\t *\r\n\t\t * This layer is set to 10 by default. If this collides with your own custom\r\n\t\t * layers, please change it to a free layer before rendering!\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.selectionLayer = 10;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution scale.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolutionScale() {\r\n\r\n\t\treturn this.blurPass.resolutionScale;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * You need to call {@link EffectComposer#setSize} after changing this value.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolutionScale(value = 0.5) {\r\n\r\n\t\tthis.blurPass.resolutionScale = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The blur kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.blurPass.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.VERY_SMALL) {\r\n\r\n\t\tthis.blurPass.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the outline overlay should be blurred.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blur() {\r\n\r\n\t\treturn this.blurPass.enabled;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blur(value) {\r\n\r\n\t\tthis.blurPass.enabled = value;\r\n\r\n\t\tthis.outlineBlendMaterial.uniforms.tEdges.value = value ?\r\n\t\t\tthis.renderTargetBlurredEdges.texture :\r\n\t\t\tthis.renderTargetEdges.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.blurPass.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tthis.blurPass.dithering = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the effect should be applied to the input buffer.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blend() {\r\n\r\n\t\treturn this.needsSwap;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If disabled, the input buffer will remain unaffected.\r\n\t *\r\n\t * You may use the {@link BloomPass#overlay} texture to apply the effect to\r\n\t * your scene.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blend(value) {\r\n\r\n\t\tthis.needsSwap = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The effect overlay texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget overlay() {\r\n\r\n\t\treturn this.outlineBlendMaterial.uniforms.tEdges.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a pattern texture to use as an overlay for selected objects.\r\n\t *\r\n\t * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.\r\n\t */\r\n\r\n\tsetPatternTexture(texture = null) {\r\n\r\n\t\tthis.outlineBlendMaterial.setPatternTexture(texture);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the current selection and selects a list of objects.\r\n\t *\r\n\t * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied.\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tsetSelection(objects) {\r\n\r\n\t\tconst selection = objects.slice(0);\r\n\t\tconst selectionLayer = this.selectionLayer;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tthis.clearSelection();\r\n\r\n\t\tfor(i = 0, l = selection.length; i < l; ++i) {\r\n\r\n\t\t\tselection[i].layers.enable(selectionLayer);\r\n\r\n\t\t}\r\n\r\n\t\tthis.selection = selection;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the list of selected objects.\r\n\t *\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tclearSelection() {\r\n\r\n\t\tconst selection = this.selection;\r\n\t\tconst selectionLayer = this.selectionLayer;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = selection.length; i < l; ++i) {\r\n\r\n\t\t\tselection[i].layers.disable(selectionLayer);\r\n\r\n\t\t}\r\n\r\n\t\tthis.selection = [];\r\n\t\tthis.time = 0.0;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Selects an object.\r\n\t *\r\n\t * @param {Object3D} object - The object that should be outlined.\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tselectObject(object) {\r\n\r\n\t\tobject.layers.enable(this.selectionLayer);\r\n\t\tthis.selection.push(object);\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Deselects an object.\r\n\t *\r\n\t * @param {Object3D} object - The object that should no longer be outlined.\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tdeselectObject(object) {\r\n\r\n\t\tconst selection = this.selection;\r\n\t\tconst index = selection.indexOf(object);\r\n\r\n\t\tif(index >= 0) {\r\n\r\n\t\t\tselection[index].layers.disable(this.selectionLayer);\r\n\t\t\tselection.splice(index, 1);\r\n\r\n\t\t\tif(selection.length === 0) {\r\n\r\n\t\t\t\tthis.time = 0.0;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the visibility of all selected objects.\r\n\t *\r\n\t * @private\r\n\t * @param {Boolean} visible - Whether the selected objects should be visible.\r\n\t */\r\n\r\n\tsetSelectionVisible(visible) {\r\n\r\n\t\tconst selection = this.selection;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = selection.length; i < l; ++i) {\r\n\r\n\t\t\tif(visible) {\r\n\r\n\t\t\t\tselection[i].layers.enable(0);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tselection[i].layers.disable(0);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst mainScene = this.mainScene;\r\n\t\tconst mainCamera = this.mainCamera;\r\n\t\tconst pulse = this.outlineBlendMaterial.uniforms.pulse;\r\n\r\n\t\tlet background, mask;\r\n\r\n\t\tif(this.selection.length > 0) {\r\n\r\n\t\t\tbackground = mainScene.background;\r\n\t\t\tmask = mainCamera.layers.mask;\r\n\t\t\tmainScene.background = null;\r\n\r\n\t\t\tpulse.value = 1.0;\r\n\r\n\t\t\tif(this.pulseSpeed > 0.0) {\r\n\r\n\t\t\t\tpulse.value = 0.625 + Math.cos(this.time * this.pulseSpeed * 10.0) * 0.375;\r\n\t\t\t\tthis.time += delta;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Render a custom depth texture and ignore selected objects.\r\n\t\t\tthis.setSelectionVisible(false);\r\n\t\t\tthis.renderPassDepth.render(renderer, this.renderTargetDepth);\r\n\t\t\tthis.setSelectionVisible(true);\r\n\r\n\t\t\t// Create a mask for the selected objects using the depth information.\r\n\t\t\tmainCamera.layers.mask = 1 << this.selectionLayer;\r\n\t\t\tthis.renderPassMask.render(renderer, this.renderTargetMask);\r\n\r\n\t\t\t// Restore the camera layer mask and the scene background.\r\n\t\t\tmainCamera.layers.mask = mask;\r\n\t\t\tmainScene.background = background;\r\n\r\n\t\t\t// Detect the outline.\r\n\t\t\tthis.material = this.outlineEdgesMaterial;\r\n\t\t\trenderer.render(this.scene, this.camera, this.renderTargetEdges);\r\n\r\n\t\t\tif(this.blurPass.enabled) {\r\n\r\n\t\t\t\t// Blur the edges.\r\n\t\t\t\tthis.blurPass.render(renderer, this.renderTargetEdges, this.renderTargetBlurredEdges);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif(this.blend) {\r\n\r\n\t\t\t\t// Draw the final overlay onto the scene colours.\r\n\t\t\t\tthis.material = this.outlineBlendMaterial;\r\n\t\t\t\tthis.outlineBlendMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\t\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : this.outputBuffer);\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if(this.renderToScreen) {\r\n\r\n\t\t\t// Draw the read buffer to screen.\r\n\t\t\tthis.copyPass.render(renderer, inputBuffer);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.renderTargetDepth.setSize(width, height);\r\n\t\tthis.renderTargetMask.setSize(width, height);\r\n\r\n\t\tthis.renderPassDepth.setSize(width, height);\r\n\t\tthis.renderPassMask.setSize(width, height);\r\n\t\tthis.blurPass.setSize(width, height);\r\n\r\n\t\twidth = this.blurPass.width;\r\n\t\theight = this.blurPass.height;\r\n\r\n\t\tthis.renderTargetEdges.setSize(width, height);\r\n\t\tthis.renderTargetBlurredEdges.setSize(width, height);\r\n\r\n\t\tthis.outlineBlendMaterial.uniforms.aspect.value = width / height;\r\n\t\tthis.outlineEdgesMaterial.setTexelSize(1.0 / width, 1.0 / height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.renderPassDepth.initialize(renderer, alpha);\r\n\t\tthis.renderPassMask.initialize(renderer, alpha);\r\n\t\tthis.blurPass.initialize(renderer, alpha);\r\n\r\n\t}\r\n\r\n}\r\n","import { PixelationMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pixelation pass.\r\n */\r\n\r\nexport class PixelationPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new pixelation pass.\r\n\t *\r\n\t * @param {Number} [granularity=30.0] - The intensity of the effect.\r\n\t */\r\n\r\n\tconstructor(granularity = 30.0) {\r\n\r\n\t\tsuper(\"PixelationPass\");\r\n\r\n\t\tthis.material = new PixelationMaterial();\r\n\r\n\t\tthis.granularity = granularity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The pixel granularity.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget granularity() {\r\n\r\n\t\treturn this.material.granularity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * A higher value yields coarser visuals.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset granularity(value = 30) {\r\n\r\n\t\tvalue = Math.floor(value);\r\n\r\n\t\tif(value % 2 > 0) {\r\n\r\n\t\t\tvalue += 1;\r\n\r\n\t\t}\r\n\r\n\t\tthis.material.granularity = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.material.setResolution(width, height);\r\n\r\n\t}\r\n\r\n}\r\n","import { RealisticBokehMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * An advanced Depth of Field (DoF) pass.\r\n *\r\n * Yields more realistic results but is also more demanding.\r\n *\r\n * This pass requires a {@link EffectComposer#depthTexture}.\r\n */\r\n\r\nexport class RealisticBokehPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh pass.\r\n\t *\r\n\t * @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings.\r\n\t * @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details.\r\n\t */\r\n\r\n\tconstructor(camera, options = {}) {\r\n\r\n\t\tsuper(\"RealisticBokehPass\");\r\n\r\n\t\tthis.material = new RealisticBokehMaterial(camera, options);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material.uniforms.tDepth.value = inputBuffer.depthTexture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.material.setTexelSize(1.0 / width, 1.0 / height);\r\n\r\n\t}\r\n\r\n}\r\n","import { LinearFilter, RGBFormat, WebGLRenderTarget } from \"three\";\r\nimport { CopyMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that renders the result from a previous pass to another render target.\r\n */\r\n\r\nexport class SavePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new save pass.\r\n\t *\r\n\t * @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer.\r\n\t * @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer.\r\n\t */\r\n\r\n\tconstructor(renderTarget, resize = true) {\r\n\r\n\t\tsuper(\"SavePass\");\r\n\r\n\t\tthis.material = new CopyMaterial();\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * The render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t */\r\n\r\n\t\tthis.renderTarget = (renderTarget !== undefined) ? renderTarget : new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTarget.texture.name = \"Save.Target\";\r\n\t\tthis.renderTarget.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the render target should be resized when the size of\r\n\t\t * the composer's frame buffer changes.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.resize = resize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderTarget);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tif(this.resize) {\r\n\r\n\t\t\twidth = Math.max(1, width);\r\n\t\t\theight = Math.max(1, height);\r\n\r\n\t\t\tthis.renderTarget.setSize(width, height);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTarget.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3 } from \"three\";\r\nimport { CopyMaterial, ShockWaveMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Half PI.\r\n *\r\n * @type {Number}\r\n * @private\r\n */\r\n\r\nconst HALF_PI = Math.PI * 0.5;\r\n\r\n/**\r\n * A vector.\r\n *\r\n * @type {Vector3}\r\n * @private\r\n */\r\n\r\nconst v = new Vector3();\r\n\r\n/**\r\n * A vector.\r\n *\r\n * @type {Vector3}\r\n * @private\r\n */\r\n\r\nconst ab = new Vector3();\r\n\r\n/**\r\n * A shock wave pass.\r\n */\r\n\r\nexport class ShockWavePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new shock wave pass.\r\n\t *\r\n\t * @param {Camera} camera - The main camera.\r\n\t * @param {Vector3} [epicenter] - The world position of the shock wave epicenter.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.speed=1.0] - The animation speed.\r\n\t * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave.\r\n\t * @param {Number} [options.waveSize=0.2] - The wave size.\r\n\t * @param {Number} [options.amplitude=0.05] - The distortion amplitude.\r\n\t */\r\n\r\n\tconstructor(camera, epicenter = new Vector3(), options = {}) {\r\n\r\n\t\tsuper(\"ShockWavePass\");\r\n\r\n\t\t/**\r\n\t\t * The main camera.\r\n\t\t *\r\n\t\t * @type {Object3D}\r\n\t\t */\r\n\r\n\t\tthis.mainCamera = camera;\r\n\r\n\t\t/**\r\n\t\t * The epicenter.\r\n\t\t *\r\n\t\t * @type {Vector3}\r\n\t\t * @example shockWavePass.epicenter = myMesh.position;\r\n\t\t */\r\n\r\n\t\tthis.epicenter = epicenter;\r\n\r\n\t\t/**\r\n\t\t * The object position in screen space.\r\n\t\t *\r\n\t\t * @type {Vector3}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.screenPosition = new Vector3();\r\n\r\n\t\t/**\r\n\t\t * The speed of the shock wave animation.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.speed = (options.speed !== undefined) ? options.speed : 2.0;\r\n\r\n\t\t/**\r\n\t\t * A time accumulator.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.time = 0.0;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the shock wave animation is active.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.active = false;\r\n\r\n\t\t/**\r\n\t\t * A shock wave shader material.\r\n\t\t *\r\n\t\t * @type {ShockWaveMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.shockWaveMaterial = new ShockWaveMaterial(options);\r\n\r\n\t\tthis.shockWaveMaterial.uniforms.center.value = this.screenPosition;\r\n\r\n\t\t/**\r\n\t\t * A copy shader material.\r\n\t\t *\r\n\t\t * @type {CopyMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyMaterial = new CopyMaterial();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Emits the shock wave.\r\n\t */\r\n\r\n\texplode() {\r\n\r\n\t\tthis.time = 0.0;\r\n\t\tthis.active = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst epicenter = this.epicenter;\r\n\t\tconst mainCamera = this.mainCamera;\r\n\t\tconst screenPosition = this.screenPosition;\r\n\r\n\t\tconst shockWaveMaterial = this.shockWaveMaterial;\r\n\t\tconst uniforms = shockWaveMaterial.uniforms;\r\n\t\tconst center = uniforms.center;\r\n\t\tconst radius = uniforms.radius;\r\n\t\tconst maxRadius = uniforms.maxRadius;\r\n\t\tconst waveSize = uniforms.waveSize;\r\n\r\n\t\tthis.copyMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material = this.copyMaterial;\r\n\r\n\t\tif(this.active) {\r\n\r\n\t\t\t// Calculate direction vectors.\r\n\t\t\tmainCamera.getWorldDirection(v);\r\n\t\t\tab.copy(mainCamera.position).sub(epicenter);\r\n\r\n\t\t\t// Don't render the effect if the object is behind the camera.\r\n\t\t\tif(v.angleTo(ab) > HALF_PI) {\r\n\r\n\t\t\t\t// Scale the effect based on distance to the object.\r\n\t\t\t\tuniforms.cameraDistance.value = mainCamera.position.distanceTo(epicenter);\r\n\r\n\t\t\t\t// Calculate the screen position of the epicenter.\r\n\t\t\t\tscreenPosition.copy(epicenter).project(mainCamera);\r\n\t\t\t\tcenter.value.x = (screenPosition.x + 1.0) * 0.5;\r\n\t\t\t\tcenter.value.y = (screenPosition.y + 1.0) * 0.5;\r\n\r\n\t\t\t\tuniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\t\t\tthis.material = shockWaveMaterial;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Update the shock wave radius based on time.\r\n\t\t\tthis.time += delta * this.speed;\r\n\t\t\tradius.value = this.time - waveSize.value;\r\n\r\n\t\t\tif(radius.value >= (maxRadius.value + waveSize.value) * 2) {\r\n\r\n\t\t\t\tthis.active = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.shockWaveMaterial.uniforms.aspect.value = width / height;\r\n\r\n\t}\r\n\r\n}\r\n","// Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range.\r\nexport default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII\";\r\n","// Generated with SMAAAreaImageData.generate().toCanvas().toDataURL().\r\nexport default \"data:image/png;base64,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\";\r\n","import {\r\n\tColor,\r\n\tLinearFilter,\r\n\tNearestFilter,\r\n\tRGBAFormat,\r\n\tRGBFormat,\r\n\tTexture,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport { ColorEdgesMaterial, SMAABlendMaterial, SMAAWeightsMaterial } from \"../materials\";\r\nimport { ClearPass } from \"./ClearPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\nimport searchImageDataURL from \"../materials/images/smaa/searchImageDataURL.js\";\r\nimport areaImageDataURL from \"../materials/images/smaa/areaImageDataURL.js\";\r\n\r\n/**\r\n * Subpixel Morphological Antialiasing (SMAA) v2.8.\r\n *\r\n * Preset: SMAA 1x Medium (with color edge detection).\r\n * https://github.com/iryoku/smaa/releases/tag/v2.8\r\n */\r\n\r\nexport class SMAAPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new SMAA pass.\r\n\t *\r\n\t * @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}.\r\n\t * @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}.\r\n\t */\r\n\r\n\tconstructor(searchImage, areaImage) {\r\n\r\n\t\tsuper(\"SMAAPass\");\r\n\r\n\t\t/**\r\n\t\t * A clear pass for the color edges buffer.\r\n\t\t *\r\n\t\t * @type {ClearPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.clearPass = new ClearPass({\r\n\t\t\tclearColor: new Color(0x000000),\r\n\t\t\tclearAlpha: 1.0\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A render target for the color edge detection.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetColorEdges = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tformat: RGBFormat,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetColorEdges.texture.name = \"SMAA.ColorEdges\";\r\n\t\tthis.renderTargetColorEdges.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A render target for the SMAA weights.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetWeights = this.renderTargetColorEdges.clone();\r\n\r\n\t\tthis.renderTargetWeights.texture.name = \"SMAA.Weights\";\r\n\t\tthis.renderTargetWeights.texture.format = RGBAFormat;\r\n\r\n\t\t/**\r\n\t\t * Color edge detection shader material.\r\n\t\t *\r\n\t\t * @type {ColorEdgesMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.colorEdgesMaterial = new ColorEdgesMaterial();\r\n\r\n\t\t/**\r\n\t\t * SMAA weights shader material.\r\n\t\t *\r\n\t\t * @type {SMAAWeightsMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.weightsMaterial = new SMAAWeightsMaterial();\r\n\r\n\t\tthis.weightsMaterial.uniforms.tDiffuse.value = this.renderTargetColorEdges.texture;\r\n\r\n\t\t/**\r\n\t\t * The SMAA search texture.\r\n\t\t *\r\n\t\t * @type {Texture}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.searchTexture = new Texture(searchImage);\r\n\r\n\t\tthis.searchTexture.name = \"SMAA.Search\";\r\n\t\tthis.searchTexture.magFilter = NearestFilter;\r\n\t\tthis.searchTexture.minFilter = NearestFilter;\r\n\t\tthis.searchTexture.format = RGBAFormat;\r\n\t\tthis.searchTexture.generateMipmaps = false;\r\n\t\tthis.searchTexture.needsUpdate = true;\r\n\t\tthis.searchTexture.flipY = false;\r\n\r\n\t\tthis.weightsMaterial.uniforms.tSearch.value = this.searchTexture;\r\n\r\n\t\t/**\r\n\t\t * The SMAA area texture.\r\n\t\t *\r\n\t\t * @type {Texture}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.areaTexture = new Texture(areaImage);\r\n\r\n\t\tthis.areaTexture.name = \"SMAA.Area\";\r\n\t\tthis.areaTexture.minFilter = LinearFilter;\r\n\t\tthis.areaTexture.format = RGBAFormat;\r\n\t\tthis.areaTexture.generateMipmaps = false;\r\n\t\tthis.areaTexture.needsUpdate = true;\r\n\t\tthis.areaTexture.flipY = false;\r\n\r\n\t\tthis.weightsMaterial.uniforms.tArea.value = this.areaTexture;\r\n\r\n\t\t/**\r\n\t\t * SMAA blend shader material.\r\n\t\t *\r\n\t\t * @type {SMAABlendMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blendMaterial = new SMAABlendMaterial();\r\n\r\n\t\tthis.blendMaterial.uniforms.tWeights.value = this.renderTargetWeights.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\t// Detect color edges.\r\n\t\tthis.material = this.colorEdgesMaterial;\r\n\t\tthis.colorEdgesMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.clearPass.render(renderer, this.renderTargetColorEdges);\r\n\t\trenderer.render(this.scene, this.camera, this.renderTargetColorEdges);\r\n\r\n\t\t// Compute edge weights.\r\n\t\tthis.material = this.weightsMaterial;\r\n\t\trenderer.render(this.scene, this.camera, this.renderTargetWeights);\r\n\r\n\t\t// Apply the antialiasing filter to the colors.\r\n\t\tthis.material = this.blendMaterial;\r\n\t\tthis.blendMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.renderTargetColorEdges.setSize(width, height);\r\n\t\tthis.renderTargetWeights.setSize(width, height);\r\n\r\n\t\tthis.colorEdgesMaterial.uniforms.texelSize.value.copy(\r\n\t\t\tthis.weightsMaterial.uniforms.texelSize.value.copy(\r\n\t\t\t\tthis.blendMaterial.uniforms.texelSize.value.set(\r\n\t\t\t\t\t1.0 / width, 1.0 / height)));\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The SMAA search image, encoded as a base64 data URL.\r\n\t *\r\n\t * Use this image data to create an Image instance and use it together with\r\n\t * the area image to create an SMAAPass.\r\n\t *\r\n\t * @type {String}\r\n\t * @example\r\n\t * const searchImage = new Image();\r\n\t * searchImage.addEventListener(\"load\", progress);\r\n\t * searchImage.src = SMAAPass.searchImageDataURL;\r\n\t */\r\n\r\n\tstatic get searchImageDataURL() {\r\n\r\n\t\treturn searchImageDataURL;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The SMAA area image, encoded as a base64 data URL.\r\n\t *\r\n\t * Use this image data to create an Image instance and use it together with\r\n\t * the search image to create an SMAAPass.\r\n\t *\r\n\t * @type {String}\r\n\t * @example\r\n\t * const areaImage = new Image();\r\n\t * areaImage.addEventListener(\"load\", progress);\r\n\t * areaImage.src = SMAAPass.areaImageDataURL;\r\n\t */\r\n\r\n\tstatic get areaImageDataURL() {\r\n\r\n\t\treturn areaImageDataURL;\r\n\r\n\t}\r\n\r\n}\r\n","import { CombineMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that renders a given texture.\r\n */\r\n\r\nexport class TexturePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new texture pass.\r\n\t *\r\n\t * @param {Texture} texture - The texture.\r\n\t * @param {Number} [opacity=1.0] - The texture opacity.\r\n\t * @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors.\r\n\t */\r\n\r\n\tconstructor(texture, opacity = 1.0, screenMode = true) {\r\n\r\n\t\tsuper(\"TexturePass\");\r\n\r\n\t\tthis.material = new CombineMaterial(screenMode);\r\n\r\n\t\tthis.texture = texture;\r\n\t\tthis.opacitySource = opacity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget texture() {\r\n\r\n\t\treturn this.material.uniforms.texture2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tset texture(value) {\r\n\r\n\t\tthis.material.uniforms.texture2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The opacity of the input buffer.\r\n\t *\r\n\t * The destination color is the color from the image in the input buffer.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget opacityDestination() {\r\n\r\n\t\treturn this.material.uniforms.opacity1.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset opacityDestination(value = 1.0) {\r\n\r\n\t\tthis.material.uniforms.opacity1.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The opacity of the texture.\r\n\t *\r\n\t * The source color is the color from the texture.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget opacitySource() {\r\n\r\n\t\treturn this.material.uniforms.opacity2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset opacitySource(value = 1.0) {\r\n\r\n\t\tthis.material.uniforms.opacity2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.texture1.value = inputBuffer.texture;\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n}\r\n","import {\r\n\tLinearFilter,\r\n\tLinearMipMapLinearFilter,\r\n\tMeshBasicMaterial,\r\n\tRGBFormat,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport {\r\n\tAdaptiveLuminosityMaterial,\r\n\tCopyMaterial,\r\n\tLuminosityMaterial,\r\n\tToneMappingMaterial\r\n} from \"../materials\";\r\n\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A tone mapping pass that supports adaptive luminosity.\r\n *\r\n * If adaptivity is enabled, this pass generates a texture that represents the\r\n * luminosity of the current scene and adjusts it over time to simulate the\r\n * optic nerve responding to the amount of light it is receiving.\r\n *\r\n * Reference:\r\n * GDC2007 - Wolfgang Engel, Post-Processing Pipeline\r\n * http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf\r\n */\r\n\r\nexport class ToneMappingPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new tone mapping pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map.\r\n\t * @param {Number} [options.resolution=256] - The render texture resolution.\r\n\t * @param {Number} [options.distinction=1.0] - A luminance distinction factor.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"ToneMappingPass\");\r\n\r\n\t\t/**\r\n\t\t * The render target for the current luminosity.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t * @todo Use RED format in WebGL 2.0.\r\n\t\t */\r\n\r\n\t\tthis.renderTargetLuminosity = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearMipMapLinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tformat: RGBFormat,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetLuminosity.texture.name = \"ToneMapping.Luminosity\";\r\n\r\n\t\t/**\r\n\t\t * The render target for adapted luminosity.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetAdapted = this.renderTargetLuminosity.clone();\r\n\r\n\t\tthis.renderTargetAdapted.texture.name = \"ToneMapping.AdaptedLuminosity\";\r\n\t\tthis.renderTargetAdapted.texture.generateMipmaps = false;\r\n\t\tthis.renderTargetAdapted.texture.minFilter = LinearFilter;\r\n\r\n\t\t/**\r\n\t\t * A render target that holds a copy of the adapted limonosity.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetPrevious = this.renderTargetAdapted.clone();\r\n\r\n\t\tthis.renderTargetPrevious.texture.name = \"ToneMapping.PreviousLuminosity\";\r\n\r\n\t\t/**\r\n\t\t * Copy shader material used for saving the luminance map.\r\n\t\t *\r\n\t\t * @type {CopyMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyMaterial = new CopyMaterial();\r\n\r\n\t\t/**\r\n\t\t * A luminosity shader material.\r\n\t\t *\r\n\t\t * @type {LuminosityMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.luminosityMaterial = new LuminosityMaterial();\r\n\r\n\t\tthis.luminosityMaterial.uniforms.distinction.value = (options.distinction !== undefined) ? options.distinction : 1.0;\r\n\r\n\t\t/**\r\n\t\t * An adaptive luminance shader material.\r\n\t\t *\r\n\t\t * @type {AdaptiveLuminosityMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.adaptiveLuminosityMaterial = new AdaptiveLuminosityMaterial();\r\n\r\n\t\tthis.resolution = options.resolution;\r\n\r\n\t\t/**\r\n\t\t * A tone mapping shader material.\r\n\t\t *\r\n\t\t * @type {ToneMappingMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.toneMappingMaterial = new ToneMappingMaterial();\r\n\r\n\t\tthis.adaptive = options.adaptive;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution of the render targets.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolution() {\r\n\r\n\t\treturn this.renderTargetLuminosity.width;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution of the render targets. Must be a power of two for mipmaps.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolution(value = 256) {\r\n\r\n\t\t// Round the given value to the next power of two.\r\n\t\tconst exponent = Math.max(0, Math.ceil(Math.log2(value)));\r\n\t\tvalue = Math.pow(2, exponent);\r\n\r\n\t\tthis.renderTargetLuminosity.setSize(value, value);\r\n\t\tthis.renderTargetPrevious.setSize(value, value);\r\n\t\tthis.renderTargetAdapted.setSize(value, value);\r\n\r\n\t\tthis.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1 = exponent.toFixed(1);\r\n\t\tthis.adaptiveLuminosityMaterial.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Whether this pass uses adaptive luminosity.\r\n\t *\r\n\t * @type {Boolean}\r\n\t * @default true\r\n\t */\r\n\r\n\tget adaptive() {\r\n\r\n\t\treturn (this.toneMappingMaterial.defines.ADAPTED_LUMINANCE !== undefined);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Whether this pass should use adaptive luminosity.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset adaptive(value = true) {\r\n\r\n\t\tif(value) {\r\n\r\n\t\t\tthis.toneMappingMaterial.defines.ADAPTED_LUMINANCE = \"1\";\r\n\t\t\tthis.toneMappingMaterial.uniforms.luminanceMap.value = this.renderTargetAdapted.texture;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE;\r\n\t\t\tthis.toneMappingMaterial.uniforms.luminanceMap.value = null;\r\n\r\n\t\t}\r\n\r\n\t\tthis.toneMappingMaterial.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.toneMappingMaterial.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tif(this.dithering !== value) {\r\n\r\n\t\t\tthis.toneMappingMaterial.dithering = value;\r\n\t\t\tthis.toneMappingMaterial.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\r\n\t\tconst adaptiveLuminosityMaterial = this.adaptiveLuminosityMaterial;\r\n\t\tconst luminosityMaterial = this.luminosityMaterial;\r\n\t\tconst toneMappingMaterial = this.toneMappingMaterial;\r\n\t\tconst copyMaterial = this.copyMaterial;\r\n\r\n\t\tconst renderTargetPrevious = this.renderTargetPrevious;\r\n\t\tconst renderTargetLuminosity = this.renderTargetLuminosity;\r\n\t\tconst renderTargetAdapted = this.renderTargetAdapted;\r\n\r\n\t\tif(this.adaptive) {\r\n\r\n\t\t\t// Render the luminance of the current scene into a render target with mipmapping enabled.\r\n\t\t\tthis.material = luminosityMaterial;\r\n\t\t\tluminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\t\trenderer.render(scene, camera, renderTargetLuminosity);\r\n\r\n\t\t\t// Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time.\r\n\t\t\tthis.material = adaptiveLuminosityMaterial;\r\n\t\t\tadaptiveLuminosityMaterial.uniforms.delta.value = delta;\r\n\t\t\tadaptiveLuminosityMaterial.uniforms.tPreviousLum.value = renderTargetPrevious.texture;\r\n\t\t\tadaptiveLuminosityMaterial.uniforms.tCurrentLum.value = renderTargetLuminosity.texture;\r\n\t\t\trenderer.render(scene, camera, renderTargetAdapted);\r\n\r\n\t\t\t// Copy the new adapted luminance value so that it can be used by the next frame.\r\n\t\t\tthis.material = copyMaterial;\r\n\t\t\tcopyMaterial.uniforms.tDiffuse.value = renderTargetAdapted.texture;\r\n\t\t\trenderer.render(scene, camera, renderTargetPrevious);\r\n\r\n\t\t}\r\n\r\n\t\t// Apply the tone mapping to the colours.\r\n\t\tthis.material = toneMappingMaterial;\r\n\t\ttoneMappingMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.material = new MeshBasicMaterial({ color: 0x7fffff });\r\n\t\trenderer.render(this.scene, this.camera, this.renderTargetPrevious);\r\n\t\tthis.material.dispose();\r\n\r\n\t}\r\n\r\n}\r\n","/**\r\n * A compilation of the post processing passes.\r\n *\r\n * @module postprocessing/passes\r\n */\r\n\r\nexport { BloomPass } from \"./BloomPass.js\";\r\nexport { BlurPass } from \"./BlurPass.js\";\r\nexport { BokehPass } from \"./BokehPass.js\";\r\nexport { ClearMaskPass } from \"./ClearMaskPass.js\";\r\nexport { ClearPass } from \"./ClearPass.js\";\r\nexport { DotScreenPass } from \"./DotScreenPass.js\";\r\nexport { FilmPass } from \"./FilmPass.js\";\r\nexport { GlitchMode, GlitchPass } from \"./GlitchPass.js\";\r\nexport { GodRaysPass } from \"./GodRaysPass.js\";\r\nexport { MaskPass } from \"./MaskPass.js\";\r\nexport { OutlinePass } from \"./OutlinePass.js\";\r\nexport { Pass } from \"./Pass.js\";\r\nexport { PixelationPass } from \"./PixelationPass.js\";\r\nexport { RealisticBokehPass } from \"./RealisticBokehPass.js\";\r\nexport { RenderPass } from \"./RenderPass.js\";\r\nexport { SavePass } from \"./SavePass.js\";\r\nexport { ShaderPass } from \"./ShaderPass.js\";\r\nexport { ShockWavePass } from \"./ShockWavePass.js\";\r\nexport { SMAAPass } from \"./SMAAPass.js\";\r\nexport { TexturePass } from \"./TexturePass.js\";\r\nexport { ToneMappingPass } from \"./ToneMappingPass.js\";\r\n","import {\r\n\tDepthStencilFormat,\r\n\tDepthTexture,\r\n\tLinearFilter,\r\n\tRGBAFormat,\r\n\tRGBFormat,\r\n\tUnsignedInt248Type,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport { ClearMaskPass, MaskPass, ShaderPass } from \"../passes\";\r\nimport { CopyMaterial } from \"../materials\";\r\n\r\n/**\r\n * The EffectComposer may be used in place of a normal WebGLRenderer.\r\n *\r\n * The auto clear behaviour of the provided renderer will be disabled to prevent\r\n * unnecessary clear operations.\r\n *\r\n * It is common practice to use a {@link RenderPass} as the first pass to\r\n * automatically clear the screen and render the scene to a texture for further\r\n * processing.\r\n *\r\n * @implements {Resizable}\r\n * @implements {Disposable}\r\n */\r\n\r\nexport class EffectComposer {\r\n\r\n\t/**\r\n\t * Constructs a new effect composer.\r\n\t *\r\n\t * @param {WebGLRenderer} [renderer] - The renderer that should be used.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer.\r\n\t * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer.\r\n\t * @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture.\r\n\t */\r\n\r\n\tconstructor(renderer = null, options = {}) {\r\n\r\n\t\t/**\r\n\t\t * The renderer.\r\n\t\t *\r\n\t\t * You may replace the renderer at any time by using\r\n\t\t * {@link EffectComposer#replaceRenderer}.\r\n\t\t *\r\n\t\t * @type {WebGLRenderer}\r\n\t\t */\r\n\r\n\t\tthis.renderer = renderer;\r\n\r\n\t\t/**\r\n\t\t * The input buffer.\r\n\t\t *\r\n\t\t * Reading from and writing to the same render target should be avoided.\r\n\t\t * Therefore, two seperate yet identical buffers are used.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.inputBuffer = null;\r\n\r\n\t\t/**\r\n\t\t * The output buffer.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.outputBuffer = null;\r\n\r\n\t\tif(this.renderer !== null) {\r\n\r\n\t\t\tthis.renderer.autoClear = false;\r\n\r\n\t\t\tthis.inputBuffer = this.createBuffer(\r\n\t\t\t\t(options.depthBuffer !== undefined) ? options.depthBuffer : true,\r\n\t\t\t\t(options.stencilBuffer !== undefined) ? options.stencilBuffer : false,\r\n\t\t\t\t(options.depthTexture !== undefined) ? options.depthTexture : false\r\n\t\t\t);\r\n\r\n\t\t\tthis.outputBuffer = this.inputBuffer.clone();\r\n\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * A copy pass used for copying masked scenes.\r\n\t\t *\r\n\t\t * @type {ShaderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyPass = new ShaderPass(new CopyMaterial());\r\n\r\n\t\t/**\r\n\t\t * The passes.\r\n\t\t *\r\n\t\t * @type {Pass[]}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.passes = [];\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The depth texture of the input and output buffers.\r\n\t *\r\n\t * @type {DepthTexture}\r\n\t */\r\n\r\n\tget depthTexture() {\r\n\r\n\t\treturn this.inputBuffer.depthTexture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The input and output buffers share a single depth texture. Depth will be\r\n\t * written to this texture when something is rendered into one of the buffers\r\n\t * and the involved materials have depth write enabled.\r\n\t *\r\n\t * You may enable this mechanism during the instantiation of the composer or\r\n\t * by assigning a DepthTexture instance later on. You may also disable it by\r\n\t * assigning null.\r\n\t *\r\n\t * @type {DepthTexture}\r\n\t */\r\n\r\n\tset depthTexture(x) {\r\n\r\n\t\tthis.inputBuffer.depthTexture = x;\r\n\t\tthis.outputBuffer.depthTexture = x;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Replaces the current renderer with the given one. The DOM element of the\r\n\t * current renderer will automatically be removed from its parent node and the\r\n\t * DOM element of the new renderer will take its place.\r\n\t *\r\n\t * The auto clear mechanism of the provided renderer will be disabled.\r\n\t *\r\n\t * Switching between renderers allows you to dynamically enable or disable\r\n\t * antialiasing.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The new renderer.\r\n\t * @return {WebGLRenderer} The old renderer.\r\n\t */\r\n\r\n\treplaceRenderer(renderer) {\r\n\r\n\t\tconst oldRenderer = this.renderer;\r\n\r\n\t\tlet parent, oldSize, newSize;\r\n\r\n\t\tif(oldRenderer !== null && oldRenderer !== renderer) {\r\n\r\n\t\t\tthis.renderer = renderer;\r\n\t\t\tthis.renderer.autoClear = false;\r\n\r\n\t\t\tparent = oldRenderer.domElement.parentNode;\r\n\t\t\toldSize = oldRenderer.getSize();\r\n\t\t\tnewSize = renderer.getSize();\r\n\r\n\t\t\tif(parent !== null) {\r\n\r\n\t\t\t\tparent.removeChild(oldRenderer.domElement);\r\n\t\t\t\tparent.appendChild(renderer.domElement);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif(oldSize.width !== newSize.width || oldSize.height !== newSize.height) {\r\n\r\n\t\t\t\tthis.setSize();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn oldRenderer;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new render target by replicating the renderer's canvas.\r\n\t *\r\n\t * The created render target uses a linear filter for texel minification and\r\n\t * magnification. Its render texture format depends on whether the renderer\r\n\t * uses the alpha channel. Mipmaps are disabled.\r\n\t *\r\n\t * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer.\r\n\t * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer.\r\n\t * @param {Boolean} depthTexture - Whether the render target should have a depth texture.\r\n\t * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas.\r\n\t */\r\n\r\n\tcreateBuffer(depthBuffer, stencilBuffer, depthTexture) {\r\n\r\n\t\tconst drawingBufferSize = this.renderer.getDrawingBufferSize();\r\n\t\tconst alpha = this.renderer.context.getContextAttributes().alpha;\r\n\r\n\t\tconst renderTarget = new WebGLRenderTarget(drawingBufferSize.width, drawingBufferSize.height, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tformat: alpha ? RGBAFormat : RGBFormat,\r\n\t\t\tdepthBuffer: depthBuffer,\r\n\t\t\tstencilBuffer: stencilBuffer,\r\n\t\t\tdepthTexture: depthTexture ? new DepthTexture() : null\r\n\t\t});\r\n\r\n\t\tif(depthTexture && stencilBuffer) {\r\n\r\n\t\t\trenderTarget.depthTexture.format = DepthStencilFormat;\r\n\t\t\trenderTarget.depthTexture.type = UnsignedInt248Type;\r\n\r\n\t\t}\r\n\r\n\t\trenderTarget.texture.name = \"EffectComposer.Buffer\";\r\n\t\trenderTarget.texture.generateMipmaps = false;\r\n\r\n\t\treturn renderTarget;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a pass, optionally at a specific index.\r\n\t *\r\n\t * @param {Pass} pass - A new pass.\r\n\t * @param {Number} [index] - An index at which the pass should be inserted.\r\n\t */\r\n\r\n\taddPass(pass, index) {\r\n\r\n\t\tconst renderer = this.renderer;\r\n\t\tconst drawingBufferSize = renderer.getDrawingBufferSize();\r\n\r\n\t\tpass.setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\t\tpass.initialize(renderer, renderer.context.getContextAttributes().alpha);\r\n\r\n\t\tif(index !== undefined) {\r\n\r\n\t\t\tthis.passes.splice(index, 0, pass);\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.passes.push(pass);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a pass.\r\n\t *\r\n\t * @param {Pass} pass - The pass.\r\n\t */\r\n\r\n\tremovePass(pass) {\r\n\r\n\t\tthis.passes.splice(this.passes.indexOf(pass), 1);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders all enabled passes in the order in which they were added.\r\n\t *\r\n\t * @param {Number} delta - The time between the last frame and the current one in seconds.\r\n\t */\r\n\r\n\trender(delta) {\r\n\r\n\t\tconst passes = this.passes;\r\n\t\tconst copyPass = this.copyPass;\r\n\t\tconst renderer = this.renderer;\r\n\r\n\t\tlet inputBuffer = this.inputBuffer;\r\n\t\tlet outputBuffer = this.outputBuffer;\r\n\r\n\t\tlet stencilTest = false;\r\n\t\tlet pass, context, state, buffer;\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = passes.length; i < l; ++i) {\r\n\r\n\t\t\tpass = passes[i];\r\n\r\n\t\t\tif(pass.enabled) {\r\n\r\n\t\t\t\tpass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest);\r\n\r\n\t\t\t\tif(pass.needsSwap) {\r\n\r\n\t\t\t\t\tif(stencilTest) {\r\n\r\n\t\t\t\t\t\tcopyPass.renderToScreen = pass.renderToScreen;\r\n\r\n\t\t\t\t\t\tcontext = renderer.context;\r\n\t\t\t\t\t\tstate = renderer.state;\r\n\r\n\t\t\t\t\t\t// Preserve the unaffected pixels.\r\n\t\t\t\t\t\tstate.buffers.stencil.setFunc(context.NOTEQUAL, 1, 0xffffffff);\r\n\t\t\t\t\t\tcopyPass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest);\r\n\t\t\t\t\t\tstate.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbuffer = inputBuffer;\r\n\t\t\t\t\tinputBuffer = outputBuffer;\r\n\t\t\t\t\toutputBuffer = buffer;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(pass instanceof MaskPass) {\r\n\r\n\t\t\t\t\tstencilTest = true;\r\n\r\n\t\t\t\t} else if(pass instanceof ClearMaskPass) {\r\n\r\n\t\t\t\t\tstencilTest = false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the size of the buffers and the renderer's output canvas.\r\n\t *\r\n\t * Every pass will be informed of the new size. It's up to each pass how that\r\n\t * information is used.\r\n\t *\r\n\t * If no width or height is specified, the render targets and passes will be\r\n\t * updated with the current size of the renderer.\r\n\t *\r\n\t * @param {Number} [width] - The width.\r\n\t * @param {Number} [height] - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tconst passes = this.passes;\r\n\t\tconst renderer = this.renderer;\r\n\r\n\t\tlet size, drawingBufferSize;\r\n\t\tlet i, l;\r\n\r\n\t\tif(width === undefined || height === undefined) {\r\n\r\n\t\t\tsize = renderer.getSize();\r\n\t\t\twidth = size.width;\r\n\t\t\theight = size.height;\r\n\r\n\t\t}\r\n\r\n\t\t// Update the logical render size.\r\n\t\trenderer.setSize(width, height);\r\n\r\n\t\t// The drawing buffer size takes the device pixel ratio into account.\r\n\t\tdrawingBufferSize = renderer.getDrawingBufferSize();\r\n\r\n\t\tthis.inputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\t\tthis.outputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\r\n\t\tfor(i = 0, l = passes.length; i < l; ++i) {\r\n\r\n\t\t\tpasses[i].setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Resets this composer by deleting all passes and creating new buffers.\r\n\t */\r\n\r\n\treset() {\r\n\r\n\t\tconst renderTarget = this.createBuffer(\r\n\t\t\tthis.inputBuffer.depthBuffer,\r\n\t\t\tthis.inputBuffer.stencilBuffer,\r\n\t\t\t(this.inputBuffer.depthTexture !== null)\r\n\t\t);\r\n\r\n\t\tthis.dispose();\r\n\r\n\t\t// Reanimate.\r\n\t\tthis.inputBuffer = renderTarget;\r\n\t\tthis.outputBuffer = renderTarget.clone();\r\n\t\tthis.copyPass = new ShaderPass(new CopyMaterial());\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Destroys this composer and all passes.\r\n\t *\r\n\t * This method deallocates all disposable objects created by the passes. It\r\n\t * also deletes the main frame buffers of this composer.\r\n\t */\r\n\r\n\tdispose() {\r\n\r\n\t\tconst passes = this.passes;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = passes.length; i < l; ++i) {\r\n\r\n\t\t\tpasses[i].dispose();\r\n\r\n\t\t}\r\n\r\n\t\tthis.passes = [];\r\n\r\n\t\tif(this.inputBuffer !== null) {\r\n\r\n\t\t\tthis.inputBuffer.dispose();\r\n\t\t\tthis.inputBuffer = null;\r\n\r\n\t\t}\r\n\r\n\t\tif(this.outputBuffer !== null) {\r\n\r\n\t\t\tthis.outputBuffer.dispose();\r\n\t\t\tthis.outputBuffer = null;\r\n\r\n\t\t}\r\n\r\n\t\tthis.copyPass.dispose();\r\n\r\n\t}\r\n\r\n}\r\n","import {EffectComposer} from 'postprocessing/src/core/EffectComposer';\nimport {RenderPass} from 'postprocessing/src/passes/RenderPass';\nimport {ShaderPass} from 'postprocessing/src/passes/ShaderPass';\n\nimport {Loop} from '../../core/Loop';\n\nconst polyfill = (object, method, showWarn = true) => {\n if (object[method]) return;\n if (showWarn) console.warn(`@PostProcessorModule: pass.${method}() was not found.`, object);\n object[method] = () => {};\n};\n\n/**\n * @class PostProcessorModule\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new WHS.PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule(),\n * new PostProcessorModule()\n * ]);\n *\n * const processor = app.use('postprocessor');\n *\n * processor\n * .render()\n * .pass(new GlitchPass())\n * .renderToScreen()\n */\nexport class PostProcessorModule {\n currentPass = null;\n\n defer = new Promise(resolve => {\n this.resolve = resolve;\n });\n\n static defaults = {\n debug: true\n };\n\n constructor(params = PostProcessorModule.defaults) {\n this.debug = params.debug;\n this.params = params;\n }\n\n manager(manager) {\n manager.define('postprocessor');\n\n this.effects = manager.use('rendering').effects;\n this.renderer = manager.get('renderer');\n this.scene = manager.get('scene');\n this.camera = manager.get('camera');\n\n this.composer = new EffectComposer(this.renderer, this.params);\n\n manager.use('rendering').stop();\n\n const composer = this.composer;\n this.renderLoop = new Loop(clock => composer.render(clock.getDelta())).start(manager.handler);\n\n manager.update({\n renderer: renderer => {\n this.composer.replaceRenderer(renderer);\n },\n\n scene: scene => {\n this.scene = scene;\n },\n\n camera: camera => {\n this.camera = camera;\n }\n });\n\n this.resolve();\n }\n\n /**\n * @method render\n * @description Adds RenderPass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n render() {\n this.defer.then(() => {\n const pass = new RenderPass(this.scene, this.camera.native);\n\n // TODO: Support for effects.\n\n this.composer.addPass(pass);\n this.currentPass = pass;\n });\n\n return this;\n }\n\n /**\n * @method pass\n * @description Adds your custom pass\n * @param {Pass} pass A custom pass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n pass(pass) {\n this.defer.then(() => {\n polyfill(pass, 'setSize', this.debug);\n polyfill(pass, 'initialise', this.debug);\n\n this.composer.addPass(pass);\n this.currentPass = pass;\n });\n\n return this;\n }\n\n /**\n * @method shader\n * @description Adds a pass made from shader material\n * @param {Material} material A ShaderMaterial\n * @param {String} textureID Name of the readBuffer uniform\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n shader(material, textureID = 'readBuffer') {\n this.defer.then(() => {\n if (!material.uniforms[textureID])\n material.uniforms[textureID] = {value: null};\n\n const pass = new ShaderPass(material, textureID);\n\n this.composer.addPass(pass);\n this.currentPass = pass;\n });\n\n return this;\n }\n\n /**\n * @method get\n * @description Returns a pass by the given name\n * @param {String} name The name of the pass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n get(name) {\n return name\n ? this.composer.passes.filter(pass => pass.name === name)[0]\n : this.currentPass;\n }\n\n /**\n * @method renderToScreen\n * @description Sets the renderToScreen property of currentPass\n * @param {String} [name=true] The name of the pass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n renderToScreen(bool = true) {\n this.defer.then(() => {\n this.currentPass.renderToScreen = bool;\n });\n\n return this;\n }\n}\n","/**\n * @class EventsPatchModule\n * @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one.\n * @category modules/app\n * @memberof module:modules/app\n */\nexport class EventsPatchModule {\n manager(manager) {\n manager.define('events');\n this.element = manager.get('renderer').domElement;\n }\n\n /**\n * @function patchEvents\n * @description This methods patches the list of events on specific object.\n * @param {Number} originObject - The object that gives events.\n * @param {Number} [destObject=this] - The object that takes events.\n * @param {Array[Strings]} [events=[]] - The list of events by names.\n * @memberof module:modules/app.EventsPatchModule\n */\n patchEvents(originObject, destObject = this, events = []) {\n events.forEach(event =>\n originObject.addEventListener(event, e => destObject.emit(event, e))\n );\n }\n\n integrate(self) {\n const {element, patchEvents} = self;\n\n patchEvents(element, this, [\n 'mousemove',\n 'mouseup',\n 'contextmenu',\n 'mousedown',\n 'click',\n 'wheel',\n 'touchstart',\n 'touchend',\n 'touchmove',\n 'keydown',\n 'keyup',\n 'keypress'\n ]);\n }\n}\n","import {\n Vector2,\n Raycaster,\n Plane,\n Vector3\n} from 'three';\n\nimport Events from 'minivents';\nimport {EventsPatchModule} from './EventsPatchModule';\n\n/**\n * @class VirtualMouseModule\n * @category modules/app\n * @param {Boolean} [globalMovement=false]\n * @memberof module:modules/app\n * @extends Events\n */\nexport class VirtualMouseModule extends Events {\n mouse = new Vector2();\n raycaster = new Raycaster();\n world = null;\n canvas = null;\n projectionPlane = new Plane(new Vector3(0, 0, 1), 0);\n\n constructor(globalMovement = false) {\n super();\n this.globalMovement = globalMovement;\n }\n\n update(e, customX, customY) {\n const rect = this.canvas.getBoundingClientRect();\n\n const x = customX || e.clientX;\n const y = customY || e.clientY;\n\n this.mouse.x = ((x - rect.left) / (rect.right - rect.left)) * 2 - 1;\n this.mouse.y = -((y - rect.top) / (rect.bottom - rect.top)) * 2 + 1;\n\n this.projectionPlane.normal.copy(this.camera.getWorldDirection());\n\n this.raycaster.setFromCamera(this.mouse, this.camera);\n this.emit('move');\n }\n\n manager(manager) {\n manager.define('mouse');\n manager.require('events', () => new EventsPatchModule());\n\n this.canvas = manager.get('renderer').domElement;\n this.camera = manager.get('camera').native;\n }\n\n integrate(self) {\n [\n 'click',\n 'mousedown',\n 'mouseup',\n 'mousemove'\n ].forEach(ev => this.on(ev, e => self.emit(ev, e)));\n\n self.globalX = 0;\n self.globalY = 0;\n\n this.on('mousemove', e => {\n if (document.pointerLockElement !== null) {\n self.globalX += e.movementX;\n self.globalY += e.movementY;\n\n self.update(e, self.globalX, self.globalY);\n } else self.update(e);\n });\n }\n\n /**\n * @method track\n * @description Starts tracking events on a component\n * @param {Component} component A component, that should be tracked by the mouse\n * @param {Boolean} nested Whether component's children should be tracked or not\n * @memberof module:modules/app.VirtualMouseModule\n */\n track(component, nested = true) {\n let isHovered = false;\n\n this.on('move', () => {\n if (this.hovers(component, nested)) {\n if (isHovered) component.emit('mousemove');\n else {\n component.emit('mouseover');\n isHovered = true;\n }\n } else if (isHovered) {\n component.emit('mouseout');\n isHovered = false;\n }\n });\n\n this.on('click', () => {\n if (isHovered) component.emit('click');\n else component.emit('offClick');\n });\n\n this.on('mousedown', () => {\n if (isHovered) component.emit('mousedown');\n });\n\n this.on('mouseup', () => {\n if (isHovered) component.emit('mouseup');\n });\n }\n\n /**\n * @method intersection\n * @description Returns an intersection data\n * @param {Component} component A component that intersects with mouse ray (or doesn't)\n * @param {Boolean} nested Whether component's children should be tracked or not\n * @return {Array} intersection data.\n * @memberof module:modules/app.VirtualMouseModule\n */\n intersection({native}, nested = true) {\n if (native.children.length > 0 && nested) {\n const objects = [];\n native.traverse(child => objects.push(child));\n\n return this.raycaster.intersectObjects(objects);\n }\n\n return this.raycaster.intersectObject(native);\n }\n\n /**\n * @method project\n * @description Returns a vector based on mouse ray intersection with plane\n * @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used\n * @param {Vector3} [target] Optional target\n * @return {Vector3} An intersection point.\n * @memberof module:modules/app.VirtualMouseModule\n */\n project(plane = this.projectionPlane, target) {\n return this.raycaster.ray.intersectPlane(plane, target);\n }\n\n /**\n * @method hovers\n * @description Returns a boolean based on intersection data (Whether mouse hovers the component)\n * @param {Component} component A component that intersects with mouse ray (or doesn't)\n * @param {Boolean} nested Whether component's children should be tracked or not\n * @return {Boolean} Whether the component is hovered.\n * @memberof module:modules/app.VirtualMouseModule\n */\n hovers(component, nested = true) {\n return this.intersection(component, nested).length > 0;\n }\n\n /**\n * Mouse ray\n * @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray\n * @public\n */\n get ray() {\n return this.raycaster.ray;\n }\n\n /**\n * Mouse x [-1; 1]\n * @member {Number} module:modules/app.VirtualMouseModule#x\n * @public\n */\n get x() {\n return this.mouse.x;\n }\n\n /**\n * Mouse y [-1; 1]\n * @member {Number} module:modules/app.VirtualMouseModule#y\n * @public\n */\n get y() {\n return this.mouse.y;\n }\n}\n","import {Loop} from '../../core/Loop';\nimport {EventsPatchModule} from './EventsPatchModule';\n\n/**\n * @class ControlsModule\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new WHS.PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule(),\n * new ControlsModule.from(new THREE.TrackballControls())\n * ]);\n */\nexport class ControlsModule {\n static from(controls) {\n return new ControlsModule({controls});\n }\n\n constructor(params = {}) {\n this.params = Object.assign({\n controls: false,\n fix: controls => controls,\n\n update(c) {\n this.controls.update(c.getDelta());\n }\n }, params);\n\n this.controls = this.params.controls;\n this.update = this.params.update;\n }\n\n manager(manager) {\n manager.define('controls');\n manager.require('events', () => new EventsPatchModule());\n }\n\n /**\n * @method setControls\n * @description Set working controls\n * @param {Object} controls Working three.js controls object.\n * @return {this}\n * @memberof module:modules/app.ControlsModule\n */\n setControls(controls) {\n this.controls = controls;\n return this;\n }\n\n /**\n * @method setUpdate\n * @description Set controls update function\n * @param {Function} update Update function\n * @return {this}\n * @memberof module:modules/app.ControlsModule\n */\n setUpdate(update) {\n this.update = update;\n return this;\n }\n\n integrate(self) {\n self.updateLoop = new Loop(self.update.bind(self));\n self.updateLoop.start(this);\n }\n}\n","import {\n FogExp2,\n Fog\n} from 'three';\n\n/**\n * @class FogModule\n * @category modules/app\n * @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object.\n * @param {String} [type=exp2] - The type of fog - exp2 or linear\n * @memberof module:modules/app\n * @example How to create and apply a FogModule\n * const fogModule = new FogModule({\n * color: 0xffffff,\n * density: 0.03,\n * near: 20,\n * far: 200\n * }, 'exp2');\n *\n * new App([\n * ...,\n * fogModule\n * ]);\n */\nexport class FogModule {\n constructor(params = {}, type) {\n this.params = Object.assign({\n color: 0xefd1b5,\n density: 0.020,\n near: 10,\n far: 1000\n }, params);\n if (!type || type === 'exp2') this.fog = new FogExp2(this.params.color, this.params.density);\n else if (type === 'linear') this.fog = new Fog(this.params.color, this.params.near, this.params.far);\n }\n\n manager(manager) {\n manager.set('fog', this.fog);\n manager.get('scene').fog = this.fog;\n }\n}\n","import {createStore} from 'redux';\n\nconst isEqualDefault = (a, b) => {\n if (a === b) return true;\n else if (a && a.equals && a.equals(b)) return true;\n\n return false;\n};\n\n/**\n * @class StateModule\n * @description `StateModule` is useful for apps, where you need state manipulation.\n * This can be: _transitions between screens, games, development moments_.\n * You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example.\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a state module\n * new App([\n * // ...\n * new StateModule().default({\n * sphereColor: 0xff0000\n * })\n * ]);\n */\nexport class StateModule {\n static actionGenerate(isEqual) {\n return (state = [{}, ''], {key, data}) => {\n if (isEqual(state[0][key], data)) return state;\n\n state[0][key] = data;\n state[1] = key;\n\n return state;\n };\n }\n\n constructor(equalCheck = isEqualDefault) {\n this.store = createStore(\n StateModule.actionGenerate(equalCheck)\n );\n\n this.configuration = {};\n this.currentConfig = 'default';\n this.prevConfig = 'default';\n }\n\n /**\n * @method default\n * @description Add default configuration.\n * @param {Object} data Configuration setup\n * @memberof module:modules/app.StateModule\n * @example\n * new WHS.StateModule().default({\n * sphereColor: UTILS.$colors.mesh,\n * planeColor: 0x447F8B\n * })\n */\n default(data) {\n this.config({default: data});\n return this;\n }\n\n /**\n * @method setEqualCheck\n * @description Sets an equalCheck function\n * @param {Function} func function to generate equal check\n * @memberof module:modules/app.StateModule\n */\n setEqualCheck(func) {\n this.store.replaceReducer(\n StateModule.actionGenerate(func)\n );\n }\n\n manager(manager) {\n manager.define('state');\n }\n\n /**\n * @method config\n * @description Load configurations from object.\n * @param {Object} configs Configuration data\n * @memberof module:modules/app.StateModule\n * @example Adding `green` configuration\n * state.config({\n * green: {\n * sphereColor: 0x00ff00,\n * planeColor: 0x00ff00\n * }\n * });\n */\n config(configs) {\n for (const key in configs) {\n if (key) {\n this.configuration[key] = key === 'default'\n ? configs[key]\n : Object.assign({}, this.configuration.default, configs[key]);\n }\n }\n }\n\n /**\n * @method update\n * @description Load updates from object.\n * @param {Object} updates Updates data\n * @memberof module:modules/app.StateModule\n * @example Update callback for `sphereColor`\n * state.update({\n * sphereColor: color => sphere.material.color.setHex(color)\n * });\n */\n update(updates = {}) {\n this.store.subscribe(() => {\n const [data, changedKey] = this.store.getState();\n const callback = updates[changedKey];\n\n if (callback) callback(data[changedKey]);\n });\n }\n\n /**\n * @method to\n * @description Switch to configuration.\n * @param {String} configName Configuration name.\n * @memberof module:modules/app.StateModule\n * @example Changes configuration to `green`\n * state.to('green');\n */\n to(configName) {\n this.prevConfig = this.currentConfig;\n this.currentConfig = configName;\n\n const config = this.configuration[configName]\n ? this.configuration[configName]\n : this.configuration.default;\n\n this.set(config);\n }\n\n /**\n * @method set\n * @description Set current parameters.\n * @param {Object} data Configuration parameters.\n * @memberof module:modules/app.StateModule\n * @example\n * state.set({\n * sphereColor: 0x00ff00\n * });\n */\n set(data) {\n for (const key in data)\n if (key) this.store.dispatch({type: 'ADD', key, data: data[key]});\n }\n\n /**\n * @method get\n * @description Return data of parameter.\n * @param {String} key Parameter name.\n * @memberof module:modules/app.StateModule\n * @example\n * state.get('sphereColor'); // 0x00ff00\n */\n get(key) {\n return this.store.getState()[0][key];\n }\n\n /**\n * @method prev\n * @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`.\n * @param {String} config Configuration name.\n * @param {Any} trueVal Value returned if condition is truthy.\n * @param {Any} falseVal Value returned if condition is falsy.\n * @memberof module:modules/app.StateModule\n */\n prev(config, trueVal, falseVal) {\n return this.prevConfig === config ? trueVal : falseVal;\n }\n\n /**\n * @method current\n * @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`.\n * @param {String} config Configuration name.\n * @param {Any} trueVal Value returned if condition is truthy.\n * @param {Any} falseVal Value returned if condition is falsy.\n * @memberof module:modules/app.StateModule\n */\n current(config, trueVal, falseVal) {\n return this.currentConfig === config ? trueVal : falseVal;\n }\n}\n","import {\n MOUSE,\n Quaternion,\n Spherical,\n Vector2,\n PerspectiveCamera,\n OrthographicCamera,\n EventDispatcher,\n Vector3\n} from 'three';\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\nexport class ThreeOrbitControls extends EventDispatcher {\n constructor(object, domElement, eventHandler) {\n super();\n\n this.object = object;\n\n this.domElement = (domElement === undefined) ? document : domElement;\n this.eventHandler = eventHandler;\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n this.minAzimuthAngle = -Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.25;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n // Set to false to disable use of the keys\n this.enableKeys = true;\n\n // The four arrow keys\n this.keys = {LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40};\n\n // Mouse buttons\n this.mouseButtons = {ORBIT: MOUSE.LEFT, ZOOM: MOUSE.MIDDLE, PAN: MOUSE.RIGHT};\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n //\n // public methods\n //\n\n this.getPolarAngle = () => {\n return spherical.phi;\n };\n\n this.getAzimuthalAngle = () => {\n return spherical.theta;\n };\n\n this.reset = () => {\n this.target.copy(this.target0);\n this.object.position.copy(this.position0);\n this.object.zoom = this.zoom0;\n\n this.object.updateProjectionMatrix();\n this.dispatchEvent(changeEvent);\n\n this.update();\n\n state = STATE.NONE;\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = () => {\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));\n const quatInverse = quat.clone().inverse();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n\n return (() => {\n const position = this.object.position;\n\n offset.copy(position).sub(this.target);\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat);\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset);\n\n if (this.autoRotate && state === STATE.NONE)\n rotateLeft(getAutoRotationAngle());\n\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n\n // restrict theta to be between desired limits\n spherical.theta = Math.max(this.minAzimuthAngle, Math.min(this.maxAzimuthAngle, spherical.theta));\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, spherical.phi));\n\n spherical.makeSafe();\n\n spherical.radius *= scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max(this.minDistance, Math.min(this.maxDistance, spherical.radius));\n\n // move target to panned location\n this.target.add(panOffset);\n\n offset.setFromSpherical(spherical);\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse);\n\n position.copy(this.target).add(offset);\n\n this.object.lookAt(this.target);\n\n if (this.enableDamping === true) {\n sphericalDelta.theta *= (1 - this.dampingFactor);\n sphericalDelta.phi *= (1 - this.dampingFactor);\n } else\n sphericalDelta.set(0, 0, 0);\n\n scale = 1;\n panOffset.set(0, 0, 0);\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (zoomChanged\n || lastPosition.distanceToSquared(this.object.position) > EPS\n || 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS) {\n this.dispatchEvent(changeEvent);\n\n lastPosition.copy(this.object.position);\n lastQuaternion.copy(this.object.quaternion);\n zoomChanged = false;\n\n return true;\n }\n\n return false;\n })();\n };\n\n this.dispose = () => {\n this.domElement.removeEventListener('contextmenu', onContextMenu, false);\n this.domElement.removeEventListener('mousedown', onMouseDown, false);\n this.domElement.removeEventListener('wheel', onMouseWheel, false);\n\n this.domElement.removeEventListener('touchstart', onTouchStart, false);\n this.domElement.removeEventListener('touchend', onTouchEnd, false);\n this.domElement.removeEventListener('touchmove', onTouchMove, false);\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n\n window.removeEventListener('keydown', onKeyDown, false);\n\n // this.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n };\n\n //\n // internals\n //\n\n const changeEvent = {type: 'change'};\n const startEvent = {type: 'start'};\n const endEvent = {type: 'end'};\n\n const STATE = {NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5};\n\n let state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n let scale = 1;\n const panOffset = new Vector3();\n let zoomChanged = false;\n\n const rotateStart = new Vector2();\n const rotateEnd = new Vector2();\n const rotateDelta = new Vector2();\n\n const panStart = new Vector2();\n const panEnd = new Vector2();\n const panDelta = new Vector2();\n\n const dollyStart = new Vector2();\n const dollyEnd = new Vector2();\n const dollyDelta = new Vector2();\n\n const getAutoRotationAngle = () => {\n return 2 * Math.PI / 60 / 60 * this.autoRotateSpeed;\n };\n\n const getZoomScale = () => {\n return Math.pow(0.95, this.zoomSpeed);\n };\n\n const rotateLeft = angle => {\n sphericalDelta.theta -= angle;\n };\n\n const rotateUp = angle => {\n sphericalDelta.phi -= angle;\n };\n\n const panLeft = (() => {\n const v = new Vector3();\n\n return (distance, objectMatrix) => {\n v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n v.multiplyScalar(-distance);\n panOffset.add(v);\n };\n })();\n\n const panUp = (() => {\n const v = new Vector3();\n\n return (distance, objectMatrix) => {\n v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\n v.multiplyScalar(distance);\n panOffset.add(v);\n };\n })();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (() => {\n const offset = new Vector3();\n\n return (deltaX, deltaY) => {\n const element = this.domElement === document ? this.domElement.body : this.domElement;\n\n if (this.object instanceof PerspectiveCamera) {\n // perspective\n const position = this.object.position;\n offset.copy(position).sub(this.target);\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan((this.object.fov / 2) * Math.PI / 180.0);\n\n // we actually don't use screenWidth, since perspective camera is fixed to screen height\n panLeft(2 * deltaX * targetDistance / element.clientHeight, this.object.matrix);\n panUp(2 * deltaY * targetDistance / element.clientHeight, this.object.matrix);\n } else if (this.object instanceof OrthographicCamera) {\n // orthographic\n panLeft(deltaX * (this.object.right - this.object.left) / this.object.zoom / element.clientWidth, this.object.matrix);\n panUp(deltaY * (this.object.top - this.object.bottom) / this.object.zoom / element.clientHeight, this.object.matrix);\n } else {\n // camera neither orthographic nor perspective\n console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.');\n this.enablePan = false;\n }\n };\n })();\n\n const dollyIn = dollyScale => {\n if (this.object instanceof PerspectiveCamera)\n scale /= dollyScale;\n\n else if (this.object instanceof OrthographicCamera) {\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom * dollyScale));\n this.object.updateProjectionMatrix();\n zoomChanged = true;\n } else {\n console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');\n this.enableZoom = false;\n }\n };\n\n const dollyOut = dollyScale => {\n if (this.object instanceof PerspectiveCamera)\n scale *= dollyScale;\n\n else if (this.object instanceof OrthographicCamera) {\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / dollyScale));\n this.object.updateProjectionMatrix();\n zoomChanged = true;\n } else {\n console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');\n this.enableZoom = false;\n }\n };\n\n //\n // event callbacks - update the object state\n //\n\n const handleMouseDownRotate = event => {\n // console.log( 'handleMouseDownRotate' );\n\n rotateStart.set(event.clientX, event.clientY);\n };\n\n const handleMouseDownDolly = event => {\n // console.log( 'handleMouseDownDolly' );\n\n dollyStart.set(event.clientX, event.clientY);\n };\n\n const handleMouseDownPan = event => {\n // console.log( 'handleMouseDownPan' );\n\n panStart.set(event.clientX, event.clientY);\n };\n\n const handleMouseMoveRotate = event => {\n // console.log( 'handleMouseMoveRotate' );\n\n rotateEnd.set(event.clientX, event.clientY);\n rotateDelta.subVectors(rotateEnd, rotateStart);\n\n const element = this.domElement === document ? this.domElement.body : this.domElement;\n\n // rotating across whole screen goes 360 degrees around\n rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * this.rotateSpeed);\n\n // rotating up and down along whole screen attempts to go 360, but limited to 180\n rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * this.rotateSpeed);\n\n rotateStart.copy(rotateEnd);\n\n this.update();\n };\n\n const handleMouseMoveDolly = event => {\n // console.log( 'handleMouseMoveDolly' );\n\n dollyEnd.set(event.clientX, event.clientY);\n\n dollyDelta.subVectors(dollyEnd, dollyStart);\n\n if (dollyDelta.y > 0)\n dollyIn(getZoomScale());\n\n else if (dollyDelta.y < 0)\n dollyOut(getZoomScale());\n\n dollyStart.copy(dollyEnd);\n\n this.update();\n };\n\n const handleMouseMovePan = event => {\n // console.log( 'handleMouseMovePan' );\n\n panEnd.set(event.clientX, event.clientY);\n\n panDelta.subVectors(panEnd, panStart);\n\n pan(panDelta.x, panDelta.y);\n\n panStart.copy(panEnd);\n\n this.update();\n };\n\n const handleMouseUp = event => {\n // console.log( 'handleMouseUp' );\n };\n\n const handleMouseWheel = event => {\n // console.log( 'handleMouseWheel' );\n\n if (event.deltaY < 0)\n dollyOut(getZoomScale());\n\n else if (event.deltaY > 0)\n dollyIn(getZoomScale());\n\n this.update();\n };\n\n const handleKeyDown = event => {\n // console.log( 'handleKeyDown' );\n\n switch (event.keyCode) {\n case this.keys.UP:\n pan(0, this.keyPanSpeed);\n this.update();\n break;\n\n case this.keys.BOTTOM:\n pan(0, -this.keyPanSpeed);\n this.update();\n break;\n\n case this.keys.LEFT:\n pan(this.keyPanSpeed, 0);\n this.update();\n break;\n\n case this.keys.RIGHT:\n pan(-this.keyPanSpeed, 0);\n this.update();\n break;\n\n }\n };\n\n const handleTouchStartRotate = event => {\n // console.log( 'handleTouchStartRotate' );\n\n rotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n };\n\n const handleTouchStartDolly = event => {\n // console.log( 'handleTouchStartDolly' );\n\n const dx = event.touches[0].pageX - event.touches[1].pageX;\n const dy = event.touches[0].pageY - event.touches[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n dollyStart.set(0, distance);\n };\n\n const handleTouchStartPan = event => {\n // console.log( 'handleTouchStartPan' );\n\n panStart.set(event.touches[0].pageX, event.touches[0].pageY);\n };\n\n const handleTouchMoveRotate = event => {\n // console.log( 'handleTouchMoveRotate' );\n\n rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n rotateDelta.subVectors(rotateEnd, rotateStart);\n\n const element = this.domElement === document ? this.domElement.body : this.domElement;\n\n // rotating across whole screen goes 360 degrees around\n rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * this.rotateSpeed);\n\n // rotating up and down along whole screen attempts to go 360, but limited to 180\n rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * this.rotateSpeed);\n\n rotateStart.copy(rotateEnd);\n\n this.update();\n };\n\n const handleTouchMoveDolly = event => {\n // console.log( 'handleTouchMoveDolly' );\n\n const dx = event.touches[0].pageX - event.touches[1].pageX;\n const dy = event.touches[0].pageY - event.touches[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n dollyEnd.set(0, distance);\n\n dollyDelta.subVectors(dollyEnd, dollyStart);\n\n if (dollyDelta.y > 0)\n dollyOut(getZoomScale());\n\n else if (dollyDelta.y < 0)\n dollyIn(getZoomScale());\n\n dollyStart.copy(dollyEnd);\n\n this.update();\n };\n\n const handleTouchMovePan = event => {\n // console.log( 'handleTouchMovePan' );\n\n panEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\n panDelta.subVectors(panEnd, panStart);\n\n pan(panDelta.x, panDelta.y);\n\n panStart.copy(panEnd);\n\n this.update();\n };\n\n const handleTouchEnd = () => {\n // console.log( 'handleTouchEnd' );\n };\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n const onMouseDown = event => {\n if (this.enabled === false) return;\n\n event.preventDefault();\n\n if (event.button === this.mouseButtons.ORBIT) {\n if (this.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n state = STATE.ROTATE;\n } else if (event.button === this.mouseButtons.ZOOM) {\n if (this.enableZoom === false) return;\n\n handleMouseDownDolly(event);\n\n state = STATE.DOLLY;\n } else if (event.button === this.mouseButtons.PAN) {\n if (this.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n state = STATE.PAN;\n }\n\n if (state !== STATE.NONE) {\n this.eventHandler.on('mousemove', onMouseMove, false);\n this.eventHandler.on('mouseup', onMouseUp, false);\n\n this.dispatchEvent(startEvent);\n }\n };\n\n const onMouseMove = event => {\n if (this.enabled === false) return;\n\n event.preventDefault();\n\n if (state === STATE.ROTATE) {\n if (this.enableRotate === false) return;\n\n handleMouseMoveRotate(event);\n } else if (state === STATE.DOLLY) {\n if (this.enableZoom === false) return;\n\n handleMouseMoveDolly(event);\n } else if (state === STATE.PAN) {\n if (this.enablePan === false) return;\n\n handleMouseMovePan(event);\n }\n };\n\n const onMouseUp = event => {\n if (this.enabled === false) return;\n\n handleMouseUp(event);\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n\n this.dispatchEvent(endEvent);\n\n state = STATE.NONE;\n };\n\n const onMouseWheel = event => {\n if (this.enabled === false || this.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE)) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n handleMouseWheel(event);\n\n this.dispatchEvent(startEvent); // not sure why these are here...\n this.dispatchEvent(endEvent);\n };\n\n const onKeyDown = event => {\n if (this.enabled === false || this.enableKeys === false || this.enablePan === false) return;\n\n handleKeyDown(event);\n };\n\n const onTouchStart = event => {\n if (this.enabled === false) return;\n\n switch (event.touches.length) {\n case 1: // one-fingered touch: rotate\n\n if (this.enableRotate === false) return;\n\n handleTouchStartRotate(event);\n\n state = STATE.TOUCH_ROTATE;\n\n break;\n\n case 2: // two-fingered touch: dolly\n\n if (this.enableZoom === false) return;\n\n handleTouchStartDolly(event);\n\n state = STATE.TOUCH_DOLLY;\n\n break;\n\n case 3: // three-fingered touch: pan\n\n if (this.enablePan === false) return;\n\n handleTouchStartPan(event);\n\n state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if (state !== STATE.NONE)\n this.dispatchEvent(startEvent);\n };\n\n const onTouchMove = event => {\n if (this.enabled === false) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n switch (event.touches.length) {\n case 1: // one-fingered touch: rotate\n\n if (this.enableRotate === false) return;\n if (state !== STATE.TOUCH_ROTATE) return; // is this needed?...\n\n handleTouchMoveRotate(event);\n\n break;\n\n case 2: // two-fingered touch: dolly\n\n if (this.enableZoom === false) return;\n if (state !== STATE.TOUCH_DOLLY) return; // is this needed?...\n\n handleTouchMoveDolly(event);\n\n break;\n\n case 3: // three-fingered touch: pan\n\n if (this.enablePan === false) return;\n if (state !== STATE.TOUCH_PAN) return; // is this needed?...\n\n handleTouchMovePan(event);\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n };\n\n const onTouchEnd = event => {\n if (this.enabled === false) return;\n\n handleTouchEnd(event);\n\n this.dispatchEvent(endEvent);\n\n state = STATE.NONE;\n };\n\n const onContextMenu = event => {\n event.preventDefault();\n };\n\n //\n\n this.eventHandler.on('contextmenu', onContextMenu, false);\n\n this.eventHandler.on('mousedown', onMouseDown, false);\n this.eventHandler.on('wheel', onMouseWheel, false);\n\n this.eventHandler.on('touchstart', onTouchStart, false);\n this.eventHandler.on('touchend', onTouchEnd, false);\n this.eventHandler.on('touchmove', onTouchMove, false);\n\n this.eventHandler.on('keydown', onKeyDown, false);\n\n // force an update at start\n\n this.update();\n }\n\n get center() {\n console.warn('OrbitControls: .center has been renamed to .target');\n return this.target;\n }\n\n get noZoom() {\n console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n return !this.enableZoom;\n }\n\n set noZoom(value) {\n console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n this.enableZoom = !value;\n }\n\n get noRotate() {\n console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n return !this.enableRotate;\n }\n\n set noRotate(value) {\n console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n this.enableRotate = !value;\n }\n\n get noPan() {\n console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n return !this.enablePan;\n }\n\n set noPan(value) {\n console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n this.enablePan = !value;\n }\n\n get noKeys() {\n console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n return !this.enableKeys;\n }\n\n set noKeys(value) {\n console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n this.enableKeys = !value;\n }\n\n get staticMoving() {\n console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n return !this.enableDamping;\n }\n\n set staticMoving(value) {\n console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n this.enableDamping = !value;\n }\n\n get dynamicDampingFactor() {\n console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n return this.dampingFactor;\n }\n\n set dynamicDampingFactor(value) {\n console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n this.dampingFactor = value;\n }\n}\n","import {Vector3} from 'three';\nimport {ControlsModule} from '../ControlsModule';\n\nimport {ThreeOrbitControls} from './lib/ThreeOrbitControls';\n\n/**\n * @class OrbitControlsModule\n * @category modules/app\n * @param {Object} [params]\n * @param {Object} [params.object=camera] Object to which controls are applied.\n * @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector.\n * @param {Boolean} [params.follow=false] Follow the target\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new WHS.PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule(),\n * new OrbitControlsModule()\n * ]);\n */\nexport class OrbitControlsModule extends ControlsModule {\n constructor(params = {}) {\n super(params);\n\n this.params = Object.assign({\n follow: false,\n object: null,\n target: new Vector3()\n }, params);\n }\n\n manager(manager) {\n super.manager(manager);\n\n const {object: obj, follow, target} = this.params;\n const object = obj ? obj.native : manager.get('camera').native;\n\n const controls = new ThreeOrbitControls(\n object,\n manager.get('element'),\n manager.handler\n );\n\n const updateProcessor = follow ? c => {\n controls.update(c.getDelta());\n controls.target.copy(target);\n } : c => {\n controls.update(c.getDelta());\n };\n\n this.setControls(controls);\n this.setUpdate(updateProcessor);\n\n manager.update({\n camera: camera => {\n if (obj) return;\n controls.object = camera.native;\n },\n element: element => {\n controls.domElement = element;\n }\n });\n\n controls.target.copy(target);\n }\n}\n","/** @module modules/app/controls */\nexport * from './OrbitControlsModule';\n","/** @module modules/app */\nexport * from './ElementModule';\nexport * from './RenderingModule';\nexport * from './SceneModule';\nexport * from './ResizeModule';\nexport * from './PostProcessorModule';\nexport * from './VirtualMouseModule';\nexport * from './EventsPatchModule';\nexport * from './ControlsModule';\nexport * from './FogModule';\nexport * from './StateModule';\n\n// controls\nexport * from './controls/index';\n","/**\n * @class DynamicGeometryModule\n * @category modules/mesh\n * @param {Object} [params={attributes: false}] - params\n * @param {Boolean} [patchEvents=true]\n * @memberof module:modules/mesh\n */\nexport class DynamicGeometryModule {\n constructor(params = {}) {\n this.params = Object.assign({\n attributes: false\n }, params);\n }\n\n integrate(self) {\n const params = self.params;\n\n this.g_ = function (params = {}) {\n if (this.buildGeometry) {\n this.native.geometry = this.buildGeometry(\n this.updateParams({geometry: params})\n );\n }\n };\n\n if (params.attributes) {\n for (const key in this.params.geometry) {\n if (key) {\n Object.defineProperty(this, `g_${key}`, {\n get() {\n return this.native.geometry.parameters[key];\n },\n set(value) {\n this.native.geometry = this.buildGeometry(this.updateParams({geometry: {[key]: value}}));\n },\n configurable: true,\n enumerable: true\n });\n }\n }\n }\n }\n}\n","import {\n RepeatWrapping,\n UVMapping,\n NearestFilter,\n LinearMipMapLinearFilter,\n TextureLoader,\n Vector2\n} from 'three';\n\nconst loader = new TextureLoader();\n\n/**\n * @class TextureModule\n * @category modules/mesh\n * @description A TextureModule can be applied to any Mesh or Model.\n * @param {Array} [textures] - array of texture objects\n * @memberof module:modules/mesh\n * @example Creating an instance. url takes a path, or a data object.\n * var woodTexture = new TextureModule({\n * url: `${process.assetsPath}/textures/wood.jpg`\n * });\n * @example More comprehensive example, wood texture applied to a Box.\n * new Box({\n * geometry: {\n * width: 2,\n * height: 2,\n * depth: 2\n * },\n * modules: [\n * new TextureModule({\n * url: `path/to/texture.jpg`,\n * repeat: new THREE.Vector2(1, 1) // optional\n * })\n * ],\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n * position: [50, 60, 70]\n * }).addTo(app);\n */\nexport class TextureModule {\n static load(url) {\n return new TextureModule({url}).textures[0][1];\n }\n\n textures = [];\n\n constructor(...textures) {\n textures.forEach(({\n url,\n type = 'map',\n offset = new Vector2(0, 0),\n repeat = new Vector2(1, 1),\n wrap = RepeatWrapping,\n mapping = UVMapping,\n fix = tex => tex\n }) => {\n const texture = loader.load(url);\n\n if (wrap.length > 0) {\n texture.wrapS = wrap[0];\n texture.wrapT = wrap[1];\n } else\n texture.wrapS = texture.wrapT = wrap;\n\n texture.mapping = mapping;\n\n texture.offset.copy(offset);\n texture.repeat.copy(repeat);\n\n texture.magFilter = NearestFilter;\n texture.minFilter = LinearMipMapLinearFilter;\n\n this.textures.push([type, fix(texture)]);\n });\n }\n\n bridge = {\n material(material, self) {\n self.textures.forEach(texture => {\n material[texture[0]] = texture[1];\n });\n\n material.needsUpdate = true;\n return material;\n }\n }\n}\n","import {\n AnimationMixer,\n AnimationClip,\n Clock\n} from 'three';\n\nimport {Loop} from '../../core/Loop';\n\n/**\n * @class AnimationModule\n * @category modules/mesh\n * @description Convenience module that wraps the three.js animation system\n * @param {App} app - the app\n * @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically\n * @param {Object} [params={speed: 1}] - the params\n * @memberof module:modules/mesh\n * @example Create animation module and play a given clip of an imported model\n * const animationModule = new AnimationModule(app, false, {\n * speed: 1.2 // speed up animation by 20%\n * });\n *\n * new Importer({\n * parser(geometry, materials) {\n * // Override parse to generate a skinnedMesh, needed for skinned models\n * return new THREE.SkinnedMesh(geometry, materials);\n * },\n *\n * url: `path/to/model.json`,\n * useCustomMaterial: true,\n *\n * material: new THREE.MeshStandardMaterial({\n * skinning: true\n * }),\n *\n * modules: [animationModule]\n * }).addTo(app).then(() => {\n * // adding model to app returns a promise, so pipe the function to kick off the animation clip\n * animationModule.play('clipName');\n * });\n */\nexport class AnimationModule {\n constructor(app, isDeferred, params = {}) {\n this.params = Object.assign({\n speed: 1\n }, params);\n this.clock = new Clock();\n\n this.app = app;\n this.isDeferred = isDeferred;\n }\n\n /**\n * @method play\n * @instance\n * @description Plays the given clip name\n * @param {String} clipName - the clip to play\n * @return {THREE.AnimationAction} Playing action \n * @memberof module:modules/mesh.AnimationModule\n */\n play(clipName) {\n const clip = AnimationClip.findByName(this.clips, clipName);\n return this.mixer.clipAction(clip).play();\n }\n\n /**\n * @method update\n * @instance\n * @description Update the mixer (being called on frame animation loop)\n * @memberof module:modules/mesh.AnimationModule\n */\n update() {\n if (this.mixer) this.mixer.update(this.clock.getDelta() * this.params.speed);\n }\n\n integrate(self) {\n self.loop = new Loop(() => {\n self.update();\n });\n\n if (!self.isDeferred) self.loop.start(self.app);\n }\n\n manager(manager) {\n manager.define('animation');\n }\n\n bridge = {\n mesh(mesh, self) {\n mesh.geometry.skeleton = mesh.skeleton;\n\n self.mixer = new AnimationMixer(mesh.geometry);\n self.clips = mesh.geometry.animations;\n\n return mesh;\n }\n }\n}\n","/** @module modules/mesh */\nexport * from './DynamicGeometryModule';\nexport * from './TextureModule';\nexport * from './AnimationModule';\n","/**\n * @class DefineModule\n * @category modules\n * @param {String} name\n * @param {Object} data\n * @memberof module:modules\n * @example Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules\n * new App([\n * // ...\n * new DefineModule('camera', new PerspectiveCamera())\n * ]);\n */\nexport class DefineModule {\n constructor(name, data) {\n this.name = name;\n this.data = data;\n }\n\n manager(manager) {\n manager.set(this.name, this.data);\n }\n}\n","/** @module modules */\n\nexport * from './app/index';\nexport * from './mesh/index';\n\n// modules\nexport * from './DefineModule';\n","import {Importer} from './components/meshes/Importer';\nimport {PerspectiveCamera} from './components/cameras/PerspectiveCamera';\n\nexport class Model extends Importer {\n constructor(params, ...additional) {\n console.warn('Model is deprecated. Use Importer instead.');\n\n if (params.geometry) {\n params.url = params.geometry.path;\n params.loader = params.geometry.loader;\n }\n\n super(params, ...additional);\n }\n}\n\nexport class CameraModule {\n constructor(params = {}) {\n console.warn('CameraModule is deprecated. Use DefineModule instead.');\n this.camera = new PerspectiveCamera(params);\n }\n\n integrate(self) {\n this.add(self.camera);\n }\n\n manager(manager) {\n manager.set('camera', this.camera);\n }\n}\n","/**\n * Namespace containing all classes from all modules. Used as global in UMD pattern.\n * @namespace WHS\n * @example The use of WHS namespace.\n * new WHS.App() // core\n * new WHS.PerspectiveCamera() // components\n * new WHS.ResizeModule() // modules\n * WHS.extend() // utils\n */\n\n\nexport * from './core/index';\nexport * from './components/lights/index';\nexport * from './components/cameras/index';\nexport * from './components/meshes/index';\nexport * from './utils/index';\nexport * from './modules/index';\n\n// DEPRECATION\nexport * from './deprecation';\n"],"names":["require$$0","defined","toInteger","aFunction","isObject","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","core","global","has","ctx","hide","cof","IObject","min","toIObject","toLength","toAbsoluteIndex","uid","$keys","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","create","descriptor","setToStringTag","toObject","$iterCreate","getPrototypeOf","LIBRARY","Iterators","redefine","$export","step","TAG","ITERATOR","classof","getIterFn","isArrayIter","call","invoke","cel","html","process","Promise","newPromiseCapability","SPECIES","DESCRIPTORS","TypeError","isNode","newPromiseCapabilityModule","userAgent","perform","anInstance","require$$3","speciesConstructor","require$$4","require$$5","require$$6","promiseResolve","require$$7","forOf","_Promise","pIE","fails","wksExt","gOPS","toString","gOPD","$GOPD","$DP","gOPN","gOPNExt","wks","shared","ObjectProto","USE_NATIVE","$fails","_create","enumKeys","$getOwnPropertyDescriptor","wksDefine","isArray","$Object","_Object$defineProperty","_Object$keys","_Object$getOwnPropertySymbols","_Object$getOwnPropertyDescriptor","defineProperty","_Object$setPrototypeOf","setPrototypeOf","_Symbol","_Symbol$iterator","_typeof","$getPrototypeOf","_Object$getPrototypeOf","extend","object","extensions","extension","Object","getOwnPropertyNames","prop","undefined","constructor","Array","slice","instruct","array","instArray","tempObject","i","max","length","guide","transformData","instructions","key","toArray","instruction","tempArray","px","redefineAll","validate","$iterDefine","setSpecies","asc","meta","strong","from","bind","_Reflect$construct","_Map","_Object$create","construct","CompositionError","classInstance","message","component","stackArray","stack","split","splice","join","console","error","name","Error","DependencyError","activeModule","dependencyModule","ManagerError","warnDeps","REVISION","err","ModuleSystem","source","modules","applyModule","applyBridge","onCopy","bridgeMap","module","bridge","apply","cb","func","moduleScope","push","manager","active","integrate","disposeModule","indexOf","dispose","Events","get","_getIterator","ponyfill","$$observable","ModuleManager","handler","currentModule","store","createStore","state","action","data","dispatch","type","getState","Boolean","depsMap","subscribe","changedKey","callback","warn","set","moduleExecutor","use","Component","params","defaults","integrateModules","promise","_wait","all","isDeffered","wait","then","copy","customize","native","clone","parent","remove","onAdd","add","children","_manager","_native","mesh","_Reflect$get","attributes","mappers","target","mapper","k","map","attribute","prototype","getter","setter","configurable","enumerable","value","mirror","MeshComponent","geom","Mesh","geometry","material","custom","build","wrap","resolve","applyCommand","position","rotation","scale","shadow","x","y","z","castShadow","cast","receiveShadow","receive","onWrap","quaternion","dest","LightComponent","light","wrapShadow","defer","mapSize","width","height","bias","radius","shadowCamera","camera","near","far","fov","left","right","top","bottom","CameraComponent","system","window","App","log","version","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","setTimeout","loops","enabled","ll","e","execute","clock","loop","index","Loop","useClock","Clock","world","addLoop","start","stop","removeLoop","AmbientLight","AmbientLightNative","color","intensity","DirectionalLight","DirectionalLightNative","HemisphereLight","HemisphereLightNative","skyColor","groundColor","PointLight","PointLightNative","distance","decay","SpotLight","SpotLightNative","angle","exponent","Math","PI","AreaLight","RectAreaLightNative","CubeCamera","CubeCameraNative","cubeResolution","OrthographicCamera","OrthographicCameraNative","innerWidth","innerHeight","PerspectiveCamera","PerspectiveCameraNative","aspect","Box","buildGeometry","buffer","BoxBufferGeometry","BoxGeometry","depth","widthSegments","heightSegments","depthSegments","Circle","CircleBufferGeometry","CircleGeometry","segments","thetaStart","thetaLength","Cone","ConeBufferGeometry","ConeGeometry","radiusSegments","openEnded","Cylinder","CylinderBufferGeometry","CylinderGeometry","radiusTop","radiusBottom","Dodecahedron","DodecahedronBufferGeometry","DodecahedronGeometry","detail","Extrude","ExtrudeGeometry","shapes","options","BufferGeometry","fromGeometry","Icosahedron","IcosahedronBufferGeometry","IcosahedronGeometry","Lathe","LatheBufferGeometry","LatheGeometry","points","Line","LineNative","Geometry","pp","curve","getPoints","verts","Float32Array","i3","addAttribute","BufferAttribute","vertices","Importer","filter","processFilter","forEach","el","texturePath","loader","setTexturePath","load","url","onLoad","parser","onProgress","onError","JSONLoader","useCustomMaterial","mat","bones","SkinnedMesh","Octahedron","OctahedronBufferGeometry","OctahedronGeometry","Parametric","ParametricBufferGeometry","ParametricGeometry","slices","stacks","u","v","Vector3","Plane","PlaneBufferGeometry","PlaneGeometry","wSegments","hSegments","verticesOfCube","indicesOfFaces","Polyhedron","PolyhedronBufferGeometry","PolyhedronGeometry","Ring","RingBufferGeometry","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","Shape","ShapeBufferGeometry","ShapeGeometry","Sphere","SphereBufferGeometry","SphereGeometry","Tetrahedron","TetrahedronBufferGeometry","TetrahedronGeometry","Text","path","font","TextGeometry","text","assign","size","curveSegments","Font","bevelEnabled","bevelThickness","bevelSize","FontLoader","Torus","TorusGeometry","tube","radialSegments","tubularSegments","arc","Torusknot","GConstruct","TorusKnotBufferGeometry","TorusKnotGeometry","p","q","Tube","TubeBufferGeometry","TubeGeometry","closed","LineCurve3","Group","obj","addTo","Object3D","ElementModule","container","body","createElement","element","className","style","self","appendChild","RenderingModule","additional","resolution","Vector2","pixelRatio","devicePixelRatio","bgColor","bgOpacity","renderer","fix","WebGLRenderer","effects","setClearColor","setPixelRatio","setSize","Number","toFixed","applyAdditional","scene","attachToCanvas","render","effect","effectLoop","renderLoop","getSize","app","canvas","domElement","define","integrateRenderer","update","forceContextLoss","shadowMap","SYMBOL_CHILDREN_FOR_SCENE","Symbol","SceneModule","willSceneBeReplaced","Scene","onRemove","_setScene","setScene","getScene","ResizeModule","auto","callbacks","updateProjectionMatrix","rendering","offsetWidth","offsetHeight","getContainer","getResolution","addEventListener","trigger","addAutoresize","fragment","vertex","AdaptiveLuminosityMaterial","defines","MIP_LEVEL_1X1","uniforms","tPreviousLum","Uniform","tCurrentLum","minLuminance","delta","tau","fragmentShader","vertexShader","depthWrite","depthTest","ShaderMaterial","BokehMaterial","settings","focus","dof","aperture","maxBlur","cameraNear","cameraFar","tDiffuse","tDepth","adoptCameraSettings","ColorEdgesMaterial","texelSize","EDGE_THRESHOLD","threshold","needsUpdate","CombineMaterial","screenMode","texture1","texture2","opacity1","opacity2","setScreenModeEnabled","SCREEN_MODE","ConvolutionMaterial","halfTexelSize","kernel","setTexelSize","kernelSize","KernelSize","LARGE","kernelPresets","multiplyScalar","VERY_SMALL","SMALL","MEDIUM","VERY_LARGE","HUGE","CopyMaterial","opacity","DepthComparisonMaterial","depthTexture","morphTargets","skinning","PERSPECTIVE_CAMERA","DotScreenMaterial","average","offsetRepeat","Vector4","setAverageEnabled","AVERAGE","FilmMaterial","noise","scanlines","grid","greyscale","sepia","vignette","eskil","noiseIntensity","scanlineIntensity","gridIntensity","greyscaleIntensity","sepiaIntensity","vignetteOffset","vignetteDarkness","time","scanlineCount","gridScale","gridLineWidth","setNoiseEnabled","setScanlinesEnabled","setGridEnabled","setGreyscaleEnabled","setSepiaEnabled","setVignetteEnabled","setEskilEnabled","NOISE","SCANLINES","GRID","GREYSCALE","SEPIA","VIGNETTE","ESKIL","GlitchMaterial","tPerturb","amount","seed","seedX","seedY","distortionX","distortionY","colS","GodRaysMaterial","exposure","density","weight","clampMax","NUM_SAMPLES_FLOAT","NUM_SAMPLES_INT","lightPosition","LuminosityMaterial","colorOutput","luminanceRange","maskLuminance","distinction","range","setColorOutputEnabled","setLuminanceRangeEnabled","COLOR","RANGE","OutlineBlendMaterial","edgeStrength","patternScale","visibleEdgeColor","hiddenEdgeColor","alphaBlending","xRay","pulse","tMask","tEdges","tPattern","Color","setAlphaBlendingEnabled","setXRayEnabled","ALPHA_BLENDING","X_RAY","texture","USE_PATTERN","OutlineEdgesMaterial","PixelationMaterial","granularity","dx","dy","RealisticBokehMaterial","rings","samples","showFocus","manualDoF","pentagon","shaderFocus","luminanceThreshold","luminanceGain","fringe","ditherStrength","RINGS_INT","RINGS_FLOAT","SAMPLES_INT","SAMPLES_FLOAT","focalLength","focalStop","focusCoords","focalDepth","setShowFocusEnabled","setManualDepthOfFieldEnabled","setPentagonEnabled","setShaderFocusEnabled","SHOW_FOCUS","MANUAL_DOF","PENTAGON","SHADER_FOCUS","getFocalLength","ShockWaveMaterial","maxRadius","waveSize","amplitude","center","cameraDistance","SMAABlendMaterial","tWeights","SMAAWeightsMaterial","MAX_SEARCH_STEPS_INT","MAX_SEARCH_STEPS_FLOAT","AREATEX_MAX_DISTANCE","AREATEX_PIXEL_SIZE","AREATEX_SUBTEX_SIZE","SEARCHTEX_SIZE","SEARCHTEX_PACKED_SIZE","tArea","tSearch","steps","ToneMappingMaterial","luminanceMap","averageLuminance","maxLuminance","middleGrey","Pass","quad","frustumCulled","renderToScreen","needsSwap","inputBuffer","outputBuffer","stencilTest","alpha","keys","BlurPass","renderTargetX","WebGLRenderTarget","minFilter","LinearFilter","magFilter","stencilBuffer","depthBuffer","generateMipmaps","renderTargetY","resolutionScale","convolutionMaterial","ditheredConvolutionMaterial","dithering","getKernel","lastRT","destRT","l","floor","format","RGBFormat","BloomPass","renderTarget","blurPass","combineMaterial","luminosityMaterial","blend","initialize","BokehPass","ClearMaskPass","buffers","stencil","setTest","ClearPass","clearColor","clearAlpha","getClearColor","getClearAlpha","setRenderTarget","clear","DotScreenPass","w","FilmPass","scanlineDensity","round","randomInt","low","high","random","randomFloat","GlitchPass","perturbMap","generatePerturbMap","dtSize","mode","GlitchMode","SPORADIC","counter","breakPoint","pixels","dt","DataTexture","FloatType","CONSTANT_WILD","CONSTANT_MILD","RenderPass","clearPass","overrideMaterial","clearDepth","clamp","GodRaysPass","lightSource","lightScene","mainScene","mainCamera","renderTargetMask","renderPassLight","renderPassMask","MeshBasicMaterial","screenPosition","godRaysMaterial","background","project","parseInt","MaskPass","inverse","clearStencil","context","writeValue","clearValue","setMask","setLocked","setOp","REPLACE","setFunc","ALWAYS","setClear","EQUAL","KEEP","ShaderPass","textureID","OutlinePass","renderTargetDepth","renderTargetEdges","renderTargetBlurredEdges","renderPassDepth","MeshDepthMaterial","depthPacking","RGBADepthPacking","copyPass","outlineEdgesMaterial","outlineBlendMaterial","blur","selection","pulseSpeed","selectionLayer","setPatternTexture","objects","clearSelection","layers","enable","disable","visible","mask","cos","setSelectionVisible","PixelationPass","setResolution","RealisticBokehPass","SavePass","resize","HALF_PI","ab","ShockWavePass","epicenter","speed","shockWaveMaterial","copyMaterial","getWorldDirection","sub","angleTo","distanceTo","SMAAPass","searchImage","areaImage","renderTargetColorEdges","renderTargetWeights","RGBAFormat","colorEdgesMaterial","weightsMaterial","searchTexture","Texture","NearestFilter","flipY","areaTexture","blendMaterial","searchImageDataURL","areaImageDataURL","TexturePass","opacitySource","ToneMappingPass","renderTargetLuminosity","LinearMipMapLinearFilter","renderTargetAdapted","renderTargetPrevious","adaptiveLuminosityMaterial","toneMappingMaterial","adaptive","ceil","log2","pow","ADAPTED_LUMINANCE","EffectComposer","autoClear","createBuffer","passes","oldRenderer","oldSize","newSize","parentNode","removeChild","drawingBufferSize","getDrawingBufferSize","getContextAttributes","DepthTexture","DepthStencilFormat","UnsignedInt248Type","pass","NOTEQUAL","polyfill","method","showWarn","PostProcessorModule","debug","composer","getDelta","replaceRenderer","addPass","currentPass","bool","EventsPatchModule","originObject","destObject","events","event","emit","patchEvents","VirtualMouseModule","globalMovement","Raycaster","customX","customY","rect","getBoundingClientRect","clientX","clientY","mouse","projectionPlane","normal","raycaster","setFromCamera","require","on","ev","globalX","globalY","pointerLockElement","movementX","movementY","nested","isHovered","hovers","traverse","child","intersectObjects","intersectObject","plane","ray","intersectPlane","intersection","ControlsModule","controls","c","updateLoop","FogModule","fog","FogExp2","Fog","isEqualDefault","a","b","equals","StateModule","isEqual","equalCheck","actionGenerate","configuration","currentConfig","prevConfig","config","default","replaceReducer","configs","updates","configName","trueVal","falseVal","ThreeOrbitControls","eventHandler","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","MOUSE","ZOOM","MIDDLE","PAN","target0","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","reset","dispatchEvent","changeEvent","STATE","NONE","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","applyQuaternion","setFromVector3","rotateLeft","getAutoRotationAngle","sphericalDelta","makeSafe","panOffset","setFromSpherical","lookAt","zoomChanged","distanceToSquared","EPS","dot","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","Spherical","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","rotateUp","panLeft","objectMatrix","setFromMatrixColumn","panUp","pan","deltaX","deltaY","targetDistance","tan","clientHeight","matrix","clientWidth","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","preventDefault","button","handleMouseUp","stopPropagation","handleTouchEnd","EventDispatcher","OrbitControlsModule","follow","updateProcessor","setControls","setUpdate","DynamicGeometryModule","g_","updateParams","parameters","TextureLoader","TextureModule","textures","repeat","RepeatWrapping","mapping","UVMapping","tex","wrapS","wrapT","AnimationModule","isDeferred","skeleton","mixer","AnimationMixer","clips","animations","clipName","clip","AnimationClip","findByName","clipAction","play","DefineModule","Model","CameraModule"],"mappings":"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,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACnE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEnE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACnE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEnE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE3D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE3D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GA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,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;;CAEnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;CACzB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GA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E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAE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AAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAElD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAElD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,G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"} \ No newline at end of file diff --git a/lib/whs.min.js b/lib/whs.min.js new file mode 100644 index 0000000..72353f4 --- /dev/null +++ b/lib/whs.min.js @@ -0,0 +1,1240 @@ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(q,G,ba){q!=Array.prototype&&q!=Object.prototype&&(q[G]=ba.value)};$jscomp.getGlobal=function(q){return"undefined"!=typeof window&&window===q?q:"undefined"!=typeof global&&null!=global?global:q};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_"; +$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var q=0;return function(G){return $jscomp.SYMBOL_PREFIX+(G||"")+q++}}(); +$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var q=$jscomp.global.Symbol.iterator;q||(q=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[q]&&$jscomp.defineProperty(Array.prototype,q,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(q){var G=0;return $jscomp.iteratorPrototype(function(){return Gq||1342177279>>=1)G+=G;return ka}},"es6","es3");$jscomp.checkEs6ConformanceViaProxy=function(){try{var q={},G=Object.create(new $jscomp.global.Proxy(q,{get:function(ba,ka,K){return ba==q&&"q"==ka&&K==G}}));return!0===G.q}catch(ba){return!1}}; +$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS=!1;$jscomp.ES6_CONFORMANCE=$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS&&$jscomp.checkEs6ConformanceViaProxy(); +$jscomp.polyfill("WeakMap",function(q){function G(){if(!q||!Object.seal)return!1;try{var x=Object.seal({}),p=Object.seal({}),G=new q([[x,2],[p,3]]);if(2!=G.get(x)||3!=G.get(p))return!1;G.delete(x);G.set(p,4);return!G.has(x)&&4==G.get(p)}catch(ra){return!1}}function ba(q){$jscomp.owns(q,K)||$jscomp.defineProperty(q,K,{value:{}})}function ka(q){var p=Object[q];p&&(Object[q]=function(q){ba(q);return p(q)})}if($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS){if(q&&$jscomp.ES6_CONFORMANCE)return q}else if(G())return q; +var K="$jscomp_hidden_"+Math.random();ka("freeze");ka("preventExtensions");ka("seal");var x=0,V=function(q){this.id_=(x+=Math.random()+1).toString();if(q){$jscomp.initSymbol();$jscomp.initSymbolIterator();q=$jscomp.makeIterator(q);for(var p;!(p=q.next()).done;)p=p.value,this.set(p[0],p[1])}};V.prototype.set=function(q,p){ba(q);if(!$jscomp.owns(q,K))throw Error("WeakMap key fail: "+q);q[K][this.id_]=p;return this};V.prototype.get=function(q){return $jscomp.owns(q,K)?q[K][this.id_]:void 0};V.prototype.has= +function(q){return $jscomp.owns(q,K)&&$jscomp.owns(q[K],this.id_)};V.prototype.delete=function(q){return $jscomp.owns(q,K)&&$jscomp.owns(q[K],this.id_)?delete q[K][this.id_]:!1};return V},"es6","es3");$jscomp.polyfill("Math.sign",function(q){return q?q:function(q){q=Number(q);return 0===q||isNaN(q)?q:0h&&(h=f[a]);return h}function R(){Object.defineProperty(this,"id",{value:hk+=2});this.uuid=ja.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function ad(f,h,a,b,c,d){ca.call(this);this.type="BoxGeometry";this.parameters={width:f,height:h,depth:a,widthSegments:b,heightSegments:c, +depthSegments:d};this.fromBufferGeometry(new $b(f,h,a,b,c,d));this.mergeVertices()}function $b(f,h,a,b,c,d){function e(a,b,c,d,e,f,h,wa,q,I,x){var t=f/q,u=h/I,v=f/2,y=h/2,A=wa/2;h=q+1;var Q=I+1,C=f=0,E,Ka,U=new p;for(Ka=0;Kal;l++){if(m=b[l])if(g=m[0],k=m[1]){n&&c.addAttribute("morphTarget"+l,n[g]);d&&c.addAttribute("morphNormal"+ +l,d[g]);a[l]=k;continue}a[l]=0}e.getUniforms().setValue(f,"morphTargetInfluences",a)}}}function tk(f,h){var a={};return{update:function(b){var c=h.render.frame,d=b.geometry,e=f.get(b,d);a[e.id]!==c&&(d.isGeometry&&e.updateFromObject(b),f.update(e),a[e.id]=c);return e},dispose:function(){a={}}}}function ac(f,h,a,b,c,d,e,g,k,l){f=void 0!==f?f:[];ra.call(this,f,void 0!==h?h:301,a,b,c,d,e,g,k,l);this.flipY=!1}function uc(f,h,a){var b=f[0];if(0>=b||0/gm,function(f,a){f=pa[a];if(void 0===f)throw Error("Can not resolve #include <"+a+">");return hf(f)})}function eh(f){return f.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(f,a,b,c){f="";for(a=parseInt(a);a 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")); +h.compileShader(va);h.compileShader(ia);h.attachShader(U,va);h.attachShader(U,ia);h.linkProgram(U);Aa=U;wa=h.getAttribLocation(Aa,"position");Q=h.getAttribLocation(Aa,"uv");d=h.getUniformLocation(Aa,"uvOffset");e=h.getUniformLocation(Aa,"uvScale");g=h.getUniformLocation(Aa,"rotation");k=h.getUniformLocation(Aa,"center");l=h.getUniformLocation(Aa,"scale");n=h.getUniformLocation(Aa,"color");m=h.getUniformLocation(Aa,"map");r=h.getUniformLocation(Aa,"opacity");w=h.getUniformLocation(Aa,"modelViewMatrix"); +t=h.getUniformLocation(Aa,"projectionMatrix");u=h.getUniformLocation(Aa,"fogType");v=h.getUniformLocation(Aa,"fogDensity");q=h.getUniformLocation(Aa,"fogNear");A=h.getUniformLocation(Aa,"fogFar");C=h.getUniformLocation(Aa,"fogColor");h.getUniformLocation(Aa,"fogDepth");E=h.getUniformLocation(Aa,"alphaTest");U=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");U.width=8;U.height=8;va=U.getContext("2d");va.fillStyle="white";va.fillRect(0,0,8,8);D=new he(U)}a.useProgram(Aa);a.initAttributes(); +a.enableAttribute(wa);a.enableAttribute(Q);a.disableUnusedAttributes();a.disable(h.CULL_FACE);a.enable(h.BLEND);h.bindBuffer(h.ARRAY_BUFFER,x);h.vertexAttribPointer(wa,2,h.FLOAT,!1,16,0);h.vertexAttribPointer(Q,2,h.FLOAT,!1,16,8);h.bindBuffer(h.ELEMENT_ARRAY_BUFFER,B);h.uniformMatrix4fv(t,!1,Ka.projectionMatrix.elements);a.activeTexture(h.TEXTURE0);h.uniform1i(m,0);va=U=0;(ia=y.fog)?(h.uniform3f(C,ia.color.r,ia.color.g,ia.color.b),ia.isFog?(h.uniform1f(q,ia.near),h.uniform1f(A,ia.far),h.uniform1i(u, +1),va=U=1):ia.isFogExp2&&(h.uniform1f(v,ia.density),h.uniform1i(u,2),va=U=2)):(h.uniform1i(u,0),va=U=0);ia=0;for(var ef=p.length;iab||a.height>b){if("data"in a){console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+a.width+"x"+a.height+").");return}b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width* +b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function k(a){return ja.isPowerOfTwo(a.width)&&ja.isPowerOfTwo(a.height)}function l(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function n(a,c,d,e){f.generateMipmap(a);b.get(c).__maxMipLevel=Math.log(Math.max(d,e))*Math.LOG2E}function m(a){return 1003=== +a||1004===a||1005===a?f.NEAREST:f.LINEAR}function r(a){a=a.target;a.removeEventListener("dispose",r);a:{var c=b.get(a);if(a.image&&c.__image__webglTextureCube)f.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;f.deleteTexture(c.__webglTexture)}b.remove(a)}a.isVideoTexture&&delete C[a.id];e.memory.textures--}function w(a){a=a.target;a.removeEventListener("dispose",w);var c=b.get(a),d=b.get(a.texture);if(a){void 0!==d.__webglTexture&&f.deleteTexture(d.__webglTexture); +a.depthTexture&&a.depthTexture.dispose();if(a.isWebGLRenderTargetCube)for(d=0;6>d;d++)f.deleteFramebuffer(c.__webglFramebuffer[d]),c.__webglDepthbuffer&&f.deleteRenderbuffer(c.__webglDepthbuffer[d]);else f.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&f.deleteRenderbuffer(c.__webglDepthbuffer);b.remove(a.texture);b.remove(a)}e.memory.textures--}function t(h,m){var w=b.get(h);if(h.isVideoTexture){var t=h.id,v=e.render.frame;C[t]!==v&&(C[t]=v,h.update())}if(0p;p++)v[p]=m||t?t?h.image[p].image:h.image[p]:g(h.image[p],c.maxCubemapSize);var q=v[0],y=k(q),A=d.convert(h.format),C=d.convert(h.type);u(f.TEXTURE_CUBE_MAP, +h,y);for(p=0;6>p;p++)if(m)for(var E,Q=v[p].mipmaps,wa=0,x=Q.length;war;r++)d.__webglFramebuffer[r]=f.createFramebuffer()}else d.__webglFramebuffer=f.createFramebuffer();if(h){a.bindTexture(f.TEXTURE_CUBE_MAP,g.__webglTexture);u(f.TEXTURE_CUBE_MAP,c.texture,m);for(r=0;6>r;r++)v(d.__webglFramebuffer[r],c,f.COLOR_ATTACHMENT0,f.TEXTURE_CUBE_MAP_POSITIVE_X+r);l(c.texture,m)&&n(f.TEXTURE_CUBE_MAP,c.texture, +c.width,c.height);a.bindTexture(f.TEXTURE_CUBE_MAP,null)}else a.bindTexture(f.TEXTURE_2D,g.__webglTexture),u(f.TEXTURE_2D,c.texture,m),v(d.__webglFramebuffer,c,f.COLOR_ATTACHMENT0,f.TEXTURE_2D),l(c.texture,m)&&n(f.TEXTURE_2D,c.texture,c.width,c.height),a.bindTexture(f.TEXTURE_2D,null);if(c.depthBuffer){d=b.get(c);g=!0===c.isWebGLRenderTargetCube;if(c.depthTexture){if(g)throw Error("target.depthTexture not supported in Cube render targets");if(c&&c.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported"); +f.bindFramebuffer(f.FRAMEBUFFER,d.__webglFramebuffer);if(!c.depthTexture||!c.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");b.get(c.depthTexture).__webglTexture&&c.depthTexture.image.width===c.width&&c.depthTexture.image.height===c.height||(c.depthTexture.image.width=c.width,c.depthTexture.image.height=c.height,c.depthTexture.needsUpdate=!0);t(c.depthTexture,0);d=b.get(c.depthTexture).__webglTexture;if(1026===c.depthTexture.format)f.framebufferTexture2D(f.FRAMEBUFFER, +f.DEPTH_ATTACHMENT,f.TEXTURE_2D,d,0);else if(1027===c.depthTexture.format)f.framebufferTexture2D(f.FRAMEBUFFER,f.DEPTH_STENCIL_ATTACHMENT,f.TEXTURE_2D,d,0);else throw Error("Unknown depthTexture format");}else if(g)for(d.__webglDepthbuffer=[],g=0;6>g;g++)f.bindFramebuffer(f.FRAMEBUFFER,d.__webglFramebuffer[g]),d.__webglDepthbuffer[g]=f.createRenderbuffer(),p(d.__webglDepthbuffer[g],c);else f.bindFramebuffer(f.FRAMEBUFFER,d.__webglFramebuffer),d.__webglDepthbuffer=f.createRenderbuffer(),p(d.__webglDepthbuffer, +c);f.bindFramebuffer(f.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(c){var d=c.texture,e=k(c);if(l(d,e)){e=c.isWebGLRenderTargetCube?f.TEXTURE_CUBE_MAP:f.TEXTURE_2D;var g=b.get(d).__webglTexture;a.bindTexture(e,g);n(e,d,c.width,c.height);a.bindTexture(e,null)}}}function nl(f,h){return{convert:function(a){if(1E3===a)return f.REPEAT;if(1001===a)return f.CLAMP_TO_EDGE;if(1002===a)return f.MIRRORED_REPEAT;if(1003===a)return f.NEAREST;if(1004===a)return f.NEAREST_MIPMAP_NEAREST;if(1005=== +a)return f.NEAREST_MIPMAP_LINEAR;if(1006===a)return f.LINEAR;if(1007===a)return f.LINEAR_MIPMAP_NEAREST;if(1008===a)return f.LINEAR_MIPMAP_LINEAR;if(1009===a)return f.UNSIGNED_BYTE;if(1017===a)return f.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return f.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return f.UNSIGNED_SHORT_5_6_5;if(1010===a)return f.BYTE;if(1011===a)return f.SHORT;if(1012===a)return f.UNSIGNED_SHORT;if(1013===a)return f.INT;if(1014===a)return f.UNSIGNED_INT;if(1015===a)return f.FLOAT;if(1016===a){var b= +h.get("OES_texture_half_float");if(null!==b)return b.HALF_FLOAT_OES}if(1021===a)return f.ALPHA;if(1022===a)return f.RGB;if(1023===a)return f.RGBA;if(1024===a)return f.LUMINANCE;if(1025===a)return f.LUMINANCE_ALPHA;if(1026===a)return f.DEPTH_COMPONENT;if(1027===a)return f.DEPTH_STENCIL;if(100===a)return f.FUNC_ADD;if(101===a)return f.FUNC_SUBTRACT;if(102===a)return f.FUNC_REVERSE_SUBTRACT;if(200===a)return f.ZERO;if(201===a)return f.ONE;if(202===a)return f.SRC_COLOR;if(203===a)return f.ONE_MINUS_SRC_COLOR; +if(204===a)return f.SRC_ALPHA;if(205===a)return f.ONE_MINUS_SRC_ALPHA;if(206===a)return f.DST_ALPHA;if(207===a)return f.ONE_MINUS_DST_ALPHA;if(208===a)return f.DST_COLOR;if(209===a)return f.ONE_MINUS_DST_COLOR;if(210===a)return f.SRC_ALPHA_SATURATE;if(33776===a||33777===a||33778===a||33779===a)if(b=h.get("WEBGL_compressed_texture_s3tc"),null!==b){if(33776===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT; +if(33779===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===a||35841===a||35842===a||35843===a)if(b=h.get("WEBGL_compressed_texture_pvrtc"),null!==b){if(35840===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===a&&(b=h.get("WEBGL_compressed_texture_etc1"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(37808===a||37809===a||37810=== +a||37811===a||37812===a||37813===a||37814===a||37815===a||37816===a||37817===a||37818===a||37819===a||37820===a||37821===a)if(b=h.get("WEBGL_compressed_texture_astc"),null!==b)return a;if(103===a||104===a)if(b=h.get("EXT_blend_minmax"),null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=h.get("WEBGL_depth_texture"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}}}function Ba(f,h,a,b){Ab.call(this);this.type="PerspectiveCamera";this.fov=void 0!==f?f:50;this.zoom=1;this.near= +void 0!==a?a:.1;this.far=void 0!==b?b:2E3;this.focus=10;this.aspect=void 0!==h?h:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function jf(f){Ba.call(this);this.cameras=f||[]}function gh(f){function h(){if(null!==b&&!0===b.isPresenting){var c=b.getEyeParameters("left"),d=c.renderWidth;c=c.renderHeight;u=f.getPixelRatio();t=f.getSize();f.setDrawingBufferSize(2*d,c,1)}else a.enabled&&f.setDrawingBufferSize(t.width,t.height,u)}var a=this,b=null,c=null,d=null,e=new V, +g=new V;"undefined"!==typeof window&&"VRFrameData"in window&&(c=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",h,!1));var k=new V,l=new sa,n=new p,m=new Ba;m.bounds=new ya(0,0,.5,1);m.layers.enable(1);var r=new Ba;r.bounds=new ya(.5,0,.5,1);r.layers.enable(2);var w=new jf([m,r]);w.layers.enable(1);w.layers.enable(2);var t,u;this.enabled=!1;this.userHeight=1.6;this.getDevice=function(){return b};this.setDevice=function(a){void 0!==a&&(b=a)};this.setPoseTarget=function(a){void 0!== +a&&(d=a)};this.getCamera=function(f){if(null===b)return f;b.depthNear=f.near;b.depthFar=f.far;b.getFrameData(c);var h=b.stageParameters;h?e.fromArray(h.sittingToStandingTransform):e.makeTranslation(0,a.userHeight,0);h=c.pose;var t=null!==d?d:f;t.matrix.copy(e);t.matrix.decompose(t.position,t.quaternion,t.scale);null!==h.orientation&&(l.fromArray(h.orientation),t.quaternion.multiply(l));null!==h.position&&(l.setFromRotationMatrix(e),n.fromArray(h.position),n.applyQuaternion(l),t.position.add(n));t.updateMatrixWorld(); +if(!1===b.isPresenting)return f;m.near=f.near;r.near=f.near;m.far=f.far;r.far=f.far;w.matrixWorld.copy(f.matrixWorld);w.matrixWorldInverse.copy(f.matrixWorldInverse);m.matrixWorldInverse.fromArray(c.leftViewMatrix);r.matrixWorldInverse.fromArray(c.rightViewMatrix);g.getInverse(e);m.matrixWorldInverse.multiply(g);r.matrixWorldInverse.multiply(g);f=t.parent;null!==f&&(k.getInverse(f.matrixWorld),m.matrixWorldInverse.multiply(k),r.matrixWorldInverse.multiply(k));m.matrixWorld.getInverse(m.matrixWorldInverse); +r.matrixWorld.getInverse(r.matrixWorldInverse);m.projectionMatrix.fromArray(c.leftProjectionMatrix);r.projectionMatrix.fromArray(c.rightProjectionMatrix);w.projectionMatrix.copy(m.projectionMatrix);f=b.getLayers();f.length&&(f=f[0],null!==f.leftBounds&&4===f.leftBounds.length&&m.bounds.fromArray(f.leftBounds),null!==f.rightBounds&&4===f.rightBounds.length&&r.bounds.fromArray(f.rightBounds));return w};this.getStandingMatrix=function(){return e};this.submitFrame=function(){null!==b&&!0===b.isPresenting&& +b.submitFrame()};this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",h)}}function kf(f){function h(){Fa=new nk(M);Fa.get("WEBGL_depth_texture");Fa.get("OES_texture_float");Fa.get("OES_texture_float_linear");Fa.get("OES_texture_half_float");Fa.get("OES_texture_half_float_linear");Fa.get("OES_standard_derivatives");Fa.get("OES_element_index_uint");Fa.get("ANGLE_instanced_arrays");ua=new nl(M,Fa);da=new lk(M,Fa,f);na=new kl(M,Fa,ua);na.scissor(J.copy(ma).multiplyScalar(S)); +na.viewport(G.copy(W).multiplyScalar(S));fa=new qk(M);ba=new $k;ha=new ml(M,Fa,na,ba,da,ua,fa);ka=new ek(M);la=new ok(M,ka,fa);pa=new tk(la,fa);za=new sk(M);oa=new Zk(z,Fa,da);sa=new dl;ra=new il;qa=new jk(z,na,la,Q);Ba=new kk(M,Fa,fa);Ca=new pk(M,Fa,fa);Da=new jl(z,M,na,ha,da);fa.programs=oa.programs;z.context=M;z.capabilities=da;z.extensions=Fa;z.properties=ba;z.renderLists=sa;z.state=na;z.info=fa}function a(a){a.preventDefault();console.log("THREE.WebGLRenderer: Context Lost.");H=!0}function b(){console.log("THREE.WebGLRenderer: Context Restored."); +H=!1;h()}function c(a){a=a.target;a.removeEventListener("dispose",c);d(a);ba.remove(a)}function d(a){var b=ba.get(a).program;a.program=void 0;void 0!==b&&oa.releaseProgram(b)}function e(a,b,c){a.render(function(a){z.renderBufferImmediate(a,b,c)})}function g(){var a=xa.getDevice();a&&a.isPresenting?a.requestAnimationFrame(k):window.requestAnimationFrame(k)}function k(a){!1!==Ea&&(Ha(a),g())}function l(a,b,c){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isLight)F.pushLight(a),a.castShadow&&F.pushShadow(a); +else if(a.isSprite)a.frustumCulled&&!X.intersectsSprite(a)||F.pushSprite(a);else if(a.isImmediateRenderObject)c&&ea.setFromMatrixPosition(a.matrixWorld).applyMatrix4(aa),D.push(a,null,a.material,ea.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||X.intersectsObject(a)){c&&ea.setFromMatrixPosition(a.matrixWorld).applyMatrix4(aa);var d=pa.update(a),e=a.material;if(Array.isArray(e))for(var g=d.groups,f=0,h=g.length;fa.matrixWorld.determinant();na.setMaterial(g,h);h=w(c,b.fog,g,a);ia="";e(a,h,g)}else z.renderBufferDirect(c,b.fog,d,g,a,f);a.onAfterRender(z,b,c,d,g,f);F=ra.get(b,U||c)}function r(a,b,e){var g=ba.get(a),f=F.state.lights;e=oa.getParameters(a,f.state,F.state.shadowsArray,b,Y.numPlanes, +Y.numIntersection,e);var h=oa.getProgramCode(a,e),k=g.program,l=!0;if(void 0===k)a.addEventListener("dispose",c);else if(k.code!==h)d(a);else{if(g.lightsHash!==f.state.hash)ba.update(a,"lightsHash",f.state.hash);else if(void 0!==e.shaderID)return;l=!1}l&&(e.shaderID?(k=tc[e.shaderID],g.shader={name:a.type,uniforms:$a.clone(k.uniforms),vertexShader:k.vertexShader,fragmentShader:k.fragmentShader}):g.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader}, +a.onBeforeCompile(g.shader,z),k=oa.acquireProgram(a,g.shader,e,h),g.program=k,a.program=k);e=k.getAttributes();if(a.morphTargets)for(h=a.numSupportedMorphTargets=0;he.matrixWorld.determinant();na.setMaterial(d,g);var h=w(a,b,d,e);a=c.id+"_"+h.id+"_"+(!0===d.wireframe);var k=!1;a!==ia&&(ia=a,k=!0);e.morphTargetInfluences&&(za.update(e,c,d,h),k=!0);g=c.index;var l=c.attributes.position;b=1;!0===d.wireframe&&(g=la.getWireframeAttribute(c),b=2);a=Ba;if(null!==g){var m=ka.get(g);a=Ca;a.setIndex(m)}if(k){if(c&&c.isInstancedBufferGeometry&&null===Fa.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); +else{na.initAttributes();k=c.attributes;h=h.getAttributes();var n=d.defaultAttributeValues;for(E in h){var r=h[E];if(0<=r){var t=k[E];if(void 0!==t){var u=t.normalized,p=t.itemSize,v=ka.get(t);if(void 0!==v){var q=v.buffer,A=v.type;v=v.bytesPerElement;if(t.isInterleavedBufferAttribute){var y=t.data,C=y.stride;t=t.offset;y&&y.isInstancedInterleavedBuffer?(na.enableAttributeAndDivisor(r,y.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=y.meshPerAttribute*y.count)):na.enableAttribute(r); +M.bindBuffer(M.ARRAY_BUFFER,q);M.vertexAttribPointer(r,p,A,u,C*v,t*v)}else t.isInstancedBufferAttribute?(na.enableAttributeAndDivisor(r,t.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=t.meshPerAttribute*t.count)):na.enableAttribute(r),M.bindBuffer(M.ARRAY_BUFFER,q),M.vertexAttribPointer(r,p,A,u,0,0)}}else if(void 0!==n&&(u=n[E],void 0!==u))switch(u.length){case 2:M.vertexAttrib2fv(r,u);break;case 3:M.vertexAttrib3fv(r,u);break;case 4:M.vertexAttrib4fv(r,u);break;default:M.vertexAttrib1fv(r, +u)}}}na.disableUnusedAttributes()}null!==g&&M.bindBuffer(M.ELEMENT_ARRAY_BUFFER,m.buffer)}m=Infinity;null!==g?m=g.count:void 0!==l&&(m=l.count);g=c.drawRange.start*b;l=null!==f?f.start*b:0;var E=Math.max(g,l);f=Math.max(0,Math.min(m,g+c.drawRange.count*b,l+(null!==f?f.count*b:Infinity))-1-E+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)na.setLineWidth(d.wireframeLinewidth*(null===N?S:1)),a.setMode(M.LINES);else switch(e.drawMode){case 0:a.setMode(M.TRIANGLES);break;case 1:a.setMode(M.TRIANGLE_STRIP); +break;case 2:a.setMode(M.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),na.setLineWidth(d*(null===N?S:1)),e.isLineSegments?a.setMode(M.LINES):e.isLineLoop?a.setMode(M.LINE_LOOP):a.setMode(M.LINE_STRIP)):e.isPoints&&a.setMode(M.POINTS);c&&c.isInstancedBufferGeometry?0=da.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+da.maxTextures);P+=1;return a};this.setTexture2D=function(){var a=!1; +return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);ha.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ha.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."), +a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ha.setTextureCube(b,c):ha.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return N};this.setRenderTarget=function(a){(N=a)&&void 0===ba.get(a).__webglFramebuffer&&ha.setupRenderTarget(a);var b=null,c=!1;a?(b=ba.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),G.copy(a.viewport),J.copy(a.scissor),O=a.scissorTest):(G.copy(W).multiplyScalar(S),J.copy(ma).multiplyScalar(S), +O=Ia);La!==b&&(M.bindFramebuffer(M.FRAMEBUFFER,b),La=b);na.viewport(G);na.scissor(J);na.setScissorTest(O);c&&(c=ba.get(a.texture),M.framebufferTexture2D(M.FRAMEBUFFER,M.COLOR_ATTACHMENT0,M.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=ba.get(a).__webglFramebuffer;if(g){var h=!1;g!==La&&(M.bindFramebuffer(M.FRAMEBUFFER,g),h=!0);try{var k=a.texture,l=k.format,m=k.type;1023!==l&& +ua.convert(l)!==M.getParameter(M.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===m||ua.convert(m)===M.getParameter(M.IMPLEMENTATION_COLOR_READ_TYPE)||1015===m&&(Fa.get("OES_texture_float")||Fa.get("WEBGL_color_buffer_float"))||1016===m&&Fa.get("EXT_color_buffer_half_float")?M.checkFramebufferStatus(M.FRAMEBUFFER)===M.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&M.readPixels(b, +c,d,e,ua.convert(l),ua.convert(m),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&M.bindFramebuffer(M.FRAMEBUFFER,La)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d= +b.image.width,e=b.image.height,f=ua.convert(b.format);this.setTexture2D(b,0);M.copyTexImage2D(M.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=ua.convert(c.format),h=ua.convert(c.type);b=b.isDataTexture?b.image.data:b.image;this.setTexture2D(c,0);M.texSubImage2D(M.TEXTURE_2D,d||0,a.x,a.y,e,f,g,h,b)}}function vc(f,h){this.name="";this.color=new S(f);this.density=void 0!==h?h:2.5E-4}function wc(f,h,a){this.name="";this.color=new S(f); +this.near=void 0!==h?h:1;this.far=void 0!==a?a:1E3}function xc(){O.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function cc(f){da.call(this);this.type="SpriteMaterial";this.color=new S(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(f)}function lf(f){O.call(this);this.type="Sprite";this.material=void 0!==f?f:new cc;this.center=new x(.5,.5)}function ie(){O.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0, +value:[]}})}function je(f,h){f=f||[];this.bones=f.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===h)this.calculateInverses();else if(this.bones.length===h.length)this.boneInverses=h.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],f=0,h=this.bones.length;fa;a++){var m=n[g[a]];var r=n[g[(a+1)%3]];d[0]=Math.min(m,r);d[1]=Math.max(m,r);m=d[0]+","+d[1];void 0===e[m]&&(e[m]={index1:d[0],index2:d[1]})}}for(m in e)l= +e[m],g=f.vertices[l.index1],h.push(g.x,g.y,g.z),g=f.vertices[l.index2],h.push(g.x,g.y,g.z)}else if(f&&f.isBufferGeometry)if(g=new p,null!==f.index){k=f.attributes.position;n=f.index;var w=f.groups;0===w.length&&(w=[{start:0,count:n.count,materialIndex:0}]);f=0;for(c=w.length;fa;a++)m=n.getX(l+a),r=n.getX(l+(a+1)%3),d[0]=Math.min(m,r),d[1]=Math.max(m,r),m=d[0]+","+d[1],void 0===e[m]&&(e[m]={index1:d[0],index2:d[1]});for(m in e)l=e[m], +g.fromBufferAttribute(k,l.index1),h.push(g.x,g.y,g.z),g.fromBufferAttribute(k,l.index2),h.push(g.x,g.y,g.z)}else for(k=f.attributes.position,l=0,b=k.count/3;la;a++)e=3*l+a,g.fromBufferAttribute(k,e),h.push(g.x,g.y,g.z),e=3*l+(a+1)%3,g.fromBufferAttribute(k,e),h.push(g.x,g.y,g.z);this.addAttribute("position",new J(h,3))}function hd(f,h,a){ca.call(this);this.type="ParametricGeometry";this.parameters={func:f,slices:h,stacks:a};this.fromBufferGeometry(new yc(f,h,a));this.mergeVertices()} +function yc(f,h,a){R.call(this);this.type="ParametricBufferGeometry";this.parameters={func:f,slices:h,stacks:a};var b=[],c=[],d=[],e=[],g=new p,k=new p,l=new p,n=new p,m=new p,r,w,t=h+1;for(r=0;r<=a;r++){var u=r/a;for(w=0;w<=h;w++){var v=w/h;f(v,u,k);c.push(k.x,k.y,k.z);0<=v-1E-5?(f(v-1E-5,u,l),n.subVectors(k,l)):(f(v+1E-5,u,l),n.subVectors(l,k));0<=u-1E-5?(f(v,u-1E-5,l),m.subVectors(k,l)):(f(v,u+1E-5,l),m.subVectors(l,k));g.crossVectors(n,m).normalize();d.push(g.x,g.y,g.z);e.push(v,u)}}for(r=0;r< +a;r++)for(w=0;wd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}R.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:f,indices:h,radius:a,detail:b};a=a||1;b=b||0;var g=[],k=[];(function(a){for(var b=new p,e=new p,f=new p,g=0;gf&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})(); +this.addAttribute("position",new J(g,3));this.addAttribute("normal",new J(g.slice(),3));this.addAttribute("uv",new J(k,2));0===b?this.computeVertexNormals():this.normalizeNormals()}function jd(f,h){ca.call(this);this.type="TetrahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new zc(f,h));this.mergeVertices()}function zc(f,h){Wa.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],f,h);this.type="TetrahedronBufferGeometry";this.parameters={radius:f,detail:h}} +function kd(f,h){ca.call(this);this.type="OctahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new ec(f,h));this.mergeVertices()}function ec(f,h){Wa.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],f,h);this.type="OctahedronBufferGeometry";this.parameters={radius:f,detail:h}}function ld(f,h){ca.call(this);this.type="IcosahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new Ac(f,h));this.mergeVertices()} +function Ac(f,h){var a=(1+Math.sqrt(5))/2;Wa.call(this,[-1,a,0,1,a,0,-1,-a,0,1,-a,0,0,-1,a,0,1,a,0,-1,-a,0,1,-a,a,0,-1,a,0,1,-a,0,-1,-a,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],f,h);this.type="IcosahedronBufferGeometry";this.parameters={radius:f,detail:h}}function md(f,h){ca.call(this);this.type="DodecahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new Bc(f,h));this.mergeVertices()} +function Bc(f,h){var a=(1+Math.sqrt(5))/2,b=1/a;Wa.call(this,[-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,-b,-a,0,-b,a,0,b,-a,0,b,a,-b,-a,0,-b,a,0,b,-a,0,b,a,0,-a,0,-b,a,0,-b,-a,0,b,a,0,b],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],f,h);this.type="DodecahedronBufferGeometry"; +this.parameters={radius:f,detail:h}}function nd(f,h,a,b,c,d){ca.call(this);this.type="TubeGeometry";this.parameters={path:f,tubularSegments:h,radius:a,radialSegments:b,closed:c};void 0!==d&&console.warn("THREE.TubeGeometry: taper has been removed.");f=new Cc(f,h,a,b,c);this.tangents=f.tangents;this.normals=f.normals;this.binormals=f.binormals;this.fromBufferGeometry(f);this.mergeVertices()}function Cc(f,h,a,b,c){function d(c){n=f.getPointAt(c/h,n);var d=e.normals[c];c=e.binormals[c];for(r=0;r<=b;r++){var l= +r/b*Math.PI*2,m=Math.sin(l);l=-Math.cos(l);k.x=l*d.x+m*c.x;k.y=l*d.y+m*c.y;k.z=l*d.z+m*c.z;k.normalize();t.push(k.x,k.y,k.z);g.x=n.x+a*k.x;g.y=n.y+a*k.y;g.z=n.z+a*k.z;w.push(g.x,g.y,g.z)}}R.call(this);this.type="TubeBufferGeometry";this.parameters={path:f,tubularSegments:h,radius:a,radialSegments:b,closed:c};h=h||64;a=a||1;b=b||8;c=c||!1;var e=f.computeFrenetFrames(h,c);this.tangents=e.tangents;this.normals=e.normals;this.binormals=e.binormals;var g=new p,k=new p,l=new x,n=new p,m,r,w=[],t=[],u=[], +v=[];for(m=0;m=h;c-=b)d=jh(c,f[c],f[c+1],d);d&&fc(d,d.next)&&(rd(d),d=d.next);return d} +function sd(f,h){if(!f)return f;h||(h=f);do{var a=!1;if(f.steiner||!fc(f,f.next)&&0!==Ra(f.prev,f,f.next))f=f.next;else{rd(f);f=h=f.prev;if(f===f.next)break;a=!0}}while(a||f!==h);return h}function td(f,h,a,b,c,d,e){if(f){if(!e&&d){var g=f,k=g;do null===k.z&&(k.z=qf(k.x,k.y,b,c,d)),k.prevZ=k.prev,k=k.nextZ=k.next;while(k!==g);k.prevZ.nextZ=null;k.prevZ=null;g=k;var l,n,m,r,w=1;do{k=g;var t=g=null;for(n=0;k;){n++;var u=k;for(l=m=0;lm.x?n.x>w.x?n.x:w.x:m.x>w.x?m.x:w.x,C=n.y>m.y?n.y>w.y?n.y:w.y:m.y>w.y?m.y:w.y;l=qf(n.x=l;){if(p!==t.prev&&p!==t.next&&me(n.x,n.y,m.x,m.y,w.x,w.y,p.x,p.y)&&0<=Ra(p.prev,p,p.next)){t=!1;break a}p=p.prevZ}t=!0}}else a:if(t=f,n=t.prev,m=t,w=t.next,0<=Ra(n,m,w))t=!1;else{for(l=t.next.next;l!==t.prev;){if(me(n.x,n.y,m.x,m.y,w.x,w.y,l.x,l.y)&&0<=Ra(l.prev,l,l.next)){t=!1;break a}l=l.next}t=!0}if(t)h.push(k.i/a),h.push(f.i/a),h.push(u.i/a),rd(f),g=f=u.next;else if(f=u,f===g){if(!e)td(sd(f),h,a,b,c,d,1);else if(1=== +e){e=h;g=a;k=f;do u=k.prev,t=k.next.next,!fc(u,t)&&kh(u,k,k.next,t)&&ud(u,t)&&ud(t,u)&&(e.push(u.i/g),e.push(k.i/g),e.push(t.i/g),rd(k),rd(k.next),k=f=t),k=k.next;while(k!==f);f=k;td(f,h,a,b,c,d,2)}else if(2===e)a:{e=f;do{for(g=e.next.next;g!==e.prev;){if(k=e.i!==g.i){k=e;u=g;if(t=k.next.i!==u.i&&k.prev.i!==u.i){b:{t=k;do{if(t.i!==k.i&&t.next.i!==k.i&&t.i!==u.i&&t.next.i!==u.i&&kh(t,t.next,k,u)){t=!0;break b}t=t.next}while(t!==k);t=!1}t=!t}if(t=t&&ud(k,u)&&ud(u,k)){t=k;n=!1;m=(k.x+u.x)/2;u=(k.y+u.y)/ +2;do t.y>u!==t.next.y>u&&t.next.y!==t.y&&m<(t.next.x-t.x)*(u-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==k);t=n}k=t}if(k){f=lh(e,g);e=sd(e,e.next);f=sd(f,f.next);td(e,h,a,b,c,d);td(f,h,a,b,c,d);break a}g=g.next}e=e.next}while(e!==f)}break}}}}function pl(f,h){return f.x-h.x}function ql(f,h){var a=h,b=f.x,c=f.y,d=-Infinity;do{if(c<=a.y&&c>=a.next.y&&a.next.y!==a.y){var e=a.x+(c-a.y)*(a.next.x-a.x)/(a.next.y-a.y);if(e<=b&&e>d){d=e;if(e===b){if(c===a.y)return a;if(c===a.next.y)return a.next}var g= +a.x=a.x&&a.x>=e&&b!==a.x&&me(cg.x)&&ud(a,f)&&(g=a,l=n)}a=a.next}return g}function qf(f,h,a,b,c){f=32767*(f-a)*c;h=32767*(h-b)*c;f=(f|f<<8)&16711935;f=(f|f<<4)&252645135;f=(f|f<<2)&858993459;h=(h|h<<8)&16711935;h=(h|h<<4)&252645135;h=(h|h<<2)&858993459;return(f|f<<1)&1431655765|((h| +h<<1)&1431655765)<<1}function rl(f){var h=f,a=f;do h.xRa(f.prev,f,f.next)?0<=Ra(f,h, +f.next)&&0<=Ra(f,f.prev,h):0>Ra(f,h,f.prev)||0>Ra(f,f.next,h)}function lh(f,h){var a=new rf(f.i,f.x,f.y),b=new rf(h.i,h.x,h.y),c=f.next,d=h.prev;f.next=h;h.prev=f;a.next=c;c.prev=a;b.next=a;a.prev=b;d.next=b;b.prev=d;return b}function jh(f,h,a,b){f=new rf(f,h,a);b?(f.next=b.next,f.prev=b,b.next.prev=f,b.next=f):(f.prev=f,f.next=f);return f}function rd(f){f.next.prev=f.prev;f.prev.next=f.next;f.prevZ&&(f.prevZ.nextZ=f.nextZ);f.nextZ&&(f.nextZ.prevZ=f.prevZ)}function rf(f,h,a){this.i=f;this.x=h;this.y= +a;this.nextZ=this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function mh(f){var h=f.length;2Number.EPSILON){var k=Math.sqrt(h),l=Math.sqrt(f*f+g*g);h=b.x-e/k;b=b.y+d/k;g=((c.x-g/l-h)*g-(c.y+f/l-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new x(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new x(f/e,d/ +e)}function g(a,d){for(W=a.length;0<=--W;){var e=W;var f=W-1;0>f&&(f=a.length-1);var g,h=A+2*I;for(g=0;gn;n++){var m=l[d[n]];var r=l[d[(n+1)%3]];b[0]=Math.min(m,r);b[1]=Math.max(m,r);m=b[0]+","+b[1];void 0===c[m]?c[m]={index1:b[0],index2:b[1],face1:g,face2:void 0}:c[m].face2=g}for(m in c)if(b=c[m],void 0===b.face2||e[b.face1].normal.dot(e[b.face2].normal)<=h)d=f[b.index1],a.push(d.x,d.y,d.z),d=f[b.index2],a.push(d.x,d.y,d.z);this.addAttribute("position",new J(a,3))}function jc(f,h,a,b,c,d,e,g){ca.call(this);this.type="CylinderGeometry"; +this.parameters={radiusTop:f,radiusBottom:h,height:a,radialSegments:b,heightSegments:c,openEnded:d,thetaStart:e,thetaLength:g};this.fromBufferGeometry(new Bb(f,h,a,b,c,d,e,g));this.mergeVertices()}function Bb(f,h,a,b,c,d,e,g){function k(a){var c,d=new x,k=new p,u=0,v=!0===a?f:h,A=!0===a?1:-1;var B=t;for(c=1;c<=b;c++)m.push(0,q*A,0),r.push(0,A,0),w.push(.5,.5),t++;var z=t;for(c=0;c<=b;c++){var F=c/b*g+e,D=Math.cos(F);F=Math.sin(F);k.x=v*F;k.y=q*A;k.z=v*D;m.push(k.x,k.y,k.z);r.push(0,A,0);d.x=.5*D+ +.5;d.y=.5*F*A+.5;w.push(d.x,d.y);t++}for(c=0;cthis.duration&&this.resetDuration();this.optimize()}function Cf(f){this.manager= +void 0!==f?f:db;this.textures={}}function rh(f){this.manager=void 0!==f?f:db}function Jd(){}function Df(f){"boolean"===typeof f&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),f=void 0);this.manager=void 0!==f?f:db;this.withCredentials=!1}function sh(){this.type="ShapePath";this.color=new S;this.subPaths=[];this.currentPath=null}function Ef(f){this.type="Font";this.data=f}function th(f){this.manager=void 0!==f?f:db}function uh(f){this.manager=void 0!==f? +f:db}function Kd(f,h,a){O.call(this);this.type="CubeCamera";var b=new Ba(90,1,f,h);b.up.set(0,-1,0);b.lookAt(new p(1,0,0));this.add(b);var c=new Ba(90,1,f,h);c.up.set(0,-1,0);c.lookAt(new p(-1,0,0));this.add(c);var d=new Ba(90,1,f,h);d.up.set(0,0,1);d.lookAt(new p(0,1,0));this.add(d);var e=new Ba(90,1,f,h);e.up.set(0,0,-1);e.lookAt(new p(0,-1,0));this.add(e);var g=new Ba(90,1,f,h);g.up.set(0,-1,0);g.lookAt(new p(0,0,1));this.add(g);var k=new Ba(90,1,f,h);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k); +this.renderTarget=new Yc(a,a,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,f){null===this.parent&&this.updateMatrixWorld();var h=this.renderTarget,l=h.texture.generateMipmaps;h.texture.generateMipmaps=!1;h.activeCubeFace=0;a.render(f,b,h);h.activeCubeFace=1;a.render(f,c,h);h.activeCubeFace=2;a.render(f,d,h);h.activeCubeFace=3;a.render(f,e,h);h.activeCubeFace=4;a.render(f,g,h);h.texture.generateMipmaps=l;h.activeCubeFace=5;a.render(f, +k,h);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function vh(){O.call(this);this.type="AudioListener";this.context=wh.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function Ld(f){O.call(this);this.type="Audio";this.context=f.context;this.gain=this.context.createGain();this.gain.connect(f.getInput());this.autoplay= +!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function xh(f){Ld.call(this,f);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function yh(f,h){this.analyser=f.context.createAnalyser();this.analyser.fftSize=void 0!==h?h:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);f.getOutput().connect(this.analyser)}function zh(f,h,a){this.binding=f;this.valueSize= +a;f=Float64Array;switch(h){case "quaternion":h=this._slerp;break;case "string":case "bool":f=Array;h=this._select;break;default:h=this._lerp}this.buffer=new f(4*a);this._mixBufferRegion=h;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Ah(f,h,a){a=a||Ta.parseTrackName(h);this._targetGroup=f;this._bindings=f.subscribe_(h,a)}function Ta(f,h,a){this.path=h;this.parsedPath=a||Ta.parseTrackName(h);this.node=Ta.findNode(f,this.parsedPath.nodeName)||f;this.rootNode=f}function Bh(f,h,a){this._mixer= +f;this._clip=h;this._localRoot=a||null;f=h.tracks;h=f.length;a=Array(h);for(var b={endingStart:2400,endingEnd:2400},c=0;c!==h;++c){var d=f[c].createInterpolant(null);a[c]=d;d.settings=b}this._interpolantSettings=b;this._interpolants=a;this._propertyBindings=Array(h);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale= +1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ff(f){this._root=f;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function B(f,h){"string"===typeof f&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),f=h);this.value=f}function Ch(){R.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function Dh(f,h,a,b){this.data=f;this.itemSize=h;this.offset= +a;this.normalized=!0===b}function Md(f,h){this.array=f;this.stride=h;this.count=void 0!==f?f.length/h:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function Eh(f,h,a){Md.call(this,f,h);this.meshPerAttribute=a||1}function Fh(f,h,a){fa.call(this,f,h);this.meshPerAttribute=a||1}function Gh(f,h,a,b){this.ray=new sc(f,h);this.near=a||0;this.far=b||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."); +return this.Points}}})}function Hh(f,h){return f.distance-h.distance}function Gf(f,h,a,b){if(!1!==f.visible&&(f.raycast(h,a),!0===b)){f=f.children;b=0;for(var c=f.length;ba;a++,b++){var c=a/32*Math.PI*2,d=b/32*Math.PI*2;h.push(Math.cos(c),Math.sin(c),1,Math.cos(d),Math.sin(d),1)}f.addAttribute("position",new J(h,3));h=new za({fog:!1});this.cone=new Ca(f,h);this.add(this.cone);this.update()}function Jh(f){var h=[];f&&f.isBone&&h.push(f);for(var a=0;aarguments.length?f:arguments[2],b;if(Ma(f)===a)return f[h];if(b=Ud.f(f,h))return oa(b,"value")?b.value:void 0!==b.get?b.get.call(a):void 0;if(Ga(b=Nf(f)))return Oh(b,h,a)}function Of(){for(var f=arguments.length,h=Array(f),a=0;ab?Al(b+c,0):Bl(b,c);if(f&&a!=a)for(;c>b;){if(a=h[b++],a!=a)return!0}else for(;c>b;b++)if((f||b in h)&&h[b]===a)return f||b||0;return!f&&-1}}(!1),Fl=Sf("IE_PROTO"),Th=function(f,h){f=xb(f);var a=0,b=[],c;for(c in f)c!=Fl&&oa(f,c)&&b.push(c);for(;h.length>a;)oa(f,c=h[a++])&&(~El(b,c)||b.push(c));return b},He="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "), +Ie=Object.keys||function(f){return Th(f,He)},Gl=hb?Object.defineProperties:function(f,h){Ma(f);for(var a=Ie(h),b=a.length,c=0,d;b>c;)lb.f(f,d=a[c++],h[d]);return f},Uh=ea.document,Tf=Uh&&Uh.documentElement,Hl=Sf("IE_PROTO"),Uf=function(){},Je=function(){var f=Fe?Rc.createElement("iframe"):{},h=He.length;f.style.display="none";Tf.appendChild(f);f.src="javascript:";f=f.contentWindow.document;f.open();f.write("